SET DEFINE OFF;

UPDATE SIMENUS SET descricao = 'Retorno CNAB Cobrança', nomePublico = 'RetornoCNABCobranca' WHERE menu = 519;

COMMIT;

INSERT INTO SISTATUSPREDOCUMENTO (statusPreDocumento, descricao, ativo, observacoes) values ('F', 'Faturado', 1, ' ');

COMMIT;

CREATE TABLE PAMODELOSDOCUMENTO_2302 AS SELECT * FROM PAMODELOSDOCUMENTO;

ALTER TABLE PAOPERFISCALXMODELOSDOCUM DROP CONSTRAINT PAOPERFISCALXMODELOSDOCUM_FK2;
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_FK2;
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,
    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,
    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, 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, 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, ' ');
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, 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, 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, geraFinanceiro, solicitaProjeto, exigeProjeto, situacaoContabilizacao, solicitaAtendimento, controlaSeparacaoConferencia, habilitaBotaoReceitaOculos, habilitaBotaoTintas, 0, 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, transfSolicitarVendedor, transfSolicitarRespRetirada, transfSolicitarRespRecebimento, geraOperacaoEmTransito, transitoLocalEstoque, geraDocumentoFiscalTriangular, utilizarConversorQuantidade, observacoes FROM PAMODELOSDOCUMENTO_2302 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 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_FK2 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);

-- PATIPOSLISTAEVENTO
CREATE TABLE PATIPOSLISTAEVENTO
  (
    idTipoListaEvento     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao             VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    nomeCampoFavorecidoA  VARCHAR (256) DEFAULT ' ' NOT NULL,
    nomeCampoFavorecidoB  VARCHAR (256) DEFAULT ' ' NOT NULL,
    nomeCampoContato1FavA VARCHAR (256) DEFAULT ' ' NOT NULL,
    nomeCampoContato2FavA VARCHAR (256) DEFAULT ' ' NOT NULL,
    nomeCampoContato1FavB VARCHAR (256) DEFAULT ' ' NOT NULL,
    nomeCampoContato2FavB VARCHAR (256) DEFAULT ' ' NOT NULL,
    observacoes           VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PATIPOSLISTAEVENTO ADD CONSTRAINT PATIPOSLISTAEVENTO_PK1 PRIMARY KEY (idTipoListaEvento);
CREATE INDEX PATIPOSLISTAEVENTO_K2 ON PATIPOSLISTAEVENTO (descricao);

INSERT INTO PATIPOSLISTAEVENTO (idTipoListaEvento, descricao, ativo, nomeCampoFavorecidoA, nomeCampoFavorecidoB, nomeCampoContato1FavA, nomeCampoContato2FavA, nomeCampoContato1FavB, nomeCampoContato2FavB, observacoes) VALUES (0, 'SELECIONE', 1, ' ', ' ', ' ', ' ', ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PATIPOSLISTAEVENTO', 'Tipos Listas Eventos', 1, 31484, 'PA', 'idTipoListaEvento', 'N', 14, 'descricao', 1, ' ', 0, 100001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposListasEventos', 1, 1, ' '); 

COMMIT;

-- MOLISTASEVENTOS
CREATE TABLE MOLISTASEVENTOS
  (
    idListaEvento           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    estabelecimento         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataemissao             DATE,
    pessoa                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nomeFavorecidoA         VARCHAR (60) DEFAULT ' ' NOT NULL,
    nomeFavorecidoB         VARCHAR (60) DEFAULT ' ' NOT NULL,
    nomeContato1FavorecidoA VARCHAR (60) DEFAULT ' ' NOT NULL,
    nomeContato2FavorecidoA VARCHAR (60) DEFAULT ' ' NOT NULL,
    nomeContato1FavorecidoB VARCHAR (60) DEFAULT ' ' NOT NULL,
    nomeContato2FavorecidoB VARCHAR (60) DEFAULT ' ' NOT NULL,
    idTipoListaEvento       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataEvento              DATE,
    enderecoLocalEvento     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    enderecoEntrega         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    permiteRetirada         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imagemEvento            VARCHAR (256) DEFAULT ' ' NOT NULL,
    situacaoListaEvento     CHAR (1) DEFAULT ' ' NOT NULL,
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOLISTASEVENTOS ADD CONSTRAINT MOLISTASEVENTOS_PK1 PRIMARY KEY (idListaEvento);
CREATE INDEX MOLISTASEVENTOS_K2 ON MOLISTASEVENTOS (dataEvento);
ALTER TABLE MOLISTASEVENTOS ADD CONSTRAINT MOLISTASEVENTOS_FK1 FOREIGN KEY (idTipoListaEvento) REFERENCES PATIPOSLISTAEVENTO (idTipoListaEvento);
ALTER TABLE MOLISTASEVENTOS ADD CONSTRAINT MOLISTASEVENTOS_FK2 FOREIGN KEY (enderecoLocalEvento) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);
ALTER TABLE MOLISTASEVENTOS ADD CONSTRAINT MOLISTASEVENTOS_FK3 FOREIGN KEY (enderecoEntrega) REFERENCES CAENDERECOSPESSOA (enderecoPessoa);

INSERT INTO MOLISTASEVENTOS (idListaEvento, descricao, ativo, estabelecimento, dataemissao, pessoa, nomeFavorecidoA, nomeFavorecidoB, nomeContato1FavorecidoA, nomeContato2FavorecidoA, nomeContato1FavorecidoB, nomeContato2FavorecidoB, idTipoListaEvento, dataEvento, enderecoLocalEvento, enderecoEntrega, permiteRetirada, imagemEvento, situacaoListaEvento, observacoes) VALUES (0, 'SELECIONE', 1, 0, NULL,              0, ' ', ' ', ' ', ' ', ' ', ' ', 0, NULL, 0, 0, 0, ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLISTASEVENTOS', 'Listas Eventos', 1, 50195, 'MO', 'idListaEvento', 'N', 14, 'descricao', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

-- MOLISTAEVENTOXITENS
CREATE TABLE MOLISTAEVENTOXITENS
  (
    idItemListaEvento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idListaEvento     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia         NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    dataCancelamento  DATE,
    gradeProduto      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeSaldo   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes       VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOLISTAEVENTOXITENS ADD CONSTRAINT MOLISTAEVENTOXITENS_PK1 PRIMARY KEY (idItemListaEvento);
CREATE UNIQUE INDEX MOLISTAEVENTOXITENS_K2 ON MOLISTAEVENTOXITENS (idListaEvento, sequencia);
ALTER TABLE MOLISTAEVENTOXITENS ADD CONSTRAINT MOLISTAEVENTOXITENS_FK1 FOREIGN KEY (idListaEvento) REFERENCES MOLISTASEVENTOS (idListaEvento);
ALTER TABLE MOLISTAEVENTOXITENS ADD CONSTRAINT MOLISTAEVENTOXITENS_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

INSERT INTO MOLISTAEVENTOXITENS (idItemListaEvento, idListaEvento, sequencia, cancelado, dataCancelamento, gradeProduto, quantidade, quantidadeSaldo, observacoes) VALUES (0, 0, 0, 0, NULL, 0, 0, 0, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLISTAEVENTOXITENS', 'Lista Evento X Itens', 1, 50196, 'MO', 'idItemListaEvento', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

-- MOLISTAEVENTOXORC
CREATE TABLE MOLISTAEVENTOXORC
  (
    id                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemListaEvento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade        NUMERIC (15,6) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOLISTAEVENTOXORC ADD CONSTRAINT MOLISTAEVENTOXORC_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOLISTAEVENTOXORC_K2 ON MOLISTAEVENTOXORC (idItemListaEvento, idItemOrcamento);
CREATE INDEX MOLISTAEVENTOXORC_K3 ON MOLISTAEVENTOXORC (idItemListaEvento);
CREATE INDEX MOLISTAEVENTOXORC_K4 ON MOLISTAEVENTOXORC (idItemOrcamento);
ALTER TABLE MOLISTAEVENTOXORC ADD CONSTRAINT MOLISTAEVENTOXORC_FK1 FOREIGN KEY (idItemListaEvento) REFERENCES MOLISTAEVENTOXITENS (idItemListaEvento);
ALTER TABLE MOLISTAEVENTOXORC ADD CONSTRAINT MOLISTAEVENTOXORC_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);

INSERT INTO MOLISTAEVENTOXORC (id, idItemListaEvento, idItemOrcamento, quantidade) VALUES (0, 0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOLISTAEVENTOXORC', 'Lista Evento X Orçamentos', 1, 50197, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

CREATE TABLE MODOCFISCALXITENS_2302 AS SELECT * FROM MODOCFISCALXITENS;

ALTER TABLE MODOCFISCALXPEDIDOCOMPRA DROP CONSTRAINT MODOCFISCALXPEDIDOCOMPRA_FK1;
ALTER TABLE MODOCFISCALXCOMPOSICOESPR DROP CONSTRAINT MODOCFISCALXCOMPOSICOESPR_FK1;
ALTER TABLE MODOCFISCALXENDERECOESTOQ DROP CONSTRAINT MODOCFISCALXENDERECOESTOQ_FK1;
ALTER TABLE MODOCFISCALXEMBALAGENSTIN DROP CONSTRAINT MODOCFISCALXEMBALAGENSTIN_FK1;
ALTER TABLE MODOCFISCALXNUMEROSSERIE DROP CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK1;
ALTER TABLE MODOCFISCALXCENTROSCUSTOS DROP CONSTRAINT MODOCFISCALXCENTROSCUSTOS_FK1;
ALTER TABLE MODOCFISCALXORCAMENTOITEM DROP CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK1;
ALTER TABLE MODOCFISCALXPREDOCUM DROP CONSTRAINT MODOCFISCALXPREDOCUM_FK1;
ALTER TABLE MODOCFISCALXDOCFISCAL DROP CONSTRAINT MODOCFISCALXDOCFISCAL_FK1;
ALTER TABLE MODOCFISCALXDOCFISCAL DROP CONSTRAINT MODOCFISCALXDOCFISCAL_FK2;
ALTER TABLE MOPREDOCUMXDOCFISCAL DROP CONSTRAINT MOPREDOCUMXDOCFISCAL_FK2;
ALTER TABLE MODOCFISCALXPROJETOS DROP CONSTRAINT MODOCFISCALXPROJETOS_FK1;
ALTER TABLE MODOCFISCALXPROMOCOES DROP CONSTRAINT MODOCFISCALXPROMOCOES_FK3;
ALTER TABLE CATABELAPRECOXFORMACOESPR DROP CONSTRAINT CATABELAPRECOXFORMACOESPR_FK5;
ALTER TABLE MODISTRIBUICAODFEXGRADE DROP CONSTRAINT MODISTRIBUICAODFEXGRADE_FK3;
ALTER TABLE MOVALEDESCXITEMDOCFISCAL DROP CONSTRAINT MOVALEDESCXITEMDOCFISCAL_FK2;
ALTER TABLE MOSEPARACAOXITENS DROP CONSTRAINT MOSEPARACAOXITENS_FK4;
ALTER TABLE MODOCFISCALXESTOQUE DROP CONSTRAINT MODOCFISCALXESTOQUE_FK1;
ALTER TABLE MODOCTROCAXITENS DROP CONSTRAINT MODOCTROCAXITENS_FK15;
ALTER TABLE MODOCTROCAXITENS DROP CONSTRAINT MODOCTROCAXITENS_FK17;
ALTER TABLE MOBALANCOXDOCFISCAL DROP CONSTRAINT MOBALANCOXDOCFISCAL_FK2;
ALTER TABLE MODOCTRANSFXDOCFISCAL DROP CONSTRAINT MODOCTRANSFXDOCFISCAL_FK3;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK13;
ALTER TABLE MOCONSERTOS DROP CONSTRAINT MOCONSERTOS_FK18;
ALTER TABLE MOENTREGAS DROP CONSTRAINT MOENTREGAS_FK7;
ALTER TABLE MOMOTBLOQXDOCFISCALITENS DROP CONSTRAINT MOMOTBLOQXDOCFISCALITENS_FK2;
ALTER TABLE MOINGRESSOS DROP CONSTRAINT MOINGRESSOS_FK5;

DROP TABLE MODOCFISCALXITENS;

-- MODOCFISCALXITENS
CREATE TABLE MODOCFISCALXITENS
  (
    idItemDocFiscal               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDocumentoFiscal             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    modeloDocumento               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimentoOriginal       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    vendedor                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    servico                       NUMERIC (1,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,
    operacaoFiscal                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    movimentaEstoque              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    movimentaEstoqueFiscal        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraFinanceiro                NUMERIC (1,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,
    quantidadeDevolvidaRetornada  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConferida           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    percentualDevolucao           NUMERIC (15,8) 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,
    percDescontoItem              NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorDescontoItem             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    percAcrescimoItem             NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorAcrescimoItem            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteItem                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroItem               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerItem  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasItem   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteGeral               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroGeral              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoGeral            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasGeral      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerGeral NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasGeral  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorBasePagamento            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoPagamento        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasPagamento  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosPagamento           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFreteTotal               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguroTotal              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoTotal            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasTotal      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAdicFreteMarinhaMerTotal NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneirasTotal  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    cfop                          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorISSQN                CHAR (1) DEFAULT ' ' NOT NULL,
    aliquotaISSQN                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIRRF                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIRRF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIRRF                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaINSS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseINSS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorINSS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetPIS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetPIS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCOFINS                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCOFINS                NUMERIC (15,2) DEFAULT 0 NOT NULL,
    retencaoCSLL                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseRetCSLL                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorRetCSLL                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaII                    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseII                        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorII                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIOF                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseIOF                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    codigoEnquadramentoIPI        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    stIPI                         CHAR (2) DEFAULT ' ' NOT NULL,
    aliquotaIPI                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaIPI              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPIDevolucao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stCOFINS                      CHAR (2) DEFAULT '  ' NOT NULL,
    aliquotaCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINS           NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseCreditoSimplesNacional    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    modalidadeBaseCalcICMS        CHAR (1) DEFAULT ' ' NOT NULL,
    reducaoBaseICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    diferimentoICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    motivoDesoneracaoICMS         CHAR (2) DEFAULT '  ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSOperacao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDiferido             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesoneracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    modalidadeBaseCalcICMSST      CHAR (1) DEFAULT ' ' NOT NULL,
    margemValorAdicionadoST       NUMERIC (7,4) DEFAULT 0 NOT NULL,
    reducaoBaseST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSST                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaSTSuportConsFinal     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSST                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTAnteriormente      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSProprioSubstituto    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    reducaoBaseICMSEfetivo        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEfetivo           NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSEfetivo               NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEfetivo              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stICMSEscrituracao            CHAR (2) DEFAULT '  ' NOT NULL,
    reducaoBaseICMSEscrituracao   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSEscrituracao      NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSEscrituracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSEscrituracao         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesonEscrituracao    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    margemValorAdicSTEscrituracao NUMERIC (7,4) DEFAULT 0 NOT NULL,
    reducaoBaseSTEscrituracao     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSSTEscrituracao    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSSTEscrituracao        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTEscrituracao       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    somarICMSST                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    aliquotaICMSUFDestinatario    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    partilhaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSUFRemetente           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFRemetente          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpFederais   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpEstaduais  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaEstimadaImpMunicipais NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseEstimadaImpostos          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpFederais      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpEstaduais     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorEstimadoImpMunicipais    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosSomaPagamento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostosDiminuiPagamento NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquidoItem              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoCustoOpTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpItem     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpGeral    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoCustoOpTotal    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,
    quantidadeExtemporanea        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    acrescimoUnitarioExtemporaneo NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempSubtotal  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempItem      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempGeral     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorAcrescimoExtempTotal     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_PK1 PRIMARY KEY (idItemDocFiscal);
CREATE UNIQUE INDEX MODOCFISCALXITENS_K2 ON MODOCFISCALXITENS (idDocumentoFiscal, sequencia);
CREATE INDEX MODOCFISCALXITENS_K3 ON MODOCFISCALXITENS (idDocumentoFiscal, cancelado, stICMS, cfop, aliquotaICMS, sequencia);
CREATE INDEX MODOCFISCALXITENS_K4 ON MODOCFISCALXITENS (gradeProduto);
CREATE INDEX MODOCFISCALXITENS_K5 ON MODOCFISCALXITENS (idDocumentoFiscal);
CREATE INDEX MODOCFISCALXITENS_K6 ON MODOCFISCALXITENS (idDocumentoFiscal, cancelado);
CREATE INDEX MODOCFISCALXITENS_K7 ON MODOCFISCALXITENS (gradeProduto, cancelado);

INSERT INTO MODOCFISCALXITENS (idItemDocFiscal, idDocumentoFiscal, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, movimentaEstoqueFiscal, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, valorIPIDevolucao, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, baseICMSEscrituracao, valorICMSEscrituracao, valorICMSDesonEscrituracao, margemValorAdicSTEscrituracao, reducaoBaseSTEscrituracao, aliquotaICMSSTEscrituracao, baseICMSSTEscrituracao, valorICMSSTEscrituracao, somarICMSST, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, ' ', ' ');
INSERT INTO MODOCFISCALXITENS (idItemDocFiscal, idDocumentoFiscal, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, movimentaEstoqueFiscal, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, valorIPIDevolucao, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, baseICMSEscrituracao, valorICMSEscrituracao, valorICMSDesonEscrituracao, margemValorAdicSTEscrituracao, reducaoBaseSTEscrituracao, aliquotaICMSSTEscrituracao, baseICMSSTEscrituracao, valorICMSSTEscrituracao, somarICMSST, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes) SELECT idItemDocFiscal, idDocumentoFiscal, sequencia, cancelado, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorBasePagamento, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, cfop, indicadorISSQN, aliquotaISSQN, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, valorIPIDevolucao, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, baseICMSEscrituracao, valorICMSEscrituracao, valorICMSDesonEscrituracao, margemValorAdicSTEscrituracao, reducaoBaseSTEscrituracao, aliquotaICMSSTEscrituracao, baseICMSSTEscrituracao, valorICMSSTEscrituracao, somarICMSST, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes FROM MODOCFISCALXITENS_2302 WHERE idItemDocFiscal > 0;

COMMIT;

ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK1 FOREIGN KEY (idDocumentoFiscal) REFERENCES MODOCUMENTOSFISCAIS (idDocumentoFiscal);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK2 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK3 FOREIGN KEY (estabelecimentoOriginal) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK4 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK5 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK6 FOREIGN KEY (idFormulaTinta) REFERENCES CAFORMULASTINTAS (idFormulaTinta);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK7 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK8 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK9 FOREIGN KEY (operacaoFiscal) REFERENCES PAOPERACOESFISCAIS (operacaoFiscal);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK10 FOREIGN KEY (localEstoque) REFERENCES PALOCAISESTOQUE (localEstoque);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK11 FOREIGN KEY (pessoaParticipante) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK12 FOREIGN KEY (controleQuantidade) REFERENCES SICONTROLESQUANTIDADE (controleQuantidade);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK13 FOREIGN KEY (unidadeMedidaConversao) REFERENCES SIUNIDADESMEDIDA (unidadeMedida);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK14 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK15 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK16 FOREIGN KEY (cfop) REFERENCES SICFOPS (cfop);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK17 FOREIGN KEY (indicadorISSQN) REFERENCES SIINDICISSQN (indicadorISSQN);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK18 FOREIGN KEY (stIPI) REFERENCES SISITTRIBUTIPI (stIPI);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK19 FOREIGN KEY (stPIS) REFERENCES SISITTRIBUTPIS (stPIS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK20 FOREIGN KEY (stCOFINS) REFERENCES SISITTRIBUTCOFINS (stCOFINS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK21 FOREIGN KEY (stSimplesNacional) REFERENCES SISITTRIBUTSIMPLESNACION (stSimplesNacional);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK22 FOREIGN KEY (stICMS) REFERENCES SISITTRIBUTICMS (stICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK23 FOREIGN KEY (modalidadeBaseCalcICMS) REFERENCES SIMODALIDBASECALCICMS (modalidadeBaseCalcICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK24 FOREIGN KEY (motivoDesoneracaoICMS) REFERENCES SIMOTIVOSDESONERACAOICMS (motivoDesoneracaoICMS);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK25 FOREIGN KEY (modalidadeBaseCalcICMSST) REFERENCES SIMODALIDBASECALCICMSST (modalidadeBaseCalcICMSST);
ALTER TABLE MODOCFISCALXITENS ADD CONSTRAINT MODOCFISCALXITENS_FK26 FOREIGN KEY (stICMSEscrituracao) REFERENCES SISITTRIBUTICMS (stICMS);

ALTER TABLE MODOCFISCALXPEDIDOCOMPRA ADD CONSTRAINT MODOCFISCALXPEDIDOCOMPRA_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXCOMPOSICOESPR ADD CONSTRAINT MODOCFISCALXCOMPOSICOESPR_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXENDERECOESTOQ ADD CONSTRAINT MODOCFISCALXENDERECOESTOQ_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXEMBALAGENSTIN ADD CONSTRAINT MODOCFISCALXEMBALAGENSTIN_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXNUMEROSSERIE ADD CONSTRAINT MODOCFISCALXNUMEROSSERIE_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXCENTROSCUSTOS ADD CONSTRAINT MODOCFISCALXCENTROSCUSTOS_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXORCAMENTOITEM ADD CONSTRAINT MODOCFISCALXORCAMENTOITEM_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPREDOCUM ADD CONSTRAINT MODOCFISCALXPREDOCUM_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXDOCFISCAL ADD CONSTRAINT MODOCFISCALXDOCFISCAL_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXDOCFISCAL ADD CONSTRAINT MODOCFISCALXDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscalReferenciado) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOPREDOCUMXDOCFISCAL ADD CONSTRAINT MOPREDOCUMXDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscalReferenciado) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPROJETOS ADD CONSTRAINT MODOCFISCALXPROJETOS_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPROMOCOES ADD CONSTRAINT MODOCFISCALXPROMOCOES_FK3 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE CATABELAPRECOXFORMACOESPR ADD CONSTRAINT CATABELAPRECOXFORMACOESPR_FK5 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODISTRIBUICAODFEXGRADE ADD CONSTRAINT MODISTRIBUICAODFEXGRADE_FK3 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOVALEDESCXITEMDOCFISCAL ADD CONSTRAINT MOVALEDESCXITEMDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOSEPARACAOXITENS ADD CONSTRAINT MOSEPARACAOXITENS_FK4 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXESTOQUE ADD CONSTRAINT MODOCFISCALXESTOQUE_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK15 FOREIGN KEY (idItemDocFiscalSaida) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCTROCAXITENS ADD CONSTRAINT MODOCTROCAXITENS_FK17 FOREIGN KEY (idItemDocFiscalEntrada) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOBALANCOXDOCFISCAL ADD CONSTRAINT MOBALANCOXDOCFISCAL_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCTRANSFXDOCFISCAL ADD CONSTRAINT MODOCTRANSFXDOCFISCAL_FK3 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK13 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOCONSERTOS ADD CONSTRAINT MOCONSERTOS_FK18 FOREIGN KEY (idItemDocFiscalDevolucao) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOENTREGAS ADD CONSTRAINT MOENTREGAS_FK7 FOREIGN KEY (idItemDocFiscalRemessa) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOMOTBLOQXDOCFISCALITENS ADD CONSTRAINT MOMOTBLOQXDOCFISCALITENS_FK2 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MOINGRESSOS ADD CONSTRAINT MOINGRESSOS_FK5 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);

UPDATE MODOCFISCALXITENS a
SET a.movimentaEstoqueFiscal = 1
WHERE a.movimentaEstoqueFiscal = 0
AND EXISTS (
  SELECT 1
  FROM MODOCFISCALXPREDOCUM docXPre
  WHERE docXPre.idItemDocFiscal = a.idItemDocFiscal)
AND EXISTS (
  SELECT 1
  FROM MODOCUMENTOSFISCAIS cabDoc
  WHERE cabDoc.idDocumentoFiscal = a.idDocumentoFiscal
  AND cabDoc.origemDocumento = 10);

COMMIT;

-- MODOCFISCALXPRODUTOFILHO
CREATE TABLE MODOCFISCALXPRODUTOFILHO
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocFiscal    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,
    idEnderecoEstoque  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 (gradeProduto);

INSERT INTO MODOCFISCALXPRODUTOFILHO (id, idItemDocFiscal, gradeProduto, personalizacao, idLoteEstoque, idEnderecoEstoque, 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, gradeProduto, personalizacao, idLoteEstoque, idEnderecoEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes)
SELECT
  FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPRODUTOFILHO', 'id', 0, 0, NULL),
  b.idItemDocFiscal,
  a.gradeProduto,
  a.personalizacao,
  a.idLoteEstoque,
  a.idEnderecoEstoque,
  a.idNumeroSerie,
  a.quantidade,
  a.precoCustoOperacao,
  a.totalCustoOperacao,
  a.precoCMV,
  a.valorCMV,
  a.observacoes
FROM MOESTOQUES a
JOIN MODOCFISCALXESTOQUE b
ON b.idEstoque = a.idEstoque
JOIN MODOCFISCALXITENS c
ON c.idItemDocFiscal = b.idItemDocFiscal
WHERE b.idItemDocFiscal > 0
AND c.gradeProduto <> a.gradeProduto
OR c.personalizacao <> a.personalizacao
OR c.idLoteEstoque <> a.idLoteEstoque
OR a.idEnderecoEstoque <> 0
OR a.idNumeroSerie <> 0;

COMMIT;

ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK1 FOREIGN KEY (idItemDocFiscal) REFERENCES MODOCFISCALXITENS (idItemDocFiscal);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK3 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK4 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK5 FOREIGN KEY (idEnderecoEstoque) REFERENCES PAENDERECOSESTOQUE (idEnderecoEstoque);
ALTER TABLE MODOCFISCALXPRODUTOFILHO ADD CONSTRAINT MODOCFISCALXPRODUTOFILHO_FK6 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MODOCFISCALXPRODUTOFILHO', 'Documento Fiscal X Produtos Filhos', 1, 50261, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

-- MOPREDOCUMXPRODUTOFILHO
CREATE TABLE MOPREDOCUMXPRODUTOFILHO
  (
    id                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemPreDocumento 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,
    idEnderecoEstoque  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 (gradeProduto);

INSERT INTO MOPREDOCUMXPRODUTOFILHO (id, idItemPreDocumento, gradeProduto, personalizacao, idLoteEstoque, idEnderecoEstoque, 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, gradeProduto, personalizacao, idLoteEstoque, idEnderecoEstoque, idNumeroSerie, quantidade, precoCustoOperacao, totalCustoOperacao, precoCMV, valorCMV, observacoes)
SELECT
  FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPRODUTOFILHO', 'id', 0, 0, NULL),
  b.idItemPreDocumento,
  a.gradeProduto,
  a.personalizacao,
  a.idLoteEstoque,
  a.idEnderecoEstoque,
  a.idNumeroSerie,
  a.quantidade,
  a.precoCustoOperacao,
  a.totalCustoOperacao,
  a.precoCMV,
  a.valorCMV,
  a.observacoes
FROM MOESTOQUES a
JOIN MOPREDOCUMXESTOQUE b
ON b.idEstoque = a.idEstoque
JOIN MOPREDOCUMXITENS c
ON c.idItemPreDocumento = b.idItemPreDocumento
WHERE b.idItemPreDocumento > 0
AND c.gradeProduto <> a.gradeProduto
OR c.personalizacao <> a.personalizacao
OR c.idLoteEstoque <> a.idLoteEstoque
OR a.idEnderecoEstoque <> 0
OR a.idNumeroSerie <> 0;

COMMIT;

ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK1 FOREIGN KEY (idItemPreDocumento) REFERENCES MOPREDOCUMXITENS (idItemPreDocumento);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK3 FOREIGN KEY (personalizacao) REFERENCES PAPERSONALIZACOES (personalizacao);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK4 FOREIGN KEY (idLoteEstoque) REFERENCES CAGRADEPRODUTOXLOTESESTOQ (idLoteEstoque);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK5 FOREIGN KEY (idEnderecoEstoque) REFERENCES PAENDERECOSESTOQUE (idEnderecoEstoque);
ALTER TABLE MOPREDOCUMXPRODUTOFILHO ADD CONSTRAINT MOPREDOCUMXPRODUTOFILHO_FK6 FOREIGN KEY (idNumeroSerie) REFERENCES CAGRADEPRODUTOXNUMEROSSER (idNumeroSerie);

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOPREDOCUMXPRODUTOFILHO', 'Pré-Documento X Produtos Filhos', 1, 50203, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SITIPOSDOCUMENTOIMPRESSO (tipoDocumentoImpresso, descricao, ativo, ordenacao, habilitaFinalizacao, permiteGrafico, permiteCaractere, permiteMerge, arquivoModeloMerge, permiteReport, observacoesReport, permiteFiscal, observacoes) values (52, 'Contas à Pagar / Receber', 1, 2, 0, 1, 0, 1, '%SYS_DIR_ARQ_MODELOS%ContasPagarReceber.rtf', 0, ' ', 0, ' ');

COMMIT;

INSERT INTO SIORIGENSDOCUMENTO (origemDocumento, descricao, abreviacao, ativo, observacoes) VALUES (13, 'Faturamento Pré-Documento', 'Fat.Pré-Doc', 1, ' ');

COMMIT;

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

/

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

/

DROP FUNCTION FUNC_ADD_BUSCA_ESTOQUE_PRODUTO;

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_FISCAL(
    p_dataPosicaoEstoque          IN DATE,
    p_gradeProduto                IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_prod_controleEstoque        IN NUMBER,
    p_documentoDesconsiderar      IN CHAR, -- D = Documento Fiscal, I = Inventário Estoque
    p_idDocumentoDesconsiderar    IN NUMBER)
  RETURN NUMBER
IS
  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;
  -- KIT / COMBO
  IF p_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC((FUNC_ADD_BUSCA_ESTOQUE_FISCAL(
        p_dataPosicaoEstoque,
        kit.gradeProdutoFilho,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        0,
        0,
        p_idEnderecoEstoque,
        0,
        gradProdFilho.produto,
        prodFilho.controleEstoque,
        p_documentoDesconsiderar,
        p_idDocumentoDesconsiderar) / kit.quantidade), uniMedPai.casasDecimaisUnidadeMedida))
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProdFilho
      ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho
      ON prodFilho.produto = gradProdFilho.produto
      JOIN CAGRADESPRODUTO gradProdPai
      ON gradProdPai.gradeProduto = kit.gradeProduto
      JOIN CAPRODUTOS prodPai
      ON prodPai.produto = gradProdPai.produto
      JOIN SIUNIDADESMEDIDA uniMedPai
      ON uniMedPai.unidadeMedida = prodPai.unidadeMedida
      WHERE kit.gradeProduto = p_gradeProduto
      AND kit.ativo = 1
      AND kit.quantidade > 0
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND prodFilho.controleEstoque IN (1,3,4,5,11,12)),0)
    INTO v_quantidadeEstoque
    FROM DUAL;
  -- DEMAIS PRODUTOS (EXCETO KIT / COMBO)
  ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
    -- v_idInventarioEstoque / v_dataInventario
    SELECT
      TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
    INTO
      v_idInventarioEstoque,
      v_dataInventario
    FROM (
      SELECT
        COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
          || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
      FROM MOINVENTARIOSESTOQUE inv
      WHERE inv.estabelecimento = p_estabelecimento
      AND inv.inventarioEstoque <> 0
      AND (p_documentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND inv.data < TRUNC(p_dataPosicaoEstoque) + CASE WHEN inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      AND (inv.motivoInventarioEstoque = '01'
        OR EXISTS(
          SELECT 1
          FROM MOINVENTARIOESTOQUEXITENS itemInv
          JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
          AND gradProd.produto = p_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = est.gradeProduto
        WHERE gradProd.produto = p_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND 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.quantidadeFiscal)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = est.gradeProduto
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),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 (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        AND est.operacaoInternaEstoque IN (101,900)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
      SELECT COALESCE((
        SELECT SUM (CASE WHEN numSerie.idNumeroSerieDocFiscal IS NULL THEN COALESCE(endEst.quantidade,itemDoc.quantidade) ELSE 1 END * 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
        LEFT JOIN MODOCFISCALXENDERECOESTOQ endEst
        ON endEst.idItemDocFiscal = itemDoc.idItemDocFiscal
        LEFT JOIN MODOCFISCALXNUMEROSSERIE numSerie
        ON numSerie.idItemDocFiscal = itemDoc.idItemDocFiscal
        AND numSerie.idEnderecoEstoqueDocFiscal = COALESCE(endEst.idEnderecoEstoqueDocFiscal,0)
        AND numSerie.gradeProduto = itemDoc.gradeProduto
        WHERE itemDoc.gradeProduto = p_gradeProduto
        AND itemDoc.movimentaEstoqueFiscal = 1
        AND cabDoc.estabelecimento = p_estabelecimento
        AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
        AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
        AND (p_documentoDesconsiderar <> 'D'
          OR itemDoc.idItemDocFiscal <> p_idDocumentoDesconsiderar)
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
            OR p_indicadorPropriedadePosseIt = ' ')
          OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
          OR itemDoc.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
          AND locEst.validoEstoqueTotal = 1
          OR itemDoc.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
          OR itemDoc.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
          OR itemDoc.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR COALESCE(endEst.idEnderecoEstoque,0) = p_idEnderecoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idNumeroSerie = 0
		      OR COALESCE(numSerie.idNumeroSerie,0) = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)
        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.movimentaEstoqueFiscal = 1
        AND cabDoc.estabelecimento = p_estabelecimento
        AND cabDoc.dataEntradaSaida >= TRUNC (v_dataPosicaoEstoqueInicial)
        AND cabDoc.dataEntradaSaida < TRUNC (p_dataPosicaoEstoque) + 1
        AND (p_documentoDesconsiderar <> 'D'
          OR itemDoc.idItemDocFiscal <> p_idDocumentoDesconsiderar)
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
            OR p_indicadorPropriedadePosseIt = ' ')
          OR locEst.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
          OR itemDoc.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
          AND locEst.validoEstoqueTotal = 1
          OR itemDoc.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
          OR filhoDoc.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
          OR filhoDoc.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR filhoDoc.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idNumeroSerie = 0
		      OR filhoDoc.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),0)
      INTO v_quantidadeFiscalFilho
      FROM DUAL;
    END IF;
  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,
    p_gradeProduto                IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_indicadorPropriedadePosseIt IN CHAR,
    p_pessoaParticipante          IN NUMBER,
    p_localEstoque                IN NUMBER,
    p_personalizacao              IN NUMBER,
    p_idLoteEstoque               IN NUMBER,
    p_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_prod_controleEstoque        IN NUMBER,
    p_documentoDesconsiderar      IN CHAR, -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
    p_idDocumentoDesconsiderar    IN NUMBER)
  RETURN NUMBER
IS
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeDocumentoFiscal NUMBER;
  v_quantidadePreDocumento    NUMBER;
BEGIN
  v_quantidadeInventario      := 0;
  v_quantidadeEstoque         := 0;
  v_quantidadeDocumentoFiscal := 0;
  v_quantidadePreDocumento    := 0;
  -- KIT / COMBO
  IF p_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC((FUNC_ADD_BUSCA_ESTOQUE_GERENC(
        p_dataPosicaoEstoque,
        kit.gradeProdutoFilho,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        0,
        0,
        p_idEnderecoEstoque,
        0,
        gradProdFilho.produto,
        prodFilho.controleEstoque,
        p_documentoDesconsiderar,
        p_idDocumentoDesconsiderar) / kit.quantidade), uniMedPai.casasDecimaisUnidadeMedida))
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
      JOIN CAGRADESPRODUTO gradProdPai ON gradProdPai.gradeProduto = kit.gradeProduto
      JOIN CAPRODUTOS prodPai ON prodPai.produto = gradProdPai.produto
      JOIN SIUNIDADESMEDIDA uniMedPai ON uniMedPai.unidadeMedida = prodPai.unidadeMedida
      WHERE kit.gradeProduto = p_gradeProduto
      AND kit.ativo = 1
      AND kit.quantidade > 0
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND prodFilho.controleEstoque IN (1,3,4,5,11,12)),0)
    INTO v_quantidadeEstoque
    FROM DUAL;
  -- DEMAIS PRODUTOS (EXCETO KIT / COMBO)
  ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
    -- v_idInventarioEstoque / v_dataInventario
    SELECT
      TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
    INTO
      v_idInventarioEstoque,
      v_dataInventario
    FROM (
      SELECT
        COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
          || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
      FROM MOINVENTARIOSESTOQUE inv
      WHERE inv.estabelecimento = p_estabelecimento
      AND inv.inventarioEstoque <> 0
      AND (p_documentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND inv.data < TRUNC(p_dataPosicaoEstoque) + CASE WHEN inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      AND (inv.motivoInventarioEstoque = '01'
        OR EXISTS(
          SELECT 1
          FROM MOINVENTARIOESTOQUEXITENS itemInv
          JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
          AND gradProd.produto = p_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = est.gradeProduto
        WHERE gradProd.produto = p_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND 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.quantidadeGerencial)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = est.gradeProduto
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		        OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),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 (p_documentoDesconsiderar <> 'I'
          AND (p_indicadorPropriedadePosseIt IS NULL
		      OR p_indicadorPropriedadePosseIt = ' ')
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_documentoDesconsiderar <> 'I'
          AND p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_documentoDesconsiderar <> 'I'
          AND p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    END IF;
    -- v_quantidadeDocumentoFiscal
    IF p_documentoDesconsiderar = 'D' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idItemDocFiscal = itemDoc.idItemDocFiscal
        JOIN MOESTOQUES est ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.idDocumentoFiscal = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (p_indicadorPropriedadePosseIt IS NULL
		      OR p_indicadorPropriedadePosseIt = ' '
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    END IF;
    -- v_quantidadePreDocumento
    IF p_documentoDesconsiderar = 'P' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOPREDOCUMXITENS itemDoc
        JOIN MOPREDOCUMXESTOQUE docXEst ON docXEst.idItemPreDocumento = itemDoc.idItemPreDocumento
        JOIN MOESTOQUES est ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.preDocumento = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (p_indicadorPropriedadePosseIt IS NULL
		      OR p_indicadorPropriedadePosseIt = ' '
		      OR est.indicadorPropriedadePosseItem = '' || p_indicadorPropriedadePosseIt || '')
        AND (p_pessoaParticipante = 0
		      OR est.pessoaParticipante = p_pessoaParticipante)
        AND (p_localEstoque = 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao = 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque = 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idEnderecoEstoque = 0
		      OR est.idEnderecoEstoque = p_idEnderecoEstoque)
        AND (p_idNumeroSerie = 0
		      OR est.idNumeroSerie = CASE WHEN p_idNumeroSerie < 0 THEN 0 ELSE p_idNumeroSerie END)),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_idEnderecoEstoque           IN NUMBER,
    p_idNumeroSerie               IN NUMBER,
    p_preDocumentoDesconsiderar   IN NUMBER,
    p_idDocumentoFiscalDesconsid  IN NUMBER,
    p_dataPosicaoEstoque          IN DATE)
  RETURN NUMBER
IS
  v_quantidadeEstoque NUMBER (15,6);
BEGIN
  SELECT COALESCE((
    SELECT SUM (FUNC_ADD_BUSCA_ESTOQUE_GERENC(
      p_dataPosicaoEstoque,
      gradprod.gradeProduto,
      est.estabelecimento,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      p_localEstoque,
      p_personalizacao,
      p_idLoteEstoque,
      p_idEnderecoEstoque,
      p_idNumeroSerie,
      gradprod.produto,
      prod.controleEstoque,
      CASE
	      WHEN p_idDocumentoFiscalDesconsid > 0
	      THEN 'D'
	      WHEN p_preDocumentoDesconsiderar > 0
	      THEN 'P'
	      ELSE ' '
      END,
      CASE
	      WHEN p_idDocumentoFiscalDesconsid > 0
	      THEN p_idDocumentoFiscalDesconsid
	      WHEN p_preDocumentoDesconsiderar > 0
	      THEN p_preDocumentoDesconsiderar
	      ELSE 0
      END))
    FROM PAESTABELECIMENTOS est
	  JOIN CAGRADESPRODUTO gradprod ON 1=1
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto    
    WHERE (p_estabelecimento = 0
      OR est.estabelecimento = p_estabelecimento)
    AND (p_gradeProduto = 0
      AND gradProd.produto = p_produto
      AND (p_cor = 0
	      OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
	      OR p_tamanho = ' '
	      OR gradProd.tamanho = '' || TRIM(p_tamanho) || '')
      OR p_gradeProduto <> 0
      AND gradProd.gradeProduto = p_gradeProduto)),0)
  INTO v_quantidadeEstoque
  FROM DUAL;
  RETURN v_quantidadeEstoque;
END;

/

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

/

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

/

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

/

DROP FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_INT;

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_dataInventarioEstoque        IN DATE)
  RETURN NUMBER
IS
  v_dataAtual                   DATE;
  v_quantidadeEstoque           NUMBER;
  v_precoCustoMedioGerencial    NUMBER;
  v_totalCustoMedioGerencial    NUMBER;
CURSOR c_estoque IS
  SELECT itemEst.data,
    itemEst.entradaSaida,
    itemEst.atualizaCustoMedio,
    itemEst.operacaoInternaEstoque,
    itemEst.quantidade,
    itemEst.totalCustoOperacao
  FROM MOESTOQUES itemEst
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemEst.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_item_personalizacao = 0
    OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' ||
    CASE
      WHEN p_indicadorPropriedadePosseIt IS NULL
        OR p_indicadorPropriedadePosseIt = ''
        OR p_indicadorPropriedadePosseIt = ' '
      THEN '0'
      ELSE p_indicadorPropriedadePosseIt
    END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND itemEst.data >=
    CASE
      WHEN NOT(p_dataInventarioEstoque IS NULL)
      THEN p_dataInventarioEstoque + 1
      ELSE TO_DATE('01/01/1900','DD/MM/YYYY')
    END
  AND itemEst.data < TRUNC(p_dataPosicaoEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = itemEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2
      ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = itemEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)))
  ORDER BY TRUNC(itemEst.data),
    itemEst.operacaoInternaEstoque DESC,
    itemEst.atualizaCustoMedio DESC,
    itemEst.data,
    itemEst.idEstoque;
BEGIN
  v_dataAtual                := COALESCE(TRUNC(p_dataInventarioEstoque)+1,TO_DATE('01/01/1900','DD/MM/YYYY'));
  v_quantidadeEstoque        := 0;
  v_precoCustoMedioGerencial := 0;
  v_totalCustoMedioGerencial := 0;
  -- Saldo Inicial Inventário
  IF NOT(p_dataInventarioEstoque IS NULL) THEN
    SELECT
      COALESCE(SUM(itemEst.quantidadeGerencial),0),
      COALESCE((
        CASE
          WHEN SUM(itemEst.quantidadeGerencial) = 0
            OR SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)) = 0
            OR SUM(itemEst.quantidadeGerencial) =  MAX(itemEst.quantidadeGerencial)
            AND SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
             =  MAX(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
          THEN MAX(itemEst.precoUnitarioCMVGerencial)
          ELSE ROUND(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
            / SUM(itemEst.quantidadeGerencial),7)
        END),0),
      COALESCE(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)),0)
    INTO
      v_quantidadeEstoque,
      v_precoCustoMedioGerencial,
      v_totalCustoMedioGerencial
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemEst.gradeProduto
    WHERE gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND itemEst.indicadorPropriedadePosseItem = '' ||
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ''
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END || ''
    AND itemEst.pessoaParticipante = p_pessoaParticipante
    AND invEst.data >= TRUNC(p_dataInventarioEstoque)
    AND invEst.data < TRUNC(p_dataInventarioEstoque) + 1
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento))
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 1
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)));
  END IF;
  FOR dados IN c_estoque
  LOOP
    IF dados.operacaoInternaEstoque = 1 AND dados.data > v_dataAtual
    THEN
      v_quantidadeEstoque := 0;
      v_precoCustoMedioGerencial := 0;
      v_totalCustoMedioGerencial := 0;
    END IF;
    v_dataAtual := dados.data;
    -- Se atualiza custo médio
    IF dados.atualizaCustoMedio = 1 THEN
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioGerencial := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedioGerencial + dados.totalCustoOperacao > 9999999999999.99 THEN
               v_totalCustoMedioGerencial := 9999999999999.99;
            ELSE
               v_totalCustoMedioGerencial := v_totalCustoMedioGerencial + dados.totalCustoOperacao;
            END IF;
          ELSE
            IF ROUND ((dados.totalCustoOperacao * v_quantidadeEstoque / dados.quantidade),2) > 9999999999999.99 THEN
               v_totalCustoMedioGerencial := 9999999999999.99;
            ELSE
               v_totalCustoMedioGerencial := ROUND ((dados.totalCustoOperacao * v_quantidadeEstoque / dados.quantidade),2);
            END IF;
          END IF;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedioGerencial := v_totalCustoMedioGerencial - dados.totalCustoOperacao;
        IF v_totalCustoMedioGerencial < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioGerencial := 0;
        END IF;
      END IF;
      IF v_totalCustoMedioGerencial > 0 AND v_quantidadeEstoque >= 0 AND ROUND(v_totalCustoMedioGerencial / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedioGerencial := 99999999.9999999;
      ELSE
        IF v_totalCustoMedioGerencial > 0 AND v_quantidadeEstoque >= 0 THEN
          v_precoCustoMedioGerencial := ROUND(v_totalCustoMedioGerencial / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
        END IF;
      END IF;
    -- Se não atualiza custo médio
    ELSE
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioGerencial := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedioGerencial + ROUND((dados.quantidade * v_precoCustoMedioGerencial),2) > 9999999999999.99 THEN
               v_totalCustoMedioGerencial := 9999999999999.99;
            ELSE
               v_totalCustoMedioGerencial := v_totalCustoMedioGerencial + dados.totalCustoOperacao;
            END IF;
          ELSE
            IF ROUND((v_quantidadeEstoque * v_precoCustoMedioGerencial),2) > 9999999999999.99 THEN
               v_totalCustoMedioGerencial := 9999999999999.99;
            ELSE
               v_totalCustoMedioGerencial := ROUND((v_quantidadeEstoque * v_precoCustoMedioGerencial),2);
            END IF;
          END IF;
        END IF;
      ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedioGerencial := v_totalCustoMedioGerencial - dados.quantidade * v_precoCustoMedioGerencial;
        IF v_totalCustoMedioGerencial < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioGerencial := 0;
        END IF;
      END IF;
    END IF;
  END LOOP;
  IF v_precoCustoMedioGerencial = 0 THEN
    SELECT COALESCE(MAX(preco.precoMedioInicial),0)
    INTO v_precoCustoMedioGerencial      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_precoCustoMedioGerencial = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedioGerencial      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_precoCustoMedioGerencial = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedioGerencial      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_precoCustoMedioGerencial;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_dataInventarioEstoque        IN DATE)
  RETURN NUMBER
IS
  v_dataAtual                DATE;
  v_quantidadeEstoque        NUMBER;
  v_precoCustoMedioFiscal    NUMBER;
  v_totalCustoMedioFiscal    NUMBER;
CURSOR c_estoque IS
  SELECT
    a.data,
    a.entradaSaida,
    a.atualizaCustoMedio,
    a.operacaoInternaEstoque,
    a.quantidade,
    a.totalCustoOperacao
  FROM (
    SELECT
      itemEst.data,
      'E' tipo,
      itemEst.idEstoque id,
      itemEst.entradaSaida,
      itemEst.atualizaCustoMedio,
      itemEst.operacaoInternaEstoque,
      itemEst.quantidade,
      itemEst.totalCustoOperacao
    FROM MOESTOQUES itemEst
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND itemEst.indicadorPropriedadePosseItem = '' ||
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ''
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END || ''
    AND itemEst.pessoaParticipante = p_pessoaParticipante
    AND itemEst.operacaoInternaEstoque IN (101,900)
    AND itemEst.data >=
      CASE
        WHEN NOT(p_dataInventarioEstoque IS NULL)
        THEN p_dataInventarioEstoque + 1
        ELSE TO_DATE('01/01/1900','DD/MM/YYYY')
      END
    AND itemEst.data < TRUNC(p_dataPosicaoEstoque) + 1
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento))
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 1
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))
    UNION ALL
    SELECT
      cabDoc.dataEntradaSaida data,
      'F' tipo,
      itemDoc.idItemDocFiscal id,
      cabDoc.entradaSaida,
      cabDoc.atualizaCustoMedio,
      modDoc.operacaoInternaEstoque,
      itemDoc.quantidade,
      itemDoc.valorCustoOperacao totalCustoOperacao
    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
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemDoc.personalizacao = p_item_personalizacao)
    AND locEst.indicadorPropriedadePosseItem = '' ||
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ''
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END || ''
    AND itemDoc.pessoaParticipante = p_pessoaParticipante
    AND itemDoc.movimentaEstoqueFiscal = 1
    AND cabDoc.dataEntradaSaida >=
      CASE
        WHEN NOT(p_dataInventarioEstoque IS NULL)
        THEN p_dataInventarioEstoque + 1
        ELSE TO_DATE('01/01/1900','DD/MM/YYYY')
      END
    AND cabDoc.dataEntradaSaida < TRUNC(p_dataPosicaoEstoque) + 1
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = cabDoc.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 = cabDoc.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))
        AND NOT(EXISTS(
          SELECT 1
          FROM MODOCFISCALXPRODUTOFILHO filhoDoc
          WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))
    UNION ALL
    SELECT
      cabDoc.dataEntradaSaida data,
      'G' tipo,
      filhoDoc.id,
      cabDoc.entradaSaida,
      cabDoc.atualizaCustoMedio,
      modDoc.operacaoInternaEstoque,
      filhoDoc.quantidade,
      filhoDoc.totalCustoOperacao
    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
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR filhoDoc.personalizacao = p_item_personalizacao)
    AND locEst.indicadorPropriedadePosseItem = '' ||
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ''
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END || ''
    AND itemDoc.pessoaParticipante = p_pessoaParticipante
    AND itemDoc.movimentaEstoqueFiscal = 1
    AND cabDoc.dataEntradaSaida >=
      CASE
        WHEN NOT(p_dataInventarioEstoque IS NULL)
        THEN p_dataInventarioEstoque + 1
        ELSE TO_DATE('01/01/1900','DD/MM/YYYY')
      END
    AND cabDoc.dataEntradaSaida < TRUNC(p_dataPosicaoEstoque) + 1
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = cabDoc.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 = cabDoc.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))) a
  ORDER BY TRUNC(a.data),
    a.operacaoInternaEstoque DESC,
    a.atualizaCustoMedio DESC,
    a.data,
    a.tipo,
    a.id;
BEGIN
  v_dataAtual             := COALESCE(TRUNC(p_dataInventarioEstoque)+1,TO_DATE('01/01/1900','DD/MM/YYYY'));
  v_quantidadeEstoque     := 0;
  v_precoCustoMedioFiscal := 0;
  v_totalCustoMedioFiscal := 0;
  -- Saldo Inicial Inventário
  IF NOT(p_dataInventarioEstoque IS NULL) THEN
  SELECT
    COALESCE(SUM(itemEst.quantidadeFiscal),0),
    COALESCE((
      CASE
        WHEN SUM(itemEst.quantidadeFiscal) = 0
          OR SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)) = 0
          OR SUM(itemEst.quantidadeFiscal) =  MAX(itemEst.quantidadeFiscal)
          AND SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
           =  MAX(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
        THEN MAX(itemEst.precoUnitarioCMVFiscal)
        ELSE ROUND(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
          / SUM(itemEst.quantidadeFiscal),7)
      END),0),
    COALESCE(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)),0)
  INTO
    v_quantidadeEstoque,
    v_precoCustoMedioFiscal,
    v_totalCustoMedioFiscal
  FROM MOINVENTARIOESTOQUEXITENS itemEst
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemEst.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemEst.gradeProduto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND invEst.data >= TRUNC(p_dataInventarioEstoque)
  AND invEst.data < TRUNC(p_dataInventarioEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2
      ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  END IF;
  FOR dados IN c_estoque
  LOOP
    IF dados.operacaoInternaEstoque = 1 AND dados.data > v_dataAtual
    THEN
      v_quantidadeEstoque := 0;
      v_precoCustoMedioFiscal := 0;
      v_totalCustoMedioFiscal := 0;
    END IF;
    v_dataAtual := dados.data;
    -- Se atualiza custo médio
    IF dados.atualizaCustoMedio = 1 THEN
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioFiscal := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedioFiscal + dados.totalCustoOperacao > 9999999999999.99 THEN
               v_totalCustoMedioFiscal := 9999999999999.99;
            ELSE
               v_totalCustoMedioFiscal := v_totalCustoMedioFiscal + dados.totalCustoOperacao;
            END IF;
          ELSE
            IF ROUND ((dados.totalCustoOperacao * v_quantidadeEstoque / dados.quantidade),2) > 9999999999999.99 THEN
               v_totalCustoMedioFiscal := 9999999999999.99;
            ELSE
               v_totalCustoMedioFiscal := ROUND ((dados.totalCustoOperacao * v_quantidadeEstoque / dados.quantidade),2);
            END IF;
          END IF;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedioFiscal := v_totalCustoMedioFiscal - dados.totalCustoOperacao;
        IF v_totalCustoMedioFiscal < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioFiscal := 0;
        END IF;
      END IF;
      IF v_totalCustoMedioFiscal > 0 AND v_quantidadeEstoque >= 0 AND ROUND(v_totalCustoMedioFiscal / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedioFiscal := 99999999.9999999;
      ELSE
        IF v_totalCustoMedioFiscal > 0 AND v_quantidadeEstoque >= 0 THEN
          v_precoCustoMedioFiscal := ROUND(v_totalCustoMedioFiscal / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
        END IF;
      END IF;
    -- Se não atualiza custo médio
    ELSE
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioFiscal := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedioFiscal + ROUND((dados.quantidade * v_precoCustoMedioFiscal),2) > 9999999999999.99 THEN
               v_totalCustoMedioFiscal := 9999999999999.99;
            ELSE
               v_totalCustoMedioFiscal := v_totalCustoMedioFiscal + dados.totalCustoOperacao;
            END IF;
          ELSE
            IF ROUND((v_quantidadeEstoque * v_precoCustoMedioFiscal),2) > 9999999999999.99 THEN
               v_totalCustoMedioFiscal := 9999999999999.99;
            ELSE
               v_totalCustoMedioFiscal := ROUND((v_quantidadeEstoque * v_precoCustoMedioFiscal),2);
            END IF;
          END IF;
        END IF;
      ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedioFiscal := v_totalCustoMedioFiscal - dados.quantidade * v_precoCustoMedioFiscal;
        IF v_totalCustoMedioFiscal < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedioFiscal := 0;
        END IF;
      END IF;
    END IF;
  END LOOP;
  IF v_precoCustoMedioFiscal = 0 THEN
    SELECT COALESCE(MAX(preco.precoMedioInicial),0)
    INTO v_precoCustoMedioFiscal      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_precoCustoMedioFiscal = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedioFiscal      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_precoCustoMedioFiscal = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedioFiscal      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_precoCustoMedioFiscal;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_buscarPrecoGerencial         IN NUMBER,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário
  )
  RETURN NUMBER
IS 
  v_dataInventarioEstoque DATE;
  v_precoCustoMedio       NUMBER;
BEGIN
  -- v_dataInventarioEstoque
  SELECT MAX(TRUNC(invEst.data))
  INTO v_dataInventarioEstoque
  FROM MOINVENTARIOSESTOQUE invEst
  WHERE invEst.inventarioEstoque <> 0
  AND invEst.data < TRUNC(p_dataPosicaoEstoque)
    + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
    - CASE WHEN p_especial = 1 THEN 1 ELSE 0 END
  AND (invEst.motivoInventarioEstoque = '01'
    OR EXISTS(
      SELECT 1
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
      AND gradProd.produto = p_gradProd_produto))
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  IF p_buscarPrecoGerencial = 1 THEN
    v_precoCustoMedio := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_estabelecimento,
      p_dataPosicaoEstoque,
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      v_dataInventarioEstoque);
  ELSE
    v_precoCustoMedio := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_estabelecimento,
      p_dataPosicaoEstoque,
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      v_dataInventarioEstoque);
  END IF;
  RETURN v_precoCustoMedio;
END;

/

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

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário
    )
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  -- Data / Preço Inventário
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((CASE WHEN itemEst.precoCustoUltimaCompra < 0 THEN 0 ELSE itemEst.precoCustoUltimaCompra * 10000000 END),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.produto = p_gradProd_produto
    AND itemEst.precoCustoUltimaCompra > 0
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >=
      CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal)
    + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
    - CASE WHEN p_especial = 1 THEN 1 ELSE 0 END
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento))
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 1
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))) a;
  -- Preço pós Inventário
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX((COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000')
      || LPAD((CASE WHEN COUNT (1) = 1 OR SUM(itemEst.quantidade) = 0 THEN MAX(itemEst.precoCustoOperacao) ELSE ROUND((SUM (itemEst.totalCustoOperacao)/SUM(itemEst.quantidade)),7) END * 10000000),15,'0'))),9,15)) / 10000000
    FROM MOESTOQUES itemEst
    LEFT JOIN MOPREDOCUMXESTOQUE preXEst
    ON preXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MOPREDOCUMXITENS itemPre
    ON itemPre.idItemPreDocumento = preXEst.idItemPreDocumento
    LEFT JOIN MODOCFISCALXESTOQUE docXEst
    ON docXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MODOCFISCALXITENS itemDoc
    ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
    JOIN CAGRADESPRODUTO grad
    ON grad.gradeProduto = itemEst.gradeProduto
    AND grad.produto = p_gradProd_produto
    WHERE itemEst.entradaSaida = 'E'
    AND itemEst.atualizaUltimaCompra = 1
    AND (itemEst.quantidade = 0
      AND itemEst.precoCustoOperacao > 0
      OR itemEst.quantidade > 0
      AND itemEst.totalCustoOperacao > 0)
    AND itemEst.indicadorPropriedadePosseItem = '' ||
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ''
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
      ELSE p_indicadorPropriedadePosseIt
      END || ''
    AND itemEst.pessoaParticipante = p_pessoaParticipante
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR grad.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR grad.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND itemEst.data >=
      CASE
        WHEN NOT(v_dataInventario IS NULL)
        THEN v_dataInventario + 1
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND itemEst.data < TRUNC(p_dataFinal) + 1
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento))
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 1
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))    
    GROUP BY
      COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000'),
      CASE
        WHEN NOT (docXEst.id IS NULL)
        THEN 'D' || LPAD(itemDoc.idDocumentoFiscal,14,'0')
        WHEN NOT (preXEst.id IS NULL)
        THEN 'P' || LPAD(itemPre.preDocumento,14,'0')
        ELSE 'M' || LPAD(itemEst.idEstoque,14,'0')
      END
    ),0) preco
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_item_personalizacao         IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_gradProd_cor                IN NUMBER,
    p_gradProd_tamanho            IN VARCHAR,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário
    )
  RETURN NUMBER
IS
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaFormacao * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaFormacao > 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal)
      + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      - CASE WHEN p_especial = 1 THEN 1 ELSE 0 END
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento))
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 1
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = invEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))) a;
  SELECT COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO v_preco
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(data,'YYYYMMDD'),'19000101')
      || LPAD((novoPrecoCusto * 10000000),15,'0'))) ordenacao
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    and novoPrecoCusto > 0
    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 >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
    AND data < TRUNC(p_dataFinal) + 1
    AND ativo = 1) a;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.precoCustoInicial > 0
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = preco.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAESTABELECIMENTOS est2
      ON est2.estabelecimento = p_estabelecimento
      JOIN CAPESSOAS pessEst2
      ON pessEst2.pessoa = est2.pessoaEstabelecimento
      WHERE preco.produto = p_gradProd_produto
      AND preco.precoCustoInicial > 0
      AND preco.ativo = 1
      AND (p_config_209_filtrarGrupoEcon = 0
        AND est.pessoaEstabelecimento = est2.pessoaEstabelecimento
        OR p_config_209_filtrarGrupoEcon = 1
        AND pessEst.grupoEconomico = pessEst2.grupoEconomico);
    END IF;  
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.precoCustoInicial > 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  IF v_preco = 0 THEN
    SELECT
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
      COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
    INTO
      v_dataInventario,
      v_precoInventario
    FROM (
      SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
        || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
      FROM MOINVENTARIOESTOQUEXITENS itemEst
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemEst.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemEst.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE itemEst.precoUnitarioUltimaCompra > 0
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)
      AND invEst.data >= CASE
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
    SELECT COALESCE ((
      SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
      FROM (
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MODOCFISCALXITENS item
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = item.gradeProduto
        JOIN MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND item.precoUnitario > CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (p_estabelecimento = 0
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst
            ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2
            ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))
        UNION ALL
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MOPREDOCUMXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND item.precoUnitario > CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento = 'A'
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (p_estabelecimento = 0
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst
            ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2
            ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))) a),0)
    INTO v_preco
    FROM DUAL;    
    IF v_preco = 0 THEN
      v_preco := v_precoInventario;
    END IF;
    IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = p_estabelecimento
      AND preco.precoUltimaCompraInicial > 0
      AND preco.ativo = 1;  
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.precoUltimaCompraInicial > 0
        AND preco.ativo = 1
        AND (p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst
            ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2
            ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2
            ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)));
      END IF;
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.estabelecimento = 0
        AND preco.precoUltimaCompraInicial > 0
        AND preco.ativo = 1;
      END IF;
    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_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_preco      NUMBER;
  v_precoFilho NUMBER;
  CURSOR c_kit IS 
    SELECT 
      kit.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN CAGRADESPRODUTO gradProdPai ON gradProdPai.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
BEGIN
  v_preco := 0;
  FOR kit IN c_kit LOOP
    v_precoFilho := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        1,
        0);
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoFilho = 0 AND kit.controleEstoque IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    IF v_precoFilho <> 0 THEN
      v_preco := v_preco + kit.quantidade * v_precoFilho;
    ELSE
      v_preco := 0;
    END IF;        
    EXIT WHEN v_preco = 0;
  END LOOP;
  RETURN v_preco;
END;

/

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

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS
  v_preco NUMBER;
  CURSOR c_formula IS 
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a 
    JOIN CABASESTINTAS base
    ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA
    ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB
    ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC
    ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD
    ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE
    ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF
    ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG
    ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH
    ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI
    ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ
    ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK
    ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL
    ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM
    ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN
    ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO
    ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0;
BEGIN
  v_preco := 0;
  FOR formula IN c_formula LOOP
    v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      formula.gradeProduto,
      1, --p_tinta_quantidade
      v_preco);
    IF formula.idColoranteTintaA > 0 AND formula.gradeProdutoA > 0 AND formula.quantidadeA > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoA,
        formula.quantidadeA / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaB > 0 AND formula.gradeProdutoB > 0 AND formula.quantidadeB > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoB,
        formula.quantidadeB / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaC > 0 AND formula.gradeProdutoC > 0 AND formula.quantidadeC > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoC,
        formula.quantidadeC / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaD > 0 AND formula.gradeProdutoD > 0 AND formula.quantidadeD > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoD,
        formula.quantidadeD / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaE > 0 AND formula.gradeProdutoE > 0 AND formula.quantidadeE > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoE,
        formula.quantidadeE / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaF > 0 AND formula.gradeProdutoF > 0 AND formula.quantidadeF > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoF,
        formula.quantidadeF / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaG > 0 AND formula.gradeProdutoG > 0 AND formula.quantidadeG > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoG,
        formula.quantidadeG / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaH > 0 AND formula.gradeProdutoH > 0 AND formula.quantidadeH > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoH,
        formula.quantidadeH / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaI > 0 AND formula.gradeProdutoI > 0 AND formula.quantidadeI > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoI,
        formula.quantidadeI / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaJ > 0 AND formula.gradeProdutoJ > 0 AND formula.quantidadeJ > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoJ,
        formula.quantidadeJ / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaK > 0 AND formula.gradeProdutoK > 0 AND formula.quantidadeK > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoK,
        formula.quantidadeK / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaL > 0 AND formula.gradeProdutoL > 0 AND formula.quantidadeL > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoL,
        formula.quantidadeL / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaM > 0 AND formula.gradeProdutoM > 0 AND formula.quantidadeM > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoM,
        formula.quantidadeM / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaN > 0 AND formula.gradeProdutoN > 0 AND formula.quantidadeN > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoN,
        formula.quantidadeN / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF formula.idColoranteTintaO > 0 AND formula.gradeProdutoO > 0 AND formula.quantidadeO > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoO,
        formula.quantidadeO / 900, --p_tinta_quantidade
        v_preco);
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;
  CURSOR c_kit IS 
    SELECT 
      kit.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN CAGRADESPRODUTO gradProdPai
    ON gradProdPai.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
BEGIN
  r_tabelaPreco := ' ';
  r_precoSugestaoAPrazo := 0;
  r_precoSugestaoAVista := 0;
  r_precoDesconto := 0;
  r_precoMinimo := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo := 0;
  r_precoAVista := 0;
  r_promocao := 0;
  r_precoPromocaoAPrazo := 0;
  r_precoPromocaoAVista := 0;
  r_precoIndexadoAPrazo := 0;
  r_precoIndexadoAVista := 0;
  FOR kit IN c_kit LOOP
    v_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoSugestaoAPrazo := 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,
        0);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := 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,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := 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,
        0);
    END IF;
    IF NOT(p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND kit.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_precoSugestaoAPrazo <> 0 THEN
      r_tabelaPreco         := v_tabelaPreco;
      r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + kit.quantidade * v_precoSugestaoAPrazo;
      r_precoSugestaoAVista := r_precoSugestaoAVista + kit.quantidade * v_precoSugestaoAVista;
      r_precoDesconto       := r_precoDesconto       + kit.quantidade * v_precoDesconto;
      r_precoMinimo         := r_precoMinimo         + kit.quantidade * v_precoMinimo;
      r_precoAPrazo         := r_precoAPrazo         + kit.quantidade * v_precoAPrazo;
      r_precoAVista         := r_precoAVista         + kit.quantidade * v_precoAVista;
      IF v_promocao = 1 THEN
        r_promocao          := 1;
      END IF;  
      r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + kit.quantidade * v_precoPromocaoAPrazo;
      r_precoPromocaoAVista := r_precoPromocaoAVista + kit.quantidade * v_precoPromocaoAVista;
      r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + kit.quantidade * v_precoIndexadoAPrazo;
      r_precoIndexadoAVista := r_precoIndexadoAVista + kit.quantidade * v_precoIndexadoAVista;
    ELSE
      r_tabelaPreco         := ' ';
      r_precoSugestaoAPrazo := 0;
      r_precoSugestaoAVista := 0;
      r_precoDesconto       := 0;
      r_precoMinimo         := 0;
      r_precoAPrazo         := 0;
      r_precoAVista         := 0;
      r_promocao            := 0;
      r_precoPromocaoAPrazo := 0;
      r_precoPromocaoAVista := 0;
      r_precoIndexadoAPrazo := 0;
      r_precoIndexadoAVista := 0;
    END IF;        
    EXIT WHEN r_precoSugestaoAPrazo = 0;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_KIT;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_PROTIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    p_ini_tabelaPreco              IN VARCHAR,
    p_ini_precoSugestaoAPrazo      IN NUMBER,
    p_ini_precoSugestaoAVista      IN NUMBER,
    p_ini_precoDesconto            IN NUMBER,
    p_ini_precoMinimo              IN NUMBER,
    p_ini_informarPrecoManualmente IN NUMBER,
    p_ini_precoAPrazo              IN NUMBER,
    p_ini_precoAVista              IN NUMBER,
    p_ini_promocao                 IN NUMBER,
    p_ini_precoPromocaoAPrazo      IN NUMBER,
    p_ini_precoPromocaoAVista      IN NUMBER,
    p_ini_precoIndexadoAPrazo      IN NUMBER,
    p_ini_precoIndexadoAVista      IN NUMBER,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;
  CURSOR c_prod IS 
    SELECT 
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto;
BEGIN
  r_tabelaPreco              := p_ini_tabelaPreco;
  r_precoSugestaoAPrazo      := p_ini_precoSugestaoAPrazo;
  r_precoSugestaoAVista      := p_ini_precoSugestaoAVista;
  r_precoDesconto            := p_ini_precoDesconto;
  r_precoMinimo              := p_ini_precoMinimo;
  r_informarPrecoManualmente := p_ini_informarPrecoManualmente;
  r_precoAPrazo              := p_ini_precoAPrazo;
  r_precoAVista              := p_ini_precoAVista;
  r_promocao                 := p_ini_promocao;
  r_precoPromocaoAPrazo      := p_ini_precoPromocaoAPrazo;
  r_precoPromocaoAVista      := p_ini_precoPromocaoAVista;
  r_precoIndexadoAPrazo      := p_ini_precoIndexadoAPrazo;
  r_precoIndexadoAVista      := p_ini_precoIndexadoAVista;
  FOR prod IN c_prod LOOP
    v_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0,
        0);
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        0);
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(prod.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        1,
        0);
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0);
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        prod.cor,
        prod.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        0,
        0);
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        prod.produto,
        prod.cor,
        prod.tamanho,
        1,
        0);
    END IF;
    IF NOT(p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND prod.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_tinta_quantidade * p_item_quantidade,
        prod.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_tabelaPreco <> ' ' THEN
      r_tabelaPreco       := v_tabelaPreco;
    END IF;
    r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + p_tinta_quantidade * v_precoSugestaoAPrazo;
    r_precoSugestaoAVista := r_precoSugestaoAVista + p_tinta_quantidade * v_precoSugestaoAVista;
    r_precoDesconto       := r_precoDesconto       + p_tinta_quantidade * v_precoDesconto;
    r_precoMinimo         := r_precoMinimo         + p_tinta_quantidade * v_precoMinimo;
    r_precoAPrazo         := r_precoAPrazo         + p_tinta_quantidade * v_precoAPrazo;
    r_precoAVista         := r_precoAVista         + p_tinta_quantidade * v_precoAVista;
    IF v_promocao = 1 THEN
      r_promocao          := 1;
    END IF;
    r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + p_tinta_quantidade * v_precoPromocaoAPrazo;
    r_precoPromocaoAVista := r_precoPromocaoAVista + p_tinta_quantidade * v_precoPromocaoAVista;
    r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + p_tinta_quantidade * v_precoIndexadoAPrazo;
    r_precoIndexadoAVista := r_precoIndexadoAVista + p_tinta_quantidade * v_precoIndexadoAVista;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_PROTIN;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
  CURSOR c_formula IS 
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS base
    ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA
    ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB
    ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC
    ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD
    ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE
    ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF
    ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG
    ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH
    ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI
    ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ
    ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK
    ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL
    ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM
    ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN
    ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO
    ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0;
BEGIN
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;
  FOR formula IN c_formula LOOP
    ADD_BUSCA_PRECO_INTERNO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      formula.gradeProduto,
      1, --p_tinta_quantidade
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista,
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista);
    IF formula.idColoranteTintaA > 0 AND formula.gradeProdutoA > 0 AND formula.quantidadeA > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoA,
        formula.quantidadeA / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaB > 0 AND formula.gradeProdutoB > 0 AND formula.quantidadeB > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoB,
        formula.quantidadeB / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaC > 0 AND formula.gradeProdutoC > 0 AND formula.quantidadeC > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoC,
        formula.quantidadeC / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaD > 0 AND formula.gradeProdutoD > 0 AND formula.quantidadeD > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoD,
        formula.quantidadeD / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaE > 0 AND formula.gradeProdutoE > 0 AND formula.quantidadeE > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoE,
        formula.quantidadeE / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaF > 0 AND formula.gradeProdutoF > 0 AND formula.quantidadeF > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoF,
        formula.quantidadeF / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaG > 0 AND formula.gradeProdutoG > 0 AND formula.quantidadeG > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoG,
        formula.quantidadeG / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaH > 0 AND formula.gradeProdutoH > 0 AND formula.quantidadeH > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoH,
        formula.quantidadeH / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaI > 0 AND formula.gradeProdutoI > 0 AND formula.quantidadeI > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoI,
        formula.quantidadeI / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaJ > 0 AND formula.gradeProdutoJ > 0 AND formula.quantidadeJ > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoJ,
        formula.quantidadeJ / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaK > 0 AND formula.gradeProdutoK > 0 AND formula.quantidadeK > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoK,
        formula.quantidadeK / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaL > 0 AND formula.gradeProdutoL > 0 AND formula.quantidadeL > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoL,
        formula.quantidadeL / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaM > 0 AND formula.gradeProdutoM > 0 AND formula.quantidadeM > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoM,
        formula.quantidadeM / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaN > 0 AND formula.gradeProdutoN > 0 AND formula.quantidadeN > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoN,
        formula.quantidadeN / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF formula.idColoranteTintaO > 0 AND formula.gradeProdutoO > 0 AND formula.quantidadeO > 0 THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        formula.gradeProdutoO,
        formula.quantidadeO / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_TINTA;

/

create or replace PROCEDURE ADD_BUSCA_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_modDoc_tipoPreco             IN CHAR,
    p_modDoc_tabelaPreco           IN VARCHAR,
    p_modDoc_fatorMultiplicador    IN NUMBER,
    p_modDoc_tipoPrecoB            IN CHAR,
    p_modDoc_tabelaPrecoB          IN VARCHAR,
    p_modDoc_fatorMultiplicadorB   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_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_precoSugestaoAPrazoOriginal  IN NUMBER,
    p_precoSugestaoAVistaOriginal  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tipoPreco                    OUT CHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;
  IF p_gradProd_produto > 0 THEN
    IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'I' THEN
      r_tipoPreco := 'I';
    ELSE
      IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
        ADD_BUSCA_PRECO_INTERNO_TINTA(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_entradaSaida,
          p_cab_devolucaoAnulacaoRetorno,
          p_cab_estabelecimento,
          p_cab_dataPrecoInicial,
          p_cab_dataPrecoFinal,
          p_cab_pessoa,
          p_modDoc_capituloNaturezaFisc,
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_quantidade,
          p_locEst_indicadorPropPosseIt,
          p_manterPreco,
          CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END, --p_tipoPreco
          CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END, --p_tabelaPreco
          r_tabelaPreco,
          r_precoSugestaoAPrazo,
          r_precoSugestaoAVista,
          r_precoDesconto,
          r_precoMinimo,
          r_informarPrecoManualmente,
          r_precoAPrazo,
          r_precoAVista,
          r_promocao,
          r_precoPromocaoAPrazo,
          r_precoPromocaoAVista,
          r_precoIndexadoAPrazo,
          r_precoIndexadoAVista);
      ELSE
        -- A Tabela de Preço Anterior
        IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'A' THEN
          ADD_BUSCA_PRECO_INTERNO_ANTER(
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_quantidade,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_manterPreco,
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        -- C Custo Médio da Venda (CMV)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'C' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            p_item_pessoaParticipante,
            1,
            0);
        -- F Formação Preço (Custo)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'F' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
            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);
        -- M Custo Médio da Venda Contábil (CMV)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'M' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            p_item_pessoaParticipante,
            0,
            0);
        -- P Preço de Custo (Último Custo)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'P' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
            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,
            p_locEst_indicadorPropPosseIt,
            p_item_pessoaParticipante,
            0);
        -- T Tabela de Preço
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'T' THEN
          ADD_BUSCA_PRECO_INTERNO_TABELA(
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_quantidade,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_manterPreco,
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        -- U Última Compra
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'U' THEN
          r_precoSugestaoAPrazo := 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,
            0);
        -- 2 Última Compra Bruto
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = '2' THEN
          r_precoSugestaoAPrazo := 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,
            1,
            0);
        END IF;
        IF NOT(CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END IN ('A','T')) THEN
          r_tabelaPreco              := ' ';
          r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
          r_precoDesconto            := 0;
          r_precoMinimo              := 0;
          r_informarPrecoManualmente := 0;
          r_precoAPrazo              := r_precoSugestaoAPrazo;
          r_precoAVista              := r_precoSugestaoAPrazo;
          r_promocao                 := 0;
          r_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
          r_precoPromocaoAVista      := r_precoSugestaoAPrazo;
          r_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
          r_precoIndexadoAVista      := r_precoSugestaoAPrazo;
        END IF;
        -- 3 = Combo / 4 = Kit
        IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND p_prod_controleEstoque IN (3,4) THEN
          ADD_BUSCA_PRECO_INTERNO_KIT(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            p_gradProd_produto,
            p_locEst_indicadorPropPosseIt,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        END IF;
      END IF;
      -- Se encontrou preço
      IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR r_precoAPrazo <> 0 OR r_precoAVista <> 0 OR r_precoPromocaoAPrazo <> 0 OR r_precoPromocaoAVista <> 0 OR r_precoIndexadoAPrazo <> 0 OR r_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'I' THEN
        r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END;
        IF NOT (p_modDoc_fatorMultiplicador IN (0,1)) AND (p_manterPreco = 0 OR p_tipoPreco = p_modDoc_tipoPreco AND p_tabelaPreco = p_modDoc_tabelaPreco) THEN
          r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoSugestaoAVista := r_precoSugestaoAVista * p_modDoc_fatorMultiplicador;
          r_precoDesconto       := r_precoDesconto       * p_modDoc_fatorMultiplicador;
          r_precoMinimo         := r_precoMinimo         * p_modDoc_fatorMultiplicador;
          r_precoAPrazo         := r_precoAPrazo         * p_modDoc_fatorMultiplicador;
          r_precoAVista         := r_precoAVista         * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAPrazo := r_precoPromocaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAVista := r_precoPromocaoAVista * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAPrazo := r_precoIndexadoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAVista := r_precoIndexadoAVista * p_modDoc_fatorMultiplicador;
        END IF;
      -- Se não encontrou preço, não mantém o atual e existe regra de preço B
      ELSIF p_manterPreco = 0 AND p_modDoc_tipoPrecoB <> ' ' THEN
        ADD_BUSCA_PRECO(
          p_config_64_casasDecSaidas,
          p_config_65_casasDecEntrada,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_entradaSaida,
          p_cab_devolucaoAnulacaoRetorno,
          p_cab_estabelecimento,
          p_cab_dataPrecoInicial,
          p_cab_dataPrecoFinal,
          p_cab_pessoa,
          p_modDoc_capituloNaturezaFisc,
          p_modDoc_tipoPrecoB,
          p_modDoc_tabelaPrecoB,
          p_modDoc_fatorMultiplicadorB,
          ' ',
          ' ',
          0,
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_quantidade,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          p_prod_controleEstoque,
          p_locEst_indicadorPropPosseIt,
          0,
          p_precoSugestaoAPrazoOriginal,
          p_precoSugestaoAVistaOriginal,
          p_modDoc_tipoPrecoB,
          p_modDoc_tabelaPrecoB,
          r_tipoPreco,
          r_tabelaPreco,
          r_precoSugestaoAPrazo,
          r_precoSugestaoAVista,
          r_precoDesconto,
          r_precoMinimo,
          r_informarPrecoManualmente,
          r_precoAPrazo,
          r_precoAVista,
          r_promocao,
          r_precoPromocaoAPrazo,
          r_precoPromocaoAVista,
          r_precoIndexadoAPrazo,
          r_precoIndexadoAVista);
        -- Se não encontrou preço B, devolve tipo preço e tabela atual
        IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND r_precoAPrazo = 0 AND r_precoAVista = 0 AND r_precoPromocaoAPrazo = 0 AND r_precoPromocaoAVista = 0 AND r_precoIndexadoAPrazo = 0 AND r_precoIndexadoAVista = 0 AND p_modDoc_tipoPrecoB <> 'I' THEN
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE p_modDoc_tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END;
        END IF;
      -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
      ELSE
        r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE p_modDoc_tipoPreco   END;
        r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END;
      END IF;
      -- Efetua arredondamento de preço
      r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoAPrazo         := ROUND (r_precoAPrazo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoAVista         := ROUND (r_precoAVista        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoPromocaoAPrazo := ROUND (r_precoPromocaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoPromocaoAVista := ROUND (r_precoPromocaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoIndexadoAPrazo := ROUND (r_precoIndexadoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoIndexadoAVista := ROUND (r_precoIndexadoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
    END IF;
  END IF;
END ADD_BUSCA_PRECO;

/

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

/

create or replace PROCEDURE ADD_CALCULA_CUSTO_CMV (
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_item_modeloDocumento         IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorII                 IN NUMBER,
    p_item_valorIOF                IN NUMBER,
    p_item_valorIPI                IN NUMBER,
    p_item_valorIPIDevolucao       IN NUMBER,
    p_item_valorPIS                IN NUMBER,
    p_item_valorPISST              IN NUMBER,
    p_item_valorCOFINS             IN NUMBER,
    p_item_valorCOFINSST           IN NUMBER,
    p_item_valorCreditoSimplesNac  IN NUMBER,
    p_item_valorICMS               IN NUMBER,
    p_item_valorICMSST             IN NUMBER,
    p_item_valorICMSSTEscrit       IN NUMBER,
    p_item_valorLiquidoItem        IN NUMBER,
    p_item_valorDescCustoOpItem    IN NUMBER,
    p_item_valorDescCustoOpGeral   IN NUMBER,
    p_item_valorAcrescCustoOpItem  IN NUMBER,
    p_item_valorAcrescCustoOpGeral IN NUMBER,
    p_item_valorAcrescExtempTotal  IN NUMBER,
    /* Retornos */
    r_item_valorDescCustoOpTotal   OUT NUMBER,
    r_item_valorAcrescCustoOpTotal OUT NUMBER,
    r_item_precoCustoOperacao      OUT NUMBER,
    r_item_valorCustoOperacao      OUT NUMBER,
    r_item_precoCMV                OUT NUMBER,
    r_item_valorCMV                OUT NUMBER)
IS
  CURSOR c_regFormPr IS
    SELECT regFormPr.*
    FROM PAMODELOSDOCUMENTO modDoc
    JOIN PAREGRASFORMACAOPRECO regFormPr
    ON regFormPr.regraFormacaoPreco = modDoc.regraFormacaoPreco
    WHERE modDoc.modeloDocumento = p_item_modeloDocumento;  
BEGIN
  FOR regFormPr IN c_regFormPr LOOP
    r_item_valorDescCustoOpTotal   := 0;
    r_item_valorAcrescCustoOpTotal := 0;
    r_item_precoCustoOperacao      := 0;
    r_item_valorCustoOperacao      := 0;
    r_item_precoCMV                := 0;
    r_item_valorCMV                := 0;
    r_item_valorDescCustoOpTotal   := p_item_valorDescCustoOpItem + p_item_valorDescCustoOpGeral;
    r_item_valorAcrescCustoOpTotal := p_item_valorAcrescCustoOpItem + p_item_valorAcrescCustoOpGeral;
    /* Custo médio */
    IF p_cab_atualizaCustoMedio = 1 THEN
      r_item_valorCustoOperacao := ROUND ((
        p_item_valorLiquidoItem
        - r_item_valorDescCustoOpTotal
        + r_item_valorAcrescCustoOpTotal
        - CASE WHEN regFormPr.creditaII = 1 THEN p_item_valorII ELSE 0 END
        - CASE WHEN regFormPr.creditaIOF = 1 THEN p_item_valorIOF ELSE 0 END
        - CASE WHEN regFormPr.creditaIPI = 1 THEN p_item_valorIPI + p_item_valorIPIDevolucao ELSE 0 END
        - CASE WHEN regFormPr.creditaPIS = 1 THEN p_item_valorPIS ELSE 0 END
        - CASE WHEN regFormPr.creditaPISST = 1 THEN p_item_valorPISST ELSE 0 END
        - CASE WHEN regFormPr.creditaCOFINS = 1 THEN p_item_valorCOFINS ELSE 0 END
        - CASE WHEN regFormPr.creditaCOFINSST = 1 THEN p_item_valorCOFINSST ELSE 0 END
        - CASE WHEN regFormPr.creditaICMSST = 1 THEN CASE WHEN p_cab_nfFornecedor = 1 AND p_item_valorICMSSTEscrit <> 0 THEN p_item_valorICMSSTEscrit ELSE p_item_valorICMSST END ELSE 0 END
        - CASE WHEN regFormPr.creditaICMS = 1 AND p_item_valorICMSST = 0 AND (p_cab_nfFornecedor = 0 OR p_item_valorICMSSTEscrit = 0) THEN p_item_valorICMS ELSE 0 END
        - CASE WHEN regFormPr.creditaSN = 1 THEN p_item_valorCreditoSimplesNac ELSE 0 END
        + p_item_valorAcrescExtempTotal),2);
      r_item_precoCustoOperacao := CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((r_item_valorCustoOperacao / p_item_quantidade), 7) END ;
      /* Pendente - calculo do novo CMV */
      r_item_precoCMV := 0;
      r_item_valorCMV := 0;      
    ELSE
      /* Pendente - busca CMV */
      r_item_precoCustoOperacao := 0;
      r_item_valorCustoOperacao := ROUND ((p_item_quantidade * r_item_precoCustoOperacao / 100), 2);
      r_item_precoCMV := r_item_precoCustoOperacao;
      r_item_valorCMV := r_item_valorCustoOperacao;
    END IF;
  END LOOP;
END ADD_CALCULA_CUSTO_CMV;

/

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

/

