SET DEFINE OFF;

UPDATE SIOPCOESCOMBOCONFIGURACAO SET descricao = '29 - Exclusiva by Pathy' WHERE id = 70;

COMMIT;

DELETE SISERVICOSNFSE WHERE id IN (4309407000, 4309407020, 4309407100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4309407000, 4309407, 'EnviarLoteRps', ' ', 'http://guapore.govbr.cloud/NFSe.Portal.integracao/services.svc', 'http://tempuri.org/INFSEGeracao/EnviarLoteRpsSincrono', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:EnviarLoteRpsSincrono><tem:xmlEnvio>', '</tem:xmlEnvio></tem:EnviarLoteRpsSincrono></soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4309407020, 4309407, 'ConsultarLoteRps', ' ', 'http://guapore.govbr.cloud/NFSe.Portal.integracao/services.svc', 'http://tempuri.org/INFSEConsultas/ConsultarLoteRps', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:ConsultarLoteRps><tem:xmlEnvio>', '</tem:xmlEnvio></tem:ConsultarLoteRps></soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio><Prestador><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4309407100, 4309407, 'CancelarNfse', ' ', 'http://guapore.govbr.cloud/NFSe.Portal.integracao/services.svc', 'http://tempuri.org/INFSEGeracao/CancelarNfse', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:CancelarNfse><tem:xmlEnvio>', '</tem:xmlEnvio></tem:CancelarNfse></soapenv:Body></soapenv:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio><Pedido><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>', ' ');

DELETE SISERVICOSNFSE WHERE id IN (4202008000, 4202008010, 4202008020, 4202008100);

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

COMMIT;

DELETE SISERVICOSNFSE WHERE id in (4304606000, 4304606020, 4304606100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606000, 4304606, 'EnviarLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><RecepcionarLoteRpsSincrono><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></RecepcionarLoteRpsSincrono></soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606020, 4304606, 'ConsultarLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><ConsultarLoteRps><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></ConsultarLoteRps></soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio><Prestador><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606100, 4304606, 'CancelarNfse', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><CancelarNfse><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></CancelarNfse></soapenv:Body></soapenv:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio><Pedido><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>', ' ');

COMMIT;

DELETE SISERVICOSNFSE WHERE id IN (4320800000, 4320800020, 4320800100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4320800000, 4320800, 'EnviarLoteRps', ' ', 'http://soledade.govbr.cloud/nfse.portal.integracao/services.svc', 'http://tempuri.org/INFSEGeracao/EnviarLoteRpsSincrono', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:EnviarLoteRpsSincrono><tem:xmlEnvio>', '</tem:xmlEnvio></tem:EnviarLoteRpsSincrono></soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4320800020, 4320800, 'ConsultarLoteRps', ' ', 'http://soledade.govbr.cloud/nfse.portal.integracao/services.svc', 'http://tempuri.org/INFSEConsultas/ConsultarLoteRps', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:ConsultarLoteRps><tem:xmlEnvio>', '</tem:xmlEnvio></tem:ConsultarLoteRps></soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio><Prestador><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4320800100, 4320800, 'CancelarNfse', ' ', 'http://soledade.govbr.cloud/nfse.portal.integracao/services.svc', 'http://tempuri.org/INFSEGeracao/CancelarNfse', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:CancelarNfse><tem:xmlEnvio>',   '</tem:xmlEnvio></tem:CancelarNfse></soapenv:Body></soapenv:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio><Pedido><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>', ' ');

COMMIT;

DELETE SISERVICOSNFSE WHERE id IN (4301404000, 4301404020, 4301404100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4301404000, 4301404, 'EnviarLoteRps', ' ', 'http://arvorezinha.govbr.cloud/NFSe.Portal.Integracao/Services.svc', 'http://tempuri.org/INFSEGeracao/EnviarLoteRpsSincrono', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:EnviarLoteRpsSincrono><tem:xmlEnvio>', '</tem:xmlEnvio></tem:EnviarLoteRpsSincrono></soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4301404020, 4301404, 'ConsultarLoteRps', ' ', 'http://arvorezinha.govbr.cloud/NFSe.Portal.Integracao/Services.svc', 'http://tempuri.org/INFSEConsultas/ConsultarLoteRps', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:ConsultarLoteRps><tem:xmlEnvio>', '</tem:xmlEnvio></tem:ConsultarLoteRps></soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio><Prestador><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4301404100, 4301404, 'CancelarNfse', ' ', 'http://arvorezinha.govbr.cloud/NFSe.Portal.Integracao/Services.svc', 'http://tempuri.org/INFSEGeracao/CancelarNfse', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><soapenv:Header><tem:cabecalho versao="2.03"><tem:versaoDados>2.03</tem:versaoDados></tem:cabecalho></soapenv:Header><soapenv:Body><tem:CancelarNfse><tem:xmlEnvio>', '</tem:xmlEnvio></tem:CancelarNfse></soapenv:Body></soapenv:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio><Pedido><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>', ' ');

COMMIT;

DELETE SISERVICOSNFSE WHERE id IN (4313409000, 4313409020, 4313409100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4313409000, 4313409, 'EnviarLoteRps', 'https://treinamento.atende.net/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe' || '&' || 'cidade=treina_novohamburgo', 'https://ws-novohamburgo.atende.net:7443/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe', ' ', '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:net="net.atende"><soapenv:Header/><soapenv:Body>', '</soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4313409020, 4313409, 'ConsultarLoteRps', 'https://treinamento.atende.net/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe' || '&' || 'cidade=treina_novohamburgo', 'https://ws-novohamburgo.atende.net:7443/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe', ' ', '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:net="net.atende"><soapenv:Header/><soapenv:Body>', '</soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Prestador><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4313409100, 4313409, 'CancelarNfse', 'https://treinamento.atende.net/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe' || '&' || 'cidade=treina_novohamburgo', 'https://ws-novohamburgo.atende.net:7443/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe', ' ', '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:net="net.atende"><soapenv:Header/><soapenv:Body>', '</soapenv:Body></soapenv:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio><Pedido><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>', ' ');

COMMIT;

CREATE TABLE CAENDERECOSPESSOA_2401 AS SELECT * FROM CAENDERECOSPESSOA;

ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK10;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK14;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK26;
ALTER TABLE MOLISTASEVENTOS DROP CONSTRAINT MOLISTASEVENTOS_FK2;
ALTER TABLE MOLISTASEVENTOS DROP CONSTRAINT MOLISTASEVENTOS_FK3;
ALTER TABLE MOPREDOCUMENTOS DROP CONSTRAINT MOPREDOCUMENTOS_FK12;
ALTER TABLE MOPREDOCUMENTOS DROP CONSTRAINT MOPREDOCUMENTOS_FK20;
ALTER TABLE MOPREDOCUMENTOS DROP CONSTRAINT MOPREDOCUMENTOS_FK30;
ALTER TABLE MODOCUMENTOSFISCAIS DROP CONSTRAINT MODOCUMENTOSFISCAIS_FK12;
ALTER TABLE MODOCUMENTOSFISCAIS DROP CONSTRAINT MODOCUMENTOSFISCAIS_FK22;
ALTER TABLE MODOCUMENTOSFISCAIS DROP CONSTRAINT MODOCUMENTOSFISCAIS_FK32;

DROP TABLE CAENDERECOSPESSOA;

-- CAENDERECOSPESSOA
CREATE TABLE CAENDERECOSPESSOA
  (
    enderecoPessoa   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pessoa           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao        VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    principal        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    sugestaoEntrega  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    sugestaoCobranca NUMERIC (1,0) DEFAULT 0 NOT NULL,
    idObra           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cep              NUMERIC (8,0) DEFAULT 0 NOT NULL,
    tipoLogradouro   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    logradouro       VARCHAR (60) DEFAULT ' ' NOT NULL,
    numero           VARCHAR (60) DEFAULT ' ' NOT NULL,
    complemento      VARCHAR (60) DEFAULT ' ' NOT NULL,
    bairroDistrito   VARCHAR (60) DEFAULT ' ' NOT NULL,
    municipio        NUMERIC (7,0) DEFAULT 0 NOT NULL,
    pais             CHAR (4) DEFAULT '    ' NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE CAENDERECOSPESSOA ADD CONSTRAINT CAENDERECOSPESSOA_PK1 PRIMARY KEY (enderecoPessoa);
CREATE INDEX CAENDERECOSPESSOA_K2 ON CAENDERECOSPESSOA (descricao);
CREATE INDEX CAENDERECOSPESSOA_K3 ON CAENDERECOSPESSOA (pessoa, ordenacao, enderecoPessoa);
CREATE INDEX CAENDERECOSPESSOA_K4 ON CAENDERECOSPESSOA (idObra);
CREATE INDEX CAENDERECOSPESSOA_K5 ON CAENDERECOSPESSOA (bairroDistrito);
CREATE INDEX CAENDERECOSPESSOA_K6 ON CAENDERECOSPESSOA (municipio);
CREATE INDEX CAENDERECOSPESSOA_K7 ON CAENDERECOSPESSOA (pais);
CREATE INDEX CAENDERECOSPESSOA_K8 ON CAENDERECOSPESSOA (pessoa);
CREATE INDEX CAENDERECOSPESSOA_K9 ON CAENDERECOSPESSOA (pessoa, ativo, principal);
ALTER TABLE CAENDERECOSPESSOA ADD CONSTRAINT CAENDERECOSPESSOA_FK1 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE CAENDERECOSPESSOA ADD CONSTRAINT CAENDERECOSPESSOA_FK2 FOREIGN KEY (idObra) REFERENCES PAOBRAS (idObra);
ALTER TABLE CAENDERECOSPESSOA ADD CONSTRAINT CAENDERECOSPESSOA_FK3 FOREIGN KEY (tipoLogradouro) REFERENCES SITIPOSLOGRADOUROS (tipoLogradouro);
ALTER TABLE CAENDERECOSPESSOA ADD CONSTRAINT CAENDERECOSPESSOA_FK4 FOREIGN KEY (municipio) REFERENCES SIMUNICIPIOS (municipio);
ALTER TABLE CAENDERECOSPESSOA ADD CONSTRAINT CAENDERECOSPESSOA_FK5 FOREIGN KEY (pais) REFERENCES SIPAISES (pais);

INSERT INTO CAENDERECOSPESSOA (enderecoPessoa, pessoa, ordenacao, descricao, ativo, principal, sugestaoEntrega, sugestaoCobranca, idObra, cep, tipoLogradouro, logradouro, numero, complemento, bairroDistrito, municipio, pais, observacoes) VALUES (0, 0, 0, 'SELECIONE', 1, 0, 0, 0, 0, 0, 0, ' ', ' ', ' ', ' ', 0, '    ', ' ');
INSERT INTO CAENDERECOSPESSOA (enderecoPessoa, pessoa, ordenacao, descricao, ativo, principal, sugestaoEntrega, sugestaoCobranca, idObra, cep, tipoLogradouro, logradouro, numero, complemento, bairroDistrito, municipio, pais, observacoes) SELECT enderecoPessoa, pessoa, ordenacao, ' ', ativo, principal, sugestaoEntrega, sugestaoCobranca, 0, cep, tipoLogradouro, logradouro, numero, complemento, bairroDistrito, municipio, pais, observacoes FROM CAENDERECOSPESSOA_2401 WHERE enderecoPessoa > 0;

COMMIT;

ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK10 FOREIGN KEY (enderecoRetiradaEstabeleciment) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK14 FOREIGN KEY (enderecoEntregaPessoa) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK26 FOREIGN KEY (enderecoTransportadora) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOLISTASEVENTOS ADD CONSTRAINT MOLISTASEVENTOS_FK2 FOREIGN KEY (enderecoLocalEvento) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOLISTASEVENTOS ADD CONSTRAINT MOLISTASEVENTOS_FK3 FOREIGN KEY (enderecoEntrega) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOPREDOCUMENTOS ADD CONSTRAINT MOPREDOCUMENTOS_FK12 FOREIGN KEY (enderecoRetiradaEstabeleciment) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOPREDOCUMENTOS ADD CONSTRAINT MOPREDOCUMENTOS_FK20 FOREIGN KEY (enderecoEntregaPessoa) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOPREDOCUMENTOS ADD CONSTRAINT MOPREDOCUMENTOS_FK30 FOREIGN KEY (enderecoTransportadora) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MODOCUMENTOSFISCAIS ADD CONSTRAINT MODOCUMENTOSFISCAIS_FK12 FOREIGN KEY (enderecoRetiradaEstabeleciment) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MODOCUMENTOSFISCAIS ADD CONSTRAINT MODOCUMENTOSFISCAIS_FK22 FOREIGN KEY (enderecoEntregaPessoa) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MODOCUMENTOSFISCAIS ADD CONSTRAINT MODOCUMENTOSFISCAIS_FK32 FOREIGN KEY (enderecoTransportadora) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);

CREATE TABLE MOCRMS_2401 AS SELECT * FROM MOCRMS;

ALTER TABLE MOCRMXHISTORICO DROP CONSTRAINT MOCRMXHISTORICO_FK1;
ALTER TABLE MOCRMXORCAMENTOS DROP CONSTRAINT MOCRMXORCAMENTOS_FK1;

DROP TABLE MOCRMS;

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

INSERT INTO MOCRMS (idCRM, descricao, listaCRM, tipoVenda, estabelecimento, pessoa, enderecoPessoa, usuario, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) VALUES (0, 'SELECIONE', 0, 0, 0, 0, 0, 0, 0, ' ', NULL, NULL, NULL, NULL, ' ');
INSERT INTO MOCRMS (idCRM, descricao, listaCRM, tipoVenda, estabelecimento, pessoa, enderecoPessoa, usuario, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) SELECT a.idCRM, a.descricao, a.listaCRM, COALESCE ((SELECT MAX (orc.tipoVenda) FROM MOCRMXORCAMENTOS crmXOrc JOIN MOORCAMENTOS orc ON orc.orcamento = crmXOrc.orcamento WHERE crmXOrc.idCrm = a.idCrm), 0), a.estabelecimento, a.pessoa, COALESCE ((SELECT MAX (orc.enderecoEntregaPessoa) FROM MOCRMXORCAMENTOS crmXOrc JOIN MOORCAMENTOS orc ON orc.orcamento = crmXOrc.orcamento WHERE crmXOrc.idCrm = a.idCrm), COALESCE ((SELECT MAX (endPess.enderecoPessoa) FROM CAENDERECOSPESSOA endPess WHERE endPess.pessoa = a.pessoa AND endPess.ativo = 1 AND endPess.principal = 1), 0)), a.usuario, a.tipoAcaoCRM, a.situacaoCRM, a.dataInicio, a.dataTermino, a.dataProximoContato, a.horaProximoContatoFinal, a.observacoes FROM MOCRMS_2401 a WHERE a.idCRM > 0;

COMMIT;

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

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

-- Município: 4202008 - Balneário Camboriú - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  IF 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>101</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_valorPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorCsll || '</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>4202008</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: NF-em
-- Tecnologia: 1 - SOAP
-- Versão: 2.04
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4209102' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://nfemws.joinville.sc.gov.br">'
  || '<LoteRps Id="lote_1" 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="infPS_1">'          
          || '<Rps Id="infRPS_1">'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>A</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_valorPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorInss || '</ValorInss>'
              || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

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

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

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

-- Município: 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_valorPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorCsll || '</ValorCsll>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                  || '<IrrfIndenizacao>0.00</IrrfIndenizacao>'
                || '</Valores>'
                || '<IssRetido>' || v_issRetido || '</IssRetido>'
                || '<ResponsavelRetencao>1</ResponsavelRetencao>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<CodigoTributacaoMunicipio>' || v_codigoTributacaoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
                || '<CodigoPais>1058</CodigoPais>'
                || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
                || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  RETURN v_xml;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_OPERACAO_FISCAL (
  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)
  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 = prod.idNcm
          AND opX.ativo = 1))
      AND (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 = 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;

/

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

/

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

/

create or replace PROCEDURE ADD_BUSCA_REGRA_FRETE (
  p_estabelecimento              IN NUMBER,
  p_pessoa                       IN NUMBER,
  p_enderecoEntregaPessoa        IN NUMBER,
  p_valorBaseFrete               IN NUMBER,
  p_pesoLiquido                  IN NUMBER,
  p_pesoBruto                    IN NUMBER,
  /* Retornos */
  r_regra_transportadora         OUT NUMBER,
  r_regra_enderecoTransportadora OUT NUMBER,
  r_regra_valorFreteMinimo       OUT NUMBER,
  r_regra_multiplicarPeloPeso    OUT NUMBER,
  r_regra_percentualFrete        OUT NUMBER,
  r_regra_valorFrete             OUT NUMBER,
  r_regra_encontrou              OUT NUMBER)
IS
  v_idRegraFrete        NUMBER;
  v_valorFreteMinimo    NUMBER;
  v_multiplicarPeloPeso NUMBER;
  v_percentualFrete     NUMBER;
  v_transportadora      NUMBER;
BEGIN
  r_regra_transportadora := 0;
  r_regra_enderecoTransportadora := 0;
  r_regra_valorFreteMinimo := 0;
  r_regra_multiplicarPeloPeso := 0;
  r_regra_percentualFrete := 0;
  r_regra_valorFrete := 0;
  r_regra_encontrou := 0;
  SELECT
    COALESCE (MAX (a.idRegraFrete), 0),
    COALESCE (MAX (a.valorFreteMinimo), 0),
    COALESCE (MAX (a.multiplicarPeloPeso), 0),
    COALESCE (MAX (a.percentualFrete), 0),
    COALESCE (MAX (a.transportadora), 0)
  INTO
    v_idRegraFrete,
    v_valorFreteMinimo,
    v_multiplicarPeloPeso,
    v_percentualFrete,
    v_transportadora
  FROM (
    SELECT
      frete.idRegraFrete,
      frete.valorFreteMinimo,
      frete.multiplicarPeloPeso,
      frete.percentualFrete,
      frete.transportadora,
      ROW_NUMBER() OVER (
        ORDER BY
          frete.pessoa DESC,
          frete.exclusivoPessoaE DESC,
          frete.exclusivoPessoaD DESC,
          frete.exclusivoPessoaC DESC,
          frete.exclusivoPessoaB DESC,
          frete.exclusivoPessoaA DESC,
          frete.bairroDistrito DESC,
          frete.municipio DESC,
          frete.microrregiaoGeografica DESC,
          frete.mesorregiaoGeografica DESC,
          frete.uf DESC,
          frete.estabelecimento DESC,
          frete.idRegraFrete DESC) rowNumber
    FROM CAPESSOAS pess
    JOIN CAENDERECOSPESSOA endEntr
    ON endEntr.enderecoPessoa =
      CASE
        WHEN p_pessoa = 0 OR p_enderecoEntregaPessoa = 0
        THEN COALESCE ((
          SELECT MAX (endEst.enderecoPessoa)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst
          ON endEst.pessoa = est.pessoaEstabelecimento
          WHERE est.estabelecimento = p_estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1), 0)
        ELSE p_enderecoEntregaPessoa
      END
    JOIN SIMUNICIPIOS mun
    ON mun.municipio = endEntr.municipio
    JOIN SIMICRORREGIOESGEOGRAFICA micro
    ON micro.microrregiaoGeografica = mun.microrregiaoGeografica
    JOIN PAREGRASFRETE frete
    ON frete.idRegraFrete > 0
    WHERE pess.pessoa = p_pessoa
    AND frete.idRegraFrete > 0
    AND frete.ativo = 1
    AND (frete.estabelecimento = 0
      OR frete.estabelecimento = p_estabelecimento)
    AND (frete.uf = ' '
      OR frete.uf = '  '
      OR frete.uf = mun.uf)
    AND (frete.mesorregiaoGeografica = 0
      OR frete.mesorregiaoGeografica = micro.mesorregiaoGeografica)
    AND (frete.microrregiaoGeografica = 0
      OR frete.microrregiaoGeografica = mun.microrregiaoGeografica)
    AND (frete.municipio = 0
      OR frete.municipio = endEntr.municipio)
    AND (frete.bairroDistrito = ' '
      OR frete.bairroDistrito = endEntr.bairroDistrito)
    AND (frete.exclusivoPessoaA = 0
      OR frete.exclusivoPessoaA = pess.exclusivoPessoaA)
    AND (frete.exclusivoPessoaB = 0
      OR frete.exclusivoPessoaB = pess.exclusivoPessoaB)
    AND (frete.exclusivoPessoaC = 0
      OR frete.exclusivoPessoaC = pess.exclusivoPessoaC)
    AND (frete.exclusivoPessoaD = 0
      OR frete.exclusivoPessoaD = pess.exclusivoPessoaD)
    AND (frete.exclusivoPessoaE = 0
      OR frete.exclusivoPessoaE = pess.exclusivoPessoaE)
    AND (frete.pessoa = 0
      OR frete.pessoa = pess.pessoa)) a
  WHERE a.rowNumber = 1;
  IF v_idRegraFrete <> 0 THEN
    r_regra_transportadora := v_transportadora;
    r_regra_encontrou := 1;
    r_regra_valorFreteMinimo := v_valorFreteMinimo;
    r_regra_multiplicarPeloPeso := v_multiplicarPeloPeso;
    r_regra_percentualFrete := v_percentualFrete;
    r_regra_valorFrete := 
      CASE
        WHEN ROUND (p_valorBaseFrete * v_percentualFrete / 100, 0) <
          ROUND (v_valorFreteMinimo
            * CASE
                WHEN V_multiplicarPeloPeso = 1 AND
                  CASE
                    WHEN p_pesoBruto > p_pesoLiquido
                    THEN p_pesoBruto
                    ELSE p_pesoLiquido
                  END <> 0
                THEN
                  CASE
                    WHEN p_pesoBruto > p_pesoLiquido
                    THEN p_pesoBruto
                    ELSE p_pesoLiquido
                  END
                ELSE 1
              END, 2)
        THEN ROUND(v_valorFreteMinimo *
          CASE
            WHEN V_multiplicarPeloPeso = 1 AND
              CASE
                WHEN p_pesoBruto > p_pesoLiquido
                THEN p_pesoBruto
                ELSE p_pesoLiquido
              END <> 0
            THEN
              CASE
                WHEN p_pesoBruto > p_pesoLiquido
                THEN p_pesoBruto
                ELSE p_pesoLiquido
              END
            ELSE 1
          END, 2)
        ELSE ROUND (p_valorBaseFrete * v_percentualFrete / 100,0)
      END;
    IF v_transportadora = 0 THEN
      r_regra_enderecoTransportadora := 0;
    ELSE
      SELECT COALESCE ((
        SELECT MIN (enderecoPessoa)
        FROM CAENDERECOSPESSOA
        WHERE pessoa = v_transportadora
        AND ativo = 1
        AND principal = 1), 0)
      INTO r_regra_enderecoTransportadora
      FROM DUAL;
    END IF;
  END IF;
END ADD_BUSCA_REGRA_FRETE;

/

create or replace PROCEDURE ADD_BUSCA_REGRA_DESCONTO_ITEM (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_valorProdutoServicoBrut IN NUMBER,
  p_item_valorProdutoServico     IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_percentualDescontoSugestao   OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
  v_pessoa              NUMBER;
  v_indicadorPessoa     CHAR(1);
  v_idade               NUMBER;
  v_uf                  CHAR(2);
  v_produto             NUMBER;
  v_cor                 NUMBER;
  v_tamanho             VARCHAR2(10);
  v_categoriaProduto    NUMBER;
  v_subcategoriaProduto NUMBER;
  v_marca               NUMBER;
  v_caracteristicaA     NUMBER;
  v_caracteristicaB     NUMBER;
  v_caracteristicaC     NUMBER;
  v_caracteristicaD     NUMBER;
  v_caracteristicaE     NUMBER;
  v_idNcm               NUMBER;
  v_listaServicos       NUMBER;
  v_baseDesconto        NUMBER;
BEGIN
  SELECT
    pess.pessoa,
    pess.indicadorPessoa,
    CASE
      WHEN pess.nascimentoFundacao IS NULL
        OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
      THEN 0
      ELSE EXTRACT(YEAR FROM SYSDATE)
        - EXTRACT(YEAR FROM pess.nascimentoFundacao)
        - CASE
            WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
            THEN 1
            ELSE 0
          END
    END idade,
    COALESCE((
      CASE
        WHEN pess.pessoa = 0
        THEN (
          SELECT MAX(munPess.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endPess
          ON endPess.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munPess
          ON munPess.municipio = endPess.municipio
          WHERE est.estabelecimento = p_cab_estabelecimento
          AND endPess.ativo = 1
          AND endPess.principal = 1)
        ELSE COALESCE((
          SELECT MAX(munPess.uf)
          FROM CAENDERECOSPESSOA endPess
          JOIN SIMUNICIPIOS munPess
          ON munPess.municipio = endPess.municipio
          WHERE endPess.pessoa = pess.pessoa
          AND endPess.ativo = 1
          AND endPess.principal = 1),(
          SELECT MAX(munPess.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endPess
          ON endPess.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munPess
          ON munPess.municipio = endPess.municipio
          WHERE est.estabelecimento = p_cab_estabelecimento
          AND endPess.ativo = 1
          AND endPess.principal = 1))
      END),'  ') uf
  INTO
    v_pessoa,
    v_indicadorPessoa,
    v_idade,
    v_uf
  FROM CAPESSOAS pess
  WHERE pess.pessoa =
    CASE
      WHEN p_orc_pessoa = 0
        OR p_config_227_manterPessoaOrcam = 0
      THEN p_cab_pessoa
      ELSE p_orc_pessoa
    END;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    subCatProd.categoriaProduto,
    prod.subcategoriaProduto,
    prod.marca,
    prod.caracteristicaA,
    prod.caracteristicaB,
    prod.caracteristicaC,
    prod.caracteristicaD,
    prod.caracteristicaE,
    prod.idNcm,
    prod.listaServicos,
    CASE
      WHEN modDoc.diminuiDescontoPrUnit = 1
        OR modDoc.somaAcrescimosPrUnit = 1
        OR modDoc.somaFreteSeguroPrUnit = 1
        OR p_cab_entradaSaida =
          CASE
            WHEN p_cab_devolucaoAnulacaoRetorno = 1
            THEN 'E'
            ELSE 'S'
          END
        AND EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPres
          WHERE compPres.produto = gradProd.produto
          AND compPres.ativo = 1)
      THEN p_item_valorProdutoServicoBrut
      ELSE p_item_valorProdutoServico
    END baseDesconto
  INTO
    v_produto,
    v_cor,
    v_tamanho,
    v_categoriaProduto,
    v_subcategoriaProduto,
    v_marca,
    v_caracteristicaA,
    v_caracteristicaB,
    v_caracteristicaC,
    v_caracteristicaD,
    v_caracteristicaE,
    v_idNcm,
    v_listaServicos,
    v_baseDesconto
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASUBCATEGORIASPRODUTO subCatProd
  ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = p_item_modeloDocumento
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND((
      CASE
        WHEN v_baseDesconto <= 0
        THEN 0
        WHEN SUM (
            CASE
              WHEN a.valorDescontoSugestao < 0
              THEN 0
              ELSE a.valorDescontoSugestao
            END) >= v_baseDesconto
        THEN 100
        WHEN MIN (a.valorDescontoSugestao) < 0
          OR SUM(a.possuiRegra) > 1
        THEN
          CASE
            WHEN v_baseDesconto <= 0
            THEN 0
            ELSE 100 * COALESCE (SUM (
              CASE
                WHEN a.valorDescontoSugestao < 0
                THEN 0
                ELSE a.valorDescontoSugestao
              END), 0) / v_baseDesconto
          END
        ELSE MAX(a.percentualDescontoSugestao)
      END), 8), 0) percentualDescontoSugestao,
    COALESCE (ROUND((
      CASE
        WHEN v_baseDesconto <= 0
        THEN 0
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= v_baseDesconto
        THEN v_baseDesconto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END), 2), 0) valorDescontoSugestao,
    COALESCE (ROUND((
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= v_baseDesconto
        THEN v_baseDesconto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END), 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_percentualDescontoSugestao,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.tipoRegraDescontoMargem,
      ROUND ((
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorSugestao
          -- Desconto em valor
          WHEN 2
          THEN
            CASE
              WHEN v_baseDesconto <= 0
              THEN 0
              ELSE 100 * a.valorSugestao / v_baseDesconto
            END
          -- Preço unitário fixo
          WHEN 3
          THEN
            CASE
              WHEN v_baseDesconto <= 0
              THEN 0
              ELSE 100 * (v_baseDesconto - ROUND (p_item_quantidade * a.valorMaximoSemSenha,2)) / v_baseDesconto
            END
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN v_idade
          -- Desconto igual a idade em valor
          WHEN 5
          THEN
            CASE
              WHEN v_baseDesconto <= 0
              THEN 0
              ELSE 100 * v_idade / v_baseDesconto
            END
          -- Preço total fixado
          WHEN 6
          THEN 100
          ELSE 0
        END), 8) percentualDescontoSugestao,
      ROUND ((
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN v_baseDesconto * a.valorSugestao / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorSugestao
           -- Preço unitário fixo
          WHEN 3
          THEN v_baseDesconto - ROUND (p_item_quantidade * a.valorSugestao,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN v_baseDesconto * v_idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN v_idade
          -- Preço total fixado
          WHEN 6
          THEN v_baseDesconto
          ELSE 0
        END), 2) valorDescontoSugestao,
      ROUND ((
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN v_baseDesconto * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha
          -- Preço unitário fixo
          WHEN 3
          THEN v_baseDesconto - ROUND (p_item_quantidade * a.valorMaximoSemSenha,2)
          WHEN 4
          THEN v_baseDesconto * v_idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN v_idade
          -- Preço total fixado
          WHEN 6
          THEN v_baseDesconto
          ELSE 0
        END), 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY a.ordenacao, a.regraDescontoMargem) ordenacao,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha
      FROM PAREGRASDESCONTOSMARGEM a
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = a.filtroCabecalho
      WHERE a.regraDescontoMargem > 0
      AND a.ativo = 1
      AND a.dataValidadeInicial <= TRUNC(SYSDATE)
      AND a.dataValidadeFinal >= TRUNC(SYSDATE)
      AND a.cabecalhoItemPagamento = 'I'
      AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
      -- Filtro Cabeçalho
      AND (a.filtroCabecalho = 0
        OR (filtroCab.filtrarEstabelecimentos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROCABECXESTABELEC filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.estabelecimento = p_cab_estabelecimento
            AND filtroCabX.ativo = 1))
        AND (filtroCab.filtrarUfs = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROCABECXUFS filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.uf = v_uf
            AND filtroCabX.ativo = 1))
        AND (filtroCab.filtrarPessoas = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROCABECXPESSOAS filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.pessoa = v_pessoa
            AND filtroCabX.ativo = 1))
        AND (filtroCab.filtrarPerfisUsuario = 0
          AND filtroCab.filtrarUsuarios = 0
          OR filtroCab.filtrarPerfisUsuario = 1
          AND EXISTS (
            SELECT 1
            FROM PAFILTROCABECXPERFISUSUAR filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
            AND filtroCabX.ativo = 1)
          OR filtroCab.filtrarUsuarios = 1
          AND EXISTS (
            SELECT 1
            FROM PAFILTROCABECXUSUARIOS filtroCabX
            WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
            AND filtroCabX.usuario = p_usuarioLogado
            AND filtroCabX.ativo = 1))
        AND (filtroCab.indicadorPessoa = ' '
          OR filtroCab.indicadorPessoa = v_indicadorPessoa)
        AND (filtroCab.colaborador = ' '
          OR filtroCab.colaborador = 'N'
          AND (v_pessoa = 0
            OR NOT (EXISTS (
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = v_pessoa
              AND colab.ativo = 1 )))
          OR filtroCab.colaborador = 'S'
          AND v_pessoa <> 0
          AND EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = v_pessoa
            AND colab.ativo = 1)))
      -- Tabela de Preço
      AND (a.filtrarTabelaPreco = 0
        OR EXISTS (
          SELECT 1
          FROM PAREGRADESCMARGXTABELASPR x
          WHERE x.regraDescontoMargem = a.regraDescontoMargem
          AND x.tabelaPreco = p_item_tabelaPreco
          AND x.ativo = 1))
      -- Filtro Produto
      AND (
        SELECT COUNT(1)
        FROM PAREGRADESCMARGXFILTPROD b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem
        AND b.filtroProduto > 0
        AND b.ativo = 1) = (
        SELECT COUNT(1)
        FROM PAREGRADESCMARGXFILTPROD b
        JOIN PAFILTROSPRODUTO c
        ON c.filtroProduto = b.filtroProduto
        WHERE b.regraDescontoMargem = a.regraDescontoMargem
        AND b.filtroProduto > 0
        AND b.ativo = 1
        AND (c.filtrarVendedores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXVENDEDOR x
          WHERE x.filtroProduto = b.filtroProduto
          AND x.vendedor = p_item_vendedor
          AND x.ativo = 1))
        AND (c.filtrarLocaisEstoque = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLOCAISEST x
          WHERE x.filtroProduto = b.filtroProduto
          AND x.localEstoque = p_item_localEstoque
          AND x.ativo = 1))
        AND (c.filtrarPersonalizacoes = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXPERSONAL x
          WHERE x.filtroProduto = b.filtroProduto
          AND x.personalizacao = p_item_personalizacao
          AND x.ativo = 1))
        AND (c.filtrarProdutos = 0
          AND c.filtrarCategoriasProdutos = 0
          AND c.filtrarSubcategoriasProdutos = 0
          AND c.filtrarMarcas = 0
          AND c.filtrarCaracteristicasA = 0
          AND c.filtrarCaracteristicasB = 0
          AND c.filtrarCaracteristicasC = 0
          AND c.filtrarCaracteristicasD = 0
          AND c.filtrarCaracteristicasE = 0
          AND c.filtrarCores = 0
          AND c.filtrarTamanhos = 0
          AND c.filtrarNCMs = 0
          AND c.filtrarListasServicos = 0
          OR c.filtrarProdutos = 1
          AND EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXPRODUTOS x
            WHERE x.filtroProduto = b.filtroProduto
            AND x.produto = v_produto
            AND x.ativo = 1)
          OR (c.filtrarCategoriasProdutos = 1
            OR c.filtrarSubcategoriasProdutos = 1
            OR c.filtrarMarcas = 1
            OR c.filtrarCaracteristicasA = 1
            OR c.filtrarCaracteristicasB = 1
            OR c.filtrarCaracteristicasC = 1
            OR c.filtrarCaracteristicasD = 1
            OR c.filtrarCaracteristicasE = 1
            OR c.filtrarCores = 1
            OR c.filtrarTamanhos = 1
            OR c.filtrarNCMs = 1
            OR c.filtrarListasServicos = 1)
          AND (c.filtrarCategoriasProdutos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCATEGPROD x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.categoriaProduto = v_categoriaProduto
              AND x.ativo = 1))
          AND (c.filtrarSubcategoriasProdutos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXSUBCAPROD x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.subcategoriaProduto = v_subcategoriaProduto
              AND x.ativo = 1))
          AND (c.filtrarMarcas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXMARCAS x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.marca = v_marca
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasA = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERA x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaA = v_caracteristicaA
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasB = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERB x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaB = v_caracteristicaB
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasC = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERC x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaC = v_caracteristicaC
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasD = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERD x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaD = v_caracteristicaD
              AND x.ativo = 1))
          AND (c.filtrarCaracteristicasE = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCARACTERE x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.caracteristicaE = v_caracteristicaE
              AND x.ativo = 1))
          AND (c.filtrarCores = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXCORES x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.cor = v_cor
              AND x.ativo = 1))
          AND (c.filtrarTamanhos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXTAMANHOS x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.tamanho = v_tamanho
              AND x.ativo = 1))
          AND (c.filtrarNCMs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXNCMS x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.idNcm = v_idNcm
              AND x.ativo = 1))
          AND (c.filtrarListasServicos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROPRODUTOXLISTASSE x
              WHERE x.filtroProduto = b.filtroProduto
              AND x.listaServicos = v_listaServicos
              AND x.ativo = 1))
          AND p_item_quantidade >= c.quantidadeMinima
          AND (c.quantidadeMaxima = 0
            OR p_item_quantidade <= c.quantidadeMaxima)))) a
    WHERE a.ordenacao = 1) a;
END ADD_BUSCA_REGRA_DESCONTO_ITEM;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_GRADE_PRODUTO (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_orc_pessoa                   IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  r_tipoPreco                    OUT CHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER)
IS
  v_precoAPrazo         NUMBER;
  v_precoAVista         NUMBER;
  v_promocao            NUMBER;
  v_precoPromocaoAPrazo NUMBER;
  v_precoPromocaoAVista NUMBER;
  v_precoIndexadoAPrazo NUMBER;
  v_precoIndexadoAVista NUMBER;
BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  v_precoAPrazo              := 0;
  v_precoAVista              := 0;
  v_promocao                 := 0;
  v_precoPromocaoAPrazo      := 0;
  v_precoPromocaoAVista      := 0;
  v_precoIndexadoAPrazo      := 0;
  v_precoIndexadoAVista      := 0;
  IF p_item_gradeProduto > 0 THEN
    FOR a IN (
      SELECT
        modDoc.capituloNaturezaFiscal,
        modDoc.tipoPreco,
        modDoc.tabelaPreco,
        modDoc.fatorMultiplicadorPreco,
        modDoc.tipoPrecoB,
        modDoc.tabelaPrecoB,
        modDoc.fatorMultiplicadorPrecoB,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE((
          SELECT MAX(munEndEst.uf)
          FROM CAENDERECOSPESSOA endEst
          JOIN SIMUNICIPIOS munEndEst
          ON munEndEst.municipio = endEst.municipio
          WHERE endEst.pessoa = est.pessoaEstabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1),'  ') ufEstabelecimento,
        COALESCE((
          SELECT MAX(munEndPess.uf)
          FROM CAENDERECOSPESSOA endPess
          JOIN SIMUNICIPIOS munEndPess
          ON munEndPess.municipio = endPess.municipio
          WHERE endPess.pessoa = CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END
          AND endPess.ativo = 1
          AND endPess.principal = 1),'  ') ufPessoa
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = p_cab_estabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = p_item_modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE gradProd.gradeProduto = p_item_gradeProduto)
    LOOP
      IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
        r_tipoPreco := 'I';
      ELSE
        IF a.controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
          ADD_BUSCA_PRECO_INTERNO_TINTA (
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.indicadorPropriedadePosseItem,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END, --p_tipoPreco
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END, --p_tabelaPreco
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
        ELSE
          -- A Tabela de Preço Anterior
          IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'A' THEN
            ADD_BUSCA_PRECO_INTERNO_ANTER (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- C Custo Médio da Venda (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'C' AND NOT(a.controleEstoque IN (3,4)) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- F Formação Preço (Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'F' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              a.controleEstoque,
              0); --p_gerandoInventario
          -- G Custo Médio da Venda Gerencial (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'G' AND NOT(a.controleEstoque IN (3,4)) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- P Preço de Custo (Último Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'P' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- R Último Preço de Reposição
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'R' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              2, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- T Tabela de Preço
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'T' THEN
            ADD_BUSCA_PRECO_INTERNO_TABELA (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- U Última Compra
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'U' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              0, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- 2 Última Compra Bruto
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = '2' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              1, -- p_precoRetornar
              0); -- p_gerandoInventario
          END IF;
          IF NOT(CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END IN ('A','T')) THEN
            r_tabelaPreco              := ' ';
            r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
            r_precoDesconto            := 0;
            r_precoMinimo              := 0;
            r_informarPrecoManualmente := 0;
            v_precoAPrazo              := r_precoSugestaoAPrazo;
            v_precoAVista              := r_precoSugestaoAPrazo;
            v_promocao                 := 0;
            v_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
            v_precoPromocaoAVista      := r_precoSugestaoAPrazo;
            v_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
            v_precoIndexadoAVista      := r_precoSugestaoAPrazo;
          END IF;
          -- 3 = Combo / 4 = Kit
          IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
            ADD_BUSCA_PRECO_INTERNO_KIT (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_quantidade,
              a.produto,
              a.indicadorPropriedadePosseItem,
              p_manterPreco,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          END IF;
        END IF;
        -- Se encontrou preço
        IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR v_precoAPrazo <> 0 OR v_precoAVista <> 0 OR v_precoPromocaoAPrazo <> 0 OR v_precoPromocaoAVista <> 0 OR v_precoIndexadoAPrazo <> 0 OR v_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
          r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END;
          IF NOT (a.fatorMultiplicadorPreco IN (0,1)) AND (p_manterPreco = 0 OR p_tipoPreco = a.tipoPreco AND p_tabelaPreco = a.tabelaPreco) THEN
            r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * a.fatorMultiplicadorPreco;
            r_precoSugestaoAVista := r_precoSugestaoAVista * a.fatorMultiplicadorPreco;
            r_precoDesconto       := r_precoDesconto       * a.fatorMultiplicadorPreco;
            r_precoMinimo         := r_precoMinimo         * a.fatorMultiplicadorPreco;
            v_precoAPrazo         := v_precoAPrazo         * a.fatorMultiplicadorPreco;
            v_precoAVista         := v_precoAVista         * a.fatorMultiplicadorPreco;
            v_precoPromocaoAPrazo := v_precoPromocaoAPrazo * a.fatorMultiplicadorPreco;
            v_precoPromocaoAVista := v_precoPromocaoAVista * a.fatorMultiplicadorPreco;
            v_precoIndexadoAPrazo := v_precoIndexadoAPrazo * a.fatorMultiplicadorPreco;
            v_precoIndexadoAVista := v_precoIndexadoAVista * a.fatorMultiplicadorPreco;
          END IF;
        -- Se não encontrou preço, não mantém o atual e existe regra de preço B
        ELSIF p_manterPreco = 0 AND a.tipoPrecoB <> ' ' THEN
          ADD_BUSCA_PRECO (
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            a.fatorMultiplicadorPrecoB,
            ' ', --a.tipoPrecoB
            ' ', --a.tabelaPrecoB
            0, --a.fatorMultiplicadorPrecoB
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.produto,
            a.cor,
            a.tamanho,
            a.controleEstoque,
            a.indicadorPropriedadePosseItem,
            0, --p_manterPreco
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            r_tipoPreco,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
          -- Se não encontrou preço B, devolve tipo preço e tabela atual
          IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND v_precoAPrazo = 0 AND v_precoAVista = 0 AND v_precoPromocaoAPrazo = 0 AND v_precoPromocaoAVista = 0 AND v_precoIndexadoAPrazo = 0 AND v_precoIndexadoAVista = 0 AND a.tipoPrecoB <> 'I' THEN
            r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
            r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
          END IF;
        -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
        ELSE
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
        END IF;
        -- Efetua arredondamento de preço
        r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      END IF;
    END LOOP;
  END IF;
END ADD_BUSCA_PRECO_GRADE_PRODUTO;

/

create or replace PROCEDURE ADD_BUSCA_ICMS_ST_ANTERIOR (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_calcularICMSSTAnterEfetivo   IN NUMBER,
  p_calcularFCP                  IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_prod_controleEstoque         IN NUMBER,
  /* Retornos */
  r_item_baseICMSSTAnteriormente OUT NUMBER,
  r_item_valorICMSSTAnteriorment OUT NUMBER,
  r_item_valorICMSProprioSubstit OUT NUMBER,
  r_item_baseFCPSTAnteriormente  OUT NUMBER,
  r_item_valorFCPSTAnteriormente OUT NUMBER)
IS
  v_contaGradesProduto       NUMBER;
  v_gradeProduto             NUMBER;
  v_quantidade               NUMBER;
  v_baseICMSST               NUMBER;
  v_valorICMSST              NUMBER;
  v_baseICMSSTEscrituracao   NUMBER;
  v_valorICMSSTEscrituracao  NUMBER;
  v_baseICMSSTAnteriormente  NUMBER;
  v_valorICMSSTAnteriormente NUMBER;
  v_valorICMS                NUMBER;
  v_baseFCPST                NUMBER;
  v_valorFCPST               NUMBER;
  v_ufOrigDest_aliquotaIcms  NUMBER;
BEGIN
  r_item_baseICMSSTAnteriormente := 0;
  r_item_valorICMSSTAnteriorment := 0;
  r_item_valorICMSProprioSubstit := 0;
  r_item_baseFCPSTAnteriormente  := 0;
  r_item_valorFCPSTAnteriormente := 0;
  v_contaGradesProduto           := 0;
  v_gradeProduto                 := 0;
  v_quantidade                   := 0;
  v_baseICMSST                   := 0;
  v_valorICMSST                  := 0;
  v_baseICMSSTEscrituracao       := 0;
  v_valorICMSSTEscrituracao      := 0;
  v_baseICMSSTAnteriormente      := 0;
  v_valorICMSSTAnteriormente     := 0;
  v_valorICMS                    := 0;
  v_baseFCPST                    := 0;
  v_valorFCPST                   := 0;
  v_ufOrigDest_aliquotaIcms      := 0;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      COALESCE(MAX(a.quantidade),0),
      COALESCE(MAX(a.baseICMSST),0),
      COALESCE(MAX(a.valorICMSST),0),
      COALESCE(MAX(a.baseICMSSTEscrituracao),0),
      COALESCE(MAX(a.valorICMSSTEscrituracao),0),
      COALESCE(MAX(a.baseICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMS),0),
      COALESCE(MAX(a.baseFCPST),0),
      COALESCE(MAX(a.valorFCPST),0)
    INTO
      v_quantidade,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMS,
      v_baseFCPST,
      v_valorFCPST
    FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY cab.dataEntradaSaida DESC) ordenacao,
        item.quantidade,
        item.baseICMSST,
        item.valorICMSST,
        item.baseICMSSTEscrituracao,
        item.valorICMSSTEscrituracao,
        item.baseICMSSTAnteriormente,
        item.valorICMSSTAnteriormente,
        item.valorICMS,
        item.baseFCPST,
        item.valorFCPST
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = cab.estabelecimento
      WHERE item.gradeProduto = v_gradeProduto
      AND item.cancelado = 0
      AND item.quantidade > 0
      AND (item.baseICMSSTEscrituracao > 0
        AND item.valorICMSSTEscrituracao > 0
        OR item.baseICMSST > 0
        AND item.valorICMSST > 0
        OR item.baseICMSSTAnteriormente > 0
        AND item.valorICMSSTAnteriormente > 0
        OR item.valorICMS > 0)
      AND cab.entradaSaida = 'E'
      AND cab.nfFornecedor = 1
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida < TRUNC (CASE WHEN p_cab_dataEntradaSaida IS NULL THEN SYSDATE ELSE p_cab_dataEntradaSaida END) + 1) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      COALESCE(MAX(a.quantidade),0),
      COALESCE(MAX(a.baseICMSST),0),
      COALESCE(MAX(a.valorICMSST),0),
      COALESCE(MAX(a.baseICMSSTEscrituracao),0),
      COALESCE(MAX(a.valorICMSSTEscrituracao),0),
      COALESCE(MAX(a.baseICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMS),0),
      COALESCE(MAX(a.baseFCPST),0),
      COALESCE(MAX(a.valorFCPST),0)
    INTO
      v_quantidade,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMS,
      v_baseFCPST,
      v_valorFCPST
    FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY cab.dataEntradaSaida DESC) ordenacao,
        item.quantidade,
        item.baseICMSST,
        item.valorICMSST,
        item.baseICMSSTEscrituracao,
        item.valorICMSSTEscrituracao,
        item.baseICMSSTAnteriormente,
        item.valorICMSSTAnteriormente,
        item.valorICMS,
        item.baseFCPST,
        item.valorFCPST
      FROM MODOCFISCALXITENS item
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = cab.estabelecimento
      WHERE item.cancelado = 0
      AND item.quantidade > 0
      AND (item.baseICMSSTEscrituracao > 0
        AND item.valorICMSSTEscrituracao > 0
        OR item.baseICMSST > 0
        AND item.valorICMSST > 0
        OR item.baseICMSSTAnteriormente > 0
        AND item.valorICMSSTAnteriormente > 0
        OR item.valorICMS > 0)
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND cab.entradaSaida = 'E'
      AND cab.nfFornecedor = 1
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida < TRUNC (CASE WHEN p_cab_dataEntradaSaida IS NULL THEN SYSDATE ELSE p_cab_dataEntradaSaida END) + 1) a
    WHERE a.ordenacao = 1;
  END IF;
  IF p_calcularICMSSTAnterEfetivo = 1 AND v_quantidade > 0 THEN
    IF v_baseICMSSTEscrituracao > 0 AND v_valorICMSSTEscrituracao > 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSSTEscrituracao * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSSTEscrituracao * p_item_quantidade / v_quantidade), 2);
    ELSIF v_baseICMSST > 0 AND v_valorICMSST > 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSST * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSST * p_item_quantidade / v_quantidade), 2);
    ELSE
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSSTAnteriormente * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSSTAnteriormente * p_item_quantidade / v_quantidade), 2);
    END IF;
    r_item_valorICMSProprioSubstit := ROUND ((v_valorICMS * p_item_quantidade / v_quantidade), 2);
  END IF;
  IF p_calcularFCP = 1 AND v_quantidade > 0 THEN
    r_item_baseFCPSTAnteriormente := ROUND ((v_baseFCPST * p_item_quantidade / v_quantidade), 2);
    r_item_valorFCPSTAnteriormente := ROUND ((v_valorFCPST * p_item_quantidade / v_quantidade), 2);
  END IF;
  IF p_calcularICMSSTAnterEfetivo = 1 AND r_item_baseICMSSTAnteriormente = 0 AND r_item_valorICMSSTAnteriorment = 0 AND r_item_valorICMSProprioSubstit = 0 THEN
    r_item_baseICMSSTAnteriormente := ROUND ((p_item_quantidade *
      FUNC_ADD_BUSCA_PRECO(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        0,
        0,
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END,
        0,
        ' ',
        ' ',
        0,
        0,
        p_item_personalizacao,
        p_gradProd_produto,
        p_gradProd_cor,
        p_gradProd_tamanho,
        p_prod_controleEstoque,
        'U',
        ' ')), 2);
    SELECT
      COALESCE((
        SELECT MAX(ufOrigDest.aliquotaIcms)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEst
        ON munEst.municipio = endEst.municipio
        JOIN PAUFORIGEMXUFDESTINO ufOrigDest
        ON ufOrigDest.ufOrigem = munEst.uf
        AND ufOrigDest.ufDestino = munEst.uf
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),0)
    INTO v_ufOrigDest_aliquotaIcms
    FROM DUAL;
    r_item_valorICMSSTAnteriorment := ROUND (r_item_baseICMSSTAnteriormente * v_ufOrigDest_aliquotaIcms / 100, 2);
  END IF;
END ADD_BUSCA_ICMS_ST_ANTERIOR;

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_REGRA_DESC_PAG (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_246_baseDescontoPagam IN CHAR,
  p_config_337_descontoSobreFret IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_soma_valorPagamentoBruto     IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_pag_meioPagamento            IN NUMBER,
  p_pag_condicaoPagamento        IN NUMBER,
  p_pag_valorPagamentoBruto      IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_percentualDescontoSugestao   OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1)
          ELSE COALESCE((
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      CASE
        WHEN p_config_246_baseDescontoPagam = 'S'
        THEN a.valorBasePagamento
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE a.valorFreteTotal + a.valorSeguroTotal
            END
        WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
        THEN 0
        WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
        THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * (a.valorBasePagamento - p_soma_valorPagamentoBruto)
                / a.valorBasePagamento,2)
            END
        ELSE p_pag_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * p_pag_valorPagamentoBruto
                / a.valorBasePagamento,2)
            END
      END valorBaseDesconto,
      ( CASE
          WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
          THEN 0
          WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
          THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          ELSE p_pag_valorPagamentoBruto
        END
        / a.valorBasePagamento) proporcaoPagamento
    FROM (
      SELECT
        a.estabelecimento,
        CASE
          WHEN p_orc_pessoa = 0
            OR p_config_227_manterPessoaOrcam = 0
          THEN a.pessoa
          ELSE p_orc_pessoa
        END pessoa,
        a.valorBasePagamento,
        a.tipoPagamentoFrete,
        a.valorFreteTotal,
        a.valorSeguroTotal
      FROM MODOCUMENTOSFISCAIS a
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao),2) valorBaseRegra,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBaseDesconto,
      cab.proporcaoPagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'P'
    AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
    -- Filtro Cabeçalho
    AND (a.filtroCabecalho = 0
      OR (filtroCab.filtrarEstabelecimentos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXESTABELEC filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.estabelecimento = cab.estabelecimento
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarUfs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUFS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.uf = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.pessoa
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPerfisUsuario = 0
        AND filtroCab.filtrarUsuarios = 0
        OR filtroCab.filtrarPerfisUsuario = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPERFISUSUAR filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
          AND filtroCabX.ativo = 1)
        OR filtroCab.filtrarUsuarios = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUSUARIOS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.usuario = p_usuarioLogado
          AND filtroCabX.ativo = 1))
      AND (filtroCab.indicadorPessoa = ' '
        OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))
    -- Filtro Pagamento
    AND (a.filtroPagamento = 0
      OR (filtroPag.filtrarMeiosPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXMEIOPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.meioPagamento = p_pag_meioPagamento
          AND filtroPagX.ativo = 1))
      AND (filtroPag.filtrarCondicoesPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXCONDPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.condicaoPagamento = p_pag_condicaoPagamento
          AND filtroPagX.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem,
      b.valorDescontoGeral
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBaseDesconto,
      a.proporcaoPagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND((
      CASE
        WHEN MIN (a.valorDescontoSugestao) < 0
          OR SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
          OR SUM(a.valorBaseDescontoSugestao) <> MAX(a.valorBaseDesconto)
          OR SUM(a.valorDescontoItem) <> 0
          OR SUM(a.valorDescontoGeral) <> 0
          OR SUM(a.possuiRegra) > 1
        THEN 100
          * ROUND(
              CASE
                WHEN SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END) >= p_pag_valorPagamentoBruto
                THEN p_pag_valorPagamentoBruto - 0.01
                ELSE SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END)
              END, 2) / MAX(a.valorBaseDesconto)
        ELSE MAX(a.percentualDescontoSugestao)
      END), 8), 0) percentualDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END, 2), 0) valorDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_percentualDescontoSugestao,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBaseDesconto,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra
          -- Desconto em valor
          WHEN 2
          THEN a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseDesconto
          ELSE 0
        END, 2) valorBaseDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorSugestao
          -- Desconto em valor
          WHEN 2
          THEN 100 * a.valorSugestao * a.multiplicador / a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN 100 * (a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)) / a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.idade
          -- Desconto igual a idade em valor
          WHEN 5
          THEN 100 * a.idade * a.multiplicador / a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN 100 * a.valorBaseRegra / a.valorBaseDesconto
          ELSE 0
        END, 8) percentualDescontoSugestao,
      ROUND (
        ( CASE a.tipoRegraDescontoMargem
            -- Desconto em percentual
            WHEN 1
            THEN a.valorBaseRegra * a.valorSugestao / 100
            -- Desconto em valor
            WHEN 2
            THEN a.valorSugestao * a.multiplicador
             -- Preço unitário fixo
            WHEN 3
            THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao,2)
            -- Desconto igual a idade em percentual
            WHEN 4
            THEN a.valorBaseRegra * a.idade / 100
            -- Desconto igual a idade em valor
            WHEN 5
            THEN a.idade * a.multiplicador
            -- Preço total fixado
            WHEN 6
            THEN a.valorBaseRegra
            ELSE 0
          END
          - a.valorDescontoItem
          - a.valorDescontoGeral)
        * a.proporcaoPagamento, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END * a.proporcaoPagamento, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem - a.valorDescontoGeral)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem,
        SUM (a.valorDescontoGeral) valorDescontoGeral
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBaseDesconto,
          a.proporcaoPagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorDescontoGeral,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos,
          a.valorDescontoGeralTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            0 valorDescontoGeral,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos,
            b.valorDescontoGeral valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento) a) a;
END ADD_DOC_FISC_REGRA_DESC_PAG;

/

create or replace PROCEDURE ADD_DOC_FISC_REGRA_DESC_CAB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1)
          ELSE COALESCE((
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      a.valorBasePagamento
    FROM (
      SELECT
        a.estabelecimento,
        CASE
          WHEN p_orc_pessoa = 0
            OR p_config_227_manterPessoaOrcam = 0
          THEN a.pessoa
          ELSE p_orc_pessoa
        END pessoa,
        a.valorBasePagamento
      FROM MODOCUMENTOSFISCAIS a
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao),2) valorBaseRegra,
      a.valorDescontoItem,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBasePagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'C'
    AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
    -- Filtro Cabeçalho
    AND (a.filtroCabecalho = 0
      OR (filtroCab.filtrarEstabelecimentos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXESTABELEC filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.estabelecimento = cab.estabelecimento
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarUfs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUFS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.uf = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.pessoa
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPerfisUsuario = 0
        AND filtroCab.filtrarUsuarios = 0
        OR filtroCab.filtrarPerfisUsuario = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPERFISUSUAR filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
          AND filtroCabX.ativo = 1)
        OR filtroCab.filtrarUsuarios = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUSUARIOS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.usuario = p_usuarioLogado
          AND filtroCabX.ativo = 1))
      AND (filtroCab.indicadorPessoa = ' '
        OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBasePagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END, 2), 0) valorDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBasePagamento,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorSugestao / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorSugestao * a.multiplicador
           -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END - a.valorDescontoItem, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBasePagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos
        FROM (
