SET DEFINE OFF;

CREATE TABLE PAMODELOSDOCUMENTO_2501 AS SELECT * FROM PAMODELOSDOCUMENTO;

ALTER TABLE PAOPERFISCALXMODELOSDOCUM DROP CONSTRAINT PAOPERFISCALXMODELOSDOCUM_FK2;
ALTER TABLE PAMODELOSCONTRATO DROP CONSTRAINT PAMODELOSCONTRATO_FK1;
ALTER TABLE PACENARIOSCALCULOPRECO DROP CONSTRAINT PACENARIOSCALCULOPRECO_FK2;
ALTER TABLE PAREGRASREMANEJO DROP CONSTRAINT PAREGRASREMANEJO_FK2;
ALTER TABLE PAMODELOSDOCUMPERMITIDOS DROP CONSTRAINT PAMODELOSDOCUMPERMITIDOS_FK1;
ALTER TABLE PACONTROLESENTREGA DROP CONSTRAINT PACONTROLESENTREGA_FK7;
ALTER TABLE PACONTROLESENTREGA DROP CONSTRAINT PACONTROLESENTREGA_FK8;
ALTER TABLE PACONTROLESENTREGA DROP CONSTRAINT PACONTROLESENTREGA_FK10;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK4;
ALTER TABLE MOORCAMENTOXITENS DROP CONSTRAINT MOORCAMENTOXITENS_FK7;
ALTER TABLE MOPREDOCUMENTOS DROP CONSTRAINT MOPREDOCUMENTOS_FK4;
ALTER TABLE MOPREDOCUMXITENS DROP CONSTRAINT MOPREDOCUMXITENS_FK2;
ALTER TABLE MODOCUMENTOSFISCAIS DROP CONSTRAINT MODOCUMENTOSFISCAIS_FK4;
ALTER TABLE MODOCFISCALXITENS DROP CONSTRAINT MODOCFISCALXITENS_FK2;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK9;
ALTER TABLE MOSEPARACOES DROP CONSTRAINT MOSEPARACOES_FK1;
ALTER TABLE MOESTOQUES DROP CONSTRAINT MOESTOQUES_FK3;
ALTER TABLE MOBALANCOS DROP CONSTRAINT MOBALANCOS_FK1;
ALTER TABLE MODOCUMENTOSTRANSFERENCIA DROP CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK1;
ALTER TABLE MORESERVASESTOQUE DROP CONSTRAINT MORESERVASESTOQUE_FK3;
ALTER TABLE MOENTREGAS DROP CONSTRAINT MOENTREGAS_FK1;
ALTER TABLE MOPAINEISCOMPRA DROP CONSTRAINT MOPAINEISCOMPRA_FK1;

DROP TABLE PAMODELOSDOCUMENTO;

-- PAMODELOSDOCUMENTO
CREATE TABLE PAMODELOSDOCUMENTO
  (
    modeloDocumento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                      VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    entradaSaida                   CHAR (1) DEFAULT ' ' NOT NULL,
    tipoPessoa                     CHAR (2) DEFAULT '  ' NOT NULL,
    finalidadeNota                 CHAR (1) DEFAULT ' ' NOT NULL,
    capituloNaturezaFiscal         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    operacaoInternaEstoque         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    movimentaEstoque               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atualizaCustoMedio             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atualizaUltimaCompra           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    regraFormacaoPreco             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    nfFornecedor                   CHAR (1) DEFAULT ' ' NOT NULL,
    ordemServico                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exigeOrcamento                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    alteraEstabelecimento          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    localEstoque                   NUMERIC (4,0) DEFAULT 0 NOT NULL,
    alteraLocalEstoque             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    indicadorPresencaComprador     CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorConsumidorFinal       CHAR (1) DEFAULT ' ' NOT NULL,
    geraFinanceiro                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoFaturamento              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitaProjeto                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exigeProjeto                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    situacaoContabilizacao         CHAR (1) DEFAULT ' ' NOT NULL,
    solicitaAtendimento            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitaMotivoEstoque          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    controlaSeparacaoConferencia   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaBotaoReceitaOculos     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaBotaoTintas            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaBotaoListaEventos      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaAmbiente               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoPreco                      CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                    VARCHAR (10) DEFAULT ' ' NOT NULL,
    fatorMultiplicadorPreco        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tipoPrecoB                     CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPrecoB                   VARCHAR (10) DEFAULT ' ' NOT NULL,
    fatorMultiplicadorPrecoB       NUMERIC (15,8) DEFAULT 0 NOT NULL,
    diminuiDescontoPrUnit          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    somaAcrescimosPrUnit           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    somaFreteSeguroPrUnit          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaControleEntrega        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraTransferencia              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfTipoDocumentoSaida       NUMERIC (3,0) DEFAULT 0 NOT NULL,
    transfEtapaOrcamentoSaida      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAbrirDocumentoSaida      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfTipoDocumentoEntrada     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    transfEtapaOrcamentoEntrada    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAbrirDocumentoEntrada    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfEstabelecimento          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAlteraEstabelecimento    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfExigeEstabelecDiferente  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfExigeRaizCnpjEstabDif    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfExigeRaizCnpjEstabIgual  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfInformaPessoa            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfLocalEstoque             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    transfAlteraLocalEstoque       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfControlaSeparacaoConf    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfControlaSepConfEntrada   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfSolicitarVendedor        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfSolicitarRespRetirada    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transfSolicitarRespRecebimento NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraOperacaoEmTransito         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    transitoLocalEstoque           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    geraDocumentoFiscalTriangular  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    utilizarConversorQuantidade    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes                    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_PK1 PRIMARY KEY (modeloDocumento);
CREATE INDEX PAMODELOSDOCUMENTO_K2 ON PAMODELOSDOCUMENTO (descricao);

INSERT INTO PAMODELOSDOCUMENTO (modeloDocumento, descricao, ativo, entradaSaida, tipoPessoa, finalidadeNota, capituloNaturezaFiscal, operacaoInternaEstoque, movimentaEstoque, atualizaCustoMedio, atualizaUltimaCompra, regraFormacaoPreco, nfFornecedor, ordemServico, exigeOrcamento, estabelecimento, alteraEstabelecimento, localEstoque, alteraLocalEstoque, indicadorPresencaComprador, indicadorConsumidorFinal, geraFinanceiro, validoFaturamento, solicitaProjeto, exigeProjeto, situacaoContabilizacao, solicitaAtendimento, solicitaMotivoEstoque, controlaSeparacaoConferencia, habilitaBotaoReceitaOculos, habilitaBotaoTintas, habilitaBotaoListaEventos, habilitaAmbiente, tipoPreco, tabelaPreco, fatorMultiplicadorPreco, tipoPrecoB, tabelaPrecoB, fatorMultiplicadorPrecoB, diminuiDescontoPrUnit, somaAcrescimosPrUnit, somaFreteSeguroPrUnit, habilitaControleEntrega, geraTransferencia, transfTipoDocumentoSaida, transfEtapaOrcamentoSaida, transfAbrirDocumentoSaida, transfTipoDocumentoEntrada, transfEtapaOrcamentoEntrada, transfAbrirDocumentoEntrada, transfEstabelecimento, transfAlteraEstabelecimento, transfExigeEstabelecDiferente, transfExigeRaizCnpjEstabDif, transfExigeRaizCnpjEstabIgual, transfInformaPessoa, transfLocalEstoque, transfAlteraLocalEstoque, transfControlaSeparacaoConf, transfControlaSepConfEntrada, transfSolicitarVendedor, transfSolicitarRespRetirada, transfSolicitarRespRecebimento, geraOperacaoEmTransito, transitoLocalEstoque, geraDocumentoFiscalTriangular, utilizarConversorQuantidade, 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, ' ', ' ', 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, ' ');
INSERT INTO PAMODELOSDOCUMENTO (modeloDocumento, descricao, ativo, entradaSaida, tipoPessoa, finalidadeNota, capituloNaturezaFiscal, operacaoInternaEstoque, movimentaEstoque, atualizaCustoMedio, atualizaUltimaCompra, regraFormacaoPreco, nfFornecedor, ordemServico, exigeOrcamento, estabelecimento, alteraEstabelecimento, localEstoque, alteraLocalEstoque, indicadorPresencaComprador, indicadorConsumidorFinal, geraFinanceiro, validoFaturamento, solicitaProjeto, exigeProjeto, situacaoContabilizacao, solicitaAtendimento, solicitaMotivoEstoque, controlaSeparacaoConferencia, habilitaBotaoReceitaOculos, habilitaBotaoTintas, habilitaBotaoListaEventos, habilitaAmbiente, tipoPreco, tabelaPreco, fatorMultiplicadorPreco, tipoPrecoB, tabelaPrecoB, fatorMultiplicadorPrecoB, diminuiDescontoPrUnit, somaAcrescimosPrUnit, somaFreteSeguroPrUnit, habilitaControleEntrega, geraTransferencia, transfTipoDocumentoSaida, transfEtapaOrcamentoSaida, transfAbrirDocumentoSaida, transfTipoDocumentoEntrada, transfEtapaOrcamentoEntrada, transfAbrirDocumentoEntrada, transfEstabelecimento, transfAlteraEstabelecimento, transfExigeEstabelecDiferente, transfExigeRaizCnpjEstabDif, transfExigeRaizCnpjEstabIgual, transfInformaPessoa, transfLocalEstoque, transfAlteraLocalEstoque, transfControlaSeparacaoConf, transfControlaSepConfEntrada, transfSolicitarVendedor, transfSolicitarRespRetirada, transfSolicitarRespRecebimento, geraOperacaoEmTransito, transitoLocalEstoque, geraDocumentoFiscalTriangular, utilizarConversorQuantidade, observacoes) SELECT modeloDocumento, descricao, ativo, entradaSaida, tipoPessoa, finalidadeNota, capituloNaturezaFiscal, operacaoInternaEstoque, movimentaEstoque, atualizaCustoMedio, atualizaUltimaCompra, regraFormacaoPreco, nfFornecedor, ordemServico, exigeOrcamento, estabelecimento, alteraEstabelecimento, localEstoque, alteraLocalEstoque, indicadorPresencaComprador, indicadorConsumidorFinal, geraFinanceiro, validoFaturamento, solicitaProjeto, exigeProjeto, situacaoContabilizacao, solicitaAtendimento, 0, controlaSeparacaoConferencia, habilitaBotaoReceitaOculos, habilitaBotaoTintas, habilitaBotaoListaEventos, habilitaAmbiente, tipoPreco, tabelaPreco, fatorMultiplicadorPreco, tipoPrecoB, tabelaPrecoB, fatorMultiplicadorPrecoB, diminuiDescontoPrUnit, somaAcrescimosPrUnit, somaFreteSeguroPrUnit, habilitaControleEntrega, geraTransferencia, transfTipoDocumentoSaida, transfEtapaOrcamentoSaida, transfAbrirDocumentoSaida, transfTipoDocumentoEntrada, transfEtapaOrcamentoEntrada, transfAbrirDocumentoEntrada, transfEstabelecimento, transfAlteraEstabelecimento, transfExigeEstabelecDiferente, transfExigeRaizCnpjEstabDif, transfExigeRaizCnpjEstabIgual, transfInformaPessoa, transfLocalEstoque, transfAlteraLocalEstoque, transfControlaSeparacaoConf, transfControlaSepConfEntrada, transfSolicitarVendedor, transfSolicitarRespRetirada, transfSolicitarRespRecebimento, geraOperacaoEmTransito, transitoLocalEstoque, geraDocumentoFiscalTriangular, utilizarConversorQuantidade, observacoes FROM PAMODELOSDOCUMENTO_2501 WHERE modeloDocumento > 0;

COMMIT;

ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK1 FOREIGN KEY (entradaSaida) REFERENCES SIENTRADASAIDA (entradaSaida);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK2 FOREIGN KEY (tipoPessoa) REFERENCES SITIPOSPESSOA (tipoPessoa);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK3 FOREIGN KEY (finalidadeNota) REFERENCES SIFINALIDADESNOTA (finalidadeNota);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK4 FOREIGN KEY (capituloNaturezaFiscal) REFERENCES SICAPITULOSNATUREZAFISCAL (capituloNaturezaFiscal);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK5 FOREIGN KEY (operacaoInternaEstoque) REFERENCES SIOPERACOESINTERNASESTOQUE (operacaoInternaEstoque);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK6 FOREIGN KEY (regraFormacaoPreco) REFERENCES PAREGRASFORMACAOPRECO (regraFormacaoPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK7 FOREIGN KEY (nfFornecedor) REFERENCES SISIMNAOPERGUNTAR (simNaoPerguntar);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK8 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK9 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK10 FOREIGN KEY (indicadorPresencaComprador) REFERENCES SIINDICPRESENCACOMPRADOR (indicadorPresencaComprador);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK11 FOREIGN KEY (indicadorConsumidorFinal) REFERENCES SIINDICCONSUMIDORFINAL (indicadorConsumidorFinal);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK12 FOREIGN KEY (situacaoContabilizacao) REFERENCES SISITUACOESCONTABILIZACAO (situacaoContabilizacao);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK13 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK14 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK15 FOREIGN KEY (tipoPrecoB) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK16 FOREIGN KEY (tabelaPrecoB) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK17 FOREIGN KEY (transfTipoDocumentoSaida) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK18 FOREIGN KEY (transfEtapaOrcamentoSaida) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK19 FOREIGN KEY (transfTipoDocumentoEntrada) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK20 FOREIGN KEY (transfEtapaOrcamentoEntrada) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK21 FOREIGN KEY (transfEstabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK22 FOREIGN KEY (transfLocalEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK23 FOREIGN KEY (transitoLocalEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);

ALTER TABLE PAOPERFISCALXMODELOSDOCUM ADD CONSTRAINT PAOPERFISCALXMODELOSDOCUM_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACENARIOSCALCULOPRECO ADD CONSTRAINT PACENARIOSCALCULOPRECO_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAREGRASREMANEJO ADD CONSTRAINT PAREGRASREMANEJO_FK2 FOREIGN KEY (modeloDocumentoTransferencia) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAMODELOSDOCUMPERMITIDOS ADD CONSTRAINT PAMODELOSDOCUMPERMITIDOS_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACONTROLESENTREGA ADD CONSTRAINT PACONTROLESENTREGA_FK7 FOREIGN KEY (modeloDocumentoVenda) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACONTROLESENTREGA ADD CONSTRAINT PACONTROLESENTREGA_FK8 FOREIGN KEY (modeloDocumentoEntrega) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PACONTROLESENTREGA ADD CONSTRAINT PACONTROLESENTREGA_FK10 FOREIGN KEY (modeloDocumentoTransferencia) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK7 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOPREDOCUMENTOS ADD CONSTRAINT MOPREDOCUMENTOS_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOPREDOCUMXITENS ADD CONSTRAINT MOPREDOCUMXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCUMENTOSFISCAIS ADD CONSTRAINT MODOCUMENTOSFISCAIS_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK9 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOSEPARACOES ADD CONSTRAINT MOSEPARACOES_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK3 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOBALANCOS ADD CONSTRAINT MOBALANCOS_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK3 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOPAINEISCOMPRA ADD CONSTRAINT MOPAINEISCOMPRA_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);

-- PAMOTIVOSESTOQUE
CREATE TABLE PAMOTIVOSESTOQUE
  (
    motivoEstoque 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,
    observacoes   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAMOTIVOSESTOQUE ADD CONSTRAINT PAMOTIVOSESTOQUE_PK1 PRIMARY KEY (motivoEstoque);
CREATE INDEX PAMOTIVOSESTOQUE_K2 ON PAMOTIVOSESTOQUE (descricao);

INSERT INTO PAMOTIVOSESTOQUE (motivoEstoque, descricao, ativo, ordenacao, observacoes) VALUES (0, 'SELECIONE', 1, 0, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAMOTIVOSESTOQUE', 'Motivos Estoque', 1, 31489, 'PA', 'motivoEstoque', 'N', 4, 'descricao', 0, ' ', 0, 100003, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqMotivosEstoque', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (977, 'Motivos Estoque', 1, 4060009770, 40, 'PAR', 0, 977, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqMotivosEstoque', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAMOTIVOSESTOQUEPERMITID
CREATE TABLE PAMOTIVOSESTOQUEPERMITID
  (
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumento NUMERIC (4,0) DEFAULT 0 NOT NULL,
    motivoEstoque   NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento NUMERIC (4,0) DEFAULT 0 NOT NULL,
    perfilUsuario   NUMERIC (6,0) DEFAULT 0 NOT NULL,
    usuario         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    permitido       NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE PAMOTIVOSESTOQUEPERMITID ADD CONSTRAINT PAMOTIVOSESTOQUEPERMITID_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX PAMOTIVOSESTOQUEPERMITID_K2 ON PAMOTIVOSESTOQUEPERMITID (modeloDocumento, motivoEstoque, estabelecimento, perfilUsuario, usuario);
ALTER TABLE PAMOTIVOSESTOQUEPERMITID ADD CONSTRAINT PAMOTIVOSESTOQUEPERMITID_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAMOTIVOSESTOQUEPERMITID ADD CONSTRAINT PAMOTIVOSESTOQUEPERMITID_FK2 FOREIGN KEY (motivoEstoque) REFERENCES PAMOTIVOSESTOQUE (motivoEstoque);
ALTER TABLE PAMOTIVOSESTOQUEPERMITID ADD CONSTRAINT PAMOTIVOSESTOQUEPERMITID_FK3 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAMOTIVOSESTOQUEPERMITID ADD CONSTRAINT PAMOTIVOSESTOQUEPERMITID_FK4 FOREIGN KEY (perfilUsuario) REFERENCES PAPERFISUSUARIO (perfilUsuario);
ALTER TABLE PAMOTIVOSESTOQUEPERMITID ADD CONSTRAINT PAMOTIVOSESTOQUEPERMITID_FK5 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);

INSERT INTO PAMOTIVOSESTOQUEPERMITID (id, modeloDocumento, motivoEstoque, estabelecimento, perfilUsuario, usuario, permitido) VALUES (99999999999999, 0, 0, 0, 0, 0, 1);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAMOTIVOSESTOQUEPERMITID', 'Motivos Estoque Permitidos', 1, 31489, 'PA', 'id', 'N', 14, ' ', 1, ' ', 0, 100003, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqMotivosEstoquePermitidos', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (978, 'Motivos Estoque Permitidos', 1, 4060009780, 40, 'PAR', 0, 978, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqMotivosEstoquePermitidos', ' ', 0, 0, NULL, ' ');

COMMIT;

CREATE TABLE MOORCAMENTOXATIVIDADEREAL_2501 AS SELECT * FROM MOORCAMENTOXATIVIDADEREAL;

ALTER TABLE MOORCAMENTOXFICHAPRODREAL DROP CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK1;

DROP TABLE MOORCAMENTOXATIVIDADEREAL;

-- MOORCAMENTOXATIVIDADEREAL
CREATE TABLE MOORCAMENTOXATIVIDADEREAL
  (
    idAtividadeRealOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idAtividadePrevOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                NUMERIC (3,0) DEFAULT 0 NOT NULL,
    atividadeServico         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao                VARCHAR (4000) DEFAULT ' ' NOT NULL,
    tecnico                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    statusAtividadeServico   CHAR (1) DEFAULT ' ' NOT NULL,
    dataInicio               DATE,
    dataTermino              DATE,
    modeloDocumento          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    motivoEstoque            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    quantidade               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_PK1 PRIMARY KEY (idAtividadeRealOrcamento);
CREATE UNIQUE INDEX MOORCAMENTOXATIVIDADEREAL_K2 ON MOORCAMENTOXATIVIDADEREAL (idAtividadePrevOrcamento, sequencia);
CREATE INDEX MOORCAMENTOXATIVIDADEREAL_K3 ON MOORCAMENTOXATIVIDADEREAL (idAtividadePrevOrcamento);
CREATE INDEX MOORCAMENTOXATIVIDADEREAL_K4 ON MOORCAMENTOXATIVIDADEREAL (dataInicio);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK1 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK3 FOREIGN KEY (tecnico) REFERENCES CATECNICOS (tecnico);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK4 FOREIGN KEY (statusAtividadeServico) REFERENCES SISTATUSATIVIDADESERVICO (statusAtividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK5 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK6 FOREIGN KEY (motivoEstoque) REFERENCES PAMOTIVOSESTOQUE (motivoEstoque);

INSERT INTO MOORCAMENTOXATIVIDADEREAL (idAtividadeRealOrcamento, idAtividadePrevOrcamento, sequencia, atividadeServico, descricao, tecnico, statusAtividadeServico, dataInicio, dataTermino, modeloDocumento, motivoEstoque, quantidade, observacoes) VALUES (0, 0, 0, 0, 'SELECIONE', 0, ' ', NULL, NULL, 0, 0, 0, ' ');
INSERT INTO MOORCAMENTOXATIVIDADEREAL (idAtividadeRealOrcamento, idAtividadePrevOrcamento, sequencia, atividadeServico, descricao, tecnico, statusAtividadeServico, dataInicio, dataTermino, modeloDocumento, motivoEstoque, quantidade, observacoes) SELECT idAtividadeRealOrcamento, idAtividadePrevOrcamento, sequencia, atividadeServico, descricao, tecnico, statusAtividadeServico, dataInicio, dataTermino, 0, 0, quantidade, observacoes FROM MOORCAMENTOXATIVIDADEREAL_2501 WHERE idAtividadeRealOrcamento > 0;

COMMIT;

ALTER TABLE MOORCAMENTOXFICHAPRODREAL ADD CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK1 FOREIGN KEY (idAtividadeRealOrcamento) REFERENCES MOORCAMENTOXATIVIDADEREAL (idAtividadeRealOrcamento);

CREATE TABLE MOESTOQUES_2501 AS SELECT * FROM MOESTOQUES;
ALTER TABLE MOESTOQUES_2501 ADD CONSTRAINT MOESTOQUES_2501_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

ALTER TABLE MOORCAMENTOXFICHAXESTOQUE DROP CONSTRAINT MOORCAMENTOXFICHAXESTOQUE_FK2;
ALTER TABLE MOPREDOCUMXESTOQUE DROP CONSTRAINT MOPREDOCUMXESTOQUE_FK2;
ALTER TABLE MODOCFISCALXESTOQUE DROP CONSTRAINT MODOCFISCALXESTOQUE_FK2;
ALTER TABLE MOSEPARACAOXESTOQUE DROP CONSTRAINT MOSEPARACAOXESTOQUE_FK2;
ALTER TABLE MODOCTROCAXITENS DROP CONSTRAINT MODOCTROCAXITENS_FK16;
ALTER TABLE MOBALANCOXESTOQUE DROP CONSTRAINT MOBALANCOXESTOQUE_FK2;
ALTER TABLE MODOCTRANSFXESTOQUE DROP CONSTRAINT MODOCTRANSFXESTOQUE_FK3;

DROP TABLE MOESTOQUES;

-- MOESTOQUES
CREATE TABLE MOESTOQUES
  (
    idEstoque                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    data                          DATE,
    produto                       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    motivoEstoque                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    operacaoInternaEstoque        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    atualizaCustoMedio            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    atualizaUltimaCompra          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    entradaSaida                  CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorPropriedadePosseItem CHAR (1) DEFAULT ' ' NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoCustoOperacao            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    totalCustoOperacao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV                      NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_PK1 PRIMARY KEY (idEstoque);
CREATE INDEX MOESTOQUES_K2 ON MOESTOQUES (estabelecimento);
CREATE INDEX MOESTOQUES_K3 ON MOESTOQUES (data);
CREATE INDEX MOESTOQUES_K4 ON MOESTOQUES (produto);
CREATE INDEX MOESTOQUES_K5 ON MOESTOQUES (gradeProduto);
CREATE INDEX MOESTOQUES_K6 ON MOESTOQUES (modeloDocumento);
CREATE INDEX MOESTOQUES_K7 ON MOESTOQUES (motivoEstoque);
CREATE INDEX MOESTOQUES_K8 ON MOESTOQUES (operacaoInternaEstoque);
CREATE INDEX MOESTOQUES_K9 ON MOESTOQUES (entradaSaida);
CREATE INDEX MOESTOQUES_K10 ON MOESTOQUES (indicadorPropriedadePosseItem);
CREATE INDEX MOESTOQUES_K11 ON MOESTOQUES (localEstoque);
CREATE INDEX MOESTOQUES_K12 ON MOESTOQUES (personalizacao);
CREATE INDEX MOESTOQUES_K13 ON MOESTOQUES (idLoteEstoque);
CREATE INDEX MOESTOQUES_K14 ON MOESTOQUES (idNumeroSerie);
CREATE INDEX MOESTOQUES_K15 ON MOESTOQUES (produto, entradaSaida, atualizaUltimaCompra, indicadorPropriedadePosseItem, pessoaParticipante, data);
CREATE INDEX MOESTOQUES_K16 ON MOESTOQUES (gradeProduto, entradaSaida, atualizaUltimaCompra, indicadorPropriedadePosseItem, pessoaParticipante, data);
CREATE INDEX MOESTOQUES_K17 ON MOESTOQUES (produto, operacaoInternaEstoque, indicadorPropriedadePosseItem, pessoaParticipante, data);
CREATE INDEX MOESTOQUES_K18 ON MOESTOQUES (gradeProduto, operacaoInternaEstoque, indicadorPropriedadePosseItem, pessoaParticipante, data);
CREATE INDEX MOESTOQUES_K19 ON MOESTOQUES (produto, estabelecimento, indicadorPropriedadePosseItem, pessoaParticipante, operacaoInternaEstoque, data);
CREATE INDEX MOESTOQUES_K20 ON MOESTOQUES (gradeProduto, estabelecimento, indicadorPropriedadePosseItem, pessoaParticipante, operacaoInternaEstoque, data);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK5 FOREIGN KEY (motivoEstoque) REFERENCES PAMOTIVOSESTOQUE (motivoEstoque);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK6 FOREIGN KEY (operacaoInternaEstoque) REFERENCES SIOPERACOESINTERNASESTOQUE (operacaoInternaEstoque);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK7 FOREIGN KEY (entradaSaida) REFERENCES SIENTRADASAIDA (entradaSaida);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK8 FOREIGN KEY (indicadorPropriedadePosseItem) REFERENCES SIINDICPOSSEITEM (indicadorPropriedadePosseItem);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK9 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK10 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK11 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK12 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOESTOQUES ADD CONSTRAINT MOESTOQUES_FK13 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MOESTOQUES (idEstoque, estabelecimento, data, produto, gradeProduto, modeloDocumento, motivoEstoque, operacaoInternaEstoque, atualizaCustoMedio, atualizaUltimaCompra, entradaSaida, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes) VALUES (0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MOESTOQUES (idEstoque, estabelecimento, data, produto, gradeProduto, modeloDocumento, motivoEstoque, operacaoInternaEstoque, atualizaCustoMedio, atualizaUltimaCompra, entradaSaida, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes) SELECT a.idEstoque, a.estabelecimento, a.data, b.produto, a.gradeProduto, a.modeloDocumento, 0, a.operacaoInternaEstoque, a.atualizaCustoMedio, a.atualizaUltimaCompra, a.entradaSaida, a.indicadorPropriedadePosseItem, a.pessoaParticipante, a.localEstoque, a.personalizacao, a.idLoteEstoque, a.idNumeroSerie, a.quantidade, a.precoCustoOperacao, a.totalCustoOperacao, a.precoCMV, a.valorCMV, a.observacoes FROM MOESTOQUES_2501 a JOIN CAGRADESPRODUTO b ON b.gradeProduto = a.gradeProduto WHERE a.idEstoque > 0;

COMMIT;

ALTER TABLE MOORCAMENTOXFICHAXESTOQUE ADD CONSTRAINT MOORCAMENTOXFICHAXESTOQUE_FK2 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);
ALTER TABLE MOPREDOCUMXESTOQUE ADD CONSTRAINT MOPREDOCUMXESTOQUE_FK2 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);
ALTER TABLE MODOCFISCALXESTOQUE ADD CONSTRAINT MODOCFISCALXESTOQUE_FK2 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);
ALTER TABLE MOSEPARACAOXESTOQUE ADD CONSTRAINT MOSEPARACAOXESTOQUE_FK2 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK16 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);
ALTER TABLE MOBALANCOXESTOQUE ADD CONSTRAINT MOBALANCOXESTOQUE_FK2 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);
ALTER TABLE MODOCTRANSFXESTOQUE ADD CONSTRAINT MODOCTRANSFXESTOQUE_FK3 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);

CREATE TABLE MODOCUMENTOSTRANSFERENCIA_2501 AS SELECT * FROM MODOCUMENTOSTRANSFERENCIA;

ALTER TABLE MODOCUMENTOTRANSFXITENS DROP CONSTRAINT MODOCUMENTOTRANSFXITENS_FK1;
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST DROP CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK1;
ALTER TABLE MODOCTRANSFXSITUACOES DROP CONSTRAINT MODOCTRANSFXSITUACOES_FK1;
ALTER TABLE MOORCAMENTOXCONFERENCIAS DROP CONSTRAINT MOORCAMENTOXCONFERENCIAS_FK2;
ALTER TABLE MOPREDOCUMXCONFERENCIAS DROP CONSTRAINT MOPREDOCUMXCONFERENCIAS_FK2;
ALTER TABLE MODOCFISCALXCONFERENCIAS DROP CONSTRAINT MODOCFISCALXCONFERENCIAS_FK2;
ALTER TABLE MODOCTRANSFXCONFERENCIAS DROP CONSTRAINT MODOCTRANSFXCONFERENCIAS_FK1;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK15;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK16;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK19;

DROP TABLE MODOCUMENTOSTRANSFERENCIA;

-- MODOCUMENTOSTRANSFERENCIA
CREATE TABLE MODOCUMENTOSTRANSFERENCIA
  (
    documentoTransferencia         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    motivoEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimentoSaida           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimentoEntrada         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    controlaSeparacaoConferencia   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    dataEmissao                    DATE,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    vendedor                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    colaboradorResponsavelRetirada NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataRetirada                   DATE,
    colaboradorResponsavelRecebim  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataRecebimento                DATE,
    tipoDocumentoSaida             NUMERIC (3,0) DEFAULT 0 NOT NULL,
    tipoDocumentoEntrada           NUMERIC (3,0) DEFAULT 0 NOT NULL,
    situacaoDocTransferencia       CHAR (1) DEFAULT ' ' NOT NULL,
    observacoes                    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_PK1 PRIMARY KEY (documentoTransferencia);
CREATE INDEX MODOCUMENTOSTRANSFERENCIA_K2 ON MODOCUMENTOSTRANSFERENCIA (dataEmissao DESC, documentoTransferencia DESC);
CREATE INDEX MODOCUMENTOSTRANSFERENCIA_K3 ON MODOCUMENTOSTRANSFERENCIA (situacaoDocTransferencia, dataEmissao DESC, documentoTransferencia DESC);
CREATE INDEX MODOCUMENTOSTRANSFERENCIA_K4 ON MODOCUMENTOSTRANSFERENCIA (estabelecimentoSaida);
CREATE INDEX MODOCUMENTOSTRANSFERENCIA_K5 ON MODOCUMENTOSTRANSFERENCIA (estabelecimentoEntrada);
CREATE INDEX MODOCUMENTOSTRANSFERENCIA_K6 ON MODOCUMENTOSTRANSFERENCIA (pessoa);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK2 FOREIGN KEY (motivoEstoque) REFERENCES PAMOTIVOSESTOQUE (motivoEstoque);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK3 FOREIGN KEY (estabelecimentoSaida) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK4 FOREIGN KEY (estabelecimentoEntrada) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK5 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK6 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK7 FOREIGN KEY (colaboradorResponsavelRetirada) REFERENCES CACOLABORADORES (colaborador);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK8 FOREIGN KEY (colaboradorResponsavelRecebim) REFERENCES CACOLABORADORES (colaborador);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK9 FOREIGN KEY (tipoDocumentoSaida) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK10 FOREIGN KEY (tipoDocumentoEntrada) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK11 FOREIGN KEY (situacaoDocTransferencia) REFERENCES SISITUACOESDOCTRANSF (situacaoDocTransferencia);

INSERT INTO MODOCUMENTOSTRANSFERENCIA (documentoTransferencia, modeloDocumento, motivoEstoque, estabelecimentoSaida, estabelecimentoEntrada, controlaSeparacaoConferencia, dataEmissao, pessoa, vendedor, colaboradorResponsavelRetirada, dataRetirada, colaboradorResponsavelRecebim, dataRecebimento, tipoDocumentoSaida, tipoDocumentoEntrada, situacaoDocTransferencia, observacoes) VALUES (0, 0, 0, 0, 0, 0, NULL, 0, 0, 0, NULL, 0, NULL, 0, 0, ' ', ' ');
INSERT INTO MODOCUMENTOSTRANSFERENCIA (documentoTransferencia, modeloDocumento, motivoEstoque, estabelecimentoSaida, estabelecimentoEntrada, controlaSeparacaoConferencia, dataEmissao, pessoa, vendedor, colaboradorResponsavelRetirada, dataRetirada, colaboradorResponsavelRecebim, dataRecebimento, tipoDocumentoSaida, tipoDocumentoEntrada, situacaoDocTransferencia, observacoes) SELECT documentoTransferencia, modeloDocumento, 0, estabelecimentoSaida, estabelecimentoEntrada, controlaSeparacaoConferencia, dataEmissao, pessoa, vendedor, colaboradorResponsavelRetirada, dataRetirada, colaboradorResponsavelRecebim, dataRecebimento, tipoDocumentoSaida, tipoDocumentoEntrada, situacaoDocTransferencia, observacoes FROM MODOCUMENTOSTRANSFERENCIA_2501 WHERE documentoTransferencia > 0;

COMMIT;

ALTER TABLE MODOCUMENTOTRANSFXITENS ADD CONSTRAINT MODOCUMENTOTRANSFXITENS_FK1 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK1 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MODOCTRANSFXSITUACOES ADD CONSTRAINT MODOCTRANSFXSITUACOES_FK1 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MOORCAMENTOXCONFERENCIAS ADD CONSTRAINT MOORCAMENTOXCONFERENCIAS_FK2 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MOPREDOCUMXCONFERENCIAS ADD CONSTRAINT MOPREDOCUMXCONFERENCIAS_FK2 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MODOCFISCALXCONFERENCIAS ADD CONSTRAINT MODOCFISCALXCONFERENCIAS_FK2 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MODOCTRANSFXCONFERENCIAS ADD CONSTRAINT MODOCTRANSFXCONFERENCIAS_FK1 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK15 FOREIGN KEY (documentoTransferenciaLojaCd) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK16 FOREIGN KEY (documentoTransferenciaFornec) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK19 FOREIGN KEY (documentoTransferenciaCdLoja) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);

DROP TABLE MOSEPARACAOXESTOQUE;
DROP TABLE MOSEPARACAOXBLOQUEIOSEST;
DROP TABLE MOSEPARACAOXNUMEROSSERIE;
DROP TABLE MOSEPARACAOXENDERECOESTOQ;
DROP TABLE MOSEPARACAOXITENS;
DROP TABLE MOSEPARACOES;
DROP TABLE PAETAPASSEPARACAO;
DROP TABLE SISITUACOESSEPARACAO;

DELETE MOACESSOSMENU WHERE menu = 440;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 440;
DELETE PAMENUXATALHOS WHERE menu = 440;
DELETE PAMENUXFAVORITOS WHERE menu = 440;
DELETE PAMENUXPERMISSOES WHERE menu = 440;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 440;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 440;
DELETE MOMARCADORES WHERE menu = 440;
DELETE MONOTIFICACOES WHERE menu = 440;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 440;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 440;
DELETE SIMENUS WHERE menu = 440;

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 441;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 441;
DELETE PAMENUXATALHOS WHERE menu = 441;
DELETE PAMENUXFAVORITOS WHERE menu = 441;
DELETE PAMENUXPERMISSOES WHERE menu = 441;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 441;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 441;
DELETE MOMARCADORES WHERE menu = 441;
DELETE MONOTIFICACOES WHERE menu = 441;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 441;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 441;
DELETE SIMENUS WHERE menu = 441;

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 263;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 263;
DELETE PAMENUXATALHOS WHERE menu = 263;
DELETE PAMENUXFAVORITOS WHERE menu = 263;
DELETE PAMENUXPERMISSOES WHERE menu = 263;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 263;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 263;
DELETE MOMARCADORES WHERE menu = 263;
DELETE MONOTIFICACOES WHERE menu = 263;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 263;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 263;
DELETE SIMENUS WHERE menu = 263;

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 262;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 262;
DELETE PAMENUXATALHOS WHERE menu = 262;
DELETE PAMENUXFAVORITOS WHERE menu = 262;
DELETE PAMENUXPERMISSOES WHERE menu = 262;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 262;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 262;
DELETE MOMARCADORES WHERE menu = 262;
DELETE MONOTIFICACOES WHERE menu = 262;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 262;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 262;
DELETE SIMENUS WHERE menu = 262;

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 272;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 272;
DELETE PAMENUXATALHOS WHERE menu = 272;
DELETE PAMENUXFAVORITOS WHERE menu = 272;
DELETE PAMENUXPERMISSOES WHERE menu = 272;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 272;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 272;
DELETE MOMARCADORES WHERE menu = 272;
DELETE MONOTIFICACOES WHERE menu = 272;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 272;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 272;
DELETE SIMENUS WHERE menu = 272;

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 265;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 265;
DELETE PAMENUXATALHOS WHERE menu = 265;
DELETE PAMENUXFAVORITOS WHERE menu = 265;
DELETE PAMENUXPERMISSOES WHERE menu = 265;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 265;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 265;
DELETE MOMARCADORES WHERE menu = 265;
DELETE MONOTIFICACOES WHERE menu = 265;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 265;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 265;
DELETE SIMENUS WHERE menu = 265;

COMMIT;

DELETE MOACESSOSMENU WHERE menu = 264;
DELETE PAMENUXLAYOUTPESQUISA WHERE menu = 264;
DELETE PAMENUXATALHOS WHERE menu = 264;
DELETE PAMENUXFAVORITOS WHERE menu = 264;
DELETE PAMENUXPERMISSOES WHERE menu = 264;
DELETE PAGERADORRELFILTROS WHERE menuPesquisa = 264;
DELETE PAGERADORRELCAMPOSVISAO WHERE menuPesquisa = 264;
DELETE MOMARCADORES WHERE menu = 264;
DELETE MONOTIFICACOES WHERE menu = 264;
DELETE PAMENUSCUSTOMIZADOS WHERE menuRegistro = 264;
DELETE SIDOCVERSOESSISTEMA WHERE menu = 264;
DELETE SIMENUS WHERE menu = 264;

COMMIT;

CREATE TABLE MORESERVASESTOQUE_2501 AS SELECT * FROM MORESERVASESTOQUE;
ALTER TABLE MORESERVASESTOQUE_2501 ADD CONSTRAINT MORESERVASESTOQUE_2501_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

ALTER TABLE MOORCAMENTOXRESERVAESTOQ DROP CONSTRAINT MOORCAMENTOXRESERVAESTOQ_FK2;
ALTER TABLE MOORCAMENTOXFICHAXRESERVA DROP CONSTRAINT MOORCAMENTOXFICHAXRESERVA_FK2;
ALTER TABLE MODOCTRANSFXRESERVAESTOQ DROP CONSTRAINT MODOCTRANSFXRESERVAESTOQ_FK2;

DROP TABLE MORESERVASESTOQUE;

-- MORESERVASESTOQUE
CREATE TABLE MORESERVASESTOQUE
  (
    idReservaEstoque              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEntrega                   DATE,
    produto                       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloDocumento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    entradaSaida                  CHAR (1) DEFAULT ' ' NOT NULL,
    indicadorPropriedadePosseItem CHAR (1) DEFAULT ' ' NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidadeSaldo               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_PK1 PRIMARY KEY (idReservaEstoque);
CREATE INDEX MORESERVASESTOQUE_K2 ON MORESERVASESTOQUE (estabelecimento);
CREATE INDEX MORESERVASESTOQUE_K3 ON MORESERVASESTOQUE (dataEntrega);
CREATE INDEX MORESERVASESTOQUE_K4 ON MORESERVASESTOQUE (produto);
CREATE INDEX MORESERVASESTOQUE_K5 ON MORESERVASESTOQUE (gradeProduto);
CREATE INDEX MORESERVASESTOQUE_K6 ON MORESERVASESTOQUE (modeloDocumento);
CREATE INDEX MORESERVASESTOQUE_K7 ON MORESERVASESTOQUE (entradaSaida);
CREATE INDEX MORESERVASESTOQUE_K8 ON MORESERVASESTOQUE (indicadorPropriedadePosseItem);
CREATE INDEX MORESERVASESTOQUE_K9 ON MORESERVASESTOQUE (pessoaParticipante);
CREATE INDEX MORESERVASESTOQUE_K10 ON MORESERVASESTOQUE (localEstoque);
CREATE INDEX MORESERVASESTOQUE_K11 ON MORESERVASESTOQUE (personalizacao);
CREATE INDEX MORESERVASESTOQUE_K12 ON MORESERVASESTOQUE (idLoteEstoque);
CREATE INDEX MORESERVASESTOQUE_K13 ON MORESERVASESTOQUE (idNumeroSerie);
CREATE INDEX MORESERVASESTOQUE_K14 ON MORESERVASESTOQUE (gradeProduto, entradaSaida, estabelecimento, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK4 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK5 FOREIGN KEY (entradaSaida) REFERENCES SIENTRADASAIDA (entradaSaida);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK6 FOREIGN KEY (indicadorPropriedadePosseItem) REFERENCES SIINDICPOSSEITEM (indicadorPropriedadePosseItem);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK7 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK8 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK9 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK10 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MORESERVASESTOQUE ADD CONSTRAINT MORESERVASESTOQUE_FK11 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MORESERVASESTOQUE (idReservaEstoque, estabelecimento, dataEntrega, produto, gradeProduto, modeloDocumento, entradaSaida, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie, quantidadeSaldo, observacoes) VALUES (0, 0, NULL, 0, 0, 0, ' ', ' ', 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MORESERVASESTOQUE (idReservaEstoque, estabelecimento, dataEntrega, produto, gradeProduto, modeloDocumento, entradaSaida, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie, quantidadeSaldo, observacoes) SELECT a.idReservaEstoque, a.estabelecimento, a.dataEntrega, b.produto, a.gradeProduto, a.modeloDocumento, a.entradaSaida, a.indicadorPropriedadePosseItem, a.pessoaParticipante, a.localEstoque, a.personalizacao, a.idLoteEstoque, a.idNumeroSerie, a.quantidadeSaldo, a.observacoes FROM MORESERVASESTOQUE_2501 a JOIN CAGRADESPRODUTO b ON b.gradeProduto = a.gradeProduto WHERE a.idReservaEstoque > 0;

COMMIT;

ALTER TABLE MOORCAMENTOXRESERVAESTOQ ADD CONSTRAINT MOORCAMENTOXRESERVAESTOQ_FK2 FOREIGN KEY (idReservaEstoque) REFERENCES MORESERVASESTOQUE (idReservaEstoque);
ALTER TABLE MOORCAMENTOXFICHAXRESERVA ADD CONSTRAINT MOORCAMENTOXFICHAXRESERVA_FK2 FOREIGN KEY (idReservaEstoque) REFERENCES MORESERVASESTOQUE (idReservaEstoque);
ALTER TABLE MODOCTRANSFXRESERVAESTOQ ADD CONSTRAINT MODOCTRANSFXRESERVAESTOQ_FK2 FOREIGN KEY (idReservaEstoque) REFERENCES MORESERVASESTOQUE (idReservaEstoque);

CREATE TABLE MODOCTRANSFXBLOQUEIOSEST_2501 AS SELECT * FROM MODOCTRANSFXBLOQUEIOSEST;

DROP TABLE MODOCTRANSFXBLOQUEIOSEST;

-- MODOCTRANSFXBLOQUEIOSEST
CREATE TABLE MODOCTRANSFXBLOQUEIOSEST
  (
    id                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documentoTransferencia NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia              NUMERIC (3,0) DEFAULT 0 NOT NULL,
    dataBloqueio           DATE,
    estabelecimento        NUMERIC (4,0) DEFAULT 0 NOT NULL,
    localEstoque           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao         NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade             NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque      NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeReservas     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    situacaoLiberacao      CHAR (1) DEFAULT ' ' NOT NULL,
    usuarioLiberacao       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataLiberacao          DATE,
    observacoes            VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_PK1 PRIMARY KEY (id);
CREATE INDEX MODOCTRANSFXBLOQUEIOSEST_K2 ON MODOCTRANSFXBLOQUEIOSEST (documentoTransferencia, sequencia);
CREATE INDEX MODOCTRANSFXBLOQUEIOSEST_K3 ON MODOCTRANSFXBLOQUEIOSEST (documentoTransferencia);
CREATE INDEX MODOCTRANSFXBLOQUEIOSEST_K4 ON MODOCTRANSFXBLOQUEIOSEST (gradeProduto);
CREATE INDEX MODOCTRANSFXBLOQUEIOSEST_K5 ON MODOCTRANSFXBLOQUEIOSEST (documentoTransferencia, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK1 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK3 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK4 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK6 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK7 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK8 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK9 FOREIGN KEY (situacaoLiberacao) REFERENCES SISITUACOESLIBERACAO (situacaoLiberacao);
ALTER TABLE MODOCTRANSFXBLOQUEIOSEST ADD CONSTRAINT MODOCTRANSFXBLOQUEIOSEST_FK10 FOREIGN KEY (usuarioLiberacao) REFERENCES CAUSUARIOS (usuario);

INSERT INTO MODOCTRANSFXBLOQUEIOSEST (id, documentoTransferencia, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) VALUES (0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, NULL, ' ');
INSERT INTO MODOCTRANSFXBLOQUEIOSEST (id, documentoTransferencia, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) SELECT id, documentoTransferencia, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes FROM MODOCTRANSFXBLOQUEIOSEST_2501 WHERE id > 0;

COMMIT;

CREATE TABLE MOBALANCOXDIVERGENCIA_2501 AS SELECT * FROM MOBALANCOXDIVERGENCIA;

ALTER TABLE MOBALANCOXINVENTESTOQUE DROP CONSTRAINT MOBALANCOXINVENTESTOQUE_FK1;
ALTER TABLE MOBALANCOXESTOQUE DROP CONSTRAINT MOBALANCOXESTOQUE_FK1;
ALTER TABLE MOBALANCOXDOCFISCAL DROP CONSTRAINT MOBALANCOXDOCFISCAL_FK1;

DROP TABLE MOBALANCOXDIVERGENCIA;

-- MOBALANCOXDIVERGENCIA
CREATE TABLE MOBALANCOXDIVERGENCIA
  (
    divergenciaBalanco NUMERIC (14,0) DEFAULT 0 NOT NULL,
    balanco            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao          NUMERIC (11,0) DEFAULT 0 NOT NULL,
    cancelado          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    linhaImportada     VARCHAR (300) DEFAULT ' ' NOT NULL,
    mensagemBalanco    NUMERIC (3,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidadeEstoque  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBalanco  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_PK1 PRIMARY KEY (divergenciaBalanco);
CREATE UNIQUE INDEX MOBALANCOXDIVERGENCIA_K2 ON MOBALANCOXDIVERGENCIA (balanco, ordenacao);
CREATE INDEX MOBALANCOXDIVERGENCIA_K3 ON MOBALANCOXDIVERGENCIA (gradeProduto);
CREATE INDEX MOBALANCOXDIVERGENCIA_K4 ON MOBALANCOXDIVERGENCIA (balanco);
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_FK1 FOREIGN KEY (balanco) REFERENCES MOBALANCOS (balanco);
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_FK2 FOREIGN KEY (mensagemBalanco) REFERENCES SIMENSAGENSBALANCO (mensagemBalanco);
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_FK4 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_FK5 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOBALANCOXDIVERGENCIA ADD CONSTRAINT MOBALANCOXDIVERGENCIA_FK6 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MOBALANCOXDIVERGENCIA (divergenciaBalanco, balanco, ordenacao, cancelado, linhaImportada, mensagemBalanco, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidadeEstoque, quantidadeBalanco, observacoes) VALUES (0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MOBALANCOXDIVERGENCIA (divergenciaBalanco, balanco, ordenacao, cancelado, linhaImportada, mensagemBalanco, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidadeEstoque, quantidadeBalanco, observacoes) SELECT divergenciaBalanco, balanco, ordenacao, cancelado, linhaImportada, mensagemBalanco, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidadeEstoque, quantidadeBalanco, observacoes FROM MOBALANCOXDIVERGENCIA_2501 WHERE divergenciaBalanco > 0;

COMMIT;

ALTER TABLE MOBALANCOXINVENTESTOQUE ADD CONSTRAINT MOBALANCOXINVENTESTOQUE_FK1 FOREIGN KEY (divergenciaBalanco) REFERENCES MOBALANCOXDIVERGENCIA (divergenciaBalanco);
ALTER TABLE MOBALANCOXESTOQUE ADD CONSTRAINT MOBALANCOXESTOQUE_FK1 FOREIGN KEY (divergenciaBalanco) REFERENCES MOBALANCOXDIVERGENCIA (divergenciaBalanco);
ALTER TABLE MOBALANCOXDOCFISCAL ADD CONSTRAINT MOBALANCOXDOCFISCAL_FK1 FOREIGN KEY (divergenciaBalanco) REFERENCES MOBALANCOXDIVERGENCIA (divergenciaBalanco);

CREATE TABLE MOBALANCOXITENS_2501 AS SELECT * FROM MOBALANCOXITENS;

DROP TABLE MOBALANCOXITENS;

-- MOBALANCOXITENS
CREATE TABLE MOBALANCOXITENS
  (
    idItemBalanco     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idListaBalanco    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao         NUMERIC (11,0) DEFAULT 0 NOT NULL,
    cancelado         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    linhaImportada    VARCHAR (300) DEFAULT ' ' NOT NULL,
    mensagemBalanco   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    gradeProduto      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao    NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes       VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_PK1 PRIMARY KEY (idItemBalanco);
CREATE UNIQUE INDEX MOBALANCOXITENS_K2 ON MOBALANCOXITENS (idListaBalanco, ordenacao);
CREATE INDEX MOBALANCOXITENS_K3 ON MOBALANCOXITENS (idListaBalanco, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie);
CREATE INDEX MOBALANCOXITENS_K4 ON MOBALANCOXITENS (gradeProduto);
CREATE INDEX MOBALANCOXITENS_K5 ON MOBALANCOXITENS (idListaBalanco);
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_FK1 FOREIGN KEY (idListaBalanco) REFERENCES MOBALANCOXLISTAS (idListaBalanco);
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_FK2 FOREIGN KEY (mensagemBalanco) REFERENCES SIMENSAGENSBALANCO (mensagemBalanco);
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_FK4 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_FK5 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOBALANCOXITENS ADD CONSTRAINT MOBALANCOXITENS_FK6 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MOBALANCOXITENS (idItemBalanco, idListaBalanco, ordenacao, cancelado, linhaImportada, mensagemBalanco, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, observacoes) VALUES (0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, ' '); 
INSERT INTO MOBALANCOXITENS (idItemBalanco, idListaBalanco, ordenacao, cancelado, linhaImportada, mensagemBalanco, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, observacoes) SELECT idItemBalanco, idListaBalanco, ordenacao, cancelado, linhaImportada, mensagemBalanco, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, observacoes FROM MOBALANCOXITENS_2501 WHERE idItemBalanco > 0;

COMMIT;

CREATE TABLE MODOCTROCAXITENS_2501 AS SELECT * FROM MODOCTROCAXITENS;

DROP TABLE MODOCTROCAXITENS;

-- MODOCTROCAXITENS
CREATE TABLE MODOCTROCAXITENS
  (
    idItemDocTroca                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documentoTroca                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    entradaSaida                  CHAR (1) DEFAULT ' ' NOT NULL,
    sequencia                     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    vendedor                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco                     CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                   VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoUnitario                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoServico           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimo                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFrete                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguro                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMer      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneiras       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosSomaPagamento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosDiminuiPagamento NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquido                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCustoOperacao            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCustoOperacao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV                      NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    idItemPreDocumentoSaida       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscalSaida          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idEstoque                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscalEntrada        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_PK1 PRIMARY KEY (idItemDocTroca);
CREATE UNIQUE INDEX MODOCTROCAXITENS_K2 ON MODOCTROCAXITENS (documentoTroca, entradaSaida, sequencia);
CREATE INDEX MODOCTROCAXITENS_K3 ON MODOCTROCAXITENS (idItemPreDocumentoSaida);
CREATE INDEX MODOCTROCAXITENS_K4 ON MODOCTROCAXITENS (idItemDocFiscalSaida);
CREATE INDEX MODOCTROCAXITENS_K5 ON MODOCTROCAXITENS (idEstoque);
CREATE INDEX MODOCTROCAXITENS_K6 ON MODOCTROCAXITENS (idItemDocFiscalEntrada);
CREATE INDEX MODOCTROCAXITENS_K7 ON MODOCTROCAXITENS (gradeProduto);
CREATE INDEX MODOCTROCAXITENS_K8 ON MODOCTROCAXITENS (documentoTroca);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK1 FOREIGN KEY (documentoTroca) REFERENCES MODOCUMENTOSTROCA (documentoTroca);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK2 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK4 FOREIGN KEY (idFormulaTinta) REFERENCES CAFORMULASTINTAS (idFormulaTinta);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK5 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK6 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK7 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK8 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK9 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK10 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK11 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK12 FOREIGN KEY (idItemPreDocumentoSaida) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK13 FOREIGN KEY (idItemDocFiscalSaida) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK14 FOREIGN KEY (idEstoque) REFERENCES MOESTOQUES (idEstoque);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK15 FOREIGN KEY (idItemDocFiscalEntrada) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);

INSERT INTO MODOCTROCAXITENS (idItemDocTroca, documentoTroca, entradaSaida, sequencia, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, idNumeroSerie, localEstoque, pessoaParticipante, quantidade, tipoPreco, tabelaPreco, precoUnitario, valorProdutoServico, valorDesconto, valorAcrescimo, valorFrete, valorSeguro, valorAdicFreteMarinhaMer, valorDespesasAduaneiras, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquido, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, idItemPreDocumentoSaida, idItemDocFiscalSaida, idEstoque, idItemDocFiscalEntrada, observacoes) VALUES (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, ' ');
INSERT INTO MODOCTROCAXITENS (idItemDocTroca, documentoTroca, entradaSaida, sequencia, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, idNumeroSerie, localEstoque, pessoaParticipante, quantidade, tipoPreco, tabelaPreco, precoUnitario, valorProdutoServico, valorDesconto, valorAcrescimo, valorFrete, valorSeguro, valorAdicFreteMarinhaMer, valorDespesasAduaneiras, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquido, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, idItemPreDocumentoSaida, idItemDocFiscalSaida, idEstoque, idItemDocFiscalEntrada, observacoes) SELECT idItemDocTroca, documentoTroca, entradaSaida, sequencia, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, idNumeroSerie, localEstoque, pessoaParticipante, quantidade, tipoPreco, tabelaPreco, precoUnitario, valorProdutoServico, valorDesconto, valorAcrescimo, valorFrete, valorSeguro, valorAdicFreteMarinhaMer, valorDespesasAduaneiras, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquido, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, idItemPreDocumentoSaida, idItemDocFiscalSaida, idEstoque, idItemDocFiscalEntrada, observacoes FROM MODOCTROCAXITENS_2501 WHERE idItemDocTroca > 0;

COMMIT;

CREATE TABLE MOINVENTARIOESTOQUEXITENS_2501 AS SELECT * FROM MOINVENTARIOESTOQUEXITENS;

ALTER TABLE MOBALANCOXINVENTESTOQUE DROP CONSTRAINT MOBALANCOXINVENTESTOQUE_FK2;

DROP TABLE MOINVENTARIOESTOQUEXITENS;

-- MOINVENTARIOESTOQUEXITENS
CREATE TABLE MOINVENTARIOESTOQUEXITENS
  (
    idItemInventarioEstoque       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    inventarioEstoque             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto                       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPropriedadePosseItem CHAR (1) DEFAULT ' ' NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitarioCMV              NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioUltimaCompra     NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCustoUltimaCompra        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCustoUltimaFormacao      NUMERIC (15,7) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_PK1 PRIMARY KEY (idItemInventarioEstoque);
CREATE UNIQUE INDEX MOINVENTARIOESTOQUEXITENS_K2 ON MOINVENTARIOESTOQUEXITENS (inventarioEstoque, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K3 ON MOINVENTARIOESTOQUEXITENS (inventarioEstoque);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K4 ON MOINVENTARIOESTOQUEXITENS (produto);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K5 ON MOINVENTARIOESTOQUEXITENS (gradeProduto);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K6 ON MOINVENTARIOESTOQUEXITENS (indicadorPropriedadePosseItem);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K7 ON MOINVENTARIOESTOQUEXITENS (pessoaParticipante);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K8 ON MOINVENTARIOESTOQUEXITENS (localEstoque);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K9 ON MOINVENTARIOESTOQUEXITENS (personalizacao);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K10 ON MOINVENTARIOESTOQUEXITENS (idLoteEstoque);
CREATE INDEX MOINVENTARIOESTOQUEXITENS_K11 ON MOINVENTARIOESTOQUEXITENS (idNumeroSerie);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK1 FOREIGN KEY (inventarioEstoque) REFERENCES MOINVENTARIOSESTOQUE (inventarioEstoque);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK4 FOREIGN KEY (indicadorPropriedadePosseItem) REFERENCES SIINDICPOSSEITEM (indicadorPropriedadePosseItem);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK5 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK6 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK7 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK8 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOINVENTARIOESTOQUEXITENS ADD CONSTRAINT MOINVENTARIOESTOQUEXITENS_FK9 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MOINVENTARIOESTOQUEXITENS (idItemInventarioEstoque, inventarioEstoque, produto, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoUnitarioCMV, precoUnitarioUltimaCompra, precoCustoUltimaCompra, precoCustoUltimaFormacao, observacoes) VALUES (0, 0, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MOINVENTARIOESTOQUEXITENS (idItemInventarioEstoque, inventarioEstoque, produto, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoUnitarioCMV, precoUnitarioUltimaCompra, precoCustoUltimaCompra, precoCustoUltimaFormacao, observacoes) SELECT a.idItemInventarioEstoque, a.inventarioEstoque, b.produto, a.gradeProduto, a.indicadorPropriedadePosseItem, a.pessoaParticipante, a.localEstoque, a.personalizacao, a.idLoteEstoque, a.idNumeroSerie, a.quantidade, a.precoUnitarioCMV, a.precoUnitarioUltimaCompra, a.precoCustoUltimaCompra, a.precoCustoUltimaFormacao, a.observacoes FROM MOINVENTARIOESTOQUEXITENS_2501 a JOIN CAGRADESPRODUTO b ON b.gradeProduto = a.gradeProduto WHERE a.idItemInventarioEstoque > 0;

COMMIT;

ALTER TABLE MOBALANCOXINVENTESTOQUE ADD CONSTRAINT MOBALANCOXINVENTESTOQUE_FK2 FOREIGN KEY (idItemInventarioEstoque) REFERENCES MOINVENTARIOESTOQUEXITENS (idItemInventarioEstoque);

CREATE TABLE MOINVENTARIOESTOQUEXFISC_2501 AS SELECT * FROM MOINVENTARIOESTOQUEXFISC;

DROP TABLE MOINVENTARIOESTOQUEXFISC;

-- MOINVENTARIOESTOQUEXFISC
CREATE TABLE MOINVENTARIOESTOQUEXFISC
  (
    id                            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    inventarioEstoque             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto                       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPropriedadePosseItem CHAR (1) DEFAULT ' ' NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitarioCMV              NUMERIC (15,7) DEFAULT 0 NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOINVENTARIOESTOQUEXFISC ADD CONSTRAINT MOINVENTARIOESTOQUEXFISC_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOINVENTARIOESTOQUEXFISC_K2 ON MOINVENTARIOESTOQUEXFISC (inventarioEstoque, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante);
CREATE INDEX MOINVENTARIOESTOQUEXFISC_K3 ON MOINVENTARIOESTOQUEXFISC (inventarioEstoque);
CREATE INDEX MOINVENTARIOESTOQUEXFISC_K4 ON MOINVENTARIOESTOQUEXFISC (produto);
CREATE INDEX MOINVENTARIOESTOQUEXFISC_K5 ON MOINVENTARIOESTOQUEXFISC (gradeProduto);
CREATE INDEX MOINVENTARIOESTOQUEXFISC_K6 ON MOINVENTARIOESTOQUEXFISC (indicadorPropriedadePosseItem);
CREATE INDEX MOINVENTARIOESTOQUEXFISC_K7 ON MOINVENTARIOESTOQUEXFISC (pessoaParticipante);
CREATE INDEX MOINVENTARIOESTOQUEXFISC_K8 ON MOINVENTARIOESTOQUEXFISC (stICMS);
ALTER TABLE MOINVENTARIOESTOQUEXFISC ADD CONSTRAINT MOINVENTARIOESTOQUEXFISC_FK1 FOREIGN KEY (inventarioEstoque) REFERENCES MOINVENTARIOSESTOQUE (inventarioEstoque);
ALTER TABLE MOINVENTARIOESTOQUEXFISC ADD CONSTRAINT MOINVENTARIOESTOQUEXFISC_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MOINVENTARIOESTOQUEXFISC ADD CONSTRAINT MOINVENTARIOESTOQUEXFISC_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOINVENTARIOESTOQUEXFISC ADD CONSTRAINT MOINVENTARIOESTOQUEXFISC_FK4 FOREIGN KEY (indicadorPropriedadePosseItem) REFERENCES SIINDICPOSSEITEM (indicadorPropriedadePosseItem);
ALTER TABLE MOINVENTARIOESTOQUEXFISC ADD CONSTRAINT MOINVENTARIOESTOQUEXFISC_FK5 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOINVENTARIOESTOQUEXFISC ADD CONSTRAINT MOINVENTARIOESTOQUEXFISC_FK6 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);

INSERT INTO MOINVENTARIOESTOQUEXFISC (id, inventarioEstoque, produto, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante, quantidade, precoUnitarioCMV, stICMS, baseICMS, valorICMS, observacoes) VALUES (0, 0, 0, 0, ' ', 0, 0, 0, '  ', 0, 0, ' ');
INSERT INTO MOINVENTARIOESTOQUEXFISC (id, inventarioEstoque, produto, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante, quantidade, precoUnitarioCMV, stICMS, baseICMS, valorICMS, observacoes) SELECT a.id, a.inventarioEstoque, b.produto, a.gradeProduto, a.indicadorPropriedadePosseItem, a.pessoaParticipante, a.quantidade, a.precoUnitarioCMV, a.stICMS, a.baseICMS, a.valorICMS, a.observacoes FROM MOINVENTARIOESTOQUEXFISC_2501 a JOIN CAGRADESPRODUTO b ON b.gradeProduto = a.gradeProduto WHERE a.id > 0;

COMMIT;

CREATE TABLE MODOCFISCALXBLOQUEIOSEST_2501 AS SELECT * FROM MODOCFISCALXBLOQUEIOSEST;

DROP TABLE MODOCFISCALXBLOQUEIOSEST;

-- MODOCFISCALXBLOQUEIOSEST
CREATE TABLE MODOCFISCALXBLOQUEIOSEST
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDocumentoFiscal  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    dataBloqueio       DATE,
    estabelecimento    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    localEstoque       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeReservas NUMERIC (15,6) DEFAULT 0 NOT NULL,
    situacaoLiberacao  CHAR (1) DEFAULT ' ' NOT NULL,
    usuarioLiberacao   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataLiberacao      DATE,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_PK1 PRIMARY KEY (id);
CREATE INDEX MODOCFISCALXBLOQUEIOSEST_K2 ON MODOCFISCALXBLOQUEIOSEST (idDocumentoFiscal, sequencia);
CREATE INDEX MODOCFISCALXBLOQUEIOSEST_K3 ON MODOCFISCALXBLOQUEIOSEST (idDocumentoFiscal);
CREATE INDEX MODOCFISCALXBLOQUEIOSEST_K4 ON MODOCFISCALXBLOQUEIOSEST (gradeProduto);
CREATE INDEX MODOCFISCALXBLOQUEIOSEST_K5 ON MODOCFISCALXBLOQUEIOSEST (idDocumentoFiscal, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK1 FOREIGN KEY (idDocumentoFiscal) REFERENCES MODOCUMENTOSFISCAIS (idDocumentoFiscal);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK3 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK4 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK6 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK7 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK8 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK9 FOREIGN KEY (situacaoLiberacao) REFERENCES SISITUACOESLIBERACAO (situacaoLiberacao);
ALTER TABLE MODOCFISCALXBLOQUEIOSEST ADD CONSTRAINT MODOCFISCALXBLOQUEIOSEST_FK10 FOREIGN KEY (usuarioLiberacao) REFERENCES CAUSUARIOS (usuario);

INSERT INTO MODOCFISCALXBLOQUEIOSEST (id, idDocumentoFiscal, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) VALUES (0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, NULL, ' ');
INSERT INTO MODOCFISCALXBLOQUEIOSEST (id, idDocumentoFiscal, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) SELECT id, idDocumentoFiscal, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes FROM MODOCFISCALXBLOQUEIOSEST_2501 WHERE id > 0;

COMMIT;

CREATE TABLE MOPREDOCUMXBLOQUEIOSEST_2501 AS SELECT * FROM MOPREDOCUMXBLOQUEIOSEST;

DROP TABLE MOPREDOCUMXBLOQUEIOSEST;

-- MOPREDOCUMXBLOQUEIOSEST
CREATE TABLE MOPREDOCUMXBLOQUEIOSEST
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    preDocumento       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    dataBloqueio       DATE,
    estabelecimento    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    localEstoque       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeReservas NUMERIC (15,6) DEFAULT 0 NOT NULL,
    situacaoLiberacao  CHAR (1) DEFAULT ' ' NOT NULL,
    usuarioLiberacao   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataLiberacao      DATE,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_PK1 PRIMARY KEY (id);
CREATE INDEX MOPREDOCUMXBLOQUEIOSEST_K2 ON MOPREDOCUMXBLOQUEIOSEST (preDocumento, sequencia);
CREATE INDEX MOPREDOCUMXBLOQUEIOSEST_K3 ON MOPREDOCUMXBLOQUEIOSEST (preDocumento);
CREATE INDEX MOPREDOCUMXBLOQUEIOSEST_K4 ON MOPREDOCUMXBLOQUEIOSEST (gradeProduto);
CREATE INDEX MOPREDOCUMXBLOQUEIOSEST_K5 ON MOPREDOCUMXBLOQUEIOSEST (preDocumento, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK1 FOREIGN KEY (preDocumento) REFERENCES MOPREDOCUMENTOS (preDocumento);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK3 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK4 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK6 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK7 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK8 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK9 FOREIGN KEY (situacaoLiberacao) REFERENCES SISITUACOESLIBERACAO (situacaoLiberacao);
ALTER TABLE MOPREDOCUMXBLOQUEIOSEST ADD CONSTRAINT MOPREDOCUMXBLOQUEIOSEST_FK10 FOREIGN KEY (usuarioLiberacao) REFERENCES CAUSUARIOS (usuario);

INSERT INTO MOPREDOCUMXBLOQUEIOSEST (id, preDocumento, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) VALUES (0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, NULL, ' ');
INSERT INTO MOPREDOCUMXBLOQUEIOSEST (id, preDocumento, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) SELECT id, preDocumento, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes FROM MOPREDOCUMXBLOQUEIOSEST_2501 WHERE id > 0;

COMMIT;

CREATE TABLE MOORCAMENTOXBLOQUEIOSEST_2501 AS SELECT * FROM MOORCAMENTOXBLOQUEIOSEST;

DROP TABLE MOORCAMENTOXBLOQUEIOSEST;

-- MOORCAMENTOXBLOQUEIOSEST
CREATE TABLE MOORCAMENTOXBLOQUEIOSEST
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    orcamento          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia          NUMERIC (3,0) DEFAULT 0 NOT NULL,
    dataBloqueio       DATE,
    estabelecimento    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    localEstoque       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeReservas NUMERIC (15,6) DEFAULT 0 NOT NULL,
    situacaoLiberacao  CHAR (1) DEFAULT ' ' NOT NULL,
    usuarioLiberacao   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataLiberacao      DATE,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_PK1 PRIMARY KEY (id);
CREATE INDEX MOORCAMENTOXBLOQUEIOSEST_K2 ON MOORCAMENTOXBLOQUEIOSEST (orcamento, sequencia);
CREATE INDEX MOORCAMENTOXBLOQUEIOSEST_K3 ON MOORCAMENTOXBLOQUEIOSEST (orcamento);
CREATE INDEX MOORCAMENTOXBLOQUEIOSEST_K4 ON MOORCAMENTOXBLOQUEIOSEST (gradeProduto);
CREATE INDEX MOORCAMENTOXBLOQUEIOSEST_K5 ON MOORCAMENTOXBLOQUEIOSEST (orcamento, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK1 FOREIGN KEY (orcamento) REFERENCES MOORCAMENTOS (orcamento);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK3 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK4 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK6 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK7 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK8 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK9 FOREIGN KEY (situacaoLiberacao) REFERENCES SISITUACOESLIBERACAO (situacaoLiberacao);
ALTER TABLE MOORCAMENTOXBLOQUEIOSEST ADD CONSTRAINT MOORCAMENTOXBLOQUEIOSEST_FK10 FOREIGN KEY (usuarioLiberacao) REFERENCES CAUSUARIOS (usuario);

INSERT INTO MOORCAMENTOXBLOQUEIOSEST (id, orcamento, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) VALUES (0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', 0, NULL, ' ');
INSERT INTO MOORCAMENTOXBLOQUEIOSEST (id, orcamento, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes) SELECT id, orcamento, sequencia, dataBloqueio, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, quantidadeEstoque, quantidadeReservas, situacaoLiberacao, usuarioLiberacao, dataLiberacao, observacoes FROM MOORCAMENTOXBLOQUEIOSEST_2501 WHERE id > 0;

COMMIT;

CREATE TABLE MODOCFISCALXPRODUTOFILHO_2501 AS SELECT * FROM MODOCFISCALXPRODUTOFILHO;
ALTER TABLE MODOCFISCALXPRODUTOFILHO_2501 ADD CONSTRAINT MODOCFISCALXPRODUTOFI_2501_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

DROP TABLE MODOCFISCALXPRODUTOFILHO;

-- MODOCFISCALXPRODUTOFILHO
CREATE TABLE MODOCFISCALXPRODUTOFILHO
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto            NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoCustoOperacao NUMERIC (15,7) DEFAULT 0 NOT NULL,
    totalCustoOperacao NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_PK1 PRIMARY KEY (id);
CREATE INDEX MODOCFISCALXPRODUTOFILHO_K2 ON MODOCFISCALXPRODUTOFILHO (idItemDocFiscal);
CREATE INDEX MODOCFISCALXPRODUTOFILHO_K3 ON MODOCFISCALXPRODUTOFILHO (produto);
CREATE INDEX MODOCFISCALXPRODUTOFILHO_K4 ON MODOCFISCALXPRODUTOFILHO (gradeProduto);
CREATE INDEX MODOCFISCALXPRODUTOFILHO_K5 ON MODOCFISCALXPRODUTOFILHO (personalizacao);
CREATE INDEX MODOCFISCALXPRODUTOFILHO_K6 ON MODOCFISCALXPRODUTOFILHO (idLoteEstoque);
CREATE INDEX MODOCFISCALXPRODUTOFILHO_K7 ON MODOCFISCALXPRODUTOFILHO (idNumeroSerie);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK4 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK5 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK6 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MODOCFISCALXPRODUTOFILHO (id, idItemDocFiscal, produto, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MODOCFISCALXPRODUTOFILHO (id, idItemDocFiscal, produto, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes) SELECT a.id, a.idItemDocFiscal, b.produto, a.gradeProduto, a.personalizacao, a.idLoteEstoque, a.idNumeroSerie, a.quantidade, a.precoCustoOperacao, a.totalCustoOperacao, a.precoCMV, a.valorCMV, a.observacoes FROM MODOCFISCALXPRODUTOFILHO_2501 a JOIN CAGRADESPRODUTO b ON b.gradeProduto = a.gradeProduto WHERE a.id > 0;

COMMIT;

CREATE TABLE MOPREDOCUMXPRODUTOFILHO_2501 AS SELECT * FROM MOPREDOCUMXPRODUTOFILHO;
ALTER TABLE MOPREDOCUMXPRODUTOFILHO_2501 ADD CONSTRAINT MOPREDOCUMXPRODUTOFIL_2501_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

DROP TABLE MOPREDOCUMXPRODUTOFILHO;

-- MOPREDOCUMXPRODUTOFILHO
CREATE TABLE MOPREDOCUMXPRODUTOFILHO
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto            NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoCustoOperacao NUMERIC (15,7) DEFAULT 0 NOT NULL,
    totalCustoOperacao NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_PK1 PRIMARY KEY (id);
CREATE INDEX MOPREDOCUMXPRODUTOFILHO_K2 ON MOPREDOCUMXPRODUTOFILHO (idItemPreDocumento);
CREATE INDEX MOPREDOCUMXPRODUTOFILHO_K3 ON MOPREDOCUMXPRODUTOFILHO (produto);
CREATE INDEX MOPREDOCUMXPRODUTOFILHO_K4 ON MOPREDOCUMXPRODUTOFILHO (gradeProduto);
CREATE INDEX MOPREDOCUMXPRODUTOFILHO_K5 ON MOPREDOCUMXPRODUTOFILHO (personalizacao);
CREATE INDEX MOPREDOCUMXPRODUTOFILHO_K6 ON MOPREDOCUMXPRODUTOFILHO (idLoteEstoque);
CREATE INDEX MOPREDOCUMXPRODUTOFILHO_K7 ON MOPREDOCUMXPRODUTOFILHO (idNumeroSerie);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK2 FOREIGN KEY (produto) REFERENCES CAPRODUTOS (produto);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK4 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK5 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK6 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MOPREDOCUMXPRODUTOFILHO (id, idItemPreDocumento, produto, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO MOPREDOCUMXPRODUTOFILHO (id, idItemPreDocumento, produto, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes) SELECT a.id, a.idItemPreDocumento, b.produto, a.gradeProduto, a.personalizacao, a.idLoteEstoque, a.idNumeroSerie, a.quantidade, a.precoCustoOperacao, a.totalCustoOperacao, a.precoCMV, a.valorCMV, a.observacoes FROM MOPREDOCUMXPRODUTOFILHO_2501 a JOIN CAGRADESPRODUTO b ON b.gradeProduto = a.gradeProduto WHERE a.id > 0;

COMMIT;

CREATE TABLE MODOCFISCALXNUMEROSSERIE_2501 AS SELECT * FROM MODOCFISCALXNUMEROSSERIE;

DROP TABLE MODOCFISCALXNUMEROSSERIE;

-- MODOCFISCALXNUMEROSSERIE
CREATE TABLE MODOCFISCALXNUMEROSSERIE
  (
    idNumeroSerieDocFiscal     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    devolvidoRetornado         NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MODOCFISCALXNUMEROSSERIE ADD CONSTRAINT MODOCFISCALXNUMEROSSERIE_PK1 PRIMARY KEY (idNumeroSerieDocFiscal);
CREATE UNIQUE INDEX MODOCFISCALXNUMEROSSERIE_K2 ON MODOCFISCALXNUMEROSSERIE (idItemDocFiscal, idNumeroSerie);
CREATE INDEX MODOCFISCALXNUMEROSSERIE_K3 ON MODOCFISCALXNUMEROSSERIE (idItemDocFiscal);
CREATE INDEX MODOCFISCALXNUMEROSSERIE_K4 ON MODOCFISCALXNUMEROSSERIE (gradeProduto);
CREATE INDEX MODOCFISCALXNUMEROSSERIE_K5 ON MODOCFISCALXNUMEROSSERIE (idNumeroSerie);
ALTER TABLE MODOCFISCALXNUMEROSSERIE ADD CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXNUMEROSSERIE ADD CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXNUMEROSSERIE ADD CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK3 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MODOCFISCALXNUMEROSSERIE (idNumeroSerieDocFiscal, idItemDocFiscal, gradeProduto, idNumeroSerie, devolvidoRetornado) VALUES (0, 0, 0, 0, 0);
INSERT INTO MODOCFISCALXNUMEROSSERIE (idNumeroSerieDocFiscal, idItemDocFiscal, gradeProduto, idNumeroSerie, devolvidoRetornado) SELECT idNumeroSerieDocFiscal, idItemDocFiscal, gradeProduto, idNumeroSerie, devolvidoRetornado FROM MODOCFISCALXNUMEROSSERIE_2501 WHERE idNumeroSerieDocFiscal > 0;

COMMIT;

DROP TABLE MODOCFISCALXENDERECOESTOQ;

CREATE TABLE MOPREDOCUMXNUMEROSSERIE_2501 AS SELECT * FROM MOPREDOCUMXNUMEROSSERIE;

DROP TABLE MOPREDOCUMXNUMEROSSERIE;

-- MOPREDOCUMXNUMEROSSERIE
CREATE TABLE MOPREDOCUMXNUMEROSSERIE
  (
    idNumeroSeriePreDocumento  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    devolvidoRetornado         NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOPREDOCUMXNUMEROSSERIE ADD CONSTRAINT MOPREDOCUMXNUMEROSSERIE_PK1 PRIMARY KEY (idNumeroSeriePreDocumento);
CREATE UNIQUE INDEX MOPREDOCUMXNUMEROSSERIE_K2 ON MOPREDOCUMXNUMEROSSERIE (idItemPreDocumento, idNumeroSerie);
CREATE INDEX MOPREDOCUMXNUMEROSSERIE_K3 ON MOPREDOCUMXNUMEROSSERIE (idItemPreDocumento);
CREATE INDEX MOPREDOCUMXNUMEROSSERIE_K4 ON MOPREDOCUMXNUMEROSSERIE (gradeProduto);
CREATE INDEX MOPREDOCUMXNUMEROSSERIE_K5 ON MOPREDOCUMXNUMEROSSERIE (idNumeroSerie);
ALTER TABLE MOPREDOCUMXNUMEROSSERIE ADD CONSTRAINT MOPREDOCUMXNUMEROSSERIE_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXNUMEROSSERIE ADD CONSTRAINT MOPREDOCUMXNUMEROSSERIE_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXNUMEROSSERIE ADD CONSTRAINT MOPREDOCUMXNUMEROSSERIE_FK3 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MOPREDOCUMXNUMEROSSERIE (idNumeroSeriePreDocumento, idItemPreDocumento, gradeProduto, idNumeroSerie, devolvidoRetornado) VALUES (0, 0, 0, 0, 0);
INSERT INTO MOPREDOCUMXNUMEROSSERIE (idNumeroSeriePreDocumento, idItemPreDocumento, gradeProduto, idNumeroSerie, devolvidoRetornado) SELECT idNumeroSeriePreDocumento, idItemPreDocumento, gradeProduto, idNumeroSerie, devolvidoRetornado FROM MOPREDOCUMXNUMEROSSERIE_2501 WHERE idNumeroSeriePreDocumento > 0;

COMMIT;

DROP TABLE MOPREDOCUMXENDERECOESTOQ;

CREATE TABLE MOORCAMENTOXNUMEROSSERIE_2501 AS SELECT * FROM MOORCAMENTOXNUMEROSSERIE;

DROP TABLE MOORCAMENTOXNUMEROSSERIE;

-- MOORCAMENTOXNUMEROSSERIE
CREATE TABLE MOORCAMENTOXNUMEROSSERIE
  (
    idNumeroSerieOrcamento     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    efetivado                  NUMERIC (1,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOORCAMENTOXNUMEROSSERIE ADD CONSTRAINT MOORCAMENTOXNUMEROSSERIE_PK1 PRIMARY KEY (idNumeroSerieOrcamento);
CREATE UNIQUE INDEX MOORCAMENTOXNUMEROSSERIE_K2 ON MOORCAMENTOXNUMEROSSERIE (idItemOrcamento, idNumeroSerie);
CREATE INDEX MOORCAMENTOXNUMEROSSERIE_K3 ON MOORCAMENTOXNUMEROSSERIE (idItemOrcamento);
CREATE INDEX MOORCAMENTOXNUMEROSSERIE_K4 ON MOORCAMENTOXNUMEROSSERIE (gradeProduto);
CREATE INDEX MOORCAMENTOXNUMEROSSERIE_K5 ON MOORCAMENTOXNUMEROSSERIE (idNumeroSerie);
ALTER TABLE MOORCAMENTOXNUMEROSSERIE ADD CONSTRAINT MOORCAMENTOXNUMEROSSERIE_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXNUMEROSSERIE ADD CONSTRAINT MOORCAMENTOXNUMEROSSERIE_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOORCAMENTOXNUMEROSSERIE ADD CONSTRAINT MOORCAMENTOXNUMEROSSERIE_FK3 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO MOORCAMENTOXNUMEROSSERIE (idNumeroSerieOrcamento, idItemOrcamento, gradeProduto, idNumeroSerie, efetivado) VALUES (0, 0, 0, 0, 0);
INSERT INTO MOORCAMENTOXNUMEROSSERIE (idNumeroSerieOrcamento, idItemOrcamento, gradeProduto, idNumeroSerie, efetivado) SELECT idNumeroSerieOrcamento, idItemOrcamento, gradeProduto, idNumeroSerie, efetivado FROM MOORCAMENTOXNUMEROSSERIE_2501 WHERE idNumeroSerieOrcamento > 0;

COMMIT;

DROP TABLE MOORCAMENTOXENDERECOESTOQ;

DELETE PAIMPRESSORAXDOCUMENTO WHERE tipoDocumentoImpresso = 44;
DELETE SITIPOSDOCUMENTOIMPRESSO WHERE tipoDocumentoImpresso = 44;

COMMIT;

DELETE PACONFIGURACAOXCONTEUDOS WHERE configuracao IN (130,131,132);
DELETE SIOPCOESCOMBOCONFIGURACAO WHERE configuracao IN (130,131,132);
DELETE SICONFIGURACOES WHERE configuracao IN (130,131,132);

DELETE MOEVENTOS WHERE tabelaSistema IN ('MOORCAMENTOXENDERECOESTOQ','MOPREDOCUMXENDERECOESTOQ','MODOCFISCALXENDERECOESTOQ','SISITUACOESSEPARACAO','PAETAPASSEPARACAO','MOSEPARACOES','MOSEPARACAOXITENS','MOSEPARACAOXENDERECOESTOQ','MOSEPARACAOXNUMEROSSERIE','MOSEPARACAOXBLOQUEIOSEST','MOSEPARACAOXESTOQUE','SIPOSICOESCAIXAESTOQUE','PAPRIORIDADESESTOQUE','SITIPOSPRIORIDADEESTOQUE');
DELETE MOSINCRONIZACOES WHERE tabelaSistema IN ('MOORCAMENTOXENDERECOESTOQ','MOPREDOCUMXENDERECOESTOQ','MODOCFISCALXENDERECOESTOQ','SISITUACOESSEPARACAO','PAETAPASSEPARACAO','MOSEPARACOES','MOSEPARACAOXITENS','MOSEPARACAOXENDERECOESTOQ','MOSEPARACAOXNUMEROSSERIE','MOSEPARACAOXBLOQUEIOSEST','MOSEPARACAOXESTOQUE','SIPOSICOESCAIXAESTOQUE','PAPRIORIDADESESTOQUE','SITIPOSPRIORIDADEESTOQUE');
DELETE MOLOGALTERACOES WHERE tabelaSistema IN ('MOORCAMENTOXENDERECOESTOQ','MOPREDOCUMXENDERECOESTOQ','MODOCFISCALXENDERECOESTOQ','SISITUACOESSEPARACAO','PAETAPASSEPARACAO','MOSEPARACOES','MOSEPARACAOXITENS','MOSEPARACAOXENDERECOESTOQ','MOSEPARACAOXNUMEROSSERIE','MOSEPARACAOXBLOQUEIOSEST','MOSEPARACAOXESTOQUE','SIPOSICOESCAIXAESTOQUE','PAPRIORIDADESESTOQUE','SITIPOSPRIORIDADEESTOQUE');
DELETE PAPERSONALIZACOESPROJETO WHERE tabelaSistema IN ('MOORCAMENTOXENDERECOESTOQ','MOPREDOCUMXENDERECOESTOQ','MODOCFISCALXENDERECOESTOQ','SISITUACOESSEPARACAO','PAETAPASSEPARACAO','MOSEPARACOES','MOSEPARACAOXITENS','MOSEPARACAOXENDERECOESTOQ','MOSEPARACAOXNUMEROSSERIE','MOSEPARACAOXBLOQUEIOSEST','MOSEPARACAOXESTOQUE','SIPOSICOESCAIXAESTOQUE','PAPRIORIDADESESTOQUE','SITIPOSPRIORIDADEESTOQUE');
DELETE PACHECKLISTXTAREFAS WHERE tabelaSistema IN ('MOORCAMENTOXENDERECOESTOQ','MOPREDOCUMXENDERECOESTOQ','MODOCFISCALXENDERECOESTOQ','SISITUACOESSEPARACAO','PAETAPASSEPARACAO','MOSEPARACOES','MOSEPARACAOXITENS','MOSEPARACAOXENDERECOESTOQ','MOSEPARACAOXNUMEROSSERIE','MOSEPARACAOXBLOQUEIOSEST','MOSEPARACAOXESTOQUE','SIPOSICOESCAIXAESTOQUE','PAPRIORIDADESESTOQUE','SITIPOSPRIORIDADEESTOQUE');
DELETE SITABELASSISTEMA WHERE tabelaSistema IN ('MOORCAMENTOXENDERECOESTOQ','MOPREDOCUMXENDERECOESTOQ','MODOCFISCALXENDERECOESTOQ','SISITUACOESSEPARACAO','PAETAPASSEPARACAO','MOSEPARACOES','MOSEPARACAOXITENS','MOSEPARACAOXENDERECOESTOQ','MOSEPARACAOXNUMEROSSERIE','MOSEPARACAOXBLOQUEIOSEST','MOSEPARACAOXESTOQUE','SIPOSICOESCAIXAESTOQUE','PAPRIORIDADESESTOQUE','SITIPOSPRIORIDADEESTOQUE');

COMMIT;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (251, 30001001, 'Modelo Documento Perda', 1, 30001, 'N', '4', 'P', 0, 0, 0, 1, 1, 1, 'Modelo Documento', ' ', 'PAMODELOSDOCUMENTO', ' ');

COMMIT;

DROP TABLE PAPRIORIDADESESTOQUE;
DROP TABLE SITIPOSPRIORIDADEESTOQUE;
DROP TABLE SIPOSICOESCAIXAESTOQUE;

DROP TABLE TEMPCARRINHO;

-- TEMPCARRINHO
CREATE GLOBAL TEMPORARY TABLE TEMPCARRINHO
  (
    sessaoClient                VARCHAR (30) DEFAULT ' ' NOT NULL,
    sequencia                   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    produto                     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFormulaTinta              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoque                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    controleQuantidade          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedidaConversao      VARCHAR (6) DEFAULT ' ' NOT NULL,
    conversorQuantidade         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimo                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiplo                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    altura                      NUMERIC (14,3) DEFAULT 0 NOT NULL,
    largura                     NUMERIC (14,3) DEFAULT 0 NOT NULL,
    comprimento                 NUMERIC (14,3) DEFAULT 0 NOT NULL,
    pecas                       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConvertida        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoLiquido                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBruto                   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco                   CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                 VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoSugestaoAPrazo         NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoSugestaoAVista         NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoDesconto               NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoMinimo                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    usarPrecoAVista             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoPautaTabelado          NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioBruto          NUMERIC (15,7) DEFAULT 0 NOT NULL,
    acrescimoUnitarioComposicao NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitario               NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioConvertido     NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoServicoBruto    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorProdutoServico         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas        VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                 VARCHAR (4000) DEFAULT ' ' NOT NULL,
    idNumeroSerie               NUMERIC (14,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPCARRINHO ADD CONSTRAINT TEMPCARRINHO_PK1 PRIMARY KEY (sessaoClient, sequencia);
CREATE INDEX TEMPCARRINHO_K2 ON TEMPCARRINHO (sessaoClient, produto, sequencia);
CREATE INDEX TEMPCARRINHO_K3 ON TEMPCARRINHO (sessaoClient);
CREATE INDEX TEMPCARRINHO_K4 ON TEMPCARRINHO (produto);
CREATE INDEX TEMPCARRINHO_K5 ON TEMPCARRINHO (gradeProduto);
CREATE INDEX TEMPCARRINHO_K6 ON TEMPCARRINHO (sessaoClient, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, idNumeroSerie);

DROP TABLE TEMPENDERECOSESTOQUE;

DROP TABLE TEMPNUMEROSSERIE;

-- TEMPNUMEROSSERIE
CREATE GLOBAL TEMPORARY TABLE TEMPNUMEROSSERIE
  (
    sessaoClient                VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contadorTemp                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    id                          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroSerie                 VARCHAR (60) DEFAULT ' ' NOT NULL,
    idNumeroSerie               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    efetivadoDevRet             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    excluido                    NUMERIC (1,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPNUMEROSSERIE_PK1 ON TEMPNUMEROSSERIE (sessaoClient, contadorSessao, contadorTemp);
CREATE INDEX TEMPNUMEROSSERIE_K2 ON TEMPNUMEROSSERIE (sessaoClient, contadorSessao, gradeProduto, numeroSerie);
CREATE INDEX TEMPNUMEROSSERIE_K3 ON TEMPNUMEROSSERIE (sessaoClient, contadorSessao, gradeProduto, idNumeroSerie);

DROP TABLE TEMPVERIFICACAOESTOQUE;

--TEMPVERIFICACAOESTOQUE
CREATE GLOBAL TEMPORARY TABLE TEMPVERIFICACAOESTOQUE
  (
    sessaoClient         VARCHAR (30) DEFAULT ' ' NOT NULL,
    idCabecalho          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia            NUMERIC (3,0) DEFAULT 0 NOT NULL,
    estabelecimento      NUMERIC (4,0) DEFAULT 0 NOT NULL,
    localEstoque         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoque    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeReservas   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeJaLiberada NUMERIC (15,6) DEFAULT 0 NOT NULL,
    bloqueado            NUMERIC (1,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPVERIFICACAOESTOQUE_PK1 ON TEMPVERIFICACAOESTOQUE (sessaoClient, idCabecalho, sequencia, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie);
CREATE INDEX TEMPVERIFICACAOESTOQUE_K2 ON TEMPVERIFICACAOESTOQUE (sessaoClient, estabelecimento, localEstoque, pessoaParticipante, gradeProduto, personalizacao, idLoteEstoque, idNumeroSerie);

DROP TABLE TEMPMOVIMENTOESTOQUE;

-- TEMPMOVIMENTOESTOQUE
CREATE GLOBAL TEMPORARY TABLE TEMPMOVIMENTOESTOQUE
  (
    sessaoClient                  VARCHAR (30) DEFAULT ' ' NOT NULL,
    entradaSaida                  CHAR (1) DEFAULT ' ' NOT NULL,
    contador                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    vendedor                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFormulaTinta                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco                     CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                   VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoUnitario                 NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoServico           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimo                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFrete                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguro                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMer      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneiras       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosSomaPagamento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosDiminuiPagamento NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquido                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCustoOperacao            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCustoOperacao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    precoCMV                      NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorCMV                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    idItemPreDocumentoSaida       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscalSaida          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
   ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPMOVIMENTOESTOQUE_PK1 ON TEMPMOVIMENTOESTOQUE (sessaoClient, entradaSaida, contador);

DROP TABLE TEMPBALANCOXDIVERGENCIA;

-- TEMPBALANCOXDIVERGENCIA
CREATE GLOBAL TEMPORARY TABLE TEMPBALANCOXDIVERGENCIA
  (
    sessaoClient       VARCHAR (30) DEFAULT ' ' NOT NULL,
    idSessao           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao          NUMERIC (11,0) DEFAULT 0 NOT NULL,
    divergenciaBalanco NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cancelado          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    linhaImportada     VARCHAR (300) DEFAULT ' ' NOT NULL,
    mensagemBalanco    NUMERIC (3,0) DEFAULT 0 NOT NULL,
    gradeProduto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao     NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidadeEstoque  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeBalanco  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPBALANCOXDIVERGENCIA_PK1 ON TEMPBALANCOXDIVERGENCIA (sessaoClient, idSessao, ordenacao);

DROP TABLE TEMPINVENTARIOESTXFISCAL;

-- TEMPINVENTARIOESTXFISCAL
CREATE GLOBAL TEMPORARY TABLE TEMPINVENTARIOESTXFISCAL
  (
    sessaoClient                  VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contador                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    produto                       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPropriedadePosseItem CHAR (1) DEFAULT ' ' NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitarioCMV              NUMERIC (15,7) DEFAULT 0 NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPINVENTARIOESTXFISCAL ADD CONSTRAINT TEMPINVENTARIOESTXFISCAL_PK1 PRIMARY KEY (sessaoClient, contadorSessao, contador);
CREATE UNIQUE INDEX TEMPINVENTARIOESTXFISCAL_K2 ON TEMPINVENTARIOESTXFISCAL (sessaoClient, contadorSessao, estabelecimento, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante);

DROP TABLE TEMPINVENTARIOESTXGERENC;

-- TEMPINVENTARIOESTXGERENC
CREATE GLOBAL TEMPORARY TABLE TEMPINVENTARIOESTXGERENC
  (
    sessaoClient                  VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contador                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    produto                       NUMERIC (7,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    indicadorPropriedadePosseItem CHAR (1) DEFAULT ' ' NOT NULL,
    pessoaParticipante            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    localEstoque                  NUMERIC (4,0) DEFAULT 0 NOT NULL,
    personalizacao                NUMERIC (7,0) DEFAULT 0 NOT NULL,
    idLoteEstoque                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idNumeroSerie                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitarioCMV              NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioUltimaCompra     NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCustoUltimaCompra        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoCustoUltimaFormacao      NUMERIC (15,7) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPINVENTARIOESTXGERENC ADD CONSTRAINT TEMPINVENTARIOESTXGERENC_PK1 PRIMARY KEY (sessaoClient, contadorSessao, contador);
CREATE UNIQUE INDEX TEMPINVENTARIOESTXGERENC_K2 ON TEMPINVENTARIOESTXGERENC (sessaoClient, contadorSessao, estabelecimento, gradeProduto, indicadorPropriedadePosseItem, pessoaParticipante, localEstoque, personalizacao, idLoteEstoque, idNumeroSerie);

DROP PROCEDURE ADD_ESTOQUE_INSERE;

DROP PROCEDURE ADD_DOCTRANSF_CAB_RESERVA_GRAV;
DROP PROCEDURE ADD_DOCTRANSF_ITEM_RES_ITEM;

DROP PROCEDURE ADD_DOC_FISC_ITEM_ENDER_GRAVA;
DROP PROCEDURE ADD_DOC_FISC_CAB_FIL_ATUALIZA;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_ATUALIZA;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_GRAVA;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_COMP;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_ENDERECO;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_FORM_TIN;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_PROD_TIN;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_KIT;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_N_SERIE;
DROP PROCEDURE ADD_DOC_FISC_ITEM_FIL_INSERE;
DROP PROCEDURE ADD_DOC_FISC_CAB_EST_ATUALIZA;
DROP PROCEDURE ADD_DOC_FISC_ITEM_EST_ATUALIZA;
DROP PROCEDURE ADD_DOC_FISC_ITEM_EST_GRAVA;
DROP PROCEDURE ADD_DOC_FISC_ITEM_EST_N_SERIE;
DROP PROCEDURE ADD_DOC_FISC_ITEM_EST_KIT;
DROP PROCEDURE ADD_DOC_FISC_ITEM_EST_COMP;
DROP PROCEDURE ADD_DOC_FISC_ITEM_EST_ENDERECO;

DROP PROCEDURE ADD_PRE_DOC_ITEM_ENDER_GRAVA;
DROP PROCEDURE ADD_PRE_DOC_CAB_FIL_ATUALIZA;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_ATUALIZA;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_GRAVA;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_COMP;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_ENDERECO;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_FORM_TIN;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_PROD_TIN;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_KIT;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_N_SERIE;
DROP PROCEDURE ADD_PRE_DOC_ITEM_FIL_INSERE;
DROP PROCEDURE ADD_PRE_DOC_CAB_EST_ATUALIZA;
DROP PROCEDURE ADD_PRE_DOC_ITEM_EST_ATUALIZA;
DROP PROCEDURE ADD_PRE_DOC_ITEM_EST_GRAVA;
DROP PROCEDURE ADD_PRE_DOC_ITEM_EST_N_SERIE;
DROP PROCEDURE ADD_PRE_DOC_ITEM_EST_KIT;
DROP PROCEDURE ADD_PRE_DOC_ITEM_EST_COMP;
DROP PROCEDURE ADD_PRE_DOC_ITEM_EST_ENDERECO;

DROP PROCEDURE ADD_ORCAMENTO_ITEM_TAREF_INSER;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_EN;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_EF;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_ENDER_GRAVA;
DROP PROCEDURE ADD_ORCAMENTO_CAB_RESERVA_GRAV;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_ITEM;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_N_SERIE;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_KIT;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_COMP;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_ENDEREC;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_FIC_KIT;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_FICHA;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_RES_AT_PREV;

DROP PROCEDURE ADD_ESTOQUE_SEPARACAO_EXCLUI;
DROP PROCEDURE ADD_SEPARACAO_ITEM_DOC_EXCLUI;
DROP PROCEDURE ADD_SEPARACAO_ITEM_PRE_EXCLUI;
DROP PROCEDURE ADD_SEPARACAO_ITEM_ORC_EXCLUI;
DROP PROCEDURE ADD_SEPARACAO_ITEM_EXCLUI;
DROP PROCEDURE ADD_SEPARACAO_ITEM_BLOEST_GRAV;
DROP PROCEDURE ADD_SEPARACAO_CAB_EST_ATUALIZA;
DROP PROCEDURE ADD_SEPARACAO_ITEM_EST_ATUALIZ;
DROP PROCEDURE ADD_SEPARACAO_ITEM_EST_GRAVA;
DROP PROCEDURE ADD_SEPARACAO_ITEM_EST_N_SERIE;
DROP PROCEDURE ADD_SEPARACAO_ITEM_EST_ENDEREC;
DROP PROCEDURE ADD_SEPARACAO_ITEM_EST_KIT;
DROP PROCEDURE ADD_SEPARACAO_ITEM_N_SER_GRAVA;

DROP PROCEDURE ADD_ORCAMENTO_ITEM_EST_FICHA;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_EST_AT_REAL;
DROP PROCEDURE ADD_ORCAMENTO_ITEM_EST_AT_PREV;

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

/

create or replace PROCEDURE ADD_TROCA_GRADEPRODUTO (
  p_gradeProdutoDe   IN NUMBER,
  p_gradeProdutoPara IN NUMBER)
IS
BEGIN
  UPDATE CAGRADEPRODUTOXPESSOAS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXPESSOAS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.pessoa = a.pessoa
    AND b.codigoProduto = a.codigoProduto);
  DELETE CAGRADEPRODUTOXPESSOAS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXLOTESESTOQ a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXLOTESESTOQ b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.loteEstoque = a.loteEstoque);
  UPDATE CAGRADEPRODUTOXLOTESESTOQ
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXENDERECOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXENDERECOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque);
  DELETE CAGRADEPRODUTOXENDERECOS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXNUMEROSSER a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXNUMEROSSER b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.numeroSerie = a.numeroSerie);
  UPDATE CAGRADEPRODUTOXNUMEROSSER
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.gradeProdutoFilho = a.gradeProdutoFilho);
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProdutoFilho = p_gradeProdutoPara
  WHERE a.gradeProdutoFilho = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProdutoFilho = p_gradeProdutoPara
    AND b.gradeProduto = a.gradeProduto);
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProdutoFilho = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOXCOMPOSICOESPREC
  SET gradeProdutoEstoque = p_gradeProdutoPara
  WHERE gradeProdutoEstoque = p_gradeProdutoDe;
  UPDATE PAPRODUTOSLINHASTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CABASESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CACOLORANTESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAATIVIDADESSERVICO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXFICHAATIV a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXFICHAATIV b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.ordenacao = a.ordenacao);
  UPDATE CAGRADEPRODUTOXFICHAATIV
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXFICHAPROD
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAPROJETOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXFICHAPRODPREV
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXFICHAPRODREAL
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOLISTAEVENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONTRATOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXPRODUTOFILHO a SET
    a.gradeProduto = p_gradeProdutoPara,
    a.produto = ( SELECT b.produto FROM CAGRADESPRODUTO b WHERE b.gradeProduto = p_gradeProdutoPara)
  WHERE a.gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXPRODUTOFILHO a SET
    a.gradeProduto = p_gradeProdutoPara,
    a.produto = ( SELECT b.produto FROM CAGRADESPRODUTO b WHERE b.gradeProduto = p_gradeProdutoPara)
  WHERE a.gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODISTRIBUICAODFEXGRADE a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MODISTRIBUICAODFEXGRADE b
    WHERE b.distribuicaoDFe = a.distribuicaoDFe
    AND b.sequencia = a.sequencia
    AND b.gradeProduto = p_gradeProdutoPara);
  UPDATE MODISTRIBUICAODFEXGRADE a SET
    a.quantidade = a.quantidade + COALESCE ((
      SELECT SUM (b.quantidade)
      FROM MODISTRIBUICAODFEXGRADE b
      WHERE b.distribuicaoDFe = a.distribuicaoDFe
      AND b.sequencia = a.sequencia
      AND b.gradeProduto = p_gradeProdutoDe), 0)
    WHERE a.gradeProduto = p_gradeProdutoPara
    AND EXISTS (
      SELECT 1
      FROM MODISTRIBUICAODFEXGRADE b
      WHERE b.distribuicaoDFe = a.distribuicaoDFe
      AND b.sequencia = a.sequencia
      AND b.gradeProduto = p_gradeProdutoDe);
  DELETE MODISTRIBUICAODFEXGRADE
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXITENS a SET
    a.gradeProduto = p_gradeProdutoPara,
    a.produto = ( SELECT b.produto FROM CAGRADESPRODUTO b WHERE b.gradeProduto = p_gradeProdutoPara)
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXITENS b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante
    AND b.localEstoque = a.localEstoque
    AND b.personalizacao = a.personalizacao
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idNumeroSerie = a.idNumeroSerie);
  DELETE MOINVENTARIOESTOQUEXITENS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXFISC a SET
    a.gradeProduto = p_gradeProdutoPara,
    a.produto = ( SELECT b.produto FROM CAGRADESPRODUTO b WHERE b.gradeProduto = p_gradeProdutoPara)
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXFISC b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante);
  DELETE MOINVENTARIOESTOQUEXFISC
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOESTOQUES a SET
    a.gradeProduto = p_gradeProdutoPara,
    a.produto = ( SELECT b.produto FROM CAGRADESPRODUTO b WHERE b.gradeProduto = p_gradeProdutoPara)
  WHERE a.gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTROCAXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXDIVERGENCIA
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCUMENTOTRANSFXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONSERTOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MORESERVASESTOQUE a SET
    a.gradeProduto = p_gradeProdutoPara,
    a.produto = ( SELECT b.produto FROM CAGRADESPRODUTO b WHERE b.gradeProduto = p_gradeProdutoPara)
  WHERE a.gradeProduto = p_gradeProdutoDe;
  UPDATE MOPAINELCOMPRAXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOMOTIVOSBLOQUEIOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINGRESSOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADESPRODUTO
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOS a
  SET a.ativo = 0
  WHERE EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.gradeProduto = p_gradeProdutoDe)
  AND NOT EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.ativo = 1);
END ADD_TROCA_GRADEPRODUTO;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_FISCAL (
  p_dataPosicaoEstoque          IN DATE,
  p_estabelecimento             IN NUMBER,
  p_indicadorPropriedadePosseIt IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_inventarioEstoqueDesconsid  IN NUMBER)
RETURN NUMBER
IS
  v_produto                   NUMBER;
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeFiscal          NUMBER;
  v_quantidadeFiscalFilho     NUMBER;
BEGIN
  v_quantidadeInventario  := 0;
  v_quantidadeEstoque     := 0;
  v_quantidadeFiscal      := 0;
  v_quantidadeFiscalFilho := 0;
  SELECT produto
  INTO v_produto
  FROM CAGRADESPRODUTO
  WHERE gradeProduto = p_gradeProduto;
  -- v_idInventarioEstoque / v_dataInventario
  SELECT
    COALESCE (MAX (a.inventarioEstoque), 0),
    MAX (a.data)
  INTO
    v_idInventarioEstoque,
    v_dataInventario
  FROM (
    SELECT
      ROW_NUMBER() OVER (
        ORDER BY
          inv.data Desc,
          inv.inventarioEstoque Desc) ordenacao,
      inv.inventarioEstoque,
      inv.data
    FROM MOINVENTARIOSESTOQUE inv
    WHERE inv.estabelecimento = p_estabelecimento
    AND inv.inventarioEstoque <> 0
    AND inv.inventarioEstoque <> p_inventarioEstoqueDesconsid
    AND inv.data < TRUNC (p_dataPosicaoEstoque)
      + CASE
          WHEN p_inventarioEstoqueDesconsid = 0
            AND inv.motivoInventarioEstoque = '01'
          THEN 1
          ELSE 0
        END
    AND (inv.motivoInventarioEstoque = '01'
      OR EXISTS (
        SELECT 1
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
        AND itemInv.produto = v_produto))) a
    WHERE a.ordenacao = 1;
  -- v_dataPosicaoEstoqueInicial
  SELECT COALESCE ((
    SELECT MAX (est.data)
      FROM MOESTOQUES est
      WHERE est.produto = v_produto
      AND est.estabelecimento = p_estabelecimento
      AND est.operacaoInternaEstoque = 1
      AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
      AND (v_idInventarioEstoque <= 0
    OR est.data >= TRUNC (v_dataInventario)+1)),
    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 (est.quantidade)
      FROM MOINVENTARIOESTOQUEXFISC est
      WHERE est.inventarioEstoque = v_idInventarioEstoque
      AND est.gradeProduto = p_gradeProduto
      AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND est.pessoaParticipante = p_pessoaParticipante), 0)
    INTO v_quantidadeInventario
    FROM DUAL;
  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
      WHERE est.gradeProduto = p_gradeProduto
      AND est.estabelecimento = p_estabelecimento
      AND est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
      AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND est.pessoaParticipante = p_pessoaParticipante
      AND est.operacaoInternaEstoque IN (1,102,900)), 0)
    INTO v_quantidadeEstoque
    FROM DUAL;
    SELECT COALESCE ((
      SELECT SUM (itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = 'S' THEN (-1) ELSE 1 END)
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE itemDoc.gradeProduto = p_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.estabelecimento = p_estabelecimento
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
      AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND itemDoc.pessoaParticipante = p_pessoaParticipante
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal)), 0)
    INTO v_quantidadeFiscal
    FROM DUAL;
    SELECT COALESCE ((
      SELECT SUM (filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = 'S' THEN (-1) ELSE 1 END)
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE filhoDoc.gradeProduto = p_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.estabelecimento = p_estabelecimento
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
      AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
      AND locEst.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
      AND itemDoc.pessoaParticipante = p_pessoaParticipante), 0)
    INTO v_quantidadeFiscalFilho
    FROM DUAL;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    + v_quantidadeFiscal
    + v_quantidadeFiscalFilho;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_GERENC (
  p_dataPosicaoEstoque          IN DATE,   -- Obrigatório
  p_estabelecimento             IN NUMBER, -- Obrigatório
  p_indicadorPropriedadePosseIt IN CHAR,   -- Enviar ' ' para todos
  p_pessoaParticipante          IN NUMBER, -- Enviar -1 para todos
  p_localEstoque                IN NUMBER, -- Enviar -1 para todos
  p_gradeProduto                IN NUMBER, -- Obrigatório
  p_personalizacao              IN NUMBER, -- Enviar -1 para todos
  p_idLoteEstoque               IN NUMBER, -- Enviar -1 para todos
  p_idNumeroSerie               IN NUMBER, -- Enviar -1 para todos
  p_tipoDocumentoDesconsiderar  IN CHAR,   -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
  p_idDocumentoDesconsiderar    IN NUMBER) -- D = idDocumentoFiscal, I = inventarioEstoque, P = preDocumento
RETURN NUMBER
IS
  v_gradProd_produto          NUMBER;
  v_prod_controleEstoque      NUMBER;
  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;
  SELECT
    gradProd.produto,
    prod.controleEstoque
  INTO
    v_gradProd_produto,
    v_prod_controleEstoque
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_gradeProduto;
  -- KIT / COMBO
  IF v_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC ((FUNC_ADD_BUSCA_ESTOQUE_GERENC (
        p_dataPosicaoEstoque,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        kit.gradeProdutoFilho,
        -1,
        -1,
        -1,
        p_tipoDocumentoDesconsiderar,
        p_idDocumentoDesconsiderar) / 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 v_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_tipoDocumentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND inv.data < TRUNC(p_dataPosicaoEstoque)
        + CASE WHEN p_tipoDocumentoDesconsiderar <> 'I' AND inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      AND (inv.motivoInventarioEstoque = '01'
        OR EXISTS (
          SELECT 1
          FROM MOINVENTARIOESTOQUEXITENS itemInv
          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
          AND itemInv.produto = v_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE ((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        WHERE est.produto = v_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (v_idInventarioEstoque <= 0
		  OR est.data >= TRUNC(v_dataInventario)+1)),
      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 (est.quantidade)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeInventario
      FROM DUAL;
    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 est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    END IF;
    -- v_quantidadeDocumentoFiscal
    IF p_tipoDocumentoDesconsiderar = '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 est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    END IF;
    -- v_quantidadePreDocumento
    IF p_tipoDocumentoDesconsiderar = '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 est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND 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_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadePreDocumento
      FROM DUAL;
    END IF;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    - v_quantidadeDocumentoFiscal
    - v_quantidadePreDocumento;
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_naoUsado                    IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_preDocumentoDesconsiderar   IN NUMBER,
  p_idDocumentoFiscalDesconsid  IN NUMBER,
  p_dataPosicaoEstoque          IN DATE)
RETURN NUMBER
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_ESTOQUE_GERENC
IS
  v_quantidadeEstoque NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_ESTOQUE_GERENC (
      p_dataPosicaoEstoque,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      CASE
        WHEN p_personalizacao = 0
        THEN -1
        ELSE p_personalizacao
      END,
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      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))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)), 0)
  INTO v_quantidadeEstoque
  FROM DUAL;
  RETURN v_quantidadeEstoque;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
  p_config_82_considLenteDispon IN NUMBER,
  p_config_83_considLenteEstoqu IN NUMBER,
  p_config_160_permiteTransfSem IN CHAR,
  p_entradaSaida                IN CHAR,   -- Obrigatório
  p_estabelecimento             IN NUMBER, -- Obrigatório
  p_indicadorPropriedadePosseIt IN CHAR,   -- Enviar ' ' para todos
  p_pessoaParticipante          IN NUMBER, -- Enviar -1 para todos
  p_localEstoque                IN NUMBER, -- Enviar -1 para todos
  p_gradeProduto                IN NUMBER, -- Obrigatório
  p_personalizacao              IN NUMBER, -- Enviar -1 para todos
  p_idLoteEstoque               IN NUMBER, -- Enviar -1 para todos
  p_idNumeroSerie               IN NUMBER, -- Enviar -1 para todos
  p_tipoDocumentoDesconsiderar  IN CHAR,   -- O = Orçamento, T = Transferencia
  p_idDocumentoDesconsiderar    IN NUMBER) -- O = orcamento, T = documentoTransferencia
RETURN NUMBER
IS
  v_quantidadeReservas        NUMBER;
  v_quantidadeOrcamento       NUMBER;
  v_quantidadeTransferencia   NUMBER;
  v_quantidadeTransfDigitacao NUMBER;
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 a.estabelecimento = p_estabelecimento
            AND (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_idNumeroSerie < 0
              OR a.idNumeroSerie = p_idNumeroSerie)
            AND (p_tipoDocumentoDesconsiderar <> 'T'
              OR p_idDocumentoDesconsiderar > 0
              OR NOT EXISTS (
                SELECT 1
                FROM MODOCTRANSFXRESERVAESTOQ b
                WHERE b.idReservaEstoque = a.idReservaEstoque))), 0)
          WHEN prod.controleEstoque IN (3,4)
          THEN TRUNC ((
            SELECT MIN (a.quantidadeSaldo / a.quantidadeKit)
            FROM (
              SELECT kit.gradeProduto,
                kit.gradeProdutoFilho,
                kit.quantidade quantidadeKit,
                ( SELECT SUM (a.quantidadeSaldo)
                  FROM MORESERVASESTOQUE a
                  JOIN PALOCAISESTOQUE locEst
                  ON locEst.localEstoque = a.localEstoque
                  WHERE a.entradaSaida = p_entradaSaida
                  AND a.gradeProduto = kit.gradeProdutoFilho
                  AND (p_idLoteEstoque < 0
                    OR a.idLoteEstoque = p_idLoteEstoque)
                  AND a.estabelecimento = p_estabelecimento
                  AND (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_idNumeroSerie < 0
                    OR a.idNumeroSerie = p_idNumeroSerie)
                  AND (p_tipoDocumentoDesconsiderar <> 'T'
                    OR p_idDocumentoDesconsiderar > 0
                    OR NOT EXISTS (
                      SELECT 1
                      FROM MODOCTRANSFXRESERVAESTOQ b
                      WHERE b.idReservaEstoque = a.idReservaEstoque))) quantidadeSaldo
              FROM CAGRADEPRODUTOXKITSCOMBOS kit
              WHERE kit.quantidade > 0
              AND kit.gradeProduto <> kit.gradeProdutoFilho
              GROUP BY
                kit.gradeProduto,
                kit.gradeProdutoFilho,
                kit.quantidade) a
            WHERE a.gradeProduto = gradProd.gradeProduto), uniMed.casasDecimaisUnidadeMedida)
          ELSE 0
        END quantidadeSaldo
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed
      ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE gradProd.gradeProduto = p_gradeProduto) a), 0)
  INTO v_quantidadeReservas
  FROM DUAL;
  IF p_tipoDocumentoDesconsiderar = '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 a.estabelecimento = p_estabelecimento
                AND (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_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 a.estabelecimento = p_estabelecimento
                    AND (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_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 gradProd.gradeProduto = p_gradeProduto) a), 0)
    INTO v_quantidadeOrcamento
    FROM DUAL;
  END IF;
  IF p_tipoDocumentoDesconsiderar = '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 a.estabelecimento = p_estabelecimento
              AND (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_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 a.estabelecimento = p_estabelecimento
                    AND (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_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 gradProd.gradeProduto = p_gradeProduto) a), 0)
    INTO v_quantidadeTransferencia
    FROM DUAL;
  END IF;
  IF p_config_160_permiteTransfSem IN ('A','B')
    AND (p_tipoDocumentoDesconsiderar <> 'T'
      OR p_idDocumentoDesconsiderar > 0)
    AND p_entradaSaida = 'S'
    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 docTransf.estabelecimentoSaida = p_estabelecimento
                AND (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 docTransf.estabelecimentoSaida = p_estabelecimento
                    AND (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 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_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_naoUsado                    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
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_RESERVAS_ESTOQ
IS
  v_quantidadeReservas NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
      p_config_82_considLenteDispon,
      p_config_83_considLenteEstoqu,
      p_config_160_permiteTransfSem,
      p_entradaSaida,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      CASE
        WHEN p_personalizacao = 0
        THEN -1
        ELSE p_personalizacao
      END,
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      p_documentoDesconsiderar,
      p_idDocumentoDesconsiderar))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)), 0)
  INTO v_quantidadeReservas
  FROM DUAL;
  RETURN v_quantidadeReservas;
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_naoUsado                    IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_orcamentoDesconsiderar      IN NUMBER,
  p_transferenciaDesconsiderar  IN NUMBER,
  p_entradaSaida                IN CHAR)
RETURN NUMBER
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_RESERVAS_ESTOQ
IS
  v_quantidadeReservas NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
      p_config_82_considLenteDispon,
      p_config_83_considLenteEstoqu,
      p_config_160_permiteTransfSem,
      p_entradaSaida,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      -1, --p_personalizacao
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      CASE
        WHEN p_orcamentoDesconsiderar > 0
        THEN 'O'
        WHEN p_transferenciaDesconsiderar > 0
        THEN 'T'
        ELSE ''
      END, -- p_documentoDesconsiderar
      CASE
        WHEN p_orcamentoDesconsiderar > 0
        THEN p_orcamentoDesconsiderar
        WHEN p_transferenciaDesconsiderar > 0
        THEN p_transferenciaDesconsiderar
        ELSE 0
      END -- p_idDocumentoDesconsiderar
      ))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)), 0)
  INTO v_quantidadeReservas
  FROM DUAL;
  RETURN v_quantidadeReservas;
END;

/

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

/

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

/

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

/

create or replace FUNCTION FUNC_ADD_MONTA_OBSERVACAO_ITEM (
  p_sessaoClient                 IN VARCHAR2,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_DocFisc_Orcto_PreDoc_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_marca           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
    OR p_config_413_obs_add_marca = 1
  THEN
    SELECT
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.marca,
      prod.referencia
    INTO
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_marca,
      v_prod_referencia
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_item_gradeProduto;
    -- Marca
    IF p_config_413_obs_add_marca = 1 AND v_prod_marca <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PAMARCAS
      WHERE marca = v_prod_marca;
      IF v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
      END IF;
    END IF;
    -- Referência Produto
    IF p_config_198_obs_add_referenc = 1 AND v_prod_referencia <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 ((CASE WHEN comp.informaQuantidade = 1 THEN RTRIM (TO_CHAR (temp.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' X ' ELSE '' END || RTRIM (comp.descricao)), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY comp.sequencia), ' ') numeros
    INTO v_aux_observacoes
    FROM TEMPCOMPOSICAOPRECO temp
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = temp.composicaoPreco
    WHERE temp.sessaoClient = p_sessaoClient
    AND temp.nomeTempComposicao = p_tempComp_nomeTempComposicao
    AND temp.sequencia = p_tempComp_sequencia
    AND temp.selecionado = 1;
  ELSIF p_DocFisc_Orcto_PreDoc_Transf = 'D' AND p_item_id <> 0 THEN
    SELECT COALESCE (LISTAGG ((CASE WHEN comp.informaQuantidade = 1 THEN RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' X ' ELSE '' END || RTRIM (comp.descricao)), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' 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_DocFisc_Orcto_PreDoc_Transf = 'O' AND p_item_id <> 0 THEN
    SELECT COALESCE (LISTAGG ((CASE WHEN comp.informaQuantidade = 1 THEN RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' X ' ELSE '' END || RTRIM (comp.descricao)), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' 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_DocFisc_Orcto_PreDoc_Transf = 'P' AND p_item_id <> 0 THEN
    SELECT COALESCE (LISTAGG ((CASE WHEN comp.informaQuantidade = 1 THEN RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' X ' ELSE '' END || RTRIM (comp.descricao)), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' 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 || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END 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 || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || p_item_observacoesDigitadas, 1, 4000));
  END IF;
  -- Números Série
  IF p_item_id <> 0 THEN
    IF p_DocFisc_Orcto_PreDoc_Transf = 'D' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) 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_DocFisc_Orcto_PreDoc_Transf = 'O' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) 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_DocFisc_Orcto_PreDoc_Transf = 'P' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) 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_DocFisc_Orcto_PreDoc_Transf = 'T' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) 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 || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || 'Seriais: ' || v_aux_observacoes, 1, 4000));
    END IF;
  END IF;
  IF v_observacoes IS NULL THEN
    v_observacoes := ' ';
  END IF;
  RETURN v_observacoes;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_PRODXEST (
  p_config_209_filtrarGrupoEcon IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_gradProd_produto            IN NUMBER,
  p_tipoPreco                   IN CHAR) -- C precoMedioInicial, P precoCustoInicial, U precoUltimaCompraInicial
RETURN NUMBER
IS
  v_preco NUMBER;
BEGIN
  SELECT COALESCE (MAX (
    CASE p_tipoPreco
      WHEN 'C'
      THEN preco.precoMedioInicial
      WHEN 'P'
      THEN preco.precoCustoInicial
      WHEN 'U'
      THEN preco.precoUltimaCompraInicial
      ELSE 0
    END), 0)
  INTO v_preco
  FROM CAPRODUTOXESTABELECIMENTO preco
  WHERE preco.produto = p_gradProd_produto
  AND preco.estabelecimento = p_estabelecimento
  AND preco.ativo = 1;
  IF v_preco = 0
    AND p_estabelecimento > 0
  THEN
    SELECT COALESCE (MAX (
      CASE p_tipoPreco
        WHEN 'C'
        THEN preco.precoMedioInicial
        WHEN 'P'
        THEN preco.precoCustoInicial
        WHEN 'U'
        THEN preco.precoUltimaCompraInicial
        ELSE 0
      END), 0)
    INTO v_preco
    FROM CAPRODUTOXESTABELECIMENTO preco
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = preco.estabelecimento
    JOIN PAESTABELECIMENTOS est2
    ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
    WHERE preco.produto = p_gradProd_produto
    AND preco.ativo = 1
    AND preco.estabelecimento <> p_estabelecimento
    AND est.pessoaEstabelecimento > 0
    AND est.ativo = 1
    AND est2.estabelecimento = p_estabelecimento;
  END IF;
  IF v_preco = 0
    AND p_estabelecimento > 0
    AND p_config_209_filtrarGrupoEcon = 1
  THEN
    SELECT COALESCE (MAX (
      CASE p_tipoPreco
        WHEN 'C'
        THEN preco.precoMedioInicial
        WHEN 'P'
        THEN preco.precoCustoInicial
        WHEN 'U'
        THEN preco.precoUltimaCompraInicial
        ELSE 0
      END), 0)
    INTO v_preco
    FROM CAPRODUTOXESTABELECIMENTO preco
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = preco.estabelecimento
    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 preco.produto = p_gradProd_produto
    AND preco.ativo = 1
    AND preco.estabelecimento <> p_estabelecimento
    AND est.pessoaEstabelecimento > 0
    AND est.ativo = 1
    AND pessEst.grupoEconomico > 0
    AND est2.pessoaEstabelecimento <> est.pessoaEstabelecimento
    AND est2.estabelecimento = p_estabelecimento;
  END IF;
  IF v_preco = 0
    AND p_estabelecimento > 0
  THEN
    SELECT COALESCE (MAX (
      CASE p_tipoPreco
        WHEN 'C'
        THEN preco.precoMedioInicial
        WHEN 'P'
        THEN preco.precoCustoInicial
        WHEN 'U'
        THEN preco.precoUltimaCompraInicial
        ELSE 0
      END), 0)
    INTO v_preco
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = 0
    AND preco.ativo = 1;
  END IF;
  RETURN v_preco;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_INVENT (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_precoSeNaoEncontrar          IN NUMBER,
  p_gerandoInventario            IN NUMBER,
  p_tipoPreco                    IN CHAR) -- F precoCustoUltimaFormacao, P precoCustoUltimaCompra, U precoUnitarioUltimaCompra
RETURN NUMBER
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      COALESCE(MAX(a.preco),0)
    INTO
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            invEst.data Desc,
            invEst.inventarioEstoque Desc) ordenacao,
        CASE p_tipoPreco
          WHEN 'F'
          THEN itemEst.precoCustoUltimaFormacao
          WHEN 'P'
          THEN itemEst.precoCustoUltimaCompra
          WHEN 'U'
          THEN itemEst.precoUnitarioUltimaCompra
          ELSE 0
        END preco
      FROM MOINVENTARIOESTOQUEXITENS itemEst
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemEst.inventarioEstoque
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = invEst.estabelecimento
      WHERE itemEst.gradeProduto = v_gradeProduto
      AND invEst.data >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
      AND invEst.data < TRUNC(p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
            AND invEst.motivoInventarioEstoque = '01'
          THEN 1
          ELSE 0
        END
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      COALESCE(MAX(a.preco),0)
    INTO
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            invEst.data Desc,
            invEst.inventarioEstoque Desc) ordenacao,
        CASE p_tipoPreco
          WHEN 'F'
          THEN itemEst.precoCustoUltimaFormacao
          WHEN 'P'
          THEN itemEst.precoCustoUltimaCompra
          WHEN 'U'
          THEN itemEst.precoUnitarioUltimaCompra
          ELSE 0
        END preco
      FROM MOINVENTARIOESTOQUEXITENS itemEst
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemEst.inventarioEstoque
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = invEst.estabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemEst.gradeProduto
      WHERE invEst.data >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
      AND invEst.data < TRUNC(p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
            AND invEst.motivoInventarioEstoque = '01'
          THEN 1
          ELSE 0
        END
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)
      AND itemEst.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)) a
    WHERE a.ordenacao = 1;
  END IF;
  IF v_preco = 0
    OR v_preco IS NULL
  THEN
    v_preco := p_precoSeNaoEncontrar;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FGR (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER,
  p_dataInventario               IN DATE,
  p_dataMovimentoEstSaldoInicial IN DATE)
  RETURN NUMBER
IS
  v_quebra     CHAR(9);
  v_quantidade NUMBER;
  v_preco      NUMBER;
  v_total      NUMBER;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  FOR a IN (
    SELECT
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data, 'HH24MISS') hora,
      a.tabelaSistema,
      a.id,
      a.entradaSaida,
      a.quantidade,
      a.total
    FROM (
      SELECT
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXFISC' tabelaSistema,
        itemInv.id,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) total
      FROM MOINVENTARIOESTOQUEXFISC itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemInv.inventarioEstoque
      WHERE p_dataMovimentoEstSaldoInicial IS NULL
      AND itemInv.gradeProduto = p_item_gradeProduto
      AND invEst.data >= p_dataInventario
      AND invEst.data < p_dataInventario + 1
      AND (invEst.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND invEst.inventarioEstoque = (
        SELECT MAX(invEst2.inventarioEstoque)
        FROM MOINVENTARIOSESTOQUE invEst2
        WHERE invEst2.estabelecimento = invEst.estabelecimento
        AND invEst2.data >= p_dataInventario
        AND invEst2.data < p_dataInventario + 1
        AND (invEst2.motivoInventarioEstoque = '01'
          OR invEst2.data < TRUNC (p_cab_dataPrecoFinal)
          AND EXISTS(
            SELECT 1
            FROM MOINVENTARIOESTOQUEXFISC itemInv2
            WHERE itemInv2.gradeProduto = p_item_gradeProduto
            AND itemInv2.inventarioEstoque = invEst2.inventarioEstoque)))
      UNION ALL
      SELECT
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao total
      FROM MOESTOQUES mov
      WHERE mov.gradeProduto = p_item_gradeProduto
      AND mov.operacaoInternaEstoque IN (102,900)
      AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND mov.pessoaParticipante = p_item_pessoaParticipante
      AND mov.data >=
        CASE
          WHEN p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_dataInventario + 1
          ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
        END
      AND mov.data < TRUNC (p_cab_dataPrecoFinal) + 1
      AND (mov.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      UNION ALL
      SELECT
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXITENS' tabelaSistema,
        itemDoc.idItemDocFiscal id,
        cabDoc.entradaSaida,
        itemDoc.quantidade,
        itemDoc.valorCustoOperacao total
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE itemDoc.gradeProduto = p_item_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= 
        CASE
          WHEN p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_dataInventario + 1
          ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
        END
      AND cabDoc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
      AND (cabDoc.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal)
      UNION ALL
      SELECT
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXPRODUTOFILHO' tabelaSistema,
        filhoDoc.id,
        cabDoc.entradaSaida,
        filhoDoc.quantidade,
        filhoDoc.totalCustoOperacao total
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      WHERE filhoDoc.gradeProduto = p_item_gradeProduto
      AND itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= 
        CASE
          WHEN p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_dataInventario + 1
          ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
        END
      AND cabDoc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
      AND (cabDoc.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt) a
    ORDER BY
      TRUNC (a.data),
      a.operacao,
      TO_CHAR (a.data, 'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_quebra < TO_CHAR (a.data, 'YYYYMMDD') || TO_CHAR (a.operacao) THEN
      v_quebra := TO_CHAR (a.data, 'YYYYMMDD') || TO_CHAR (a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidade := 0;
        v_preco := 0;
        v_total := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + a.total > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF a.total * v_quantidade / a.quantidade > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := a.total * v_quantidade / a.quantidade;
        END IF;
     ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.total;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
      IF v_total > 0 AND v_quantidade >= 0 AND ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
        v_preco := 99999999.9999999;
      ELSIF v_total > 0 AND v_quantidade >= 0 THEN
        v_preco := ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidade := v_quantidade + a.quantidade;
      IF v_quantidade <= 0 THEN
        v_total := 0;
      ELSIF v_quantidade > a.quantidade THEN
        IF v_total + a.quantidade * v_preco > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_total + a.quantidade * v_preco;
        END IF;
      ELSIF v_quantidade * v_preco > 9999999999999.99 THEN
         v_total := 9999999999999.99;
      ELSE
         v_total := v_quantidade * v_preco;
      END IF;
    ELSE
      v_quantidade := v_quantidade - a.quantidade;
      v_total := v_total - a.quantidade * v_preco;
      IF v_total < 0 OR v_quantidade <= 0 THEN
        v_total := 0;
      END IF;
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FPR (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER,
  p_dataInventario               IN DATE,
  p_dataMovimentoEstSaldoInicial IN DATE)
  RETURN NUMBER
IS
  v_quebra     CHAR(9);
  v_quantidade NUMBER;
  v_preco      NUMBER;
  v_total      NUMBER;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  FOR a IN (
    SELECT
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') hora,
      a.tabelaSistema,
      a.id,
      a.entradaSaida,
      a.quantidade,
      a.total
    FROM (
      SELECT
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXFISC' tabelaSistema,
        itemInv.id,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) total
      FROM MOINVENTARIOESTOQUEXFISC itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemInv.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE p_dataMovimentoEstSaldoInicial IS NULL
      AND invEst.data >= p_dataInventario
      AND invEst.data < p_dataInventario + 1
      AND (invEst.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND itemInv.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND invEst.inventarioEstoque = (
        SELECT MAX (invEst2.inventarioEstoque)
        FROM MOINVENTARIOSESTOQUE invEst2
        WHERE invEst2.estabelecimento = invEst.estabelecimento
        AND invEst2.data >= p_dataInventario
        AND invEst2.data < p_dataInventario + 1
        AND (invEst2.motivoInventarioEstoque = '01'
          OR invEst2.data < TRUNC (p_cab_dataPrecoFinal)
          AND EXISTS (
            SELECT 1
            FROM MOINVENTARIOESTOQUEXFISC itemInv2
            JOIN CAGRADESPRODUTO gradProd2
            ON gradProd2.gradeProduto = itemInv2.gradeProduto
            WHERE itemInv2.inventarioEstoque = invEst2.inventarioEstoque
            AND itemInv2.produto = p_gradProd_produto
            AND (p_config_362_calcCustoPorGrade = 0
              OR p_gerandoInventario = 0
              AND p_gradProd_cor = 0
              OR gradProd2.cor = p_gradProd_cor)
            AND (p_config_362_calcCustoPorGrade = 0
              OR p_gerandoInventario = 0
              AND (p_gradProd_tamanho = ''
                OR p_gradProd_tamanho = ' ')
              OR gradProd2.tamanho = p_gradProd_tamanho))))
      UNION ALL
      SELECT
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao total
      FROM MOESTOQUES mov
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = mov.gradeProduto
      WHERE mov.operacaoInternaEstoque IN (102,900)
      AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND mov.pessoaParticipante = p_item_pessoaParticipante
      AND mov.data >=
        CASE
          WHEN p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_dataInventario + 1
          ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
        END
      AND mov.data < TRUNC (p_cab_dataPrecoFinal) + 1
      AND (mov.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND mov.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      UNION ALL
      SELECT
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXITENS' tabelaSistema,
        itemDoc.idItemDocFiscal id,
        cabDoc.entradaSaida,
        itemDoc.quantidade,
        itemDoc.valorCustoOperacao total
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemDoc.gradeProduto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= 
        CASE
          WHEN p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_dataInventario + 1
          ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
        END
      AND cabDoc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
      AND (cabDoc.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal)
      UNION ALL
      SELECT
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXPRODUTOFILHO' tabelaSistema,
        filhoDoc.id,
        cabDoc.entradaSaida,
        filhoDoc.quantidade,
        filhoDoc.totalCustoOperacao total
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= 
        CASE
          WHEN p_dataMovimentoEstSaldoInicial IS NOT NULL
          THEN p_dataMovimentoEstSaldoInicial
          WHEN p_dataInventario IS NOT NULL
          THEN p_dataInventario + 1
          ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
        END
      AND cabDoc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
      AND (cabDoc.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR 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 p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND filhoDoc.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)) a
    ORDER BY
      TRUNC (a.data),
      a.operacao,
      TO_CHAR (a.data,'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_quebra < TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao) THEN
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidade := 0;
        v_preco := 0;
        v_total := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + a.total > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF a.total * v_quantidade / a.quantidade > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := a.total * v_quantidade / a.quantidade;
        END IF;
     ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.total;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
      IF v_total > 0 AND v_quantidade >= 0 AND ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
        v_preco := 99999999.9999999;
      ELSIF v_total > 0 AND v_quantidade >= 0 THEN
        v_preco := ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidade := v_quantidade + a.quantidade;
      IF v_quantidade <= 0 THEN
        v_total := 0;
      ELSIF v_quantidade > a.quantidade THEN
        IF v_total + a.quantidade * v_preco > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_total + a.quantidade * v_preco;
        END IF;
      ELSIF v_quantidade * v_preco > 9999999999999.99 THEN
         v_total := 9999999999999.99;
      ELSE
         v_total := v_quantidade * v_preco;
      END IF;
    ELSE
      v_quantidade := v_quantidade - a.quantidade;
      v_total := v_total - a.quantidade * v_preco;
      IF v_total < 0 OR v_quantidade <= 0 THEN
        v_total := 0;
      END IF;
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER)
RETURN NUMBER
IS
  v_preco                        NUMBER;
  v_contaGradesProduto           NUMBER;
  v_item_gradeProduto            NUMBER;
  v_dataInventario               DATE;
  v_dataMovimentoEstSaldoInicial DATE;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX (gradProd.gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_item_gradeProduto,
    v_contaGradesProduto
  FROM CAPRODUTOS prod
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.produto = prod.produto
  WHERE prod.produto = p_gradProd_produto
  AND prod.controleEstoque NOT IN (2,3,4, 21,99)
  AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
  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);
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX (TRUNC (invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC (p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC (p_cab_dataPrecoFinal)
      AND EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        WHERE itemInv.gradeProduto = v_item_gradeProduto
        AND itemInv.inventarioEstoque = invEst.inventarioEstoque));
    SELECT MAX (TRUNC (mov.data))
    INTO v_dataMovimentoEstSaldoInicial
    FROM MOESTOQUES mov
    WHERE mov.gradeProduto = v_item_gradeProduto
    AND mov.operacaoInternaEstoque = 1
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900', 'DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE ('' || TO_CHAR (p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
    AND (mov.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento));
    v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FGR (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_cab_dataPrecoFinal,
      p_item_pessoaParticipante,
      v_item_gradeProduto,
      p_locEst_indicadorPropPosseIt,
      p_gerandoInventario,
      v_dataInventario,
      v_dataMovimentoEstSaldoInicial);
  ELSIF v_contaGradesProduto > 1 THEN
    SELECT MAX (TRUNC (invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC (p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC (p_cab_dataPrecoFinal)
      AND EXISTS (
        SELECT 1
        FROM MOINVENTARIOESTOQUEXFISC itemInv
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
        AND itemInv.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)));
    SELECT MAX (TRUNC (mov.data))
    INTO v_dataMovimentoEstSaldoInicial
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900', 'DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE ('' || TO_CHAR (p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
    AND (mov.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = mov.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND mov.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND (p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' ')
      OR gradProd.tamanho = p_gradProd_tamanho);
    v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FPR (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataPrecoFinal,
      p_item_pessoaParticipante,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_locEst_indicadorPropPosseIt,
      p_gerandoInventario,
      v_dataInventario,
      v_dataMovimentoEstSaldoInicial);
  END IF;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'C');
  END IF;
  RETURN v_preco;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_quebra             CHAR(9);
  v_quantidade         NUMBER;
  v_preco              NUMBER;
  v_total              NUMBER;
  v_dataInventario     DATE;
  v_dataEstoqueInicial DATE;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  SELECT
    COALESCE (MAX (gradProd.gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAPRODUTOS prod
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.produto = prod.produto
  WHERE prod.produto = p_gradProd_produto
  AND prod.controleEstoque NOT IN (2,3,4, 21,99)
  AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
  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);
  IF v_contaGradesProduto = 1 THEN
    SELECT MAX (TRUNC (invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC (p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC (p_cab_dataPrecoFinal)
      AND EXISTS (
        SELECT 1
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        WHERE itemInv.gradeProduto = v_gradeProduto
        AND itemInv.inventarioEstoque = invEst.inventarioEstoque
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)));
    SELECT MAX (TRUNC (mov.data))
    INTO v_dataEstoqueInicial
    FROM MOESTOQUES mov
    WHERE mov.gradeProduto = v_gradeProduto
    AND mov.operacaoInternaEstoque = 1
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_item_personalizacao = 0
      OR mov.personalizacao = p_item_personalizacao)
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900', 'DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE ('' || TO_CHAR(p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
  AND (mov.estabelecimento = p_cab_estabelecimento
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND est2.estabelecimento = p_cab_estabelecimento)
    OR 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 p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.estabelecimento = p_cab_estabelecimento));
    FOR a IN (
      SELECT
        TRUNC (a.data) data,
        a.operacao,
        TO_CHAR (a.data, 'HH24MISS') tora,
        a.tabelaSistema,
        a.id,
        a.entradaSaida,
        a.quantidade,
        a.total
      FROM (
        SELECT
          invEst.data,
          4 operacao,
          'MOINVENTARIOESTOQUEXITENS' tabelaSistema,
          itemInv.idItemInventarioEstoque id,
          'E' entradaSaida,
          itemInv.quantidade,
          ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) total
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        JOIN MOINVENTARIOSESTOQUE invEst
        ON invEst.inventarioEstoque = itemInv.inventarioEstoque
        WHERE v_dataEstoqueInicial IS NULL
        AND itemInv.gradeProduto = v_gradeProduto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)
        AND invEst.data >= v_dataInventario
        AND invEst.data < v_dataInventario + 1
        AND (invEst.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND invEst.inventarioEstoque = (
          SELECT MAX (invEst2.inventarioEstoque)
          FROM MOINVENTARIOSESTOQUE invEst2
          WHERE invEst2.estabelecimento = invEst.estabelecimento
          AND invEst2.data >= v_dataInventario
          AND invEst2.data < v_dataInventario + 1
          AND (invEst2.motivoInventarioEstoque = '01'
            OR invEst2.data < TRUNC (p_cab_dataPrecoFinal)
            AND EXISTS (
              SELECT 1
              FROM MOINVENTARIOESTOQUEXITENS itemInv2
              WHERE itemInv2.gradeProduto = v_gradeProduto
              AND itemInv2.inventarioEstoque = invEst2.inventarioEstoque
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND p_item_personalizacao = 0
                OR itemInv2.personalizacao = p_item_personalizacao))))
        UNION ALL
        SELECT
          mov.data,
          CASE
            WHEN mov.operacaoInternaEstoque = 1
            THEN 1
            WHEN mov.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MOESTOQUES' tabelaSistema,
          mov.idEstoque id,
          mov.entradaSaida,
          mov.quantidade,
          mov.totalCustoOperacao total
        FROM MOESTOQUES mov
        WHERE mov.gradeProduto = v_gradeProduto
        AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND mov.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR mov.personalizacao = p_item_personalizacao)
        AND mov.data >=
          CASE
            WHEN v_dataEstoqueInicial IS NOT NULL
            THEN v_dataEstoqueInicial
            WHEN v_dataInventario IS NOT NULL
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
          END
        AND mov.data < TRUNC (p_cab_dataPrecoFinal) + 1
        AND (mov.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))) a
      ORDER BY
        TRUNC (a.data),
        a.operacao,
        TO_CHAR (a.data,'HH24MISS'),
        a.tabelaSistema,
        a.id)
    LOOP
      IF v_quebra < TO_CHAR (a.data, 'YYYYMMDD') || TO_CHAR (a.operacao) THEN
        v_quebra := TO_CHAR (a.data, 'YYYYMMDD') || TO_CHAR (a.operacao);
        -- 1 = Saldo Inicial / 4 = Inventário Estoque
        IF a.operacao IN (1,4) THEN
          v_quantidade := 0;
          v_preco := 0;
          v_total := 0;
        END IF;
      END IF;
      -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
      IF a.operacao IN (1,2,4) THEN
        IF a.entradaSaida = 'E' THEN
          v_quantidade := v_quantidade + a.quantidade;
          IF v_quantidade <= 0 THEN
            v_total := 0;
          ELSIF v_quantidade > a.quantidade THEN
            IF v_total + a.total > 9999999999999.99 THEN
               v_total := 9999999999999.99;
            ELSE
               v_total := v_total + a.total;
            END IF;
          ELSIF a.total * v_quantidade / a.quantidade > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := a.total * v_quantidade / a.quantidade;
          END IF;
       ELSE
          v_quantidade := v_quantidade - a.quantidade;
          v_total := v_total - a.total;
          IF v_total < 0 OR v_quantidade <= 0 THEN
            v_total := 0;
          END IF;
        END IF;
        IF v_total > 0 AND v_quantidade >= 0 AND ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
          v_preco := 99999999.9999999;
        ELSIF v_total > 0 AND v_quantidade >= 0 THEN
          v_preco := ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
        END IF;
      -- Operação = 3 Não atualiza custo médio
      ELSIF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + a.quantidade * v_preco > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.quantidade * v_preco;
          END IF;
        ELSIF v_quantidade * v_preco > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_quantidade * v_preco;
        END IF;
      ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.quantidade * v_preco;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
    END LOOP;
  ELSIF v_contaGradesProduto > 1 THEN
    SELECT MAX (TRUNC (invEst.data))
    INTO v_dataInventario
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.data < TRUNC (p_cab_dataPrecoFinal)
      + CASE
          WHEN p_gerandoInventario = 0
          THEN 1
          ELSE 0
        END
    AND (invEst.estabelecimento = p_cab_estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = p_cab_estabelecimento)
      OR 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 p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = invEst.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = p_cab_estabelecimento))
    AND (invEst.motivoInventarioEstoque = '01'
      OR invEst.data < TRUNC (p_cab_dataPrecoFinal)
      AND EXISTS (
        SELECT 1
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)
        AND itemInv.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)));
    SELECT MAX (TRUNC (mov.data))
    INTO v_dataEstoqueInicial
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto
    WHERE mov.operacaoInternaEstoque = 1
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_item_personalizacao = 0
      OR mov.personalizacao = p_item_personalizacao)
    AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900', 'DD/MM/YYYY') ELSE v_dataInventario + 1 END
    AND mov.data < TO_DATE ('' || TO_CHAR (p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
  AND (mov.estabelecimento = p_cab_estabelecimento
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND est2.estabelecimento = p_cab_estabelecimento)
    OR 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 p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.estabelecimento = p_cab_estabelecimento))
    AND mov.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gerandoInventario = 0
      AND (p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' ')
      OR gradProd.tamanho = p_gradProd_tamanho);
    FOR a IN (
      SELECT
        TRUNC (a.data) data,
        a.operacao,
        TO_CHAR (a.data,'HH24MISS') tora,
        a.tabelaSistema,
        a.id,
        a.entradaSaida,
        a.quantidade,
        a.total
      FROM (
        SELECT
          invEst.data,
          4 operacao,
          'MOINVENTARIOESTOQUEXITENS' tabelaSistema,
          itemInv.idItemInventarioEstoque id,
          'E' entradaSaida,
          itemInv.quantidade,
          ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) total
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        JOIN MOINVENTARIOSESTOQUE invEst
        ON invEst.inventarioEstoque = itemInv.inventarioEstoque
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemInv.gradeProduto
        WHERE v_dataEstoqueInicial IS NULL
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR itemInv.personalizacao = p_item_personalizacao)
        AND invEst.data >= v_dataInventario
        AND invEst.data < v_dataInventario + 1
        AND (invEst.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = invEst.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND itemInv.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)
        AND invEst.inventarioEstoque = (
          SELECT MAX (invEst2.inventarioEstoque)
          FROM MOINVENTARIOSESTOQUE invEst2
          WHERE invEst2.estabelecimento = invEst.estabelecimento
          AND invEst2.data >= v_dataInventario
          AND invEst2.data < v_dataInventario + 1
          AND (invEst2.motivoInventarioEstoque = '01'
            OR invEst2.data < TRUNC (p_cab_dataPrecoFinal)
            AND EXISTS (
              SELECT 1
              FROM MOINVENTARIOESTOQUEXITENS itemInv2
              JOIN CAGRADESPRODUTO gradProd2
              ON gradProd2.gradeProduto = itemInv2.gradeProduto
              WHERE itemInv2.inventarioEstoque = invEst2.inventarioEstoque
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND p_item_personalizacao = 0
                OR itemInv2.personalizacao = p_item_personalizacao)
              AND itemInv2.produto = p_gradProd_produto
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND p_gradProd_cor = 0
                OR gradProd2.cor = p_gradProd_cor)
              AND (p_config_362_calcCustoPorGrade = 0
                OR p_gerandoInventario = 0
                AND (p_gradProd_tamanho = ''
                  OR p_gradProd_tamanho = ' ')
                OR gradProd2.tamanho = p_gradProd_tamanho))))
        UNION ALL
        SELECT
          mov.data,
          CASE
            WHEN mov.operacaoInternaEstoque = 1
            THEN 1
            WHEN mov.atualizaCustoMedio = 1
            THEN 2
            ELSE 3
          END operacao,
          'MOESTOQUES' tabelaSistema,
          mov.idEstoque id,
          mov.entradaSaida,
          mov.quantidade,
          mov.totalCustoOperacao total
        FROM MOESTOQUES mov
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = mov.gradeProduto
        WHERE mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND mov.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_item_personalizacao = 0
          OR mov.personalizacao = p_item_personalizacao)
        AND mov.data >=
          CASE
            WHEN v_dataEstoqueInicial IS NOT NULL
            THEN v_dataEstoqueInicial
            WHEN v_dataInventario IS NOT NULL
            THEN v_dataInventario + 1
            ELSE TO_DATE ('01/01/1900', 'DD/MM/YYYY')
          END
        AND mov.data < TRUNC (p_cab_dataPrecoFinal) + 1
        AND (mov.estabelecimento = p_cab_estabelecimento
          OR EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND est2.estabelecimento = p_cab_estabelecimento)
          OR 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 p_config_209_filtrarGrupoEcon = 1
            AND est.estabelecimento = mov.estabelecimento
            AND est.ativo = 1
            AND est.pessoaEstabelecimento > 0
            AND pessEst.grupoEconomico > 0
            AND est2.estabelecimento = p_cab_estabelecimento))
        AND mov.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND p_gradProd_cor = 0
          OR gradProd.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gerandoInventario = 0
          AND (p_gradProd_tamanho = ''
            OR p_gradProd_tamanho = ' ')
          OR gradProd.tamanho = p_gradProd_tamanho)) a
      ORDER BY
        TRUNC (a.data),
        a.operacao,
        TO_CHAR (a.data, 'HH24MISS'),
        a.tabelaSistema,
        a.id)
    LOOP
      IF v_quebra < TO_CHAR (a.data, 'YYYYMMDD') || TO_CHAR (a.operacao) THEN
        v_quebra := TO_CHAR (a.data, 'YYYYMMDD') || TO_CHAR (a.operacao);
        -- 1 = Saldo Inicial / 4 = Inventário Estoque
        IF a.operacao IN (1,4) THEN
          v_quantidade := 0;
          v_preco := 0;
          v_total := 0;
        END IF;
      END IF;
      -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
      IF a.operacao IN (1,2,4) THEN
        IF a.entradaSaida = 'E' THEN
          v_quantidade := v_quantidade + a.quantidade;
          IF v_quantidade <= 0 THEN
            v_total := 0;
          ELSIF v_quantidade > a.quantidade THEN
            IF v_total + a.total > 9999999999999.99 THEN
               v_total := 9999999999999.99;
            ELSE
               v_total := v_total + a.total;
            END IF;
          ELSIF a.total * v_quantidade / a.quantidade > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := a.total * v_quantidade / a.quantidade;
          END IF;
       ELSE
          v_quantidade := v_quantidade - a.quantidade;
          v_total := v_total - a.total;
          IF v_total < 0 OR v_quantidade <= 0 THEN
            v_total := 0;
          END IF;
        END IF;
        IF v_total > 0 AND v_quantidade >= 0 AND ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
          v_preco := 99999999.9999999;
        ELSIF v_total > 0 AND v_quantidade >= 0 THEN
          v_preco := ROUND (v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
        END IF;
      -- Operação = 3 Não atualiza custo médio
      ELSIF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + a.quantidade * v_preco > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.quantidade * v_preco;
          END IF;
        ELSIF v_quantidade * v_preco > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_quantidade * v_preco;
        END IF;
      ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.quantidade * v_preco;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
    END LOOP;
  END IF;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'C');
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER)
RETURN NUMBER
IS 
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_data               DATE;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX (gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.data) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.data) data,
        a.preco
      FROM (
        SELECT 
          itemEst.data,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (itemEst.quantidade) = 0
            THEN MAX (itemEst.precoCustoOperacao)
            ELSE ROUND ((SUM (itemEst.totalCustoOperacao) / SUM (itemEst.quantidade)),7)
          END preco
        FROM MOESTOQUES itemEst
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = itemEst.estabelecimento
        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
        WHERE itemEst.gradeProduto = v_gradeProduto
        AND itemEst.entradaSaida = 'E'
        AND itemEst.atualizaUltimaCompra = 1
        AND itemEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND itemEst.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR itemEst.personalizacao = p_item_personalizacao)
        AND itemEst.data >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND itemEst.data < TRUNC (p_cab_dataPrecoFinal) + 1
        GROUP BY
          itemEst.data,
          CASE
            WHEN docXEst.id IS NOT NULL
            THEN 'D' || LPAD (itemDoc.idDocumentoFiscal, 14, '0')
            WHEN preXEst.id IS NOT NULL
            THEN 'P' || LPAD (itemPre.preDocumento, 14, '0')
            ELSE 'M' || LPAD (itemEst.idEstoque, 14, '0')
          END) a) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco), 0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.data) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.data) data,
        a.preco
      FROM (
        SELECT 
          itemEst.data,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (itemEst.quantidade) = 0
            THEN MAX (itemEst.precoCustoOperacao)
            ELSE ROUND ((SUM (itemEst.totalCustoOperacao) / SUM (itemEst.quantidade)),7)
          END preco
        FROM MOESTOQUES itemEst
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = itemEst.estabelecimento
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = itemEst.gradeProduto
        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
        WHERE itemEst.entradaSaida = 'E'
        AND itemEst.atualizaUltimaCompra = 1
        AND itemEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND itemEst.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR itemEst.personalizacao = p_item_personalizacao)
        AND itemEst.data >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND itemEst.data < TRUNC (p_cab_dataPrecoFinal) + 1
        AND itemEst.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)
        GROUP BY
          itemEst.data,
          CASE
            WHEN docXEst.id IS NOT NULL
            THEN 'D' || LPAD(itemDoc.idDocumentoFiscal, 14, '0')
            WHEN preXEst.id IS NOT NULL
            THEN 'P' || LPAD (itemPre.preDocumento, 14, '0')
            ELSE 'M' || LPAD (itemEst.idEstoque, 14, '0')
          END) a) a
    WHERE a.ordenacao = 1;
  END IF;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE (v_data, COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
    TRUNC (p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'P');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'P');
  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_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_precoRetornar                IN NUMBER, -- 0 Preco Menos Desconto, 1 Preco Bruto, 2 Preço Reposicao
  p_gerandoInventario            IN NUMBER)
RETURN NUMBER
IS 
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_data               DATE;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX (gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          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_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorIPIDevolucao
                + CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM(item.quantidade), 7)
            END preco       
        FROM MODOCFISCALXITENS item
        JOIN MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorIPIDevolucao
                - CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END
              ELSE item.valorDescontoTotal
            END)
        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 doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          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_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorICMSST) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM (item.quantidade), 7)
            END preco       
        FROM MOPREDOCUMXITENS item
        JOIN MOPREDOCUMENTOS doc
        ON doc.preDocumento = item.preDocumento
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorICMSST
              ELSE item.valorDescontoTotal
            END)
        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 IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco), 0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          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_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorIPIDevolucao
                + CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END) / SUM (item.quantidade), 7)
              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
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorIPIDevolucao
                - CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END
              ELSE item.valorDescontoTotal
            END)
        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 doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        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)
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          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_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorICMSST) / SUM (item.quantidade), 7)
              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
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorICMSST
              ELSE item.valorDescontoTotal
            END)
        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 IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        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)
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  END IF;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE (v_data, COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'U');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'U');
  END IF;
  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_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  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_gerandoInventario            IN NUMBER)
RETURN NUMBER
IS
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  SELECT
    MAX (a.data),
    COALESCE (MAX (a.novoPrecoCusto), 0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          data Desc,
          novoPrecoCusto Desc) ordenacao,
      data,
      novoPrecoCusto
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND ativo = 1
    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 data >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
    AND data < TRUNC(p_cab_dataPrecoFinal) + 1) a
  WHERE a.ordenacao = 1;
  IF p_prod_controleEstoque NOT IN (3,4) THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      COALESCE (v_data, COALESCE(TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
      TRUNC(p_cab_dataPrecoFinal),
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      v_preco,
      p_gerandoInventario,
      'F');
    IF v_preco = 0
      AND (p_cab_dataPrecoInicial IS NULL
        OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
        p_config_209_filtrarGrupoEcon,
        p_cab_estabelecimento,
        p_gradProd_produto,
        'P');
    END IF;
    IF v_preco = 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_item_personalizacao,
        p_gradProd_produto,
        p_gradProd_cor,
        p_gradProd_tamanho,
        0, -- p_precoRetornar
        p_gerandoInventario);
    END IF;
  END IF;
  RETURN v_preco;
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_cab_projeto                  IN VARCHAR,
  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;
BEGIN
  v_preco := 0;
  FOR kit IN (
    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)
  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_cab_projeto,
        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 kit.controleEstoque NOT IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- 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,
        kit.controleEstoque,
        0); -- p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND kit.controleEstoque NOT IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- 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
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' 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,
        2, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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_cab_projeto,
        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, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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, -- p_precoRetornar
        0); -- p_gerandoInventario
    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_cab_projeto,
        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_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_cab_projeto                  IN VARCHAR,
  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;
BEGIN
  v_preco := p_ini_preco;
  FOR a IN (
    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)
  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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND a.controleEstoque NOT IN (3,4) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- 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
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        0); -- p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT a.controleEstoque NOT IN (3,4) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- 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
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' 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
        a.produto,
        a.cor,
        a.tamanho,
        2, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.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
        a.produto,
        a.cor,
        a.tamanho,
        0, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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
        a.produto,
        a.cor,
        a.tamanho,
        1, -- p_precoRetornar
        0); -- p_gerandoInventario
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoTinta = 0 AND a.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_cab_projeto,
        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,
        a.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_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_cab_projeto                  IN VARCHAR,
  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;
BEGIN
  v_preco := 0;
  FOR a IN (
    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)
  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_cab_projeto,
      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,
      a.gradeProduto,
      1, --p_tinta_quantidade
      v_preco);
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoA,
        a.quantidadeA / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoB,
        a.quantidadeB / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoC,
        a.quantidadeC / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoD,
        a.quantidadeD / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoE,
        a.quantidadeE / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoF,
        a.quantidadeF / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoG,
        a.quantidadeG / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoH,
        a.quantidadeH / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoI,
        a.quantidadeI / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoJ,
        a.quantidadeJ / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoK,
        a.quantidadeK / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoL,
        a.quantidadeL / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoM,
        a.quantidadeM / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoN,
        a.quantidadeN / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.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_cab_projeto,
        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,
        a.gradeProdutoO,
        a.quantidadeO / 900, --p_tinta_quantidade
        v_preco);
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

