SET DEFINE OFF;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (229, 20003015, 'Enviar e-commerce', 1, 20003, 'L', '1', 'E', 0, 0, 0, 1, 1, 0, 'Enviar e-commerce', ' ', ' ', ' ');

COMMIT;

CREATE TABLE CAGRADESPRODUTO_2203 AS SELECT * FROM CAGRADESPRODUTO;

ALTER TABLE CAGRADEPRODUTOXPESSOAS DROP CONSTRAINT CAGRADEPRODUTOXPESSOAS_FK1;
ALTER TABLE CAGRADEPRODUTOXLOTESESTOQ DROP CONSTRAINT CAGRADEPRODUTOXLOTESESTOQ_FK1;
ALTER TABLE CAGRADEPRODUTOXENDERECOS DROP CONSTRAINT CAGRADEPRODUTOXENDERECOS_FK1;
ALTER TABLE CAGRADEPRODUTOXNUMEROSSER DROP CONSTRAINT CAGRADEPRODUTOXNUMEROSSER_FK1;
ALTER TABLE CAGRADEPRODUTOXKITSCOMBOS DROP CONSTRAINT CAGRADEPRODUTOXKITSCOMBOS_FK1;
ALTER TABLE CAGRADEPRODUTOXKITSCOMBOS DROP CONSTRAINT CAGRADEPRODUTOXKITSCOMBOS_FK2;
ALTER TABLE CAPRODUTOXCOMPOSICOESPREC DROP CONSTRAINT CAPRODUTOXCOMPOSICOESPREC_FK2;
ALTER TABLE PAPRODUTOSLINHASTINTAS DROP CONSTRAINT PAPRODUTOSLINHASTINTAS_FK2;
ALTER TABLE CABASESTINTAS DROP CONSTRAINT CABASESTINTAS_FK3;
ALTER TABLE CACOLORANTESTINTAS DROP CONSTRAINT CACOLORANTESTINTAS_FK2;
ALTER TABLE PAATIVIDADESSERVICO DROP CONSTRAINT PAATIVIDADESSERVICO_FK3;
ALTER TABLE PAPROJETOS DROP CONSTRAINT PAPROJETOS_FK3;
ALTER TABLE MOORCAMENTOXITENS DROP CONSTRAINT MOORCAMENTOXITENS_FK3;
ALTER TABLE MOORCAMENTOXNUMEROSSERIE DROP CONSTRAINT MOORCAMENTOXNUMEROSSERIE_FK3;
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST DROP CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK6;
ALTER TABLE MOPREDOCUMXITENS DROP CONSTRAINT MOPREDOCUMXITENS_FK3;
ALTER TABLE MOPREDOCUMXNUMEROSSERIE DROP CONSTRAINT MOPREDOCUMXNUMEROSSERIE_FK3;
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST DROP CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK6;
ALTER TABLE MODOCFISCALXITENS DROP CONSTRAINT MODOCFISCALXITENS_FK3;
ALTER TABLE MODOCFISCALXNUMEROSSERIE DROP CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK3;
ALTER TABLE MODOCFISCALXBLOQUEIOSEST DROP CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK6;
ALTER TABLE MODISTRIBUICAODFEXGRADE DROP CONSTRAINT MODISTRIBUICAODFEXGRADE_FK2;
ALTER TABLE MOSEPARACAOXITENS DROP CONSTRAINT MOSEPARACAOXITENS_FK5;
ALTER TABLE MOSEPARACAOXNUMEROSSERIE DROP CONSTRAINT MOSEPARACAOXNUMEROSSERIE_FK3;
ALTER TABLE MOSEPARACAOXBLOQUEIOSEST DROP CONSTRAINT MOSEPARACAOXBLOQUEIOSEST_FK6;
ALTER TABLE MOINVENTARIOESTOQUEXITENS DROP CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK2;
ALTER TABLE MOESTOQUES DROP CONSTRAINT MOESTOQUES_FK2;
ALTER TABLE MODOCTROCAXITENS DROP CONSTRAINT MODOCTROCAXITENS_FK3;
ALTER TABLE MOBALANCOXITENS DROP CONSTRAINT MOBALANCOXITENS_FK3;
ALTER TABLE MOBALANCOXDIVERGENCIA DROP CONSTRAINT MOBALANCOXDIVERGENCIA_FK3;
ALTER TABLE MODOCUMENTOTRANSFXITENS DROP CONSTRAINT MODOCUMENTOTRANSFXITENS_FK2;
ALTER TABLE MODOCTRANSFXNUMEROSSERIE DROP CONSTRAINT MODOCTRANSFXNUMEROSSERIE_FK2;
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST DROP CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK6;
ALTER TABLE MOORCAMENTOXCONFERENCIAS DROP CONSTRAINT MOORCAMENTOXCONFERENCIAS_FK3;
ALTER TABLE MOPREDOCUMXCONFERENCIAS DROP CONSTRAINT MOPREDOCUMXCONFERENCIAS_FK3;
ALTER TABLE MODOCFISCALXCONFERENCIAS DROP CONSTRAINT MODOCFISCALXCONFERENCIAS_FK3;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK6;
ALTER TABLE MORESERVASESTOQUE DROP CONSTRAINT MORESERVASESTOQUE_FK2;
ALTER TABLE MOPAINELCOMPRAXGRADE DROP CONSTRAINT MOPAINELCOMPRAXGRADE_FK2;
ALTER TABLE MOMOTIVOSBLOQUEIOS DROP CONSTRAINT MOMOTIVOSBLOQUEIOS_FK7;
ALTER TABLE MOINGRESSOS DROP CONSTRAINT MOINGRESSOS_FK1;

DROP TABLE CAGRADESPRODUTO;

-- CAGRADESPRODUTO
CREATE TABLE CAGRADESPRODUTO
  (
    gradeProduto      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto           NUMERIC (7,0) DEFAULT 0 NOT NULL,
    ordenacao         NUMERIC (11,0) DEFAULT 0 NOT NULL,
    cor               NUMERIC (7,0) DEFAULT 0 NOT NULL,
    tamanho           VARCHAR (10) DEFAULT ' ' NOT NULL,
    produtoImpresso   VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoImpressa VARCHAR (120) DEFAULT ' ' NOT NULL,
    eanGtin           VARCHAR (14) DEFAULT ' ' NOT NULL,
    codigoFabrica     VARCHAR (60) DEFAULT ' ' NOT NULL,
    codigoAnterior    VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes       VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE CAGRADESPRODUTO ADD CONSTRAINT CAGRADESPRODUTO_PK1 PRIMARY KEY (gradeProduto);
CREATE INDEX CAGRADESPRODUTO_K2 ON CAGRADESPRODUTO (descricaoImpressa);
CREATE UNIQUE INDEX CAGRADESPRODUTO_K3 ON CAGRADESPRODUTO (produtoImpresso);
CREATE UNIQUE INDEX CAGRADESPRODUTO_K4 ON CAGRADESPRODUTO (produto, cor, tamanho);
CREATE INDEX CAGRADESPRODUTO_K5 ON CAGRADESPRODUTO (produto, ordenacao, produtoImpresso);
CREATE INDEX CAGRADESPRODUTO_K6 ON CAGRADESPRODUTO (produto);
CREATE INDEX CAGRADESPRODUTO_K7 ON CAGRADESPRODUTO (eanGtin);
CREATE INDEX CAGRADESPRODUTO_K8 ON CAGRADESPRODUTO (codigoFabrica);
CREATE INDEX CAGRADESPRODUTO_K9 ON CAGRADESPRODUTO (codigoAnterior);
CREATE INDEX CAGRADESPRODUTO_K10 ON CAGRADESPRODUTO (descricaoImpressa, ativo);
ALTER TABLE CAGRADESPRODUTO ADD CONSTRAINT CAGRADESPRODUTO_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAGRADESPRODUTO ADD CONSTRAINT CAGRADESPRODUTO_FK2 FOREIGN KEY (cor) REFERENCES PACORES (cor);
ALTER TABLE CAGRADESPRODUTO ADD CONSTRAINT CAGRADESPRODUTO_FK3 FOREIGN KEY (tamanho) REFERENCES PATAMANHOS (tamanho);

INSERT INTO CAGRADESPRODUTO (gradeProduto, produto, ordenacao, cor, tamanho, produtoImpresso, descricaoImpressa, eanGtin, codigoFabrica, codigoAnterior, ativo, observacoes) VALUES (0, 0, 0, 0, ' ', ' ', 'SELECIONE', ' ', ' ', ' ', 1, ' ');
INSERT INTO CAGRADESPRODUTO (gradeProduto, produto, ordenacao, cor, tamanho, produtoImpresso, descricaoImpressa, eanGtin, codigoFabrica, codigoAnterior, ativo, observacoes) SELECT a.gradeProduto, a.produto, a.ordenacao, a.cor, a.tamanho, a.produtoImpresso, a.descricaoImpressa, b.eanGtin, a.codigoFabrica, a.codigoAnterior, a.ativo, a.observacoes FROM CAGRADESPRODUTO_2203 a JOIN CAPRODUTOS b ON b.produto = a.produto WHERE a.gradeProduto <> 0;

COMMIT;

ALTER TABLE CAGRADEPRODUTOXPESSOAS ADD CONSTRAINT CAGRADEPRODUTOXPESSOAS_FK1 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CAGRADEPRODUTOXLOTESESTOQ ADD CONSTRAINT CAGRADEPRODUTOXLOTESESTOQ_FK1 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CAGRADEPRODUTOXENDERECOS ADD CONSTRAINT CAGRADEPRODUTOXENDERECOS_FK1 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CAGRADEPRODUTOXNUMEROSSER ADD CONSTRAINT CAGRADEPRODUTOXNUMEROSSER_FK1 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CAGRADEPRODUTOXKITSCOMBOS ADD CONSTRAINT CAGRADEPRODUTOXKITSCOMBOS_FK1 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CAGRADEPRODUTOXKITSCOMBOS ADD CONSTRAINT CAGRADEPRODUTOXKITSCOMBOS_FK2 FOREIGN KEY (gradeProdutoFilho) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CAPRODUTOXCOMPOSICOESPREC ADD CONSTRAINT CAPRODUTOXCOMPOSICOESPREC_FK2 FOREIGN KEY (gradeProdutoEstoque) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE PAPRODUTOSLINHASTINTAS ADD CONSTRAINT PAPRODUTOSLINHASTINTAS_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CABASESTINTAS ADD CONSTRAINT CABASESTINTAS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE CACOLORANTESTINTAS ADD CONSTRAINT CACOLORANTESTINTAS_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE PAPROJETOS ADD CONSTRAINT PAPROJETOS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXNUMEROSSERIE ADD CONSTRAINT MOORCAMENTOXNUMEROSSERIE_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK6 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXNUMEROSSERIE ADD CONSTRAINT MOPREDOCUMXNUMEROSSERIE_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK6 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXNUMEROSSERIE ADD CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK6 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODISTRIBUICAODFEXGRADE ADD CONSTRAINT MODISTRIBUICAODFEXGRADE_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOSEPARACAOXITENS ADD CONSTRAINT MOSEPARACAOXITENS_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOSEPARACAOXNUMEROSSERIE ADD CONSTRAINT MOSEPARACAOXNUMEROSSERIE_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOSEPARACAOXBLOQUEIOSEST ADD CONSTRAINT MOSEPARACAOXBLOQUEIOSEST_FK6 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCUMENTOTRANSFXITENS ADD CONSTRAINT MODOCUMENTOTRANSFXITENS_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCTRANSFXNUMEROSSERIE ADD CONSTRAINT MODOCTRANSFXNUMEROSSERIE_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK6 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXCONFERENCIAS ADD CONSTRAINT MOORCAMENTOXCONFERENCIAS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXCONFERENCIAS ADD CONSTRAINT MOPREDOCUMXCONFERENCIAS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXCONFERENCIAS ADD CONSTRAINT MODOCFISCALXCONFERENCIAS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK6 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPAINELCOMPRAXGRADE ADD CONSTRAINT MOPAINELCOMPRAXGRADE_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOMOTIVOSBLOQUEIOS ADD CONSTRAINT MOMOTIVOSBLOQUEIOS_FK7 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOINGRESSOS ADD CONSTRAINT MOINGRESSOS_FK1 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

CREATE TABLE CAPRODUTOS_2203 AS SELECT * FROM CAPRODUTOS;

ALTER TABLE CAPRODUTOXLENTESOCULOS DROP CONSTRAINT CAPRODUTOXLENTESOCULOS_FK1;
ALTER TABLE CAPRODUTOXINGRESSOS DROP CONSTRAINT CAPRODUTOXINGRESSOS_FK1;
ALTER TABLE CAPRODUTOXVALIDADESINGRES DROP CONSTRAINT CAPRODUTOXVALIDADESINGRES_FK1;
ALTER TABLE CAPRODUTOXALTURAS DROP CONSTRAINT CAPRODUTOXALTURAS_FK1;
ALTER TABLE CAPRODUTOXESTABELECIMENTO DROP CONSTRAINT CAPRODUTOXESTABELECIMENTO_FK1;
ALTER TABLE CAPRODUTOXFORNECEDORES DROP CONSTRAINT CAPRODUTOXFORNECEDORES_FK1;
ALTER TABLE CAPRODUTOXALTERNATIVOS DROP CONSTRAINT CAPRODUTOXALTERNATIVOS_FK1;
ALTER TABLE CAPRODUTOXALTERNATIVOS DROP CONSTRAINT CAPRODUTOXALTERNATIVOS_FK2;
ALTER TABLE CAPRODUTOXRELACIONADOS DROP CONSTRAINT CAPRODUTOXRELACIONADOS_FK1;
ALTER TABLE CAPRODUTOXRELACIONADOS DROP CONSTRAINT CAPRODUTOXRELACIONADOS_FK2;
ALTER TABLE CAPRODUTOXARQUIVOS DROP CONSTRAINT CAPRODUTOXARQUIVOS_FK1;
ALTER TABLE CAPRODUTOXCUSTOS DROP CONSTRAINT CAPRODUTOXCUSTOS_FK1;
ALTER TABLE PAFILTROPRODUTOXPRODUTOS DROP CONSTRAINT PAFILTROPRODUTOXPRODUTOS_FK2;
ALTER TABLE CAGRADESPRODUTO DROP CONSTRAINT CAGRADESPRODUTO_FK1;
ALTER TABLE CAPRODUTOXCOMPOSICOESPREC DROP CONSTRAINT CAPRODUTOXCOMPOSICOESPREC_FK1;
ALTER TABLE CATABELAPRECOXPRECOS DROP CONSTRAINT CATABELAPRECOXPRECOS_FK2;
ALTER TABLE CAPRODUTOXMARGEMMARKUP DROP CONSTRAINT CAPRODUTOXMARGEMMARKUP_FK1;
ALTER TABLE PAMETAXEXCECOES DROP CONSTRAINT PAMETAXEXCECOES_FK3;
ALTER TABLE PAREGRAPROMOCAOXPRODUTOS DROP CONSTRAINT PAREGRAPROMOCAOXPRODUTOS_FK2;
ALTER TABLE PAMVAS DROP CONSTRAINT PAMVAS_FK2;
ALTER TABLE PADESONERACOESFISCAIS DROP CONSTRAINT PADESONERACOESFISCAIS_FK2;
ALTER TABLE PAREGRASDISTRIBUICOES DROP CONSTRAINT PAREGRASDISTRIBUICOES_FK9;
ALTER TABLE PAABERTURASCOMPRA DROP CONSTRAINT PAABERTURASCOMPRA_FK9;
ALTER TABLE CAPRODUTOXCONTROLEENTREGA DROP CONSTRAINT CAPRODUTOXCONTROLEENTREGA_FK1;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK1;
ALTER TABLE MOPAINELCOMPRAXITENS DROP CONSTRAINT MOPAINELCOMPRAXITENS_FK3;

DROP TABLE CAPRODUTOS;

-- CAPRODUTOS
CREATE TABLE CAPRODUTOS
  (
    produto                      NUMERIC (7,0) DEFAULT 0 NOT NULL,
    descricao                    VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    subcategoriaProduto          NUMERIC (8,0) DEFAULT 0 NOT NULL,
    marca                        NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaA              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaB              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaC              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaD              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    caracteristicaE              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoA            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoB            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoC            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoD            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    exclusivoProdutoE            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    referencia                   VARCHAR (60) DEFAULT ' ' NOT NULL,
    gradeCor                     NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradeTamanho                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradePersonalizacao          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    controlaLote                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    diasValidadeLote             NUMERIC (6,0) DEFAULT 0 NOT NULL,
    controlaNumeroSerie          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    controleEstoque              NUMERIC (2,0) DEFAULT 0 NOT NULL,
    unidadeMedida                VARCHAR (6) DEFAULT ' ' NOT NULL,
    controleQuantidadeVenda      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedidaVenda           VARCHAR (6) DEFAULT ' ' NOT NULL,
    conversorQuantidadeVenda     NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimoVenda              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiploVenda            NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoLiquido                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    solicitaPesoLiquido          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    pesoBruto                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    solicitaPesoBruto            NUMERIC (1,0) 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,
    empilhamentoMaximoVolumes    NUMERIC (15,0) DEFAULT 0 NOT NULL,
    excecaoLocalizacao           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    obsoleto                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarECommerce              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    lancamento                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    vitrine                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    promocao                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    encomenda                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    gerarDOF                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoProduto                  CHAR (2) DEFAULT '  ' NOT NULL,
    origemMercadoria             CHAR (1) DEFAULT ' ' NOT NULL,
    valorSaidaMercadoriaInterest NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorParcelaImportada        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percentualCI                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    codigoFCI                    VARCHAR (36) DEFAULT ' ' NOT NULL,
    idNcm                        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    listaServicos                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    codigoProdutoAnp             NUMERIC (9,0) DEFAULT 0 NOT NULL,
    categoriaContabilProduto     NUMERIC (4,0) DEFAULT 0 NOT NULL,
    precoPautaTabelado           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    estabelecimentoFaturamento   NUMERIC (4,0) DEFAULT 0 NOT NULL,
    aplicacao                    VARCHAR (4000) DEFAULT ' ' NOT NULL,
    detalhamento                 VARCHAR (4000) DEFAULT ' ' NOT NULL,
    informacoesAdicionaisProduto VARCHAR (500) DEFAULT ' ' NOT NULL,
    metaTitulo                   VARCHAR (256) DEFAULT ' ' NOT NULL,
    metaDescription              VARCHAR (256) DEFAULT ' ' NOT NULL,
    metaKeywords                 VARCHAR (256) DEFAULT ' ' NOT NULL,
    observacoes                  VARCHAR (4000) DEFAULT ' ' NOT NULL,
    dataInclusao                 DATE,
    usuarioInclusao              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataAlteracao                DATE,
    usuarioAlteracao             NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_PK1 PRIMARY KEY (produto);
CREATE INDEX CAPRODUTOS_K2 ON CAPRODUTOS (descricao);
CREATE INDEX CAPRODUTOS_K3 ON CAPRODUTOS (referencia);
CREATE INDEX CAPRODUTOS_K4 ON CAPRODUTOS (subcategoriaProduto);
CREATE INDEX CAPRODUTOS_K5 ON CAPRODUTOS (marca);
CREATE INDEX CAPRODUTOS_K6 ON CAPRODUTOS (caracteristicaA);
CREATE INDEX CAPRODUTOS_K7 ON CAPRODUTOS (caracteristicaB);
CREATE INDEX CAPRODUTOS_K8 ON CAPRODUTOS (caracteristicaC);
CREATE INDEX CAPRODUTOS_K9 ON CAPRODUTOS (caracteristicaD);
CREATE INDEX CAPRODUTOS_K10 ON CAPRODUTOS (caracteristicaE);
CREATE INDEX CAPRODUTOS_K11 ON CAPRODUTOS (exclusivoProdutoA);
CREATE INDEX CAPRODUTOS_K12 ON CAPRODUTOS (exclusivoProdutoB);
CREATE INDEX CAPRODUTOS_K13 ON CAPRODUTOS (exclusivoProdutoC);
CREATE INDEX CAPRODUTOS_K14 ON CAPRODUTOS (exclusivoProdutoD);
CREATE INDEX CAPRODUTOS_K15 ON CAPRODUTOS (exclusivoProdutoE);
CREATE INDEX CAPRODUTOS_K16 ON CAPRODUTOS (controleEstoque);
CREATE INDEX CAPRODUTOS_K17 ON CAPRODUTOS (idNcm);
CREATE INDEX CAPRODUTOS_K18 ON CAPRODUTOS (listaServicos);
CREATE INDEX CAPRODUTOS_K19 ON CAPRODUTOS (codigoProdutoAnp);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK1 FOREIGN KEY (subcategoriaProduto) REFERENCES PASUBCATEGORIASPRODUTO (subcategoriaProduto);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK2 FOREIGN KEY (marca) REFERENCES PAMARCAS (marca);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK3 FOREIGN KEY (caracteristicaA) REFERENCES PACARACTERISTICASA (caracteristicaA);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK4 FOREIGN KEY (caracteristicaB) REFERENCES PACARACTERISTICASB (caracteristicaB);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK5 FOREIGN KEY (caracteristicaC) REFERENCES PACARACTERISTICASC (caracteristicaC);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK6 FOREIGN KEY (caracteristicaD) REFERENCES PACARACTERISTICASD (caracteristicaD);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK7 FOREIGN KEY (caracteristicaE) REFERENCES PACARACTERISTICASE (caracteristicaE);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK8 FOREIGN KEY (exclusivoProdutoA) REFERENCES PAEXCLUSIVOSPRODUTOA (exclusivoProdutoA);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK9 FOREIGN KEY (exclusivoProdutoB) REFERENCES PAEXCLUSIVOSPRODUTOB (exclusivoProdutoB);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK10 FOREIGN KEY (exclusivoProdutoC) REFERENCES PAEXCLUSIVOSPRODUTOC (exclusivoProdutoC);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK11 FOREIGN KEY (exclusivoProdutoD) REFERENCES PAEXCLUSIVOSPRODUTOD (exclusivoProdutoD);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK12 FOREIGN KEY (exclusivoProdutoE) REFERENCES PAEXCLUSIVOSPRODUTOE (exclusivoProdutoE);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK13 FOREIGN KEY (gradeCor) REFERENCES PAGRADESCOR (gradeCor);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK14 FOREIGN KEY (gradeTamanho) REFERENCES PAGRADESTAMANHO (gradeTamanho);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK15 FOREIGN KEY (gradePersonalizacao) REFERENCES PAGRADESPERSONALIZACAO (gradePersonalizacao);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK16 FOREIGN KEY (controleEstoque) REFERENCES SICONTROLESESTOQUE (controleEstoque);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK17 FOREIGN KEY (unidadeMedida) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK18 FOREIGN KEY (controleQuantidadeVenda) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK19 FOREIGN KEY (unidadeMedidaVenda) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK20 FOREIGN KEY (excecaoLocalizacao) REFERENCES PAEXCECOESLOCALIZACAO (excecaoLocalizacao);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK21 FOREIGN KEY (tipoProduto) REFERENCES SITIPOSPRODUTO (tipoProduto);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK22 FOREIGN KEY (origemMercadoria) REFERENCES SIORIGENSMERCADORIA (origemMercadoria);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK23 FOREIGN KEY (idNcm) REFERENCES SINCMS (idNcm);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK24 FOREIGN KEY (listaServicos) REFERENCES SILISTASERVICOS (listaServicos);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK25 FOREIGN KEY (codigoProdutoAnp) REFERENCES SICODIGOSPRODUTOSANP (codigoProdutoAnp);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK26 FOREIGN KEY (categoriaContabilProduto) REFERENCES PACATEGORIASCONTABEISPROD (categoriaContabilProduto);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK27 FOREIGN KEY (estabelecimentoFaturamento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK28 FOREIGN KEY (usuarioInclusao) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE CAPRODUTOS ADD CONSTRAINT CAPRODUTOS_FK29 FOREIGN KEY (usuarioAlteracao) REFERENCES CAUSUARIOS (usuario);

INSERT INTO CAPRODUTOS (produto, descricao, ativo, subcategoriaProduto, marca, caracteristicaA, caracteristicaB, caracteristicaC, caracteristicaD, caracteristicaE, exclusivoProdutoA, exclusivoProdutoB, exclusivoProdutoC, exclusivoProdutoD, exclusivoProdutoE, referencia, gradeCor, gradeTamanho, gradePersonalizacao, controlaLote, diasValidadeLote, controlaNumeroSerie, controleEstoque, unidadeMedida, controleQuantidadeVenda, unidadeMedidaVenda, conversorQuantidadeVenda, loteMinimoVenda, loteMultiploVenda, pesoLiquido, solicitaPesoLiquido, pesoBruto, solicitaPesoBruto, altura, largura, comprimento, empilhamentoMaximoVolumes, excecaoLocalizacao, obsoleto, enviarECommerce, lancamento, vitrine, promocao, encomenda, gerarDOF, tipoProduto, origemMercadoria, valorSaidaMercadoriaInterest, valorParcelaImportada, percentualCI, codigoFCI, idNcm, listaServicos, codigoProdutoAnp, categoriaContabilProduto, precoPautaTabelado, estabelecimentoFaturamento, aplicacao, detalhamento, informacoesAdicionaisProduto, metaTitulo, metaDescription, metaKeywords, observacoes, dataInclusao, usuarioInclusao, dataAlteracao, usuarioAlteracao) VALUES (0, 'SELECIONE', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, ' ', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '  ', ' ', 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, ' ', ' ', ' ', ' ', ' ', ' ', ' ', NULL, 0, NULL, 0);
INSERT INTO CAPRODUTOS (produto, descricao, ativo, subcategoriaProduto, marca, caracteristicaA, caracteristicaB, caracteristicaC, caracteristicaD, caracteristicaE, exclusivoProdutoA, exclusivoProdutoB, exclusivoProdutoC, exclusivoProdutoD, exclusivoProdutoE, referencia, gradeCor, gradeTamanho, gradePersonalizacao, controlaLote, diasValidadeLote, controlaNumeroSerie, controleEstoque, unidadeMedida, controleQuantidadeVenda, unidadeMedidaVenda, conversorQuantidadeVenda, loteMinimoVenda, loteMultiploVenda, pesoLiquido, solicitaPesoLiquido, pesoBruto, solicitaPesoBruto, altura, largura, comprimento, empilhamentoMaximoVolumes, excecaoLocalizacao, obsoleto, enviarECommerce, lancamento, vitrine, promocao, encomenda, gerarDOF, tipoProduto, origemMercadoria, valorSaidaMercadoriaInterest, valorParcelaImportada, percentualCI, codigoFCI, idNcm, listaServicos, codigoProdutoAnp, categoriaContabilProduto, precoPautaTabelado, estabelecimentoFaturamento, aplicacao, detalhamento, informacoesAdicionaisProduto, metaTitulo, metaDescription, metaKeywords, observacoes, dataInclusao, usuarioInclusao, dataAlteracao, usuarioAlteracao) SELECT produto, descricao, ativo, subcategoriaProduto, marca, caracteristicaA, caracteristicaB, caracteristicaC, caracteristicaD, caracteristicaE, exclusivoProdutoA, exclusivoProdutoB, exclusivoProdutoC, exclusivoProdutoD, exclusivoProdutoE, referencia, gradeCor, gradeTamanho, gradePersonalizacao, controlaLote, diasValidadeLote, controlaNumeroSerie, controleEstoque, unidadeMedida, controleQuantidadeVenda, unidadeMedidaVenda, conversorQuantidadeVenda, loteMinimoVenda, loteMultiploVenda, pesoLiquido, solicitaPesoLiquido, pesoBruto, solicitaPesoBruto, altura, largura, comprimento, empilhamentoMaximoVolumes, excecaoLocalizacao, obsoleto, 0, lancamento, vitrine, promocao, encomenda, gerarDOF, tipoProduto, origemMercadoria, 0, 0, 0, ' ', idNcm, listaServicos, codigoProdutoAnp, categoriaContabilProduto, precoPautaTabelado, estabelecimentoFaturamento, aplicacao, detalhamento, informacoesAdicionaisProduto, metaTitulo, metaDescription, metaKeywords, observacoes, dataInclusao, usuarioInclusao, dataAlteracao, usuarioAlteracao FROM CAPRODUTOS_2203 WHERE produto <> 0;

COMMIT;

ALTER TABLE CAPRODUTOXLENTESOCULOS ADD CONSTRAINT CAPRODUTOXLENTESOCULOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXINGRESSOS ADD CONSTRAINT CAPRODUTOXINGRESSOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXVALIDADESINGRES ADD CONSTRAINT CAPRODUTOXVALIDADESINGRES_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXALTURAS ADD CONSTRAINT CAPRODUTOXALTURAS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXESTABELECIMENTO ADD CONSTRAINT CAPRODUTOXESTABELECIMENTO_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXFORNECEDORES ADD CONSTRAINT CAPRODUTOXFORNECEDORES_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXALTERNATIVOS ADD CONSTRAINT CAPRODUTOXALTERNATIVOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXALTERNATIVOS ADD CONSTRAINT CAPRODUTOXALTERNATIVOS_FK2 FOREIGN KEY (produtoAlternativo) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXRELACIONADOS ADD CONSTRAINT CAPRODUTOXRELACIONADOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXRELACIONADOS ADD CONSTRAINT CAPRODUTOXRELACIONADOS_FK2 FOREIGN KEY (produtoRelacionado) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXARQUIVOS ADD CONSTRAINT CAPRODUTOXARQUIVOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCUSTOS ADD CONSTRAINT CAPRODUTOXCUSTOS_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAFILTROPRODUTOXPRODUTOS ADD CONSTRAINT PAFILTROPRODUTOXPRODUTOS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAGRADESPRODUTO ADD CONSTRAINT CAGRADESPRODUTO_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCOMPOSICOESPREC ADD CONSTRAINT CAPRODUTOXCOMPOSICOESPREC_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CATABELAPRECOXPRECOS ADD CONSTRAINT CATABELAPRECOXPRECOS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXMARGEMMARKUP ADD CONSTRAINT CAPRODUTOXMARGEMMARKUP_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAMETAXEXCECOES ADD CONSTRAINT PAMETAXEXCECOES_FK3 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAREGRAPROMOCAOXPRODUTOS ADD CONSTRAINT PAREGRAPROMOCAOXPRODUTOS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAMVAS ADD CONSTRAINT PAMVAS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PADESONERACOESFISCAIS ADD CONSTRAINT PADESONERACOESFISCAIS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAREGRASDISTRIBUICOES ADD CONSTRAINT PAREGRASDISTRIBUICOES_FK9 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE PAABERTURASCOMPRA ADD CONSTRAINT PAABERTURASCOMPRA_FK9 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CAPRODUTOXCONTROLEENTREGA ADD CONSTRAINT CAPRODUTOXCONTROLEENTREGA_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK1 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MOPAINELCOMPRAXITENS ADD CONSTRAINT MOPAINELCOMPRAXITENS_FK3 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);

CREATE TABLE MOFINANCEIROXBAIXAS_2203 AS SELECT * FROM MOFINANCEIROXBAIXAS;

ALTER TABLE MOBAIXAXBAIXAFINANCEIRO DROP CONSTRAINT MOBAIXAXBAIXAFINANCEIRO_FK1;
ALTER TABLE MOBAIXAXBAIXAFINANCEIRO DROP CONSTRAINT MOBAIXAXBAIXAFINANCEIRO_FK2;
ALTER TABLE MOBAIXAXNOVOFINANCEIRO DROP CONSTRAINT MOBAIXAXNOVOFINANCEIRO_FK1;
ALTER TABLE MOBAIXAFINANCXPREDOCUM DROP CONSTRAINT MOBAIXAFINANCXPREDOCUM_FK1;
ALTER TABLE MOBAIXAFINANCXDOCFISCAL DROP CONSTRAINT MOBAIXAFINANCXDOCFISCAL_FK1;
ALTER TABLE MOREPARCXBAIXAFINANC DROP CONSTRAINT MOREPARCXBAIXAFINANC_FK2;
ALTER TABLE MOCONCILIACOESCARTOES DROP CONSTRAINT MOCONCILIACOESCARTOES_FK9;

DROP TABLE MOFINANCEIROXBAIXAS;

-- MOFINANCEIROXBAIXAS
CREATE TABLE MOFINANCEIROXBAIXAS
  (
    idBaixaFinanceiro          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sessaoCaixa                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    fatoContabil               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    data                       DATE,
    contaFinanceira            VARCHAR (60) DEFAULT ' ' NOT NULL,
    pagamentoRecebimento       CHAR (1) DEFAULT ' ' NOT NULL,
    operacaoFinanceira         NUMERIC (2,0) DEFAULT 0 NOT NULL,
    cobranca                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    meioPagamento              NUMERIC (2,0) DEFAULT 0 NOT NULL,
    carteiraFinanceira         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    cotacao                    NUMERIC (12,4) DEFAULT 0 NOT NULL,
    valorBrutoIndexado         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorBruto                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorVariacaoIndexador     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosDeMora           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorTarifaCartao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontos             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrosAcrescimos      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquido               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baixaAutomatica            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unificadoReparcelado       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_PK1 PRIMARY KEY (idBaixaFinanceiro);
CREATE INDEX MOFINANCEIROXBAIXAS_K2 ON MOFINANCEIROXBAIXAS (idFinanceiro, idBaixaFinanceiro);
CREATE INDEX MOFINANCEIROXBAIXAS_K3 ON MOFINANCEIROXBAIXAS (estabelecimento);
CREATE INDEX MOFINANCEIROXBAIXAS_K4 ON MOFINANCEIROXBAIXAS (cobranca);
CREATE INDEX MOFINANCEIROXBAIXAS_K5 ON MOFINANCEIROXBAIXAS (sessaoCaixa, operacaoFinanceira);
CREATE INDEX MOFINANCEIROXBAIXAS_K6 ON MOFINANCEIROXBAIXAS (meioPagamento);
CREATE INDEX MOFINANCEIROXBAIXAS_K7 ON MOFINANCEIROXBAIXAS (data desc);
CREATE INDEX MOFINANCEIROXBAIXAS_K8 ON MOFINANCEIROXBAIXAS (fatoContabil);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK1 FOREIGN KEY (sessaoCaixa) REFERENCES MOSESSOESCAIXA (sessaoCaixa);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK2 FOREIGN KEY (fatoContabil) REFERENCES MOFATOSCONTABEIS (fatoContabil);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK3 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK4 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK5 FOREIGN KEY (contaFinanceira) REFERENCES PACONTASFINANCEIRAS (contaFinanceira);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK6 FOREIGN KEY (pagamentoRecebimento) REFERENCES SIPAGAMENTORECEBIMENTO (pagamentoRecebimento);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK7 FOREIGN KEY (operacaoFinanceira) REFERENCES SIOPERACOESFINANCEIRAS (operacaoFinanceira);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK8 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK9 FOREIGN KEY (meioPagamento) REFERENCES SIMEIOSPAGAMENTO (meioPagamento);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK10 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);

INSERT INTO MOFINANCEIROXBAIXAS (idBaixaFinanceiro, sessaoCaixa, fatoContabil, idFinanceiro, estabelecimento, data, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, cobranca, meioPagamento, carteiraFinanceira, cotacao, valorBrutoIndexado, valorBruto, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontos, valorOutrosAcrescimos, valorLiquido, baixaAutomatica, unificadoReparcelado, observacoes) VALUES (0, 0, 0, 0, 0, NULL, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MOFINANCEIROXBAIXAS (idBaixaFinanceiro, sessaoCaixa, fatoContabil, idFinanceiro, estabelecimento, data, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, cobranca, meioPagamento, carteiraFinanceira, cotacao, valorBrutoIndexado, valorBruto, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontos, valorOutrosAcrescimos, valorLiquido, baixaAutomatica, unificadoReparcelado, observacoes) SELECT idBaixaFinanceiro, sessaoCaixa, fatoContabil, idFinanceiro, estabelecimento, data, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, cobranca, meioPagamento, carteiraFinanceira, cotacao, valorBrutoIndexado, valorBruto, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontoAteVencimento + valorDescontoAntecipado + valorDescontoInformado, valorAcrescimoInformado, valorLiquido, baixaAutomatica, unificadoReparcelado, observacoes FROM MOFINANCEIROXBAIXAS_2203 WHERE idBaixaFinanceiro <> 0;

COMMIT;

ALTER TABLE MOBAIXAXBAIXAFINANCEIRO ADD CONSTRAINT MOBAIXAXBAIXAFINANCEIRO_FK1 FOREIGN KEY (idBaixaFinanceiro) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);
ALTER TABLE MOBAIXAXBAIXAFINANCEIRO ADD CONSTRAINT MOBAIXAXBAIXAFINANCEIRO_FK2 FOREIGN KEY (idBaixaFinanceiroCorrel) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);
ALTER TABLE MOBAIXAXNOVOFINANCEIRO ADD CONSTRAINT MOBAIXAXNOVOFINANCEIRO_FK1 FOREIGN KEY (idBaixaFinanceiro) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);
ALTER TABLE MOBAIXAFINANCXPREDOCUM ADD CONSTRAINT MOBAIXAFINANCXPREDOCUM_FK1 FOREIGN KEY (idBaixaFinanceiro) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);
ALTER TABLE MOBAIXAFINANCXDOCFISCAL ADD CONSTRAINT MOBAIXAFINANCXDOCFISCAL_FK1 FOREIGN KEY (idBaixaFinanceiro) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);
ALTER TABLE MOREPARCXBAIXAFINANC ADD CONSTRAINT MOREPARCXBAIXAFINANC_FK2 FOREIGN KEY (idBaixaFinanceiro) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);
ALTER TABLE MOCONCILIACOESCARTOES ADD CONSTRAINT MOCONCILIACOESCARTOES_FK9 FOREIGN KEY (idBaixaFinanceiro) REFERENCES MOFINANCEIROXBAIXAS (idBaixaFinanceiro);

DROP TABLE MOCAIXASBANCOS;
DROP TABLE MOSALDOSCAIXABANCO;

DELETE SITABELASSISTEMA WHERE tabelaSistema IN('MOSALDOSCAIXABANCO','MOCAIXASBANCOS'); 

COMMIT;

CREATE TABLE MOFINANCEIROS_2203 AS SELECT * FROM MOFINANCEIROS;

ALTER TABLE MOFINANCEIROXBOLETO DROP CONSTRAINT MOFINANCEIROXBOLETO_FK1;
ALTER TABLE MOFINANCEIROXCARTAO DROP CONSTRAINT MOFINANCEIROXCARTAO_FK1;
ALTER TABLE MOFINANCEIROXCARTPROPRIO DROP CONSTRAINT MOFINANCEIROXCARTPROPRIO_FK1;
ALTER TABLE MOFINANCEIROXCHEQUE DROP CONSTRAINT MOFINANCEIROXCHEQUE_FK1;
ALTER TABLE MOFINANCEIROXRATEIO DROP CONSTRAINT MOFINANCEIROXRATEIO_FK1;
ALTER TABLE MOFINANCEIROXCOMISSOES DROP CONSTRAINT MOFINANCEIROXCOMISSOES_FK1;
ALTER TABLE MOFINANCEIROXDOCUMENTOS DROP CONSTRAINT MOFINANCEIROXDOCUMENTOS_FK1;
ALTER TABLE MOFINANCEIROXCORRELATO DROP CONSTRAINT MOFINANCEIROXCORRELATO_FK1;
ALTER TABLE MOFINANCEIROXCORRELATO DROP CONSTRAINT MOFINANCEIROXCORRELATO_FK2;
ALTER TABLE MOFINANCEIROXARQUIVOS DROP CONSTRAINT MOFINANCEIROXARQUIVOS_FK1;
ALTER TABLE MOFINANCEIROXBAIXAS DROP CONSTRAINT MOFINANCEIROXBAIXAS_FK3;
ALTER TABLE MOBAIXAXNOVOFINANCEIRO DROP CONSTRAINT MOBAIXAXNOVOFINANCEIRO_FK2;
ALTER TABLE MONEGDIVIDAXFINANCEIROS DROP CONSTRAINT MONEGDIVIDAXFINANCEIROS_FK2;
ALTER TABLE MOREPARCXFINANCEIROS DROP CONSTRAINT MOREPARCXFINANCEIROS_FK2;
ALTER TABLE MOSPCREGISTROXFINANCEIROS DROP CONSTRAINT MOSPCREGISTROXFINANCEIROS_FK2;
ALTER TABLE MOHISTORICOCOBRANCA DROP CONSTRAINT MOHISTORICOCOBRANCA_FK7;
ALTER TABLE MOPONTUACOES DROP CONSTRAINT MOPONTUACOES_FK5;
ALTER TABLE MOCONCILIACOESCARTOES DROP CONSTRAINT MOCONCILIACOESCARTOES_FK8;
ALTER TABLE MOORCAMENTOXPAGAMENTOS DROP CONSTRAINT MOORCAMENTOXPAGAMENTOS_FK7;
ALTER TABLE MOPREVFINANCXFINANCEIRO DROP CONSTRAINT MOPREVFINANCXFINANCEIRO_FK2;
ALTER TABLE MOTRANSACOESTEF DROP CONSTRAINT MOTRANSACOESTEF_FK6;
ALTER TABLE MODOCUMENTOSTROCA DROP CONSTRAINT MODOCUMENTOSTROCA_FK4;
ALTER TABLE MOMOTBLOQXFINANCEIROS DROP CONSTRAINT MOMOTBLOQXFINANCEIROS_FK2;
ALTER TABLE MOEVENTOS DROP CONSTRAINT MOEVENTOS_FK6;

DROP TABLE MOFINANCEIROS;

-- MOFINANCEIROS
CREATE TABLE MOFINANCEIROS
  (
    idFinanceiro                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sessaoCaixa                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    fatoContabil                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    data                           DATE,
    dataEmissao                    DATE,
    prazoPadrao                    NUMERIC (6,0) DEFAULT 0 NOT NULL,
    prazo                          NUMERIC (6,0) DEFAULT 0 NOT NULL,
    vencimento                     DATE,
    vencimentoNegociado            DATE,
    previsaoCompensacao            DATE,
    naoCobrarJurosMultaAte         DATE,
    contaFinanceira                VARCHAR (60) DEFAULT ' ' NOT NULL,
    pagamentoRecebimento           CHAR (1) DEFAULT ' ' NOT NULL,
    operacaoFinanceira             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    complemento                    VARCHAR (500) DEFAULT ' ' NOT NULL,
    contratoCompra                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPagamentoPreDocumento        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPagamentoDocFiscal           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documento                      VARCHAR (60) DEFAULT ' ' NOT NULL,
    fatura                         VARCHAR (60) DEFAULT ' ' NOT NULL,
    parcelaAtual                   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    parcelasTotais                 NUMERIC (3,0) DEFAULT 0 NOT NULL,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    autorizadoPessoa               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cobranca                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    meioPagamento                  NUMERIC (2,0) DEFAULT 0 NOT NULL,
    carteiraFinanceira             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    valor                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimo                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    indexador                      VARCHAR (10) DEFAULT ' ' NOT NULL,
    cotacao                        NUMERIC (12,4) DEFAULT 0 NOT NULL,
    valorIndexado                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    saldoIndexado                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    efetivado                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tarifaDescontoAteVencimento    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoPagamentoAntecipado        CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalDescontoAntecipado NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoJuroDeMora                 CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalJuroDeMora         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMulta                    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorFixoMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    desconsiderarSPC               NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_PK1 PRIMARY KEY (idFinanceiro);
CREATE INDEX MOFINANCEIROS_K2 ON MOFINANCEIROS (idPagamentoPreDocumento, parcelaAtual);
CREATE INDEX MOFINANCEIROS_K3 ON MOFINANCEIROS (idPagamentoDocFiscal, parcelaAtual);
CREATE INDEX MOFINANCEIROS_K4 ON MOFINANCEIROS (idPagamentoPreDocumento);
CREATE INDEX MOFINANCEIROS_K5 ON MOFINANCEIROS (contratoCompra, parcelaAtual);
CREATE INDEX MOFINANCEIROS_K6 ON MOFINANCEIROS (idPagamentoDocFiscal);
CREATE INDEX MOFINANCEIROS_K7 ON MOFINANCEIROS (estabelecimento);
CREATE INDEX MOFINANCEIROS_K8 ON MOFINANCEIROS (pessoa);
CREATE INDEX MOFINANCEIROS_K9 ON MOFINANCEIROS (cobranca);
CREATE INDEX MOFINANCEIROS_K10 ON MOFINANCEIROS (sessaoCaixa);
CREATE INDEX MOFINANCEIROS_K11 ON MOFINANCEIROS (meioPagamento);
CREATE INDEX MOFINANCEIROS_K12 ON MOFINANCEIROS (vencimento desc);
CREATE INDEX MOFINANCEIROS_K13 ON MOFINANCEIROS (contratoCompra, pessoa, parcelaAtual);
CREATE INDEX MOFINANCEIROS_K14 ON MOFINANCEIROS (documento);
CREATE INDEX MOFINANCEIROS_K15 ON MOFINANCEIROS (efetivado);
CREATE INDEX MOFINANCEIROS_K16 ON MOFINANCEIROS (fatoContabil);
CREATE INDEX MOFINANCEIROS_K50 ON MOFINANCEIROS (TRUNC(dataEmissao));
CREATE INDEX MOFINANCEIROS_K51 ON MOFINANCEIROS (TRUNC(vencimento));

ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK1 FOREIGN KEY (sessaoCaixa) REFERENCES MOSESSOESCAIXA (sessaoCaixa);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK2 FOREIGN KEY (fatoContabil) REFERENCES MOFATOSCONTABEIS (fatoContabil);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK3 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK4 FOREIGN KEY (contaFinanceira) REFERENCES PACONTASFINANCEIRAS (contaFinanceira);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK5 FOREIGN KEY (pagamentoRecebimento) REFERENCES SIPAGAMENTORECEBIMENTO (pagamentoRecebimento);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK6 FOREIGN KEY (operacaoFinanceira) REFERENCES SIOPERACOESFINANCEIRAS (operacaoFinanceira);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK7 FOREIGN KEY (idPagamentoPreDocumento) REFERENCES MOPREDOCUMXPAGAMENTOS (idPagamentoPreDocumento);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK8 FOREIGN KEY (idPagamentoDocFiscal) REFERENCES MODOCFISCALXPAGAMENTOS (idPagamentoDocFiscal);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK9 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK10 FOREIGN KEY (autorizadoPessoa) REFERENCES CAAUTORIZADOSPESSOA (autorizadoPessoa);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK11 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK12 FOREIGN KEY (meioPagamento) REFERENCES SIMEIOSPAGAMENTO (meioPagamento);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK13 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK14 FOREIGN KEY (indexador) REFERENCES PAINDEXADORES (indexador);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK15 FOREIGN KEY (tipoPagamentoAntecipado) REFERENCES SITIPOSPAGAMENTOANTECIPAD (tipoPagamentoAntecipado);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK16 FOREIGN KEY (tipoJuroDeMora) REFERENCES SITIPOSJUROS (tipoJuros);

INSERT INTO MOFINANCEIROS (idFinanceiro, sessaoCaixa, fatoContabil, estabelecimento, data, dataEmissao, prazoPadrao, prazo, vencimento, vencimentoNegociado, naoCobrarJurosMultaAte, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, complemento, contratoCompra, idPagamentoPreDocumento, idPagamentoDocFiscal, documento, fatura, parcelaAtual, parcelasTotais, pessoa, autorizadoPessoa, cobranca, meioPagamento, carteiraFinanceira, valor, valorDesconto, valorAcrescimo, saldo, indexador, cotacao, valorIndexado, saldoIndexado, efetivado, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, valorFixoMulta, desconsiderarSPC) VALUES (0, 0, 0, 0, NULL, NULL, 0, 0, NULL, NULL, NULL, ' ', ' ', 0, ' ', 0, 0, 0, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, ' ', 0, ' ', 0, 0, 0, 0);
INSERT INTO MOFINANCEIROS (idFinanceiro, sessaoCaixa, fatoContabil, estabelecimento, data, dataEmissao, prazoPadrao, prazo, vencimento, vencimentoNegociado, naoCobrarJurosMultaAte, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, complemento, contratoCompra, idPagamentoPreDocumento, idPagamentoDocFiscal, documento, fatura, parcelaAtual, parcelasTotais, pessoa, autorizadoPessoa, cobranca, meioPagamento, carteiraFinanceira, valor, valorDesconto, valorAcrescimo, saldo, indexador, cotacao, valorIndexado, saldoIndexado, efetivado, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, valorFixoMulta, desconsiderarSPC) SELECT idFinanceiro, sessaoCaixa, fatoContabil, estabelecimento, data, dataEmissao, prazoPadrao, prazo, vencimento, vencimentoNegociado, naoCobrarJurosMultaAte, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, complemento, contratoCompra, idPagamentoPreDocumento, idPagamentoDocFiscal, documento, fatura, parcelaAtual, parcelasTotais, pessoa, autorizadoPessoa, cobranca, meioPagamento, carteiraFinanceira, valor, 0, 0, saldo, indexador, cotacao, valorIndexado, saldoIndexado, efetivado, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, 0, CASE WHEN statusSpc = 6 THEN 1 ELSE 0 END FROM MOFINANCEIROS_2203 WHERE idFinanceiro <> 0;

COMMIT;

ALTER TABLE MOFINANCEIROXBOLETO ADD CONSTRAINT MOFINANCEIROXBOLETO_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXCARTAO ADD CONSTRAINT MOFINANCEIROXCARTAO_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXCARTPROPRIO ADD CONSTRAINT MOFINANCEIROXCARTPROPRIO_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXCHEQUE ADD CONSTRAINT MOFINANCEIROXCHEQUE_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXRATEIO ADD CONSTRAINT MOFINANCEIROXRATEIO_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXCOMISSOES ADD CONSTRAINT MOFINANCEIROXCOMISSOES_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXDOCUMENTOS ADD CONSTRAINT MOFINANCEIROXDOCUMENTOS_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXCORRELATO ADD CONSTRAINT MOFINANCEIROXCORRELATO_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXCORRELATO ADD CONSTRAINT MOFINANCEIROXCORRELATO_FK2 FOREIGN KEY (idFinanceiroCorrelato) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXARQUIVOS ADD CONSTRAINT MOFINANCEIROXARQUIVOS_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK3 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOBAIXAXNOVOFINANCEIRO ADD CONSTRAINT MOBAIXAXNOVOFINANCEIRO_FK2 FOREIGN KEY (idNovoFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MONEGDIVIDAXFINANCEIROS ADD CONSTRAINT MONEGDIVIDAXFINANCEIROS_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOREPARCXFINANCEIROS ADD CONSTRAINT MOREPARCXFINANCEIROS_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOSPCREGISTROXFINANCEIROS ADD CONSTRAINT MOSPCREGISTROXFINANCEIROS_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOHISTORICOCOBRANCA ADD CONSTRAINT MOHISTORICOCOBRANCA_FK7 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOPONTUACOES ADD CONSTRAINT MOPONTUACOES_FK5 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOCONCILIACOESCARTOES ADD CONSTRAINT MOCONCILIACOESCARTOES_FK8 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOORCAMENTOXPAGAMENTOS ADD CONSTRAINT MOORCAMENTOXPAGAMENTOS_FK7 FOREIGN KEY (idFinanceiroAdiantamento) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOPREVFINANCXFINANCEIRO ADD CONSTRAINT MOPREVFINANCXFINANCEIRO_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOTRANSACOESTEF ADD CONSTRAINT MOTRANSACOESTEF_FK6 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MODOCUMENTOSTROCA ADD CONSTRAINT MODOCUMENTOSTROCA_FK4 FOREIGN KEY (idFinanceiroAdiantamento) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOMOTBLOQXFINANCEIROS ADD CONSTRAINT MOMOTBLOQXFINANCEIROS_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK6 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);

DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MOSPCREGISTROXFINANCEIROS';

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOSPCREGISTROS', 'SPC Registros', 1, 50507, 'MO', 'idRegistroSpc', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 

COMMIT;

CREATE TABLE MOSPCREGISTROS_2203 AS SELECT * FROM MOSPCREGISTROS;
CREATE TABLE MOSPCREGISTROXFINANCEIROS_2203 AS SELECT * FROM MOSPCREGISTROXFINANCEIROS;

DROP TABLE MOSPCREGISTROXFINANCEIROS;
DROP TABLE MOSPCREGISTROS;

-- MOSPCREGISTROS
CREATE TABLE MOSPCREGISTROS
  (
    idRegistroSpc      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pessoa             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    data               DATE,
    vencimento         DATE,
    documento          VARCHAR (60) DEFAULT ' ' NOT NULL,
    valor              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    entidadeSPC        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    motivoRegistroSPC  CHAR (1) DEFAULT ' ' NOT NULL,
    usuarioRegistroSPC NUMERIC (14,0) DEFAULT 0 NOT NULL,
    removidoSPC        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    dataRegistroSPC    DATE,
    motivoExclusaoSPC  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    usuarioExclusaoSPC NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataExclusaoSPC    DATE,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_PK1 PRIMARY KEY (idRegistroSpc);
CREATE INDEX MOSPCREGISTROS_K2 ON MOSPCREGISTROS (idFinanceiro);
CREATE INDEX MOSPCREGISTROS_K3 ON MOSPCREGISTROS (pessoa);
CREATE INDEX MOSPCREGISTROS_K4 ON MOSPCREGISTROS (estabelecimento);
CREATE INDEX MOSPCREGISTROS_K5 ON MOSPCREGISTROS (data);
CREATE INDEX MOSPCREGISTROS_K6 ON MOSPCREGISTROS (vencimento);
CREATE INDEX MOSPCREGISTROS_K7 ON MOSPCREGISTROS (documento);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK2 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK3 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK4 FOREIGN KEY (entidadeSPC) REFERENCES SISPCENTIDADES (entidadeSPC);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK5 FOREIGN KEY (motivoRegistroSPC) REFERENCES SISPCMOTIVOSREGISTRO (motivoRegistroSPC);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK6 FOREIGN KEY (usuarioRegistroSPC) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK7 FOREIGN KEY (motivoExclusaoSPC) REFERENCES SISPCMOTIVOSEXCLUSAO (motivoExclusaoSPC);
ALTER TABLE MOSPCREGISTROS ADD CONSTRAINT MOSPCREGISTROS_FK8 FOREIGN KEY (usuarioExclusaoSPC) REFERENCES CAUSUARIOS (usuario);

INSERT INTO MOSPCREGISTROS (idRegistroSpc, idFinanceiro, pessoa, estabelecimento, data, vencimento, documento, valor, entidadeSPC, motivoRegistroSPC, usuarioRegistroSPC, dataRegistroSPC, removidoSPC, motivoExclusaoSPC, usuarioExclusaoSPC, dataExclusaoSPC, observacoes) VALUES (0, 0, 0, 0, NULL, NULL, ' ', 0, 0, ' ', 0, NULL, 0, 0, 0, NULL, ' ');
INSERT INTO MOSPCREGISTROS (idRegistroSpc, idFinanceiro, pessoa, estabelecimento, data, vencimento, documento, valor, entidadeSPC, motivoRegistroSPC, usuarioRegistroSPC, dataRegistroSPC, removidoSPC, motivoExclusaoSPC, usuarioExclusaoSPC, dataExclusaoSPC, observacoes) SELECT idRegistroSpc, 0, pessoa, estabelecimento, data, vencimento, documento, valor, entidadeSPC, motivoRegistroSPC, 0, dataRegistroSPC, CASE WHEN statusSpc > 4 THEN 1 ELSE 0 END, motivoExclusaoSPC, 0, dataExclusaoSPC, observacoes FROM MOSPCREGISTROS_2203 a WHERE idRegistroSpc <> 0;
INSERT INTO MOSPCREGISTROS (idRegistroSpc, idFinanceiro, pessoa, estabelecimento, data, vencimento, documento, valor, entidadeSPC, motivoRegistroSPC, usuarioRegistroSPC, dataRegistroSPC, removidoSPC, motivoExclusaoSPC, usuarioExclusaoSPC, dataExclusaoSPC, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOSPCREGISTROS', 'idRegistroSpc', 0, 1, NULL), a.idFinanceiro, a.pessoa, a.estabelecimento, a.data, a.vencimento, a.documento, a.valor, COALESCE((SELECT MIN(b.entidadeSPC) from PASPCCONEXOES b WHERE b.estabelecimento = a.estabelecimento),0), 'C', 0, a.dataRegistroSPC, CASE WHEN a.statusSpc > 4 THEN 1 ELSE 0 END, CASE WHEN a.statusSpc = 5 THEN 1 ELSE 0 END, 0, a.dataRemovidoSPC, ' ' FROM MOFINANCEIROS_2203 a WHERE a.idFinanceiro <> 0 AND a.statusSpc in (4,5);

COMMIT;

UPDATE PAMEMORIASISTEMAXUSUARIOS SET memoriaSistema = 0 WHERE memoriaSistema <> 0;

DELETE PAPERSCAMPOSXCONTEUDOS WHERE personalizacaoCampo = 158;
UPDATE SIPERSONALIZACOESCAMPOS SET descricao = 'Desconsiderar SPC', tipoCampo = 'L', exibirCampo = 'E', nomeCampoSugestao = 'Desconsiderar SPC', tabelaSistema = ' ' WHERE personalizacaoCampo = 158;

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 224;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 224;
DELETE PAMENUXCAMPOSPESQUISA WHERE menu = 224;
DELETE PAMENUXPERMISSOES WHERE menu = 224;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 224;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 224;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 224;
DELETE SIMENUS WHERE menu = 224;

COMMIT;

UPDATE MOSINCRONIZACOES SET tabelaSistema = ' ' WHERE tabelaSistema = 'SISTATUSSPC';
UPDATE MOLOGSTABELA SET tabelaSistema = ' ' WHERE tabelaSistema = 'SISTATUSSPC';
UPDATE PAPERSONALIZACOESPROJETO SET tabelaSistema = ' ' WHERE tabelaSistema = 'SISTATUSSPC';
DELETE SITABELASSISTEMA WHERE tabelaSistema = 'SISTATUSSPC';

COMMIT;

ALTER TABLE PAMEMORIASISTEMAXUSUARIOS DROP CONSTRAINT PAMEMORIASISTEMAXUSUARIOS_FK1;
ALTER TABLE PAMEMORIASISTEMAXUSUARIOS ADD CONSTRAINT PAMEMORIASISTEMAXUSUARIOS_FK1 FOREIGN KEY (memoriaSistema) REFERENCES SIMEMORIASSISTEMA (memoriaSistema);

CREATE TABLE MOPREVISOESFINANCEIRAS_2203 AS SELECT * FROM MOPREVISOESFINANCEIRAS;

ALTER TABLE MOPREVFINANCXFINANCEIRO DROP CONSTRAINT MOPREVFINANCXFINANCEIRO_FK1;
ALTER TABLE MOMOTBLOQXPREVISOESFINANC DROP CONSTRAINT MOMOTBLOQXPREVISOESFINANC_FK2;

DROP TABLE MOPREVISOESFINANCEIRAS;

-- MOPREVISOESFINANCEIRAS
CREATE TABLE MOPREVISOESFINANCEIRAS
  (
    idPrevisaoFinanceira           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEmissao                    DATE,
    prazoPadrao                    NUMERIC (6,0) DEFAULT 0 NOT NULL,
    prazo                          NUMERIC (6,0) DEFAULT 0 NOT NULL,
    vencimento                     DATE,
    contaFinanceira                VARCHAR (60) DEFAULT ' ' NOT NULL,
    pagamentoRecebimento           CHAR (1) DEFAULT ' ' NOT NULL,
    operacaoFinanceira             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    complemento                    VARCHAR (500) DEFAULT ' ' NOT NULL,
    idPagamentoOrcamento           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documento                      VARCHAR (60) DEFAULT ' ' NOT NULL,
    fatura                         VARCHAR (60) DEFAULT ' ' NOT NULL,
    parcelaAtual                   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    parcelasTotais                 NUMERIC (3,0) DEFAULT 0 NOT NULL,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    autorizadoPessoa               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cobranca                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    meioPagamento                  NUMERIC (2,0) DEFAULT 0 NOT NULL,
    carteiraFinanceira             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    valor                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    indexador                      VARCHAR (10) DEFAULT ' ' NOT NULL,
    cotacao                        NUMERIC (12,4) DEFAULT 0 NOT NULL,
    valorIndexado                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    saldoIndexado                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    efetivado                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tarifaDescontoAteVencimento    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoPagamentoAntecipado        CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalDescontoAntecipado NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoJuroDeMora                 CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalJuroDeMora         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMulta                    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorFixoMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    tarifaCartao                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorTarifaCartao              NUMERIC (15,2) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_PK1 PRIMARY KEY (idPrevisaoFinanceira);
CREATE INDEX MOPREVISOESFINANCEIRAS_K2 ON MOPREVISOESFINANCEIRAS (idPagamentoOrcamento, parcelaAtual);
CREATE INDEX MOPREVISOESFINANCEIRAS_K3 ON MOPREVISOESFINANCEIRAS (cobranca, pagamentoRecebimento, efetivado, meioPagamento, vencimento, idPrevisaoFinanceira);
CREATE INDEX MOPREVISOESFINANCEIRAS_K4 ON MOPREVISOESFINANCEIRAS (vencimento, dataEmissao, idPrevisaoFinanceira);
CREATE INDEX MOPREVISOESFINANCEIRAS_K5 ON MOPREVISOESFINANCEIRAS (estabelecimento);
CREATE INDEX MOPREVISOESFINANCEIRAS_K6 ON MOPREVISOESFINANCEIRAS (pessoa);
CREATE INDEX MOPREVISOESFINANCEIRAS_K7 ON MOPREVISOESFINANCEIRAS (cobranca);
CREATE INDEX MOPREVISOESFINANCEIRAS_K8 ON MOPREVISOESFINANCEIRAS (idPagamentoOrcamento);
CREATE INDEX MOPREVISOESFINANCEIRAS_K9 ON MOPREVISOESFINANCEIRAS (documento);
CREATE INDEX MOPREVISOESFINANCEIRAS_K10 ON MOPREVISOESFINANCEIRAS (efetivado);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK2 FOREIGN KEY (contaFinanceira) REFERENCES PACONTASFINANCEIRAS (contaFinanceira);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK3 FOREIGN KEY (pagamentoRecebimento) REFERENCES SIPAGAMENTORECEBIMENTO (pagamentoRecebimento);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK4 FOREIGN KEY (operacaoFinanceira) REFERENCES SIOPERACOESFINANCEIRAS (operacaoFinanceira);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK5 FOREIGN KEY (idPagamentoOrcamento) REFERENCES MOORCAMENTOXPAGAMENTOS (idPagamentoOrcamento);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK6 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK7 FOREIGN KEY (autorizadoPessoa) REFERENCES CAAUTORIZADOSPESSOA (autorizadoPessoa);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK8 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK9 FOREIGN KEY (meioPagamento) REFERENCES SIMEIOSPAGAMENTO (meioPagamento);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK10 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK11 FOREIGN KEY (indexador) REFERENCES PAINDEXADORES (indexador);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK12 FOREIGN KEY (tipoPagamentoAntecipado) REFERENCES SITIPOSPAGAMENTOANTECIPAD (tipoPagamentoAntecipado);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK13 FOREIGN KEY (tipoJuroDeMora) REFERENCES SITIPOSJUROS (tipoJuros);

INSERT INTO MOPREVISOESFINANCEIRAS (idPrevisaoFinanceira, estabelecimento, dataEmissao, prazoPadrao, prazo, vencimento, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, complemento, idPagamentoOrcamento, documento, fatura, parcelaAtual, parcelasTotais, pessoa, autorizadoPessoa, cobranca, meioPagamento, carteiraFinanceira, valor, saldo, indexador, cotacao, valorIndexado, saldoIndexado, efetivado, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, valorFixoMulta, tarifaCartao, valorTarifaCartao) VALUES (0, 0, NULL, 0, 0, NULL, ' ', ' ', 0, ' ', 0, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, ' ', 0, ' ', 0, 0, 0, 0, 0);
INSERT INTO MOPREVISOESFINANCEIRAS (idPrevisaoFinanceira, estabelecimento, dataEmissao, prazoPadrao, prazo, vencimento, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, complemento, idPagamentoOrcamento, documento, fatura, parcelaAtual, parcelasTotais, pessoa, autorizadoPessoa, cobranca, meioPagamento, carteiraFinanceira, valor, saldo, indexador, cotacao, valorIndexado, saldoIndexado, efetivado, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, valorFixoMulta, tarifaCartao, valorTarifaCartao) SELECT idPrevisaoFinanceira, estabelecimento, dataEmissao, prazoPadrao, prazo, vencimento, contaFinanceira, pagamentoRecebimento, operacaoFinanceira, complemento, idPagamentoOrcamento, documento, fatura, parcelaAtual, parcelasTotais, pessoa, autorizadoPessoa, cobranca, meioPagamento, carteiraFinanceira, valor, saldo, indexador, cotacao, valorIndexado, saldoIndexado, efetivado, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, 0, tarifaCartao, valorTarifaCartao FROM MOPREVISOESFINANCEIRAS_2203 WHERE idPrevisaoFinanceira <> 0;

COMMIT;

ALTER TABLE MOPREVFINANCXFINANCEIRO ADD CONSTRAINT MOPREVFINANCXFINANCEIRO_FK1 FOREIGN KEY (idPrevisaoFinanceira) REFERENCES MOPREVISOESFINANCEIRAS (idPrevisaoFinanceira);
ALTER TABLE MOMOTBLOQXPREVISOESFINANC ADD CONSTRAINT MOMOTBLOQXPREVISOESFINANC_FK2 FOREIGN KEY (idPrevisaoFinanceira) REFERENCES MOPREVISOESFINANCEIRAS (idPrevisaoFinanceira);

CREATE TABLE PACONDICOESPAGAMENTO_2203 AS SELECT * FROM PACONDICOESPAGAMENTO;

ALTER TABLE CACLIENTES DROP CONSTRAINT CACLIENTES_FK4;
ALTER TABLE CAFORNECEDORES DROP CONSTRAINT CAFORNECEDORES_FK2;
ALTER TABLE PACONDPAGAMXPARCELAS DROP CONSTRAINT PACONDPAGAMXPARCELAS_FK1;
ALTER TABLE PACONDPAGAMXBANDEIRASCART DROP CONSTRAINT PACONDPAGAMXBANDEIRASCART_FK2;
ALTER TABLE PACONDPAGAMXFILTROSPRODUT DROP CONSTRAINT PACONDPAGAMXFILTROSPRODUT_FK1;
ALTER TABLE PAFILTROPAGAMENTOXCONDPAG DROP CONSTRAINT PAFILTROPAGAMENTOXCONDPAG_FK2;
ALTER TABLE PACONDICOESPAGAMENTOAUTO DROP CONSTRAINT PACONDICOESPAGAMENTOAUTO_FK1;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK30;
ALTER TABLE MOPREDOCUMENTOS DROP CONSTRAINT MOPREDOCUMENTOS_FK33;
ALTER TABLE MOPREDOCUMXPAGAMENTOS DROP CONSTRAINT MOPREDOCUMXPAGAMENTOS_FK5;
ALTER TABLE MODOCUMENTOSFISCAIS DROP CONSTRAINT MODOCUMENTOSFISCAIS_FK39;
ALTER TABLE MODOCFISCALXPAGAMENTOS DROP CONSTRAINT MODOCFISCALXPAGAMENTOS_FK5;
ALTER TABLE MOREPARCXPAGAMENTOS DROP CONSTRAINT MOREPARCXPAGAMENTOS_FK5;
ALTER TABLE MOORCAMENTOXPAGAMENTOS DROP CONSTRAINT MOORCAMENTOXPAGAMENTOS_FK5;
ALTER TABLE MOMOTIVOSBLOQUEIOS DROP CONSTRAINT MOMOTIVOSBLOQUEIOS_FK5;

DROP TABLE PACONDICOESPAGAMENTO;

-- PACONDICOESPAGAMENTO
CREATE TABLE PACONDICOESPAGAMENTO
  (
    condicaoPagamento              NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                      VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                      NUMERIC (11,0) DEFAULT 0 NOT NULL,
    categoriaPagamento             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    meioPagamento                  NUMERIC (2,0) DEFAULT 0 NOT NULL,
    contaFinanceira                VARCHAR (60) DEFAULT ' ' NOT NULL,
    carteiraFinanceira             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    tipoJuroRemuneratorio          CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalJuroRemuneratorio  NUMERIC (15,8) DEFAULT 0 NOT NULL,
    percOutrasDespesas             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoArredondamentoPreco        CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaDescontoAteVencimento    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoPagamentoAntecipado        CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalDescontoAntecipado NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoJuroDeMora                 CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalJuroDeMora         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMulta                    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorFixoMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    diasToleranciaJurosMulta       NUMERIC (6,0) DEFAULT 0 NOT NULL,
    tipoEntradaPagamento           CHAR (1) DEFAULT ' ' NOT NULL,
    percEntradaMinima              NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoVencimento                 CHAR (1) DEFAULT ' ' NOT NULL,
    selecionaNumeroParcelas        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    diaFixoPagamento               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    diasToleranciaEdicaoVencimento NUMERIC (6,0) DEFAULT 0 NOT NULL,
    freteSeguroPrimeiraParcela     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ipiPrimeiraParcela             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    permiteEditarValores           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    valorMinimo                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorMaximo                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    parcelaMinima                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    parcelaMaxima                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    dataValidadeInicial            DATE,
    dataValidadeFinal              DATE,
    validoVenda                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoTroco                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoDevolucaoVenda           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoCompra                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoDevolucaoCompra          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoRecebimento              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoPagamento                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoReparcelamentoReceber    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoReparcelamentoPagar      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoOrcamento                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoPreDocumento             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoDocumentoFiscal          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitaDigitadoMagneticoTef   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    parceladoAdministradoraTef     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    filtroCabecalho                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    observacoes                    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_PK1 PRIMARY KEY (condicaoPagamento);
CREATE INDEX PACONDICOESPAGAMENTO_K2 ON PACONDICOESPAGAMENTO (descricao);
CREATE INDEX PACONDICOESPAGAMENTO_K3 ON PACONDICOESPAGAMENTO (ordenacao, condicaoPagamento);
CREATE INDEX PACONDICOESPAGAMENTO_K4 ON PACONDICOESPAGAMENTO (meioPagamento, ordenacao, condicaoPagamento);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK1 FOREIGN KEY (categoriaPagamento) REFERENCES PACATEGORIASPAGAMENTO (categoriaPagamento);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK2 FOREIGN KEY (meioPagamento) REFERENCES SIMEIOSPAGAMENTO (meioPagamento);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK3 FOREIGN KEY (contaFinanceira) REFERENCES PACONTASFINANCEIRAS (contaFinanceira);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK4 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK5 FOREIGN KEY (tipoJuroRemuneratorio) REFERENCES SITIPOSJUROS (tipoJuros);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK6 FOREIGN KEY (tipoArredondamentoPreco) REFERENCES SITIPOSARREDONDAMENTOPREC (tipoArredondamentoPreco);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK7 FOREIGN KEY (tipoPagamentoAntecipado) REFERENCES SITIPOSPAGAMENTOANTECIPAD (tipoPagamentoAntecipado);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK8 FOREIGN KEY (tipoJuroDeMora) REFERENCES SITIPOSJUROS (tipoJuros);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK9 FOREIGN KEY (tipoEntradaPagamento) REFERENCES SITIPOSENTRADAPAGAMENTO (tipoEntradaPagamento);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK10 FOREIGN KEY (tipoVencimento) REFERENCES SITIPOSVENCIMENTOS (tipoVencimento);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK11 FOREIGN KEY (filtroCabecalho) REFERENCES PAFILTROSCABECALHO (filtroCabecalho);

INSERT INTO PACONDICOESPAGAMENTO (condicaoPagamento, descricao, ativo, ordenacao, categoriaPagamento, meioPagamento, contaFinanceira, carteiraFinanceira, tipoJuroRemuneratorio, tarifaMensalJuroRemuneratorio, percOutrasDespesas, tipoArredondamentoPreco, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, valorFixoMulta, diasToleranciaJurosMulta, tipoEntradaPagamento, percEntradaMinima, tipoVencimento, selecionaNumeroParcelas, diaFixoPagamento, diasToleranciaEdicaoVencimento, freteSeguroPrimeiraParcela, ipiPrimeiraParcela, permiteEditarValores, valorMinimo, valorMaximo, parcelaMinima, parcelaMaxima, dataValidadeInicial, dataValidadeFinal, validoVenda, validoTroco, validoDevolucaoVenda, validoCompra, validoDevolucaoCompra, validoRecebimento, validoPagamento, validoReparcelamentoReceber, validoReparcelamentoPagar, validoOrcamento, validoPreDocumento, validoDocumentoFiscal, solicitaDigitadoMagneticoTef, parceladoAdministradoraTef, filtroCabecalho, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, 0, ' ', 0, ' ', 0, 0, ' ', 0, ' ', 0, ' ', 0, 0, 0, 0, ' ', 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO PACONDICOESPAGAMENTO (condicaoPagamento, descricao, ativo, ordenacao, categoriaPagamento, meioPagamento, contaFinanceira, carteiraFinanceira, tipoJuroRemuneratorio, tarifaMensalJuroRemuneratorio, percOutrasDespesas, tipoArredondamentoPreco, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, valorFixoMulta, diasToleranciaJurosMulta, tipoEntradaPagamento, percEntradaMinima, tipoVencimento, selecionaNumeroParcelas, diaFixoPagamento, diasToleranciaEdicaoVencimento, freteSeguroPrimeiraParcela, ipiPrimeiraParcela, permiteEditarValores, valorMinimo, valorMaximo, parcelaMinima, parcelaMaxima, dataValidadeInicial, dataValidadeFinal, validoVenda, validoTroco, validoDevolucaoVenda, validoCompra, validoDevolucaoCompra, validoRecebimento, validoPagamento, validoReparcelamentoReceber, validoReparcelamentoPagar, validoOrcamento, validoPreDocumento, validoDocumentoFiscal, solicitaDigitadoMagneticoTef, parceladoAdministradoraTef, filtroCabecalho, observacoes) SELECT condicaoPagamento, descricao, ativo, ordenacao, categoriaPagamento, meioPagamento, contaFinanceira, carteiraFinanceira, tipoJuroRemuneratorio, tarifaMensalJuroRemuneratorio, percOutrasDespesas, tipoArredondamentoPreco, tarifaDescontoAteVencimento, tipoPagamentoAntecipado, tarifaMensalDescontoAntecipado, tipoJuroDeMora, tarifaMensalJuroDeMora, tarifaMulta, 0, diasToleranciaJurosMulta, tipoEntradaPagamento, percEntradaMinima, tipoVencimento, selecionaNumeroParcelas, diaFixoPagamento, diasToleranciaEdicaoVencimento, freteSeguroPrimeiraParcela, ipiPrimeiraParcela, permiteEditarValores, valorMinimo, valorMaximo, parcelaMinima, parcelaMaxima, dataValidadeInicial, dataValidadeFinal, validoVenda, validoTroco, validoDevolucaoVenda, validoCompra, validoDevolucaoCompra, validoRecebimento, validoPagamento, validoReparcelamentoReceber, validoReparcelamentoPagar, validoOrcamento, validoPreDocumento, validoDocumentoFiscal, solicitaDigitadoMagneticoTef, parceladoAdministradoraTef, filtroCabecalho, observacoes FROM PACONDICOESPAGAMENTO_2203 WHERE condicaoPagamento <> 0;

COMMIT;

ALTER TABLE CACLIENTES ADD CONSTRAINT CACLIENTES_FK4 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE CAFORNECEDORES ADD CONSTRAINT CAFORNECEDORES_FK2 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE PACONDPAGAMXPARCELAS ADD CONSTRAINT PACONDPAGAMXPARCELAS_FK1 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE PACONDPAGAMXBANDEIRASCART ADD CONSTRAINT PACONDPAGAMXBANDEIRASCART_FK2 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE PACONDPAGAMXFILTROSPRODUT ADD CONSTRAINT PACONDPAGAMXFILTROSPRODUT_FK1 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE PAFILTROPAGAMENTOXCONDPAG ADD CONSTRAINT PAFILTROPAGAMENTOXCONDPAG_FK2 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE PACONDICOESPAGAMENTOAUTO ADD CONSTRAINT PACONDICOESPAGAMENTOAUTO_FK1 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK30 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOPREDOCUMENTOS ADD CONSTRAINT MOPREDOCUMENTOS_FK33 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOPREDOCUMXPAGAMENTOS ADD CONSTRAINT MOPREDOCUMXPAGAMENTOS_FK5 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MODOCUMENTOSFISCAIS ADD CONSTRAINT MODOCUMENTOSFISCAIS_FK39 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MODOCFISCALXPAGAMENTOS ADD CONSTRAINT MODOCFISCALXPAGAMENTOS_FK5 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOREPARCXPAGAMENTOS ADD CONSTRAINT MOREPARCXPAGAMENTOS_FK5 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOORCAMENTOXPAGAMENTOS ADD CONSTRAINT MOORCAMENTOXPAGAMENTOS_FK5 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE MOMOTIVOSBLOQUEIOS ADD CONSTRAINT MOMOTIVOSBLOQUEIOS_FK5 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);

CREATE TABLE MONEGDIVIDAXFINANCEIROS_2203 AS SELECT * FROM MONEGDIVIDAXFINANCEIROS;

DROP TABLE MONEGDIVIDAXFINANCEIROS;

-- MONEGDIVIDAXFINANCEIROS
CREATE TABLE MONEGDIVIDAXFINANCEIROS
  (
    id                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNegociacaoDivida         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cotacao                    NUMERIC (12,4) DEFAULT 0 NOT NULL,
    valor                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoIndexado              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorVariacaoIndexador     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosDeMora           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorTarifaCartao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontos             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrosAcrescimos      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquido               NUMERIC (15,2) DEFAULT 0 NOT NULL
  );
ALTER TABLE MONEGDIVIDAXFINANCEIROS ADD CONSTRAINT MONEGDIVIDAXFINANCEIROS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MONEGDIVIDAXFINANCEIROS_K2 ON MONEGDIVIDAXFINANCEIROS (idNegociacaoDivida, idFinanceiro);
CREATE INDEX MONEGDIVIDAXFINANCEIROS_K3 ON MONEGDIVIDAXFINANCEIROS (idNegociacaoDivida);
CREATE INDEX MONEGDIVIDAXFINANCEIROS_K4 ON MONEGDIVIDAXFINANCEIROS (idFinanceiro);
ALTER TABLE MONEGDIVIDAXFINANCEIROS ADD CONSTRAINT MONEGDIVIDAXFINANCEIROS_FK1 FOREIGN KEY (idNegociacaoDivida) REFERENCES MONEGOCIACOESDIVIDAS (idNegociacaoDivida);
ALTER TABLE MONEGDIVIDAXFINANCEIROS ADD CONSTRAINT MONEGDIVIDAXFINANCEIROS_FK2 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);

INSERT INTO MONEGDIVIDAXFINANCEIROS (id, idNegociacaoDivida, idFinanceiro, cotacao, valor, saldo, saldoIndexado, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontos, valorOutrosAcrescimos, valorLiquido) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
INSERT INTO MONEGDIVIDAXFINANCEIROS (id, idNegociacaoDivida, idFinanceiro, cotacao, valor, saldo, saldoIndexado, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontos, valorOutrosAcrescimos, valorLiquido) SELECT id, idNegociacaoDivida, idFinanceiro, cotacao, valor, saldo, saldoIndexado, valorVariacaoIndexador, valorJurosDeMora, valorMulta, valorTarifaCartao, valorDescontoAteVencimento + valorDescontoAntecipado, 0, valorLiquido FROM MONEGDIVIDAXFINANCEIROS_2203 WHERE id <> 0;

COMMIT;

DROP TABLE TEMPPARCELAS;

-- TEMPPARCELAS
CREATE GLOBAL TEMPORARY TABLE TEMPPARCELAS
  (
    uniqueMachineID                VARCHAR (18) DEFAULT ' ' NOT NULL,
    contadorSessao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    origem                         CHAR (1) DEFAULT ' ' NOT NULL,
    idCabecalho                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pagamentoTroco                 CHAR (1) DEFAULT ' ' NOT NULL,
    sequencia                      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    parcela                        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    prazoPadrao                    NUMERIC (6,0) DEFAULT 0 NOT NULL,
    prazo                          NUMERIC (6,0) DEFAULT 0 NOT NULL,
    vencimento                     DATE,
    baixaAutomatica                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    percentualRateioOriginal       NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valor                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    complementoFinanceiro          VARCHAR (500) DEFAULT ' ' NOT NULL,
    idPrevisaoFinanceira           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idTransacaoTef                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    chequeCompensacao              CHAR (3) DEFAULT '   ' NOT NULL,
    chequeBanco                    CHAR (3) DEFAULT '   ' NOT NULL,
    chequeAgenciaBanco             VARCHAR (6) DEFAULT ' ' NOT NULL,
    chequeC1                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    chequeContaBanco               VARCHAR (12) DEFAULT ' ' NOT NULL,
    chequeC2                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    cheque                         NUMERIC (6,0) DEFAULT 0 NOT NULL,
    chequeC3                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    chequeBomPara                  DATE,
    chequeIndicadorPessoa          CHAR (1) DEFAULT ' ' NOT NULL,
    chequeTitular                  VARCHAR (60) DEFAULT ' ' NOT NULL,
    chequeIndicadorDocumentoPessoa CHAR (1) DEFAULT ' ' NOT NULL,
    chequeCnpjCpfIdEstrangeiro     VARCHAR (20) DEFAULT ' ' NOT NULL,
    chequeFone                     VARCHAR (14) DEFAULT ' ' NOT NULL,
    chequeDesde                    DATE,
    chequeAutenticacao             VARCHAR (256) DEFAULT ' ' NOT NULL,
    chequeIndicadorFone            NUMERIC (3,0) DEFAULT 0 NOT NULL,
    chequeOperacaoTelefonia        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    chequeObservacaoFone           VARCHAR (4000) DEFAULT ' ' NOT NULL,
    boletoCodigoDigitavelBarras    VARCHAR (60) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPPARCELAS_PK1 ON TEMPPARCELAS (uniqueMachineID, contadorSessao, origem, idCabecalho, pagamentoTroco, sequencia, parcela);

DROP TABLE TEMPEXTRATOPESSOA;

-- TEMPEXTRATOPESSOA
CREATE GLOBAL TEMPORARY TABLE TEMPEXTRATOPESSOA
  (
    uniqueMachineID                VARCHAR (18) DEFAULT ' ' NOT NULL,
    idSessao                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiroReduzido           VARCHAR (256) DEFAULT ' ' NOT NULL,
    pagamentoRecebimento           CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao                      VARCHAR (256) DEFAULT ' ' NOT NULL,
    quebra                         VARCHAR (256) DEFAULT ' ' NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    emissao                        DATE,
    contratoCompra                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documento                      VARCHAR (60) DEFAULT ' ' NOT NULL,
    sequenciaPagamento             NUMERIC (3,0) DEFAULT 0 NOT NULL,
    parcelaAtual                   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    parcelasTotais                 NUMERIC (3,0) DEFAULT 0 NOT NULL,
    valorTotal                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    meioPagamento                  NUMERIC (2,0) DEFAULT 0 NOT NULL,
    vencimento                     DATE,
    vencimentoNegociado            DATE,
    naoCobrarJurosMultaAte         DATE,
    valor                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPagoCrediarioSemRenegoc   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    indexador                      VARCHAR (10) DEFAULT ' ' NOT NULL,
    saldoIndexado                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tarifaDescontoAteVencimento    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoPagamentoAntecipado        CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalDescontoAntecipado NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoJuroDeMora                 CHAR (1) DEFAULT ' ' NOT NULL,
    tarifaMensalJuroDeMora         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMulta                    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorFixoMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    dataPagamento                  DATE,
    jurosAberto                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    descontosAberto                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    jurosLiquidado                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    descontosLiquidado             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    atraso                         NUMERIC (6,0) DEFAULT 0 NOT NULL,
    efetivado                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    vinculado                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    possuiRelacionados             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    possuiBaixas                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    primeiroDocumento              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    emDigitacao                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    idPagamentoPreDocumento        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    preDocumento                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idPagamentoDocFiscal           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDocumentoFiscal              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    autorizadoPessoa               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoDocumento                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    operacaoFinanceira             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    complementoFinanceiro          VARCHAR (500) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPEXTRATOPESSOA_PK1 ON TEMPEXTRATOPESSOA (uniqueMachineID, idSessao, idFinanceiro);
CREATE INDEX TEMPEXTRATOPESSOA_K2 ON TEMPEXTRATOPESSOA (uniqueMachineID, idSessao, ordenacao);
CREATE INDEX TEMPEXTRATOPESSOA_K3 ON TEMPEXTRATOPESSOA (uniqueMachineID, idSessao, ordenacao DESC);

DROP TABLE TEMPRECEBIMENTO;

-- TEMPRECEBIMENTO
CREATE GLOBAL TEMPORARY TABLE TEMPRECEBIMENTO
  (
    uniqueMachineID               VARCHAR (18) DEFAULT ' ' NOT NULL,
    contadorSessao                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idBaixaFinanceiro             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    quebra                        VARCHAR (256) DEFAULT ' ' NOT NULL,
    selecionado                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    legenda                       NUMERIC (3,0) DEFAULT 0 NOT NULL,
    documento                     VARCHAR (60) DEFAULT ' ' NOT NULL,
    contaFinanceira               VARCHAR (60) DEFAULT ' ' NOT NULL,
    contaFinanceiraDescricao      VARCHAR (120) DEFAULT ' ' NOT NULL,
    carteiraFinanceira            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    carteiraFinanceiraDescricao   VARCHAR (256) DEFAULT ' ' NOT NULL,
    meioPagamento                 NUMERIC (2,0) DEFAULT 0 NOT NULL,
    meioPagamentoDescricao        VARCHAR (60) DEFAULT ' ' NOT NULL,
    bandeiraCartaoDebCred         NUMERIC (2,0) DEFAULT 0 NOT NULL,
    bandeiraCartaoDebCrDescricao  VARCHAR (120) DEFAULT ' ' NOT NULL,
    pagamentoRecebimento          CHAR (1) DEFAULT ' ' NOT NULL,
    cotacao                       NUMERIC (12,4) DEFAULT 0 NOT NULL,
    valor                         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoIndexado                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorVariacaoIndexador        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosDeMora              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorMulta                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorTarifaCartao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontos                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrosAcrescimos         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquido                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoVariacaoIndexador        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoJurosDeMora              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoMulta                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoTarifaCartao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoDescontos                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoOutrosAcrescimos         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoLiquido                  NUMERIC (15,2) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPRECEBIMENTO_PK1 ON TEMPRECEBIMENTO (uniqueMachineID, contadorSessao, idFinanceiro, idBaixaFinanceiro);
CREATE INDEX TEMPRECEBIMENTO_K2 ON TEMPRECEBIMENTO (uniqueMachineID, contadorSessao, ordenacao);
CREATE INDEX TEMPRECEBIMENTO_K3 ON TEMPRECEBIMENTO (uniqueMachineID, contadorSessao, documento);

DROP TABLE TEMPCNAB;

-- TEMPCNAB
CREATE GLOBAL TEMPORARY TABLE TEMPCNAB
  (
    uniqueMachineID                VARCHAR (18) DEFAULT ' ' NOT NULL,
    idSessao                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idBaixaFinanceiro              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idRegistroSpc                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataRegistroSPC                DATE,
    selecionado                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contratoCompra                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documento                      VARCHAR (60) DEFAULT ' ' NOT NULL,
    fatura                         VARCHAR (60) DEFAULT ' ' NOT NULL,
    parcelaAtual                   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    dataEmissao                    DATE,
    vencimento                     DATE,
    naoCobrarJurosMultaAte         DATE,
    dataPagamento                  DATE,
    valor                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    tarifaDescontoAteVencimento    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMensalDescontoAntecipado NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMensalJuroDeMora         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMulta                    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorFixoMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    nossoNumero                    VARCHAR (25) DEFAULT ' ' NOT NULL,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nomeRazaoSocial                VARCHAR (60) DEFAULT ' ' NOT NULL,
    indicadorPessoa                CHAR (1) DEFAULT ' ' NOT NULL,
    nascimentoFundacao             DATE,
    cnpjCpfIdEstrangeiro           VARCHAR (20) DEFAULT ' ' NOT NULL,
    enderecoCep                    NUMERIC (8,0) DEFAULT 0 NOT NULL,
    enderecoLogradouro             VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoNumero                 VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoComplemento            VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoBairroDistrito         VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoMunicipio              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    enderecoPais                   CHAR (4) DEFAULT ' ' NOT NULL,
    enderecoObservacoes            VARCHAR (4000) DEFAULT ' ' NOT NULL,
    enderecoDescricaoMunicipio     VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoUf                     CHAR (2) DEFAULT '  ' NOT NULL,
    enderecoDescricaoPais          VARCHAR (60) DEFAULT ' ' NOT NULL,
    foneA                          VARCHAR (14) DEFAULT ' ' NOT NULL,
    foneB                          VARCHAR (14) DEFAULT ' ' NOT NULL,
    email                          VARCHAR (60) DEFAULT ' ' NOT NULL,
    rg                             VARCHAR (20) DEFAULT ' ' NOT NULL,
    mae                            VARCHAR (60) DEFAULT ' ' NOT NULL,
    pai                            VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoOcupacao              VARCHAR (256) DEFAULT ' ' NOT NULL,
    empregoRazaoSocial             VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoFone                    VARCHAR (14) DEFAULT ' ' NOT NULL,
    empregoCep                     NUMERIC (8,0) DEFAULT 0 NOT NULL,
    empregoLogradouro              VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoNumero                  VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoComplemento             VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoBairroDistrito          VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoMunicipio               NUMERIC (7,0) DEFAULT 0 NOT NULL,
    empregoPais                    CHAR (4) DEFAULT ' ' NOT NULL,
    empregoObservacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL,
    empregoDescricaoMunicipio      VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoUf                      CHAR (2) DEFAULT '  ' NOT NULL,
    empregoDescricaoPais           VARCHAR (60) DEFAULT ' ' NOT NULL,
    conjugeNome                    VARCHAR (60) DEFAULT ' ' NOT NULL,
    conjugeCpf                     VARCHAR (20) DEFAULT ' ' NOT NULL,
    entidadeSPC                    NUMERIC (3,0) DEFAULT 0 NOT NULL,
    codigoCDL                      VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoAssociado                VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoFilial                   VARCHAR (256) DEFAULT ' ' NOT NULL,
    senha                          VARCHAR (256) DEFAULT ' ' NOT NULL,
    mensagemErro                   VARCHAR (256) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPCNAB_PK1 ON TEMPCNAB (uniqueMachineID, idSessao, ordenacao);

create or replace FUNCTION FUNC_ADD_MONTA_OBSERVACAO_ITEM (
    p_uniqueMachineID              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.uniqueMachineID = p_uniqueMachineID
    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_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_dataUltimaVenda DATE;
BEGIN
  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 CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND kit.ativo = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProdutoFilho
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'S'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.validoFaturamento = 1
    AND kit.ativo = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
  ) 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));
  RETURN v_dataUltimaVenda;
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_dataUltimaCompra DATE;
BEGIN
  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 CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
  ) 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));
  RETURN v_dataUltimaCompra;
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_dataPrimeiraCompra DATE;
BEGIN
  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 CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    WHERE gradProd.produto = p_produto
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MODOCUMENTOSFISCAIS cab
    JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
    UNION ALL
    SELECT cab.estabelecimento,
      cab.dataEntradaSaida
    FROM MOPREDOCUMENTOS cab
    JOIN MOPREDOCUMXITENS item ON item.preDocumento = cab.preDocumento
    JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProdutoFilho = item.gradeProduto
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = kit.gradeProduto
    WHERE gradProd.produto = p_produto
    AND kit.ativo = 1
    AND cab.entradaSaida = 'E'
    AND cab.devolucaoAnulacaoRetorno = 0
    AND cab.atualizaUltimaCompra = 1
    AND TRUNC(cab.dataEntradaSaida) BETWEEN CASE WHEN p_dataInicial IS NULL THEN  TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE p_dataInicial END AND p_dataFinal
  ) 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));
  RETURN v_dataPrimeiraCompra;
END;

/

create or replace FUNCTION FUNC_ADD_CALC_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            CHAR,
    p_regMarg_tabelaPreco          VARCHAR2,
    p_regMarg_fatorMultiplicador   NUMBER,
    p_regMarg_tipoPrecoB           CHAR,
    p_regMarg_tabelaPrecoB         VARCHAR2,
    p_regMarg_fatorMultiplicadorB  NUMBER,
    p_regMarg_reduzirImpostos      NUMBER,
    p_regMarg_reduzirTarifaCartao  NUMBER,
    p_regMarg_taxaCapitacaoCustoFi NUMBER,
    p_regMarg_exibImagemMargemItem NUMBER,
    p_regMarg_regraImagemItem      NUMBER,
    p_cab_estabelecimento          NUMBER,
    p_cab_dataPreco                DATE,
    p_cab_prazoMedioPonderado      NUMBER,
    p_cab_valorLiquidoItem         NUMBER,
    p_cab_valorTarifaCartao        NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_item_idFormulaTinta          NUMBER,
    p_item_personalizacao          NUMBER,
    p_item_localEstoque            NUMBER,
    p_item_pessoaParticipante      NUMBER,
    p_item_quantidade              NUMBER,
    p_item_valorFreteTotal         NUMBER,
    p_item_valorSeguroTotal        NUMBER,
    p_item_valorAdicFreteMarTotal  NUMBER,
    p_item_valorDespesasAduanTotal NUMBER,
    p_item_valorII                 NUMBER,
    p_item_valorIOF                NUMBER,
    p_item_valorIPI                NUMBER,
    p_item_valorIPIDevolucao       NUMBER,
    p_item_valorPIS                NUMBER,
    p_item_valorPISST              NUMBER,
    p_item_valorCOFINS             NUMBER,
    p_item_valorCOFINSST           NUMBER,
    p_item_valorCreditoSimplesNac  NUMBER,
    p_item_valorICMSOperacao       NUMBER,
    p_item_valorICMSDiferido       NUMBER,
    p_item_valorICMS               NUMBER,
    p_item_valorICMSDesoneracao    NUMBER,
    p_item_valorICMSST             NUMBER,
    p_item_valorICMSSTAnteriorment NUMBER,
    p_item_valorICMSUFDestinatario NUMBER,
    p_item_valorICMSUFRemetente    NUMBER,
    p_item_valorFCP                NUMBER,
    p_item_valorFCPST              NUMBER,
    p_item_valorFCPSTAnteriormente NUMBER,
    p_item_valorFCPUFDestinatario  NUMBER,
    p_item_valorLiquidoItem        NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR)
  RETURN VARCHAR2
IS
    v_valorLiquidoSemFreteSeguro   NUMBER;
    v_valorCaptacao                NUMBER;
    v_valorTarifaCartao            NUMBER;
    v_valorImpostos                NUMBER;
    v_precoCusto                   NUMBER;
    v_valorCusto                   NUMBER;
    v_valorMargem                  NUMBER;
    v_percentualMargem             NUMBER;
BEGIN
  ADD_CALCULA_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_regMarg_reduzirImpostos,
    p_regMarg_reduzirTarifaCartao,
    p_regMarg_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_cab_estabelecimento,
    p_cab_dataPreco,
    p_cab_prazoMedioPonderado,
    p_cab_valorLiquidoItem,
    p_cab_valorTarifaCartao,
    p_munEndEst_uf,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_localEstoque,
    p_item_pessoaParticipante,
    p_item_quantidade,
    p_item_valorFreteTotal,
    p_item_valorSeguroTotal,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    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_valorICMSSTAnteriorment,
    p_item_valorICMSUFDestinatario,
    p_item_valorICMSUFRemetente,
    p_item_valorFCP,
    p_item_valorFCPST,
    p_item_valorFCPSTAnteriormente,
    p_item_valorFCPUFDestinatario,
    p_item_valorLiquidoItem,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    p_prod_controleEstoque,
    p_locEst_indicadorPropPosseIt,
    /* Retornos */
    v_valorLiquidoSemFreteSeguro,
    v_valorCaptacao,
    v_valorTarifaCartao,
    v_valorImpostos,
    v_precoCusto,
    v_valorCusto,
    v_valorMargem,
    v_percentualMargem);
  RETURN (
    v_valorLiquidoSemFreteSeguro || '|' || 
    v_valorCaptacao || '|' || 
    v_valorTarifaCartao || '|' || 
    v_valorImpostos || '|' || 
    v_precoCusto || '|' || 
    v_valorCusto || '|' || 
    v_valorMargem || '|' || 
    v_percentualMargem);
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
        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 (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))
      ) a
      WHERE a.ordenacao = 1  
    ) a;
  END IF;
  RETURN v_tabelaPreco;
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_dataPreco                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_dataPreco,
    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_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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
              AND (p_pessoaParticipante = 0 OR 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 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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                    AND (p_pessoaParticipante = 0 OR 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_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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR 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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR 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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR 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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR 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_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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR 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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR 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 FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER)
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaCompra * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaCompra <> 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 (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND TRUNC(invEst.data) BETWEEN
      CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
      AND TRUNC(p_dataFinal)-1) a;
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX((COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000')
      || LPAD((CASE WHEN COUNT (1) = 1 OR SUM(itemEst.quantidade) = 0 THEN MAX(itemEst.precoCustoOperacao) ELSE ROUND((SUM (itemEst.totalCustoOperacao)/SUM(itemEst.quantidade)),7) END * 10000000),15,'0'))),9,15)) / 10000000
    FROM MOESTOQUES itemEst
    LEFT JOIN MOPREDOCUMXESTOQUE preXEst ON preXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MOPREDOCUMXITENS itemPre ON itemPre.idItemPreDocumento = preXEst.idItemPreDocumento
    LEFT JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
    JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = itemEst.gradeProduto AND grad.produto = p_gradProd_produto
    WHERE itemEst.entradaSaida = 'E'
    AND itemEst.atualizaUltimaCompra = 1
    AND itemEst.precoCustoOperacao > 0
    AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
    AND itemEst.pessoaParticipante = p_pessoaParticipante
    AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
    AND TRUNC(itemEst.data) BETWEEN
      CASE
        WHEN NOT(v_dataInventario IS NULL)
        THEN v_dataInventario + 1
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
      AND TRUNC(p_dataFinal)
    AND (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 = itemEst.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 = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))    
    GROUP BY COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000'),
      CASE
        WHEN NOT (docXEst.id IS NULL)
        THEN 'D' || LPAD(itemDoc.idDocumentoFiscal,14,'0')
        WHEN NOT (preXEst.id IS NULL)
        THEN 'P' || LPAD(itemPre.preDocumento,14,'0')
        ELSE 'M' || LPAD(itemEst.idEstoque,14,'0')
      END
    ),0) preco
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (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 = preco.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 = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_retornarPrecoBruto           IN NUMBER)
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoUnitarioUltimaCompra <> 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 (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND TRUNC(invEst.data) BETWEEN
      CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
      AND TRUNC(p_dataFinal)-1) a;
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
    FROM (
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MODOCFISCALXITENS item
      JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
      JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.situacaoDocumentoFiscal IN (21,22,23)
      AND doc.atualizaUltimaCompra = 1
      AND TRUNC(doc.dataEntradaSaida) BETWEEN
        CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
        AND TRUNC(p_dataFinal)
      AND (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 = doc.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 = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'), item.idDocumentoFiscal
      UNION ALL
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MOPREDOCUMXITENS item
      JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
      JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.statusPreDocumento = 'A'
      AND doc.atualizaUltimaCompra = 1
      AND TRUNC(doc.dataEntradaSaida) BETWEEN
        CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
        AND TRUNC(p_dataFinal)
      AND (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 = doc.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 = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'), item.preDocumento
    ) a
    WHERE a.preco > 0
  ),0)
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (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 = preco.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 = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS
  v_preco NUMBER;

  CURSOR c_formula
  IS 
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a 
    JOIN CABASESTINTAS base ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0;

BEGIN
  v_preco := 0;

  FOR formula IN c_formula LOOP
    v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      formula.gradeProduto,
      1, --p_tinta_quantidade
      v_preco);
    IF formula.idColoranteTintaA > 0 AND formula.gradeProdutoA > 0 AND formula.quantidadeA > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoA,
        formula.quantidadeA / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaB > 0 AND formula.gradeProdutoB > 0 AND formula.quantidadeB > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoB,
        formula.quantidadeB / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaC > 0 AND formula.gradeProdutoC > 0 AND formula.quantidadeC > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoC,
        formula.quantidadeC / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaD > 0 AND formula.gradeProdutoD > 0 AND formula.quantidadeD > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoD,
        formula.quantidadeD / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaE > 0 AND formula.gradeProdutoE > 0 AND formula.quantidadeE > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoE,
        formula.quantidadeE / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaF > 0 AND formula.gradeProdutoF > 0 AND formula.quantidadeF > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoF,
        formula.quantidadeF / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaG > 0 AND formula.gradeProdutoG > 0 AND formula.quantidadeG > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoG,
        formula.quantidadeG / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaH > 0 AND formula.gradeProdutoH > 0 AND formula.quantidadeH > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoH,
        formula.quantidadeH / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaI > 0 AND formula.gradeProdutoI > 0 AND formula.quantidadeI > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoI,
        formula.quantidadeI / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaJ > 0 AND formula.gradeProdutoJ > 0 AND formula.quantidadeJ > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoJ,
        formula.quantidadeJ / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaK > 0 AND formula.gradeProdutoK > 0 AND formula.quantidadeK > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoK,
        formula.quantidadeK / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaL > 0 AND formula.gradeProdutoL > 0 AND formula.quantidadeL > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoL,
        formula.quantidadeL / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaM > 0 AND formula.gradeProdutoM > 0 AND formula.quantidadeM > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoM,
        formula.quantidadeM / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaN > 0 AND formula.gradeProdutoN > 0 AND formula.quantidadeN > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoN,
        formula.quantidadeN / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaO > 0 AND formula.gradeProdutoO > 0 AND formula.quantidadeO > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoO,
        formula.quantidadeO / 900, --p_tinta_quantidade
        v_preco);
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_PROTIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    p_ini_preco                    IN NUMBER
  )
  RETURN NUMBER
IS
  v_preco      NUMBER;
  v_precoTinta NUMBER;

  CURSOR c_prod
  IS 
    SELECT 
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto;

BEGIN
  v_preco := p_ini_preco;

  FOR prod IN c_prod LOOP
    v_precoTinta := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        1);
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoTinta = 0 AND prod.controleEstoque IN (3,4) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    v_preco := v_preco + p_tinta_quantidade * v_precoTinta;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_INT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_buscarPrecoGerencial         IN NUMBER,
    p_especial                     IN NUMBER, -- 1 = Gerando Inventário, 2 = Valorizando Estoque
    p_dataInventarioEstoque        IN DATE)
  RETURN NUMBER
IS
  v_dataAtual          DATE;
  v_quantidadeEstoque  NUMBER;
  v_precoCustoMedio    NUMBER;
  v_totalCustoMedio    NUMBER;
CURSOR c_estoque IS
  SELECT itemEst.data,
    itemEst.idEstoque,
    itemEst.entradaSaida,
    itemEst.atualizaCustoMedio,
    itemEst.operacaoInternaEstoque,
    itemEst.quantidade,
    itemEst.totalCustoOperacao,
    CASE
      WHEN itemEst.atualizaCustoMedio = 0
      THEN 0
      ELSE COALESCE((
        SELECT
          CASE
            WHEN itemDoc.quantidade = 0
              OR prod.controleEstoque IN (3,4)
              AND COALESCE(kit.ativo,0) = 1
              AND COALESCE(kit.manterUltimoCusto,0) = 1
            THEN 0
            ELSE ROUND(itemDoc.valorAcrescimoExtempTotal * itemEst.quantidade / itemDoc.quantidade,2)
          END
        FROM MODOCFISCALXESTOQUE estXDoc
        JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = estXDoc.idItemDocFiscal
        LEFT JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = itemDoc.gradeProduto
        WHERE estXDoc.idEstoque = itemEst.idEstoque
        AND (kit.gradeProdutoFilho IS NULL OR kit.gradeProdutoFilho = itemEst.gradeProduto)),COALESCE((
        SELECT
          CASE
            WHEN itemDoc.quantidade = 0
              OR prod.controleEstoque IN (3,4)
              AND COALESCE(kit.ativo,0) = 1
              AND COALESCE(kit.manterUltimoCusto,0) = 1
            THEN 0
            ELSE ROUND(itemDoc.valorAcrescimoExtempTotal * itemEst.quantidade / itemDoc.quantidade,2)
          END
        FROM MOPREDOCUMXESTOQUE estXDoc
        JOIN MOPREDOCUMXITENS itemDoc ON itemDoc.idItemPreDocumento = estXDoc.idItemPreDocumento
        LEFT JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = itemDoc.gradeProduto
        WHERE estXDoc.idEstoque = itemEst.idEstoque
        AND (kit.gradeProdutoFilho IS NULL OR kit.gradeProdutoFilho = itemEst.gradeProduto)),0))
    END valorAcrescimoExtempTotal
  FROM MOESTOQUES itemEst
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
  WHERE 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 (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND (p_buscarPrecoGerencial = 1 OR itemEst.operacaoInternaEstoque <> 101)
  AND TRUNC(itemEst.data) BETWEEN CASE WHEN NOT(p_dataInventarioEstoque IS NULL) THEN p_dataInventarioEstoque + 1 ELSE TO_DATE('01/01/1900','DD/MM/YYYY') END AND TRUNC(p_dataPosicaoEstoque)
  AND (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 = itemEst.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 = itemEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)))
  ORDER BY TRUNC(itemEst.data),
    itemEst.operacaoInternaEstoque DESC,
    itemEst.atualizaCustoMedio DESC,
    itemEst.data,
    itemEst.idEstoque;
BEGIN
  v_dataAtual         := COALESCE(TRUNC(p_dataInventarioEstoque)+1,TO_DATE('01/01/1900','DD/MM/YYYY'));
  v_quantidadeEstoque := 0;
  v_precoCustoMedio   := 0;
  v_totalCustoMedio   := 0;
  -- Saldo Inicial Inventário Estoque Gerencial
  IF NOT(p_dataInventarioEstoque IS NULL) AND p_buscarPrecoGerencial = 1 THEN
  SELECT
    COALESCE(SUM(itemEst.quantidadeGerencial),0),
    COALESCE((
      CASE
        WHEN SUM(itemEst.quantidadeGerencial) = 0
          OR SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)) = 0
          OR SUM(itemEst.quantidadeGerencial) =  MAX(itemEst.quantidadeGerencial)
          AND SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
           =  MAX(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
        THEN MAX(itemEst.precoUnitarioCMVGerencial)
        ELSE ROUND(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
          / SUM(itemEst.quantidadeGerencial),7)
      END),0),
    COALESCE(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)),0)
  INTO
    v_quantidadeEstoque,
    v_precoCustoMedio,
    v_totalCustoMedio
  FROM MOINVENTARIOESTOQUEXITENS itemEst
  JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  WHERE 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 (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND TRUNC(invEst.data) = TRUNC(p_dataInventarioEstoque)
  AND (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 = invEst.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 = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  -- Saldo Inicial Inventário Estoque Fiscal
  ELSIF NOT(p_dataInventarioEstoque IS NULL) THEN
  SELECT
    COALESCE(SUM(itemEst.quantidadeFiscal),0),
    COALESCE((
      CASE
        WHEN SUM(itemEst.quantidadeFiscal) = 0
          OR SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)) = 0
          OR SUM(itemEst.quantidadeFiscal) =  MAX(itemEst.quantidadeFiscal)
          AND SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
           =  MAX(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
        THEN MAX(itemEst.precoUnitarioCMVFiscal)
        ELSE ROUND(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
          / SUM(itemEst.quantidadeFiscal),7)
      END),0),
    COALESCE(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)),0)
  INTO
    v_quantidadeEstoque,
    v_precoCustoMedio,
    v_totalCustoMedio
  FROM MOINVENTARIOESTOQUEXITENS itemEst
  JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  WHERE 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 (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND TRUNC(invEst.data) = TRUNC(p_dataInventarioEstoque)
  AND (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 = invEst.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 = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  END IF;
  FOR dados IN c_estoque
  LOOP
    IF dados.operacaoInternaEstoque = 1 AND dados.data > v_dataAtual
    THEN
      v_quantidadeEstoque := 0;
      v_precoCustoMedio := 0;
      v_totalCustoMedio := 0;
    END IF;
    v_dataAtual := dados.data;
    -- Se atualiza custo médio
    IF dados.atualizaCustoMedio = 1 THEN
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal;
            END IF;
          ELSE
            IF ROUND (((dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal) * v_quantidadeEstoque / dados.quantidade),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := ROUND (((dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal) * v_quantidadeEstoque / dados.quantidade),2);
            END IF;
          END IF;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - dados.totalCustoOperacao - dados.valorAcrescimoExtempTotal;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
      IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 AND ROUND(v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedio := 99999999.9999999;
      ELSE
        IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 THEN
          v_precoCustoMedio := ROUND(v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
        END IF;
      END IF;
    -- Se não atualiza custo médio
    ELSE
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedio + ROUND((dados.quantidade * v_precoCustoMedio),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal;
            END IF;
          ELSE
            IF ROUND((v_quantidadeEstoque * v_precoCustoMedio),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := ROUND((v_quantidadeEstoque * v_precoCustoMedio),2);
            END IF;
          END IF;
        END IF;
      ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - dados.quantidade * v_precoCustoMedio;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
    END IF;
    -- Se é registro de movimento, atualiza ele
    IF p_especial = 2 THEN
      IF dados.atualizaCustoMedio = 1 THEN
        UPDATE MOESTOQUES a SET
          a.precoCMV = v_precoCustoMedio,
          a.valorCMV = ROUND(a.quantidade * v_precoCustoMedio,2)
        WHERE a.idEstoque = dados.idEstoque;
      ELSE
        UPDATE MOESTOQUES a SET
          a.precoCustoOperacao = v_precoCustoMedio,
          a.totalCustoOperacao = ROUND(a.quantidade * v_precoCustoMedio,2),
          a.precoCMV = v_precoCustoMedio,
          a.valorCMV = ROUND(a.quantidade * v_precoCustoMedio,2)
        WHERE a.idEstoque = dados.idEstoque;
      END IF;
    END IF;
  END LOOP;
  IF p_especial <> 2 AND v_precoCustoMedio = 0 THEN
    SELECT COALESCE(MAX(preco.precoMedioInicial),0)
    INTO v_precoCustoMedio      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_precoCustoMedio = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedio      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (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 = preco.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 = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_precoCustoMedio = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedio      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_precoCustoMedio;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_buscarPrecoGerencial         IN NUMBER,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário, 2 = Valorizando Estoque
  )
  RETURN NUMBER
IS 
  v_dataInventarioEstoque DATE;
  v_precoCustoMedio       NUMBER;
BEGIN
  -- v_dataInventarioEstoque
  SELECT MAX(TRUNC(invEst.data))
  INTO v_dataInventarioEstoque
  FROM MOINVENTARIOSESTOQUE invEst
  WHERE invEst.inventarioEstoque <> 0
  AND TRUNC (invEst.data) < TRUNC(p_dataPosicaoEstoque)
  AND (invEst.motivoInventarioEstoque = '01'
    OR EXISTS(
      SELECT 1
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
      AND gradProd.produto = p_gradProd_produto))
  AND (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 = invEst.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 = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  v_precoCustoMedio :=
    FUNC_ADD_BUSCA_PRECO_MEDIO_INT(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_estabelecimento,
      p_dataPosicaoEstoque,
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      p_buscarPrecoGerencial,
      p_especial,
      v_dataInventarioEstoque);
  RETURN v_precoCustoMedio;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_preco      NUMBER;
  v_precoFilho NUMBER;

  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_gradProd_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;

BEGIN
  v_preco := 0;
  FOR kit IN c_kit LOOP
    v_precoFilho := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        1);
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoFilho = 0 AND kit.controleEstoque IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    IF v_precoFilho <> 0 THEN
      v_preco := v_preco + kit.quantidade * v_precoFilho;
    ELSE
      v_preco := 0;
    END IF;        
    EXIT WHEN v_preco = 0;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_item_personalizacao         IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_gradProd_cor                IN NUMBER,
    p_gradProd_tamanho            IN VARCHAR)
  RETURN NUMBER
IS
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaFormacao * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaFormacao <> 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 (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND TRUNC(invEst.data) BETWEEN
        CASE
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
        AND TRUNC(p_dataFinal)-1) a;
  SELECT COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO v_preco
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(data,'YYYYMMDD'),'19000101')
      || LPAD((novoPrecoCusto * 10000000),15,'0'))) ordenacao
    FROM CAPRODUTOXCUSTOS
    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)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR personalizacao = p_item_personalizacao)
    AND TRUNC(data) BETWEEN
        CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
        AND TRUNC(p_dataFinal)
    AND ativo = 1) a;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      JOIN PAESTABELECIMENTOS est ON est.estabelecimento = preco.estabelecimento
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAESTABELECIMENTOS est2 ON est2.estabelecimento = p_estabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.pessoa = est2.pessoaEstabelecimento
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_config_209_filtrarGrupoEcon = 0 AND est.pessoaEstabelecimento = est2.pessoaEstabelecimento
        OR p_config_209_filtrarGrupoEcon = 1 AND pessEst.grupoEconomico = pessEst2.grupoEconomico);
    END IF;  
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  IF v_preco = 0 THEN
    SELECT
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
      COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
    INTO
      v_dataInventario,
      v_precoInventario
    FROM (
      SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
        || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
      FROM MOINVENTARIOESTOQUEXITENS itemEst
      JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      WHERE itemEst.precoUnitarioUltimaCompra <> 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 (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)
      AND TRUNC(invEst.data) BETWEEN
        CASE
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
        AND TRUNC(p_dataFinal)-1) a;
    SELECT COALESCE ((
      SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
      FROM (
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MODOCFISCALXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        WHERE item.cancelado = 0
        AND grad.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)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND TRUNC(doc.dataEntradaSaida) BETWEEN
          CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
          AND TRUNC(p_dataFinal)
        AND (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 = doc.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 = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))
        UNION ALL
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MOPREDOCUMXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
        WHERE item.cancelado = 0
        AND grad.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)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento = 'A'
        AND doc.atualizaUltimaCompra = 1
        AND TRUNC(doc.dataEntradaSaida) BETWEEN
          CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
          AND TRUNC(p_dataFinal)
        AND (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 = doc.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 = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))) a),0)
    INTO v_preco
    FROM DUAL;    
    IF v_preco = 0 THEN
      v_preco := v_precoInventario;
    END IF;
    IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = p_estabelecimento
      AND preco.ativo = 1;  
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.ativo = 1
        AND (p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR 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 = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)));
      END IF;
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.estabelecimento = 0
        AND preco.ativo = 1;
      END IF;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_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_dataPreco                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_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_preco NUMBER;

BEGIN
  v_preco := 0;
  IF p_gradProd_produto > 0 AND p_tipoPreco <> 'I' THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        'S', --p_cab_entradaSaida
        0, --p_cab_devolucaoAnulacaoRetorno
        p_cab_estabelecimento,
        TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
        p_cab_dataPreco, --p_cab_dataPrecoFinal
        p_cab_pessoa,
        1, --p_modDoc_capituloNaturezaFisc
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_idFormulaTinta,
        0, --p_item_personalizacao
        0, --p_item_localEstoque
        0, --p_item_pessoaParticipante
        1, --p_quantidade
        '0', --p_locEst_indicadorPropPosseiT
        CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
        p_tipoPreco,
        p_tabelaPreco);
    ELSE
      -- A Tabela de Preço Anterior
      IF p_tipoPreco = 'A' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          1, --p_quantidade
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tabelaPreco);
      -- C Custo Médio da Venda (CMV)
      ELSIF p_tipoPreco = 'C' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0, --p_item_pessoaParticipante
          0,
          0);
      -- F Formação Preço (Custo)
      ELSIF p_tipoPreco = 'F' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_FORMACAO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho);
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0, --p_item_pessoaParticipante
          1,
          0);
      -- P Preço de Custo (Último Custo)
      ELSIF p_tipoPreco = 'P' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_item_pessoaParticipante
      -- T Tabela de Preço
      ELSIF p_tipoPreco = 'T' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_TABELA(
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          1, --p_quantidade
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tabelaPreco);
      -- U Última Compra
      ELSIF p_tipoPreco = 'U' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0);
      -- 2 Última Compra Bruto
      ELSIF p_tipoPreco = '2' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          1);
      END IF;
      -- 3 = Combo / 4 = Kit
      IF v_preco = 0 AND p_prod_controleEstoque IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_KIT(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
          p_cab_dataPreco, --p_cab_dataPrecoFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          0, --p_item_pessoaParticipante
          1, --p_quantidade
          p_gradProd_produto,
          '0', --p_locEst_indicadorPropPosseiT
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tipoPreco,
          p_tabelaPreco);
      END IF;
    END IF;
    -- Efetua arredondamento de preço
    v_preco := ROUND (v_preco, TO_NUMBER(p_config_64_casasDecSaidas));
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_OPERACAO_FISCAL(
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_pessoa                   IN NUMBER,
    p_cab_vendaConsumidor          IN NUMBER,
    p_cab_municipioFatoGerador     IN NUMBER,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_est_grupoFiscal              IN NUMBER,
    p_pessEst_regimeTributario     IN CHAR,
    p_endPessEstMun_uf             IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_endPessMun_uf                IN CHAR,
    p_produto                      IN NUMBER)
  RETURN NUMBER
IS
  v_operacaoFiscal NUMBER;
BEGIN
  SELECT COALESCE((
    SELECT a.operacaoFiscal
    FROM (
      SELECT a.operacaoFiscal,
        ROW_NUMBER() OVER (
          ORDER BY
            a.pessoa    DESC,
            a.ufDestino DESC,
            a.ufOrigem  DESC,
            CASE
              WHEN filtrProd.filtroProduto = 0
              THEN 0
              WHEN filtrProd.filtrarProdutos = 1
              AND EXISTS (
                SELECT 1
                FROM PAFILTROPRODUTOXPRODUTOS filtroProdXProd
                WHERE filtroProdXProd.filtroProduto = filtrProd.filtroProduto
                AND filtroProdXProd.produto         = p_produto
                AND filtroProdXProd.ativo           = 1)
              THEN 2
              ELSE 1
            END DESC,
            a.filtrarNCMs DESC,
            a.filtrarListasServicos DESC,
            a.regimeTributario DESC,
            a.indicadorInscricaoEstadual DESC,
            a.indicadorConsumidorFinal DESC,
            a.municipioServico DESC,
            a.grupoFiscal DESC,
            a.origemMercadoria DESC,
            a.tipoProduto DESC,
            a.operacaoFiscal DESC) ordenacao
      FROM PAOPERACOESFISCAIS a
      JOIN CAPRODUTOS prod
      ON prod.produto = p_produto
      JOIN PASUBCATEGORIASPRODUTO subCat
      ON subCat.subcategoriaProduto = prod.subcategoriaProduto
      JOIN SICFOPS cfop
      ON cfop.cfop = a.cfop
      JOIN SINATUREZASOPERACAO natOp
      ON natOp.naturezaOperacao = cfop.naturezaOperacao
      JOIN SICAPITULOSNATUREZAOPERAC capNatFisc
      ON capNatFisc.capituloNaturezaOperacao = natOp.capituloNaturezaOperacao
      JOIN PAFILTROSPRODUTO filtrProd
      ON filtrProd.filtroProduto = a.filtroProduto
      WHERE a.operacaoFiscal            > 0
      AND a.ativo                       = 1
      AND a.cfop BETWEEN
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3000 ELSE 7000 END
          WHEN p_endPessMun_uf       = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1000 ELSE 5000 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2000 ELSE 6000 END
        END
        AND
        CASE
          WHEN p_endPessMun_uf = 'EX'
            AND p_cab_vendaConsumidor = 0
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 3999 ELSE 7999 END
          WHEN p_endPessMun_uf       = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_endPessEstMun_uf = p_endPessMun_uf
          THEN CASE WHEN p_cab_entradaSaida = 'E' THEN 1999 ELSE 5999 END
          ELSE CASE WHEN p_cab_entradaSaida = 'E' THEN 2999 ELSE 6999 END
        END
      AND TRUNC(a.dataValidadeInicial) <= TRUNC(SYSDATE)
      AND TRUNC(a.dataValidadeFinal)   >= TRUNC(SYSDATE)
      AND capNatFisc.entradaSaida       = p_cab_entradaSaida
      AND (a.regimeTributario           = ' '
        OR a.regimeTributario           = p_pessEst_regimeTributario)
      AND (a.tipoProduto                = '  '
        OR a.tipoProduto                = prod.tipoProduto)
      AND (a.origemMercadoria           = ' '
        OR a.origemMercadoria           = prod.origemMercadoria)
      AND (a.grupoFiscal                = 0
        OR a.grupoFiscal                = p_est_grupoFiscal)
      AND (a.ufOrigem                   = '  '
        OR a.ufOrigem                   =
          CASE
            WHEN p_cab_entradaSaida     = 'S'
            OR p_endPessMun_uf          = '  '
            OR p_cab_vendaConsumidor    = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.ufDestino                  = '  '
        OR a.ufDestino                  =
          CASE
            WHEN p_cab_entradaSaida     = 'E'
            OR p_endPessMun_uf          = '  '
            OR p_cab_vendaConsumidor    = 1
            THEN p_endPessEstMun_uf
            ELSE p_endPessMun_uf
          END)
      AND (a.municipioServico           = 0
        OR a.municipioServico           = p_cab_municipioFatoGerador)
      AND (a.indicadorConsumidorFinal   = ' '
        OR a.indicadorConsumidorFinal   = p_cab_indicadorConsumidorFinal)
      AND (a.indicadorInscricaoEstadual = ' '
        OR a.indicadorInscricaoEstadual =
          CASE
            WHEN p_pess_indicadorInscricaoEstad <> ' '
            THEN p_pess_indicadorInscricaoEstad
            WHEN p_cab_indicadorConsumidorFinal = '0'
            THEN '1'
            ELSE '9'
          END)
      AND (a.pessoa                     = 0
        OR p_cab_vendaConsumidor        = 0 AND a.pessoa = p_cab_pessoa)
      AND (p_cab_modeloDocumento        = 0
        OR EXISTS (
          SELECT 1
          FROM PAOPERFISCALXMODELOSDOCUM opXmodDoc
          WHERE opXmodDoc.operacaoFiscal = a.operacaoFiscal
          AND opXmodDoc.modeloDocumento  = p_cab_modeloDocumento
          AND opXmodDoc.ativo            = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAOPERFISCALXNCMS opXNCM
          WHERE opXNCM.operacaoFiscal = a.operacaoFiscal
          AND opXNCM.idNcm            = prod.idNcm
          AND opXNCM.ativo            = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAOPERFISCALXLISTASSERV opXlistServ
          WHERE opXlistServ.operacaoFiscal = a.operacaoFiscal
          AND opXlistServ.listaServicos    = prod.listaServicos
          AND opXlistServ.ativo            = 1))
      AND (filtrProd.filtrarProdutos               = 0
        AND filtrProd.filtrarCategoriasProdutos    = 0
        AND filtrProd.filtrarSubcategoriasProdutos = 0
        AND filtrProd.filtrarMarcas                = 0
        AND filtrProd.filtrarCaracteristicasA      = 0
        AND filtrProd.filtrarCaracteristicasB      = 0
        AND filtrProd.filtrarCaracteristicasC      = 0
        AND filtrProd.filtrarCaracteristicasD      = 0
        AND filtrProd.filtrarCaracteristicasE      = 0
        AND filtrProd.filtrarCores                 = 0
        AND filtrProd.filtrarTamanhos              = 0
        AND filtrProd.filtrarNCMs                  = 0
        AND filtrProd.filtrarListasServicos        = 0
        OR filtrProd.filtrarProdutos                = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXPRODUTOS filtroProdXProd
          WHERE filtroProdXProd.filtroProduto        = filtrProd.filtroProduto
          AND filtroProdXProd.produto                = p_produto
          AND filtroProdXProd.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 filtroProdXCatProd
            WHERE filtroProdXCatProd.filtroProduto  = filtrProd.filtroProduto
            AND filtroProdXCatProd.categoriaProduto = subCat.categoriaProduto
            AND filtroProdXCatProd.ativo            = 1))
        AND (filtrProd.filtrarSubcategoriasProdutos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXSUBCAPROD filtroProdXSubCatProd
            WHERE filtroProdXSubCatProd.filtroProduto     = filtrProd.filtroProduto
            AND filtroProdXSubCatProd.subcategoriaProduto = prod.subcategoriaProduto
            AND filtroProdXSubCatProd.ativo               = 1))
        AND (filtrProd.filtrarMarcas = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXMARCAS filtroProdXMarc
            WHERE filtroProdXMarc.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXMarc.marca           = prod.marca
            AND filtroProdXMarc.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasA = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERA filtroProdXCarA
            WHERE filtroProdXCarA.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXCarA.caracteristicaA = prod.caracteristicaA
            AND filtroProdXCarA.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasB = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERB filtroProdXCarB
            WHERE filtroProdXCarB.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXCarB.caracteristicaB = prod.caracteristicaB
            AND filtroProdXCarB.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasC = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERC filtroProdXCarC
            WHERE filtroProdXCarC.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXCarC.caracteristicaC = prod.caracteristicaC
            AND filtroProdXCarC.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasD = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERD filtroProdXCarD
            WHERE filtroProdXCarD.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXCarD.caracteristicaD = prod.caracteristicaD
            AND filtroProdXCarD.ativo           = 1))
        AND (filtrProd.filtrarCaracteristicasE = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXCARACTERE filtroProdXCarE
            WHERE filtroProdXCarE.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXCarE.caracteristicaE = prod.caracteristicaE
            AND filtroProdXCarE.ativo           = 1))
        AND filtrProd.filtrarCores    = 0
        AND filtrProd.filtrarTamanhos = 0
        AND (filtrProd.filtrarNCMs = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXNCMS filtroProdXNcms
            WHERE filtroProdXNcms.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXNcms.idNcm           = prod.idNcm
            AND filtroProdXNcms.ativo           = 1))
        AND (filtrProd.filtrarListasServicos = 0
          OR EXISTS (
            SELECT 1
            FROM PAFILTROPRODUTOXLISTASSE filtroProdXListServ
            WHERE filtroProdXListServ.filtroProduto = filtrProd.filtroProduto
            AND filtroProdXListServ.listaServicos   = prod.listaServicos
            AND filtroProdXListServ.ativo           = 1)))) a
    WHERE a.ordenacao = 1
    ),0)
  INTO v_operacaoFiscal
  FROM DUAL;
  RETURN v_operacaoFiscal;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_PRODUTO(
    p_dataPosicaoEstoque          IN DATE,
    p_gradeProduto                IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_prod_controleEstoque        IN NUMBER,
    p_documentoDesconsiderar      IN CHAR, -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
    p_idDocumentoDesconsiderar    IN NUMBER,
    p_estoqueFiscal               IN NUMBER)
  RETURN NUMBER
IS
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeDocumentoFiscal NUMBER;
  v_quantidadePreDocumento    NUMBER;
BEGIN
  v_quantidadeInventario      := 0;
  v_quantidadeEstoque         := 0;
  v_quantidadeDocumentoFiscal := 0;
  v_quantidadePreDocumento    := 0;
  -- KIT / COMBO
  IF p_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC((FUNC_ADD_BUSCA_ESTOQUE_PRODUTO(
        p_dataPosicaoEstoque,
        kit.gradeProdutoFilho,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        0,
        0,
        p_idEnderecoEstoque,
        0,
        gradProdFilho.produto,
        prodFilho.controleEstoque,
        p_documentoDesconsiderar,
        p_idDocumentoDesconsiderar,
        p_estoqueFiscal) / kit.quantidade), uniMedPai.casasDecimaisUnidadeMedida))
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
      JOIN CAGRADESPRODUTO gradProdPai ON gradProdPai.gradeProduto = kit.gradeProduto
      JOIN CAPRODUTOS prodPai ON prodPai.produto = gradProdPai.produto
      JOIN SIUNIDADESMEDIDA uniMedPai ON uniMedPai.unidadeMedida = prodPai.unidadeMedida
      WHERE kit.gradeProduto = p_gradeProduto
      AND kit.ativo = 1
      AND kit.quantidade > 0
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND prodFilho.controleEstoque IN (1,3,4,5,11,12)),0)
    INTO v_quantidadeEstoque
    FROM DUAL;
  -- DEMAIS PRODUTOS (EXCETO KIT / COMBO)
  ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
    -- v_idInventarioEstoque / v_dataInventario
    SELECT
      TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
    INTO
      v_idInventarioEstoque,
      v_dataInventario
    FROM (
      SELECT
        COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
          || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
      FROM MOINVENTARIOSESTOQUE inv
      WHERE inv.estabelecimento = p_estabelecimento
      AND inv.inventarioEstoque <> 0
      AND (p_documentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND TRUNC (inv.data) < TRUNC(p_dataPosicaoEstoque)
      AND inv.motivoInventarioEstoque = '01') a;
--      AND (inv.motivoInventarioEstoque = '01'
--        OR EXISTS(
--          SELECT 1
--          FROM MOINVENTARIOESTOQUEXITENS itemInv
--          JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
--          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
--          AND gradProd.produto = p_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = est.gradeProduto
        WHERE gradProd.produto = p_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND TRUNC(est.data) <= TRUNC (p_dataPosicaoEstoque)
        AND (v_idInventarioEstoque <= 0
		  OR TRUNC(est.data) > TRUNC(v_dataInventario))),
      CASE
        WHEN v_idInventarioEstoque > 0 AND NOT (v_dataInventario IS NULL)
        THEN TRUNC (v_dataInventario) + 1
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END)
    INTO v_dataPosicaoEstoqueInicial
    FROM DUAL;
    -- v_quantidadeInventario
    IF v_idInventarioEstoque > 0 THEN
      SELECT COALESCE((
        SELECT SUM (CASE WHEN p_estoqueFiscal = 1 THEN est.quantidadeFiscal ELSE est.quantidadeGerencial END)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = est.gradeProduto
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),0)
      INTO v_quantidadeInventario
      FROM DUAL;
    ELSE
      v_quantidadeInventario := 0;
    END IF;
    -- v_quantidadeEstoque
    IF TRUNC (v_dataPosicaoEstoqueInicial) <= TRUNC (p_dataPosicaoEstoque) THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOESTOQUES est
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND TRUNC(est.data) BETWEEN TRUNC (v_dataPosicaoEstoqueInicial) AND TRUNC (p_dataPosicaoEstoque)
        AND (p_indicadorPropriedadePosseIt IS NULL
		  OR p_indicadorPropriedadePosseIt = ' '
		  OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_pessoaParticipante = 0
		  OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_localEstoque = 0
		  AND locEst.validoEstoqueTotal = 1
		  OR est.localEstoque = p_localEstoque)
         AND (p_personalizacao = 0
		  OR est.personalizacao = p_personalizacao)
       AND (p_idLoteEstoque = 0
		  OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque = 0
		  OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		  OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        AND (p_estoqueFiscal = 0
		  OR est.operacaoInternaEstoque <> 101)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    ELSE
      v_quantidadeEstoque := 0;
    END IF;
    -- v_quantidadeDocumentoFiscal
    IF p_documentoDesconsiderar = 'D' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idItemDocFiscal = itemDoc.idItemDocFiscal
        JOIN MOESTOQUES est ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.idDocumentoFiscal = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND TRUNC(est.data) <= TRUNC (p_dataPosicaoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        AND (p_estoqueFiscal = 0
		      OR est.operacaoInternaEstoque <> 101)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    ELSE
      v_quantidadeDocumentoFiscal := 0;
    END IF;
    -- v_quantidadePreDocumento
    IF p_documentoDesconsiderar = 'P' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOPREDOCUMXITENS itemDoc
        JOIN MOPREDOCUMXESTOQUE docXEst ON docXEst.idItemPreDocumento = itemDoc.idItemPreDocumento
        JOIN MOESTOQUES est ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.preDocumento = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND TRUNC(est.data) <= TRUNC (p_dataPosicaoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        AND (p_estoqueFiscal = 0
		      OR est.operacaoInternaEstoque <> 101)),0)
      INTO v_quantidadePreDocumento
      FROM DUAL;
    ELSE
      v_quantidadePreDocumento := 0;
    END IF;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    - v_quantidadeDocumentoFiscal
    - v_quantidadePreDocumento;
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);
  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 (3,4)
          THEN 
            TRUNC ((
              SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
              FROM (
                SELECT kit.gradeProduto,
                  kit.gradeProdutoFilho,
                  kit.quantidade quantidadeKit,
                  BUSCA_RESERVAS_ESTOQUE(
                    p_config_82_considLenteDispon,
                    p_config_83_considLenteEstoqu,
                    p_config_160_permiteTransfSem,
                    0, -- p_produto,
                    0, -- p_cor,
                    ' ', -- p_tamanho,
                    kit.gradeProdutoFilho,
                    0, -- p_idLoteEstoque,
                    p_estabelecimento,
                    p_indicadorPropriedadePosseIt,
                    p_pessoaParticipante,
                    p_localEstoque,
                    p_idEnderecoEstoque,
                    0, -- p_idNumeroSerie
                    p_orcamentoDesconsiderar,
                    p_transferenciaDesconsiderar,
                    p_entradaSaida) quantidadeSaldo
                FROM CAGRADEPRODUTOXKITSCOMBOS kit
                JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
                JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
                WHERE kit.quantidade > 0
                AND kit.gradeProduto <> kit.gradeProdutoFilho
                AND prodFilho.controleEstoque IN (1,3,4,5,11,12)
                GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
              ) a
              WHERE a.gradeProduto = gradProd.gradeProduto
            ), uniMed.casasDecimaisUnidadeMedida)
          WHEN prod.controleEstoque IN (1,5,11,12)
          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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
              AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
              AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
              AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
              AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
            ),0)
          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_orcamentoDesconsiderar > 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            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_orcamentoDesconsiderar
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                      AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                      AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
                  JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  AND prodFilho.controleEstoque IN (1,5,11,12)
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            WHEN prod.controleEstoque IN (1,5,11,12)
            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_orcamentoDesconsiderar
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
              ),0)
            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_transferenciaDesconsiderar > 0 THEN
    SELECT COALESCE((
      SELECT SUM(a.quantidadeSaldo)
      FROM (
        SELECT
          CASE
            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_transferenciaDesconsiderar
                      AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                      AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                      AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                      AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                      AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
                    ) quantidadeSaldo
                  FROM CAGRADEPRODUTOXKITSCOMBOS kit
                  JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
                  JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
                  WHERE kit.quantidade > 0
                  AND kit.gradeProduto <> kit.gradeProdutoFilho
                  AND prodFilho.controleEstoque IN (1,5,11,12)
                  GROUP BY kit.gradeProduto, kit.gradeProdutoFilho, kit.quantidade
                ) a
                WHERE a.gradeProduto = gradProd.gradeProduto
              ), uniMed.casasDecimaisUnidadeMedida)
            WHEN prod.controleEstoque IN (1,5,11,12)
            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_transferenciaDesconsiderar
                AND (p_idLoteEstoque = 0 OR a.idLoteEstoque = p_idLoteEstoque)
                AND (p_estabelecimento = 0 OR a.estabelecimento = p_estabelecimento)
                AND (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR a.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipante = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoque = p_localEstoque)
                AND (p_idEnderecoEstoque = 0 OR a.idEnderecoEstoque = p_idEnderecoEstoque)
                AND (p_idNumeroSerie = 0 OR a.idNumeroSerie = p_idNumeroSerie)
              ),0)
            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_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,12)
            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_transferenciaDesconsiderar
                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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                AND (p_pessoaParticipante = 0 OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoqueSaida = p_localEstoque)
                AND (prod.controleEstoque IN (1,12) 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_transferenciaDesconsiderar
                      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 (p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = ' ' OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
                      AND (p_pessoaParticipante = 0 OR a.pessoaParticipanteSaida = p_pessoaParticipante)
                      AND (p_localEstoque = 0 AND locEst.validoEstoqueTotal = 1 OR a.localEstoqueSaida = p_localEstoque)
                    ) 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_QUANTIDADE_ESTOQUE(
    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_preDocumentoDesconsiderar   IN NUMBER,
    p_idDocumentoFiscalDesconsid  IN NUMBER,
    p_dataPosicaoEstoque          IN DATE)
  RETURN NUMBER
IS
  v_quantidadeEstoque NUMBER (15,6);
BEGIN
  SELECT COALESCE((
    SELECT SUM (FUNC_ADD_BUSCA_ESTOQUE_PRODUTO(
      p_dataPosicaoEstoque,
      gradprod.gradeProduto,
      est.estabelecimento,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      p_localEstoque,
      p_personalizacao,
      p_idLoteEstoque,
      p_idEnderecoEstoque,
      p_idNumeroSerie,
      gradprod.produto,
      prod.controleEstoque,
      CASE
	      WHEN p_idDocumentoFiscalDesconsid > 0
	      THEN 'D'
	      WHEN p_preDocumentoDesconsiderar > 0
	      THEN 'P'
	      ELSE ' '
      END,
      CASE
	      WHEN p_idDocumentoFiscalDesconsid > 0
	      THEN p_idDocumentoFiscalDesconsid
	      WHEN p_preDocumentoDesconsiderar > 0
	      THEN p_preDocumentoDesconsiderar
	      ELSE 0
      END,
	    0))
    FROM PAESTABELECIMENTOS est
	  JOIN CAGRADESPRODUTO gradprod ON 1=1
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto    
    WHERE (p_estabelecimento = 0
      OR est.estabelecimento = p_estabelecimento)
    AND (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)),0)
  INTO v_quantidadeEstoque
  FROM DUAL;
  RETURN v_quantidadeEstoque;
END;

/

create or replace FUNCTION BUSCA_PRODUTOXMARGEMMARKUP(
    p_produto             IN NUMBER,
    p_tabelaPreco         IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_margemMarkup NUMBER;

BEGIN
  SELECT COALESCE ((
  SELECT a.margemMarkup
  FROM (
    SELECT
      a.margemMarkup,
      ROW_NUMBER() OVER (
        ORDER BY
          a.produto DESC,
          CASE
            WHEN d.filtrarProdutos = 1
              AND EXISTS (
                SELECT 1
                FROM PAFILTROPRODUTOXPRODUTOS filtroProdXProd
                WHERE filtroProdXProd.filtroProduto = a.filtroProduto
                AND filtroProdXProd.produto = p_produto
                AND filtroProdXProd.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 (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 filtroProdXProd WHERE filtroProdXProd.filtroProduto = a.filtroProduto AND filtroProdXProd.produto = p_produto AND filtroProdXProd.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 filtroProdXCatProd WHERE filtroProdXCatProd.filtroProduto = a.filtroProduto AND filtroProdXCatProd.categoriaProduto = c.categoriaProduto AND filtroProdXCatProd.ativo = 1))
      AND (d.filtrarSubcategoriasProdutos = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXSUBCAPROD filtroProdXSubCatProd WHERE filtroProdXSubCatProd.filtroProduto = a.filtroProduto AND filtroProdXSubCatProd.subcategoriaProduto = b.subcategoriaProduto AND filtroProdXSubCatProd.ativo = 1))
      AND (d.filtrarMarcas = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXMARCAS filtroProdXMarc WHERE filtroProdXMarc.filtroProduto = a.filtroProduto AND filtroProdXMarc.marca = b.marca AND filtroProdXMarc.ativo = 1))
      AND (d.filtrarCaracteristicasA = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXCARACTERA filtroProdXCarA WHERE filtroProdXCarA.filtroProduto = a.filtroProduto AND filtroProdXCarA.caracteristicaA = b.caracteristicaA AND filtroProdXCarA.ativo = 1))
      AND (d.filtrarCaracteristicasB = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXCARACTERB filtroProdXCarB WHERE filtroProdXCarB.filtroProduto = a.filtroProduto AND filtroProdXCarB.caracteristicaB = b.caracteristicaB AND filtroProdXCarB.ativo = 1))
      AND (d.filtrarCaracteristicasC = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXCARACTERC filtroProdXCarC WHERE filtroProdXCarC.filtroProduto = a.filtroProduto AND filtroProdXCarC.caracteristicaC = b.caracteristicaC AND filtroProdXCarC.ativo = 1))
      AND (d.filtrarCaracteristicasD = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXCARACTERD filtroProdXCarD WHERE filtroProdXCarD.filtroProduto = a.filtroProduto AND filtroProdXCarD.caracteristicaD = b.caracteristicaD AND filtroProdXCarD.ativo = 1))
      AND (d.filtrarCaracteristicasE = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXCARACTERE filtroProdXCarE WHERE filtroProdXCarE.filtroProduto = a.filtroProduto AND filtroProdXCarE.caracteristicaE = b.caracteristicaE AND filtroProdXCarE.ativo = 1))
      AND (d.filtrarNCMs = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXNCMS filtroProdXNcms WHERE filtroProdXNcms.filtroProduto = a.filtroProduto AND filtroProdXNcms.idNcm = b.idNcm AND filtroProdXNcms.ativo = 1))
      AND (d.filtrarListasServicos = 0 OR EXISTS (SELECT 1 FROM PAFILTROPRODUTOXLISTASSE filtroProdXListServ WHERE filtroProdXListServ.filtroProduto = a.filtroProduto AND filtroProdXListServ.listaServicos = b.listaServicos AND filtroProdXListServ.ativo = 1))
    )) a
  WHERE a.ordenacao = 1
  ),0) INTO v_margemMarkup
  FROM DUAL;
  RETURN v_margemMarkup;
END;

/

create or replace FUNCTION FUNC_ADD_GRADE_PROD_MONTA_SQL(
    p_config_28_somenteProdEst     IN NUMBER,
    p_config_31_pesqPeloIdProduto  IN NUMBER,
    p_config_32_pesqPeloEanGtin    IN NUMBER,
    p_config_33_pesqPelaReferencia IN NUMBER,
    p_config_34_pesqPeloIdGradePro IN NUMBER,
    p_config_35_pesqPeloProdutoImp IN NUMBER,
    p_config_36_pesqPeloCodFabrica IN NUMBER,
    p_config_37_pesqPeloCodAnterio IN NUMBER,
    p_config_38_pesqPeloProdXPess  IN NUMBER,
    p_config_39_pesqPeloLote       IN NUMBER,
    p_config_40_pesqPeloNumSerie   IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_join                         IN CLOB,
    p_andWhere                     IN CLOB,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_pessoa                   IN NUMBER,
    p_produto                      IN NUMBER,
    p_codigoDescricaoComPontos     IN VARCHAR2,
    p_codigoDescricaoSemPontos     IN VARCHAR2,
    p_somenteAtivo                 IN NUMBER
)
    RETURN CLOB
IS 
  
    v_select                       CLOB;
    v_codigoDescricaoLoop          VARCHAR2(4000);

BEGIN

  -- Se digitou número
  IF (LENGTH (TRIM (p_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (p_codigoDescricaoSemPontos) = 1) THEN

    IF (p_config_31_pesqPeloIdProduto = 1) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.produto = ' || RTRIM (p_codigoDescricaoSemPontos) ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;

    IF (p_config_32_pesqPeloEanGtin = 1) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.eanGtin  = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;

    IF (p_config_34_pesqPeloIdGradePro = 1) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.gradeProduto = ' || RTRIM (p_codigoDescricaoSemPontos) ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;

    IF (p_config_35_pesqPeloProdutoImp = 1) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.produtoImpresso = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

      IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
        v_select :=
          FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
            p_config_28_somenteProdEst,
            p_estabelecimentoAtivo,
            v_select,
            ' ',
            p_join,
            p_cab_estabelecimento,
            p_somenteAtivo
          ) ||
          ' WHERE a.produtoImpresso = ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
          (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
          (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
      END IF;

      v_codigoDescricaoLoop := p_codigoDescricaoComPontos;
      WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
        v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
      END LOOP;
      IF (v_codigoDescricaoLoop <> ' ') THEN
        v_select :=
          FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
            p_config_28_somenteProdEst,
            p_estabelecimentoAtivo,
            v_select,
            ' ',
            p_join,
            p_cab_estabelecimento,
            p_somenteAtivo
          ) ||
          ' WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || '''' ||
          (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
          (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
      END IF;
    END IF;

    IF (p_config_36_pesqPeloCodFabrica = 1) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.codigoFabrica = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

      IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
        v_select :=
          FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
            p_config_28_somenteProdEst,
            p_estabelecimentoAtivo,
            v_select,
            ' ',
            p_join,
            p_cab_estabelecimento,
            p_somenteAtivo
          ) ||
          ' WHERE a.codigoFabrica = ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
          (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
          (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
      END IF;
    END IF;

  -- Se não digitou número
  ELSE
    v_select := 
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (p_codigoDescricaoComPontos), ' ', '%')) || '%''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

    IF (p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(p_codigoDescricaoSemPontos,1,1)) = 1) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.eanGtin  = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;

    IF (p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(p_codigoDescricaoSemPontos,1,1)) = 1) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.produtoImpresso = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

      IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
        v_select :=
          FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
            p_config_28_somenteProdEst,
            p_estabelecimentoAtivo,
            v_select,
            ' ',
            p_join,
            p_cab_estabelecimento,
            p_somenteAtivo
          ) ||
          ' WHERE a.produtoImpresso = ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
          (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
          (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
      END IF;

      v_codigoDescricaoLoop := p_codigoDescricaoComPontos;
      WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
        v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
      END LOOP;
      IF (v_codigoDescricaoLoop <> ' ') THEN
        v_select :=
          FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
            p_config_28_somenteProdEst,
            p_estabelecimentoAtivo,
            v_select,
            ' ',
            p_join,
            p_cab_estabelecimento,
            p_somenteAtivo
          ) ||
          ' WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || '''' ||
          (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
          (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
      END IF;
    END IF;
  END IF;

  -- Válido tanto para números quanto não números
  IF (p_config_33_pesqPelaReferencia = 1) THEN
    v_select :=
      FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
        p_config_28_somenteProdEst,
        p_estabelecimentoAtivo,
        v_select,
        ' ',
        p_join,
        p_cab_estabelecimento,
        p_somenteAtivo
      ) ||
      ' WHERE produt.referencia LIKE ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
      (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
      (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

    IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE produt.referencia LIKE ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;
  END IF;

  IF (p_config_37_pesqPeloCodAnterio = 1) THEN
    v_select :=
      FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
        p_config_28_somenteProdEst,
        p_estabelecimentoAtivo,
        v_select,
        ' ',
        p_join,
        p_cab_estabelecimento,
        p_somenteAtivo
      ) ||
      ' WHERE a.codigoAnterior LIKE ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
      (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
      (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

    IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' WHERE a.codigoAnterior LIKE ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;
  END IF;

  IF (p_config_38_pesqPeloProdXPess = 1) THEN
    v_select :=
      FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
        p_config_28_somenteProdEst,
        p_estabelecimentoAtivo,
        v_select,
        ' ',
        p_join,
        p_cab_estabelecimento,
        p_somenteAtivo
      ) ||
      ' JOIN CAGRADEPRODUTOXPESSOAS prodXPess' ||
        ' ON prodXPess.gradeProduto = a.gradeProduto' ||
        ' AND prodXPess.codigoProduto = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        ' AND prodXPess.ativo = 1' ||
      ' WHERE ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
      ' AND ' || (CASE WHEN p_cab_pessoa = 0 THEN 'prodXPess.pessoa = 0' ELSE '(prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END) ||
      (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
      (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

    IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' JOIN CAGRADEPRODUTOXPESSOAS prodXPess' ||
          ' ON prodXPess.gradeProduto = a.gradeProduto' ||
          ' AND prodXPess.codigoProduto = ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
          ' AND prodXPess.ativo = 1' ||
        ' WHERE ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
        ' AND ' || (CASE WHEN p_cab_pessoa = 0 THEN 'prodXPess.pessoa = 0' ELSE '(prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END) ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;
  END IF;

  IF (p_config_39_pesqPeloLote = 1) THEN
    v_select :=
      FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
        p_config_28_somenteProdEst,
        p_estabelecimentoAtivo,
        v_select,
        ' prodXLote.idLoteEstoque, prodXLote.loteEstoque, 0 idNumeroSerie, '' '' numeroSerie ',
        p_join,
        p_cab_estabelecimento,
        p_somenteAtivo
      ) ||
      ' JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote' ||
        ' ON prodXLote.gradeProduto = a.gradeProduto' ||
        ' AND prodXLote.loteEstoque = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        ' AND prodXLote.ativo = 1' ||
      ' WHERE ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
      (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
      (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

    IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
          ' prodXLote.idLoteEstoque, prodXLote.loteEstoque, 0 idNumeroSerie, '' '' numeroSerie ',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote' ||
          ' ON prodXLote.gradeProduto = a.gradeProduto' ||
          ' AND prodXLote.loteEstoque = ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
          ' AND prodXLote.ativo = 1' ||
        ' WHERE ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;
  END IF;

  IF (p_config_40_pesqPeloNumSerie = 1) THEN
    v_select :=
      FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
        p_config_28_somenteProdEst,
        p_estabelecimentoAtivo,
        v_select,
        ' prodXNumSer.idLoteEstoque, prodXLote.loteEstoque, prodXNumSer.idNumeroSerie, prodXNumSer.numeroSerie ',
        p_join,
        p_cab_estabelecimento,
        p_somenteAtivo
      ) ||
      ' JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer' ||
        ' ON prodXNumSer.gradeProduto = a.gradeProduto' ||
        ' AND prodXNumSer.numeroSerie = ''' || RTRIM (p_codigoDescricaoSemPontos) || '''' ||
        ' AND prodXNumSer.ativo = 1' ||
      ' JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote' ||
        ' ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque' ||
        ' AND prodXLote.ativo = 1' ||
      ' WHERE ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
      (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
      (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);

    IF (p_codigoDescricaoComPontos <> p_codigoDescricaoSemPontos) THEN
      v_select :=
        FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
          p_config_28_somenteProdEst,
          p_estabelecimentoAtivo,
          v_select,
        ' prodXNumSer.idLoteEstoque, prodXLote.loteEstoque, prodXNumSer.idNumeroSerie, prodXNumSer.numeroSerie',
          p_join,
          p_cab_estabelecimento,
          p_somenteAtivo
        ) ||
        ' JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer' ||
          ' ON prodXNumSer.gradeProduto = a.gradeProduto' ||
          ' AND prodXNumSer.numeroSerie = ''' || RTRIM (p_codigoDescricaoComPontos) || '''' ||
          ' AND prodXNumSer.ativo = 1' ||
        ' JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote' ||
          ' ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque' ||
          ' AND prodXLote.ativo = 1' ||
        ' WHERE ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
        (CASE WHEN p_somenteAtivo = 1 THEN ' AND a.ativo = 1 ' ELSE '' END) ||
        (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END);
    END IF;
  END IF;

  IF (v_select IS NULL OR v_select = ' ') THEN
    v_select :=
          FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
            p_config_28_somenteProdEst,
            p_estabelecimentoAtivo,
            v_select,
            ' ',
            p_join,
            p_cab_estabelecimento,
            p_somenteAtivo
          ) ||
          ' WHERE 1<>1';
  END IF;

  v_select := TRIM (v_select) || ' ) a WHERE ROWNUM <=2) a';


  RETURN v_select;

END;

/

create or replace PROCEDURE ADD_MOPREDOCUMXPAGAMENTOS_ECOR (
  p_idPagamentoPreDocumento IN NUMBER)
IS
  CURSOR c_mot IS
    SELECT idMotivoBloqueioDocumento
    FROM MOMOTBLOQXPREDOCUMPAGAM
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  CURSOR c_fin IS
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
BEGIN
  FOR a IN c_mot
  LOOP
    ADD_MOMOTIVOSBLOQUEIOS_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
  FOR a IN c_fin
  LOOP
    ADD_MOFINANCEIROS_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MOPREDOCUMXPROMOCOES WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  UPDATE MOTRANSACOESTEF SET idPagamentoPreDocumento = 0 WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
END ADD_MOPREDOCUMXPAGAMENTOS_ECOR;

/

create or replace PROCEDURE ADD_MOMOTIVOSBLOQUEIOS_EXCLUI (
  p_idMotivoBloqueioDocumento   IN NUMBER)
IS
BEGIN
  DELETE MOMOTBLOQXORCAMENTOS      WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXORCAMENTOITENS  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXORCAMENTOPAGAM  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREDOCUMENTOS   WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXORCAMENTOITENS  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREDOCUMITENS   WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREDOCUMPAGAM   WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXDOCUMENTOSFISC  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXDOCFISCALITENS  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXDOCFISCALPAGAM  WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXFINANCEIROS     WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXPREVISOESFINANC WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTBLOQXLIBERACOES      WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
  DELETE MOMOTIVOSBLOQUEIOS        WHERE idMotivoBloqueioDocumento = p_idMotivoBloqueioDocumento;
END ADD_MOMOTIVOSBLOQUEIOS_EXCLUI;

/

create or replace PROCEDURE ADD_MOFINANCEIROS_VOLTA_SALDO (
  p_baixa_idFinanceiro           IN NUMBER,
  p_baixa_cotacao                IN NUMBER,
  p_baixa_valorBrutoIndexado     IN NUMBER,
  p_baixa_valorBruto             IN NUMBER)
IS
  s_financ_idFinanceiro          NUMBER;
  s_financ_saldo                 NUMBER;
  s_financ_cotacao               NUMBER;
  s_financ_valorIndexado         NUMBER;
  s_financ_saldoIndexado         NUMBER;
BEGIN
  SELECT
    COALESCE(MAX(idFinanceiro),0),
    COALESCE(MAX(saldo),0),
    COALESCE(MAX(cotacao),0),
    COALESCE(MAX(valorIndexado),0),
    COALESCE(MAX(saldoIndexado),0)
  INTO
    s_financ_idFinanceiro,
    s_financ_saldo,
    s_financ_cotacao,
    s_financ_valorIndexado,
    s_financ_saldoIndexado
  FROM MOFINANCEIROS
  WHERE idFinanceiro = p_baixa_idFinanceiro;
  IF s_financ_idFinanceiro > 0 THEN
    UPDATE MOFINANCEIROS SET
      saldo = s_financ_saldo + CASE WHEN s_financ_cotacao = p_baixa_cotacao OR s_financ_cotacao = 0 THEN p_baixa_valorBruto ELSE ROUND(p_baixa_valorBrutoIndexado*s_financ_cotacao,2) END,
      saldoIndexado = s_financ_saldoIndexado + p_baixa_valorBrutoIndexado,
      efetivado = 0
    WHERE idFinanceiro = p_baixa_idFinanceiro;
  END IF;
END ADD_MOFINANCEIROS_VOLTA_SALDO;

/

create or replace PROCEDURE ADD_MOFINANCEIROXBAIXAS_CORREL (
  p_idBaixaFinanceiro                IN NUMBER)
IS
BEGIN
  -- 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.idBaixaFinanceiro = p_idBaixaFinanceiro);
  UPDATE MOCONCILIACOESCARTOES       SET idFinanceiro = 0, idBaixaFinanceiro = 0 WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  -- Exclui correlatos
  DELETE MOBAIXAFINANCXPREDOCUM      WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  DELETE MOBAIXAFINANCXDOCFISCAL     WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  DELETE MOREPARCXBAIXAFINANC        WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  -- Exclui correlatos com outra perna correlata que já deve ter sido excluída
  DELETE MOBAIXAXBAIXAFINANCEIRO     WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  DELETE MOBAIXAXBAIXAFINANCEIRO     WHERE idBaixaFinanceiroCorrel = p_idBaixaFinanceiro;
  DELETE MOBAIXAXNOVOFINANCEIRO      WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
  -- Exclui financeiro x baixa principal
  DELETE MOFINANCEIROXBAIXAS         WHERE idBaixaFinanceiro = p_idBaixaFinanceiro;
END ADD_MOFINANCEIROXBAIXAS_CORREL;

/

create or replace PROCEDURE ADD_MOFINANCEIROS_EXCLUICORREL (
  p_idFinanceiro                IN NUMBER)
IS
  CURSOR c_mot IS
    SELECT idMotivoBloqueioDocumento
    FROM MOMOTBLOQXFINANCEIROS
    WHERE idFinanceiro = p_idFinanceiro;
BEGIN
  FOR a IN c_mot
  LOOP
    ADD_MOMOTIVOSBLOQUEIOS_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
  -- 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 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 MOFINANCEIROXRATEIO         WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCOMISSOES      WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXDOCUMENTOS     WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXARQUIVOS       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_MOFINANCEIROS_EXCLUICORREL;

/

create or replace PROCEDURE ADD_MOFINANCEIROS_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;
  CURSOR c_financExcluir IS
    SELECT idFinanceiroCorrelato idFinanceiro
    FROM MOFINANCEIROXCORRELATO
    WHERE idFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT idFinanceiro
    FROM MOFINANCEIROXCORRELATO
    WHERE idFinanceiroCorrelato = p_idFinanceiro
    UNION ALL
    SELECT a.idNovoFinanceiro idFinanceiro
    FROM MOBAIXAXNOVOFINANCEIRO a
    JOIN MOFINANCEIROXBAIXAS b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    WHERE b.idFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idFinanceiro = p_idFinanceiro
    AND a.baixaAutomatica = 1
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXNOVOFINANCEIRO b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    WHERE 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 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 c.idFinanceiro = p_idFinanceiro
    AND a.baixaAutomatica = 1;
  CURSOR c_baixas IS
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXNOVOFINANCEIRO b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    WHERE 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 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 c.idFinanceiro = p_idFinanceiro;
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 c_financExcluir
    LOOP
      IF r_idsFinanceirosDesconsiderar IS NULL OR r_idsFinanceirosDesconsiderar = ' ' OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0 THEN
        ADD_MOFINANCEIROS_EXCLUI_LOOP (a.idFinanceiro, r_idsFinanceirosDesconsiderar , r_idsBaixasDesconsiderar, r_idsFinanceirosDesconsiderar , r_idsBaixasDesconsiderar);
      END IF;
    END LOOP;
    FOR a IN c_baixas
    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_MOFINANCEIROS_AJUSTA_SALDO (
            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_MOFINANCEIROXBAIXAS_CORREL (a.idBaixaFinanceiro);
      END IF;
    END LOOP;
    ADD_MOFINANCEIROS_EXCLUICORREL (p_idFinanceiro);
  END IF;
END ADD_MOFINANCEIROS_EXCLUI_LOOP;

/

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

/

create or replace PROCEDURE ADD_GRADE_PRODUTO_TROCA(
    p_config_28_somenteProdEst     IN NUMBER,
    p_config_31_pesqPeloIdProduto  IN NUMBER,
    p_config_32_pesqPeloEanGtin    IN NUMBER,
    p_config_33_pesqPelaReferencia IN NUMBER,
    p_config_34_pesqPeloIdGradePro IN NUMBER,
    p_config_35_pesqPeloProdutoImp IN NUMBER,
    p_config_36_pesqPeloCodFabrica IN NUMBER,
    p_config_37_pesqPeloCodAnterio IN NUMBER,
    p_config_38_pesqPeloProdXPess  IN NUMBER,
    p_config_39_pesqPeloLote       IN NUMBER,
    p_config_40_pesqPeloNumSerie   IN NUMBER,
    p_config_142_digitosProdEanInt IN CHAR,
    p_config_348_excessaoBuscaCod  IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_gradeProduto                 IN NUMBER,
    p_codigoDescricao              IN VARCHAR2,
    p_trocou                       IN NUMBER,
    p_join                         IN CLOB,
    p_andWhere                     IN CLOB,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_pessoa                   IN NUMBER,
    p_produto                      IN NUMBER,
    /* Retornos */
    r_gradeProduto                 OUT NUMBER,
    r_codigoDescricao              OUT CHAR,
    r_trocou                       OUT NUMBER,
    r_selecionou                   OUT NUMBER,
    r_abrirTelaOnline              OUT NUMBER,
    r_mensagemErro                 OUT VARCHAR2,
    r_observacoesErro              OUT CLOB,
    r_codigoEANInterno             OUT VARCHAR2,
    r_idLoteEstoque                OUT NUMBER,
    r_loteEstoque                  OUT VARCHAR2,
    r_idNumeroSerie                OUT NUMBER,
    r_numeroSerie                  OUT VARCHAR2)
IS
  v_codigoDescricaoComPontos   VARCHAR2(4000);
  v_codigoDescricaoSemPontos   VARCHAR2(4000);
  v_codigoDescricaoLoop        VARCHAR2(4000);
  v_select                     CLOB;
  v_gradeProduto               NUMBER;
  v_produtoImpresso            VARCHAR2(60);
  v_descricaoImpressa          VARCHAR2(120);
  v_idLoteEstoque              NUMBER;
  v_loteEstoque                VARCHAR2(20);
  v_idNumeroSerie              NUMBER;
  v_numeroSerie                VARCHAR2(60);
  v_contaRegistros             NUMBER;
BEGIN
  r_gradeProduto               := p_gradeProduto;
  r_codigoDescricao            := p_codigoDescricao;
  r_trocou                     := p_trocou;
  r_selecionou                 := 0;
  r_abrirTelaOnline            := 0;
  r_mensagemErro               := ' ';
  r_observacoesErro            := ' ';
  r_codigoEANInterno           := ' ';
  r_idLoteEstoque              := 0;
  r_loteEstoque                := ' ';
  r_idNumeroSerie              := 0;
  r_numeroSerie                := ' ';
  v_codigoDescricaoComPontos   := ' ';
  v_codigoDescricaoSemPontos   := ' ';
  v_select                     := ' ';
  v_gradeProduto               := 0;
  v_produtoImpresso            := ' ';
  v_descricaoImpressa          := ' ';
  v_idLoteEstoque              := 0;
  v_loteEstoque                := ' ';
  v_idNumeroSerie              := 0;
  v_numeroSerie                := ' ';
  v_contaRegistros             := 0;
  IF p_codigoDescricao = ' ' AND p_produto = 0 THEN
    r_gradeProduto := 0;
    r_selecionou   := 1;
    r_trocou       := 0;
  ELSE
    IF p_config_142_digitosProdEanInt IN ('4','5','6')
      AND p_produto = 0
      AND SUBSTR(p_codigoDescricao,1,1)='2'
      AND LENGTH (RTRIM(p_codigoDescricao))=13
      AND FUNC_ADD_CONTEUDO_NUMERICO(p_codigoDescricao) = 1 THEN
      SELECT
        COALESCE(MAX(gradeProduto),0),
        COALESCE(MAX(produtoImpresso),' '),
        COALESCE(MAX(descricaoImpressa),' '),
        COUNT(1) contaRegistros
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_contaRegistros
      FROM CAGRADESPRODUTO
      WHERE produtoImpresso = TRIM(TO_CHAR(TO_NUMBER(SUBSTR(p_codigoDescricao,2,TO_NUMBER(p_config_142_digitosProdEanInt)))));
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_codigoEANInterno  := p_codigoDescricao;
      ELSE
        v_gradeProduto      := 0;
        v_produtoImpresso   := ' ';
        v_descricaoImpressa := ' ';
        v_contaRegistros    := 0;
      END IF;
    END IF;
    IF v_contaRegistros = 0 THEN
      IF p_codigoDescricao = ' ' THEN
        v_select :=
          FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
            p_config_28_somenteProdEst,
            p_estabelecimentoAtivo,
            v_select,
            ' ',
            p_join,
            p_cab_estabelecimento,
            1
          ) ||
          ' WHERE a.ativo = 1' ||
          ' AND ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
          (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END) ||
          ' ) a WHERE ROWNUM <=2) a';
      ELSE
        v_codigoDescricaoComPontos := UPPER (REPLACE (REPLACE (TRIM (r_codigoDescricao), '*', '%'), '''', ''''''));
        IF p_config_348_excessaoBuscaCod = 1 AND LENGTH (TRIM (v_codigoDescricaoComPontos)) = 16 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoComPontos) = 1 THEN
          v_codigoDescricaoComPontos := SUBSTR(v_codigoDescricaoComPontos,1,12);
        END IF;
        v_codigoDescricaoSemPontos := REPLACE (REPLACE (REPLACE (REPLACE (RTRIM (v_codigoDescricaoComPontos), '.', ''), '-', ''), '/', ''), '\', '');
        IF v_codigoDescricaoSemPontos = ' ' THEN 
          v_select :=
            FUNC_ADD_GRADE_PROD_MONTA_SQL2 (
              p_config_28_somenteProdEst,
              p_estabelecimentoAtivo,
              v_select,
              ' ',
              p_join,
              p_cab_estabelecimento,
              1
            ) ||
            ' WHERE a.ativo = 1' ||
            ' AND ' || (CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END) ||
            (CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE ' ' || TRIM (p_andWhere) END) ||
            ' ) a WHERE ROWNUM <=2) a';
        ELSE
          v_select := 
            FUNC_ADD_GRADE_PROD_MONTA_SQL(
              p_config_28_somenteProdEst,
              p_config_31_pesqPeloIdProduto,
              p_config_32_pesqPeloEanGtin,
              p_config_33_pesqPelaReferencia,
              p_config_34_pesqPeloIdGradePro,
              p_config_35_pesqPeloProdutoImp,
              p_config_36_pesqPeloCodFabrica,
              p_config_37_pesqPeloCodAnterio,
              p_config_38_pesqPeloProdXPess,
              p_config_39_pesqPeloLote,
              p_config_40_pesqPeloNumSerie,
              p_estabelecimentoAtivo,
              p_join,
              p_andWhere,
              p_cab_estabelecimento,
              p_cab_pessoa,
              p_produto,
              v_codigoDescricaoComPontos,
              v_codigoDescricaoSemPontos,
              1 -- p_somenteAtivo
            );
        END IF;
      END IF;
      EXECUTE IMMEDIATE v_select
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_idLoteEstoque,
        v_loteEstoque,
        v_idNumeroSerie,
        v_numeroSerie,
        v_contaRegistros;
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_idLoteEstoque     := v_idLoteEstoque;
        r_loteEstoque       := v_loteEstoque;
        r_idNumeroSerie     := v_idNumeroSerie;
        r_numeroSerie       := v_numeroSerie;
      ELSE
        IF v_contaRegistros > 1 THEN
          r_abrirTelaOnline   := 1;
        ELSE
          r_mensagemErro      := 'Nenhum produto encontrado.';
          r_observacoesErro   := 
            '-- Componente: TrocaGradeProduto
  ' ||      '-- Select da pesquisa:
  ' ||      TRIM (v_select);
          IF v_codigoDescricaoSemPontos <> ' ' THEN
            v_select := 
              FUNC_ADD_GRADE_PROD_MONTA_SQL(
                p_config_28_somenteProdEst,
                p_config_31_pesqPeloIdProduto,
                p_config_32_pesqPeloEanGtin,
                p_config_33_pesqPelaReferencia,
                p_config_34_pesqPeloIdGradePro,
                p_config_35_pesqPeloProdutoImp,
                p_config_36_pesqPeloCodFabrica,
                p_config_37_pesqPeloCodAnterio,
                p_config_38_pesqPeloProdXPess,
                p_config_39_pesqPeloLote,
                p_config_40_pesqPeloNumSerie,
                p_estabelecimentoAtivo,
                p_join,
                p_andWhere,
                p_cab_estabelecimento,
                p_cab_pessoa,
                p_produto,
                v_codigoDescricaoComPontos,
                v_codigoDescricaoSemPontos,
                0 -- p_somenteAtivo
              );
            EXECUTE IMMEDIATE v_select
            INTO
              v_gradeProduto,
              v_produtoImpresso,
              v_descricaoImpressa,
              v_idLoteEstoque,
              v_loteEstoque,
              v_idNumeroSerie,
              v_numeroSerie,
              v_contaRegistros;            
            IF v_contaRegistros > 0 THEN
              r_mensagemErro      := 'Produto inativo.';
            END IF;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_GRADE_PRODUTO_TROCA;

/

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 PAOPERACOESFISCAIS          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 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 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 vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    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 PAMEMORIASISTEMAXUSUARIOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMEMORIASISTEMAXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.memoriaSistema = a.memoriaSistema));
    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 PAMENUXCAMPOSPESQUISA     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMENUXCAMPOSPESQUISA b WHERE b.usuario = p_pessoaPara 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 MOARQUIVOSCONCILIACOES      SET usuarioImportacao = p_pessoaPara WHERE usuarioImportacao = p_pessoaDe;
    UPDATE MOCONCILIACOESCARTOES       SET usuarioProcessamento = p_pessoaPara WHERE usuarioProcessamento = p_pessoaDe;
    UPDATE MOSEPARACAOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCTRANSFXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOENTREGAXSITUACOES         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOMOTBLOQXLIBERACOES        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOEVENTOS                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnicos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CATECNICOSXCLIENTES       a SET a.tecnico = p_pessoaPara WHERE a.tecnico = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaPara AND b.cliente = a.cliente));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.tecnico = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXATIVIDADEPREV   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
    UPDATE MOORCAMENTOXATIVIDADEREAL   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separadores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOSEPARACOES                SET separador = p_pessoaPara WHERE separador = p_pessoaDe;
  END IF;
  -- Profissionais Registrados
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAESTABELECIMENTOS          SET contador = p_pessoaPara WHERE contador = p_pessoaDe;
    -- Cadastros
    UPDATE CARECEITASLENTESCLIENTE     SET medico = p_pessoaPara WHERE medico = p_pessoaDe;
  END IF;
  -- Credenciadoras Cartões
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.credenciadoraCartao = p_pessoaPara WHERE a.credenciadoraCartao = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred));
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.ativo = 1 WHERE a.credenciadoraCartao = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaDe AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred AND b.ativo = 1);
    -- Movimentações
    UPDATE MOFINANCEIROXCARTAO         SET credenciadoraCartao = p_pessoaPara WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Estabelecimentos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE PAESTABELECIMENTOS          SET pessoaEstabelecimento = p_pessoaPara WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Clientes
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.vendedor = a.vendedor));
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.vendedor = a.vendedor AND b.ativo = 1);
    UPDATE CATECNICOSXCLIENTES       a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.tecnico = a.tecnico));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.tecnico = a.tecnico AND b.ativo = 1);
    UPDATE CARECEITASLENTESCLIENTE     SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.fornecedor = p_pessoaPara WHERE a.fornecedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaPara AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto));
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.ativo = 1 WHERE a.fornecedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaDe AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXRECEITASOCUL    SET laboratorio = p_pessoaPara WHERE laboratorio = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINELCOMPRAXITENS        SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
  END IF;  
END ADD_TROCA_PESSOA;

/

create or replace PROCEDURE ADD_BUSCA_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_ufOrigDest_aliquotaIcms NUMBER;
  CURSOR c_item IS 
    SELECT a.ordenacao,
      a.quantidade,
      a.baseICMSST,
      a.valorICMSST,
      a.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao,
      a.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente,
      a.valorICMS,
      a.baseFCPST,
      a.valorFCPST,
      a.nfFornecedor
    FROM (
      SELECT ROW_NUMBER() OVER (ORDER BY cab.dataEntradaSaida desc, item.iditemDocFiscal desc) ordenacao,
        item.quantidade,
        item.baseICMSST,
        item.valorICMSST,
        item.baseICMSSTEscrituracao,
        item.valorICMSSTEscrituracao,
        item.baseICMSSTAnteriormente,
        item.valorICMSSTAnteriormente,
        item.valorICMS,
        item.baseFCPST,
        item.valorFCPST,
        cab.nfFornecedor
      FROM CAGRADESPRODUTO gradProd
      JOIN MODOCFISCALXITENS item ON item.gradeProduto = gradProd.gradeProduto
      JOIN MODOCUMENTOSFISCAIS cab ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE gradProd.produto = p_gradProd_produto
      AND item.cancelado = 0
      AND item.quantidade > 0
      AND (cab.nfFornecedor = 1
        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.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND TRUNC (cab.dataEntradaSaida) <= CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END
      AND (p_cab_estabelecimento = 0
        OR p_cab_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 = cab.estabelecimento
          AND (est.estabelecimento = p_cab_estabelecimento
            OR est2.estabelecimento = p_cab_estabelecimento))
        OR p_cab_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 = cab.estabelecimento
          AND (est.estabelecimento = p_cab_estabelecimento
            OR est2.estabelecimento = p_cab_estabelecimento)))    
    ) a
    WHERE a.ordenacao = 1;
BEGIN
  r_item_baseICMSSTAnteriormente := 0;
  r_item_valorICMSSTAnteriorment := 0;
  r_item_valorICMSProprioSubstit := 0;
  r_item_baseFCPSTAnteriormente := 0;
  r_item_valorFCPSTAnteriormente := 0;
  FOR item IN c_item LOOP
    IF p_calcularICMSSTAnterEfetivo = 1 THEN
      IF item.nfFornecedor = 1 AND item.baseICMSSTEscrituracao > 0 AND item.valorICMSSTEscrituracao > 0 THEN
        r_item_baseICMSSTAnteriormente := ROUND ((item.baseICMSSTEscrituracao * p_item_quantidade / item.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((item.valorICMSSTEscrituracao * p_item_quantidade / item.quantidade), 2);
      ELSIF item.baseICMSST > 0 AND item.valorICMSST > 0 THEN
        r_item_baseICMSSTAnteriormente := ROUND ((item.baseICMSST * p_item_quantidade / item.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((item.valorICMSST * p_item_quantidade / item.quantidade), 2);
      ELSE
        r_item_baseICMSSTAnteriormente := ROUND ((item.baseICMSSTAnteriormente * p_item_quantidade / item.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((item.valorICMSSTAnteriormente * p_item_quantidade / item.quantidade), 2);
      END IF;
      r_item_valorICMSProprioSubstit := ROUND ((item.valorICMS * p_item_quantidade / item.quantidade), 2);
    END IF;
    IF p_calcularFCP = 1 THEN
      r_item_baseFCPSTAnteriormente := ROUND ((item.baseFCPST * p_item_quantidade / item.quantidade), 2);
      r_item_valorFCPSTAnteriormente := ROUND ((item.valorFCPST * p_item_quantidade / item.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 ufOrigDest.aliquotaIcms
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEst ON munEst.municipio = endEst.municipio
          JOIN SIUFORIGEMXUFDESTINO 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 LOOP;
END ADD_BUSCA_ICMS_ST_ANTERIOR;

/

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ITEM (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof 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_precoPautaTabelado           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_calcularIRRF                 IN NUMBER,
    p_aliquotaIRRF                 IN NUMBER,
    p_baseIRRF                     IN NUMBER,
    p_valorIRRF                    IN NUMBER,
    p_calcularINSS                 IN NUMBER,
    p_aliquotaINSS                 IN NUMBER,
    p_baseINSS                     IN NUMBER,
    p_valorINSS                    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_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_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,
    /* Retornos */
    r_baseISSQN                    OUT NUMBER,
    r_valorISSQN                   OUT NUMBER,
    r_baseIRRF                     OUT NUMBER,
    r_valorIRRF                    OUT NUMBER,
    r_baseINSS                     OUT NUMBER,
    r_valorINSS                    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_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;
