DROP TABLE TEMPPEDCOMPRAITENS;

-- TEMPPEDCOMPRAITENS
CREATE GLOBAL TEMPORARY TABLE TEMPPEDCOMPRAITENS
  (
    sessaoClient              VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                 NUMERIC (3,0) DEFAULT 0 NOT NULL,
    reposicao                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    descCategoria             VARCHAR (256) DEFAULT ' ' NOT NULL,
    categoriaProduto          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descSubcategoria          VARCHAR (256) DEFAULT ' ' NOT NULL,
    subcategoriaProduto       NUMERIC (8,0) DEFAULT 0 NOT NULL,
    referencia                VARCHAR (256) DEFAULT ' ' NOT NULL,
    existeMarcaMaisReferencia NUMERIC (1,0) DEFAULT 0 NOT NULL,
    descCaracteristicaA       VARCHAR (256) DEFAULT ' ' NOT NULL,
    caracteristicaA           NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descCaracteristicaB       VARCHAR (256) DEFAULT ' ' NOT NULL,
    caracteristicaB           NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descCaracteristicaC       VARCHAR (256) DEFAULT ' ' NOT NULL,
    caracteristicaC           NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descCaracteristicaD       VARCHAR (256) DEFAULT ' ' NOT NULL,
    caracteristicaD           NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descCaracteristicaE       VARCHAR (256) DEFAULT ' ' NOT NULL,
    caracteristicaE           NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descExclusivoProdutoA     VARCHAR (256) DEFAULT ' ' NOT NULL,
    exclusivoProdutoA         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descExclusivoProdutoB     VARCHAR (256) DEFAULT ' ' NOT NULL,
    exclusivoProdutoB         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descExclusivoProdutoC     VARCHAR (256) DEFAULT ' ' NOT NULL,
    exclusivoProdutoC         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descExclusivoProdutoD     VARCHAR (256) DEFAULT ' ' NOT NULL,
    exclusivoProdutoD         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descExclusivoProdutoE     VARCHAR (256) DEFAULT ' ' NOT NULL,
    exclusivoProdutoE         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao                 VARCHAR (256) DEFAULT ' ' NOT NULL,
    unidadeMedida             VARCHAR (6) DEFAULT ' ' NOT NULL,
    descCor                   VARCHAR (256) DEFAULT ' ' NOT NULL,
    cor                       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeCor                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    itemListGradeCor NCLOB,
    displayListGradeCor NCLOB,
    gradeTamanho NUMERIC (4,0) DEFAULT 0 NOT NULL,
    itemListGradeTamanho NCLOB,
    displayListGradeTamanho NCLOB,
    produto            NUMERIC (7,0) DEFAULT 0 NOT NULL,
    quantidade         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitario      NUMERIC (15,7) DEFAULT 0 NOT NULL,
    percentualDesconto NUMERIC (15,8) DEFAULT 0 NOT NULL,
    precoLiquido       NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoSugestaoVenda NUMERIC (15,7) DEFAULT 0 NOT NULL,
    aliquotaIPI        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMS       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    dataEntrega        DATE
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPPEDCOMPRAITENS_PK1 ON TEMPPEDCOMPRAITENS (sessaoClient, contadorSessao, sequencia);
CREATE INDEX TEMPPEDCOMPRAITENS_K2 ON TEMPPEDCOMPRAITENS (sessaoClient, contadorSessao, produto);

DROP TABLE TEMPPEDCOMPRATAMANHOS;

-- TEMPPEDCOMPRATAMANHOS
CREATE GLOBAL TEMPORARY TABLE TEMPPEDCOMPRATAMANHOS
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia       NUMERIC (3,0) DEFAULT 0 NOT NULL,
    coluna          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    tamanho         VARCHAR (10) DEFAULT ' ' NOT NULL,
    quantidade      NUMERIC (15,6) DEFAULT 0 NOT NULL,
    gradeProduto    NUMERIC (14,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPPEDCOMPRATAMANHOS_PK1 ON TEMPPEDCOMPRATAMANHOS (sessaoClient, contadorSessao, sequencia, coluna);
CREATE INDEX TEMPPEDCOMPRATAMANHOS_K2 ON TEMPPEDCOMPRATAMANHOS (sessaoClient, contadorSessao, sequencia, gradeProduto);

DROP TABLE TEMPPEDCOMPRAOBSERVACOES;

-- TEMPPEDCOMPRAOBSERVACOES
CREATE GLOBAL TEMPORARY TABLE TEMPPEDCOMPRAOBSERVACOES
  (
    sessaoClient               VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descInformacaoComplementar VARCHAR (800) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPPEDCOMPRAOBSERVACOES_PK1 ON TEMPPEDCOMPRAOBSERVACOES (sessaoClient, contadorSessao, sequencia);

DROP TABLE TEMPEQUALXGRADESPRODUTOS;

-- TEMPEQUALXGRADESPRODUTOS
CREATE GLOBAL TEMPORARY TABLE TEMPEQUALXGRADESPRODUTOS
  (
    sessaoClient       VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    agrupador          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricaoAgrupador VARCHAR (300) DEFAULT ' ' NOT NULL,
    buscouPreco        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoUnitario      NUMERIC (15,7) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPEQUALXGRADESPRODUTOS_PK1 ON TEMPEQUALXGRADESPRODUTOS (sessaoClient, contadorSessao, gradeProduto);
CREATE INDEX TEMPEQUALXGRADESPRODUTOS_K2 ON TEMPEQUALXGRADESPRODUTOS (sessaoClient, contadorSessao, agrupador);

DROP TABLE TEMPEQUALXGRADESPRXESTAB;

-- TEMPEQUALXGRADESPRXESTAB
CREATE GLOBAL TEMPORARY TABLE TEMPEQUALXGRADESPRXESTAB
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    linha           NUMERIC (3,0) DEFAULT 0 NOT NULL,
    gradeProduto    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento NUMERIC (4,0) DEFAULT 0 NOT NULL,
    localEstoque    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    quantidade      NUMERIC (15,6) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPEQUALXGRADESPRXESTAB_PK1 ON TEMPEQUALXGRADESPRXESTAB (sessaoClient, contadorSessao, linha, gradeProduto, estabelecimento, localEstoque);

DROP TABLE TEMPEQUALXLINHAS;

-- TEMPEQUALXLINHAS
CREATE GLOBAL TEMPORARY TABLE TEMPEQUALXLINHAS
  (
    sessaoClient                 VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    agrupador                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    linha                        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    selecionado                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    descricao                    VARCHAR (300) DEFAULT ' ' NOT NULL,
    casasDecimaisUnidadeMedida   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    quantidadeA                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeB                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeC                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeD                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeE                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeF                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeG                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeH                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeI                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeJ                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeK                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeL                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeM                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeN                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeO                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeP                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeQ                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeR                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeS                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeT                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeU                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeV                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeW                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeX                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeY                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeZ                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBA                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBB                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBC                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBD                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBE                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBF                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBG                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBH                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBI                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBJ                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBK                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBL                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBM                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBN                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBO                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBP                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBQ                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBR                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBS                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBT                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBU                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBV                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBW                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBX                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBY                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBZ                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeTotal              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    erro                         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    descricaoErro                VARCHAR (300) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPEQUALXLINHAS_PK1 ON TEMPEQUALXLINHAS (sessaoClient, contadorSessao, agrupador, linha);

DROP TABLE TEMPEQUALXDEPARA;

-- TEMPEQUALXDEPARA
CREATE GLOBAL TEMPORARY TABLE TEMPEQUALXDEPARA
  (
    sessaoClient               VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimentoSaida       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimentoEntrada     NUMERIC (4,0) DEFAULT 0 NOT NULL,
    agrupador                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoqueSaida          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    localEstoqueEntrada        NUMERIC (4,0) DEFAULT 0 NOT NULL,
    selecionado                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    descricao                  VARCHAR (300) DEFAULT ' ' NOT NULL,
    casasDecimaisUnidadeMedida NUMERIC (1,0) DEFAULT 0 NOT NULL,
    quantidade                 NUMERIC (15,6) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPEQUALXDEPARA_PK1 ON TEMPEQUALXDEPARA (sessaoClient, contadorSessao, estabelecimentoSaida, estabelecimentoEntrada, agrupador, gradeProduto, localEstoqueSaida, localEstoqueEntrada);
CREATE INDEX TEMPEQUALXDEPARA_PK2 ON TEMPEQUALXDEPARA (sessaoClient, contadorSessao, agrupador, estabelecimentoSaida, estabelecimentoEntrada);

DROP TABLE TEMPIMPORTCABECALHO;

-- TEMPIMPORTCABECALHO
CREATE GLOBAL TEMPORARY TABLE TEMPIMPORTCABECALHO
  (
    sessaoClient                   VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoDocumento                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    modeloDocumento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    condicaoPagamento              NUMERIC (4,0) DEFAULT 0 NOT NULL,
    loteNfe                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    chaveNfe                       VARCHAR (44) DEFAULT ' ' NOT NULL,
    ufIbge                         NUMERIC (2,0) DEFAULT 0 NOT NULL,
    codigoNumericoNfe              NUMERIC (8,0) DEFAULT 0 NOT NULL,
    naturezaOperacaoDescricao      VARCHAR (60) DEFAULT ' ' NOT NULL,
    modeloDocumentoFiscal          CHAR (2) DEFAULT '  ' NOT NULL,
    serieFiscal                    VARCHAR (4) DEFAULT ' ' NOT NULL,
    documentoFiscal                NUMERIC (9,0) DEFAULT 0 NOT NULL,
    dataEmissao                    DATE,
    timezoneEmissao                VARCHAR (6) DEFAULT ' ' NOT NULL,
    dataEntradaSaida               DATE,
    entradaSaida                   CHAR (1) DEFAULT ' ' NOT NULL,
    localDestinoOperacao           CHAR (1) DEFAULT ' ' NOT NULL,
    municipioFatoGerador           NUMERIC (7,0) DEFAULT 0 NOT NULL,
    formatoImpressaoDanfe          CHAR (1) DEFAULT ' ' NOT NULL,
    formaEmissaoNfe                CHAR (1) DEFAULT ' ' NOT NULL,
    digitoVerificadorNfe           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    indicadorAmbienteNfe           CHAR (1) DEFAULT ' ' NOT NULL,
    tipoCTe                        CHAR (1) DEFAULT ' ' NOT NULL,
    finalidadeNota                 CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorConsumidorFinal       CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorPresencaComprador     CHAR (1) DEFAULT ' ' NOT NULL,
    versaoAplicativo               VARCHAR (20) DEFAULT ' ' NOT NULL,
    fornecedor                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cnpjCpfIdEstrangeiroFornecedor VARCHAR (20) DEFAULT ' ' NOT NULL,
    nomeRazaoSocialFornecedor      VARCHAR (60) DEFAULT ' ' NOT NULL,
    nomeFantasiaFornecedor         VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoFornecedor             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    logradouroFornecedor           VARCHAR (60) DEFAULT ' ' NOT NULL,
    numeroFornecedor               VARCHAR (60) DEFAULT ' ' NOT NULL,
    complementoFornecedor          VARCHAR (60) DEFAULT ' ' NOT NULL,
    bairroDistritoFornecedor       VARCHAR (60) DEFAULT ' ' NOT NULL,
    municipioFornecedor            NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descricaoMunicipioFornecedor   VARCHAR (60) DEFAULT ' ' NOT NULL,
    ufFornecedor                   CHAR (2) DEFAULT '  ' NOT NULL,
    cepFornecedor                  NUMERIC (8,0) DEFAULT 0 NOT NULL,
    paisFornecedor                 CHAR (4) DEFAULT '    ' NOT NULL,
    descricaoPaisFornecedor        VARCHAR (60) DEFAULT ' ' NOT NULL,
    idFoneFornecedor               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    foneFornecedor                 VARCHAR (14) DEFAULT ' ' NOT NULL,
    inscricaoEstadualFornecedor    VARCHAR (14) DEFAULT ' ' NOT NULL,
    inscricaoMunicipalFornecedor   VARCHAR (15) DEFAULT ' ' NOT NULL,
    cnaeFornecedor                 NUMERIC (7,0) DEFAULT 0 NOT NULL,
    regimeTributarioFornecedor     CHAR (1) DEFAULT ' ' NOT NULL,
    cnpjCpfIdEstrangeiroDestinat   VARCHAR (20) DEFAULT ' ' NOT NULL,
    nomeRazaoSocialDestinatario    VARCHAR (60) DEFAULT ' ' NOT NULL,
    logradouroDestinatario         VARCHAR (60) DEFAULT ' ' NOT NULL,
    numeroDestinatario             VARCHAR (60) DEFAULT ' ' NOT NULL,
    complementoDestinatario        VARCHAR (60) DEFAULT ' ' NOT NULL,
    bairroDistritoDestinatario     VARCHAR (60) DEFAULT ' ' NOT NULL,
    municipioDestinatario          NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descricaoMunicipioDestinatario VARCHAR (60) DEFAULT ' ' NOT NULL,
    ufDestinatario                 CHAR (2) DEFAULT '  ' NOT NULL,
    cepDestinatario                NUMERIC (8,0) DEFAULT 0 NOT NULL,
    paisDestinatario               CHAR (4) DEFAULT '    ' NOT NULL,
    descricaoPaisDestinatario      VARCHAR (60) DEFAULT ' ' NOT NULL,
    foneDestinatario               VARCHAR (14) DEFAULT ' ' NOT NULL,
    indicadorInscricaoEstadualDest CHAR (1) DEFAULT ' ' NOT NULL,
    inscricaoEstadualDestinatario  VARCHAR (14) DEFAULT ' ' NOT NULL,
    inscricaoMunicipalDestinatario VARCHAR (15) DEFAULT ' ' NOT NULL,
    inscricaoSuframaDestinatario   VARCHAR (9) DEFAULT ' ' NOT NULL,
    emailDestinatario              VARCHAR (60) DEFAULT ' ' NOT NULL,
    logradouroRetirada             VARCHAR (60) DEFAULT ' ' NOT NULL,
    numeroRetirada                 VARCHAR (60) DEFAULT ' ' NOT NULL,
    complementoRetirada            VARCHAR (60) DEFAULT ' ' NOT NULL,
    bairroDistritoRetirada         VARCHAR (60) DEFAULT ' ' NOT NULL,
    municipioRetirada              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descricaoMunicipioRetirada     VARCHAR (60) DEFAULT ' ' NOT NULL,
    ufRetirada                     CHAR (2) DEFAULT '  ' NOT NULL,
    cepRetirada                    NUMERIC (8,0) DEFAULT 0 NOT NULL,
    paisRetirada                   CHAR (4) DEFAULT '    ' NOT NULL,
    descricaoPaisRetirada          VARCHAR (60) DEFAULT ' ' NOT NULL,
    foneRetirada                   VARCHAR (14) DEFAULT ' ' NOT NULL,
    logradouroEntrega              VARCHAR (60) DEFAULT ' ' NOT NULL,
    numeroEntrega                  VARCHAR (60) DEFAULT ' ' NOT NULL,
    complementoEntrega             VARCHAR (60) DEFAULT ' ' NOT NULL,
    bairroDistritoEntrega          VARCHAR (60) DEFAULT ' ' NOT NULL,
    municipioEntrega               NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descricaoMunicipioEntrega      VARCHAR (60) DEFAULT ' ' NOT NULL,
    ufEntrega                      CHAR (2) DEFAULT '  ' NOT NULL,
    cepEntrega                     NUMERIC (8,0) DEFAULT 0 NOT NULL,
    paisEntrega                    CHAR (4) DEFAULT '    ' NOT NULL,
    descricaoPaisEntrega           VARCHAR (60) DEFAULT ' ' NOT NULL,
    foneEntrega                    VARCHAR (14) DEFAULT ' ' NOT NULL,
    baseICMS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesoneracao           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSuframaDestinatario   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSuframaRemetente      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorProdutos                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFrete                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguro                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPIDevelucao              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesas            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorTotalTributosAproximados  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorServicos                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseISSQN                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    dataCompetencia                DATE,
    valorISSQNRetencao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISRetencao               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSRetencao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCSLL                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseIRRF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIRRF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseINSS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorINSS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    modalidadeFrete                CHAR (1) DEFAULT ' ' NOT NULL,
    transportadora                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cnpjCpfIdEstrangeiroTransp     VARCHAR (20) DEFAULT ' ' NOT NULL,
    nomeRazaoSocialTransp          VARCHAR (60) DEFAULT ' ' NOT NULL,
    inscricaoEstadualTransp        VARCHAR (14) DEFAULT ' ' NOT NULL,
    enderecoTransp                 VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoMunicipioTransp       VARCHAR (60) DEFAULT ' ' NOT NULL,
    ufTransportadora               CHAR (2) DEFAULT '  ' NOT NULL,
    placa                          VARCHAR (7) DEFAULT ' ' NOT NULL,
    uf                             CHAR (2) DEFAULT '  ' NOT NULL,
    rntrc                          VARCHAR (20) DEFAULT ' ' NOT NULL,
    vagao                          VARCHAR (20) DEFAULT ' ' NOT NULL,
    balsa                          VARCHAR (20) DEFAULT ' ' NOT NULL,
    quantidadeVolume               NUMERIC (15,0) DEFAULT 0 NOT NULL,
    especieVolume                  VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoMarca                 VARCHAR (60) DEFAULT ' ' NOT NULL,
    numeracaoVolume                VARCHAR (60) DEFAULT ' ' NOT NULL,
    pesoLiquido                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBruto                      NUMERIC (15,6) DEFAULT 0 NOT NULL,
    descInformacaoAdicionalFisco   VARCHAR (800) DEFAULT ' ' NOT NULL,
    descInformacaoComplementar     VARCHAR (800) DEFAULT ' ' NOT NULL,
    fatura                         VARCHAR (60) DEFAULT ' ' NOT NULL,
    faturaValorOriginal            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    faturaDesconto                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    faturaValorLiquido             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    protocoloNfe                   NUMERIC (15,0) DEFAULT 0 NOT NULL,
    protocoloNfeData               DATE
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPORTCABECALHO ADD CONSTRAINT TEMPIMPORTCABECALHO_PK1 PRIMARY KEY (sessaoClient, contadorSessao);

DROP TABLE TEMPIMPORTNFREF;

-- TEMPIMPORTNFREF
CREATE GLOBAL TEMPORARY TABLE TEMPIMPORTNFREF
  (
    sessaoClient          VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia             NUMERIC (3,0) DEFAULT 0 NOT NULL,
    modeloDocumentoFiscal CHAR (2) DEFAULT '  ' NOT NULL,
    chaveNfe              VARCHAR (44) DEFAULT ' ' NOT NULL,
    municipio             NUMERIC (7,0) DEFAULT 0 NOT NULL,
    uf                    CHAR (2) DEFAULT '  ' NOT NULL,
    dataEmissao           DATE,
    indicadorPessoa       CHAR (1) DEFAULT ' ' NOT NULL,
    cnpjCpfIdEstrangeiro  VARCHAR (20) DEFAULT ' ' NOT NULL,
    inscricaoEstadual     VARCHAR (14) DEFAULT ' ' NOT NULL,
    serieFiscal           VARCHAR (4) DEFAULT ' ' NOT NULL,
    subserieFiscal        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    documentoFiscal       NUMERIC (9,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPORTNFREF ADD CONSTRAINT TEMPIMPORTNFREF_PK1 PRIMARY KEY (sessaoClient, contadorSessao, sequencia);

DROP TABLE TEMPIMPORTITENS;

-- TEMPIMPORTITENS
CREATE GLOBAL TEMPORARY TABLE TEMPIMPORTITENS
  (
    sessaoClient                  VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    selecionado                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    produtoImpresso               VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoImpressa             VARCHAR (120) DEFAULT ' ' NOT NULL,
    codigoFornecedor              VARCHAR (60) DEFAULT ' ' NOT NULL,
    eanGtin                       VARCHAR (14) DEFAULT ' ' NOT NULL,
    descricaoFornecedor           VARCHAR (120) DEFAULT ' ' NOT NULL,
    ncm                           CHAR (8) DEFAULT '        ' NOT NULL,
    cest                          NUMERIC (7,0) DEFAULT 0 NOT NULL,
    codigoProdutoAnp              NUMERIC (9,0) DEFAULT 0 NOT NULL,
    excecaoTipi                   CHAR (3) DEFAULT '   ' NOT NULL,
    cfop                          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    unidadeMedidaComercial        VARCHAR (6) DEFAULT ' ' NOT NULL,
    quantidadeComercial           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeGrade               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    contadorGrade                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoUnitarioComercial        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoComercial         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    eanGtinTributado              VARCHAR (14) DEFAULT ' ' NOT NULL,
    unidadeMedidaTributado        VARCHAR (6) DEFAULT ' ' NOT NULL,
    quantidadeTributado           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitarioTributado        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorFrete                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguro                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasAcessorias NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorProdutoTributado         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    origemMercadoria              CHAR (1) DEFAULT ' ' NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    modalidadeBaseCalcICMS        CHAR (1) DEFAULT ' ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    reducaoBaseICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    modalidadeBaseCalcICMSST      CHAR (1) DEFAULT ' ' NOT NULL,
    margemValorAdicionadoST       NUMERIC (15,4) DEFAULT 0 NOT NULL,
    reducaoBaseST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMSST                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMSST                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesoneracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    motivoDesoneracaoICMS         CHAR (2) DEFAULT '  ' NOT NULL,
    valorICMSOperacao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    diferimentoICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMSDiferido             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTAnteriormente      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaSTSuportConsFinal     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    partilhaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSUFRemetente           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFRemetente          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMSUFDestinatario    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseImpostoImportacao         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostoImportacao        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneiras       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    codigoEnquadramentoIPI        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    stIPI                         CHAR (2) DEFAULT ' ' NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIPI                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    qtdeUnidIPI                   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaIPI              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaISSQN                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    indicadorISSQN                CHAR (1) DEFAULT ' ' NOT NULL,
    listaServicos                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    valorISSQNRetencao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    quantidadeVendidaPIS          NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    quantidadeVendidaPISST        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stCOFINS                      CHAR (2) DEFAULT '  ' NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    quantidadeVendidaCOFINS       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINS           NUMERIC (15,4) DEFAULT 0 NOT NULL,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    quantidadeVendidaCOFINSST     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    informacoesAdicionaisProduto  VARCHAR (500) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPORTITENS ADD CONSTRAINT TEMPIMPORTITENS_PK1 PRIMARY KEY (sessaoClient, contadorSessao, sequencia);
CREATE INDEX TEMPIMPORTITENS_K2 ON TEMPIMPORTITENS (sessaoClient, contadorSessao, codigoFornecedor, sequencia);

DROP TABLE TEMPIMPORTGRADES;

-- TEMPIMPORTGRADES
CREATE GLOBAL TEMPORARY TABLE TEMPIMPORTGRADES
  (
    sessaoClient              VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                 NUMERIC (3,0) DEFAULT 0 NOT NULL,
    contadorGrade             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeDistribuicaoDFe      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto                   NUMERIC (7,0) DEFAULT 0 NOT NULL,
    controleQuantidade        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedidaConversao    VARCHAR (6) DEFAULT ' ' NOT NULL,
    conversorQuantidade       NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimo                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiplo              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    altura                    NUMERIC (14,3) DEFAULT 0 NOT NULL,
    largura                   NUMERIC (14,3) DEFAULT 0 NOT NULL,
    comprimento               NUMERIC (14,3) DEFAULT 0 NOT NULL,
    pecas                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeComercial       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConvertida      NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeSaldoOrcamento  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBaixarOrcamento NUMERIC (15,6) DEFAULT 0 NOT NULL,
    operacaoFiscal            NUMERIC (14,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPORTGRADES ADD CONSTRAINT TEMPIMPORTGRADES_PK1 PRIMARY KEY (sessaoClient, contadorSessao, sequencia, contadorGrade);
CREATE INDEX TEMPIMPORTGRADES_K2 ON TEMPIMPORTGRADES (sessaoClient, contadorSessao, sequencia, produto);

DROP TABLE TEMPIMPORTNUMEROSSERIE;

-- TEMPIMPORTNUMEROSSERIE
CREATE GLOBAL TEMPORARY TABLE TEMPIMPORTNUMEROSSERIE
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia       NUMERIC (3,0) DEFAULT 0 NOT NULL,
    contadorGrade   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroSerie     VARCHAR (60) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPORTNUMEROSSERIE ADD CONSTRAINT TEMPIMPORTNUMEROSSERIE_PK1 PRIMARY KEY (sessaoClient, contadorSessao, sequencia, contadorGrade, gradeProduto, numeroSerie);

DROP TABLE TEMPIMPORTFINANCEIRO;

-- TEMPIMPORTFINANCEIRO
CREATE GLOBAL TEMPORARY TABLE TEMPIMPORTFINANCEIRO
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    parcela         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    fatura          VARCHAR (60) DEFAULT ' ' NOT NULL,
    vencimento      DATE,
    valor           NUMERIC (15,2) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPORTFINANCEIRO ADD CONSTRAINT TEMPIMPORTFINANCEIRO_PK1 PRIMARY KEY (sessaoClient, contadorSessao, parcela);

DROP TABLE TEMPRETORNOCOBRANCA;

-- TEMPRETORNOCOBRANCA
CREATE GLOBAL TEMPORARY TABLE TEMPRETORNOCOBRANCA
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ocorrencia      VARCHAR2(2) NOT NULL,
    motivo          VARCHAR2(3) NOT NULL,
    idFinanceiro    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    data            DATE,
    valor           NUMERIC (15,2) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPRETORNOCOBRANCA ADD CONSTRAINT TEMPRETORNOCOBRANCA_PK1 PRIMARY KEY (sessaoClient, contadorSessao, id);
CREATE INDEX TEMPRETORNOCOBRANCA_K2 ON TEMPRETORNOCOBRANCA (sessaoClient, contadorSessao, ocorrencia, motivo, idFinanceiro);

DROP TABLE TEMPAGENDA;

-- TEMPAGENDA
CREATE GLOBAL TEMPORARY TABLE TEMPAGENDA
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    data            DATE,
    horaInicial     CHAR(6),
    horaFinal       CHAR(6),
    tempo           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    situacao        CHAR (1) DEFAULT ' ' NOT NULL,
    texto           NCLOB,
    tooltip         NCLOB
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX AGENDA_PK1 ON TEMPAGENDA (sessaoClient, contadorSessao, id);
CREATE INDEX AGENDA_K2 ON TEMPAGENDA (sessaoClient, contadorSessao, data, horaInicial, id);

DROP TABLE TEMPCALENDARIO;

-- TEMPCALENDARIO
CREATE GLOBAL TEMPORARY TABLE TEMPCALENDARIO
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tela            NUMBER(1) NOT NULL,
    linha           NUMBER(2) NOT NULL,
    domTempo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    domContador     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    domIdA          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    domIdB          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    domIdC          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    domIdD          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    segTempo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    segContador     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    segIdA          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    segIdB          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    segIdC          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    segIdD          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    terTempo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    terContador     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    terIdA          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    terIdB          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    terIdC          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    terIdD          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quaTempo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quaContador     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quaIdA          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quaIdB          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quaIdC          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quaIdD          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quiTempo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quiContador     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quiIdA          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quiIdB          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quiIdC          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quiIdD          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sexTempo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    sexContador     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sexIdA          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sexIdB          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sexIdC          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sexIdD          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sabTempo        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    sabContador     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sabIdA          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sabIdB          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sabIdC          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sabIdD          NUMERIC (14,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPCALENDARIO_PK1 ON TEMPCALENDARIO (sessaoClient, contadorSessao, tela, linha);

DROP TABLE TEMPSPED;

-- TEMPSPED
CREATE GLOBAL TEMPORARY TABLE TEMPSPED
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    registro        VARCHAR2(4) NOT NULL,
    codigo          VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricao       VARCHAR (800) DEFAULT ' ' NOT NULL,
    codigo2         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo3         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo4         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo5         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo6         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo7         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo8         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo9         VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo10        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo11        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo12        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo13        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo14        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo15        VARCHAR (256) DEFAULT ' ' NOT NULL,
    quantidade1     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade2     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade3     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoLiquido     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBruto       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    indicador1      CHAR (1) DEFAULT ' ' NOT NULL,
    indicador2      CHAR (1) DEFAULT ' ' NOT NULL,
    indicador3      CHAR (1) DEFAULT ' ' NOT NULL,
    indicador4      CHAR (1) DEFAULT ' ' NOT NULL,
    indicador5      CHAR (1) DEFAULT ' ' NOT NULL,
    aliquota1       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota2       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota3       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota4       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota5       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota6       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota7       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota8       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota9       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquota10      NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valor1          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor2          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor3          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor4          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor5          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor6          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor7          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor8          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor9          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor10         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor11         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor12         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor13         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor14         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor15         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor16         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor17         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor18         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor19         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valor20         NUMERIC (15,2) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPSPED_PK1 ON TEMPSPED (sessaoClient, registro, codigo);
CREATE INDEX TEMPSPED_K2 ON TEMPSPED (sessaoClient, registro, descricao);

DROP TABLE TEMPIDS;

-- TEMPIDS
CREATE GLOBAL TEMPORARY TABLE TEMPIDS
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPIDS_PK1 ON TEMPIDS (sessaoClient, contadorSessao, id);

DROP TABLE TEMPRESUMOVENDAS;

-- TEMPRESUMOVENDAS
CREATE GLOBAL TEMPORARY TABLE TEMPRESUMOVENDAS
  (
    sessaoClient                   VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nivelConta                     NUMERIC (2,0) DEFAULT 0 NOT NULL,
    idA                            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idB                            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idC                            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idD                            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idE                            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoDocumento                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    idCabecalho                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    visivel                        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacaoA                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoB                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoC                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoD                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoE                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricaoA                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoB                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoC                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoD                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoE                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoA                        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoB                        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoC                        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoD                        VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoE                        VARCHAR (256) DEFAULT ' ' NOT NULL,
    expandido                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    descricao                      VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigo                         VARCHAR (256) DEFAULT ' ' NOT NULL,
    referencia                     VARCHAR (60) DEFAULT ' ' NOT NULL,
    classificacao                  CHAR (1) DEFAULT ' ' NOT NULL,
    idDocumento                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    data                           DATE,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    valorVendaBruta                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualDesconto             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorDesconto                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFrete                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorVendaLiquida              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDevolvido                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFaturamentoLiquido        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualFaturamentoLiquido   NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorFaturamentoAcumulado      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualFaturamentoAcumulado NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorLiquidoSemFreteSeguro     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCaptacao                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorTarifaCartao              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostos                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCusto                     NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCusto                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualMargem               NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMargem                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    imagemMargem                   VARCHAR (256) DEFAULT ' ' NOT NULL,
    percentualMeta                 NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorMeta                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    quantidade                     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeSaldo                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    casasDecimaisUnidadeMedida     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ticketMedio                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    numeroVendas                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroItens                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    itensMedio                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorXPrazoParcelas            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    prazoMedio                     NUMERIC (6,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPRESUMOVENDAS_PK1 ON TEMPRESUMOVENDAS (sessaoClient, contadorSessao, nivelConta, idA, idB, idC, idD, idE, tipoDocumento, idCabecalho, codigoA, codigoB, codigoC, codigoD, codigoE);
CREATE INDEX TEMPRESUMOVENDAS_K2 ON TEMPRESUMOVENDAS (sessaoClient, contadorSessao, visivel, ordenacaoA, ordenacaoB, ordenacaoC, ordenacaoD, ordenacaoE, nivelConta, data, tipoDocumento, idCabecalho);
CREATE INDEX TEMPRESUMOVENDAS_K3 ON TEMPRESUMOVENDAS (sessaoClient, contadorSessao, ordenacaoA, ordenacaoB, ordenacaoC, ordenacaoD, ordenacaoE, nivelConta, data, tipoDocumento, idCabecalho);

DROP TABLE TEMPRESUMOINADIMPLENCIA;

-- TEMPRESUMOINADIMPLENCIA
CREATE GLOBAL TEMPORARY TABLE TEMPRESUMOINADIMPLENCIA
  (
    sessaoClient             VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nivelConta               NUMERIC (2,0) DEFAULT 0 NOT NULL,
    codigoA                  VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoB                  VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoC                  VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoD                  VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoE                  VARCHAR (256) DEFAULT ' ' NOT NULL,
    visivel                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    expandido                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacaoA               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoB               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoC               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoD               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacaoE               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricaoA               VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoB               VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoC               VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoD               VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoE               VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricao                VARCHAR (256) DEFAULT ' ' NOT NULL,
    numeroPessoas            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    valorTotalParcelas       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorReceitasFinanceiras NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLimiteCredito       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoLimiteCredito  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorBaseMes0            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoMes0           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualSaldoMes0      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBaseMes1            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoMes1           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualSaldoMes1      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBaseMes2            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoMes2           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualSaldoMes2      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBaseMes3            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoMes3           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualSaldoMes3      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBaseMes4            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoMes4           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualSaldoMes4      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBaseMes5            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoMes5           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualSaldoMes5      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBaseMes6            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSaldoMes6           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualSaldoMes6      NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorBasePerdas          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPerdas              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualPerdas         NUMERIC (15,8) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPRESUMOINADIMPLENCIA_PK1 ON TEMPRESUMOINADIMPLENCIA (sessaoClient, contadorSessao, nivelConta, codigoA, codigoB, codigoC, codigoD, codigoE);
CREATE INDEX TEMPRESUMOINADIMPLENCIA_K2 ON TEMPRESUMOINADIMPLENCIA (sessaoClient, contadorSessao, visivel, ordenacaoA, ordenacaoB, ordenacaoC, ordenacaoD, ordenacaoE, nivelConta);
CREATE INDEX TEMPRESUMOINADIMPLENCIA_K3 ON TEMPRESUMOINADIMPLENCIA (sessaoClient, contadorSessao, ordenacaoA, ordenacaoB, ordenacaoC, ordenacaoD, ordenacaoE, nivelConta);

DROP TABLE TEMPDEMONSTRATIVOCOLUNAS;

-- TEMPDEMONSTRATIVOCOLUNAS
CREATE GLOBAL TEMPORARY TABLE TEMPDEMONSTRATIVOCOLUNAS
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    coluna          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nomeColuna      VARCHAR (256) DEFAULT ' ' NOT NULL,
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    conteudo        VARCHAR (256) DEFAULT ' ' NOT NULL,
    dataInicialA    DATE,
    dataFinalA      DATE,
    dataInicialB    DATE,
    dataFinalB      DATE
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPDEMONSTRATIVOCOLUNAS_PK1 ON TEMPDEMONSTRATIVOCOLUNAS (sessaoClient, contadorSessao, coluna);

DROP TABLE TEMPDEMONSTRATIVOLINHAS;

-- TEMPDEMONSTRATIVOLINHAS
CREATE GLOBAL TEMPORARY TABLE TEMPDEMONSTRATIVOLINHAS
  (
    sessaoClient                 VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    linha                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDemonstrativoXCategoria    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contaEstruturada             VARCHAR (60) DEFAULT ' ' NOT NULL,
    codigoDescricaoCampo         VARCHAR (300) DEFAULT ' ' NOT NULL,
    indicadorConta               CHAR (1) DEFAULT ' ' NOT NULL,
    nivelConta                   NUMERIC (2,0) DEFAULT 0 NOT NULL,
    idProcessamentoDemonstrativo NUMERIC (3,0) DEFAULT 0 NOT NULL,
    fonte                        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cor                          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    habilitaDetalhar             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoRegistroA                CHAR (1) DEFAULT ' ' NOT NULL,
    tipoRegistroB                CHAR (1) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPDEMONSTRATIVOLINHAS_PK1 ON TEMPDEMONSTRATIVOLINHAS (sessaoClient, contadorSessao, linha);

DROP TABLE TEMPDEMONSTRATIVOSINTETICO;

-- TEMPDEMONSTRATIVOSINTETICO
CREATE GLOBAL TEMPORARY TABLE TEMPDEMONSTRATIVOSINTETICO
  (
    sessaoClient          VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    linha                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    coluna                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    codigoDescricaoCampo  VARCHAR (300) DEFAULT ' ' NOT NULL,
    valorColunaA          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualVerticalA   NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percentualHorizontalA NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorColunaB          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualDelta       NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percentualVerticalB   NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percentualHorizontalB NUMERIC (15,8) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPDEMONSTRATIVOSINTETICO_PK1 ON TEMPDEMONSTRATIVOSINTETICO (sessaoClient, contadorSessao, linha, coluna);

DROP TABLE TEMPDEMONSTRATIVOANALITICO;

-- TEMPDEMONSTRATIVOANALITICO
CREATE GLOBAL TEMPORARY TABLE TEMPDEMONSTRATIVOANALITICO
  (
    sessaoClient                VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    linha                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    coluna                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    AB                          CHAR (1) DEFAULT ' ' NOT NULL,
    idDemonstrativoXContaFinanc NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoRegistro                CHAR (1) DEFAULT ' ' NOT NULL,
    id                          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEntradaSaida            DATE,
    dataEmissao                 DATE,
    nomeRazaoSocial             VARCHAR (60) DEFAULT ' ' NOT NULL,
    descInformacaoComplementar  VARCHAR (800) DEFAULT ' ' NOT NULL,
    documento                   VARCHAR (60) DEFAULT ' ' NOT NULL,
    vencimento                  DATE,
    valor                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                       NUMERIC (15,2) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPDEMONSTRATIVOANALITICO_PK1 ON TEMPDEMONSTRATIVOANALITICO (sessaoClient, contadorSessao, linha, coluna, AB, tipoRegistro, id);
CREATE INDEX TEMPDEMONSTRATIVOANALITICO_K2 ON TEMPDEMONSTRATIVOANALITICO (sessaoClient, contadorSessao, linha, coluna, AB, dataEntradaSaida, estabelecimento, id);
CREATE INDEX TEMPDEMONSTRATIVOANALITICO_K3 ON TEMPDEMONSTRATIVOANALITICO (sessaoClient, contadorSessao, linha, coluna, AB, dataEmissao, estabelecimento, id);
CREATE INDEX TEMPDEMONSTRATIVOANALITICO_K4 ON TEMPDEMONSTRATIVOANALITICO (sessaoClient, contadorSessao, linha, coluna, AB, vencimento, estabelecimento, id);
CREATE INDEX TEMPDEMONSTRATIVOANALITICO_K5 ON TEMPDEMONSTRATIVOANALITICO (sessaoClient, contadorSessao, linha, coluna, AB, nomeRazaoSocial, dataEntradaSaida, estabelecimento, id);

DROP TABLE TEMPGERARELFILTROS;

CREATE GLOBAL TEMPORARY TABLE TEMPGERARELFILTROS
  (
    sessaoClient          VARCHAR (30) DEFAULT ' ' NOT NULL,
    idSessao              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao             NUMERIC (11,0) DEFAULT 0 NOT NULL,
    visaoGeradorRelatorio NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nomeCampo             VARCHAR (256) DEFAULT ' ' NOT NULL,
    selectCampo           VARCHAR (4000) DEFAULT ' ' NOT NULL,
    visivel               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoCampo             CHAR (1) DEFAULT ' ' NOT NULL,
    mascara               VARCHAR (30) DEFAULT ' ' NOT NULL,
    menuPesquisa          NUMERIC (10,0) DEFAULT 0 NOT NULL,
    tipoFiltro            NUMERIC (3,0) DEFAULT 0 NOT NULL,
    substituirApenasTag   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    nomeTag               VARCHAR (256) DEFAULT ' ' NOT NULL,
    nomeTagFinal          VARCHAR (256) DEFAULT ' ' NOT NULL,
    multiplos NCLOB,
    alfaFiltroInicial     VARCHAR (300) DEFAULT ' ' NOT NULL,
    alfaFiltroFinal       VARCHAR (300) DEFAULT ' ' NOT NULL,
    dataFiltroInicial     DATE NOT NULL,
    dataFiltroFinal       DATE NOT NULL,
    horaFiltroInicial     CHAR(6) NOT NULL,
    horaFiltroFinal       CHAR(6) NOT NULL,
    numericoFiltroInicial NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numericoFiltroFinal   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    logicoFiltro          NUMERIC (1,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPGERARELFILTROS_PK1 ON TEMPGERARELFILTROS (sessaoClient, idSessao, ordenacao);

DROP TABLE TEMPGERADORRELATORIOS;

CREATE GLOBAL TEMPORARY TABLE TEMPGERADORRELATORIOS
  (
    sessaoClient    VARCHAR (30) DEFAULT ' ' NOT NULL,
    idSessao        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao       NUMERIC (11,0) DEFAULT 0 NOT NULL,
    esquerdaImagem  VARCHAR (256) DEFAULT ' ' NOT NULL,
    geralFonte      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    geralCor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col1descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col1cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col2descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col2cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col3descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col3cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col4descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col4cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col5descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col5cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col6descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col6cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col7descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col7cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col8descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col8cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col9descricao   VARCHAR (300) DEFAULT ' ' NOT NULL,
    col9cor         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col10descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col10cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col11descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col11cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col12descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col12cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col13descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col13cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col14descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col14cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col15descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col15cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col16descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col16cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col17descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col17cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col18descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col18cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col19descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col19cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    col20descricao  VARCHAR (300) DEFAULT ' ' NOT NULL,
    col20cor        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    direita1imagem  VARCHAR (256) DEFAULT ' ' NOT NULL,
    direita2imagem  VARCHAR (256) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPGERADORRELATORIOS_PK1 ON TEMPGERADORRELATORIOS (sessaoClient, idSessao, ordenacao);

create or replace FUNCTION FUNC_ADD_MONTA_OBSERVACAO_ITEM (
    p_sessaoClient                 IN VARCHAR2,
    p_config_198_obs_add_referenc  IN NUMBER,
    p_config_199_obs_add_caractA   IN NUMBER,
    p_config_200_obs_add_caractB   IN NUMBER,
    p_config_201_obs_add_caractC   IN NUMBER,
    p_config_202_obs_add_caractD   IN NUMBER,
    p_config_203_obs_add_caractE   IN NUMBER,
    p_tempComp_nomeTempComposicao  IN VARCHAR2,
    p_tempComp_sequencia           IN NUMBER,
    p_Doc_Orc_Pre_Sep_Transf       IN CHAR,
    p_item_id                      IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_controleQuantidade      IN NUMBER,
    p_item_loteMultiplo            IN NUMBER,
    p_item_altura                  IN NUMBER,
    p_item_largura                 IN NUMBER,
    p_item_comprimento             IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2)
  RETURN VARCHAR2
IS
  v_prod_caracteristicaA NUMBER;
  v_prod_caracteristicaB NUMBER;
  v_prod_caracteristicaC NUMBER;
  v_prod_caracteristicaD NUMBER;
  v_prod_caracteristicaE NUMBER;
  v_prod_referencia      VARCHAR2(60);
  v_observacoes          VARCHAR2(4000);
  v_aux_observacoes      VARCHAR2(4000);
BEGIN
  v_observacoes := '';
  IF p_config_198_obs_add_referenc  = 1
    OR p_config_199_obs_add_caractA = 1
    OR p_config_200_obs_add_caractB = 1
    OR p_config_201_obs_add_caractC = 1
    OR p_config_202_obs_add_caractD = 1
    OR p_config_203_obs_add_caractE = 1 THEN
    SELECT
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.referencia
    INTO
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_referencia
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_item_gradeProduto;
    -- Referência Produto
    IF p_config_198_obs_add_referenc = 1 AND NOT(v_prod_referencia IS NULL) AND v_prod_referencia <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || 'Ref.: ' || v_prod_referencia,1,4000));
    END IF;
    -- Caracteristica A
    IF p_config_199_obs_add_caractA = 1 AND v_prod_caracteristicaA <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASA
      WHERE caracteristicaA = v_prod_caracteristicaA;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica B
    IF p_config_200_obs_add_caractB = 1 AND v_prod_caracteristicaB <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASB
      WHERE caracteristicaB = v_prod_caracteristicaB;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica C
    IF p_config_201_obs_add_caractC = 1 AND v_prod_caracteristicaC <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASC
      WHERE caracteristicaC = v_prod_caracteristicaC;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica D
    IF p_config_202_obs_add_caractD = 1 AND v_prod_caracteristicaD <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASD
      WHERE caracteristicaD = v_prod_caracteristicaD;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica E
    IF p_config_203_obs_add_caractE = 1 AND v_prod_caracteristicaE <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASE
      WHERE caracteristicaE = v_prod_caracteristicaE;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
  END IF;
  -- Formula Tinta
  IF p_item_idFormulaTinta <> 0 THEN
    SELECT TRIM (UPPER (marcTint.descricao))
      || ' ' || TRIM (formTint.descricaoCor)
      || CASE WHEN formTint.descricaoCor = formTint.descricaoNomeCor THEN '' ELSE ' ' || TRIM (formTint.descricaoNomeCor) END
      || ' Base: ' || TRIM (baseTint.baseTinta)
      || ' Emb.: ' || TRIM (embTint.descricao) 
    INTO v_aux_observacoes
    FROM CAFORMULASTINTAS formTint
    JOIN SIMARCASTINTAS marcTint ON marcTint.marcaTinta = formTint.marcaTinta
    JOIN CABASESTINTAS baseTint ON baseTint.idBaseTinta = formTint.idBaseTinta
    JOIN SIEMBALAGENSTINTAS embTint ON embTint.embalagemTinta = baseTint.embalagemTinta
    WHERE formTint.idFormulaTinta = p_item_idFormulaTinta;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  -- Personalização
  IF p_item_personalizacao <> 0 THEN
    SELECT descricao
    INTO v_aux_observacoes
    FROM PAPERSONALIZACOES
    WHERE personalizacao = p_item_personalizacao;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  -- Lote
  IF p_item_idLoteEstoque <> 0 THEN
    SELECT 'Lote: ' || loteEstoque
    INTO v_aux_observacoes
    FROM CAGRADEPRODUTOXLOTESESTOQ
    WHERE idLoteEstoque = p_item_idLoteEstoque;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  -- Espessura / Largura / Comprimento
  IF p_item_controleQuantidade BETWEEN 2 AND 3 THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END
      || 'Espessura ' || RTRIM (TO_CHAR (p_item_altura, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' CM'
      || ' X Largura ' || RTRIM (TO_CHAR (p_item_largura, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' CM',1,4000));
    IF p_item_controleQuantidade = 3 THEN
      v_observacoes := RTRIM(SUBSTR(v_observacoes || ' X Comprimento ' || RTRIM (TO_CHAR (p_item_comprimento, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' MT',1,4000));
    END IF;
  END IF;
  -- Volumes
  IF p_item_loteMultiplo <> 0 THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || 'Volumes: ' || RTRIM (TO_CHAR (( p_item_quantidade / p_item_loteMultiplo), 'FM999G999G999G999G999G990')),1,4000));
  END IF;
  -- Composição preço
  IF p_tempComp_nomeTempComposicao IS NOT NULL AND p_tempComp_nomeTempComposicao <> ' ' THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (temp.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia),' ') numeros
    INTO v_aux_observacoes
    FROM TEMPCOMPOSICAOPRECO temp
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = temp.composicaoPreco
    WHERE temp.sessaoClient = p_sessaoClient
    AND temp.nomeTempComposicao = p_tempComp_nomeTempComposicao
    AND temp.sequencia = p_tempComp_sequencia
    AND temp.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'D' AND p_item_id <> 0 THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id),' ') numeros
    INTO v_aux_observacoes
    FROM MODOCFISCALXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemDocFiscal = p_item_id
    AND compDoc.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'O' AND p_item_id <> 0 THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id),' ') numeros
    INTO v_aux_observacoes
    FROM MOORCAMENTOXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemOrcamento = p_item_id
    AND compDoc.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'P' AND p_item_id <> 0 THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id),' ') numeros
    INTO v_aux_observacoes
    FROM MOPREDOCUMXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemPreDocumento = p_item_id
    AND compDoc.selecionado = 1;
  ELSE
    v_aux_observacoes := ' ';
  END IF;
  IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
  END IF;
  -- Observações Digitadas
  IF NOT(p_item_observacoesDigitadas IS NULL) AND p_item_observacoesDigitadas <> ' ' THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || p_item_observacoesDigitadas,1,4000));
  END IF;
  -- Números Série
  IF p_item_id <> 0 THEN
    IF p_Doc_Orc_Pre_Sep_Transf = 'D' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MODOCFISCALXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemDocFiscal = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'O' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MOORCAMENTOXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemOrcamento = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'P' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MOPREDOCUMXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemPreDocumento = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'S' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MOSEPARACAOXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemSeparacao = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'T' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MODOCTRANSFXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemDocTransferencia = p_item_id;
    ELSE
      v_aux_observacoes := ' ';
    END IF;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || 'Seriais: ' || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  IF v_observacoes IS NULL OR v_observacoes = ' ' THEN
    v_observacoes := ' ';
  END IF;
  RETURN v_observacoes;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_MINIMO (
  p_estabelecimento  IN NUMBER,
  p_gradProd_produto IN NUMBER)
  RETURN NUMBER
IS
  v_estoqueMinimo NUMBER;
BEGIN
  SELECT COALESCE (MAX (distrXEst.estoqueMinimo), 0)
  INTO v_estoqueMinimo      
  FROM PAREGRASDISTRIBUICOES distr
  JOIN CAPRODUTOS prod
  ON prod.produto = p_gradProd_produto
  JOIN PASUBCATEGORIASPRODUTO subCat
  ON subCat.subcategoriaProduto = prod.subcategoriaProduto
  JOIN PAREGRASDISTRIBXESTABELEC distrXEst
  ON distrXEst.idRegraDistribuicao = distr.idRegraDistribuicao
  WHERE distr.idRegraDistribuicao > 0
  AND distr.ativo = 1
  AND distrXEst.estabelecimento = p_estabelecimento
  AND distrXEst.dataValidadeInicial <= TRUNC (SYSDATE)
  AND distrXEst.dataValidadeFinal >= TRUNC (SYSDATE)
  AND (distr.categoriaProduto = 0
    OR distr.categoriaProduto = subCat.categoriaProduto)
  AND (distr.subcategoriaProduto = 0
    OR distr.subcategoriaProduto = prod.subcategoriaProduto)
  AND (distr.marca = 0
    OR distr.marca = prod.marca)
  AND (distr.caracteristicaA = 0
    OR distr.caracteristicaA = prod.caracteristicaA)
  AND (distr.caracteristicaB = 0
    OR distr.caracteristicaB = prod.caracteristicaB)
  AND (distr.caracteristicaC = 0
    OR distr.caracteristicaC = prod.caracteristicaC)
  AND (distr.caracteristicaD = 0
    OR distr.caracteristicaD = prod.caracteristicaD)
  AND (distr.caracteristicaE = 0
    OR distr.caracteristicaE = prod.caracteristicaE)
  AND (distr.produto = 0
    OR distr.produto = p_gradProd_produto);
  IF v_estoqueMinimo = 0 THEN
    SELECT COALESCE (MAX (estoqueMinimo), 0)
    INTO v_estoqueMinimo      
    FROM CAPRODUTOXESTABELECIMENTO
    WHERE produto = p_gradProd_produto
    AND estabelecimento = p_estabelecimento
    AND ativo = 1;
  END IF;
  IF v_estoqueMinimo = 0
    AND p_estabelecimento > 0
  THEN
    SELECT COALESCE (MAX (estoqueMinimo), 0)
    INTO v_estoqueMinimo      
    FROM CAPRODUTOXESTABELECIMENTO
    WHERE produto = p_gradProd_produto
    AND estabelecimento = 0
    AND ativo = 1;
  END IF;
  RETURN v_estoqueMinimo;  
END;

/

create or replace FUNCTION FUNC_ADD_DATA_PRIMEIRA_COMPRA (
  p_config_209_filtrarGrupoEcon IN NUMBER,
  p_dataInicial                 IN DATE,
  p_dataFinal                   IN DATE,
  p_produto                     IN NUMBER,
  p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataPrimeiraCompra DATE;
BEGIN
  v_dataPrimeiraCompra := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MIN(TRUNC(a.dataEntradaSaida))
    INTO v_dataPrimeiraCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      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 est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto)
    SELECT MIN(TRUNC(a.dataEntradaSaida))
    INTO v_dataPrimeiraCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      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 est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  END IF;
  RETURN v_dataPrimeiraCompra;
END;

/

create or replace FUNCTION FUNC_ADD_DATA_ULTIMA_COMPRA (
  p_config_209_filtrarGrupoEcon IN NUMBER,
  p_dataInicial                 IN DATE,
  p_dataFinal                   IN DATE,
  p_produto                     IN NUMBER,
  p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataUltimaCompra   DATE;
BEGIN
  v_dataUltimaCompra := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      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 est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto
      AND gradProd.gradeProduto > 0)
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaCompra
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      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 est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  END IF;
  RETURN v_dataUltimaCompra;
END;

/

create or replace FUNCTION FUNC_ADD_DATA_ULTIMA_VENDA (
  p_config_209_filtrarGrupoEcon IN NUMBER,
  p_dataInicial                 IN DATE,
  p_dataFinal                   IN DATE,
  p_produto                     IN NUMBER,
  p_estabelecimento             IN NUMBER)
  RETURN DATE
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_dataUltimaVenda    DATE;
BEGIN
  v_dataUltimaVenda := NULL;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_produto;
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaVenda
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXITENS item
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE item.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS item
      ON item.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMXPRODUTOFILHO filhoDoc
      JOIN MOPREDOCUMXITENS item
      ON item.idItemPreDocumento = filhoDoc.idItemPreDocumento
      JOIN MOPREDOCUMENTOS cab
      ON cab.preDocumento = item.preDocumento
      WHERE filhoDoc.gradeProduto = v_gradeProduto
      AND cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      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 est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  ELSIF v_contaGradesProduto > 1 THEN
    WITH GRADESPRODUTO AS (
      SELECT gradProd.gradeProduto
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.produto = p_produto
      AND gradProd.gradeProduto > 0)
    SELECT MAX(TRUNC(a.dataEntradaSaida))
    INTO v_dataUltimaVenda
    FROM (
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MODOCUMENTOSFISCAIS cab
      JOIN MODOCFISCALXITENS item
      ON item.idDocumentoFiscal = cab.idDocumentoFiscal
      JOIN MODOCFISCALXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemDocFiscal = item.idItemDocFiscal
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      UNION ALL
      SELECT
        cab.estabelecimento,
        cab.dataEntradaSaida
      FROM MOPREDOCUMENTOS cab
      JOIN MOPREDOCUMXITENS item
      ON item.preDocumento = cab.preDocumento
      JOIN MOPREDOCUMXPRODUTOFILHO filhoDoc
      ON filhoDoc.idItemPreDocumento = item.idItemPreDocumento
      JOIN GRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE cab.entradaSaida = 'S'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.validoFaturamento = 1
      AND cab.dataEntradaSaida >=
        CASE
          WHEN p_dataInicial IS NULL
          THEN TO_DATE ('01/01/1900','DD/MM/YYYY')
          ELSE TRUNC (p_dataInicial)
        END
      AND cab.dataEntradaSaida < TRUNC(p_dataFinal) + 1) a
    WHERE p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      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 est.estabelecimento = a.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento));
  END IF;
  RETURN v_dataUltimaVenda;
END;

/

create or replace FUNCTION FUNC_ADD_COMP_PRECO_TEMP (
    p_sessaoClient                 IN VARCHAR2,
    p_tempComp_nomeTempComposicao  IN VARCHAR2,
    p_tempComp_sequencia           IN NUMBER,
    p_tempComp_sequenciaComposicao IN NUMBER,
    p_tempComp_selecionadoTela     IN NUMBER,
    p_tempComp_quantidadeTela      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_quantidadeConvertida    IN NUMBER,
    p_item_precoUnitarioBruto      IN NUMBER
  )
  RETURN NUMBER
IS
  v_acrescimoUnitarioComposicao NUMBER;
  
BEGIN
  v_acrescimoUnitarioComposicao := 0;
  SELECT
    COALESCE (SUM (
    CASE
      WHEN temp.sequenciaComposicao = p_tempComp_sequenciaComposicao
      THEN CASE WHEN p_tempComp_quantidadeTela = 0 THEN 1 ELSE p_tempComp_quantidadeTela END
      ELSE CASE WHEN temp.quantidadeTela = 0 THEN 1 ELSE temp.quantidadeTela END
    END
    * (p_item_precoUnitarioBruto * temp.percAcrescimoPrecoUnitario / 100
       + temp.valorAcrescimoPrecoUnitario * p_item_quantidadeConvertida / p_item_quantidade)),0) INTO v_acrescimoUnitarioComposicao
  FROM TEMPCOMPOSICAOPRECO temp
  WHERE temp.sessaoClient = p_sessaoClient
  AND temp.nomeTempComposicao = p_tempComp_nomeTempComposicao
  AND temp.sequencia = p_tempComp_sequencia
  AND CASE WHEN temp.sequenciaComposicao = p_tempComp_sequenciaComposicao THEN p_tempComp_selecionadoTela ELSE temp.selecionadoTela END = 1;

  RETURN ROUND (v_acrescimoUnitarioComposicao, 7);  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_RESERVAS_PROD (
    p_config_82_considLenteDispon IN NUMBER,
    p_config_83_considLenteEstoqu IN NUMBER,
    p_config_160_permiteTransfSem IN CHAR,
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_documentoDesconsiderar      IN CHAR, -- O = Orçamento, T = Transferencia
    p_idDocumentoDesconsiderar    IN NUMBER,
    p_entradaSaida                IN CHAR)
RETURN NUMBER
IS
  v_quantidadeReservas           NUMBER(15,6);
  v_quantidadeOrcamento          NUMBER(15,6);
  v_quantidadeTransferencia      NUMBER(15,6);
  v_quantidadeTransfDigitacao    NUMBER(15,6);
BEGIN
  v_quantidadeReservas           := 0;
  v_quantidadeOrcamento          := 0;
  v_quantidadeTransferencia      := 0;
  v_quantidadeTransfDigitacao    := 0;
  SELECT COALESCE((
    SELECT SUM(a.quantidadeSaldo)
    FROM (
      SELECT
        CASE
          WHEN prod.controleEstoque IN (1,5,11)
          THEN COALESCE((
            SELECT SUM(a.quantidadeSaldo)
            FROM MORESERVASESTOQUE a
            JOIN PALOCAISESTOQUE locEst
            ON locEst.localEstoque = a.localEstoque
            WHERE a.entradaSaida = '' || p_entradaSaida || ''
            AND a.gradeProduto = gradProd.gradeProduto
            AND (p_idLoteEstoque = 0
              OR a.idLoteEstoque = p_idLoteEstoque)
            AND (p_estabelecimento = 0
              OR a.estabelecimento = p_estabelecimento)
            AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
            AND a.pessoaParticipante = p_pessoaParticipante
            AND (p_localEstoque = 0
              AND locEst.validoEstoqueTotal = 1
              OR a.localEstoque = p_localEstoque)
            AND (p_personalizacao = 0
              OR a.personalizacao = p_personalizacao)
            AND (p_idEnderecoEstoque = 0
              OR a.idEnderecoEstoque = p_idEnderecoEstoque)
            AND (p_idNumeroSerie = 0
              OR a.idNumeroSerie = p_idNumeroSerie)
            AND (p_documentoDesconsiderar <> 'T'
              OR p_idDocumentoDesconsiderar > 0
              OR NOT EXISTS (
                SELECT 1
                FROM MODOCTRANSFXRESERVAESTOQ b
                WHERE b.idReservaEstoque = a.idReservaEstoque))),0)
          WHEN prod.controleEstoque IN (3,4)
          THEN TRUNC ((
            SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
            FROM (
              SELECT kit.gradeProduto,
                kit.gradeProdutoFilho,
                kit.quantidade quantidadeKit,
                ( SELECT SUM (a.quantidadeSaldo)
                  FROM MORESERVASESTOQUE a
                  JOIN PALOCAISESTOQUE locEst
                  ON locEst.localEstoque = a.localEstoque
                  WHERE a.entradaSaida = '' || p_entradaSaida || ''
                  AND a.gradeProduto = kit.gradeProdutoFilho
                  AND (p_idLoteEstoque = 0
                    OR a.idLoteEstoque = p_idLoteEstoque)
                  AND (p_estabelecimento = 0
                    OR a.estabelecimento = p_estabelecimento)
                  AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                  AND a.pessoaParticipante = p_pessoaParticipante
                  AND (p_localEstoque = 0
                    AND locEst.validoEstoqueTotal = 1
                    OR a.localEstoque = p_localEstoque)
                  AND (p_personalizacao = 0
                    OR a.personalizacao = p_personalizacao)
                  AND (p_idEnderecoEstoque = 0
                    OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                  AND (p_idNumeroSerie = 0
                    OR a.idNumeroSerie = p_idNumeroSerie)
                  AND (p_documentoDesconsiderar <> 'T'
                    OR p_idDocumentoDesconsiderar > 0
                    OR NOT EXISTS (
                      SELECT 1
                      FROM MODOCTRANSFXRESERVAESTOQ b
                      WHERE b.idReservaEstoque = a.idReservaEstoque))) quantidadeSaldo
              FROM CAGRADEPRODUTOXKITSCOMBOS kit
              WHERE kit.quantidade > 0
              AND kit.gradeProduto <> kit.gradeProdutoFilho
              GROUP BY
                kit.gradeProduto,
                kit.gradeProdutoFilho,
                kit.quantidade) a
            WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
          ELSE 0
        END quantidadeSaldo
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed
      ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE p_gradeProduto = 0
      AND gradProd.produto = p_produto
      AND (p_cor = 0
        OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
      OR p_gradeProduto <> 0
      AND gradProd.gradeProduto = p_gradeProduto) a),0)
  INTO v_quantidadeReservas
  FROM DUAL;
  IF p_documentoDesconsiderar = 'O'
    AND p_idDocumentoDesconsiderar > 0
  THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MORESERVASESTOQUE a
                JOIN MOORCAMENTOXRESERVAESTOQ b
                ON b.idReservaEstoque = a.idReservaEstoque
                JOIN PALOCAISESTOQUE locEst
                ON locEst.localEstoque = a.localEstoque
                JOIN MOORCAMENTOXITENS itemOrc
                ON itemOrc.idItemOrcamento = b.idItemOrcamento
                WHERE a.entradaSaida = '' || p_entradaSaida || ''
                AND a.gradeProduto = gradProd.gradeProduto
                AND itemOrc.orcamento = p_idDocumentoDesconsiderar
                AND (p_idLoteEstoque = 0
                  OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0
                  OR a.estabelecimento = p_estabelecimento)
                AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                AND a.pessoaParticipante = p_pessoaParticipante
                AND (p_localEstoque = 0
                  AND locEst.validoEstoqueTotal = 1
                  OR a.localEstoque = p_localEstoque)
                AND (p_personalizacao = 0
                  OR a.personalizacao = p_personalizacao)
                AND (p_idEnderecoEstoque = 0
                  OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0
                  OR a.idNumeroSerie = p_idNumeroSerie)),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MORESERVASESTOQUE a
                    JOIN MOORCAMENTOXRESERVAESTOQ b
                    ON b.idReservaEstoque = a.idReservaEstoque
                    JOIN PALOCAISESTOQUE locEst
                    ON locEst.localEstoque = a.localEstoque
                    JOIN MOORCAMENTOXITENS itemOrc
                    ON itemOrc.idItemOrcamento = b.idItemOrcamento
                    WHERE a.entradaSaida = '' || p_entradaSaida || ''
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND itemOrc.orcamento = p_idDocumentoDesconsiderar
                    AND (p_idLoteEstoque = 0
                      OR a.idLoteEstoque = p_idLoteEstoque)
                    AND (p_estabelecimento = 0
                      OR a.estabelecimento = p_estabelecimento)
                    AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND a.pessoaParticipante = p_pessoaParticipante
                    AND (p_localEstoque = 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoque = p_localEstoque)
                    AND (p_personalizacao = 0
                      OR a.personalizacao = p_personalizacao)
                    AND (p_idEnderecoEstoque = 0
                      OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                    AND (p_idNumeroSerie = 0
                      OR a.idNumeroSerie = p_idNumeroSerie)) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade) a
              WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0
          OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL
          OR p_tamanho = ' '
          OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto) a),0)
    INTO v_quantidadeOrcamento
    FROM DUAL;
  END IF;
  IF p_documentoDesconsiderar = 'T'
    AND p_idDocumentoDesconsiderar > 0
  THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN COALESCE((
              SELECT SUM(a.quantidadeSaldo)
              FROM MORESERVASESTOQUE a
              JOIN MODOCTRANSFXRESERVAESTOQ b
              ON b.idReservaEstoque = a.idReservaEstoque
              JOIN PALOCAISESTOQUE locEst
              ON locEst.localEstoque = a.localEstoque
              JOIN MODOCUMENTOTRANSFXITENS itemTransf
              ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
              WHERE a.entradaSaida = '' || p_entradaSaida || ''
              AND a.gradeProduto = gradProd.gradeProduto
              AND itemTransf.documentoTransferencia = p_idDocumentoDesconsiderar
              AND (p_idLoteEstoque = 0
                OR a.idLoteEstoque = p_idLoteEstoque)
              AND (p_estabelecimento = 0
                OR a.estabelecimento = p_estabelecimento)
              AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
              AND a.pessoaParticipante = p_pessoaParticipante
              AND (p_localEstoque = 0
                AND locEst.validoEstoqueTotal = 1
                OR a.localEstoque = p_localEstoque)
              AND (p_personalizacao = 0
                OR a.personalizacao = p_personalizacao)
              AND (p_idEnderecoEstoque = 0
                OR a.idEnderecoEstoque = p_idEnderecoEstoque)
              AND (p_idNumeroSerie = 0
                OR a.idNumeroSerie = p_idNumeroSerie)),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MORESERVASESTOQUE a
                    JOIN MODOCTRANSFXRESERVAESTOQ b
                    ON b.idReservaEstoque = a.idReservaEstoque
                    JOIN PALOCAISESTOQUE locEst
                    ON locEst.localEstoque = a.localEstoque
                    JOIN MODOCUMENTOTRANSFXITENS itemTransf
                    ON itemTransf.idItemDocTransferencia = b.idItemDocTransferencia
                    WHERE a.entradaSaida = '' || p_entradaSaida || ''
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND itemTransf.documentoTransferencia = p_idDocumentoDesconsiderar
                    AND (p_idLoteEstoque = 0
                      OR a.idLoteEstoque = p_idLoteEstoque)
                    AND (p_estabelecimento = 0
                      OR a.estabelecimento = p_estabelecimento)
                    AND a.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND a.pessoaParticipante = p_pessoaParticipante
                    AND (p_localEstoque = 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoque = p_localEstoque)
                    AND (p_personalizacao = 0
                      OR a.personalizacao = p_personalizacao)
                    AND (p_idEnderecoEstoque = 0
                      OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                    AND (p_idNumeroSerie = 0
                      OR a.idNumeroSerie = p_idNumeroSerie)
                  ) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade) a
              WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0
          OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL
          OR p_tamanho = ' '
          OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto) a),0)
    INTO v_quantidadeTransferencia
    FROM DUAL;
  END IF;
  IF p_config_160_permiteTransfSem IN ('A','B')
    AND (p_documentoDesconsiderar <> 'T'
      OR p_idDocumentoDesconsiderar > 0)
    AND p_entradaSaida = 'S'
    AND p_idEnderecoEstoque = 0
    AND p_idNumeroSerie = 0
  THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            WHEN prod.controleEstoque IN (1,5,11)
            THEN
              COALESCE((
                SELECT SUM(a.quantidadeSaldo)
                FROM MODOCUMENTOTRANSFXITENS a
                JOIN MODOCUMENTOSTRANSFERENCIA docTransf
                ON docTransf.documentoTransferencia = a.documentoTransferencia
                JOIN PAMODELOSDOCUMENTO modDoc
                ON modDoc.modeloDocumento = docTransf.modeloDocumento
                JOIN PALOCAISESTOQUE locEst
                ON locEst.localEstoque = a.localEstoqueSaida
                WHERE a.validoSaida = 1
                AND a.documentoTransferencia <> p_idDocumentoDesconsiderar
                AND a.gradeProduto = gradProd.gradeProduto
                AND docTransf.tipoDocumentoSaida > 100
                AND docTransf.situacaoDocTransferencia = 'E'
                AND modDoc.movimentaEstoque = 1
                AND (p_idLoteEstoque = 0
                  OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0
                  OR docTransf.estabelecimentoSaida = p_estabelecimento)
                AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                AND a.pessoaParticipanteSaida = p_pessoaParticipante
                AND (p_localEstoque = 0
                  AND locEst.validoEstoqueTotal = 1
                  OR a.localEstoqueSaida = p_localEstoque)
                AND (p_personalizacao = 0
                  OR a.personalizacao = p_personalizacao)
                AND (prod.controleEstoque IN (1,5)
                  OR prod.controleEstoque = 11
                  AND CASE
                        WHEN docTransf.tipoDocumentoSaida = 101
                        THEN p_config_82_considLenteDispon
                        ELSE p_config_83_considLenteEstoqu
                      END = 1)),0)
            WHEN prod.controleEstoque IN (3,4)
            THEN TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  ( SELECT SUM (a.quantidadeSaldo)
                    FROM MODOCUMENTOTRANSFXITENS a
                    JOIN MODOCUMENTOSTRANSFERENCIA docTransf
                    ON docTransf.documentoTransferencia = a.documentoTransferencia
                    JOIN PAMODELOSDOCUMENTO modDoc
                    ON modDoc.modeloDocumento = docTransf.modeloDocumento
                    JOIN PALOCAISESTOQUE locEst
                    ON locEst.localEstoque = a.localEstoqueSaida
                    WHERE a.validoSaida = 1
                    AND a.documentoTransferencia <> p_idDocumentoDesconsiderar
                    AND a.gradeProduto = kit.gradeProdutoFilho
                    AND docTransf.tipoDocumentoSaida > 100
                    AND docTransf.situacaoDocTransferencia = 'E'
                    AND modDoc.movimentaEstoque = 1
                    AND (p_idLoteEstoque = 0
                      OR a.idLoteEstoque = p_idLoteEstoque)
                    AND (p_estabelecimento = 0
                      OR docTransf.estabelecimentoSaida = p_estabelecimento)
                    AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
                    AND a.pessoaParticipanteSaida = p_pessoaParticipante
                    AND (p_localEstoque = 0
                      AND locEst.validoEstoqueTotal = 1
                      OR a.localEstoqueSaida = p_localEstoque)
                    AND (p_personalizacao = 0
                      OR a.personalizacao = p_personalizacao)) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                GROUP BY
                  kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade) a
              WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
            ELSE 0
          END quantidadeSaldo
        FROM CAGRADESPRODUTO gradProd
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE p_gradeProduto = 0
        AND gradProd.produto = p_produto
        AND (p_cor = 0
          OR gradProd.cor = p_cor)
        AND (p_tamanho IS NULL
          OR p_tamanho = ' '
          OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
        OR p_gradeProduto <> 0
        AND gradProd.gradeProduto = p_gradeProduto) a),0)
    INTO v_quantidadeTransfDigitacao
    FROM DUAL;
  END IF;
  RETURN v_quantidadeReservas - v_quantidadeOrcamento - v_quantidadeTransferencia + v_quantidadeTransfDigitacao;
END;

/

create or replace FUNCTION BUSCA_RESERVAS_ESTOQUE(
    p_config_82_considLenteDispon IN NUMBER,
    p_config_83_considLenteEstoqu IN NUMBER,
    p_config_160_permiteTransfSem IN CHAR,
    p_produto                     IN NUMBER,
    p_cor                         IN NUMBER,
    p_tamanho                     IN VARCHAR,
    p_gradeProduto                IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_orcamentoDesconsiderar      IN NUMBER,
    p_transferenciaDesconsiderar  IN NUMBER,
    p_entradaSaida                IN CHAR)
RETURN NUMBER
IS
  v_quantidadeReservas NUMBER(15,6);
BEGIN
  v_quantidadeReservas := FUNC_ADD_BUSCA_RESERVAS_PROD(
    p_config_82_considLenteDispon,
    p_config_83_considLenteEstoqu,
    p_config_160_permiteTransfSem,
    p_produto,
    p_cor,
    p_tamanho,
    p_gradeProduto,
    p_idLoteEstoque,
    p_estabelecimento,
    CASE
      WHEN p_indicadorPropriedadePosseIt IS NULL
        OR p_indicadorPropriedadePosseIt = ' '
      THEN '0'
      ELSE p_indicadorPropriedadePosseIt
    END,
    p_pessoaParticipante,
    p_localEstoque,
    0, -- p_personalizacao
    p_idEnderecoEstoque,
    p_idNumeroSerie,
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN 'O'
      WHEN p_transferenciaDesconsiderar > 0
      THEN 'T'
      ELSE ''
    END, -- p_documentoDesconsiderar
    CASE
      WHEN p_orcamentoDesconsiderar > 0
      THEN p_orcamentoDesconsiderar
      WHEN p_transferenciaDesconsiderar > 0
      THEN p_transferenciaDesconsiderar
      ELSE 0
    END, -- p_idDocumentoDesconsiderar,
    p_entradaSaida);
  RETURN v_quantidadeReservas;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_STRING_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_grade_produto                IN NUMBER,
    p_grade_cor                    IN NUMBER,
    p_grade_tamanho                IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN CHAR
IS
  v_tipoPreco                  CHAR(1);
  v_tabelaPreco                CHAR(10);
  v_precoSugestaoAPrazo        CHAR(20);
  v_precoSugestaoAVista        CHAR(20);
  v_precoDesconto              CHAR(20);
  v_precoMinimo                CHAR(20);
  v_informarPrecoManualmente   CHAR(1);
  v_precoAPrazo                CHAR(20);
  v_precoAVista                CHAR(20);
  v_promocao                   CHAR(1);
  v_precoPromocaoAPrazo        CHAR(20);
  v_precoPromocaoAVista        CHAR(20);
  v_precoIndexadoAPrazo        CHAR(20);
  v_precoIndexadoAVista        CHAR(20);
BEGIN
  ADD_BUSCA_PRECO (
    p_config_64_casasDecSaidas,
    p_config_64_casasDecSaidas,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_perfilUsuarioLogado,
    p_usuarioLogado,
    'S',
    0,
    p_cab_estabelecimento,
    TO_DATE ('01/01/1900','DD/MM/YYYY'),
    p_cab_dataPrecoFinal,
    p_cab_pessoa,
    1,
    p_tipoPreco,
    p_tabelaPreco,
    1,
    ' ',
    ' ',
    0,
    p_endPessEst_uf,
    p_endPess_uf,
    p_item_vendedor,
    p_item_idFormulaTinta,
    0,
    0,
    0,
    1,
    p_grade_produto,
    p_grade_cor,
    p_grade_tamanho,
    p_prod_controleEstoque,
    '0',
    CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
    0,
    0,
    p_tipoPreco,
    p_tabelaPreco,
    v_tipoPreco,
    v_tabelaPreco,
    v_precoSugestaoAPrazo,
    v_precoSugestaoAVista,
    v_precoDesconto,
    v_precoMinimo,
    v_informarPrecoManualmente,
    v_precoAPrazo,
    v_precoAVista,
    v_promocao,
    v_precoPromocaoAPrazo,
    v_precoPromocaoAVista,
    v_precoIndexadoAPrazo,
    v_precoIndexadoAVista
  );
  RETURN COALESCE(v_tipoPreco,' ')
    || '|' || v_tabelaPreco
    || '|' || v_precoSugestaoAPrazo
    || '|' || v_precoSugestaoAVista
    || '|' || v_precoDesconto
    || '|' || v_precoMinimo
    || '|' || v_informarPrecoManualmente
    || '|' || v_precoAVista
    || '|' || v_precoAPrazo
    || '|' || v_promocao
    || '|' || v_precoPromocaoAVista
    || '|' || v_precoPromocaoAPrazo;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_TABELA_PRECO(
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_grade_produto                IN NUMBER,
    p_grade_cor                    IN NUMBER,
    p_grade_tamanho                IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER
  )
  RETURN CHAR
IS
  v_tabelaPreco CHAR(10);
  CURSOR c_kit
  IS 
    SELECT 
      kit.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN CAGRADESPRODUTO gradProdPai
    ON gradProdPai.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_grade_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
BEGIN
  IF p_prod_controleEstoque IN (3,4) THEN
  FOR kit IN c_kit LOOP
    v_tabelaPreco := FUNC_ADD_BUSCA_TABELA_PRECO(
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_estabelecimento,
      p_cab_dataPreco,
      p_cab_pessoa,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      kit.produto,
      kit.cor,
      kit.tamanho,
      kit.controleEstoque);    
    EXIT WHEN v_tabelaPreco = ' ';
  END LOOP;
  ELSE
    SELECT COALESCE(MAX(a.tabelaPreco),' ') tabelaPreco
    INTO v_tabelaPreco
    FROM(
      SELECT a.tabelaPreco
      FROM (
        SELECT 
          a.tabelaPreco,
          ROW_NUMBER() OVER (
            ORDER BY tabela.ordenacao,
              a.tabelaPreco,
              a.ordenacao,
              a.idPrecoTabela) ordenacao
        FROM CATABELAPRECOXPRECOS a
        JOIN PATABELASPRECO tabela
        ON tabela.tabelaPreco = a.tabelaPreco
        JOIN PAFILTROSCABECALHO filtroCab
        ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
        JOIN CAPESSOAS pess
        ON pess.pessoa = p_cab_pessoa
        WHERE a.produto = p_grade_produto
        AND a.tabelaPreco <> ' '
        AND a.ativo = 1
        AND a.quantidadeMinima <= 1
        AND a.quantidadeMaxima >= 1
        AND a.dataValidadeInicial <= p_cab_dataPreco
        AND a.dataValidadeFinal >= p_cab_dataPreco
        AND (p_grade_cor = 0
          AND a.filtrarCores = 0
          OR p_grade_cor > 0
          AND (a.filtrarCores = 0
            OR EXISTS (
              SELECT 1
              FROM CATABELAPRECOXCORES tabcor
              WHERE tabcor.idPrecoTabela = a.idPrecoTabela
              AND tabcor.cor = p_grade_cor
              AND tabcor.ativo = 1)))
        AND (p_grade_tamanho = ' '
          AND a.filtrarTamanhos = 0
          OR p_grade_tamanho <> ' '
          AND (a.filtrarTamanhos = 0
            OR EXISTS (
              SELECT 1
              FROM CATABELAPRECOXTAMANHOS tabtam
              WHERE tabtam.idPrecoTabela = a.idPrecoTabela
              AND tabtam.tamanho = p_grade_tamanho
              AND tabtam.ativo = 1)))
        AND a.filtrarPersonalizacoes = 0
        AND tabela.ativo = 1 
        AND tabela.validoParaVenda = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND tabela.filtrarLocaisEstoque = 0
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario = p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1)))) a
      WHERE a.ordenacao = 1) a;
  END IF;
  RETURN v_tabelaPreco;
END;

/

DROP FUNCTION BUSCA_PRODUTOXMARGEMMARKUP;

create or replace FUNCTION FUNC_ADD_BUSCA_MARGEMMARKUP (
  p_produto     IN NUMBER,
  p_precoCusto  IN NUMBER,
  p_tabelaPreco IN VARCHAR)
  RETURN NUMBER
IS 
  v_margemMarkup NUMBER;
BEGIN
  SELECT COALESCE (MAX (a.margemMarkup),0)
  INTO v_margemMarkup
  FROM (
    SELECT
      a.margemMarkup,
      ROW_NUMBER() OVER (
        ORDER BY
          a.produto DESC,
          CASE
            WHEN d.filtrarProdutos = 1
              AND EXISTS (
                SELECT 1
                FROM PAFILTROPRODUTOXPRODUTOS x
                WHERE x.filtroProduto = a.filtroProduto
                AND x.produto = p_produto
                AND x.ativo = 1)
            THEN 1
            ELSE 0
          END DESC,
          d.filtrarListasServicos DESC,
          d.filtrarNCMs DESC,
          d.filtrarCaracteristicasE DESC,
          d.filtrarCaracteristicasD DESC,
          d.filtrarCaracteristicasC DESC,
          d.filtrarCaracteristicasB DESC,
          d.filtrarCaracteristicasA DESC,
          d.filtrarMarcas DESC,
          d.filtrarSubcategoriasProdutos DESC,
          d.filtrarCategoriasProdutos DESC,
          a.tabelaPreco DESC) ordenacao
    FROM CAPRODUTOXMARGEMMARKUP a
    JOIN CAPRODUTOS b
    ON b.produto = p_produto
    JOIN PASUBCATEGORIASPRODUTO c
    ON c.subCategoriaProduto = b.subCategoriaProduto
    JOIN PAFILTROSPRODUTO d
    ON d.filtroProduto = a.filtroProduto
    WHERE a.ativo = 1    
    AND (p_precoCusto = 0
      OR p_precoCusto BETWEEN a.precoCustoDe AND a.precoCustoAte)
    AND (a.produto = 0
      OR a.produto = p_produto)
    AND (a.tabelaPreco = ' '
      OR a.tabelaPreco = p_tabelaPreco)
    AND (a.filtroProduto = 0
      OR d.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = p_produto
        AND x.ativo = 1)
      OR ( d.filtrarCategoriasProdutos    = 1
        OR d.filtrarSubcategoriasProdutos = 1
        OR d.filtrarMarcas                = 1
        OR d.filtrarCaracteristicasA      = 1
        OR d.filtrarCaracteristicasB      = 1
        OR d.filtrarCaracteristicasC      = 1
        OR d.filtrarCaracteristicasD      = 1
        OR d.filtrarCaracteristicasE      = 1
        OR d.filtrarNCMs                  = 1
        OR d.filtrarListasServicos        = 1)      
      AND (d.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = c.categoriaProduto
          AND x.ativo = 1))
      AND (d.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1 FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (d.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (d.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (d.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))) a
  WHERE a.ordenacao = 1;
  RETURN v_margemMarkup;
END;

/

create or replace PROCEDURE ADD_EVENTO_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_evento                 IN NUMBER,
  p_pessoa                 IN NUMBER,
  p_projeto                IN VARCHAR,
  p_orcamento              IN NUMBER,
  p_preDocumento           IN NUMBER,
  p_idDocumentoFiscal      IN NUMBER,
  p_idFinanceiro           IN NUMBER,
  p_separacao              IN NUMBER,
  p_balanco                IN NUMBER,
  p_documentoTransferencia IN NUMBER,
  p_idConserto             IN NUMBER,
  p_painelCompra           IN NUMBER,
  p_sessaoCaixa            IN NUMBER,
  p_atividadeProjeto       IN NUMBER,
  p_data                   IN DATE,
  p_usuario                IN NUMBER,
  p_sistema                IN NUMBER,
  p_tipoEvento             IN NUMBER,
  p_foneSms                IN VARCHAR,
  p_deEmail                IN VARCHAR,
  p_paraEmail              IN VARCHAR,
  p_comCopiaEmail          IN VARCHAR,
  p_comCopiaOcultaEmail    IN VARCHAR,
  p_assuntoEmailSms        IN VARCHAR,
  p_corpoEmail             IN VARCHAR,
  p_tipoArquivoAnexoA      IN NUMBER,
  p_arquivoAnexoA          IN VARCHAR,
  p_tipoArquivoAnexoB      IN NUMBER,
  p_arquivoAnexoB          IN VARCHAR,
  p_tipoArquivoAnexoC      IN NUMBER,
  p_arquivoAnexoC          IN VARCHAR,
  p_tipoArquivoAnexoD      IN NUMBER,
  p_arquivoAnexoD          IN VARCHAR,
  p_tipoArquivoAnexoE      IN NUMBER,
  p_arquivoAnexoE          IN VARCHAR,
  p_tipoArquivoAnexoF      IN NUMBER,
  p_arquivoAnexoF          IN VARCHAR,
  p_tipoArquivoAnexoG      IN NUMBER,
  p_arquivoAnexoG          IN VARCHAR,
  p_tipoArquivoAnexoH      IN NUMBER,
  p_arquivoAnexoH          IN VARCHAR,
  p_tipoArquivoAnexoI      IN NUMBER,
  p_arquivoAnexoI          IN VARCHAR,
  p_tipoArquivoAnexoJ      IN NUMBER,
  p_arquivoAnexoJ          IN VARCHAR,
  /* Retornos */
  r_evento                 OUT NUMBER)
IS
BEGIN
  r_evento := p_evento;
  IF r_evento <= 0 THEN
    r_evento := FUNC_ADD_BUSCA_PROXIMO_ID('MOEVENTOS', 'evento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOEVENTOS a USING (
    SELECT
      r_evento                 evento,
      p_pessoa                 pessoa,
      p_projeto                projeto,
      p_orcamento              orcamento,
      p_preDocumento           preDocumento,
      p_idDocumentoFiscal      idDocumentoFiscal,
      p_idFinanceiro           idFinanceiro,
      p_separacao              separacao,
      p_balanco                balanco,
      p_documentoTransferencia documentoTransferencia,
      p_idConserto             idConserto,
      p_painelCompra           painelCompra,
      p_sessaoCaixa            sessaoCaixa,
      p_atividadeProjeto       atividadeProjeto,
      p_data                   data,
      p_usuario                usuario,
      p_sistema                sistema,
      p_tipoEvento             tipoEvento,
      p_foneSms                foneSms,
      p_deEmail                deEmail,
      p_paraEmail              paraEmail,
      p_comCopiaEmail          comCopiaEmail,
      p_comCopiaOcultaEmail    comCopiaOcultaEmail,
      p_assuntoEmailSms        assuntoEmailSms,
      p_corpoEmail             corpoEmail,
      p_tipoArquivoAnexoA      tipoArquivoAnexoA,
      p_arquivoAnexoA          arquivoAnexoA,
      p_tipoArquivoAnexoB      tipoArquivoAnexoB,
      p_arquivoAnexoB          arquivoAnexoB,
      p_tipoArquivoAnexoC      tipoArquivoAnexoC,
      p_arquivoAnexoC          arquivoAnexoC,
      p_tipoArquivoAnexoD      tipoArquivoAnexoD,
      p_arquivoAnexoD          arquivoAnexoD,
      p_tipoArquivoAnexoE      tipoArquivoAnexoE,
      p_arquivoAnexoE          arquivoAnexoE,
      p_tipoArquivoAnexoF      tipoArquivoAnexoF,
      p_arquivoAnexoF          arquivoAnexoF,
      p_tipoArquivoAnexoG      tipoArquivoAnexoG,
      p_arquivoAnexoG          arquivoAnexoG,
      p_tipoArquivoAnexoH      tipoArquivoAnexoH,
      p_arquivoAnexoH          arquivoAnexoH,
      p_tipoArquivoAnexoI      tipoArquivoAnexoI,
      p_arquivoAnexoI          arquivoAnexoI,
      p_tipoArquivoAnexoJ      tipoArquivoAnexoJ,
      p_arquivoAnexoJ          arquivoAnexoJ
    FROM DUAL) b ON (a.evento = b.evento)
  WHEN MATCHED THEN UPDATE SET
    a.pessoa                 = b.pessoa,
    a.projeto                = b.projeto,
    a.orcamento              = b.orcamento,
    a.preDocumento           = b.preDocumento,
    a.idDocumentoFiscal      = b.idDocumentoFiscal,
    a.idFinanceiro           = b.idFinanceiro,
    a.separacao              = b.separacao,
    a.balanco                = b.balanco,
    a.documentoTransferencia = b.documentoTransferencia,
    a.idConserto             = b.idConserto,
    a.painelCompra           = b.painelCompra,
    a.sessaoCaixa            = b.sessaoCaixa,
    a.atividadeProjeto       = b.atividadeProjeto,
    a.data                   = b.data,
    a.usuario                = b.usuario,
    a.sistema                = b.sistema,
    a.tipoEvento             = b.tipoEvento,
    a.foneSms                = b.foneSms,
    a.deEmail                = b.deEmail,
    a.paraEmail              = b.paraEmail,
    a.comCopiaEmail          = b.comCopiaEmail,
    a.comCopiaOcultaEmail    = b.comCopiaOcultaEmail,
    a.assuntoEmailSms        = b.assuntoEmailSms,
    a.corpoEmail             = b.corpoEmail,
    a.tipoArquivoAnexoA      = b.tipoArquivoAnexoA,
    a.arquivoAnexoA          = b.arquivoAnexoA,
    a.tipoArquivoAnexoB      = b.tipoArquivoAnexoB,
    a.arquivoAnexoB          = b.arquivoAnexoB,
    a.tipoArquivoAnexoC      = b.tipoArquivoAnexoC,
    a.arquivoAnexoC          = b.arquivoAnexoC,
    a.tipoArquivoAnexoD      = b.tipoArquivoAnexoD,
    a.arquivoAnexoD          = b.arquivoAnexoD,
    a.tipoArquivoAnexoE      = b.tipoArquivoAnexoE,
    a.arquivoAnexoE          = b.arquivoAnexoE,
    a.tipoArquivoAnexoF      = b.tipoArquivoAnexoF,
    a.arquivoAnexoF          = b.arquivoAnexoF,
    a.tipoArquivoAnexoG      = b.tipoArquivoAnexoG,
    a.arquivoAnexoG          = b.arquivoAnexoG,
    a.tipoArquivoAnexoH      = b.tipoArquivoAnexoH,
    a.arquivoAnexoH          = b.arquivoAnexoH,
    a.tipoArquivoAnexoI      = b.tipoArquivoAnexoI,
    a.arquivoAnexoI          = b.arquivoAnexoI,
    a.tipoArquivoAnexoJ      = b.tipoArquivoAnexoJ,
    a.arquivoAnexoJ          = b.arquivoAnexoJ
  WHEN NOT MATCHED THEN INSERT (
    evento,
    pessoa,
    projeto,
    orcamento,
    preDocumento,
    idDocumentoFiscal,
    idFinanceiro,
    separacao,
    balanco,
    documentoTransferencia,
    idConserto,
    painelCompra,
    sessaoCaixa,
    atividadeProjeto,
    data,
    usuario,
    sistema,
    tipoEvento,
    foneSms,
    deEmail,
    paraEmail,
    comCopiaEmail,
    comCopiaOcultaEmail,
    assuntoEmailSms,
    corpoEmail,
    tipoArquivoAnexoA,
    arquivoAnexoA,
    tipoArquivoAnexoB,
    arquivoAnexoB,
    tipoArquivoAnexoC,
    arquivoAnexoC,
    tipoArquivoAnexoD,
    arquivoAnexoD,
    tipoArquivoAnexoE,
    arquivoAnexoE,
    tipoArquivoAnexoF,
    arquivoAnexoF,
    tipoArquivoAnexoG,
    arquivoAnexoG,
    tipoArquivoAnexoH,
    arquivoAnexoH,
    tipoArquivoAnexoI,
    arquivoAnexoI,
    tipoArquivoAnexoJ,
    arquivoAnexoJ)
  VALUES (
    b.evento,
    b.pessoa,
    b.projeto,
    b.orcamento,
    b.preDocumento,
    b.idDocumentoFiscal,
    b.idFinanceiro,
    b.separacao,
    b.balanco,
    b.documentoTransferencia,
    b.idConserto,
    b.painelCompra,
    b.sessaoCaixa,
    b.atividadeProjeto,
    b.data,
    b.usuario,
    b.sistema,
    b.tipoEvento,
    b.foneSms,
    b.deEmail,
    b.paraEmail,
    b.comCopiaEmail,
    b.comCopiaOcultaEmail,
    b.assuntoEmailSms,
    b.corpoEmail,
    b.tipoArquivoAnexoA,
    b.arquivoAnexoA,
    b.tipoArquivoAnexoB,
    b.arquivoAnexoB,
    b.tipoArquivoAnexoC,
    b.arquivoAnexoC,
    b.tipoArquivoAnexoD,
    b.arquivoAnexoD,
    b.tipoArquivoAnexoE,
    b.arquivoAnexoE,
    b.tipoArquivoAnexoF,
    b.arquivoAnexoF,
    b.tipoArquivoAnexoG,
    b.arquivoAnexoG,
    b.tipoArquivoAnexoH,
    b.arquivoAnexoH,
    b.tipoArquivoAnexoI,
    b.arquivoAnexoI,
    b.tipoArquivoAnexoJ,
    b.arquivoAnexoJ);
END ADD_EVENTO_GRAVA;

/

create or replace PROCEDURE ADD_FINANC_BAIXA_EXCLUI (
  p_idBaixaFinanceiro IN NUMBER)
IS
  v_idsFinanceirosDesconsiderar CLOB;
  v_idsBaixasDesconsiderar      CLOB;
  v_auxNumber                   NUMBER;
BEGIN
  v_idsFinanceirosDesconsiderar := ' ';
  v_idsBaixasDesconsiderar := ' '; 
  FOR a IN (
    SELECT a.idNovoFinanceiro idFinanceiro
    FROM MOBAIXAXNOVOFINANCEIRO a
    WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
    AND a.baixaAutomatica = 1)
  LOOP
    IF v_idsFinanceirosDesconsiderar IS NULL
      OR v_idsFinanceirosDesconsiderar = ' '
      OR INSTR(',' || v_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
    THEN
      ADD_FINANC_EXCLUI_LOOP (
        a.idFinanceiro,
        v_idsFinanceirosDesconsiderar,
        v_idsBaixasDesconsiderar,
        v_idsFinanceirosDesconsiderar,
        v_idsBaixasDesconsiderar);
    END IF;
  END LOOP;
  FOR a IN (
    SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE b.idBaixaFinanceiroCorrel = p_idBaixaFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
      WHERE b.idBaixaFinanceiro = p_idBaixaFinanceiro)
  LOOP
    -- Somente se não processou a baixa ainda
    IF v_idsBaixasDesconsiderar IS NULL
      OR v_idsBaixasDesconsiderar = ' '
      OR INSTR(',' || v_idsBaixasDesconsiderar || ',', ',' || LPAD(a.idBaixaFinanceiro,14,'0') || ',') = 0
    THEN
      IF v_idsBaixasDesconsiderar IS NULL
        OR v_idsBaixasDesconsiderar = ' '
      THEN
        v_idsBaixasDesconsiderar := LPAD(a.idBaixaFinanceiro,14,'0');
      ELSE
        v_idsBaixasDesconsiderar := v_idsBaixasDesconsiderar || ',' || LPAD(a.idBaixaFinanceiro,14,'0');
      END IF;
      -- Se não excluiu Financeiro, volta Saldo
      IF v_idsFinanceirosDesconsiderar IS NULL
        OR v_idsFinanceirosDesconsiderar = ' '
        OR INSTR(',' || v_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
      THEN
        ADD_FINANC_SALDO_AJUSTA (
          0, -- p_config_349_prazoValidadePont
          1, -- p_excluindo
          a.idBaixaFinanceiro,
          a.idFinanceiro,
          a.data,
          a.cotacao,
          a.valorBrutoIndexado,
          a.valorBruto,
          a.valorTarifaCartao,
          v_auxNumber, -- r_financ_saldo
          v_auxNumber, -- r_financ_saldoIndexado
          v_auxNumber); -- r_financ_efetivado
      END IF;
      ADD_FINANC_BAIXA_EXCLUI_CORREL (a.idBaixaFinanceiro);
    END IF;
  END LOOP;
END ADD_FINANC_BAIXA_EXCLUI;

/

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

/

create or replace PROCEDURE ADD_FINANC_EXCLUI_LOOP (
  p_idFinanceiro                 IN NUMBER,
  p_idsFinanceirosDesconsiderar  IN CLOB,
  p_idsBaixasDesconsiderar       IN CLOB,
  r_idsFinanceirosDesconsiderar  OUT CLOB,
  r_idsBaixasDesconsiderar       OUT CLOB)
IS
  v_auxNumber NUMBER;
BEGIN
  r_idsFinanceirosDesconsiderar := p_idsFinanceirosDesconsiderar;
  r_idsBaixasDesconsiderar := p_idsBaixasDesconsiderar;  
  -- Somente se não processou o financeiro ainda
  IF r_idsFinanceirosDesconsiderar IS NULL
    OR r_idsFinanceirosDesconsiderar = ' '
    OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(p_idFinanceiro,14,'0') || ',') = 0
  THEN
    IF r_idsFinanceirosDesconsiderar IS NULL
      OR r_idsFinanceirosDesconsiderar = ' '
    THEN
      r_idsFinanceirosDesconsiderar := LPAD(p_idFinanceiro,14,'0');
    ELSE
      r_idsFinanceirosDesconsiderar := r_idsFinanceirosDesconsiderar || ',' || LPAD(p_idFinanceiro,14,'0');
    END IF;
    FOR a IN (
      SELECT idFinanceiroCorrelato idFinanceiro
      FROM MOFINANCEIROXCORRELATO
      WHERE idFinanceiroCorrelato > 0
      AND idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT idFinanceiro
      FROM MOFINANCEIROXCORRELATO
      WHERE idFinanceiro > 0
      AND idFinanceiroCorrelato = p_idFinanceiro
      UNION ALL
      SELECT a.idNovoFinanceiro idFinanceiro
      FROM MOBAIXAXNOVOFINANCEIRO a
      JOIN MOFINANCEIROXBAIXAS b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE a.idNovoFinanceiro > 0
      AND b.idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.idFinanceiro
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXNOVOFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE a.idFinanceiro > 0
      AND b.idNovoFinanceiro = p_idFinanceiro
      AND a.baixaAutomatica = 1
      UNION ALL
      SELECT a.idFinanceiro
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiroCorrel
      WHERE a.idFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro
      AND a.baixaAutomatica = 1
      UNION ALL
      SELECT a.idFinanceiro
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiro
      WHERE a.idFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro
      AND a.baixaAutomatica = 1)
    LOOP
      IF r_idsFinanceirosDesconsiderar IS NULL
        OR r_idsFinanceirosDesconsiderar = ' '
        OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
      THEN
        ADD_FINANC_EXCLUI_LOOP (
          a.idFinanceiro,
          r_idsFinanceirosDesconsiderar,
          r_idsBaixasDesconsiderar,
          r_idsFinanceirosDesconsiderar,
          r_idsBaixasDesconsiderar);
      END IF;
    END LOOP;
    FOR a IN (
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      WHERE a.idBaixaFinanceiro > 0
      AND a.idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXNOVOFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      WHERE a.idBaixaFinanceiro > 0
      AND b.idNovoFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiroCorrel
      WHERE a.idBaixaFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro
      UNION ALL
      SELECT a.*
      FROM MOFINANCEIROXBAIXAS a
      JOIN MOBAIXAXBAIXAFINANCEIRO b
      ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
      JOIN MOFINANCEIROXBAIXAS c
      ON c.idBaixaFinanceiro = b.idBaixaFinanceiro
      WHERE a.idBaixaFinanceiro > 0
      AND c.idFinanceiro = p_idFinanceiro)
    LOOP
      -- Somente se não processou a baixa ainda
      IF r_idsBaixasDesconsiderar IS NULL
        OR r_idsBaixasDesconsiderar = ' '
        OR INSTR(',' || r_idsBaixasDesconsiderar || ',', ',' || LPAD(a.idBaixaFinanceiro,14,'0') || ',') = 0
      THEN
        IF r_idsBaixasDesconsiderar IS NULL
          OR r_idsBaixasDesconsiderar = ' '
        THEN
          r_idsBaixasDesconsiderar := LPAD(a.idBaixaFinanceiro,14,'0');
        ELSE
          r_idsBaixasDesconsiderar := r_idsBaixasDesconsiderar || ',' || LPAD(a.idBaixaFinanceiro,14,'0');
        END IF;
        -- Se não excluiu Financeiro, volta Saldo
        IF r_idsFinanceirosDesconsiderar IS NULL
          OR r_idsFinanceirosDesconsiderar = ' '
          OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0
        THEN
          ADD_FINANC_SALDO_AJUSTA (
            0, -- p_config_349_prazoValidadePont
            1, -- p_excluindo
            a.idBaixaFinanceiro,
            a.idFinanceiro,
            a.data,
            a.cotacao,
            a.valorBrutoIndexado,
            a.valorBruto,
            a.valorTarifaCartao,
            v_auxNumber, -- r_financ_saldo
            v_auxNumber, -- r_financ_saldoIndexado
            v_auxNumber); -- r_financ_efetivado
        END IF;
        ADD_FINANC_BAIXA_EXCLUI_CORREL (a.idBaixaFinanceiro);
      END IF;
    END LOOP;
    ADD_FINANC_EXCLUI_CORREL (p_idFinanceiro);
  END IF;
END ADD_FINANC_EXCLUI_LOOP;

/

create or replace PROCEDURE ADD_FINANC_EXCLUI (
  p_idFinanceiro IN NUMBER)
IS
  v_auxCLOB CLOB;
BEGIN
  v_auxCLOB := NULL;
  ADD_FINANC_EXCLUI_LOOP (
    p_idFinanceiro,
    v_auxCLOB,
    v_auxCLOB,
    v_auxCLOB,
    v_auxCLOB);
END ADD_FINANC_EXCLUI;

/

create or replace PROCEDURE ADD_BUSCA_IBPT (
  p_cab_dataEmissao              IN DATE,
  p_munEst_uf                    IN CHAR,
  p_prod_origemMercadoria        IN CHAR,
  p_prod_idNcm                   IN NUMBER,
  p_prod_listaServicos           IN NUMBER,
  /* Retornos */
  r_encontrouRegistro            OUT NUMBER,
  r_idIbpt                       OUT NUMBER,
  r_item_aliquotaEstImpFederais  OUT NUMBER,
  r_item_aliquotaEstImpEstaduais OUT NUMBER,
  r_item_aliquotaEstImpMunicipai OUT NUMBER,
  r_item_chaveAliquotasEst       OUT VARCHAR2,
  r_item_versaoAliquotasEst      OUT VARCHAR2,
  r_item_fonteAliquotasEst       OUT VARCHAR2)
IS
BEGIN
  SELECT
    COALESCE (MAX (1), 0),
    COALESCE (MAX (a.idIbpt), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0),
    COALESCE (MAX (a.chaveAliquotasEstimadas), ' '),
    COALESCE (MAX (a.versaoAliquotasEstimadas), ' '),
    COALESCE (MAX (a.fonteAliquotasEstimadas), ' ')
  INTO 
    r_encontrouRegistro,
    r_idIbpt,
    r_item_aliquotaEstImpFederais,
    r_item_aliquotaEstImpEstaduais,
    r_item_aliquotaEstImpMunicipai,
    r_item_chaveAliquotasEst,
    r_item_versaoAliquotasEst,
    r_item_fonteAliquotasEst
  FROM (
    SELECT
      idIbpt,
      CASE
        WHEN p_prod_origemMercadoria IN ('1','2') 
        THEN aliquotaEstimadaImpFederaisImp 
        ELSE aliquotaEstimadaImpFederaisNac 
      END aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      chaveAliquotasEstimadas,
      versaoAliquotasEstimadas,
      fonteAliquotasEstimadas,
      ROW_NUMBER() OVER (ORDER BY vigenciaInicial, vigenciaFinal) rowNumber
    FROM SIIBPTS
    WHERE ativo          = 1
    AND idIbpt           > 0
    AND idNcm            = p_prod_idNcm
    AND listaServicos    = p_prod_listaServicos
    AND ufOrigem         = p_munEst_uf
    AND vigenciaInicial <= p_cab_dataEmissao
    AND vigenciaFinal   >= p_cab_dataEmissao) a
  WHERE a.rowNumber = 1;
END ADD_BUSCA_IBPT;

/

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

/

create or replace PROCEDURE ADD_CONSERTO_EXCLUI (
  p_idConserto IN NUMBER)
IS
BEGIN
  DELETE MOEVENTOS
  WHERE idConserto = p_idConserto;
  DELETE MOCONSERTOS
  WHERE idConserto = p_idConserto;
END ADD_CONSERTO_EXCLUI;

/

create or replace PROCEDURE ADD_CONSERTO_CANCELA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_idConserto                   IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      cliente,
      documentoTransferenciaLojaCd,
      documentoTransferenciaFornec,
      documentoTransferenciaCdLoja
    FROM MOCONSERTOS
    WHERE idConserto = p_idConserto
    AND situacaoConserto <> 'C')
  LOOP
    IF a.documentoTransferenciaLojaCd <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_estabelecimentoAtivo,
        a.documentoTransferenciaLojaCd,
        'C',
        'Cancelamento Automático.');
    END IF;
    IF a.documentoTransferenciaFornec <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_estabelecimentoAtivo,
        a.documentoTransferenciaFornec,
        'C',
        'Cancelamento Automático.');
    END IF;
    IF a.documentoTransferenciaCdLoja <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_estabelecimentoAtivo,
        a.documentoTransferenciaCdLoja,
        'C',
        'Cancelamento Automático.');
    END IF;
    ADD_EVENTO_GRAVA (
      p_estabelecimentoAtivo,
      0,
      a.cliente,
      ' ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      p_idConserto,
      0,
      0,
      0,
      SYSDATE,
      p_usuarioLogado,
      1,
      p_person_184_tipoEventoCancCon,
      ' ',
      ' ',
      ' ',
      ' ',
      ' ',
      'Cancelamento Automático.',
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      0,
      ' ',
      /* Retornos */
      v_auxNumber);
    UPDATE MOCONSERTOS
    SET situacaoConserto = 'C'
    WHERE idConserto = p_idConserto;
  END LOOP;
END ADD_CONSERTO_CANCELA;

/

create or replace PROCEDURE ADD_DOCTROCA_CAB_EXCLUI (
  p_documentoTroca IN NUMBER)
IS
  v_idFinanceiroAdiantamento NUMBER;
BEGIN
  SELECT idFinanceiroAdiantamento
  INTO v_idFinanceiroAdiantamento
  FROM MODOCUMENTOSTROCA
  WHERE documentoTroca = p_documentoTroca;
  FOR a IN (
    SELECT idItemDocTroca
    FROM MODOCTROCAXITENS
    WHERE documentoTroca = p_documentoTroca)
  LOOP
    ADD_DOCTROCA_ITEM_EXCLUI (a.idItemDocTroca);
  END LOOP;
  DELETE MODOCUMENTOSTROCA
  WHERE documentoTroca = p_documentoTroca;
  IF v_idFinanceiroAdiantamento > 0 THEN
    ADD_FINANC_EXCLUI (v_idFinanceiroAdiantamento);
  END IF;
END ADD_DOCTROCA_CAB_EXCLUI;

/

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_EXCLUI (
  p_idItemDocTransferencia       IN NUMBER,
  p_cancela_Exclui_Reabre        IN CHAR,
  p_cab_situacaoDocTransferencia IN CHAR,
  p_cab_quantidadeConvertida     IN NUMBER,
  p_cab_valorProdutoServico      IN NUMBER,
  /* Retornos */
  r_cab_quantidadeConvertida     OUT NUMBER,
  r_cab_valorProdutoServico      OUT NUMBER)
IS
  v_auxAlpha VARCHAR (32000);
BEGIN
  r_cab_quantidadeConvertida := p_cab_quantidadeConvertida;
  r_cab_valorProdutoServico := p_cab_valorProdutoServico;
  IF p_cancela_Exclui_Reabre = 'R' THEN
    UPDATE MODOCUMENTOTRANSFXITENS
    SET quantidadeSaldo = quantidade
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND cancelado = 0;
  ELSE
    FOR a IN (
      SELECT
        quantidadeConvertida,
        valorProdutoServico
      FROM MODOCUMENTOTRANSFXITENS
      WHERE idItemDocTransferencia = p_idItemDocTransferencia
      AND cancelado = 0)
    LOOP
      r_cab_quantidadeConvertida := r_cab_quantidadeConvertida - a.quantidadeConvertida;
      r_cab_valorProdutoServico := r_cab_valorProdutoServico - a.valorProdutoServico;
    END LOOP;
  END IF;  
  IF p_cancela_Exclui_Reabre = 'E' THEN
    FOR a IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocTransferencia = p_idItemDocTransferencia)
    LOOP
      ADD_CONSERTO_EXCLUI (a.idConserto);
    END LOOP;
    ADD_ESTOQUE_TRANSF_EXCLUI (
      p_idItemDocTransferencia,
      '',
      v_auxAlpha);
    ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
      p_idItemDocTransferencia,
      '',
      v_auxAlpha);
    DELETE MODOCTRANSFXNUMEROSSERIE
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCTRANSFXORCAMENTOITEM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MOPREDOCUMXCONFERENCIAS
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCFISCALXCONFERENCIAS
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    DELETE MODOCUMENTOTRANSFXITENS
    WHERE idItemDocTransferencia = p_idItemDocTransferencia;
  ELSE
    ADD_ESTOQUE_TRANSF_EXCLUI (
      p_idItemDocTransferencia,
      '',
      v_auxAlpha);
    IF p_cancela_Exclui_Reabre = 'C'
      OR p_cab_situacaoDocTransferencia <> 'E'
    THEN
      ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
        p_idItemDocTransferencia,
        '',
        v_auxAlpha);
    END IF;
    DELETE MODOCTRANSFXORCAMENTOITEM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND entradaSaidaOriginal <> 'O';
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND entradaSaidaOriginal <> 'O';
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND entradaSaidaOriginal <> 'O';
    IF p_cancela_Exclui_Reabre = 'C' THEN
      UPDATE MODOCUMENTOTRANSFXITENS SET
        cancelado = 1,
        quantidadeSaldo = 0
      WHERE idItemDocTransferencia = p_idItemDocTransferencia;
    END IF;
  END IF;
END ADD_DOCTRANSF_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_EXCLUI (
  p_documentoTransferencia IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  DELETE MODOCTRANSFXBLOQUEIOSEST
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MOORCAMENTOXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MOPREDOCUMXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MODOCFISCALXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  DELETE MODOCTRANSFXCONFERENCIAS
  WHERE documentoTransferencia = p_documentoTransferencia;
  FOR a IN (
    SELECT idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS
    WHERE documentoTransferencia = p_documentoTransferencia)
  LOOP
    ADD_DOCTRANSF_ITEM_EXCLUI (
      a.idItemDocTransferencia,
      'E',
      ' ',
      0,
      0,
      v_auxNumber,
      v_auxNumber);
  END LOOP;
  DELETE MOEVENTOS
  WHERE documentoTransferencia = p_documentoTransferencia;
  UPDATE MOCONSERTOS
  SET documentoTransferenciaLojaCd = 0
  WHERE documentoTransferenciaLojaCd = p_documentoTransferencia;
  UPDATE MOCONSERTOS
  SET documentoTransferenciaFornec = 0
  WHERE documentoTransferenciaFornec = p_documentoTransferencia;
  UPDATE MOCONSERTOS
  SET documentoTransferenciaCdLoja = 0
  WHERE documentoTransferenciaCdLoja = p_documentoTransferencia;
  DELETE MODOCUMENTOSTRANSFERENCIA
  WHERE documentoTransferencia = p_documentoTransferencia;
END ADD_DOCTRANSF_CAB_EXCLUI;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_SIT_GRAVA (
  p_estabelecimentoAtivo     IN NUMBER,
  p_documentoTransferencia   IN NUMBER,
  p_situacaoDocTransferencia IN CHAR,
  p_motivoCancelamento       IN VARCHAR)
IS
  v_situacaoDocTransferencia CHAR (1);
  v_observacoes              VARCHAR (4000);
  v_auxNumber                NUMBER;
BEGIN
  SELECT
    situacaoDocTransferencia,
    observacoes
  INTO
    v_situacaoDocTransferencia,
    v_observacoes
  FROM  MODOCUMENTOSTRANSFERENCIA
  WHERE documentoTransferencia = p_documentoTransferencia;
  IF v_observacoes <> ' '
    AND p_motivoCancelamento <> ' '
  THEN
    v_observacoes := RTRIM(SUBSTR(RTRIM(v_observacoes) || ' - ' || p_motivoCancelamento, 1, 4000));
  ELSIF p_motivoCancelamento <> ' ' THEN
    v_observacoes := p_motivoCancelamento;
  END IF;
  IF v_situacaoDocTransferencia = 'F'
    AND NOT (p_situacaoDocTransferencia IN ('C','F'))
  THEN
    FOR a IN (
      SELECT idItemDocTransferencia
      FROM MODOCUMENTOTRANSFXITENS
      WHERE documentoTransferencia = p_documentoTransferencia
      AND cancelado = 0)
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        a.idItemDocTransferencia,
        'R',
        p_situacaoDocTransferencia,
        0,
        0,
        v_auxNumber,
        v_auxNumber);
    END LOOP;
  END IF;
  IF p_situacaoDocTransferencia = 'C' THEN
    FOR a IN (
      SELECT est.idEstoque
      FROM MODOCTRANSFXESTOQUE est
      JOIN MODOCUMENTOTRANSFXITENS item
      ON item.idItemDocTransferencia = est.idItemDocTransferencia
      where item.documentoTransferencia = p_documentoTransferencia
      AND est.idEstoque > 0)
    LOOP
      ADD_ESTOQUE_EXCLUI (a.idEstoque);
    END LOOP;
  END IF;
  UPDATE MODOCUMENTOSTRANSFERENCIA SET
    situacaoDocTransferencia = p_situacaoDocTransferencia,
    observacoes = v_observacoes
  WHERE documentoTransferencia = p_documentoTransferencia;
  ADD_DOCTRANSF_CAB_RESERVA_GRAV(
    p_documentoTransferencia,
    p_estabelecimentoAtivo);
END ADD_DOCTRANSF_CAB_SIT_GRAVA;

/

create or replace PROCEDURE ADD_CONSULTA_DADOS_CPF_GRAVA (
    p_sessaoClient         IN VARCHAR2,
    p_contadorSessaoTemp   IN NUMBER,
    p_cnpjCpfIdEstrangeiro IN VARCHAR2,
    p_estabelecimento      IN NUMBER,
    p_usuario              IN NUMBER,
    /* Retornos */
    r_idConsultaDadoCpf    OUT NUMBER)
IS
BEGIN
  r_idConsultaDadoCpf := FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTASDADOSCPF', 'idConsultaDadoCpf', 0, p_estabelecimento, NULL);
  INSERT INTO MOCONSULTASDADOSCPF (
    idConsultaDadoCpf,
    cnpjCpfIdEstrangeiro,
    estabelecimento,
    usuario,
    data,
    protocolo,
    nomeRazaoSocial,
    sexo,
    nascimento,
    obitoProvavel,
    rg,
    ufRg,
    situacaoCadastral,
    dataSituacaoCadastral,
    mae,
    maeCpf,
    maeNascimento,
    observacoes)
  SELECT
    r_idConsultaDadoCpf,
    p_cnpjCpfIdEstrangeiro,
    p_estabelecimento,
    p_usuario,
    SYSDATE data,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.cabecalho.protocolo, ' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') protocolo,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.nome, ' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') nomeRazaoSocial,
    COALESCE (REPLACE (CAST (COALESCE (temp.conteudo.resposta.dadosCadastrais.sexo, ' ') AS CHAR(1)),'''',''''''),' ') sexo,
    TRUNC (TO_DATE (temp.conteudo.resposta.dadosCadastrais.dataNascimento, 'DD/MM/YYYY')) nascimento,
    COALESCE (CAST (CASE WHEN UPPER (TRIM(temp.conteudo.resposta.dadosCadastrais.obitoProvavel)) = 'TRUE' THEN 1 ELSE 0 END AS NUMBER(1)),0) obitoProvavel,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.rg,' '),1,20) AS VARCHAR2(20)),'''',''''''),' ') rg,
    COALESCE (REPLACE (CAST (COALESCE (temp.conteudo.resposta.dadosCadastrais.ufRg,' ') AS CHAR(2)),'''',''''''),'  ') ufRg,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.situacaoCadastral,' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') situacaoCadastral,
    TRUNC (TO_DATE (temp.conteudo.resposta.dadosCadastrais.dataSituacaoCadastral,'DD/MM/YYYY')) dataSituacaoCadastral,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (temp.conteudo.resposta.dadosCadastrais.maeNome,' '),1,60) AS VARCHAR2(60)),'''',''''''),' ') mae,
    COALESCE (REPLACE (CAST (SUBSTR (COALESCE (REPLACE (TRANSLATE (temp.conteudo.resposta.dadosCadastrais.maeCpf,'.-/','   '),' ',''),' '),1,20) AS VARCHAR2(20)),'''',''''''),' ') maeCpf,
    TRUNC (TO_DATE (temp.conteudo.resposta.dadosCadastrais.maeDataNascimento,'DD/MM/YYYY')) maeNascimento,
    ' ' observacoes
  FROM TEMPJSON temp
  WHERE temp.sessaoClient = p_sessaoClient
  AND temp.contadorSessao = p_contadorSessaoTemp;
  INSERT INTO MOCONSULTADADOSCPFFONES (
    id,
    idConsultaDadoCpf,
    ordenacao,
    indicadorFone,
    numero,
    relacao,
    whatsApp,
    naoPerturbe,
    hotphone,
    plus,
    ultimoContato,
    avaliacao,
    justificativa,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFFONES', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROW_NUMBER() OVER (ORDER BY a.ordenacao) ordenacao,
    COALESCE (a.indicadorFone,0),
    COALESCE (CASE WHEN a.numero IN ('[',']') THEN ' ' ELSE SUBSTR (a.numero,1,60) END,' '),
    COALESCE (CASE WHEN a.relacao IN ('[',']') THEN ' ' ELSE SUBSTR (a.relacao,1,60) END,' '),
    COALESCE (a.whatsApp,0),
    COALESCE (a.naoPerturbe,0),
    COALESCE (a.hotphone,0),
    COALESCE (a.plus,0),
    COALESCE (CASE WHEN a.ultimoContato IN ('[',']') THEN ' ' ELSE SUBSTR (a.ultimoContato,1,4000) END,' '),
    COALESCE (CASE WHEN a.avaliacao IN ('[',']') THEN ' ' ELSE SUBSTR (a.avaliacao,1,60) END,' '),
    COALESCE (CASE WHEN a.justificativa IN ('[',']') THEN ' ' ELSE SUBSTR (a.justificativa,1,4000) END,' '),
    ' ' observacoes
  FROM (
    SELECT
      MIN(a.ordenacao) ordenacao,
      MAX(a.indicadorFone) indicadorFone,
      a.numero,
      MAX(a.relacao) relacao,
      MAX(a.whatsApp) whatsApp,
      MAX(a.naoPerturbe) naoPerturbe,
      MAX(a.hotphone) hotphone,
      MAX(a.plus) plus,
      MAX(a.ultimoContato) ultimoContato,
      MAX(a.avaliacao) avaliacao,
      MAX(a.justificativa) justificativa
    FROM (
      SELECT
        ROWNUM ordenacao,
        a.indicadorFone,
        REPLACE (TRANSLATE (a.numero,'[]()-"',' '),' ','') numero,
        REPLACE (a.relacao,'''','''''') relacao,
        a.whatsApp,
        a.naoPerturbe,
        a.hotphone,
        a.plus,
        REPLACE (a.ultimoContato,'''','''''') ultimoContato,
        REPLACE (a.avaliacao,'''','''''') avaliacao,
        REPLACE (a.justificativa,'''','''''') justificativa
      FROM (
        SELECT
          2 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.relacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.naoPerturbe,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END naoPerturbe,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.ultimoContato,'[^","]+', 1, LEVEL),'[',''),']','')),' ') ultimoContato,
          0 hotphone,
          0 plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefones.fixos.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.fixos.relacao, 'null'), 'null', '" "'), '""', '" "') relacao,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.fixos.aplicativos.whatsAppBusiness,',','","'),'[','["'),']','"]') whatsApp,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.fixos.naoPerturbe,',','","'),'[','["'),']','"]') naoPerturbe,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.fixos.ultimoContato, 'null'), 'null', '" "'), '""', '" "') ultimoContato
          FROM TEMPJSON temp
          WHERE temp.sessaoClient = p_sessaoClient
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          1 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.relacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.naoPerturbe,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END naoPerturbe,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.ultimoContato,'[^","]+', 1, LEVEL),'[',''),']','')),' ') ultimoContato,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.hotphone,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END hotphone,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.plus,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefones.moveis.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.moveis.relacao, 'null'), 'null', '" "'), '""', '" "') relacao,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.aplicativos.whatsApp,',','","'),'[','["'),']','"]') whatsApp,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.naoPerturbe,',','","'),'[','["'),']','"]') naoPerturbe,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.telefones.moveis.ultimoContato, 'null'), 'null', '" "'), '""', '" "') ultimoContato,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.hotphone,',','","'),'[','["'),']','"]') hotphone,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.plus,',','","'),'[','["'),']','"]') plus
          FROM TEMPJSON temp
          WHERE temp.sessaoClient = p_sessaoClient
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          2 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefonesAdicionados.fixos.numero numero,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.fixos.aplicativos.whatsAppBusiness,',','","'),'[','["'),']','"]') whatsApp
          FROM TEMPJSON temp
          WHERE temp.sessaoClient = p_sessaoClient
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          1 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          CASE WHEN COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.whatsApp,'[^","]+', 1, LEVEL),'[',''),']','')),'false') = 'true' THEN 1 ELSE 0 END whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          ' ' avaliacao,
          ' ' justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.telefonesAdicionados.moveis.numero numero,
            REPLACE (REPLACE (REPLACE (temp.conteudo.resposta.telefones.moveis.aplicativos.whatsApp,',','","'),'[','["'),']','"]') whatsApp
          FROM TEMPJSON temp
          WHERE temp.sessaoClient = p_sessaoClient
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          2 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          0 whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.avaliacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') avaliacao,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.justificativa,'[^","]+', 1, LEVEL),'[',''),']','')),' ') justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.feedbackTelefones.fixos.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.fixos.avaliacao, 'null'), 'null', '" "'), '""', '" "') avaliacao,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.fixos.justificativa, 'null'), 'null', '" "'), '""', '" "') justificativa
          FROM TEMPJSON temp
          WHERE temp.sessaoClient = p_sessaoClient
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL
        UNION ALL
        SELECT
          1 indicadorFone,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
          ' ' relacao,
          0 whatsApp,
          0 naoPerturbe,
          ' ' ultimoContato,
          0 hotphone,
          0 plus,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.avaliacao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') avaliacao,
          COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.justificativa,'[^","]+', 1, LEVEL),'[',''),']','')),' ') justificativa
        FROM (
          SELECT
            temp.conteudo.resposta.feedbackTelefones.moveis.numero numero,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.moveis.avaliacao, 'null'), 'null', '" "'), '""', '" "') avaliacao,
            REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.feedbackTelefones.moveis.justificativa, 'null'), 'null', '" "'), '""', '" "') justificativa
          FROM TEMPJSON temp
          WHERE temp.sessaoClient = p_sessaoClient
          AND temp.contadorSessao = p_contadorSessaoTemp) a
        WHERE a.numero <> ' '
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> '['
        AND COALESCE (TRIM (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL)),' ') <> ']'
        CONNECT BY REGEXP_SUBSTR (a.numero, '[^","]+', 1, LEVEL) IS NOT NULL) a) a
    GROUP BY a.numero) a;
  INSERT INTO MOCONSULTADADOSCPFENDEREC (
    id,
    idConsultaDadoCpf,
    ordenacao,
    cep,
    tipoLogradouro,
    logradouro,
    numero,
    complemento,
    bairroDistrito,
    municipio,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFENDEREC', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (TO_NUMBER(REPLACE (REPLACE (TRANSLATE (a.cep,'[]()-"',' '),' ',''),'''','''''')),0) cep,
    COALESCE ((
      SELECT MAX (logr.tipoLogradouro)
      FROM SITIPOSLOGRADOUROS logr
      WHERE logr.abreviaturaLogradouro = UPPER(RTRIM(REPLACE (a.tipoLogradouro,'''','''''')))
      AND logr.ativo = 1),0) tipoLogradouro,
    COALESCE (CASE WHEN a.logradouro IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.logradouro,1,60),'''','''''') END,' ') logradouro,
    COALESCE (CASE WHEN a.numero IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.numero,1,60),'''','''''') END,' ') numero,
    COALESCE (CASE WHEN a.complemento IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.complemento,1,60),'''','''''') END,' ') complemento,
    COALESCE (CASE WHEN a.bairro IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.bairro,1,60),'''','''''') END,' ') bairro,
    FUNC_ADD_BUSCA_MUNICIPIO(COALESCE (CASE WHEN a.cidade IN ('[',']') THEN ' ' ELSE REPLACE (a.cidade,'''','''''') END,' '), COALESCE (CASE WHEN a.uf IN ('[',']') THEN ' ' ELSE REPLACE (a.uf,'''','''''') END,' ')) municipio,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.tipoLogradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') tipoLogradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') logradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.complemento,'[^","]+', 1, LEVEL),'[',''),']','')),' ') complemento,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.bairro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') bairro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cidade,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cidade,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.uf,'[^","]+', 1, LEVEL),'[',''),']','')),' ') uf,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cep,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cep
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.tipoLogradouro, 'null'), 'null', '" "'), '""', '" "') tipoLogradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.logradouro, 'null'), 'null', '" "'), '""', '" "') logradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.numero, 'null'), 'null', '" "'), '""', '" "') numero,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.complemento, 'null'), 'null', '" "'), '""', '" "') complemento,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.bairro, 'null'), 'null', '" "'), '""', '" "') bairro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.cidade, 'null'), 'null', '" "'), '""', '" "') cidade,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.uf, 'null'), 'null', '" "'), '""', '" "') uf,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecos.cep, 'null'), 'null', '"0"'), '""', '"0"') cep
      FROM TEMPJSON temp
      WHERE temp.sessaoClient = p_sessaoClient
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.logradouro <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.logradouro, '[^","]+', 1, LEVEL) IS NOT NULL
    UNION ALL
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.tipoLogradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') tipoLogradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') logradouro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.numero,'[^","]+', 1, LEVEL),'[',''),']','')),' ') numero,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.complemento,'[^","]+', 1, LEVEL),'[',''),']','')),' ') complemento,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.bairro,'[^","]+', 1, LEVEL),'[',''),']','')),' ') bairro,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cidade,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cidade,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.uf,'[^","]+', 1, LEVEL),'[',''),']','')),' ') uf,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cep,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cep
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.tipoLogradouro, 'null'), 'null', '" "'), '""', '" "') tipoLogradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.logradouro, 'null'), 'null', '" "'), '""', '" "') logradouro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.numero, 'null'), 'null', '" "'), '""', '" "') numero,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.complemento, 'null'), 'null', '" "'), '""', '" "') complemento,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.bairro, 'null'), 'null', '" "'), '""', '" "') bairro,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.cidade, 'null'), 'null', '" "'), '""', '" "') cidade,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.uf, 'null'), 'null', '" "'), '""', '" "') uf,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.enderecosAdicionados.cep, 'null'), 'null', '"0"'), '""', '"0"') cep
      FROM TEMPJSON temp
      WHERE temp.sessaoClient = p_sessaoClient
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.logradouro <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.logradouro,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.logradouro, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFEMAILS (
    id,
    idConsultaDadoCpf,
    ordenacao,
    email,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFEMAILS', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (CASE WHEN a.email IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.email,1,60),'''','''''') END,' ') email,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL),'[',''),']','')),' ') email
    FROM (
      SELECT
        REPLACE (COALESCE (temp.conteudo.resposta.emails.email, 'null'), 'null', '" "') email
      FROM TEMPJSON temp
      WHERE temp.sessaoClient = p_sessaoClient
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.email <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.email, '[^","]+', 1, LEVEL) IS NOT NULL
    UNION ALL
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL),'[',''),']','')),' ') email
    FROM (
      SELECT
        REPLACE (REPLACE (temp.conteudo.resposta.emailsAdicionados.email, 'null', '" "'), '""', '" "') email
      FROM TEMPJSON temp
      WHERE temp.sessaoClient = p_sessaoClient
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.email <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.email,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.email, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFPARTIC (
    id,
    idConsultaDadoCpf,
    ordenacao,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    cargo,
    dataEntrada,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFPARTIC', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (CASE WHEN a.cnpj IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (REPLACE (TRANSLATE (a.cnpj,'.-/','   '),' ',''),1,60),'''','''''') END,' ') cnpjCpfIdEstrangeiro,
    COALESCE (CASE WHEN a.razaoSocial IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.razaoSocial,1,60),'''','''''') END,' ') nomeRazaoSocial,
    COALESCE (CASE WHEN a.cargo IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.cargo,1,60),'''','''''') END,' ') cargo,
    CASE WHEN a.dataEntrada = 'null' THEN NULL ELSE TRUNC (TO_DATE (a.dataEntrada, 'DD/MM/YYYY')) END dataEntrada,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cnpj,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.razaoSocial,'[^","]+', 1, LEVEL),'[',''),']','')),' ') razaoSocial,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cargo,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cargo,
      TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.dataEntrada,'[^","]+', 1, LEVEL),'[',''),']','')) dataEntrada
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.cnpj, 'null'), 'null', '" "'), '""', '" "') cnpj,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.razaoSocial, 'null'), 'null', '" "'), '""', '" "') razaoSocial,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.cargo, 'null'), 'null', '" "'), '""', '" "') cargo,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.participacoesEmpresas.dataEntrada, 'null'),'null','"null"'), '""', '"null"') dataEntrada
      FROM TEMPJSON temp
      WHERE temp.sessaoClient = p_sessaoClient
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.cnpj <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.cnpj, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFPROFISS (
    id,
    idConsultaDadoCpf,
    ordenacao,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    setor,
    cboDescricao,
    faixaSalarial,
    rendaEstimada,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFPROFISS', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    ROWNUM ordenacao,
    COALESCE (CASE WHEN a.cnpj IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (REPLACE (TRANSLATE (COALESCE (a.cnpj,' '),'.-/','   '),' ',''),1,60),'''','''''') END,' ') cnpjCpfIdEstrangeiro,
    COALESCE (CASE WHEN a.razaoSocial IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.razaoSocial,' '),1,60),'''','''''') END,' ') nomeRazaoSocial,
    COALESCE (CASE WHEN a.setor IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.setor,' '),1,60),'''','''''') END,' ') setor,
    COALESCE (CASE WHEN a.cboDescricao IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.cboDescricao,' '),1,60),'''','''''') END,' ') cboDescricao,
    COALESCE (CASE WHEN a.faixaSalarial IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (COALESCE (a.faixaSalarial,' '),1,60),'''','''''') END ,' ')faixaSalarial,
    COALESCE (TO_NUMBER(TRIM(SUBSTR(REPLACE (REPLACE (COALESCE (a.rendaEstimada, 'R$ 0,00'),'.',''),',','.'),3,30))),0) rendaEstimada,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cnpj,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.razaoSocial,'[^","]+', 1, LEVEL),'[',''),']','')),' ') razaoSocial,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.setor,'[^","]+', 1, LEVEL),'[',''),']','')),' ') setor,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.cboDescricao,'[^","]+', 1, LEVEL),'[',''),']','')),' ') cboDescricao,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.faixaSalarial,'[^","]+', 1, LEVEL),'[',''),']','')),' ') faixaSalarial,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.rendaEstimada,'[^","]+', 1, LEVEL),'[',''),']','')),'R$ 0,00') rendaEstimada
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.cnpj, 'null'), 'null', '" "'), '""', '" "') cnpj,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.razaoSocial, 'null'), 'null', '" "'), '""', '" "') razaoSocial,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.setor, 'null'), 'null', '" "'), '""', '" "') setor,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.cboDescricao, 'null'), 'null', '" "'), '""', '" "') cboDescricao,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.faixaSalarial, 'null'), 'null', '" "'), '""', '" "') faixaSalarial,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.possivelHistoricoProfissional.rendaEstimada, 'null'), 'null', '"R$ 0,00"'), '""', '"R$ 0,00"') rendaEstimada
      FROM TEMPJSON temp
      WHERE temp.sessaoClient = p_sessaoClient
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.cnpj <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.cnpj,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.cnpj, '[^","]+', 1, LEVEL) IS NOT NULL) a;
  INSERT INTO MOCONSULTADADOSCPFCONSULT (
    id,
    idConsultaDadoCpf,
    segmento,
    quantidade,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MOCONSULTADADOSCPFCONSULT', 'id', 0, p_estabelecimento, NULL),
    r_idConsultaDadoCpf,
    COALESCE (CASE WHEN a.segmento IN ('[',']') THEN ' ' ELSE REPLACE (SUBSTR (a.segmento,1,256),'''','''''') END,' ') segmento,
    COALESCE (TO_NUMBER(TRIM(REPLACE (REPLACE (a.quantidade,'.',''),',','.'))),0) quantidade,
    ' ' observacoes
  FROM (
    SELECT
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.segmento,'[^","]+', 1, LEVEL),'[',''),']','')),' ') segmento,
      COALESCE (TRIM (REPLACE (REPLACE (REGEXP_SUBSTR (a.quantidade,'[^","]+', 1, LEVEL),'[',''),']','')),'0') quantidade
    FROM (
      SELECT
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.historicoConsultasPorSegmento.segmentos.segmento, 'null'), 'null', '" "'), '""', '" "') segmento,
        REPLACE (REPLACE (COALESCE (temp.conteudo.resposta.historicoConsultasPorSegmento.segmentos.quantidade, 'null'), 'null', '" "'), '""', '" "') quantidade
      FROM TEMPJSON temp
      WHERE temp.sessaoClient = p_sessaoClient
      AND temp.contadorSessao = p_contadorSessaoTemp) a
    WHERE a.segmento <> ' '
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.segmento,'[^","]+', 1, LEVEL)),' ') <> '['
    AND COALESCE (TRIM (REGEXP_SUBSTR (a.segmento,'[^","]+', 1, LEVEL)),' ') <> ']'
    CONNECT BY REGEXP_SUBSTR (a.segmento, '[^","]+', 1, LEVEL) IS NOT NULL) a;
END ADD_CONSULTA_DADOS_CPF_GRAVA;

/

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 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
  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 PAPROJETOS                  SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  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 PACARTOESPROPRIOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAMODELOSFINANCEIRO         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAOPERFISCALXPESSOAS        SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  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));
  -- Cadastros
  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 CARECEITASLENTESCLIENTE     SET paciente = p_pessoaPara WHERE paciente = p_pessoaDe;
  -- 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 MOORCAMENTOXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOPREDOCUMENTOS             SET pessoa = p_pessoaPara WHERE pessoa = 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 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 MOHISTORICOCRM              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 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 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 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 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 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 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 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 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 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 PACARTEIRASFINPERMITIDAS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND 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 AND b.permitido = 1);
    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 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 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 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 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.guia = a.guia AND b.categoriaMenu = a.categoriaMenu));
    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 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 MOHISTORICOCOBRANCA         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOHISTORICOCRM              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPONTUACOES                SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCOBRANCA          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_TROCA_GRADEPRODUTO(
    p_gradeProdutoDe   IN NUMBER,
    p_gradeProdutoPara IN NUMBER)
IS
BEGIN
  UPDATE CAGRADEPRODUTOXPESSOAS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXPESSOAS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.pessoa = a.pessoa
    AND b.codigoProduto = a.codigoProduto));
  DELETE CAGRADEPRODUTOXPESSOAS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXLOTESESTOQ a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXLOTESESTOQ b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.loteEstoque = a.loteEstoque));
  UPDATE CAGRADEPRODUTOXLOTESESTOQ
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXENDERECOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXENDERECOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque));
  DELETE CAGRADEPRODUTOXENDERECOS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXNUMEROSSER a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXNUMEROSSER b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.numeroSerie = a.numeroSerie));
  UPDATE CAGRADEPRODUTOXNUMEROSSER
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.gradeProdutoFilho = a.gradeProdutoFilho));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProdutoFilho = p_gradeProdutoPara
  WHERE a.gradeProdutoFilho = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProdutoFilho = p_gradeProdutoPara
    AND b.gradeProduto = a.gradeProduto));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProdutoFilho = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOXCOMPOSICOESPREC
  SET gradeProdutoEstoque = p_gradeProdutoPara
  WHERE gradeProdutoEstoque = p_gradeProdutoDe;
  UPDATE PAPRODUTOSLINHASTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CABASESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CACOLORANTESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAATIVIDADESSERVICO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAPROJETOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOLISTAEVENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXPRODUTOFILHO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODISTRIBUICAODFEXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXITENS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXITENS b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante
    AND b.localEstoque = a.localEstoque
    AND b.personalizacao = a.personalizacao
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque
    AND b.idNumeroSerie = a.idNumeroSerie));
  DELETE MOINVENTARIOESTOQUEXITENS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXFISC a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXFISC b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante));
  DELETE MOINVENTARIOESTOQUEXFISC
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOESTOQUES
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTROCAXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXDIVERGENCIA
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCUMENTOTRANSFXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONSERTOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MORESERVASESTOQUE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPAINELCOMPRAXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOMOTIVOSBLOQUEIOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINGRESSOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADESPRODUTO
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOS a
  SET a.ativo = 0
  WHERE EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.gradeProduto = p_gradeProdutoDe)
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.ativo = 1));
END ADD_TROCA_GRADEPRODUTO;
/

create or replace PROCEDURE ADD_TEMPPARCELAS_GRAVA (
    p_sessaoClient                 IN VARCHAR2,
    p_contadorSessaoTempParcelas   IN NUMBER,
    p_origem                       IN CHAR,
    p_idCabecalho                  IN NUMBER,
    p_pagamentoTroco               IN CHAR,
    p_sequencia                    IN NUMBER,
    p_parcela                      IN NUMBER,
    p_prazoPadrao                  IN NUMBER,
    p_prazo                        IN NUMBER,
    p_vencimento                   IN DATE,
    p_baixaAutomatica              IN NUMBER,
    p_percentualRateioOriginal     IN NUMBER,
    p_valor                        IN NUMBER,
    p_complementoFinanceiro        IN VARCHAR,
    p_idPrevisaoFinanceira         IN NUMBER,
    p_idFinanceiro                 IN NUMBER,
    p_idTransacaoTef               IN NUMBER,
    p_chequeCompensacao            IN VARCHAR,
    p_chequeBanco                  IN VARCHAR,
    p_chequeAgenciaBanco           IN VARCHAR,
    p_chequeC1                     IN CHAR,
    p_chequeContaBanco             IN VARCHAR,
    p_chequeC2                     IN CHAR,
    p_cheque                       IN NUMBER,
    p_chequeC3                     IN CHAR,
    p_chequeBomPara                IN DATE,
    p_chequeIndicadorPessoa        IN CHAR,
    p_chequeTitular                IN VARCHAR,
    p_chequeIndicadorDocumentoPess IN CHAR,
    p_chequeCnpjCpfIdEstrangeiro   IN VARCHAR,
    p_chequeFone                   IN VARCHAR,
    p_chequeDesde                  IN DATE,
    p_chequeAutenticacao           IN VARCHAR,
    p_chequeIndicadorFone          IN NUMBER,
    p_chequeOperacaoTelefonia      IN NUMBER,
    p_chequeObservacaoFone         IN VARCHAR,
    p_linhaDigitavelBoleto         IN VARCHAR2)
IS
BEGIN
  MERGE INTO TEMPPARCELAS a USING (
    SELECT
      p_sessaoClient              sessaoClient,
      p_contadorSessaoTempParcelas   contadorSessao,
      p_origem                       origem,
      p_idCabecalho                  idCabecalho,
      p_pagamentoTroco               pagamentoTroco,
      p_sequencia                    sequencia,
      p_parcela                      parcela,
      p_prazoPadrao                  prazoPadrao,
      p_prazo                        prazo,
      p_vencimento                   vencimento,
      p_baixaAutomatica              baixaAutomatica,
      p_percentualRateioOriginal     percentualRateioOriginal,
      p_valor                        valor,
      p_complementoFinanceiro        complementoFinanceiro,
      p_idPrevisaoFinanceira         idPrevisaoFinanceira,
      p_idFinanceiro                 idFinanceiro,
      p_idTransacaoTef               idTransacaoTef,
      p_chequeCompensacao            chequeCompensacao,
      p_chequeBanco                  chequeBanco,
      p_chequeAgenciaBanco           chequeAgenciaBanco,
      p_chequeC1                     chequeC1,
      p_chequeContaBanco             chequeContaBanco,
      p_chequeC2                     chequeC2,
      p_cheque                       cheque,
      p_chequeC3                     chequeC3,
      p_chequeBomPara                chequeBomPara,
      p_chequeIndicadorPessoa        chequeIndicadorPessoa,
      p_chequeTitular                chequeTitular,
      p_chequeIndicadorDocumentoPess chequeIndicadorDocumentoPessoa,
      p_chequeCnpjCpfIdEstrangeiro   chequeCnpjCpfIdEstrangeiro,
      p_chequeFone                   chequeFone,
      p_chequeDesde                  chequeDesde,
      p_chequeAutenticacao           chequeAutenticacao,
      p_chequeIndicadorFone          chequeIndicadorFone,
      p_chequeOperacaoTelefonia      chequeOperacaoTelefonia,
      p_chequeObservacaoFone         chequeObservacaoFone,
      p_linhaDigitavelBoleto         linhaDigitavelBoleto
    FROM DUAL) b
  ON (  a.sessaoClient  = b.sessaoClient
    AND a.contadorSessao   = b.contadorSessao
    AND a.origem           = b.origem
    AND a.idCabecalho      = b.idCabecalho
    AND a.pagamentoTroco   = b.pagamentoTroco
    AND a.sequencia        = b.sequencia
    AND a.parcela          = b.parcela)
  WHEN MATCHED THEN UPDATE SET
    a.prazoPadrao                    = b.prazoPadrao,
    a.prazo                          = b.prazo,
    a.vencimento                     = b.vencimento,
    a.baixaAutomatica                = b.baixaAutomatica,
    a.percentualRateioOriginal       = b.percentualRateioOriginal,
    a.valor                          = b.valor,
    a.complementoFinanceiro          = b.complementoFinanceiro,
    a.idPrevisaoFinanceira           = b.idPrevisaoFinanceira,
    a.idFinanceiro                   = b.idFinanceiro,
    a.idTransacaoTef                 = b.idTransacaoTef,
    a.chequeCompensacao              = b.chequeCompensacao,
    a.chequeBanco                    = b.chequeBanco,
    a.chequeAgenciaBanco             = b.chequeAgenciaBanco,
    a.chequeC1                       = b.chequeC1,
    a.chequeContaBanco               = b.chequeContaBanco,
    a.chequeC2                       = b.chequeC2,
    a.cheque                         = b.cheque,
    a.chequeC3                       = b.chequeC3,
    a.chequeBomPara                  = b.chequeBomPara,
    a.chequeIndicadorPessoa          = b.chequeIndicadorPessoa,
    a.chequeTitular                  = b.chequeTitular,
    a.chequeIndicadorDocumentoPessoa = b.chequeIndicadorDocumentoPessoa,
    a.chequeCnpjCpfIdEstrangeiro     = b.chequeCnpjCpfIdEstrangeiro,
    a.chequeFone                     = b.chequeFone,
    a.chequeDesde                    = b.chequeDesde,
    a.chequeAutenticacao             = b.chequeAutenticacao,
    a.chequeIndicadorFone            = b.chequeIndicadorFone,
    a.chequeOperacaoTelefonia        = b.chequeOperacaoTelefonia,
    a.chequeObservacaoFone           = b.chequeObservacaoFone,
    a.linhaDigitavelBoleto           = b.linhaDigitavelBoleto
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    contadorSessao,
    origem,
    idCabecalho,
    pagamentoTroco,
    sequencia,
    parcela,
    prazoPadrao,
    prazo,
    vencimento,
    baixaAutomatica,
    percentualRateioOriginal,
    valor,
    complementoFinanceiro,
    idPrevisaoFinanceira,
    idFinanceiro,
    idTransacaoTef,
    chequeCompensacao,
    chequeBanco,
    chequeAgenciaBanco,
    chequeC1,
    chequeContaBanco,
    chequeC2,
    cheque,
    chequeC3,
    chequeBomPara,
    chequeIndicadorPessoa,
    chequeTitular,
    chequeIndicadorDocumentoPessoa,
    chequeCnpjCpfIdEstrangeiro,
    chequeFone,
    chequeDesde,
    chequeAutenticacao,
    chequeIndicadorFone,
    chequeOperacaoTelefonia,
    chequeObservacaoFone,
    linhaDigitavelBoleto)
  VALUES (
    b.sessaoClient,
    b.contadorSessao,
    b.origem,
    b.idCabecalho,
    b.pagamentoTroco,
    b.sequencia,
    b.parcela,
    b.prazoPadrao,
    b.prazo,
    b.vencimento,
    b.baixaAutomatica,
    b.percentualRateioOriginal,
    b.valor,
    b.complementoFinanceiro,
    b.idPrevisaoFinanceira,
    b.idFinanceiro,
    b.idTransacaoTef,
    b.chequeCompensacao,
    b.chequeBanco,
    b.chequeAgenciaBanco,
    b.chequeC1,
    b.chequeContaBanco,
    b.chequeC2,
    b.cheque,
    b.chequeC3,
    b.chequeBomPara,
    b.chequeIndicadorPessoa,
    b.chequeTitular,
    b.chequeIndicadorDocumentoPessoa,
    b.chequeCnpjCpfIdEstrangeiro,
    b.chequeFone,
    b.chequeDesde,
    b.chequeAutenticacao,
    b.chequeIndicadorFone,
    b.chequeOperacaoTelefonia,
    b.chequeObservacaoFone,
    b.linhaDigitavelBoleto);
END ADD_TEMPPARCELAS_GRAVA;

/

create or replace PROCEDURE ADD_PRODUTO_CLASSIFIC_ATUALIZA (
  p_usuarioLogado        IN NUMBER,
  p_perfilUsuarioLogado  IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER,
  p_produto              IN NUMBER,
  /* Retornos */
  r_atualizou            OUT NUMBER)
IS
  v_classificacaoProdutoAtual VARCHAR(3);
  v_classificacaoProdutoNova  VARCHAR(3);
  v_auxNumber                 NUMBER;
BEGIN
  r_atualizou := 0;
  v_classificacaoProdutoNova := FUNC_ADD_BUSCA_CLASSIF_PRODUTO (
    p_usuarioLogado,
    p_perfilUsuarioLogado,
    p_estabelecimentoAtivo,
    p_produto);
  IF v_classificacaoProdutoNova <> ' ' THEN
    SELECT classificacaoProduto
    INTO v_classificacaoProdutoAtual
    FROM CAPRODUTOS
    WHERE produto = p_produto;
    IF v_classificacaoProdutoNova <> v_classificacaoProdutoAtual THEN
      r_atualizou := 1;
      UPDATE CAPRODUTOS SET
        classificacaoProduto = v_classificacaoProdutoNova,
        dataClassificacaoProduto = SYSDATE
      WHERE produto = p_produto;
    END IF;
  END IF;
END ADD_PRODUTO_CLASSIFIC_ATUALIZA;

/

create or replace PROCEDURE ADD_GERA_TEMP_COMPRAS_VENDAS (
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessao               IN NUMBER,
  p_originalEstabelec            IN CHAR,
  p_compraVendaPedcomprOrcamento IN CHAR,
  p_diaMesTotal                  IN CHAR,
  p_periodoInicial               IN DATE,
  p_periodoFinal                 IN DATE,
  p_inEstabelecimentos           IN VARCHAR2,
  p_inLocaisEstoque              IN VARCHAR2,
  p_joinProdutos                 IN VARCHAR2,
  p_andWhereProdutos             IN VARCHAR2,
  p_joinDocumentos               IN VARCHAR2,
  p_andWhereDocumentos           IN VARCHAR2)
IS
BEGIN
  DELETE TEMPCOMPRASVENDAS
  WHERE  sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  EXECUTE IMMEDIATE
    CASE
      -- MOPREDOCUMENTOS // MODOCUMENTOSFISCAIS
      WHEN p_compraVendaPedcomprOrcamento IN ('C','V')
      THEN 'INSERT INTO TEMPCOMPRASVENDAS (
    sessaoClient,
    contadorSessao,
    gradeProduto,
    estabelecimento,
    localEstoque,
    periodoInicial,
    periodoFinal,
    quantidade)
  SELECT
    ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
    ' || TO_CHAR(p_contadorSessao) || ',
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntradaSaida)' WHEN 'M' THEN 'TRUNC(a.dataEntradaSaida,''MM'')' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoInicial,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntradaSaida)' WHEN 'M' THEN 'TRUNC(LAST_DAY(a.dataEntradaSaida))' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoFinal,
    SUM(a.quantidade) quantidade
  FROM (
    SELECT DISTINCT
      item.idItemPreDocumento id,
      item.idItemPreDocumento id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemPreDocumento > 0
    AND item.cancelado = 0
    AND item.geraFinanceiro = 1
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.statusPreDocumento IN (''A'',''F'')
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      item.idItemDocFiscal id,
      item.idItemDocFiscal id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemDocFiscal > 0
    AND item.cancelado = 0
    AND item.geraFinanceiro = 1
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.situacaoDocumentoFiscal IN (21,22,23)
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      docXEst.idItemPreDocumento id,
      item.idEstoque id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MOESTOQUES item
    JOIN MOPREDOCUMXESTOQUE docXEst ON docXEst.idEstoque = item.idEstoque
    JOIN MOPREDOCUMXITENS itemDoc ON itemDoc.idItemPreDocumento = docXEst.idItemPreDocumento
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = itemDoc.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE docXEst.idItemPreDocumento > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 1
    AND itemDoc.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.statusPreDocumento IN (''A'',''F'')
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      docXEst.idItemDocFiscal id,
      item.idEstoque id2,
      item.gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM MOESTOQUES item
    JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idEstoque = item.idEstoque
    JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE docXEst.idItemDocFiscal > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 1
    AND itemDoc.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.situacaoDocumentoFiscal IN (21,22,23)
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      item.idItemPreDocumento id,
      kit.id id2,
      kit.gradeProdutoFilho gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      kit.quantidade * item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN MOPREDOCUMXITENS item ON item.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = kit.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemPreDocumento > 0
    AND item.cancelado = 0
    AND item.movimentaEstoque = 0
    AND item.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.statusPreDocumento IN (''A'',''F'')
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      item.idItemDocFiscal id,
      kit.id id2,
      kit.gradeProdutoFilho gradeProduto,
      ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END ' ELSE 'doc.' END || 'estabelecimento,
      item.localEstoque,
      doc.dataEntradaSaida,
      kit.quantidade * item.quantidade * CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN -1 ELSE 1 END quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN MODOCFISCALXITENS item ON item.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = kit.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemDocFiscal > 0
    AND item.cancelado = 0
    AND item.movimentaEstoque = 0
    AND item.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'C' THEN 'S'' ELSE ''E' ELSE 'E'' ELSE ''S' END || ''' END
    AND doc.situacaoDocumentoFiscal IN (21,22,23)
    AND TRUNC(doc.dataEntradaSaida) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND ' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ' = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(' || CASE WHEN p_originalEstabelec = 'O' THEN 'CASE WHEN doc.devolucaoAnulacaoRetorno = 1 THEN doc.estabelecimentoOriginal ELSE doc.estabelecimento END' ELSE 'doc.estabelecimento' END || ')) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
  ) a
  GROUP BY
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque'
    || CASE p_diaMesTotal
        WHEN 'D'
        THEN ',
    TRUNC(a.dataEntradaSaida),
    TRUNC(a.dataEntradaSaida)'
        WHEN 'M'
        THEN ',
    TRUNC(a.dataEntradaSaida,''MM''),
    TRUNC(LAST_DAY(a.dataEntradaSaida))'
        ELSE ''
      END
      -- MOORCAMENTOS
      ELSE 'INSERT INTO TEMPCOMPRASVENDAS (
    sessaoClient,
    contadorSessao,
    gradeProduto,
    estabelecimento,
    localEstoque,
    periodoInicial,
    periodoFinal,
    quantidade)
  SELECT
    ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
    ' || TO_CHAR(p_contadorSessao) || ',
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntrega)' WHEN 'M' THEN 'TRUNC(a.dataEntrega,''MM'')' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoInicial,
    ' || CASE p_diaMesTotal WHEN 'D' THEN 'TRUNC(a.dataEntrega)' WHEN 'M' THEN 'TRUNC(LAST_DAY(a.dataEntrega))' ELSE 'TO_DATE(''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')' END || ' periodoFinal,
    SUM(a.quantidadeSaldo) quantidade
  FROM (
    SELECT DISTINCT
      item.idItemOrcamento id,
      item.idItemOrcamento id2,
      item.gradeProduto,
      doc.estabelecimento,
      item.localEstoque,
      doc.dataEntrega,
      item.quantidadeSaldo
    FROM MOORCAMENTOXITENS item
    JOIN MOORCAMENTOS doc ON doc.orcamento = item.orcamento
    JOIN PAETAPASORCAMENTO etap ON etap.etapaOrcamento = doc.etapaOrcamento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE item.idItemOrcamento > 0
    AND item.cancelado = 0
    AND item.geraFinanceiro = 1
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'E' ELSE 'S' END || '''
    AND etap.situacaoOrcamento = 60
    AND TRUNC(doc.dataEntrega) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND doc.estabelecimento = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(doc.estabelecimento)) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
    UNION ALL
    SELECT DISTINCT
      docXEst.idItemOrcamento id,
      item.idReservaEstoque id2,
      item.gradeProduto,
      doc.estabelecimento,
      item.localEstoque,
      doc.dataEntrega,
      item.quantidadeSaldo
    FROM MORESERVASESTOQUE item
    JOIN MOORCAMENTOXRESERVAESTOQ docXEst ON docXEst.idReservaEstoque = item.idReservaEstoque
    JOIN MOORCAMENTOXITENS itemDoc ON itemDoc.idItemOrcamento = docXEst.idItemOrcamento
    JOIN CAGRADESPRODUTO gradDoc ON gradDoc.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prodDoc ON prodDoc.produto = gradDoc.produto
    JOIN MOORCAMENTOS doc ON doc.orcamento = itemDoc.orcamento
    JOIN PAETAPASORCAMENTO etap ON etap.etapaOrcamento = doc.etapaOrcamento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinDocumentos IS NULL OR p_joinDocumentos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_joinDocumentos)
   END
|| '
    WHERE docXEst.idItemOrcamento > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 1
    AND itemDoc.geraFinanceiro = 1
    AND prodDoc.controleEstoque IN (3,4)
    AND doc.' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'atualizaUltimaCompra' ELSE 'validoFaturamento' END || ' = 1
    AND doc.entradaSaida = ''' || CASE WHEN p_compraVendaPedcomprOrcamento = 'P' THEN 'E' ELSE 'S' END || '''
    AND etap.situacaoOrcamento = 60
    AND TRUNC(doc.dataEntrega) BETWEEN TO_DATE (''' || TO_CHAR(p_periodoInicial, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') AND TO_DATE (''' || TO_CHAR(p_periodoFinal, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
    AND doc.estabelecimento = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
    AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(doc.estabelecimento)) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
    AND item.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
    AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(item.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereDocumentos IS NULL OR p_andWhereDocumentos = ' '
     THEN ''
     ELSE '
   ' || RTRIM(p_andWhereDocumentos)
   END
|| '
  ) a
  GROUP BY
    a.gradeProduto,
    a.estabelecimento,
    a.localEstoque'
    || CASE p_diaMesTotal
        WHEN 'D'
        THEN ',
    TRUNC(a.dataEntrega),
    TRUNC(a.dataEntrega)'
        WHEN 'M'
        THEN ',
    TRUNC(a.dataEntrega,''MM''),
    TRUNC(LAST_DAY(a.dataEntrega))'
        ELSE ''
      END
    END;
END ADD_GERA_TEMP_COMPRAS_VENDAS;

/

create or replace PROCEDURE ADD_GERA_TEMP_INVENTARIO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_335_cmvGerencIgualFis IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoFiscal         IN NUMBER,
  p_contadorSessaoGerencial      IN NUMBER,
  p_gerandoInventario            IN NUMBER,
  p_buscarPrecoUnitarioCMV       IN NUMBER,
  p_buscarPrecoUnitUltimaCompra  IN NUMBER,
  p_buscarPrecoCustoUltimaCompra IN NUMBER,
  p_buscarPrecoCustoUltimaFormac IN NUMBER,
  p_buscarICMS                   IN NUMBER,
  p_invEst_data                  IN DATE,
  p_invEst_motivoInventario      IN CHAR,
  p_inEstabelecimentos           IN VARCHAR2,
  p_produto                      IN NUMBER,
  p_prod_join                    IN VARCHAR2,
  p_prod_andWhere                IN VARCHAR2,
  p_filtroProduto                IN NUMBER,
  p_inventario_join              IN VARCHAR2,
  p_inventario_andWhere          IN VARCHAR2,
  p_movimentos_join              IN VARCHAR2,
  p_movimentos_andWhere          IN VARCHAR2,
  p_docFiscal_join               IN VARCHAR2,
  p_docFiscal_andWhere           IN VARCHAR2,
  p_docFiscalFilho_join          IN VARCHAR2,
  p_docFiscalFilho_andWhere      IN VARCHAR2)
IS
  v_prod_join     CLOB;
  v_prod_andWhere CLOB;
BEGIN
  v_prod_join := '
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_prod_join IS NULL OR p_prod_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_prod_join)
   END
|| CASE
     WHEN p_produto <> 0 OR p_filtroProduto = 0
     THEN ''
     ELSE '
    JOIN PAFILTROSPRODUTO filtrProd
    ON filtrProd.filtroProduto = ' || TO_CHAR(p_filtroProduto)
   END;
  v_prod_andWhere := '
      AND gradProd.produto '
|| CASE
     WHEN  p_produto = 0
     THEN '> 0'
       || CASE
            WHEN p_prod_andWhere IS NULL OR p_prod_andWhere = ' '
            THEN '
    AND prod.controleEstoque IN (1,5,11,12,13)'
            ELSE '
    ' || RTRIM(p_prod_andWhere)
          END
       || CASE
            WHEN p_filtroProduto = 0
            THEN ''
            ELSE '
    AND filtrProd.filtrarVendedores              = 0
    AND filtrProd.filtrarLocaisEstoque           = 0
    AND filtrProd.filtrarPersonalizacoes         = 0
    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 = prod.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
          JOIN PASUBCATEGORIASPRODUTO subCatX
          ON subCatX.categoriaProduto = filtrProdX.categoriaProduto
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND subCatX.subcategoriaProduto = prod.subcategoriaProduto
          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
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.cor = gradProd.Cor
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.tamanho = gradProd.tamanho
          AND filtrProdX.ativo = 1))
      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)))'
          END
     ELSE ' = ' || TO_CHAR(p_produto)
   END;
  IF p_contadorSessaoFiscal <> 0 THEN
    DELETE TEMPINVENTARIOESTXFISCAL
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoFiscal;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXFISCAL (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  quantidade,
  precoUnitarioCMV,
  stICMS,
  baseICMS,
  valorICMS)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXFISC AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      gradProd.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          gradProd.produto
        ORDER BY
          invEst.estabelecimento ASC,
          gradProd.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXFISC itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'',''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      gradProd.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          gradProd.produto
        ORDER BY
          mov.estabelecimento ASC,
          gradProd.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoFiscal) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante),
  a.estabelecimento,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  ''00'' stICMS,
  0 baseICMS,
  0 valorICMS
FROM (
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS(
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
    WHERE dataInvFisc.estabelecimento = invEst.estabelecimento
    AND dataInvFisc.produto = gradProd.produto))
  AND NOT (EXISTS(
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXFISC dataInvFisc
  ON dataInvFisc.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvFisc.produto = gradProd.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS(
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = dataInvFisc.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
  WHERE mov.operacaoInternaEstoque IN (1,900)
  AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemDoc.idItemDocFiscal id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    itemDoc.gradeProduto,
    itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_docFiscal_join IS NULL OR p_docFiscal_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
