SET DEFINE OFF;

CREATE TABLE PAMODELOSDOCUMENTO_2501 AS SELECT * FROM PAMODELOSDOCUMENTO;

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

DROP TABLE PAMODELOSDOCUMENTO;

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

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

COMMIT;

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

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

-- PAMOTIVOSESTOQUE
CREATE TABLE PAMOTIVOSESTOQUE
  (
    motivoEstoque NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao     VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao     NUMERIC (11,0) DEFAULT 0 NOT NULL,
    observacoes   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAMOTIVOSESTOQUE ADD CONSTRAINT PAMOTIVOSESTOQUE_PK1 PRIMARY KEY (motivoEstoque);
CREATE INDEX PAMOTIVOSESTOQUE_K2 ON PAMOTIVOSESTOQUE (descricao);

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

COMMIT;

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

COMMIT;

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

COMMIT;

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

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

COMMIT;

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

COMMIT;

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

COMMIT;

CREATE TABLE MOORCAMENTOXATIVIDADEREAL_2501 AS SELECT * FROM MOORCAMENTOXATIVIDADEREAL;

ALTER TABLE MOORCAMENTOXFICHAPRODREAL DROP CONSTRAINT MOORCAMENTOXFICHAPRODREAL_FK1;

DROP TABLE MOORCAMENTOXATIVIDADEREAL;

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

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

COMMIT;

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

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

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

DROP TABLE MOESTOQUES;

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

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

COMMIT;

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

CREATE TABLE MODOCUMENTOSTRANSFERENCIA_2501 AS SELECT * FROM MODOCUMENTOSTRANSFERENCIA;

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

DROP TABLE MODOCUMENTOSTRANSFERENCIA;

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

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

COMMIT;

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

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

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

COMMIT;

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

COMMIT;

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

COMMIT;

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

COMMIT;

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

COMMIT;

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

COMMIT;

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

COMMIT;

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

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

DROP TABLE MORESERVASESTOQUE;

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

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

COMMIT;

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

CREATE TABLE MODOCTRANSFXBLOQUEIOSEST_2501 AS SELECT * FROM MODOCTRANSFXBLOQUEIOSEST;

DROP TABLE MODOCTRANSFXBLOQUEIOSEST;

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

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

COMMIT;

CREATE TABLE MOBALANCOXDIVERGENCIA_2501 AS SELECT * FROM MOBALANCOXDIVERGENCIA;

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

DROP TABLE MOBALANCOXDIVERGENCIA;

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

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

COMMIT;

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

CREATE TABLE MOBALANCOXITENS_2501 AS SELECT * FROM MOBALANCOXITENS;

DROP TABLE MOBALANCOXITENS;

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

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

COMMIT;

CREATE TABLE MODOCTROCAXITENS_2501 AS SELECT * FROM MODOCTROCAXITENS;

DROP TABLE MODOCTROCAXITENS;

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

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

COMMIT;

CREATE TABLE MOINVENTARIOESTOQUEXITENS_2501 AS SELECT * FROM MOINVENTARIOESTOQUEXITENS;

ALTER TABLE MOBALANCOXINVENTESTOQUE DROP CONSTRAINT MOBALANCOXINVENTESTOQUE_FK2;

DROP TABLE MOINVENTARIOESTOQUEXITENS;

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

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

COMMIT;

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

CREATE TABLE MOINVENTARIOESTOQUEXFISC_2501 AS SELECT * FROM MOINVENTARIOESTOQUEXFISC;

DROP TABLE MOINVENTARIOESTOQUEXFISC;

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

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

COMMIT;

CREATE TABLE MODOCFISCALXBLOQUEIOSEST_2501 AS SELECT * FROM MODOCFISCALXBLOQUEIOSEST;

DROP TABLE MODOCFISCALXBLOQUEIOSEST;

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

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

COMMIT;

CREATE TABLE MOPREDOCUMXBLOQUEIOSEST_2501 AS SELECT * FROM MOPREDOCUMXBLOQUEIOSEST;

DROP TABLE MOPREDOCUMXBLOQUEIOSEST;

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

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

COMMIT;

CREATE TABLE MOORCAMENTOXBLOQUEIOSEST_2501 AS SELECT * FROM MOORCAMENTOXBLOQUEIOSEST;

DROP TABLE MOORCAMENTOXBLOQUEIOSEST;

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

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

COMMIT;

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

DROP TABLE MODOCFISCALXPRODUTOFILHO;

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

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

COMMIT;

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

DROP TABLE MOPREDOCUMXPRODUTOFILHO;

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

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

COMMIT;

CREATE TABLE MODOCFISCALXNUMEROSSERIE_2501 AS SELECT * FROM MODOCFISCALXNUMEROSSERIE;

DROP TABLE MODOCFISCALXNUMEROSSERIE;

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

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

COMMIT;

DROP TABLE MODOCFISCALXENDERECOESTOQ;

CREATE TABLE MOPREDOCUMXNUMEROSSERIE_2501 AS SELECT * FROM MOPREDOCUMXNUMEROSSERIE;

DROP TABLE MOPREDOCUMXNUMEROSSERIE;

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

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

COMMIT;

DROP TABLE MOPREDOCUMXENDERECOESTOQ;

CREATE TABLE MOORCAMENTOXNUMEROSSERIE_2501 AS SELECT * FROM MOORCAMENTOXNUMEROSSERIE;

DROP TABLE MOORCAMENTOXNUMEROSSERIE;

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

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

COMMIT;

DROP TABLE MOORCAMENTOXENDERECOESTOQ;

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

COMMIT;

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

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

COMMIT;

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

COMMIT;

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

DROP TABLE TEMPCARRINHO;

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

DROP TABLE TEMPENDERECOSESTOQUE;

DROP TABLE TEMPNUMEROSSERIE;

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

DROP TABLE TEMPVERIFICACAOESTOQUE;

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

DROP TABLE TEMPMOVIMENTOESTOQUE;

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

DROP TABLE TEMPBALANCOXDIVERGENCIA;

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

DROP TABLE TEMPINVENTARIOESTXFISCAL;

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

DROP TABLE TEMPINVENTARIOESTXGERENC;

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

DROP PROCEDURE ADD_ESTOQUE_INSERE;

DROP PROCEDURE ADD_DOCTRANSF_CAB_RESERVA_GRAV;
DROP PROCEDURE ADD_DOCTRANSF_ITEM_RES_ITEM;

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

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

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

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

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

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

/

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

/

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

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_GERENC (
  p_dataPosicaoEstoque          IN DATE,   -- Obrigatório
  p_estabelecimento             IN NUMBER, -- Obrigatório
  p_indicadorPropriedadePosseIt IN CHAR,   -- Enviar ' ' para todos
  p_pessoaParticipante          IN NUMBER, -- Enviar -1 para todos
  p_localEstoque                IN NUMBER, -- Enviar -1 para todos
  p_gradeProduto                IN NUMBER, -- Obrigatório
  p_personalizacao              IN NUMBER, -- Enviar -1 para todos
  p_idLoteEstoque               IN NUMBER, -- Enviar -1 para todos
  p_idNumeroSerie               IN NUMBER, -- Enviar -1 para todos
  p_tipoDocumentoDesconsiderar  IN CHAR,   -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
  p_idDocumentoDesconsiderar    IN NUMBER) -- D = idDocumentoFiscal, I = inventarioEstoque, P = preDocumento
RETURN NUMBER
IS
  v_gradProd_produto          NUMBER;
  v_prod_controleEstoque      NUMBER;
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeDocumentoFiscal NUMBER;
  v_quantidadePreDocumento    NUMBER;
BEGIN
  v_quantidadeInventario      := 0;
  v_quantidadeEstoque         := 0;
  v_quantidadeDocumentoFiscal := 0;
  v_quantidadePreDocumento    := 0;
  SELECT
    gradProd.produto,
    prod.controleEstoque
  INTO
    v_gradProd_produto,
    v_prod_controleEstoque
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_gradeProduto;
  -- KIT / COMBO
  IF v_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC ((FUNC_ADD_BUSCA_ESTOQUE_GERENC (
        p_dataPosicaoEstoque,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        kit.gradeProdutoFilho,
        -1,
        -1,
        -1,
        p_tipoDocumentoDesconsiderar,
        p_idDocumentoDesconsiderar) / kit.quantidade), uniMedPai.casasDecimaisUnidadeMedida))
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProdFilho
      ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho
      ON prodFilho.produto = gradProdFilho.produto
      JOIN CAGRADESPRODUTO gradProdPai
      ON gradProdPai.gradeProduto = kit.gradeProduto
      JOIN CAPRODUTOS prodPai
      ON prodPai.produto = gradProdPai.produto
      JOIN SIUNIDADESMEDIDA uniMedPai
      ON uniMedPai.unidadeMedida = prodPai.unidadeMedida
      WHERE kit.gradeProduto = p_gradeProduto
      AND kit.ativo = 1
      AND kit.quantidade > 0
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND prodFilho.controleEstoque IN (1,3,4,5,11,12)), 0)
    INTO v_quantidadeEstoque
    FROM DUAL;
  -- DEMAIS PRODUTOS (EXCETO KIT / COMBO)
  ELSIF v_prod_controleEstoque IN (1,5,11,12) THEN
    -- v_idInventarioEstoque / v_dataInventario
    SELECT
      TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
    INTO
      v_idInventarioEstoque,
      v_dataInventario
    FROM (
      SELECT
        COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
          || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
      FROM MOINVENTARIOSESTOQUE inv
      WHERE inv.estabelecimento = p_estabelecimento
      AND inv.inventarioEstoque <> 0
      AND (p_tipoDocumentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND inv.data < TRUNC(p_dataPosicaoEstoque)
        + CASE WHEN p_tipoDocumentoDesconsiderar <> 'I' AND inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      AND (inv.motivoInventarioEstoque = '01'
        OR EXISTS (
          SELECT 1
          FROM MOINVENTARIOESTOQUEXITENS itemInv
          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
          AND itemInv.produto = v_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE ((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        WHERE est.produto = v_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (v_idInventarioEstoque <= 0
		  OR est.data >= TRUNC(v_dataInventario)+1)),
      CASE
        WHEN v_idInventarioEstoque > 0 AND NOT (v_dataInventario IS NULL)
        THEN TRUNC (v_dataInventario) + 1
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END)
    INTO v_dataPosicaoEstoqueInicial
    FROM DUAL;
    -- v_quantidadeInventario
    IF v_idInventarioEstoque > 0 THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeInventario
      FROM DUAL;
    END IF;
    -- v_quantidadeEstoque
    IF TRUNC (v_dataPosicaoEstoqueInicial) <= TRUNC (p_dataPosicaoEstoque) THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOESTOQUES est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    END IF;
    -- v_quantidadeDocumentoFiscal
    IF p_tipoDocumentoDesconsiderar = 'D' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCFISCALXESTOQUE docXEst
        ON docXEst.idItemDocFiscal = itemDoc.idItemDocFiscal
        JOIN MOESTOQUES est
        ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.idDocumentoFiscal = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    END IF;
    -- v_quantidadePreDocumento
    IF p_tipoDocumentoDesconsiderar = 'P' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOPREDOCUMXITENS itemDoc
        JOIN MOPREDOCUMXESTOQUE docXEst
        ON docXEst.idItemPreDocumento = itemDoc.idItemPreDocumento
        JOIN MOESTOQUES est
        ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.preDocumento = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadePreDocumento
      FROM DUAL;
    END IF;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    - v_quantidadeDocumentoFiscal
    - v_quantidadePreDocumento;
END;

/

create or replace FUNCTION BUSCA_QUANTIDADE_ESTOQUE (
  p_produto                     IN NUMBER,
  p_cor                         IN NUMBER,
  p_tamanho                     IN VARCHAR,
  p_gradeProduto                IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_indicadorPropriedadePosseIt IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_naoUsado                    IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_preDocumentoDesconsiderar   IN NUMBER,
  p_idDocumentoFiscalDesconsid  IN NUMBER,
  p_dataPosicaoEstoque          IN DATE)
RETURN NUMBER
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_ESTOQUE_GERENC
IS
  v_quantidadeEstoque NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_ESTOQUE_GERENC (
      p_dataPosicaoEstoque,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      CASE
        WHEN p_personalizacao = 0
        THEN -1
        ELSE p_personalizacao
      END,
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      CASE
        WHEN p_idDocumentoFiscalDesconsid > 0
        THEN 'D'
        WHEN p_preDocumentoDesconsiderar > 0
        THEN 'P'
        ELSE ' '
      END,
      CASE
        WHEN p_idDocumentoFiscalDesconsid > 0
        THEN p_idDocumentoFiscalDesconsid
        WHEN p_preDocumentoDesconsiderar > 0
        THEN p_preDocumentoDesconsiderar
        ELSE 0
      END))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)), 0)
  INTO v_quantidadeEstoque
  FROM DUAL;
  RETURN v_quantidadeEstoque;
END;

/

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

/

create or replace FUNCTION FUNC_ADD_BUSCA_RESERVAS_PROD (
  p_config_82_considLenteDispon IN NUMBER,
  p_config_83_considLenteEstoqu IN NUMBER,
  p_config_160_permiteTransfSem IN CHAR,
  p_produto                     IN NUMBER,
  p_cor                         IN NUMBER,
  p_tamanho                     IN VARCHAR,
  p_gradeProduto                IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_indicadorPropriedadePosseIt IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_naoUsado                    IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_documentoDesconsiderar      IN CHAR, -- O = Orçamento, T = Transferencia
  p_idDocumentoDesconsiderar    IN NUMBER,
  p_entradaSaida                IN CHAR)
RETURN NUMBER
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_RESERVAS_ESTOQ
IS
  v_quantidadeReservas NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
      p_config_82_considLenteDispon,
      p_config_83_considLenteEstoqu,
      p_config_160_permiteTransfSem,
      p_entradaSaida,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      CASE
        WHEN p_personalizacao = 0
        THEN -1
        ELSE p_personalizacao
      END,
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      p_documentoDesconsiderar,
      p_idDocumentoDesconsiderar))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)), 0)
  INTO v_quantidadeReservas
  FROM DUAL;
  RETURN v_quantidadeReservas;
END;

/

create or replace FUNCTION BUSCA_RESERVAS_ESTOQUE (
  p_config_82_considLenteDispon IN NUMBER,
  p_config_83_considLenteEstoqu IN NUMBER,
  p_config_160_permiteTransfSem IN CHAR,
  p_produto                     IN NUMBER,
  p_cor                         IN NUMBER,
  p_tamanho                     IN VARCHAR,
  p_gradeProduto                IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_indicadorPropriedadePosseIt IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_naoUsado                    IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_orcamentoDesconsiderar      IN NUMBER,
  p_transferenciaDesconsiderar  IN NUMBER,
  p_entradaSaida                IN CHAR)
RETURN NUMBER
-- OBSOLETO NÃO USAR
-- CHAMAR FUNC_ADD_BUSCA_RESERVAS_ESTOQ
IS
  v_quantidadeReservas NUMBER;
BEGIN
  SELECT COALESCE ((
    SELECT SUM (FUNC_ADD_BUSCA_RESERVAS_ESTOQ (
      p_config_82_considLenteDispon,
      p_config_83_considLenteEstoqu,
      p_config_160_permiteTransfSem,
      p_entradaSaida,
      est.estabelecimento,
      CASE
        WHEN p_indicadorPropriedadePosseIt IS NULL
          OR p_indicadorPropriedadePosseIt = ' '
        THEN '0'
        ELSE p_indicadorPropriedadePosseIt
      END,
      p_pessoaParticipante,
      CASE
        WHEN p_localEstoque = 0
        THEN -1
        ELSE p_localEstoque
      END,
      gradprod.gradeProduto,
      -1, --p_personalizacao
      CASE
        WHEN p_idLoteEstoque = 0
        THEN -1
        ELSE p_idLoteEstoque
      END,
      CASE
        WHEN p_idNumeroSerie = 0
        THEN -1
        ELSE p_idNumeroSerie
      END,
      CASE
        WHEN p_orcamentoDesconsiderar > 0
        THEN 'O'
        WHEN p_transferenciaDesconsiderar > 0
        THEN 'T'
        ELSE ''
      END, -- p_documentoDesconsiderar
      CASE
        WHEN p_orcamentoDesconsiderar > 0
        THEN p_orcamentoDesconsiderar
        WHEN p_transferenciaDesconsiderar > 0
        THEN p_transferenciaDesconsiderar
        ELSE 0
      END -- p_idDocumentoDesconsiderar
      ))
    FROM CAGRADESPRODUTO gradprod
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAESTABELECIMENTOS est
    ON 1=1
    WHERE (gradProd.gradeProduto = p_gradeProduto
      AND p_gradeProduto <> 0
      OR gradProd.produto = p_produto
      AND p_gradeProduto = 0
      AND (p_cor = 0 OR gradProd.cor = p_cor)
      AND (p_tamanho IS NULL
        OR p_tamanho = ' '
        OR gradProd.tamanho = p_tamanho))
    AND (est.estabelecimento = p_estabelecimento
      AND p_estabelecimento > 0
      OR est.estabelecimento > 0
      AND est.ativo = 1
      AND p_estabelecimento = 0)), 0)
  INTO v_quantidadeReservas
  FROM DUAL;
  RETURN v_quantidadeReservas;
END;

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_gerandoInventario            IN NUMBER)
RETURN NUMBER
IS 
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_data               DATE;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX (gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.data) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.data) data,
        a.preco
      FROM (
        SELECT 
          itemEst.data,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (itemEst.quantidade) = 0
            THEN MAX (itemEst.precoCustoOperacao)
            ELSE ROUND ((SUM (itemEst.totalCustoOperacao) / SUM (itemEst.quantidade)),7)
          END preco
        FROM MOESTOQUES itemEst
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = itemEst.estabelecimento
        LEFT JOIN MOPREDOCUMXESTOQUE preXEst
        ON preXEst.idEstoque = itemEst.idEstoque
        LEFT JOIN MOPREDOCUMXITENS itemPre
        ON itemPre.idItemPreDocumento = preXEst.idItemPreDocumento
        LEFT JOIN MODOCFISCALXESTOQUE docXEst
        ON docXEst.idEstoque = itemEst.idEstoque
        LEFT JOIN MODOCFISCALXITENS itemDoc
        ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
        WHERE itemEst.gradeProduto = v_gradeProduto
        AND itemEst.entradaSaida = 'E'
        AND itemEst.atualizaUltimaCompra = 1
        AND itemEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND itemEst.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR itemEst.personalizacao = p_item_personalizacao)
        AND itemEst.data >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND itemEst.data < TRUNC (p_cab_dataPrecoFinal) + 1
        GROUP BY
          itemEst.data,
          CASE
            WHEN docXEst.id IS NOT NULL
            THEN 'D' || LPAD (itemDoc.idDocumentoFiscal, 14, '0')
            WHEN preXEst.id IS NOT NULL
            THEN 'P' || LPAD (itemPre.preDocumento, 14, '0')
            ELSE 'M' || LPAD (itemEst.idEstoque, 14, '0')
          END) a) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco), 0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.data) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.data) data,
        a.preco
      FROM (
        SELECT 
          itemEst.data,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (itemEst.quantidade) = 0
            THEN MAX (itemEst.precoCustoOperacao)
            ELSE ROUND ((SUM (itemEst.totalCustoOperacao) / SUM (itemEst.quantidade)),7)
          END preco
        FROM MOESTOQUES itemEst
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = itemEst.estabelecimento
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = itemEst.gradeProduto
        LEFT JOIN MOPREDOCUMXESTOQUE preXEst
        ON preXEst.idEstoque = itemEst.idEstoque
        LEFT JOIN MOPREDOCUMXITENS itemPre
        ON itemPre.idItemPreDocumento = preXEst.idItemPreDocumento
        LEFT JOIN MODOCFISCALXESTOQUE docXEst
        ON docXEst.idEstoque = itemEst.idEstoque
        LEFT JOIN MODOCFISCALXITENS itemDoc
        ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
        WHERE itemEst.entradaSaida = 'E'
        AND itemEst.atualizaUltimaCompra = 1
        AND itemEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
        AND itemEst.pessoaParticipante = p_item_pessoaParticipante
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR itemEst.personalizacao = p_item_personalizacao)
        AND itemEst.data >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND itemEst.data < TRUNC (p_cab_dataPrecoFinal) + 1
        AND itemEst.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR grad.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR grad.tamanho = p_gradProd_tamanho)
        GROUP BY
          itemEst.data,
          CASE
            WHEN docXEst.id IS NOT NULL
            THEN 'D' || LPAD(itemDoc.idDocumentoFiscal, 14, '0')
            WHEN preXEst.id IS NOT NULL
            THEN 'P' || LPAD (itemPre.preDocumento, 14, '0')
            ELSE 'M' || LPAD (itemEst.idEstoque, 14, '0')
          END) a) a
    WHERE a.ordenacao = 1;
  END IF;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE (v_data, COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
    TRUNC (p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'P');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'P');
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_precoRetornar                IN NUMBER, -- 0 Preco Menos Desconto, 1 Preco Bruto, 2 Preço Reposicao
  p_gerandoInventario            IN NUMBER)
RETURN NUMBER
IS 
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_data               DATE;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX (gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (item.quantidade) = 0
            THEN MAX (item.precoUnitario)
            ELSE ROUND ((SUM (item.valorProdutoServico) / SUM (item.quantidade)),7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorIPIDevolucao
                + CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM(item.quantidade), 7)
            END preco       
        FROM MODOCFISCALXITENS item
        JOIN MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorIPIDevolucao
                - CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (item.quantidade) = 0
            THEN MAX (item.precoUnitario)
            ELSE ROUND ((SUM (item.valorProdutoServico) / SUM (item.quantidade)), 7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorICMSST) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM (item.quantidade), 7)
            END preco       
        FROM MOPREDOCUMXITENS item
        JOIN MOPREDOCUMENTOS doc
        ON doc.preDocumento = item.preDocumento
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorICMSST
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX (a.data),
      COALESCE (MAX (a.preco), 0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC (a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC (a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (item.quantidade) = 0
            THEN MAX (item.precoUnitario)
            ELSE ROUND ((SUM (item.valorProdutoServico) / SUM (item.quantidade)), 7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorIPIDevolucao
                + CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM (item.quantidade), 7)
            END preco       
        FROM MODOCFISCALXITENS item
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = item.gradeProduto
        JOIN MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorIPIDevolucao
                - CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR grad.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR grad.tamanho = p_gradProd_tamanho)
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM (item.quantidade) = 0
            THEN MAX (item.precoUnitario)
            ELSE ROUND ((SUM (item.valorProdutoServico) / SUM (item.quantidade)), 7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorICMSST) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM (item.quantidade), 7)
            END preco       
        FROM MOPREDOCUMXITENS item
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = item.gradeProduto
        JOIN MOPREDOCUMENTOS doc
        ON doc.preDocumento = item.preDocumento
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorICMSST
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC (p_cab_dataPrecoFinal) + 1
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR grad.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR grad.tamanho = p_gradProd_tamanho)
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  END IF;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE (v_data, COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'U');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'U');
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_prod_controleEstoque         IN NUMBER,
  p_gerandoInventario            IN NUMBER)
RETURN NUMBER
IS
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  SELECT
    MAX (a.data),
    COALESCE (MAX (a.novoPrecoCusto), 0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          data Desc,
          novoPrecoCusto Desc) ordenacao,
      data,
      novoPrecoCusto
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND ativo = 1
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR personalizacao = p_item_personalizacao)
    AND data >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
    AND data < TRUNC(p_cab_dataPrecoFinal) + 1) a
  WHERE a.ordenacao = 1;
  IF p_prod_controleEstoque NOT IN (3,4) THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      COALESCE (v_data, COALESCE(TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
      TRUNC(p_cab_dataPrecoFinal),
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      v_preco,
      p_gerandoInventario,
      'F');
    IF v_preco = 0
      AND (p_cab_dataPrecoInicial IS NULL
        OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
        p_config_209_filtrarGrupoEcon,
        p_cab_estabelecimento,
        p_gradProd_produto,
        'P');
    END IF;
    IF v_preco = 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_item_personalizacao,
        p_gradProd_produto,
        p_gradProd_cor,
        p_gradProd_tamanho,
        0, -- p_precoRetornar
        p_gerandoInventario);
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_KIT (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_manterPreco                  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR)
RETURN NUMBER
IS 
  v_preco      NUMBER;
  v_precoFilho NUMBER;
BEGIN
  v_preco := 0;
  FOR kit IN (
    SELECT 
      kit.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN CAGRADESPRODUTO gradProdPai
    ON gradProdPai.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho)
  LOOP
    v_precoFilho := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ANTERIOR (
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND kit.controleEstoque NOT IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_FORMACAO (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        kit.controleEstoque,
        0); -- p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND kit.controleEstoque NOT IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        2, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_TABELA (
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        1, -- p_precoRetornar
        0); -- p_gerandoInventario
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoFilho = 0 AND kit.controleEstoque IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    IF v_precoFilho <> 0 THEN
      v_preco := v_preco + kit.quantidade * v_precoFilho;
    ELSE
      v_preco := 0;
    END IF;
    EXIT WHEN v_preco = 0;
  END LOOP;
  RETURN v_preco;
END;

/

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

/

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

/

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_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_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_dataPrecoFinalInicial
        p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
        p_cab_pessoa,
        ' ', -- p_cab_projeto
        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_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          ' ', -- p_cab_projeto
          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 p_prod_controleEstoque NOT IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', -- p_locEst_indicadorPropPosseIt
          0); -- p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          p_prod_controleEstoque,
          0); --p_gerandoInventario
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND p_prod_controleEstoque NOT IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, -- p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', -- p_locEst_indicadorPropPosseIt
          0); -- p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- R Último Preço de Reposição
      ELSIF p_tipoPreco = 'R' 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          2, -- p_precoRetornar
          0); -- p_gerandoInventario
      -- 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_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          ' ', -- p_cab_projeto
          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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0, -- p_precoRetornar
          0); -- p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          1, -- p_precoRetornar
          0); -- p_gerandoInventario
      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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          ' ', -- p_cab_projeto
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          0, --p_item_pessoaParticipante
          1, --p_quantidade
          p_gradProd_produto,
          '0', --p_locEst_indicadorPropPosseiT
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tipoPreco,
          p_tabelaPreco);
      END IF;
    END IF;
    -- Efetua arredondamento de preço
    v_preco := ROUND (v_preco, TO_NUMBER (p_config_64_casasDecSaidas));
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO2 (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_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,
  p_dataInventario               IN DATE)
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_dataPrecoFinalInicial
        p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
        p_cab_pessoa,
        ' ', -- p_cab_projeto
        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_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          ' ', -- p_cab_projeto
          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 p_prod_controleEstoque NOT IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FPR (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', -- p_locEst_indicadorPropPosseIt
          0, -- p_gerandoInventario
          p_dataInventario,
          NULL); -- p_dataMovimentoEstSaldoInicial
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          p_prod_controleEstoque,
          0); --p_gerandoInventario
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND p_prod_controleEstoque NOT IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, -- p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', -- p_locEst_indicadorPropPosseIt
          0); -- p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- R Último Preço de Reposição
      ELSIF p_tipoPreco = 'R' 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          2, -- p_precoRetornar
          0); -- p_gerandoInventario
      -- 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_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          ' ', -- p_cab_projeto
          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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0, -- p_precoRetornar
          0); -- p_gerandoInventario
      -- 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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          1, -- p_precoRetornar
          0); -- p_gerandoInventario
      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_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          ' ', -- p_cab_projeto
          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_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_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_manterPreco                  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  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;
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 a IN (
    SELECT 
      a.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdPai
    ON gradProdPai.gradeProduto = a.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND a.gradeProdutoFilho > 0
    AND a.ativo = 1
    AND a.quantidade > 0
    AND a.gradeProduto <> a.gradeProdutoFilho)
  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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        a.quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.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 a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_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
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_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
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' THEN
      v_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
        a.produto,
        a.cor,
        a.tamanho,
        2, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        a.quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.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
        a.produto,
        a.cor,
        a.tamanho,
        0, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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
        a.produto,
        a.cor,
        a.tamanho,
        1, -- p_precoRetornar
        0); -- p_gerandoInventario
    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 a.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade * p_item_quantidade,
        a.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 + a.quantidade * v_precoSugestaoAPrazo;
      r_precoSugestaoAVista := r_precoSugestaoAVista + a.quantidade * v_precoSugestaoAVista;
      r_precoDesconto       := r_precoDesconto       + a.quantidade * v_precoDesconto;
      r_precoMinimo         := r_precoMinimo         + a.quantidade * v_precoMinimo;
      r_precoAPrazo         := r_precoAPrazo         + a.quantidade * v_precoAPrazo;
      r_precoAVista         := r_precoAVista         + a.quantidade * v_precoAVista;
      IF v_promocao = 1 THEN
        r_promocao          := 1;
      END IF;  
      r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + a.quantidade * v_precoPromocaoAPrazo;
      r_precoPromocaoAVista := r_precoPromocaoAVista + a.quantidade * v_precoPromocaoAVista;
      r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + a.quantidade * v_precoIndexadoAPrazo;
      r_precoIndexadoAVista := r_precoIndexadoAVista + a.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_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_manterPreco                  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  p_tinta_gradeProduto           IN NUMBER,
  p_tinta_quantidade             IN NUMBER,
  p_ini_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;
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 a IN (
    SELECT 
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto)
  LOOP
    v_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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        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 a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- 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
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND a.controleEstoque NOT IN (3,4) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- 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
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); -- p_gerandoInventario
    -- R Último Preço de Reposição
    ELSIF p_tipoPreco = 'R' THEN
      v_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
        a.produto,
        a.cor,
        a.tamanho,
        2, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        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
        a.produto,
        a.cor,
        a.tamanho,
        0, -- p_precoRetornar
        0); -- p_gerandoInventario
    -- 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
        a.produto,
        a.cor,
        a.tamanho,
        1, -- p_precoRetornar
        0); -- p_gerandoInventario
    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 a.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        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_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_locEst_indicadorPropPosseIt  IN CHAR,
  p_manterPreco                  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  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_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 a IN (
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS base
    ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA
    ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB
    ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC
    ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD
    ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE
    ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF
    ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG
    ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH
    ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI
    ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ
    ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK
    ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL
    ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM
    ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN
    ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO
    ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0)
  LOOP
    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_cab_projeto,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      a.gradeProduto,
      1, --p_tinta_quantidade
      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 a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoA,
        a.quantidadeA / 900, --p_tinta_quantidade
        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 a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoB,
        a.quantidadeB / 900, --p_tinta_quantidade
        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 a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoC,
        a.quantidadeC / 900, --p_tinta_quantidade
        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 a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoD,
        a.quantidadeD / 900, --p_tinta_quantidade
        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 a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoE,
        a.quantidadeE / 900, --p_tinta_quantidade
        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 a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoF,
        a.quantidadeF / 900, --p_tinta_quantidade
        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 a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoG,
        a.quantidadeG / 900, --p_tinta_quantidade
        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 a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoH,
        a.quantidadeH / 900, --p_tinta_quantidade
        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 a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoI,
        a.quantidadeI / 900, --p_tinta_quantidade
        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 a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoJ,
        a.quantidadeJ / 900, --p_tinta_quantidade
        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 a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoK,
        a.quantidadeK / 900, --p_tinta_quantidade
        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 a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoL,
        a.quantidadeL / 900, --p_tinta_quantidade
        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 a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoM,
        a.quantidadeM / 900, --p_tinta_quantidade
        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 a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoN,
        a.quantidadeN / 900, --p_tinta_quantidade
        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 a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.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_cab_projeto,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoO,
        a.quantidadeO / 900, --p_tinta_quantidade
        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_cab_projeto                  IN VARCHAR,
  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_cab_projeto,
          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_cab_projeto,
            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 p_prod_controleEstoque NOT IN (3,4) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_pessoaParticipante,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            0); -- p_gerandoInventario
        -- 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,
            p_prod_controleEstoque,
            0); -- p_gerandoInventario
        -- G Custo Médio da Venda Gerencial (CMV)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'G' AND p_prod_controleEstoque NOT IN (3,4) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_item_pessoaParticipante,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            0); -- p_gerandoInventario
        -- 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_item_pessoaParticipante,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            0); -- p_gerandoInventario
        -- R Último Preço de Reposição
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'R' 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,
            2, -- p_precoRetornar
            0); -- p_gerandoInventario
        -- 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_cab_projeto,
            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, -- p_precoRetornar
            0); -- p_gerandoInventario
        -- 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, -- p_precoRetornar
            0); -- p_gerandoInventario
        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_cab_projeto,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            p_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 p_modDoc_fatorMultiplicador NOT 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_cab_projeto,
          p_modDoc_capituloNaturezaFisc,
          p_modDoc_tipoPrecoB,
          p_modDoc_tabelaPrecoB,
          p_modDoc_fatorMultiplicadorB,
          ' ', -- p_modDoc_tipoPrecoB
          ' ', -- p_modDoc_tabelaPrecoB
          0, -- p_modDoc_fatorMultiplicadorB
          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_manterPreco
          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 PROCEDURE ADD_BUSCA_PRECO_GRADE_PRODUTO (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_orc_pessoa                   IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  r_tipoPreco                    OUT CHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER)
IS
  v_precoAPrazo         NUMBER;
  v_precoAVista         NUMBER;
  v_promocao            NUMBER;
  v_precoPromocaoAPrazo NUMBER;
  v_precoPromocaoAVista NUMBER;
  v_precoIndexadoAPrazo NUMBER;
  v_precoIndexadoAVista NUMBER;
BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  v_precoAPrazo              := 0;
  v_precoAVista              := 0;
  v_promocao                 := 0;
  v_precoPromocaoAPrazo      := 0;
  v_precoPromocaoAVista      := 0;
  v_precoIndexadoAPrazo      := 0;
  v_precoIndexadoAVista      := 0;
  IF p_item_gradeProduto > 0 THEN
    FOR a IN (
      SELECT
        modDoc.capituloNaturezaFiscal,
        modDoc.tipoPreco,
        modDoc.tabelaPreco,
        modDoc.fatorMultiplicadorPreco,
        modDoc.tipoPrecoB,
        modDoc.tabelaPrecoB,
        modDoc.fatorMultiplicadorPrecoB,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE((
          SELECT MAX(munEndEst.uf)
          FROM CAENDERECOSPESSOA endEst
          JOIN SIMUNICIPIOS munEndEst
          ON munEndEst.municipio = endEst.municipio
          WHERE endEst.pessoa = est.pessoaEstabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1),'  ') ufEstabelecimento,
        COALESCE((
          SELECT MAX(munEndPess.uf)
          FROM CAENDERECOSPESSOA endPess
          JOIN SIMUNICIPIOS munEndPess
          ON munEndPess.municipio = endPess.municipio
          WHERE endPess.pessoa = CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END
          AND endPess.ativo = 1
          AND endPess.principal = 1),'  ') ufPessoa
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = p_cab_estabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = p_item_modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE gradProd.gradeProduto = p_item_gradeProduto)
    LOOP
      IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
        r_tipoPreco := 'I';
      ELSE
        IF a.controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
          ADD_BUSCA_PRECO_INTERNO_TINTA (
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.indicadorPropriedadePosseItem,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END, -- p_tipoPreco
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END, -- p_tabelaPreco
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
        ELSE
          -- A Tabela de Preço Anterior
          IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'A' THEN
            ADD_BUSCA_PRECO_INTERNO_ANTER (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- C Custo Médio da Venda (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'C' AND a.controleEstoque NOT IN (3,4) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); -- p_gerandoInventario
          -- F Formação Preço (Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'F' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              a.controleEstoque,
              0); -- p_gerandoInventario
          -- G Custo Médio da Venda Gerencial (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'G' AND a.controleEstoque NOT IN (3,4) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); -- p_gerandoInventario
          -- P Preço de Custo (Último Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'P' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); -- p_gerandoInventario
          -- R Último Preço de Reposição
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'R' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              2, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- T Tabela de Preço
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'T' THEN
            ADD_BUSCA_PRECO_INTERNO_TABELA (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- U Última Compra
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'U' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              0, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- 2 Última Compra Bruto
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = '2' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              1, -- p_precoRetornar
              0); -- p_gerandoInventario
          END IF;
          IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END NOT IN ('A','T') THEN
            r_tabelaPreco              := ' ';
            r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
            r_precoDesconto            := 0;
            r_precoMinimo              := 0;
            r_informarPrecoManualmente := 0;
            v_precoAPrazo              := r_precoSugestaoAPrazo;
            v_precoAVista              := r_precoSugestaoAPrazo;
            v_promocao                 := 0;
            v_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
            v_precoPromocaoAVista      := r_precoSugestaoAPrazo;
            v_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
            v_precoIndexadoAVista      := r_precoSugestaoAPrazo;
          END IF;
          -- 3 = Combo / 4 = Kit
          IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
            ADD_BUSCA_PRECO_INTERNO_KIT (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_quantidade,
              a.produto,
              a.indicadorPropriedadePosseItem,
              p_manterPreco,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          END IF;
        END IF;
        -- Se encontrou preço
        IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR v_precoAPrazo <> 0 OR v_precoAVista <> 0 OR v_precoPromocaoAPrazo <> 0 OR v_precoPromocaoAVista <> 0 OR v_precoIndexadoAPrazo <> 0 OR v_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
          r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END;
          IF a.fatorMultiplicadorPreco NOT IN (0,1) AND (p_manterPreco = 0 OR p_tipoPreco = a.tipoPreco AND p_tabelaPreco = a.tabelaPreco) THEN
            r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * a.fatorMultiplicadorPreco;
            r_precoSugestaoAVista := r_precoSugestaoAVista * a.fatorMultiplicadorPreco;
            r_precoDesconto       := r_precoDesconto       * a.fatorMultiplicadorPreco;
            r_precoMinimo         := r_precoMinimo         * a.fatorMultiplicadorPreco;
            v_precoAPrazo         := v_precoAPrazo         * a.fatorMultiplicadorPreco;
            v_precoAVista         := v_precoAVista         * a.fatorMultiplicadorPreco;
            v_precoPromocaoAPrazo := v_precoPromocaoAPrazo * a.fatorMultiplicadorPreco;
            v_precoPromocaoAVista := v_precoPromocaoAVista * a.fatorMultiplicadorPreco;
            v_precoIndexadoAPrazo := v_precoIndexadoAPrazo * a.fatorMultiplicadorPreco;
            v_precoIndexadoAVista := v_precoIndexadoAVista * a.fatorMultiplicadorPreco;
          END IF;
        -- Se não encontrou preço, não mantém o atual e existe regra de preço B
        ELSIF p_manterPreco = 0 AND a.tipoPrecoB <> ' ' THEN
          ADD_BUSCA_PRECO (
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            a.fatorMultiplicadorPrecoB,
            ' ', --a.tipoPrecoB
            ' ', --a.tabelaPrecoB
            0, --a.fatorMultiplicadorPrecoB
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.produto,
            a.cor,
            a.tamanho,
            a.controleEstoque,
            a.indicadorPropriedadePosseItem,
            0, --p_manterPreco
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            r_tipoPreco,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
          -- Se não encontrou preço B, devolve tipo preço e tabela atual
          IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND v_precoAPrazo = 0 AND v_precoAVista = 0 AND v_precoPromocaoAPrazo = 0 AND v_precoPromocaoAVista = 0 AND v_precoIndexadoAPrazo = 0 AND v_precoIndexadoAVista = 0 AND a.tipoPrecoB <> 'I' THEN
            r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
            r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
          END IF;
        -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
        ELSE
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
        END IF;
        -- Efetua arredondamento de preço
        r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER (CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      END IF;
    END LOOP;
  END IF;
END ADD_BUSCA_PRECO_GRADE_PRODUTO;

/

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

/

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

/

create or replace PROCEDURE ADD_GERA_TEMP_CMV (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessao               IN NUMBER,
  p_produto                      IN NUMBER)
IS
  v_ultimoAgrupador   VARCHAR2 (100);
  v_agrupador         NUMBER;
  v_quebra            CHAR(9);
  v_quantidadeEstoque NUMBER;
  v_precoCustoMedio   NUMBER;
  v_totalCustoMedio   NUMBER;
BEGIN
  -- FISCAL
  v_ultimoAgrupador   := ' ';
  v_agrupador         := 0;
  v_quebra            := '000000000';
  v_quantidadeEstoque := 0;
  v_precoCustoMedio   := 0;
  v_totalCustoMedio   := 0;
  FOR a IN (
    SELECT
      p_sessaoClient sessaoClient,
      p_contadorSessao contadorSessao,
      p_produto produto,
      a.agrupador,
      a.tabelaSistema,
      a.id,
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao
    FROM (
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || itemInv.indicadorPropriedadePosseItem || '|'
          || LPAD (itemInv.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (invEst.estabelecimento, 14, '0') || '|'
             END agrupador,
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXFISC' tabelaSistema,
        itemInv.id,
        gradProd.cor,
        gradProd.tamanho,
        0 personalizacao,
        invEst.estabelecimento,
        itemInv.indicadorPropriedadePosseItem,
        itemInv.pessoaParticipante,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) totalCustoOperacao
      FROM MOINVENTARIOESTOQUEXFISC itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemInv.inventarioEstoque
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = invEst.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.produto = p_produto
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || mov.indicadorPropriedadePosseItem || '|'
          || LPAD (mov.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (mov.estabelecimento, 14, '0') || '|'
             END agrupador,
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        gradProd.cor,
        gradProd.tamanho,
        mov.personalizacao,
        mov.estabelecimento,
        mov.indicadorPropriedadePosseItem,
        mov.pessoaParticipante,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao totalCustoOperacao
      FROM MOESTOQUES mov
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = mov.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = mov.gradeProduto
      WHERE mov.operacaoInternaEstoque IN (102,900)
      AND mov.produto = p_produto
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || locEst.indicadorPropriedadePosseItem || '|'
          || LPAD (itemDoc.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (cabDoc.estabelecimento, 14, '0') || '|'
             END agrupador,
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXITENS' tabelaSistema,
        itemDoc.idItemDocFiscal id,
        gradProd.cor,
        gradProd.tamanho,
        itemDoc.personalizacao,
        cabDoc.estabelecimento,
        locEst.indicadorPropriedadePosseItem,
        itemDoc.pessoaParticipante,
        cabDoc.entradaSaida,
        itemDoc.quantidade,
        itemDoc.valorCustoOperacao totalCustoOperacao
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = cabDoc.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemDoc.gradeProduto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND gradProd.produto = p_produto
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal)
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || locEst.indicadorPropriedadePosseItem || '|'
          || LPAD (itemDoc.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (cabDoc.estabelecimento, 14, '0') || '|'
             END agrupador,
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXPRODUTOFILHO' tabelaSistema,
        filhoDoc.id,
        gradProd.cor,
        gradProd.tamanho,
        filhoDoc.personalizacao,
        cabDoc.estabelecimento,
        locEst.indicadorPropriedadePosseItem,
        itemDoc.pessoaParticipante,
        cabDoc.entradaSaida,
        filhoDoc.quantidade,
        filhoDoc.totalCustoOperacao totalCustoOperacao
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = cabDoc.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND filhoDoc.produto = p_produto) a
    ORDER BY
      agrupador,
      TRUNC(a.data),
      a.operacao,
      TO_CHAR (a.data,'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_ultimoAgrupador < a.agrupador THEN
      v_ultimoAgrupador := a.agrupador;
      v_agrupador := v_agrupador + 1;
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      v_quantidadeEstoque := 0;
      v_precoCustoMedio := 0;
      v_totalCustoMedio := 0;
    ELSIF v_quebra < TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao) THEN
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidadeEstoque := 0;
        v_precoCustoMedio := 0;
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSIF v_quantidadeEstoque > a.quantidade THEN
          IF v_totalCustoMedio + a.totalCustoOperacao > 9999999999999.99 THEN
             v_totalCustoMedio := 9999999999999.99;
          ELSE
             v_totalCustoMedio := v_totalCustoMedio + a.totalCustoOperacao;
          END IF;
        ELSIF a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - a.totalCustoOperacao;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
      IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 AND ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedio := 99999999.9999999;
      ELSIF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 THEN
        v_precoCustoMedio := ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
      IF v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      ELSIF v_quantidadeEstoque > a.quantidade THEN
        IF v_totalCustoMedio + a.quantidade * v_precoCustoMedio > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := v_totalCustoMedio + a.quantidade * v_precoCustoMedio;
        END IF;
      ELSIF v_quantidadeEstoque * v_precoCustoMedio > 9999999999999.99 THEN
         v_totalCustoMedio := 9999999999999.99;
      ELSE
         v_totalCustoMedio := v_quantidadeEstoque * v_precoCustoMedio;
      END IF;
    ELSE
      v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
      v_totalCustoMedio := v_totalCustoMedio - a.quantidade * v_precoCustoMedio;
      IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    INSERT INTO TEMPCMV (
      sessaoClient,
      contadorSessao,
      produto,
      fiscalGerencial,
      tabelaSistema,
      id,
      agrupador,
      data,
      operacao,
      hora,
      cor,
      tamanho,
      personalizacao,
      estabelecimento,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      entradaSaida,
      quantidade,
      totalCustoOperacao,
      quantidadeEstoque,
      precoCustoMedio,
      totalCustoMedio)
    VALUES (
      a.sessaoClient,
      a.contadorSessao,
      a.produto,
      'F',
      a.tabelaSistema,
      a.id,
      v_agrupador,
      a.data,
      a.operacao,
      a.hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao,
      v_quantidadeEstoque,
      v_precoCustoMedio,
      v_totalCustoMedio);
  END LOOP;
  -- GERENCIAL
  v_ultimoAgrupador   := ' ';
  v_agrupador         := 0;
  v_quebra            := '000000000';
  v_quantidadeEstoque := 0;
  v_precoCustoMedio   := 0;
  v_totalCustoMedio   := 0;
  FOR a IN (
    SELECT
      p_sessaoClient sessaoClient,
      p_contadorSessao contadorSessao,
      p_produto produto,
      a.agrupador,
      a.tabelaSistema,
      a.id,
      TRUNC (a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao
    FROM (
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (itemInv.personalizacao, 7, '0') || LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || itemInv.indicadorPropriedadePosseItem || '|'
          || LPAD (itemInv.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (invEst.estabelecimento, 14, '0') || '|'
             END agrupador,
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXITENS' tabelaSistema,
        itemInv.idItemInventarioEstoque id,
        gradProd.cor,
        gradProd.tamanho,
        itemInv.personalizacao,
        invEst.estabelecimento,
        itemInv.indicadorPropriedadePosseItem,
        itemInv.pessoaParticipante,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND (itemInv.quantidade * itemInv.precoUnitarioCMV, 2) totalCustoOperacao
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = itemInv.inventarioEstoque
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = invEst.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.produto = p_produto
      UNION ALL
      SELECT
        CASE
          WHEN p_config_362_calcCustoPorGrade = 0
          THEN ''
          ELSE LPAD (mov.personalizacao, 7, '0') || LPAD (gradProd.cor, 7, '0') || '|' || gradProd.tamanho || '|'
        END
          || mov.indicadorPropriedadePosseItem || '|'
          || LPAD (mov.pessoaParticipante, 14, '0') || '|'
          || CASE
               WHEN p_config_209_filtrarGrupoEcon = 1
                 AND est.pessoaEstabelecimento > 0
                 AND pessEst.grupoEconomico > 0
               THEN 'G' || '|' || LPAD (pessEst.grupoEconomico, 14, '0') || '|'
               WHEN est.pessoaEstabelecimento > 0
               THEN 'P' || '|' || LPAD (est.pessoaEstabelecimento, 14, '0') || '|'
               ELSE 'E' || '|' || LPAD (mov.estabelecimento, 14, '0') || '|'
             END agrupador,
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        gradProd.cor,
        gradProd.tamanho,
        mov.personalizacao,
        mov.estabelecimento,
        mov.indicadorPropriedadePosseItem,
        mov.pessoaParticipante,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao totalCustoOperacao
      FROM MOESTOQUES mov
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = mov.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = mov.gradeProduto
      WHERE mov.produto = p_produto) a
    ORDER BY
      agrupador,
      TRUNC(a.data),
      a.operacao,
      TO_CHAR (a.data,'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_ultimoAgrupador < a.agrupador THEN
      v_ultimoAgrupador := a.agrupador;
      v_agrupador := v_agrupador + 1;
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      v_quantidadeEstoque := 0;
      v_precoCustoMedio := 0;
      v_totalCustoMedio := 0;
    ELSIF v_quebra < TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao) THEN
      v_quebra := TO_CHAR (a.data,'YYYYMMDD') || TO_CHAR (a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidadeEstoque := 0;
        v_precoCustoMedio := 0;
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSIF v_quantidadeEstoque > a.quantidade THEN
          IF v_totalCustoMedio + a.totalCustoOperacao > 9999999999999.99 THEN
             v_totalCustoMedio := 9999999999999.99;
          ELSE
             v_totalCustoMedio := v_totalCustoMedio + a.totalCustoOperacao;
          END IF;
        ELSIF a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := a.totalCustoOperacao * v_quantidadeEstoque / a.quantidade;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - a.totalCustoOperacao;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
      IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 AND ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedio := 99999999.9999999;
      ELSIF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 THEN
        v_precoCustoMedio := ROUND (v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidadeEstoque := v_quantidadeEstoque + a.quantidade;
      IF v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      ELSIF v_quantidadeEstoque > a.quantidade THEN
        IF v_totalCustoMedio + a.quantidade * v_precoCustoMedio > 9999999999999.99 THEN
           v_totalCustoMedio := 9999999999999.99;
        ELSE
           v_totalCustoMedio := v_totalCustoMedio + a.quantidade * v_precoCustoMedio;
        END IF;
      ELSIF v_quantidadeEstoque * v_precoCustoMedio > 9999999999999.99 THEN
         v_totalCustoMedio := 9999999999999.99;
      ELSE
         v_totalCustoMedio := v_quantidadeEstoque * v_precoCustoMedio;
      END IF;
    ELSE
      v_quantidadeEstoque := v_quantidadeEstoque - a.quantidade;
      v_totalCustoMedio := v_totalCustoMedio - a.quantidade * v_precoCustoMedio;
      IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
        v_totalCustoMedio := 0;
      END IF;
    END IF;
    INSERT INTO TEMPCMV (
      sessaoClient,
      contadorSessao,
      produto,
      fiscalGerencial,
      tabelaSistema,
      id,
      agrupador,
      data,
      operacao,
      hora,
      cor,
      tamanho,
      personalizacao,
      estabelecimento,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      entradaSaida,
      quantidade,
      totalCustoOperacao,
      quantidadeEstoque,
      precoCustoMedio,
      totalCustoMedio)
    VALUES (
      a.sessaoClient,
      a.contadorSessao,
      a.produto,
      'G',
      a.tabelaSistema,
      a.id,
      v_agrupador,
      a.data,
      a.operacao,
      a.hora,
      a.cor,
      a.tamanho,
      a.personalizacao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.entradaSaida,
      a.quantidade,
      a.totalCustoOperacao,
      v_quantidadeEstoque,
      v_precoCustoMedio,
      v_totalCustoMedio);
  END LOOP;
END ADD_GERA_TEMP_CMV;

/

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

/

create or replace PROCEDURE ADD_GERA_TEMP_INVENTARIO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_335_cmvGerencIgualFis IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoFiscal         IN NUMBER,
  p_contadorSessaoGerencial      IN NUMBER,
  p_gerandoInventario            IN NUMBER,
  p_buscarPrecoUnitarioCMV       IN NUMBER,
  p_buscarPrecoUnitUltimaCompra  IN NUMBER,
  p_buscarPrecoCustoUltimaCompra IN NUMBER,
  p_buscarPrecoCustoUltimaFormac IN NUMBER,
  p_buscarICMS                   IN NUMBER,
  p_invEst_data                  IN DATE,
  p_invEst_motivoInventario      IN CHAR,
  p_inEstabelecimentos           IN VARCHAR2,
  p_produto                      IN NUMBER,
  p_prod_join                    IN VARCHAR2,
  p_prod_andWhere                IN VARCHAR2,
  p_filtroProduto                IN NUMBER,
  p_inventario_join              IN VARCHAR2,
  p_inventario_andWhere          IN VARCHAR2,
  p_movimentos_join              IN VARCHAR2,
  p_movimentos_andWhere          IN VARCHAR2,
  p_docFiscal_join               IN VARCHAR2,
  p_docFiscal_andWhere           IN VARCHAR2,
  p_docFiscalFilho_join          IN VARCHAR2,
  p_docFiscalFilho_andWhere      IN VARCHAR2,
  p_transfPendente_considerar    IN NUMBER,
  p_transfPendente_joinEntradas  IN VARCHAR2,
  p_transfPendente_andWhereEntra IN VARCHAR2,
  p_transfPendente_joinSaidas    IN VARCHAR2,
  p_transfPendente_andWhereSaida IN VARCHAR2)
IS
  v_prod_join     CLOB;
  v_prod_andWhere CLOB;
BEGIN
  v_prod_join := '
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_prod_join IS NULL OR p_prod_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_prod_join)
   END
|| CASE
     WHEN p_produto <> 0 OR p_filtroProduto = 0
     THEN ''
     ELSE '
    JOIN PAFILTROSPRODUTO filtrProd
    ON filtrProd.filtroProduto = ' || TO_CHAR(p_filtroProduto)
   END;
  v_prod_andWhere := '
      AND gradProd.produto '
|| CASE
     WHEN  p_produto = 0
     THEN '> 0'
       || CASE
            WHEN p_prod_andWhere IS NULL OR p_prod_andWhere = ' '
            THEN '
    AND prod.controleEstoque IN (1,5,11,12,13)'
            ELSE '
    ' || RTRIM(p_prod_andWhere)
          END
       || CASE
            WHEN p_filtroProduto = 0
            THEN ''
            ELSE '
    AND filtrProd.filtrarVendedores              = 0
    AND filtrProd.filtrarLocaisEstoque           = 0
    AND filtrProd.filtrarPersonalizacoes         = 0
    AND (filtrProd.filtrarProdutos               = 0
      AND filtrProd.filtrarCategoriasProdutos    = 0
      AND filtrProd.filtrarSubcategoriasProdutos = 0
      AND filtrProd.filtrarMarcas                = 0
      AND filtrProd.filtrarCaracteristicasA      = 0
      AND filtrProd.filtrarCaracteristicasB      = 0
      AND filtrProd.filtrarCaracteristicasC      = 0
      AND filtrProd.filtrarCaracteristicasD      = 0
      AND filtrProd.filtrarCaracteristicasE      = 0
      AND filtrProd.filtrarCores                 = 0
      AND filtrProd.filtrarTamanhos              = 0
      AND filtrProd.filtrarNCMs                  = 0
      AND filtrProd.filtrarListasServicos        = 0
      OR filtrProd.filtrarProdutos               = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
        WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
        AND filtrProdX.produto = prod.produto
        AND filtrProdX.ativo = 1)
      OR (filtrProd.filtrarCategoriasProdutos     = 1
        OR filtrProd.filtrarSubcategoriasProdutos = 1
        OR filtrProd.filtrarMarcas                = 1
        OR filtrProd.filtrarCaracteristicasA      = 1
        OR filtrProd.filtrarCaracteristicasB      = 1
        OR filtrProd.filtrarCaracteristicasC      = 1
        OR filtrProd.filtrarCaracteristicasD      = 1
        OR filtrProd.filtrarCaracteristicasE      = 1
        OR filtrProd.filtrarCores                 = 1
        OR filtrProd.filtrarTamanhos              = 1
        OR filtrProd.filtrarNCMs                  = 1
        OR filtrProd.filtrarListasServicos        = 1)
      AND (filtrProd.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD filtrProdX
          JOIN PASUBCATEGORIASPRODUTO subCatX
          ON subCatX.categoriaProduto = filtrProdX.categoriaProduto
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND subCatX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.marca = prod.marca
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaA = prod.caracteristicaA
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaB = prod.caracteristicaB
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaC = prod.caracteristicaC
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaD = prod.caracteristicaD
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaE = prod.caracteristicaE
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.cor = gradProd.Cor
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.tamanho = gradProd.tamanho
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.idNcm = prod.idNcm
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.listaServicos = prod.listaServicos
          AND filtrProdX.ativo = 1)))'
          END
     ELSE ' = ' || TO_CHAR(p_produto)
   END;
  IF p_contadorSessaoFiscal <> 0 THEN
    DELETE TEMPINVENTARIOESTXFISCAL
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoFiscal;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXFISCAL (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  produto,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  quantidade,
  precoUnitarioCMV,
  stICMS,
  baseICMS,
  valorICMS)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXFISC AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      gradProd.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          gradProd.produto
        ORDER BY
          invEst.estabelecimento ASC,
          gradProd.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXFISC itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE ((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'',''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      gradProd.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          gradProd.produto
        ORDER BY
          mov.estabelecimento ASC,
          gradProd.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoFiscal) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante),
  a.estabelecimento,
  a.produto,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  ''00'' stICMS,
  0 baseICMS,
  0 valorICMS
FROM (
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
    WHERE dataInvFisc.estabelecimento = invEst.estabelecimento
    AND dataInvFisc.produto = gradProd.produto))
  AND NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXFISC dataInvFisc
  ON dataInvFisc.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvFisc.produto = gradProd.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = dataInvFisc.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    mov.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
  WHERE mov.operacaoInternaEstoque IN (1,900)
  AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemDoc.idItemDocFiscal id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    itemDoc.gradeProduto,
    itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_docFiscal_join IS NULL OR p_docFiscal_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))
  AND NOT(EXISTS(
    SELECT 1
    FROM MODOCFISCALXPRODUTOFILHO filhoDoc
    WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_docFiscal_andWhere IS NULL OR p_docFiscal_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    filhoDoc.id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    filhoDoc.gradeProduto,
    filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXPRODUTOFILHO filhoDoc
  JOIN MODOCFISCALXITENS itemDoc
  ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = filhoDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR (p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN (a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXFISCAL a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXFISCAL b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS (
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarICMS = 1 THEN
      EXECUTE IMMEDIATE 'DECLARE
  v_stICMS           CHAR (2);
  v_baseICMS         NUMBER;
  v_valorICMS        NUMBER;
  v_existeEntrada    NUMBER;
  v_precoUnitarioCMV NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.produto,
      a.controleEstoque,'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
      a.gradeProduto,
      a.cor,
      a.tamanho,'
           ELSE ''
          END
      || '
      a.precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento,
        MAX(a.precoUnitarioCMV) precoUnitarioCMV
      FROM TEMPINVENTARIOESTXFISCAL a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = a.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        a.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    v_stICMS           := ''00'';
    v_baseICMS         := 0;
    v_valorICMS        := 0;
    v_existeEntrada    := 0;
    v_precoUnitarioCMV := 0;
    SELECT
      COALESCE (MAX (b.stICMS),''00''),
      COALESCE (MAX (b.baseICMS),0),
      COALESCE (MAX (b.valorICMS),0),
      COALESCE (MAX (b.existeEntrada),0)
    INTO
      v_stICMS,
      v_baseICMS,
      v_valorICMS,
      v_existeEntrada
    FROM (
      SELECT
        CASE
          WHEN b.nfFornecedor = 1
            AND b.stICMSEscrituracao <> ''  ''
          THEN b.stICMSEscrituracao
          WHEN b.stICMS <> ''  ''
          THEN b.stICMS
          ELSE ''90''
        END stICMS,
        ROUND((
          CASE
            WHEN b.nfFornecedor = 1
            AND (b.stICMSEscrituracao IN(''10'',''30'',''70'')
                OR b.stICMSEscrituracao = ''90''
                AND b.aliquotaICMSSTEscrituracao > 0)
              OR (b.nfFornecedor = 0
                OR b.stICMSEscrituracao = ''  ''
                OR b.stICMSEscrituracao = ''60'')
              AND (b.stICMS IN(''10'',''30'',''70'')
                OR b.stICMS = ''90''
                AND b.aliquotaICMSST > 0
                OR b.stSimplesNacional IN(''201'',''202'')
                OR b.stSimplesNacional = ''900''
                AND b.aliquotaICMSST > 0)
            THEN
              CASE
                WHEN b.nfFornecedor = 1 AND b.baseICMSSTEscrituracao <> 0
                THEN b.baseICMSSTEscrituracao
                WHEN b.baseICMSST <> 0
                THEN b.baseICMSST
                ELSE b.baseICMS
              END *
                CASE
                  WHEN b.valorCustoOperacao = 0 OR b.totalCustoOperacao = 0
                  THEN 1 / b.quantidade
                  ELSE (1 / b.quantidadeEstoque)
                    * (b.totalCustoOperacao / b.valorCustoOperacao)
                END
            ELSE 0
          END), 2) baseICMS,
        ROUND ((
          CASE
            WHEN b.nfFornecedor = 1
            AND (b.stICMSEscrituracao IN(''10'',''30'',''70'')
                OR b.stICMSEscrituracao = ''90''
                AND b.aliquotaICMSSTEscrituracao > 0)
              OR (b.nfFornecedor = 0
                OR b.stICMSEscrituracao = ''  ''
                OR b.stICMSEscrituracao = ''60'')
              AND (b.stICMS IN(''10'',''30'',''70'')
                OR b.stICMS = ''90''
                AND b.aliquotaICMSST > 0
                OR b.stSimplesNacional IN(''201'',''202'')
                OR b.stSimplesNacional = ''900''
                AND b.aliquotaICMSST > 0)
            THEN
              CASE
                WHEN b.nfFornecedor = 1 AND b.baseICMSSTEscrituracao <> 0
                THEN b.valorICMSEscrituracao + b.valorICMSSTEscrituracao
                ELSE b.valorICMS + b.valorICMSST
              END *
                CASE
                  WHEN b.valorCustoOperacao = 0 OR b.totalCustoOperacao = 0
                  THEN 1 / b.quantidade
                  ELSE (1 / b.quantidadeEstoque)
                    * (b.totalCustoOperacao / b.valorCustoOperacao)
                END
            ELSE 0
          END),2) valorICMS,
        1 existeEntrada,
        ROW_NUMBER() OVER (
          ORDER BY b.dataEntradaSaida DESC) ordenacao
      FROM (
        SELECT
          b.idDocumentoFiscal,
          b.estabelecimento,
          b.dataEntradaSaida,
          b.nfFornecedor,
          b.produto,
          b.stSimplesNacional,
          b.stICMS,
          b.aliquotaICMSST,
          b.stICMSEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          SUM (b.quantidade) quantidade,
          SUM (b.baseICMS) baseICMS,
          SUM (b.valorICMS) valorICMS,
          SUM (b.baseICMSST) baseICMSST,
          SUM (b.valorICMSST) valorICMSST,
          SUM (b.valorICMSEscrituracao) valorICMSEscrituracao,
          SUM (b.baseICMSSTEscrituracao) baseICMSSTEscrituracao,
          SUM (b.valorICMSSTEscrituracao) valorICMSSTEscrituracao,
          SUM (b.valorCustoOperacao) valorCustoOperacao,
          SUM (b.quantidadeEstoque) quantidadeEstoque,
          SUM (b.totalCustoOperacao) totalCustoOperacao
        FROM (
          SELECT
            itemDoc.idDocumentoFiscal,
            cabDoc.estabelecimento,
            cabDoc.dataEntradaSaida,
            cabDoc.nfFornecedor,
            docXEst.idItemDocFiscal,
            est.produto,
            itemDoc.stSimplesNacional,
            itemDoc.stICMS,
            itemDoc.aliquotaICMSST,
            itemDoc.stICMSEscrituracao,
            itemDoc.aliquotaICMSSTEscrituracao,
            itemDoc.quantidade,
            itemDoc.baseICMS,
            itemDoc.valorICMS,
            itemDoc.baseICMSST,
            itemDoc.valorICMSST,
            itemDoc.valorICMSEscrituracao,
            itemDoc.baseICMSSTEscrituracao,
            itemDoc.valorICMSSTEscrituracao,
            itemDoc.valorCustoOperacao,
            SUM (est.quantidade) quantidadeEstoque,
            SUM (est.totalCustoOperacao) totalCustoOperacao
          FROM MOESTOQUES est
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = est.gradeProduto
          JOIN MODOCFISCALXESTOQUE docXEst
          ON docXEst.idEstoque = est.idEstoque
          JOIN MODOCFISCALXITENS itemDoc
          ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
          JOIN MODOCUMENTOSFISCAIS cabDoc
          ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
          WHERE est.entradaSaida = ''E''
          AND est.atualizaUltimaCompra = 1
          AND cabDoc.dataEntradaSaida < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
          AND (est.gradeProduto = itemDoc.gradeProduto
            OR NOT EXISTS (
              SELECT 1
              FROM CAGRADEPRODUTOXKITSCOMBOS kit
              WHERE kit.gradeProduto = itemDoc.gradeProduto
              AND kit.gradeProdutoFilho = est.gradeProduto
              AND kit.ativo = 1
              AND kit.manterUltimoCusto = 1))
          GROUP BY
            itemDoc.idDocumentoFiscal,
            cabDoc.estabelecimento,
            cabDoc.dataEntradaSaida,
            cabDoc.nfFornecedor,
            docXEst.idItemDocFiscal,
            est.produto,
            itemDoc.stSimplesNacional,
            itemDoc.stICMS,
            itemDoc.aliquotaICMSST,
            itemDoc.stICMSEscrituracao,
            itemDoc.aliquotaICMSSTEscrituracao,
            itemDoc.quantidade,
            itemDoc.baseICMS,
            itemDoc.valorICMS,
            itemDoc.baseICMSST,
            itemDoc.valorICMSST,
            itemDoc.valorICMSEscrituracao,
            itemDoc.baseICMSSTEscrituracao,
            itemDoc.valorICMSSTEscrituracao,
            itemDoc.valorCustoOperacao) b
      GROUP BY
        b.idDocumentoFiscal,
        b.estabelecimento,
        b.dataEntradaSaida,
        b.nfFornecedor,
        b.produto,
        b.stSimplesNacional,
        b.stICMS,
        b.aliquotaICMSST,
        b.stICMSEscrituracao,
        b.aliquotaICMSSTEscrituracao) b
      WHERE b.produto = a.produto
      AND (b.estabelecimento = a.estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = b.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = a.estabelecimento)'
        || CASE
             WHEN p_config_209_filtrarGrupoEcon = 1
             THEN '
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = b.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = a.estabelecimento)'
             ELSE ''
           END
        || ')) b
    WHERE b.ordenacao = 1;
    IF (v_existeEntrada = 0 OR v_stICMS = ''00'') AND v_valorICMS = 0 THEN
      v_stICMS   := ''00'';
      v_baseICMS := ROUND (FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR (p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        0, -- p_retornarPrecoBruto
        ' || TO_CHAR(p_gerandoInventario) || '),2);
      IF v_baseICMS = 0 THEN
        v_baseICMS := ROUND (FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR (p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || '),2);
      END IF;
      IF v_baseICMS = 0 THEN
        v_baseICMS := ROUND (FUNC_ADD_BUSCA_PRECO_FORMACAO (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ', -- p_item_personalizacao
        a.produto, -- p_gradProd_produto
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ', -- p_gradProd_cor
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ', -- p_gradProd_tamanho
        a.controleEstoque, -- p_prod_controleEstoque
        ' || TO_CHAR(p_gerandoInventario) || '),2); -- p_gerandoInventario
      END IF;
      IF v_baseICMS = 0 THEN
        v_baseICMS := a.precoUnitarioCmv;
      END IF;
      v_valorICMS := ROUND(v_baseICMS * 0.17,2);
    END IF;'
      || CASE
           WHEN p_invEst_motivoInventario = '02'
           THEN '
    IF v_valorICMS > 0 THEN
      v_precoUnitarioCMV := a.precoUnitarioCMV - v_valorICMS;
      IF v_precoUnitarioCMV < 0 THEN
        v_precoUnitarioCMV := 0;
      END IF;
    ELSE
      v_precoUnitarioCMV := a.precoUnitarioCMV;
    END IF;'
           ELSE '
    v_precoUnitarioCMV := a.precoUnitarioCMV;'
         END
      || '
    UPDATE TEMPINVENTARIOESTXFISCAL b SET
      b.stICMS           = v_stICMS,
      b.baseICMS         = v_baseICMS,
      b.valorICMS        = v_valorICMS'
      || CASE
           WHEN p_invEst_motivoInventario = '02'
           THEN ',
      b.precoUnitarioCMV = v_precoUnitarioCMV'
           ELSE ''
         END
      || '
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS (
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
  END IF;
  IF p_contadorSessaoGerencial <> 0 THEN
    DELETE TEMPINVENTARIOESTXGERENC
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoGerencial;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXGERENC (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  produto,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  localEstoque,
  personalizacao,
  idLoteEstoque,
  idNumeroSerie,
  quantidade,
  precoUnitarioCMV,
  precoUnitarioUltimaCompra,
  precoCustoUltimaCompra,
  precoCustoUltimaFormacao)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXITENS AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      itemInv.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          itemInv.produto
        ORDER BY
          invEst.estabelecimento ASC,
          itemInv.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE ((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      mov.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          mov.produto
        ORDER BY
          mov.estabelecimento ASC,
          mov.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE ((
      SELECT MAX (dataInvGer.data) + 1
      FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
      WHERE dataInvGer.estabelecimento = mov.estabelecimento
      AND dataInvGer.produto = mov.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoGerencial) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie),
  a.estabelecimento,
  a.produto,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.localEstoque,
  a.personalizacao,
  a.idLoteEstoque,
  a.idNumeroSerie,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  0 precoUnitarioUltimaCompra,
  0 precoCustoUltimaCompra,
  0 precoCustoUltimaFormacao
FROM (
  SELECT DISTINCT
    itemInv.idItemInventarioEstoque id,
    invEst.estabelecimento,
    itemInv.localEstoque,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.personalizacao,
    itemInv.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN itemInv.idNumeroSerie ELSE 0 END idNumeroSerie,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXITENS itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_join)
   END
|| '
  WHERE NOT EXISTS (
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
    WHERE dataInvGer.estabelecimento = invEst.estabelecimento
    AND dataInvGer.produto = itemInv.produto)
  AND NOT EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = itemInv.produto)'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.idItemInventarioEstoque id,
    invEst.estabelecimento,
    itemInv.localEstoque,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.personalizacao,
    itemInv.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN itemInv.idNumeroSerie ELSE 0 END idNumeroSerie,
    itemInv.quantidade,
    itemInv.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXITENS itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXITENS dataInvGer
  ON dataInvGer.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvGer.produto = itemInv.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_join)
   END
|| '
  WHERE NOT EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = itemInv.produto)'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.localEstoque,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.personalizacao,
    mov.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN mov.idNumeroSerie ELSE 0 END idNumeroSerie,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    mov.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_join)
   END
|| '
  WHERE mov.data < TO_DATE (''' || TO_CHAR (p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = mov.produto),
    COALESCE ((
      SELECT MAX (dataInvGer.data) + 1
      FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
      WHERE dataInvGer.estabelecimento = mov.estabelecimento
      AND dataInvGer.produto = mov.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_andWhere)
   END
|| CASE
     WHEN p_transfPendente_considerar = 0
     THEN ''
     ELSE '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoEntrada estabelecimento,
    itemTransf.localEstoqueEntrada localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteEntrada pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    itemTransf.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueEntrada
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinEntradas IS NULL OR p_transfPendente_joinEntradas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinEntradas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoEntrada = 1
  AND cabTransf.tipoDocumentoEntrada > 100
  AND cabTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoEntrada IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereEntra IS NULL OR p_transfPendente_andWhereEntra = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereEntra)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoSaida estabelecimento,
    itemTransf.localEstoqueSaida localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteSaida pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    (- itemTransf.quantidade) quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueSaida
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinSaidas IS NULL OR p_transfPendente_joinSaidas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinSaidas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoSaida = 1
  AND cabTransf.tipoDocumentoSaida > 100
  AND cabTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoSaida IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereSaida IS NULL OR p_transfPendente_andWhereSaida = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereSaida)
   END
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.localEstoque,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.personalizacao,
  a.idLoteEstoque,
  a.idNumeroSerie,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1
      AND p_config_335_cmvGerencIgualFis = 1
      AND p_contadorSessaoFiscal <> 0
    THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      COALESCE ((
            SELECT MAX (b.precoUnitarioCMV)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '), 0) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN (a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    ELSIF p_buscarPrecoUnitarioCMV = 1
      AND p_config_335_cmvGerencIgualFis = 1
    THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
     ELSIF p_buscarPrecoUnitarioCMV = 1
     THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_MEDIO_GER (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE ((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN (a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
   END IF;
    IF p_buscarPrecoUnitUltimaCompra = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        0, -- p_retornarPrecoBruto
        ' || TO_CHAR (p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoUnitarioUltimaCompra
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioUltimaCompra = a.precoUnitarioUltimaCompra
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS (
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarPrecoCustoUltimaCompra = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR (p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE ((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoCustoUltimaCompra
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoCustoUltimaCompra = a.precoCustoUltimaCompra
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarPrecoCustoUltimaFormac = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_FORMACAO (
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.controleEstoque, -- p_prod_controleEstoque
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX (b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoCustoUltimaFormacao
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto,
        prod.controleEstoque'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoCustoUltimaFormacao = a.precoCustoUltimaFormacao
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
  END IF;
END ADD_GERA_TEMP_INVENTARIO;

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_ESTOQUE_EXCLUI (
  p_idEstoque IN NUMBER)
IS
BEGIN
  UPDATE MODOCTROCAXITENS
  SET idEstoque = 0
  WHERE idEstoque = p_idEstoque;
  DELETE MOORCAMENTOXFICHAXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOPREDOCUMXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MODOCFISCALXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOBALANCOXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MODOCTRANSFXESTOQUE
  WHERE idEstoque = p_idEstoque;
  DELETE MOESTOQUES
  WHERE idEstoque = p_idEstoque;
END ADD_ESTOQUE_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_BALANCO_EXCLUI (
  p_divergenciaBalanco IN NUMBER,
  p_bufferIdEstoque    IN VARCHAR,
  r_bufferIdEstoque    OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MOBALANCOXESTOQUE
    WHERE divergenciaBalanco = p_divergenciaBalanco
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_BALANCO_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_EXCLUI (
  p_idItemDocFiscal IN NUMBER,
  p_bufferIdEstoque IN VARCHAR,
  r_bufferIdEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MODOCFISCALXESTOQUE
    WHERE idItemDocFiscal = p_idItemDocFiscal
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque)
      || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_EXCLUI (
  p_idItemPreDocumento IN NUMBER,
  p_bufferIdEstoque    IN VARCHAR,
  r_bufferIdEstoque    OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MOPREDOCUMXESTOQUE
    WHERE idItemPreDocumento = p_idItemPreDocumento
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque)
      || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_TRANSF_EXCLUI (
  p_idItemDocTransferencia IN NUMBER,
  p_bufferIdEstoque        IN VARCHAR,
  r_bufferIdEstoque        OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MODOCTRANSFXESTOQUE
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque) || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_TRANSF_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_FIC_TEC_EXCLUI (
  p_idFichaProdutoRealOrcamento IN NUMBER,
  p_bufferIdEstoque             IN VARCHAR,
  r_bufferIdEstoque             OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idEstoque
    FROM MOORCAMENTOXFICHAXESTOQUE
    WHERE idFichaProdutoRealOrcamento = p_idFichaProdutoRealOrcamento
	AND idEstoque > 0)
  LOOP
    r_bufferIdEstoque :=
      CASE
        WHEN r_bufferIdEstoque IS NULL
          OR r_bufferIdEstoque = ''
          OR r_bufferIdEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdEstoque)
      || ';'
      END
      || LPAD(a.idEstoque,14,'0');
    ADD_ESTOQUE_EXCLUI (a.idEstoque);
  END LOOP;
END ADD_ESTOQUE_FIC_TEC_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_AT_REAL_EXCLUI (
  p_idAtividadeRealOrcamento IN NUMBER,
  p_bufferIdEstoque          IN VARCHAR,
  r_bufferIdEstoque          OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idFichaProdutoRealOrcamento
    FROM MOORCAMENTOXFICHAPRODREAL
    WHERE idAtividadeRealOrcamento = p_idAtividadeRealOrcamento
	AND idFichaProdutoRealOrcamento > 0)
  LOOP
    ADD_ESTOQUE_FIC_TEC_EXCLUI (
      a.idFichaProdutoRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_AT_REAL_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_AT_PREV_EXCLUI (
  p_idAtividadePrevOrcamento IN NUMBER,
  p_bufferIdEstoque          IN VARCHAR,
  r_bufferIdEstoque          OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadeRealOrcamento
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
	AND idAtividadeRealOrcamento > 0)
  LOOP
    ADD_ESTOQUE_AT_REAL_EXCLUI (
      a.idAtividadeRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_AT_PREV_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_ORCAMENTO_EXCLUI (
  p_idItemOrcamento IN NUMBER,
  p_bufferIdEstoque IN VARCHAR,
  r_bufferIdEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_idItemOrcamento
	AND idAtividadePrevOrcamento > 0)
  LOOP
    ADD_ESTOQUE_AT_PREV_EXCLUI (
      a.idAtividadePrevOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_ORCAMENTO_EXCLUI;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_FIL_EXCL (
  p_idItemDocFiscal      IN NUMBER,
  p_bufferIdProdutoFilho IN VARCHAR,
  r_bufferIdProdutoFilho OUT VARCHAR)
IS
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT id
    FROM MODOCFISCALXESTOQUE
    WHERE idItemDocFiscal = p_idItemDocFiscal
	AND id > 0)
  LOOP
    r_bufferIdProdutoFilho :=
      CASE
        WHEN r_bufferIdProdutoFilho IS NULL
          OR r_bufferIdProdutoFilho = ''
          OR r_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE TRIM (r_bufferIdProdutoFilho)
      || ';'
      END
      || LPAD(a.id, 14, '0');
    DELETE MODOCFISCALXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_FIL_EXCL;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_FIL_EXCL (
  p_idItemPreDocumento   IN NUMBER,
  p_bufferIdProdutoFilho IN VARCHAR,
  r_bufferIdProdutoFilho OUT VARCHAR)
IS
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT id
    FROM MOPREDOCUMXESTOQUE
    WHERE idItemPreDocumento = p_idItemPreDocumento
	AND id > 0)
  LOOP
    r_bufferIdProdutoFilho :=
      CASE
        WHEN r_bufferIdProdutoFilho IS NULL
          OR r_bufferIdProdutoFilho = ''
          OR r_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE TRIM (r_bufferIdProdutoFilho)
      || ';'
      END
      || LPAD(a.id, 14, '0');
    DELETE MOPREDOCUMXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_FIL_EXCL;

/

create or replace PROCEDURE ADD_ESTOQUE_GRAVA (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idEstoque                   IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_data                        IN DATE,
  p_produto                     IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_modeloDocumento             IN NUMBER,
  p_motivoEstoque               IN NUMBER,
  p_operacaoInternaEstoque      IN NUMBER,
  p_atualizaCustoMedio          IN NUMBER,
  p_atualizaUltimaCompra        IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_indicadorPropPosseItem      IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_precoCustoOperacao          IN NUMBER,
  p_totalCustoOperacao          IN NUMBER,
  p_precoCMV                    IN NUMBER,
  p_valorCMV                    IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  p_idFichaProdutoRealOrcamento IN NUMBER,
  p_idItemPreDocumento          IN NUMBER,
  p_idItemDocFiscal             IN NUMBER,
  p_divergenciaBalanco          IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  p_bufferIdEstoque             IN VARCHAR2,
  r_idEstoque                   OUT NUMBER,
  r_bufferIdEstoque             OUT VARCHAR2)
IS
  v_existeRegistro NUMBER;
BEGIN
  IF p_idEstoque > 0 THEN
    r_idEstoque       := p_idEstoque;
    r_bufferIdEstoque := p_bufferIdEstoque;
  ELSIF p_bufferIdEstoque IS NOT NULL
    AND LENGTH (RTRIM (p_bufferIdEstoque)) >= 14
  THEN
    r_idEstoque       := TO_NUMBER (SUBSTR (p_bufferIdEstoque, 1, 14));
    r_bufferIdEstoque := RTRIM (SUBSTR (p_bufferIdEstoque, 16, 32000));
  ELSE
    r_idEstoque := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOESTOQUES',
      'idEstoque',
      14);
    r_bufferIdEstoque := '';
  END IF;
  MERGE INTO MOESTOQUES a 
  USING (
    SELECT
      r_idEstoque              idEstoque,
      p_estabelecimento        estabelecimento,
      p_data                   data,
      p_produto                produto,
      p_gradeProduto           gradeProduto,
      p_modeloDocumento        modeloDocumento,
      p_motivoEstoque          motivoEstoque,
      p_operacaoInternaEstoque operacaoInternaEstoque,
      p_atualizaCustoMedio     atualizaCustoMedio,
      p_atualizaUltimaCompra   atualizaUltimaCompra,
      p_entradaSaida           entradaSaida,
      p_indicadorPropPosseItem indicadorPropriedadePosseItem,
      p_pessoaParticipante     pessoaParticipante,
      p_localEstoque           localEstoque,
      p_personalizacao         personalizacao,
      p_idLoteEstoque          idLoteEstoque,
      p_idNumeroSerie          idNumeroSerie,
      p_quantidade             quantidade,
      p_precoCustoOperacao     precoCustoOperacao,
      p_totalCustoOperacao     totalCustoOperacao,
      p_precoCMV               precoCMV,
      p_valorCMV               valorCMV,
      p_observacoes            observacoes
    FROM DUAL) b
  ON (a.idEstoque = b.idEstoque)
  WHEN MATCHED THEN UPDATE SET
    a.estabelecimento               = b.estabelecimento,
    a.data                          = b.data,
    a.produto                       = b.produto,
    a.gradeProduto                  = b.gradeProduto,
    a.modeloDocumento               = b.modeloDocumento,
    a.motivoEstoque                 = b.motivoEstoque,
    a.operacaoInternaEstoque        = b.operacaoInternaEstoque,
    a.atualizaCustoMedio            = b.atualizaCustoMedio,
    a.atualizaUltimaCompra          = b.atualizaUltimaCompra,
    a.entradaSaida                  = b.entradaSaida,
    a.indicadorPropriedadePosseItem = b.indicadorPropriedadePosseItem,
    a.pessoaParticipante            = b.pessoaParticipante,
    a.localEstoque                  = b.localEstoque,
    a.personalizacao                = b.personalizacao,
    a.idLoteEstoque                 = b.idLoteEstoque,
    a.idNumeroSerie                 = b.idNumeroSerie,
    a.quantidade                    = b.quantidade,
    a.precoCustoOperacao            = b.precoCustoOperacao,
    a.totalCustoOperacao            = b.totalCustoOperacao,
    a.precoCMV                      = b.precoCMV,
    a.valorCMV                      = b.valorCMV,
    a.observacoes                   = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idEstoque,
    estabelecimento,
    data,
    produto,
    gradeProduto,
    modeloDocumento,
    motivoEstoque,
    operacaoInternaEstoque,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    entradaSaida,
    indicadorPropriedadePosseItem,
    pessoaParticipante,
    localEstoque,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    precoCustoOperacao,
    totalCustoOperacao,
    precoCMV,
    valorCMV,
    observacoes)
  VALUES (
    b.idEstoque,
    b.estabelecimento,
    b.data,
    b.produto,
    b.gradeProduto,
    b.modeloDocumento,
    b.motivoEstoque,
    b.operacaoInternaEstoque,
    b.atualizaCustoMedio,
    b.atualizaUltimaCompra,
    b.entradaSaida,
    b.indicadorPropriedadePosseItem,
    b.pessoaParticipante,
    b.localEstoque,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidade,
    b.precoCustoOperacao,
    b.totalCustoOperacao,
    b.precoCMV,
    b.valorCMV,
    b.observacoes);
  IF p_idFichaProdutoRealOrcamento > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MOORCAMENTOXFICHAXESTOQUE
    WHERE idFichaProdutoRealOrcamento = p_idFichaProdutoRealOrcamento
    AND idEstoque = r_idEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MOORCAMENTOXFICHAXESTOQUE (
        id,
        idFichaProdutoRealOrcamento,
        idEstoque)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MOORCAMENTOXFICHAXESTOQUE',
          'id',
          14),
        p_idFichaProdutoRealOrcamento,
        r_idEstoque);
    END IF;
  END IF;
  IF p_idItemPreDocumento > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MOPREDOCUMXESTOQUE
    WHERE idItemPreDocumento = p_idItemPreDocumento
    AND idEstoque = r_idEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MOPREDOCUMXESTOQUE (
        id,
        idItemPreDocumento,
        idEstoque)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MOPREDOCUMXESTOQUE',
          'id',
          14),
        p_idItemPreDocumento,
        r_idEstoque);
    END IF;
  END IF;
  IF p_idItemDocFiscal > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MODOCFISCALXESTOQUE
    WHERE idItemDocFiscal = p_idItemDocFiscal
    AND idEstoque = r_idEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MODOCFISCALXESTOQUE (
        id,
        idItemDocFiscal,
        idEstoque)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MODOCFISCALXESTOQUE',
          'id',
          14),
        p_idItemDocFiscal,
        r_idEstoque);
    END IF;
  END IF;
  IF p_divergenciaBalanco > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MOBALANCOXESTOQUE
    WHERE divergenciaBalanco = p_divergenciaBalanco
    AND idEstoque = r_idEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MOBALANCOXESTOQUE (
        id,
        divergenciaBalanco,
        idEstoque)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MOBALANCOXESTOQUE',
          'id',
          14),
        p_divergenciaBalanco,
        r_idEstoque);
    END IF;
  END IF;
  IF p_idItemDocTransferencia > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MODOCTRANSFXESTOQUE
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND idEstoque = r_idEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MODOCTRANSFXESTOQUE (
        id,
        idItemDocTransferencia,
        idEstoque,
        quantidade)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MODOCTRANSFXESTOQUE',
          'id',
          14),
        p_idItemDocTransferencia,
        r_idEstoque,
        p_quantidade);
    END IF;
  END IF;
END ADD_ESTOQUE_GRAVA;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_FIL_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idItemDocFiscal           IN NUMBER,
  p_produto                   IN NUMBER,
  p_gradeProduto              IN NUMBER,
  p_personalizacao            IN NUMBER,
  p_idLoteEstoque             IN NUMBER,
  p_idNumeroSerie             IN NUMBER,
  p_quantidade                IN NUMBER,
  p_precoCustoOperacao        IN NUMBER,
  p_totalCustoOperacao        IN NUMBER,
  p_precoCMV                  IN NUMBER,
  p_valorCMV                  IN NUMBER,
  p_observacoes               IN VARCHAR2,
  p_bufferIdProdutoFilho      IN VARCHAR2,
  r_id                        OUT NUMBER,
  r_bufferIdProdutoFilho      OUT VARCHAR2)
IS
BEGIN
  IF p_id > 0 THEN
    r_id := p_id;
    r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  ELSIF p_bufferIdProdutoFilho IS NOT NULL
    AND LENGTH (RTRIM (p_bufferIdProdutoFilho)) >= 14
  THEN
    r_id := TO_NUMBER (SUBSTR (p_bufferIdProdutoFilho, 1, 14));
    r_bufferIdProdutoFilho := RTRIM (SUBSTR (p_bufferIdProdutoFilho, 16, 32000));
  ELSE
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MODOCFISCALXPRODUTOFILHO',
      'id',
      14);
    r_bufferIdProdutoFilho := '';
  END IF;
  MERGE INTO MODOCFISCALXPRODUTOFILHO a 
  USING (
    SELECT
      r_id                 id,
      p_idItemDocFiscal    idItemDocFiscal,
      p_produto            produto,
      p_gradeProduto       gradeProduto,
      p_personalizacao     personalizacao,
      p_idLoteEstoque      idLoteEstoque,
      p_idNumeroSerie      idNumeroSerie,
      p_quantidade         quantidade,
      p_precoCustoOperacao precoCustoOperacao,
      p_totalCustoOperacao totalCustoOperacao,
      p_precoCMV           precoCMV,
      p_valorCMV           valorCMV,
      p_observacoes        observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idItemDocFiscal    = b.idItemDocFiscal,
    a.produto            = b.produto,
    a.gradeProduto       = b.gradeProduto,
    a.personalizacao     = b.personalizacao,
    a.idLoteEstoque      = b.idLoteEstoque,
    a.idNumeroSerie      = b.idNumeroSerie,
    a.quantidade         = b.quantidade,
    a.precoCustoOperacao = b.precoCustoOperacao,
    a.totalCustoOperacao = b.totalCustoOperacao,
    a.precoCMV           = b.precoCMV,
    a.valorCMV           = b.valorCMV,
    a.observacoes        = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idItemDocFiscal,
    produto,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    precoCustoOperacao,
    totalCustoOperacao,
    precoCMV,
    valorCMV,
    observacoes)
  VALUES (
    b.id,
    b.idItemDocFiscal,
    b.produto,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidade,
    b.precoCustoOperacao,
    b.totalCustoOperacao,
    b.precoCMV,
    b.valorCMV,
    b.observacoes);
END ADD_ESTOQUE_DOC_FISC_FIL_GRAVA;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_FIL_N_SER (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_item_idItemDocFiscal      IN NUMBER,
  p_item_produto              IN NUMBER,
  p_item_gradeProduto         IN NUMBER,
  p_item_personalizacao       IN NUMBER,
  p_item_idLoteEstoque        IN NUMBER,
  p_item_precoCustoOperacao   IN NUMBER,
  p_item_precoCMV             IN NUMBER,
  p_item_observacoes          IN VARCHAR2,
  p_bufferIdProdutoFilho      IN VARCHAR2,
  r_bufferIdProdutoFilho      OUT VARCHAR2,
  r_quantidadeNumerosSerie    OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdProdutoFilho   := p_bufferIdProdutoFilho;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_ESTOQUE_DOC_FISC_FIL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      p_item_idItemDocFiscal,
      p_item_produto,
      p_item_gradeProduto,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      a.idNumeroSerie,
      1, -- p_quantidade
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2), -- p_totalCustoOperacao
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2), -- p_valorCMV
      p_item_observacoes,
      r_bufferIdProdutoFilho, 
      v_auxNumber,
      r_bufferIdProdutoFilho);
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_FIL_N_SER;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_FIL_KIT (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)), 0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND ((COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * 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'),
          TRUNC (p_data) - 1,
          0,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)), 0)), 2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := 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'),
          TRUNC (p_data) - 1,
          0,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit, 2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_DOC_FISC_FIL_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_item_idItemDocFiscal,
        a.gradeProdutoFilho,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_ESTOQUE_DOC_FISC_FIL_N_SER (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          p_item_idItemDocFiscal,
          a.produto,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          r_bufferIdProdutoFilho,
          r_bufferIdProdutoFilho,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_DOC_FISC_FIL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          p_item_idItemDocFiscal,
          a.produto,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie, -- p_quantidade
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          r_bufferIdProdutoFilho, 
          v_auxNumber,
          r_bufferIdProdutoFilho);
      END IF;
    END IF;
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_FIL_KIT;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_tinta_gradeProduto           IN NUMBER,
  p_tinta_quantidade             IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT
      gradProd.produto,
      prod.controleEstoque,
      ROUND (p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND (p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_DOC_FISC_FIL_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_item_idItemDocFiscal,
        p_tinta_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      ADD_ESTOQUE_DOC_FISC_FIL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_id
        p_item_idItemDocFiscal,
        a.produto,
        p_tinta_gradeProduto,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        r_bufferIdProdutoFilho, 
        v_auxNumber,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_FIL_PRTIN;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_FIL_FORM (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_idItemDocFiscal              IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      baseTinta.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      COALESCE (colTintaA.gradeProduto, 0) gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      COALESCE (colTintaB.gradeProduto, 0) gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      COALESCE (colTintaC.gradeProduto, 0) gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      COALESCE (colTintaD.gradeProduto, 0) gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      COALESCE (colTintaE.gradeProduto, 0) gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      COALESCE (colTintaF.gradeProduto, 0) gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      COALESCE (colTintaG.gradeProduto, 0) gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      COALESCE (colTintaH.gradeProduto, 0) gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      COALESCE (colTintaI.gradeProduto, 0) gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      COALESCE (colTintaJ.gradeProduto, 0) gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      COALESCE (colTintaK.gradeProduto, 0) gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      COALESCE (colTintaL.gradeProduto, 0) gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      COALESCE (colTintaM.gradeProduto, 0) gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      COALESCE (colTintaN.gradeProduto, 0) gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      COALESCE (colTintaO.gradeProduto, 0) gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_data,
      p_idItemDocFiscal,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_locEst_indicProprPosseItem,
      a.gradeProduto,
      900, -- p_tinta_quantidade,
      r_bufferIdProdutoFilho,
      r_bufferIdProdutoFilho);    
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_FIL_FORM;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_FIL_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_id                        IN NUMBER,
  p_idItemPreDocumento        IN NUMBER,
  p_produto                   IN NUMBER,
  p_gradeProduto              IN NUMBER,
  p_personalizacao            IN NUMBER,
  p_idLoteEstoque             IN NUMBER,
  p_idNumeroSerie             IN NUMBER,
  p_quantidade                IN NUMBER,
  p_precoCustoOperacao        IN NUMBER,
  p_totalCustoOperacao        IN NUMBER,
  p_precoCMV                  IN NUMBER,
  p_valorCMV                  IN NUMBER,
  p_observacoes               IN VARCHAR2,
  p_bufferIdProdutoFilho      IN VARCHAR2,
  r_id                        OUT NUMBER,
  r_bufferIdProdutoFilho      OUT VARCHAR2)
IS
BEGIN
  IF p_id > 0 THEN
    r_id := p_id;
    r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  ELSIF p_bufferIdProdutoFilho IS NOT NULL
    AND LENGTH (RTRIM (p_bufferIdProdutoFilho)) >= 14
  THEN
    r_id := TO_NUMBER (SUBSTR (p_bufferIdProdutoFilho, 1, 14));
    r_bufferIdProdutoFilho := RTRIM (SUBSTR (p_bufferIdProdutoFilho, 16, 32000));
  ELSE
    r_id := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOPREDOCUMXPRODUTOFILHO',
      'id',
      14);
    r_bufferIdProdutoFilho := '';
  END IF;
  MERGE INTO MOPREDOCUMXPRODUTOFILHO a 
  USING (
    SELECT
      r_id                 id,
      p_idItemPreDocumento idItemPreDocumento,
      p_produto            produto,
      p_gradeProduto       gradeProduto,
      p_personalizacao     personalizacao,
      p_idLoteEstoque      idLoteEstoque,
      p_idNumeroSerie      idNumeroSerie,
      p_quantidade         quantidade,
      p_precoCustoOperacao precoCustoOperacao,
      p_totalCustoOperacao totalCustoOperacao,
      p_precoCMV           precoCMV,
      p_valorCMV           valorCMV,
      p_observacoes        observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idItemPreDocumento = b.idItemPreDocumento,
    a.produto            = b.produto,
    a.gradeProduto       = b.gradeProduto,
    a.personalizacao     = b.personalizacao,
    a.idLoteEstoque      = b.idLoteEstoque,
    a.idNumeroSerie      = b.idNumeroSerie,
    a.quantidade         = b.quantidade,
    a.precoCustoOperacao = b.precoCustoOperacao,
    a.totalCustoOperacao = b.totalCustoOperacao,
    a.precoCMV           = b.precoCMV,
    a.valorCMV           = b.valorCMV,
    a.observacoes        = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idItemPreDocumento,
    produto,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    precoCustoOperacao,
    totalCustoOperacao,
    precoCMV,
    valorCMV,
    observacoes)
  VALUES (
    b.id,
    b.idItemPreDocumento,
    b.produto,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidade,
    b.precoCustoOperacao,
    b.totalCustoOperacao,
    b.precoCMV,
    b.valorCMV,
    b.observacoes);
END ADD_ESTOQUE_PRE_DOC_FIL_GRAVA;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_FIL_N_SER (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_item_idItemPreDocumento   IN NUMBER,
  p_item_produto              IN NUMBER,
  p_item_gradeProduto         IN NUMBER,
  p_item_personalizacao       IN NUMBER,
  p_item_idLoteEstoque        IN NUMBER,
  p_item_precoCustoOperacao   IN NUMBER,
  p_item_precoCMV             IN NUMBER,
  p_item_observacoes          IN VARCHAR2,
  p_bufferIdProdutoFilho      IN VARCHAR2,
  r_bufferIdProdutoFilho      OUT VARCHAR2,
  r_quantidadeNumerosSerie    OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdProdutoFilho   := p_bufferIdProdutoFilho;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_ESTOQUE_PRE_DOC_FIL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_id
      p_item_idItemPreDocumento,
      p_item_produto,
      p_item_gradeProduto,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      a.idNumeroSerie,
      1, -- p_quantidade
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2), -- p_totalCustoOperacao
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2), -- p_valorCMV
      p_item_observacoes,
      r_bufferIdProdutoFilho, 
      v_auxNumber,
      r_bufferIdProdutoFilho);
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_FIL_N_SER;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_FIL_KIT (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)), 0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND ((COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * 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'),
          TRUNC (p_data) - 1,
          0,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)), 0)), 2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := 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'),
          TRUNC (p_data) - 1,
          0,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit, 2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_PRE_DOC_FIL_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_item_idItemPreDocumento,
        a.gradeProdutoFilho,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_ESTOQUE_PRE_DOC_FIL_N_SER (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          p_item_idItemPreDocumento,
          a.produto,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          r_bufferIdProdutoFilho,
          r_bufferIdProdutoFilho,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_PRE_DOC_FIL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          p_item_idItemPreDocumento,
          a.produto,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie, -- p_quantidade
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          r_bufferIdProdutoFilho, 
          v_auxNumber,
          r_bufferIdProdutoFilho);
      END IF;
    END IF;
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_FIL_KIT;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_tinta_gradeProduto           IN NUMBER,
  p_tinta_quantidade             IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT
      gradProd.produto,
      prod.controleEstoque,
      ROUND (p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND (p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_PRE_DOC_FIL_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_item_idItemPreDocumento,
        p_tinta_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      ADD_ESTOQUE_PRE_DOC_FIL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_id
        p_item_idItemPreDocumento,
        a.produto,
        p_tinta_gradeProduto,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        r_bufferIdProdutoFilho, 
        v_auxNumber,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_FIL_PRTIN;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_FIL_FORM (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_idItemPreDocumento           IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      baseTinta.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      COALESCE (colTintaA.gradeProduto, 0) gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      COALESCE (colTintaB.gradeProduto, 0) gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      COALESCE (colTintaC.gradeProduto, 0) gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      COALESCE (colTintaD.gradeProduto, 0) gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      COALESCE (colTintaE.gradeProduto, 0) gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      COALESCE (colTintaF.gradeProduto, 0) gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      COALESCE (colTintaG.gradeProduto, 0) gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      COALESCE (colTintaH.gradeProduto, 0) gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      COALESCE (colTintaI.gradeProduto, 0) gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      COALESCE (colTintaJ.gradeProduto, 0) gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      COALESCE (colTintaK.gradeProduto, 0) gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      COALESCE (colTintaL.gradeProduto, 0) gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      COALESCE (colTintaM.gradeProduto, 0) gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      COALESCE (colTintaN.gradeProduto, 0) gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      COALESCE (colTintaO.gradeProduto, 0) gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_data,
      p_idItemPreDocumento,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_locEst_indicProprPosseItem,
      a.gradeProduto,
      900, -- p_tinta_quantidade,
      r_bufferIdProdutoFilho,
      r_bufferIdProdutoFilho);    
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_PRTIN (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_data,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_FIL_FORM;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_N_SERIE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_graProd_produto              IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdEstoque        := p_bufferIdEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_ESTOQUE_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idEstoque
      p_cab_estabelecimento,
      p_data,
      p_graProd_produto,
      p_item_gradeProduto,
      p_item_modeloDocumento,
      0, -- p_item_motivoEstoque
      100, -- p_operacaoInternaEstoque
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      a.idNumeroSerie,
      1, -- p_quantidade
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2),
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2),
      p_item_observacoes,
      0, -- p_idFichaProdutoRealOrcamento
      0, -- p_idItemPreDocumento
      p_item_idItemDocFiscal,
      0, -- p_divergenciaBalanco
      0, -- p_idItemDocTransferencia
      r_bufferIdEstoque,
      v_auxNumber,
      r_bufferIdEstoque);    
    IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
      ADD_ESTOQUE_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_idEstoque
        p_docTransf_estabelecSaida,
        p_data,
        p_graProd_produto,
        p_item_gradeProduto,
        p_item_modeloDocumento,
        0, -- p_item_motivoEstoque
        900, -- p_operacaoInternaEstoque
        0, -- p_atualizaCustoMedio
        0, -- p_atualizaUltimaCompra
        CASE WHEN p_cab_entradaSaida = 'S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
        p_locEstTransito_indicProprPos,
        p_item_pessoaParticipante,
        p_modDoc_transitoLocalEstoque,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        a.idNumeroSerie,
        1, -- p_quantidade
        p_item_precoCustoOperacao,
        ROUND (p_item_precoCustoOperacao, 2), -- p_totalCustoOperacao
        p_item_precoCMV,
        ROUND (p_item_precoCMV, 2), -- p_valorCMV
        p_item_observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        p_item_idItemDocFiscal,
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        r_bufferIdEstoque,
        v_auxNumber,
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_N_SERIE;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_N_SERIE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_graProd_produto              IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdEstoque        := p_bufferIdEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_ESTOQUE_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idEstoque
      p_cab_estabelecimento,
      p_data,
      p_graProd_produto,
      p_item_gradeProduto,
      p_item_modeloDocumento,
      0, -- p_item_motivoEstoque
      101, -- p_operacaoInternaEstoque
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      a.idNumeroSerie,
      1, -- p_quantidade
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2),
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2),
      p_item_observacoes,
      0, -- p_idFichaProdutoRealOrcamento
      p_item_idItemPreDocumento,
      0, -- p_idItemDocFiscal,
      0, -- p_divergenciaBalanco
      0, -- p_idItemDocTransferencia
      r_bufferIdEstoque,
      v_auxNumber,
      r_bufferIdEstoque);    
    IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
      ADD_ESTOQUE_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_idEstoque
        p_docTransf_estabelecSaida,
        p_data,
        p_graProd_produto,
        p_item_gradeProduto,
        p_item_modeloDocumento,
        0, -- p_item_motivoEstoque
        900, -- p_operacaoInternaEstoque
        0, -- p_atualizaCustoMedio
        0, -- p_atualizaUltimaCompra
        CASE WHEN p_cab_entradaSaida = 'S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
        p_locEstTransito_indicProprPos,
        p_item_pessoaParticipante,
        p_modDoc_transitoLocalEstoque,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        a.idNumeroSerie,
        1, -- p_quantidade
        p_item_precoCustoOperacao,
        ROUND (p_item_precoCustoOperacao, 2), -- p_totalCustoOperacao
        p_item_precoCMV,
        ROUND (p_item_precoCMV, 2), -- p_valorCMV
        p_item_observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        p_item_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        r_bufferIdEstoque,
        v_auxNumber,
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_N_SERIE;

/

create or replace PROCEDURE ADD_ESTOQUE_KIT (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_operacaoInternaEstoque   IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_motivoEstoque           IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_idFichaProdutoRealOrcamento  IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_divergenciaBalanco           IN NUMBER,
  p_idItemDocTransferencia       IN NUMBER,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE (SUM (ROUND (p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)), 0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
    SELECT ROUND ((COALESCE (SUM (ROUND (p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * 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
          TRUNC (p_data) - 1, -- p_cab_dataPrecoFinal
          0, -- p_item_personalizacao
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          gradProdFilho.cor,
          gradProdFilho.tamanho,
          p_locEst_indicProprPosseItem,
          0) -- p_gerandoInventario
          ), 0)), 2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      kit.gradeProdutoFilho,
      kit.manterUltimoCusto,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND (p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho
    AND ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF p_cab_atualizaCustoMedio = 1
      AND a.manterUltimoCusto = 1
    THEN
      v_precoCustoKit := 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
          TRUNC (p_data) - 1, -- p_cab_dataPrecoFinal
          0, -- p_item_personalizacao
          p_item_pessoaParticipante,
          a.produto,
          a.cor,
          a.tamanho,
          p_locEst_indicProprPosseItem,
          0); -- p_gerandoInventario
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit, 2);
    ELSIF p_cab_atualizaCustoMedio = 1
      AND p_item_valorCustoOperacao > v_valorCustoManter
      AND v_quantSaldoRateioTotal > a.quantidade
    THEN
      v_valorCustoKit := ROUND ((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal, 2);
      v_precoCustoKit := ROUND (v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1
      AND v_valorSaldoRateioTotal > 0
    THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0
        AND p_idItemPreDocumento > 0
      THEN
        ADD_ESTOQUE_PRE_DOC_N_SERIE (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_data,
          p_idItemPreDocumento,
          p_item_modeloDocumento,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_item_localEstoque,
          p_item_pessoaParticipante,
          v_valorCustoKit, -- p_totalCustoOperacao
          0, -- p_precoCMV
          p_item_observacoes,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          a.produto,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      ELSIF a.controlaNumeroSerie > 0
        AND p_idItemDocFiscal > 0
      THEN
        ADD_ESTOQUE_DOC_FISC_N_SERIE (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_data,
          p_idItemDocFiscal,
          p_item_modeloDocumento,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_item_localEstoque,
          p_item_pessoaParticipante,
          v_valorCustoKit, -- p_totalCustoOperacao
          0, -- p_precoCMV
          p_item_observacoes,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          a.produto,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo, 
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          p_cab_estabelecimento,
          p_data,
          a.produto,
          a.gradeProdutoFilho,
          p_item_modeloDocumento,
          p_item_motivoEstoque,
          p_cab_operacaoInternaEstoque,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie, -- p_quantidade
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN a.quantidade = 0 THEN v_valorCustoKit ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          p_idFichaProdutoRealOrcamento,
          p_idItemPreDocumento,
          p_idItemDocFiscal,
          p_divergenciaBalanco,
          p_idItemDocTransferencia,
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1
          AND p_modDoc_geraOperacaoEmTransit = 1
          AND p_modDoc_transitoLocalEstoque > 0
          AND p_docTransf_estabelecEntrada > 0
          AND p_docTransf_estabelecSaida > 0
        THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            p_docTransf_estabelecSaida,
            p_data,
            a.produto,
            a.gradeProdutoFilho,
            p_item_modeloDocumento,
            p_item_motivoEstoque,
            900, -- p__operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE
              WHEN p_cab_entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, -- p_entradaSaida
            p_locEstTransito_indicProprPos,
            CASE WHEN p_locEstTransito_indicProprPos = '0' THEN 0 ELSE p_item_pessoaParticipante END,
            p_modDoc_transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            0, -- p_idNumeroSerie
            a.quantidade - v_quantidadeNumerosSerie, -- p_quantidade
            v_precoCustoKit, -- p_precoCustoOperacao
            CASE WHEN a.quantidade = 0 THEN v_valorCustoKit ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            p_item_observacoes,
            p_idFichaProdutoRealOrcamento,
            p_idItemPreDocumento,
            p_idItemDocFiscal,
            p_divergenciaBalanco,
            p_idItemDocTransferencia,
            r_bufferIdEstoque,
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;    
      END IF;
    END IF;
  END LOOP;
END ADD_ESTOQUE_KIT;

/

create or replace PROCEDURE ADD_ESTOQUE_PRODUTO_TINTA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_operacaoInternaEstoque   IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_motivoEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_idFichaProdutoRealOrcamento  IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_divergenciaBalanco           IN NUMBER,
  p_idItemDocTransferencia       IN NUMBER,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  p_tinta_gradeProduto           IN NUMBER,
  p_tinta_quantidade             IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      gradProd.produto,
      prod.controleEstoque,
      ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_tinta_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      ADD_ESTOQUE_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_idEstoque
        p_cab_estabelecimento,
        p_data,
        a.produto,
        p_tinta_gradeProduto,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        r_bufferIdEstoque,
        v_auxNumber,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1
        AND p_modDoc_geraOperacaoEmTransit = 1
        AND p_modDoc_transitoLocalEstoque > 0
        AND p_docTransf_estabelecEntrada > 0
        AND p_docTransf_estabelecSaida > 0
      THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          p_docTransf_estabelecSaida,
          p_data,
          a.produto,
          p_tinta_gradeProduto,
          p_item_modeloDocumento,
          p_item_motivoEstoque,
          900, --p_operacaoInternaEstoque
          0, --p_atualizaCustoMedio
          0, --p_atualizaUltimaCompra
          CASE
            WHEN p_cab_entradaSaida = 'S'
            THEN 'E'
            ELSE 'S'
          END, --p_entradaSaida
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          a.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          p_item_observacoes,
          p_idFichaProdutoRealOrcamento,
          p_idItemPreDocumento,
          p_idItemDocFiscal,
          p_divergenciaBalanco,
          p_idItemDocTransferencia,
          v_auxNumber,
          r_bufferIdEstoque,
          r_bufferIdEstoque);
      END IF;
    END IF;    
  END LOOP;
END ADD_ESTOQUE_PRODUTO_TINTA;

/

create or replace PROCEDURE ADD_ESTOQUE_FORMULA_TINTA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_operacaoInternaEstoque   IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_data                         IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_motivoEstoque           IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_idFichaProdutoRealOrcamento  IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_divergenciaBalanco           IN NUMBER,
  p_idItemDocTransferencia       IN NUMBER,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      baseTinta.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      COALESCE (colTintaA.gradeProduto, 0) gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      COALESCE (colTintaB.gradeProduto, 0) gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      COALESCE (colTintaC.gradeProduto, 0) gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      COALESCE (colTintaD.gradeProduto, 0) gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      COALESCE (colTintaE.gradeProduto, 0) gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      COALESCE (colTintaF.gradeProduto, 0) gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      COALESCE (colTintaG.gradeProduto, 0) gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      COALESCE (colTintaH.gradeProduto, 0) gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      COALESCE (colTintaI.gradeProduto, 0) gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      COALESCE (colTintaJ.gradeProduto, 0) gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      COALESCE (colTintaK.gradeProduto, 0) gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      COALESCE (colTintaL.gradeProduto, 0) gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      COALESCE (colTintaM.gradeProduto, 0) gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      COALESCE (colTintaN.gradeProduto, 0) gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      COALESCE (colTintaO.gradeProduto, 0) gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_ESTOQUE_PRODUTO_TINTA (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_operacaoInternaEstoque,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_data,
      p_item_modeloDocumento,
      p_item_motivoEstoque,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_idFichaProdutoRealOrcamento,
      p_idItemPreDocumento,
      p_idItemDocFiscal,
      p_divergenciaBalanco,
      p_idItemDocTransferencia,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      a.gradeProduto,
      900, -- p_quantidade,
      r_bufferIdEstoque,
      r_bufferIdEstoque);    
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_data,
        p_item_modeloDocumento,
        p_item_motivoEstoque,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idFichaProdutoRealOrcamento,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_ESTOQUE_FORMULA_TINTA;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_ITEM (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  ADD_ESTOQUE_DOC_FISC_EXCLUI (
    p_idItemDocFiscal,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  ADD_ESTOQUE_DOC_FISC_FIL_EXCL (
    p_idItemDocFiscal,
    r_bufferIdProdutoFilho,
    r_bufferIdProdutoFilho);
  FOR a IN (
    SELECT
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      gradProd.produto,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      prod.tipoProduto,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (cabTransf.estabelecimentoEntrada, 0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida, 0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc
    ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.idFormulaTinta,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        a.idItemDocFiscal,
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque, 
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.gradeProduto,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        a.idItemDocFiscal,
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_ESTOQUE_DOC_FISC_N_SERIE (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemDocFiscal,
          a.modeloDocumento,
          a.gradeProduto,
          a.personalizacao,
          a.idLoteEstoque,
          a.localEstoque,
          a.pessoaParticipante,
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
          END, -- a.precoCustoOperacao
          a.precoCMV,
          a.observacoes,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.produto,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.produto,
          a.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_idNumeroSerie
          a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
          END, -- p_precoCustoOperacao
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          a.precoCMV,
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
          a.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento
          a.idItemDocFiscal,
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
            CASE
              WHEN a.valorCustoOperacao = 0
                OR a.valorAcrescimoExtempTotal = 0
                OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
              THEN a.precoCustoOperacao
              ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
            END, -- p_precoCustoOperacao
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            a.precoCMV,
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;
      END IF;
    ELSIF a.controleEstoque IN (2,21,99)
      AND a.tipoProduto = '09'
    THEN
      FOR b IN (
        SELECT
          itemOrc.gradeProduto,
          itemOrc.idFormulaTinta,
          itemOrc.personalizacao,
          itemOrc.idLoteEstoque,
          gradProd.produto,
          prod.controleEstoque,
          prod.controlaNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXDoc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXDoc.idItemOrcamento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemOrc.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE docXDoc.idItemDocFiscal = a.idItemDocFiscal
        AND docXDoc.quantidade <> 0
        AND itemOrc.cancelado = 0)
      LOOP
        IF b.controleEstoque = 12 AND b.idFormulaTinta > 0 THEN
          ADD_ESTOQUE_FORMULA_TINTA (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.idFormulaTinta,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque, 
            r_bufferIdEstoque);
        ELSIF b.controleEstoque IN (3,4) THEN
          ADD_ESTOQUE_KIT (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.gradeProduto,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque,
            r_bufferIdEstoque);
        ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
          v_quantidadeNumerosSerie := 0;
          IF b.controlaNumeroSerie > 0 THEN
            ADD_ESTOQUE_DOC_FISC_N_SERIE (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              a.idItemDocFiscal,
              a.modeloDocumento,
              b.gradeProduto,
              b.personalizacao,
              b.idLoteEstoque,
              a.localEstoque,
              a.pessoaParticipante,
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
              END, -- a.precoCustoOperacao
              a.precoCMV,
              a.observacoes,
              a.geraTransferencia,
              a.geraOperacaoEmTransito,
              a.transitoLocalEstoque,
              a.locEstTransito_indicProprPos,
              b.produto,
              a.locEst_indicProprPosseItem,
              a.docTransf_estabelecEntrada,
              a.docTransf_estabelecSaida,
              r_bufferIdEstoque,
              r_bufferIdEstoque,
              v_quantidadeNumerosSerie);
          END IF;
          IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
            ADD_ESTOQUE_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idEstoque
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              b.produto,
              b.gradeProduto,
              a.modeloDocumento,
              0, -- p_item_motivoEstoque
              100, -- p_operacaoInternaEstoque
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.locEst_indicProprPosseItem,
              a.pessoaParticipante,
              a.localEstoque,
              b.personalizacao,
              b.idLoteEstoque,
              0, -- p_idNumeroSerie
              a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
              END, -- p_precoCustoOperacao
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
              a.precoCMV,
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
              a.observacoes,
              0, -- p_idFichaProdutoRealOrcamento
              0, -- p_idItemPreDocumento
              a.idItemDocFiscal,
              0, -- p_divergenciaBalanco
              0, -- p_idItemDocTransferencia
              r_bufferIdEstoque,
              v_auxNumber,
              r_bufferIdEstoque);
            IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
              ADD_ESTOQUE_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idEstoque
                a.docTransf_estabelecSaida,
                CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
                b.produto,
                b.gradeProduto,
                a.modeloDocumento,
                0, -- p_item_motivoEstoque
                900, -- p_operacaoInternaEstoque
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
                a.locEstTransito_indicProprPos,
                a.pessoaParticipante,
                a.transitoLocalEstoque,
                b.personalizacao,
                b.idLoteEstoque,
                0, -- p_idNumeroSerie
                a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
                CASE
                  WHEN a.valorCustoOperacao = 0
                    OR a.valorAcrescimoExtempTotal = 0
                    OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                  THEN a.precoCustoOperacao
                  ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
                END, -- p_precoCustoOperacao
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
                a.precoCMV,
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
                a.observacoes,
                0, -- p_idFichaProdutoRealOrcamento
                0, -- p_idItemPreDocumento
                a.idItemDocFiscal,
                0, -- p_divergenciaBalanco
                0, -- p_idItemDocTransferencia
                r_bufferIdEstoque, 
                v_auxNumber,
                r_bufferIdEstoque);
            END IF;
          END IF;
        END IF;
      END LOOP;
    END IF;
    FOR b IN (
      SELECT
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MODOCFISCALXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemDocFiscal = a.idItemDocFiscal
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          a.gradeProduto,
          a.localEstoque,
          a.pessoaParticipante,
          b.quantidade,
          0,
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_item_idItemPreDocumento,
          a.idItemDocFiscal,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque);
      ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          b.produto,
          b.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_item_idItemPreDocumento,
          a.idItemDocFiscal,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1
          AND a.geraOperacaoEmTransito = 1
          AND a.transitoLocalEstoque > 0
          AND a.docTransf_estabelecEntrada > 0
          AND a.docTransf_estabelecSaida > 0
        THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            b.produto,
            b.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE
              WHEN a.entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            0, -- p_idNumeroSerie
            b.quantidade,
            0, -- p_precoCustoOperacao
            0, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            b.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_item_idItemPreDocumento,
            a.idItemDocFiscal,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;    
      END IF;
    END LOOP;
  END LOOP;
  FOR a IN (
    SELECT id
    FROM MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_idItemDocFiscal
    ORDER BY id)
  LOOP
    r_bufferIdProdutoFilho :=
      CASE
        WHEN r_bufferIdProdutoFilho IS NULL
          OR r_bufferIdProdutoFilho = ''
          OR r_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (r_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO b
    WHERE a.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    IF a.controleEstoque = 12
      AND a.idFormulaTinta > 0
    THEN
      ADD_ESTOQUE_DOC_FISC_FIL_FORM (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemDocFiscal,
        a.idFormulaTinta,
        a.pessoaParticipante,
        a.quantidade,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho, 
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_DOC_FISC_FIL_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemDocFiscal,
        a.gradeProduto,
        a.pessoaParticipante,
        a.quantidade,
        a.valorCustoOperacao,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    FOR b IN (
      SELECT 
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MODOCFISCALXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemDocFiscal = a.idItemDocFiscal
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_DOC_FISC_FIL_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.atualizaCustoMedio,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemDocFiscal,
          b.gradeProduto,
          a.pessoaParticipante,
          b.quantidade,
          0, -- a.valorCustoOperacao
          b.observacoes,
          a.locEst_indicProprPosseItem,
          r_bufferIdProdutoFilho,
          r_bufferIdProdutoFilho);
      ELSIF b.controleEstoque IN (1,5,6,11,12) THEN
        ADD_ESTOQUE_DOC_FISC_FIL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          a.idItemDocFiscal,
          b.produto,
          b.gradeProduto,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          b.observacoes,
          r_bufferIdProdutoFilho, 
          v_auxNumber,
          r_bufferIdProdutoFilho);
      END IF;
    END LOOP;
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_ITEM;

/

create or replace PROCEDURE ADD_ESTOQUE_DOC_FISC_CABECALHO (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER)
IS
  v_bufferIdEstoque      VARCHAR2 (32000);
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT idItemDocFiscal
    FROM MODOCFISCALXITENS
    WHERE idDocumentoFiscal = p_idDocumentoFiscal)
  LOOP
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      a.idItemDocFiscal,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    ADD_ESTOQUE_DOC_FISC_FIL_EXCL (
      a.idItemDocFiscal,
      v_bufferIdProdutoFilho,
      v_bufferIdProdutoFilho);
  END LOOP;
  FOR a IN (
    SELECT item.idItemDocFiscal
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_ESTOQUE_DOC_FISC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      a.idItemDocFiscal,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_ESTOQUE_DOC_FISC_CABECALHO;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_ITEM (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  ADD_ESTOQUE_PRE_DOC_EXCLUI (
    p_idItemPreDocumento,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  ADD_ESTOQUE_PRE_DOC_FIL_EXCL (
    p_idItemPreDocumento,
    r_bufferIdProdutoFilho,
    r_bufferIdProdutoFilho);
  FOR a IN (
    SELECT
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      gradProd.produto,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      prod.tipoProduto,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (cabTransf.estabelecimentoEntrada, 0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida, 0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc
    ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.idFormulaTinta,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        a.idItemPreDocumento,
        0, -- p_idItemDocFiscal
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque, 
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        100, -- p_cab_operacaoInternaEstoque
        a.atualizaCustoMedio,
        a.atualizaUltimaCompra,
        a.entradaSaida,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.modeloDocumento,
        0, -- p_item_motivoEstoque
        a.gradeProduto,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
        a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        a.idItemPreDocumento,
        0, -- p_idItemDocFiscal
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        a.geraTransferencia,
        a.geraOperacaoEmTransito,
        a.transitoLocalEstoque,
        a.locEstTransito_indicProprPos,
        a.locEst_indicProprPosseItem,
        a.docTransf_estabelecEntrada,
        a.docTransf_estabelecSaida,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_ESTOQUE_PRE_DOC_N_SERIE (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemPreDocumento,
          a.modeloDocumento,
          a.gradeProduto,
          a.personalizacao,
          a.idLoteEstoque,
          a.localEstoque,
          a.pessoaParticipante,
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
          END, -- a.precoCustoOperacao
          a.precoCMV,
          a.observacoes,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.produto,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.produto,
          a.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_idNumeroSerie
          a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
          CASE
            WHEN a.valorCustoOperacao = 0
              OR a.valorAcrescimoExtempTotal = 0
              OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
            THEN a.precoCustoOperacao
            ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
          END, -- p_precoCustoOperacao
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          a.precoCMV,
          CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
          a.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          a.idItemPreDocumento,
          0, -- p_idItemDocFiscal
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
            CASE
              WHEN a.valorCustoOperacao = 0
                OR a.valorAcrescimoExtempTotal = 0
                OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
              THEN a.precoCustoOperacao
              ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
            END, -- p_precoCustoOperacao
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            a.precoCMV,
            CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;
      END IF;
    ELSIF a.controleEstoque IN (2,21,99)
      AND a.tipoProduto = '09'
    THEN
      FOR b IN (
        SELECT
          itemOrc.gradeProduto,
          itemOrc.idFormulaTinta,
          itemOrc.personalizacao,
          itemOrc.idLoteEstoque,
          gradProd.produto,
          prod.controleEstoque,
          prod.controlaNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXDoc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXDoc.idItemOrcamento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = itemOrc.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE docXDoc.idItemPreDocumento = a.idItemPreDocumento
        AND docXDoc.quantidade <> 0
        AND itemOrc.cancelado = 0)
      LOOP
        IF b.controleEstoque = 12 AND b.idFormulaTinta > 0 THEN
          ADD_ESTOQUE_FORMULA_TINTA (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.idFormulaTinta,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque, 
            r_bufferIdEstoque);
        ELSIF b.controleEstoque IN (3,4) THEN
          ADD_ESTOQUE_KIT (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            100, -- p_cab_operacaoInternaEstoque
            a.atualizaCustoMedio,
            a.atualizaUltimaCompra,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            b.gradeProduto,
            a.localEstoque,
            a.pessoaParticipante,
            a.quantidade + a.quantidadeExtemporanea, -- a.quantidade
            a.valorCustoOperacao + a.valorAcrescimoExtempTotal, -- a.valorCustoOperacao
            a.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            a.geraTransferencia,
            a.geraOperacaoEmTransito,
            a.transitoLocalEstoque,
            a.locEstTransito_indicProprPos,
            a.locEst_indicProprPosseItem,
            a.docTransf_estabelecEntrada,
            a.docTransf_estabelecSaida,
            r_bufferIdEstoque,
            r_bufferIdEstoque);
        ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
          v_quantidadeNumerosSerie := 0;
          IF b.controlaNumeroSerie > 0 THEN
            ADD_ESTOQUE_PRE_DOC_N_SERIE (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              a.idItemPreDocumento,
              a.modeloDocumento,
              b.gradeProduto,
              b.personalizacao,
              b.idLoteEstoque,
              a.localEstoque,
              a.pessoaParticipante,
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao, 7)
              END, -- a.precoCustoOperacao
              a.precoCMV,
              a.observacoes,
              a.geraTransferencia,
              a.geraOperacaoEmTransito,
              a.transitoLocalEstoque,
              a.locEstTransito_indicProprPos,
              b.produto,
              a.locEst_indicProprPosseItem,
              a.docTransf_estabelecEntrada,
              a.docTransf_estabelecSaida,
              r_bufferIdEstoque,
              r_bufferIdEstoque,
              v_quantidadeNumerosSerie);
          END IF;
          IF a.quantidade + a.quantidadeExtemporanea > v_quantidadeNumerosSerie THEN
            ADD_ESTOQUE_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idEstoque
              a.estabelecimento,
              CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
              b.produto,
              b.gradeProduto,
              a.modeloDocumento,
              0, -- p_item_motivoEstoque
              100, -- p_operacaoInternaEstoque
              a.atualizaCustoMedio,
              a.atualizaUltimaCompra,
              a.entradaSaida,
              a.locEst_indicProprPosseItem,
              a.pessoaParticipante,
              a.localEstoque,
              b.personalizacao,
              b.idLoteEstoque,
              0, -- p_idNumeroSerie
              a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
              CASE
                WHEN a.valorCustoOperacao = 0
                  OR a.valorAcrescimoExtempTotal = 0
                  OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                THEN a.precoCustoOperacao
                ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
              END, -- p_precoCustoOperacao
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
              a.precoCMV,
              CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
              a.observacoes,
              0, -- p_idFichaProdutoRealOrcamento
              a.idItemPreDocumento,
              0, -- p_idItemDocFiscal
              0, -- p_divergenciaBalanco
              0, -- p_idItemDocTransferencia
              r_bufferIdEstoque,
              v_auxNumber,
              r_bufferIdEstoque);
            IF a.geraTransferencia = 1 AND a.geraOperacaoEmTransito = 1 AND a.transitoLocalEstoque > 0 AND a.docTransf_estabelecEntrada > 0 AND a.docTransf_estabelecSaida > 0 THEN
              ADD_ESTOQUE_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idEstoque
                a.docTransf_estabelecSaida,
                CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
                b.produto,
                b.gradeProduto,
                a.modeloDocumento,
                0, -- p_item_motivoEstoque
                900, -- p_operacaoInternaEstoque
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                CASE WHEN a.entradaSaida='S' THEN 'E' ELSE 'S' END, -- p_entradaSaida
                a.locEstTransito_indicProprPos,
                a.pessoaParticipante,
                a.transitoLocalEstoque,
                b.personalizacao,
                b.idLoteEstoque,
                0, -- p_idNumeroSerie
                a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie, -- p_quantidade
                CASE
                  WHEN a.valorCustoOperacao = 0
                    OR a.valorAcrescimoExtempTotal = 0
                    OR a.valorCustoOperacao + a.valorAcrescimoExtempTotal = 0
                  THEN a.precoCustoOperacao
                  ELSE ROUND(a.precoCustoOperacao * (a.valorCustoOperacao + a.valorAcrescimoExtempTotal) / a.valorCustoOperacao,7)
                END, -- p_precoCustoOperacao
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND (((a.valorCustoOperacao + a.valorAcrescimoExtempTotal) * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
                a.precoCMV,
                CASE WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((a.valorCMV * (a.quantidade + a.quantidadeExtemporanea - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_valorCMV
                a.observacoes,
                0, -- p_idFichaProdutoRealOrcamento
                a.idItemPreDocumento,
                0, -- p_idItemDocFiscal
                0, -- p_divergenciaBalanco
                0, -- p_idItemDocTransferencia
                r_bufferIdEstoque, 
                v_auxNumber,
                r_bufferIdEstoque);
            END IF;
          END IF;
        END IF;
      END LOOP;
    END IF;
    FOR b IN (
      SELECT
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MOPREDOCUMXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemPreDocumento = a.idItemPreDocumento
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND ((a.quantidade + a.quantidadeExtemporanea) * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          a.gradeProduto,
          a.localEstoque,
          a.pessoaParticipante,
          b.quantidade,
          0,
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          a.idItemPreDocumento,
          0, -- p_idItemDocFiscal
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          a.geraTransferencia,
          a.geraOperacaoEmTransito,
          a.transitoLocalEstoque,
          a.locEstTransito_indicProprPos,
          a.locEst_indicProprPosseItem,
          a.docTransf_estabelecEntrada,
          a.docTransf_estabelecSaida,
          r_bufferIdEstoque,
          r_bufferIdEstoque);
      ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
        ADD_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idEstoque
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          b.produto,
          b.gradeProduto,
          a.modeloDocumento,
          0, -- p_item_motivoEstoque
          100, -- p_cab_operacaoInternaEstoque
          a.atualizaCustoMedio,
          a.atualizaUltimaCompra,
          a.entradaSaida,
          a.locEst_indicProprPosseItem,
          a.pessoaParticipante,
          a.localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          b.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          a.idItemPreDocumento,
          0, -- p_idItemDocFiscal
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque,
          v_auxNumber,
          r_bufferIdEstoque);
        IF a.geraTransferencia = 1
          AND a.geraOperacaoEmTransito = 1
          AND a.transitoLocalEstoque > 0
          AND a.docTransf_estabelecEntrada > 0
          AND a.docTransf_estabelecSaida > 0
        THEN
          ADD_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idEstoque
            a.docTransf_estabelecSaida,
            CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
            b.produto,
            b.gradeProduto,
            a.modeloDocumento,
            0, -- p_item_motivoEstoque
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE
              WHEN a.entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, -- p_entradaSaida
            a.locEstTransito_indicProprPos,
            a.pessoaParticipante,
            a.transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            0, -- p_idNumeroSerie
            b.quantidade,
            0, -- p_precoCustoOperacao
            0, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            b.observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            a.idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque, 
            v_auxNumber,
            r_bufferIdEstoque);
        END IF;    
      END IF;
    END LOOP;
  END LOOP;
  FOR a IN (
    SELECT id
    FROM MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_idItemPreDocumento
    ORDER BY id)
  LOOP
    r_bufferIdProdutoFilho :=
      CASE
        WHEN r_bufferIdProdutoFilho IS NULL
          OR r_bufferIdProdutoFilho = ''
          OR r_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (r_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO b
    WHERE a.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    IF a.controleEstoque = 12
      AND a.idFormulaTinta > 0
    THEN
      ADD_ESTOQUE_PRE_DOC_FIL_FORM (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemPreDocumento,
        a.idFormulaTinta,
        a.pessoaParticipante,
        a.quantidade,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho, 
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_PRE_DOC_FIL_KIT (
        p_sys_estabelecimentoAtivo, 
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.atualizaCustoMedio,
        a.estabelecimento,
        CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
        a.idItemPreDocumento,
        a.gradeProduto,
        a.pessoaParticipante,
        a.quantidade,
        a.valorCustoOperacao,
        a.observacoes,
        a.locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho,
        r_bufferIdProdutoFilho);
    END IF;
    FOR b IN (
      SELECT 
        b.observacoes,
        comp.gradeProdutoEstoque gradeProduto,
        gradprod.produto,
        prod.controleEstoque,
        ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
      FROM MOPREDOCUMXCOMPOSICOESPR b
      JOIN CAPRODUTOXCOMPOSICOESPREC comp
      ON comp.composicaoPreco = b.composicaoPreco
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = comp.gradeProdutoEstoque
      JOIN CAPRODUTOS prod
      ON prod.produto = gradprod.produto
      JOIN SIUNIDADESMEDIDA uniFilho
      ON uniFilho.unidadeMedida = prod.unidadeMedida
      WHERE b.idItemPreDocumento = a.idItemPreDocumento
      AND b.selecionado = 1
      AND comp.gradeProdutoEstoque > 0
      AND ROUND (a.quantidade * b.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
    LOOP
      IF b.controleEstoque IN (3,4) THEN
        ADD_ESTOQUE_PRE_DOC_FIL_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.atualizaCustoMedio,
          a.estabelecimento,
          CASE WHEN a.dataEntradaSaida IS NULL OR a.dataEntradaSaida < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntradaSaida END, -- p_data
          a.idItemPreDocumento,
          b.gradeProduto,
          a.pessoaParticipante,
          b.quantidade,
          0, -- a.valorCustoOperacao
          b.observacoes,
          a.locEst_indicProprPosseItem,
          r_bufferIdProdutoFilho,
          r_bufferIdProdutoFilho);
      ELSIF b.controleEstoque IN (1,5,6,11,12) THEN
        ADD_ESTOQUE_PRE_DOC_FIL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_id
          a.idItemPreDocumento,
          b.produto,
          b.gradeProduto,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          b.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          b.observacoes,
          r_bufferIdProdutoFilho, 
          v_auxNumber,
          r_bufferIdProdutoFilho);
      END IF;
    END LOOP;
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_ITEM;

/

create or replace PROCEDURE ADD_ESTOQUE_PRE_DOC_CABECALHO (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_preDocumento            IN NUMBER)
IS
  v_bufferIdEstoque      VARCHAR2 (32000);
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT idItemPreDocumento
    FROM MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento)
  LOOP
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      a.idItemPreDocumento,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    ADD_ESTOQUE_PRE_DOC_FIL_EXCL (
      a.idItemPreDocumento,
      v_bufferIdProdutoFilho,
      v_bufferIdProdutoFilho);
  END LOOP;
  FOR a IN (
    SELECT item.idItemPreDocumento
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_ESTOQUE_PRE_DOC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      a.idItemPreDocumento,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho,
      v_bufferIdEstoque,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_ESTOQUE_PRE_DOC_CABECALHO;

/

create or replace PROCEDURE ADD_ESTOQUE_ORCAMENTO_FIC_PROD (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_ativ_idAtividadeRealOrcament IN NUMBER,
  p_ativ_dataTermino             IN DATE,
  p_ativ_modeloDocumento         IN NUMBER,
  p_ativ_motivoEstoque           IN NUMBER,
  p_fich_idFichaProdutoRealOrcam IN NUMBER,
  p_fich_gradeProduto            IN NUMBER,
  p_fich_atualizaCustoMedio      IN NUMBER,
  p_fich_atualizaUltimaCompra    IN NUMBER,
  p_fich_entradaSaida            IN CHAR,
  p_fich_localEstoque            IN NUMBER,
  p_fich_personalizacao          IN NUMBER,
  p_fich_idLoteEstoque           IN NUMBER,
  p_fich_quantidade              IN NUMBER,
  p_fich_precoCustoOperacao      IN NUMBER,
  p_fich_totalCustoOperacao      IN NUMBER,
  p_fich_precoCMV                IN NUMBER,
  p_fich_valorCMV                IN NUMBER,
  p_fich_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_gradProd_produto             IN NUMBER,
  p_prod_controleEstoque         IN CHAR,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  ADD_ESTOQUE_FIC_TEC_EXCLUI (
    p_fich_idFichaProdutoRealOrcam,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  IF p_fich_quantidade > 0 THEN
    IF p_prod_controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        105, -- p_cab_operacaoInternaEstoque
        p_fich_atualizaCustoMedio,
        p_fich_atualizaUltimaCompra,
        p_fich_entradaSaida,
        p_cab_estabelecimento,
        p_ativ_dataTermino,
        p_ativ_modeloDocumento,
        p_ativ_motivoEstoque,
        p_fich_gradeProduto,
        p_fich_localEstoque,
        0, -- p_item_pessoaParticipante,
        p_fich_quantidade,
        p_fich_totalCustoOperacao,
        p_fich_observacoes,
        p_fich_idFichaProdutoRealOrcam,
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_modDoc_geraTransferencia
        0, -- p_modDoc_geraOperacaoEmTransit
        0, -- p_modDoc_transitoLocalEstoque
        ' ', -- p_locEstTransito_indicProprPos
        p_locEst_indicProprPosseItem,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      ADD_ESTOQUE_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0, -- p_idEstoque
        p_cab_estabelecimento,
        p_ativ_dataTermino, -- p_data
        p_gradProd_produto,
        p_fich_gradeProduto,
        p_ativ_modeloDocumento,
        p_ativ_motivoEstoque,
        105, -- p_operacaoInternaEstoque
        p_fich_atualizaCustoMedio,
        p_fich_atualizaUltimaCompra,
        p_fich_entradaSaida,
        p_locEst_indicProprPosseItem,
        0, -- p_item_pessoaParticipante,
        p_fich_localEstoque,
        p_fich_personalizacao,
        p_fich_idLoteEstoque,
        0, -- p_idNumeroSerie
        p_fich_quantidade,
        p_fich_precoCustoOperacao,
        p_fich_totalCustoOperacao,
        p_fich_precoCMV,
        p_fich_valorCMV,
        p_fich_observacoes,
        p_fich_idFichaProdutoRealOrcam,
        0, -- p_idItemPreDocumento,
        0, -- p_item_idItemDocFiscal,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        r_bufferIdEstoque, 
        v_auxNumber,
        r_bufferIdEstoque);
    END IF;
  END IF;
END ADD_ESTOQUE_ORCAMENTO_FIC_PROD;

/

create or replace PROCEDURE ADD_ESTOQUE_ORCAMENTO_FIC_TEC (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_ativ_idAtividadeRealOrcament IN NUMBER,
  p_ativ_dataTermino             IN DATE,
  p_ativ_modeloDocumento         IN NUMBER,
  p_ativ_motivoEstoque           IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT
      a.idFichaProdutoRealOrcamento,
      a.gradeProduto,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidade,
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      locEst.indicadorPropriedadePosseItem,
      gradProd.produto,
      prod.controleEstoque
    FROM MOORCAMENTOXFICHAPRODREAL a
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idAtividadeRealOrcamento = p_ativ_idAtividadeRealOrcament
    AND a.quantidade > 0
    ORDER BY a.ordenacao)
  LOOP
    ADD_ESTOQUE_ORCAMENTO_FIC_PROD (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_ativ_idAtividadeRealOrcament,
      p_ativ_dataTermino,
      p_ativ_modeloDocumento,
      p_ativ_motivoEstoque,
      a.idFichaProdutoRealOrcamento,
      a.gradeProduto,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidade,
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.indicadorPropriedadePosseItem,
      a.produto,
      a.controleEstoque,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_ORCAMENTO_FIC_TEC;

/

create or replace PROCEDURE ADD_ESTOQUE_ORCAMENTO_AT_REAL (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_ativ_idAtividadePrevOrcament IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT
      idAtividadeRealOrcamento,
      dataTermino,
      modeloDocumento,
      motivoEstoque
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
    AND statusAtividadeServico = 'E'
    ORDER BY sequencia)
  LOOP
    ADD_ESTOQUE_ORCAMENTO_FIC_TEC (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      a.idAtividadeRealOrcamento,
      a.dataTermino,
      a.modeloDocumento,
      a.motivoEstoque,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_ORCAMENTO_AT_REAL;

/

create or replace PROCEDURE ADD_ESTOQUE_ORCAMENTO_AT_PREV (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_item_idItemOrcamento
    ORDER BY sequencia)
  LOOP
    ADD_ESTOQUE_ORCAMENTO_AT_REAL (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      a.idAtividadePrevOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
END ADD_ESTOQUE_ORCAMENTO_AT_PREV;

/

create or replace PROCEDURE ADD_ESTOQUE_INSERE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_estabelecimento              IN NUMBER,
  p_data                         IN DATE,
  p_produto                      IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_modeloDocumento              IN NUMBER,
  p_motivoEstoque                IN NUMBER,
  p_operacaoInternaEstoque       IN NUMBER,
  p_atualizaCustoMedio           IN NUMBER,
  p_atualizaUltimaCompra         IN NUMBER,
  p_entradaSaida                 IN CHAR,
  p_indicadorPropPosseItem       IN CHAR,
  p_pessoaParticipante           IN NUMBER,
  p_localEstoque                 IN NUMBER,
  p_idFormulaTinta               IN NUMBER,
  p_personalizacao               IN NUMBER,
  p_idLoteEstoque                IN NUMBER,
  p_idNumeroSerie                IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_precoCustoOperacao           IN NUMBER,
  p_totalCustoOperacao           IN NUMBER,
  p_precoCMV                     IN NUMBER,
  p_valorCMV                     IN NUMBER,
  p_observacoes                  IN VARCHAR2,
  p_idFichaProdutoRealOrcamento  IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_divergenciaBalanco           IN NUMBER,
  p_idItemDocTransferencia       IN NUMBER,
  p_prod_controleEstoque         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
  v_auxNumber       NUMBER;
BEGIN
  v_bufferIdEstoque := '';
  IF p_prod_controleEstoque = 12 AND p_idFormulaTinta > 0 THEN
    ADD_ESTOQUE_FORMULA_TINTA (
      p_sys_estabelecimentoAtivo, 
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_operacaoInternaEstoque,
      p_atualizaCustoMedio,
      p_atualizaUltimaCompra,
      p_entradaSaida,
      p_estabelecimento,
      p_data,
      p_modeloDocumento,
      p_motivoEstoque,
      p_idFormulaTinta,
      p_localEstoque,
      p_pessoaParticipante,
      p_quantidade,
      p_observacoes,
      p_idFichaProdutoRealOrcamento,
      p_idItemPreDocumento,
      p_idItemDocFiscal,
      p_divergenciaBalanco,
      p_idItemDocTransferencia,
      0, -- p_modDoc_geraTransferencia
      0, -- p_modDoc_geraOperacaoEmTransit
      0, -- p_modDoc_transitoLocalEstoque
      ' ', -- p_locEstTransito_indicProprPos
      p_indicadorPropPosseItem,
      0, -- p_docTransf_estabelecEntrada
      0, -- p_docTransf_estabelecSaida
      v_bufferIdEstoque, 
      v_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
    ADD_ESTOQUE_KIT (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_operacaoInternaEstoque,
      p_atualizaCustoMedio,
      p_atualizaUltimaCompra,
      p_entradaSaida,
      p_estabelecimento,
      p_data,
      p_modeloDocumento,
      p_motivoEstoque,
      p_gradeProduto,
      p_localEstoque,
      p_pessoaParticipante,
      p_quantidade,
      p_totalCustoOperacao,
      p_observacoes,
      p_idFichaProdutoRealOrcamento,
      p_idItemPreDocumento,
      p_idItemDocFiscal,
      p_divergenciaBalanco,
      p_idItemDocTransferencia,
      0, -- p_modDoc_geraTransferencia
      0, -- p_modDoc_geraOperacaoEmTransit
      0, -- p_modDoc_transitoLocalEstoque
      ' ', -- p_locEstTransito_indicProprPos
      p_indicadorPropPosseItem,
      0, -- p_docTransf_estabelecEntrada
      0, -- p_docTransf_estabelecSaida
      v_bufferIdEstoque,
      v_bufferIdEstoque);
  ELSIF p_prod_controleEstoque IN(1,5,6,11,12) THEN
    ADD_ESTOQUE_GRAVA (
      p_sys_estabelecimentoAtivo, 
      p_config_354_estabProximoId,
      0, -- p_idEstoque
      p_estabelecimento,
      p_data,
      p_produto,
      p_gradeProduto,
      p_modeloDocumento,
      p_motivoEstoque,
      p_operacaoInternaEstoque,
      p_atualizaCustoMedio,
      p_atualizaUltimaCompra,
      p_entradaSaida,
      p_indicadorPropPosseItem,
      p_pessoaParticipante,
      p_localEstoque,
      p_personalizacao,
      p_idLoteEstoque,
      p_idNumeroSerie,
      p_quantidade,
      p_precoCustoOperacao,
      p_totalCustoOperacao,
      p_precoCMV,
      p_valorCMV,
      p_observacoes,
      p_idFichaProdutoRealOrcamento,
      p_idItemPreDocumento,
      p_idItemDocFiscal,
      p_divergenciaBalanco,
      p_idItemDocTransferencia,
      v_bufferIdEstoque,
      v_auxNumber,
      v_bufferIdEstoque);
  END IF;
END ADD_ESTOQUE_INSERE;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_EXCLUI (
  p_idReservaEstoque IN NUMBER)
IS
BEGIN
  DELETE MODOCTRANSFXRESERVAESTOQ
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MOORCAMENTOXFICHAXRESERVA
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MOORCAMENTOXRESERVAESTOQ
  WHERE idReservaEstoque = p_idReservaEstoque;
  DELETE MORESERVASESTOQUE
  WHERE idReservaEstoque = p_idReservaEstoque;
END ADD_RESERVA_ESTOQUE_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_bufferIdReservaEstoque      IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque      OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT idReservaEstoque
    FROM MOORCAMENTOXFICHAXRESERVA
    WHERE idFichaProdutoPrevOrcamento = p_idFichaProdutoPrevOrcamento)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_FIC_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
  p_idItemDocTransferencia IN NUMBER,
  p_bufferIdReservaEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT idReservaEstoque
    FROM MODOCTRANSFXRESERVAESTOQ
    WHERE idItemDocTransferencia = p_idItemDocTransferencia)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_TRA_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
  p_idItemOrcamento        IN NUMBER,
  p_bufferIdReservaEstoque IN VARCHAR,
  /* Retornos */
  r_bufferIdReservaEstoque OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT idReservaEstoque
    FROM MOORCAMENTOXRESERVAESTOQ
    WHERE idItemOrcamento = p_idItemOrcamento)
  LOOP
    r_bufferIdReservaEstoque :=
      CASE
        WHEN r_bufferIdReservaEstoque IS NULL
          OR r_bufferIdReservaEstoque = ''
          OR r_bufferIdReservaEstoque = ' '
        THEN ''
        ELSE TRIM (r_bufferIdReservaEstoque) || ';'
      END
      || LPAD(a.idReservaEstoque,14,'0');
    ADD_RESERVA_ESTOQUE_EXCLUI (a.idReservaEstoque);
  END LOOP;
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_idItemOrcamento
	AND idAtividadePrevOrcamento > 0)
  LOOP
    FOR b IN (
      SELECT b.idFichaProdutoPrevOrcamento
      FROM MOORCAMENTOXFICHAPRODPREV b
      WHERE b.idAtividadePrevOrcamento = idAtividadePrevOrcamento
      AND b.idFichaProdutoPrevOrcamento > 0)
    LOOP
      ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
        b.idFichaProdutoPrevOrcamento,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END LOOP;
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_EXCLUI;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_GRAVA (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idReservaEstoque            IN NUMBER,
  p_estabelecimento             IN NUMBER,
  p_dataEntrega                 IN DATE,
  p_produto                     IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_modeloDocumento             IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_indicadorPropPosseItem      IN CHAR,
  p_pessoaParticipante          IN NUMBER,
  p_localEstoque                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_quantidadeSaldo             IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  p_idItemOrcamento             IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  p_bufferIdReservaEstoque      IN VARCHAR2,
  r_idReservaEstoque            OUT NUMBER,
  r_bufferIdReservaEstoque      OUT VARCHAR2)
IS
  v_existeRegistro NUMBER;
BEGIN
  IF p_idReservaEstoque > 0 THEN
    r_idReservaEstoque       := p_idReservaEstoque;
    r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ELSIF p_bufferIdReservaEstoque IS NOT NULL AND LENGTH (RTRIM (p_bufferIdReservaEstoque)) >= 14 THEN
    r_idReservaEstoque       := TO_NUMBER (SUBSTR (p_bufferIdReservaEstoque, 1, 14));
    r_bufferIdReservaEstoque := RTRIM (SUBSTR (p_bufferIdReservaEstoque, 16, 31984));
  ELSE
    r_idReservaEstoque       := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MORESERVASESTOQUE',
      'idReservaEstoque',
      14);
    r_bufferIdReservaEstoque := '';
  END IF;
  MERGE INTO MORESERVASESTOQUE a USING (
    SELECT
      r_idReservaEstoque       idReservaEstoque,
      p_estabelecimento        estabelecimento,
      p_dataEntrega            dataEntrega,
      p_produto                produto,
      p_gradeProduto           gradeProduto,
      p_modeloDocumento        modeloDocumento,
      p_entradaSaida           entradaSaida,
      p_indicadorPropPosseItem indicadorPropriedadePosseItem,
      p_pessoaParticipante     pessoaParticipante,
      p_localEstoque           localEstoque,
      p_personalizacao         personalizacao,
      p_idLoteEstoque          idLoteEstoque,
      p_idNumeroSerie          idNumeroSerie,
      p_quantidadeSaldo        quantidadeSaldo,
      p_observacoes            observacoes
    FROM DUAL) b
  ON (a.idReservaEstoque = b.idReservaEstoque)
  WHEN MATCHED THEN UPDATE SET 
    a.estabelecimento               = b.estabelecimento,
    a.dataEntrega                   = b.dataEntrega,
    a.produto                       = b.produto,
    a.gradeProduto                  = b.gradeProduto,
    a.modeloDocumento               = b.modeloDocumento,
    a.entradaSaida                  = b.entradaSaida,
    a.indicadorPropriedadePosseItem = b.indicadorPropriedadePosseItem,
    a.pessoaParticipante            = b.pessoaParticipante,
    a.localEstoque                  = b.localEstoque,
    a.personalizacao                = b.personalizacao,
    a.idLoteEstoque                 = b.idLoteEstoque,
    a.idNumeroSerie                 = b.idNumeroSerie,
    a.quantidadeSaldo               = b.quantidadeSaldo,
    a.observacoes                   = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idReservaEstoque,
    estabelecimento,
    dataEntrega,
    produto,
    gradeProduto,
    modeloDocumento,
    entradaSaida,
    indicadorPropriedadePosseItem,
    pessoaParticipante,
    localEstoque,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidadeSaldo,
    observacoes)
  VALUES (
    b.idReservaEstoque,
    b.estabelecimento,
    b.dataEntrega,
    b.produto,
    b.gradeProduto,
    b.modeloDocumento,
    b.entradaSaida,
    b.indicadorPropriedadePosseItem,
    b.pessoaParticipante,
    b.localEstoque,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidadeSaldo,
    b.observacoes);
  IF p_idItemOrcamento > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MOORCAMENTOXRESERVAESTOQ
    WHERE idItemOrcamento = p_idItemOrcamento
    AND idReservaEstoque = r_idReservaEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MOORCAMENTOXRESERVAESTOQ (
        id,
        idReservaEstoque,
        idItemOrcamento)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MOORCAMENTOXRESERVAESTOQ',
          'id',
          14),
        r_idReservaEstoque,
        p_idItemOrcamento);
    END IF;
  END IF;
  IF p_idFichaProdutoPrevOrcamento > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MOORCAMENTOXFICHAXRESERVA
    WHERE idFichaProdutoPrevOrcamento = p_idFichaProdutoPrevOrcamento
    AND idReservaEstoque = r_idReservaEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MOORCAMENTOXFICHAXRESERVA (
        id,
        idReservaEstoque,
        idFichaProdutoPrevOrcamento)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MOORCAMENTOXFICHAXRESERVA',
          'id',
          14),
        r_idReservaEstoque,
        p_idFichaProdutoPrevOrcamento);
    END IF;
  END IF;
  IF p_idItemDocTransferencia > 0 THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_existeRegistro
    FROM MODOCTRANSFXRESERVAESTOQ
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND idReservaEstoque = r_idReservaEstoque;
    IF v_existeRegistro = 0 THEN
      INSERT INTO MODOCTRANSFXRESERVAESTOQ (
        id,
        idReservaEstoque,
        idItemDocTransferencia)
      VALUES (
        FUNC_ADD_PROXIMO_ID (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'MODOCTRANSFXRESERVAESTOQ',
          'id',
          14),
        r_idReservaEstoque,
        p_idItemDocTransferencia);
    END IF;
  END IF;
END ADD_RESERVA_ESTOQUE_GRAVA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_N_SER (
  p_sys_estabelecimentoAtivo   IN NUMBER,
  p_config_354_estabProximoId  IN NUMBER,
  p_cab_entradaSaida           IN CHAR,
  p_cab_estabelecimento        IN NUMBER,
  p_dataEntrega                IN DATE,
  p_item_idItemOrcamento       IN NUMBER,
  p_item_modeloDocumento       IN NUMBER,
  p_item_gradeProduto          IN NUMBER,
  p_item_personalizacao        IN NUMBER,
  p_item_idLoteEstoque         IN NUMBER,
  p_item_localEstoque          IN NUMBER,
  p_item_pessoaParticipante    IN NUMBER,
  p_item_observacoes           IN VARCHAR2,
  p_graProd_produto            IN NUMBER,
  p_locEst_indicProprPosseItem IN CHAR,
  p_bufferIdReservaEstoque     IN VARCHAR2,
  r_bufferIdReservaEstoque     OUT VARCHAR2,
  r_quantidadeNumerosSerie     OUT NUMBER)
IS
  v_auxNumber NUMBER;  
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE 
    WHERE idItemOrcamento = p_item_idItemOrcamento
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_RESERVA_ESTOQUE_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idReservaEstoque
      p_cab_estabelecimento,
      p_dataEntrega,
      p_graProd_produto,
      p_item_gradeProduto,
      p_item_modeloDocumento,
      p_cab_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      a.idNumeroSerie,
      1, -- p_quantidadeSaldo
      p_item_observacoes,
      p_item_idItemOrcamento,
      0, -- p_idFichaProdutoPrevOrcamento
      0, -- p_idItemDocTransferencia
      r_bufferIdReservaEstoque, 
      v_auxNumber,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_N_SER;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_N_SER (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_item_idItemDocTransferencia  IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_graProd_produto              IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
  v_auxNumber NUMBER;  
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MODOCTRANSFXNUMEROSSERIE 
    WHERE idItemDocTransferencia = p_item_idItemDocTransferencia
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_RESERVA_ESTOQUE_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idReservaEstoque
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_graProd_produto,
      p_item_gradeProduto,
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      a.idNumeroSerie,
      1, -- p_quantidadeSaldo
      p_item_observacoes,
      0, --p_idItemOrcamento
      0, -- p_idFichaProdutoPrevOrcamento
      p_item_idItemDocTransferencia,
      r_bufferIdReservaEstoque, 
      v_auxNumber,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_TRA_N_SER;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_KIT (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_cab_entradaSaida            IN CHAR,
  p_cab_estabelecimento         IN NUMBER,
  p_dataEntrega                 IN DATE,
  p_item_modeloDocumento        IN NUMBER,
  p_item_gradeProduto           IN NUMBER,
  p_item_localEstoque           IN NUMBER,
  p_item_pessoaParticipante     IN NUMBER,
  p_item_quantidadeSaldo        IN NUMBER,
  p_item_observacoes            IN VARCHAR2,
  p_idItemOrcamento             IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  p_locEst_indicProprPosseItem  IN CHAR,
  p_bufferIdReservaEstoque      IN VARCHAR2,
  r_bufferIdReservaEstoque      OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie     NUMBER;
  v_auxNumber                  NUMBER;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho gradeProduto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND (p_item_quantidadeSaldo * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND ROUND (p_item_quantidadeSaldo * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        a.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidadeSaldo,
        p_item_observacoes,
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0
        AND p_idItemOrcamento > 0
      THEN
        ADD_RESERVA_ESTOQUE_ORC_N_SER (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_dataEntrega,
          p_idItemOrcamento,
          p_item_modeloDocumento,
          a.gradeProduto,
          0, -- p_personalizacao,
          0, -- p_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_observacoes,
          a.produto,
          p_locEst_indicProprPosseItem,
          r_bufferIdReservaEstoque, 
          r_bufferIdReservaEstoque,
          v_quantidadeNumerosSerie);
      ELSIF a.controlaNumeroSerie > 0
        AND p_idItemDocTransferencia > 0
      THEN
        ADD_RESERVA_ESTOQUE_TRA_N_SER (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          p_item_modeloDocumento,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_dataEntrega,
          p_idItemDocTransferencia,
          a.gradeProduto,
          0, -- p_personalizacao,
          0, -- p_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_observacoes,
          a.produto,
          p_locEst_indicProprPosseItem,
          r_bufferIdReservaEstoque, 
          r_bufferIdReservaEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
        ADD_RESERVA_ESTOQUE_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0, -- p_idReservaEstoque
          p_cab_estabelecimento,
          p_dataEntrega,
          a.produto,
          a.gradeProduto,
          p_item_modeloDocumento,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_item_personalizacao
          0, -- p_idLoteEstoque
          0, -- p_idNumeroSerie
          a.quantidadeSaldo,
          p_item_observacoes,
          p_idItemOrcamento,
          p_idFichaProdutoPrevOrcamento,
          p_idItemDocTransferencia,
          r_bufferIdReservaEstoque, 
          v_auxNumber,
          r_bufferIdReservaEstoque);
      END IF;
    END IF;
  END LOOP; 
END ADD_RESERVA_ESTOQUE_KIT;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_PROD_TINTA (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_cab_entradaSaida            IN CHAR,
  p_cab_estabelecimento         IN NUMBER,
  p_dataEntrega                 IN DATE,
  p_item_modeloDocumento        IN NUMBER,
  p_item_localEstoque           IN NUMBER,
  p_item_pessoaParticipante     IN NUMBER,
  p_item_quantidadeSaldo        IN NUMBER,
  p_item_observacoes            IN VARCHAR2,
  p_tinta_gradeProduto          IN NUMBER,
  p_tinta_quantidade            IN NUMBER,
  p_idItemOrcamento             IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  p_locEst_indicProprPosseItem  IN CHAR,
  p_bufferIdReservaEstoque      IN VARCHAR2,
  r_bufferIdReservaEstoque      OUT VARCHAR2)
IS
  v_auxNumber                   NUMBER;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT 
      gradProd.produto,
      prod.controleEstoque,
      ROUND(p_item_quantidadeSaldo * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidadeSaldo
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidadeSaldo * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_tinta_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidadeSaldo,
        p_item_observacoes,
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        p_sys_estabelecimentoAtivo, 
        p_config_354_estabProximoId,
        0, -- p_idReservaEstoque
        p_cab_estabelecimento,
        p_dataEntrega,
        a.produto,
        p_tinta_gradeProduto,
        p_item_modeloDocumento,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_item_personalizacao
        0, --p_idLoteEstoque
        0, --p_idNumeroSerie
        a.quantidadeSaldo,
        p_item_observacoes,
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        r_bufferIdReservaEstoque,
        v_auxNumber,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_RESERVA_ESTOQUE_PROD_TINTA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_FORM_TINTA ( 
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_cab_entradaSaida            IN CHAR,
  p_cab_estabelecimento         IN NUMBER,
  p_dataEntrega                 IN DATE,
  p_item_modeloDocumento        IN NUMBER,
  p_item_idFormulaTinta         IN NUMBER,
  p_item_localEstoque           IN NUMBER,
  p_item_pessoaParticipante     IN NUMBER,
  p_item_quantidadeSaldo        IN NUMBER,
  p_item_observacoes            IN VARCHAR2,
  p_idItemOrcamento             IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  p_locEst_indicProprPosseItem  IN CHAR,
  p_bufferIdReservaEstoque      IN VARCHAR2,
  r_bufferIdReservaEstoque      OUT VARCHAR2)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT 
      formTinta.idBaseTinta,
      baseTinta.gradeProduto,
      formTinta.idColoranteTintaA,
      formTinta.quantidadeA,
      COALESCE(colTintaA.gradeProduto, 0) gradeProdutoA,
      formTinta.idColoranteTintaB,
      formTinta.quantidadeB,
      COALESCE(colTintaB.gradeProduto, 0) gradeProdutoB,
      formTinta.idColoranteTintaC,
      formTinta.quantidadeC,
      COALESCE(colTintaC.gradeProduto, 0) gradeProdutoC,
      formTinta.idColoranteTintaD,
      formTinta.quantidadeD,
      COALESCE(colTintaD.gradeProduto, 0) gradeProdutoD,
      formTinta.idColoranteTintaE,
      formTinta.quantidadeE,
      COALESCE(colTintaE.gradeProduto, 0) gradeProdutoE,
      formTinta.idColoranteTintaF,
      formTinta.quantidadeF,
      COALESCE(colTintaF.gradeProduto, 0) gradeProdutoF,
      formTinta.idColoranteTintaG,
      formTinta.quantidadeG,
      COALESCE(colTintaG.gradeProduto, 0) gradeProdutoG,
      formTinta.idColoranteTintaH,
      formTinta.quantidadeH,
      COALESCE(colTintaH.gradeProduto, 0) gradeProdutoH,
      formTinta.idColoranteTintaI,
      formTinta.quantidadeI,
      COALESCE(colTintaI.gradeProduto, 0) gradeProdutoI,
      formTinta.idColoranteTintaJ,
      formTinta.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto, 0) gradeProdutoJ,
      formTinta.idColoranteTintaK,
      formTinta.quantidadeK,
      COALESCE(colTintaK.gradeProduto, 0) gradeProdutoK,
      formTinta.idColoranteTintaL,
      formTinta.quantidadeL,
      COALESCE(colTintaL.gradeProduto, 0) gradeProdutoL,
      formTinta.idColoranteTintaM,
      formTinta.quantidadeM,
      COALESCE(colTintaM.gradeProduto, 0) gradeProdutoM,
      formTinta.idColoranteTintaN,
      formTinta.quantidadeN,
      COALESCE(colTintaN.gradeProduto, 0) gradeProdutoN,
      formTinta.idColoranteTintaO,
      formTinta.quantidadeO,
      COALESCE(colTintaO.gradeProduto, 0) gradeProdutoO
    FROM CAFORMULASTINTAS formTinta 
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = formTinta.idBaseTinta
    LEFT JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = formTinta.idColoranteTintaA
    LEFT JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = formTinta.idColoranteTintaB
    LEFT JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = formTinta.idColoranteTintaC
    LEFT JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = formTinta.idColoranteTintaD
    LEFT JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = formTinta.idColoranteTintaE
    LEFT JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = formTinta.idColoranteTintaF
    LEFT JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = formTinta.idColoranteTintaG
    LEFT JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = formTinta.idColoranteTintaH
    LEFT JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = formTinta.idColoranteTintaI
    LEFT JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = formTinta.idColoranteTintaJ
    LEFT JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = formTinta.idColoranteTintaK
    LEFT JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = formTinta.idColoranteTintaL
    LEFT JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = formTinta.idColoranteTintaM
    LEFT JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = formTinta.idColoranteTintaN
    LEFT JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = formTinta.idColoranteTintaO
    WHERE formTinta.idFormulaTinta = p_item_idFormulaTinta
    AND formTinta.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_RESERVA_ESTOQUE_PROD_TINTA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_dataEntrega,
      p_item_modeloDocumento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidadeSaldo,
      p_item_observacoes,
      a.gradeProduto, -- p_tinta_gradeProduto
      900, -- p_tinta_quantidade
      p_idItemOrcamento,
      p_idFichaProdutoPrevOrcamento,
      p_idItemDocTransferencia,
      p_locEst_indicProprPosseItem,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
    IF a.idColoranteTintaA > 0
      AND a.quantidadeA > 0
      AND a.gradeProdutoA > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoA, -- p_tinta_gradeProduto
        a.quantidadeA, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
   END IF;
    IF a.idColoranteTintaB > 0
      AND a.quantidadeB > 0
      AND a.gradeProdutoB > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoB, -- p_tinta_gradeProduto
        a.quantidadeB, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.quantidadeC > 0
      AND a.gradeProdutoC > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoC, -- p_tinta_gradeProduto
        a.quantidadeC, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.quantidadeD > 0
      AND a.gradeProdutoD > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoD, -- p_tinta_gradeProduto
        a.quantidadeD, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.quantidadeE > 0
      AND a.gradeProdutoE > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoE, -- p_tinta_gradeProduto
        a.quantidadeE, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.quantidadeF > 0
      AND a.gradeProdutoF > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoF, -- p_tinta_gradeProduto
        a.quantidadeF, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.quantidadeG > 0
      AND a.gradeProdutoG > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoG, -- p_tinta_gradeProduto
        a.quantidadeG, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.quantidadeH > 0
      AND a.gradeProdutoH > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoH, -- p_tinta_gradeProduto
        a.quantidadeH, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.quantidadeI > 0
      AND a.gradeProdutoI > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoI, -- p_tinta_gradeProduto
        a.quantidadeI, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.quantidadeJ > 0
      AND a.gradeProdutoJ > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoJ, -- p_tinta_gradeProduto
        a.quantidadeJ, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.quantidadeK > 0
      AND a.gradeProdutoK > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoK, -- p_tinta_gradeProduto
        a.quantidadeK, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.quantidadeL > 0
      AND a.gradeProdutoL > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoL, -- p_tinta_gradeProduto
        a.quantidadeL, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.quantidadeM > 0
      AND a.gradeProdutoM > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoM, -- p_tinta_gradeProduto
        a.quantidadeM, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.quantidadeN > 0
      AND a.gradeProdutoN > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoN, -- p_tinta_gradeProduto
        a.quantidadeN, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.quantidadeO > 0
      AND a.gradeProdutoO > 0
    THEN
       ADD_RESERVA_ESTOQUE_PROD_TINTA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_dataEntrega,
        p_item_modeloDocumento,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidadeSaldo,
        p_item_observacoes,
        a.gradeProdutoO, -- p_tinta_gradeProduto
        a.quantidadeO, -- p_tinta_quantidade
        p_idItemOrcamento,
        p_idFichaProdutoPrevOrcamento,
        p_idItemDocTransferencia,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_RESERVA_ESTOQUE_FORM_TINTA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_FIC_PR (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativ_dataInicio              IN DATE,
  p_ativ_dataTermino             IN DATE,
  p_fich_idFichaProdutoPrevOrcam IN NUMBER,
  p_fich_entradaSaida            IN CHAR,
  p_fich_localEstoque            IN NUMBER,
  p_fich_gradeProduto            IN NUMBER,
  p_fich_personalizacao          IN NUMBER,
  p_fich_idLoteEstoque           IN NUMBER,
  p_fich_quantidadeSaldo         IN NUMBER,
  p_fich_observacoes             IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_gradProd_produto             IN NUMBER,
  p_prod_controleEstoque         IN CHAR,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
    p_fich_idFichaProdutoPrevOrcam,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  IF p_fich_quantidadeSaldo > 0 THEN
    IF p_prod_controleEstoque IN (3,4) THEN
      ADD_RESERVA_ESTOQUE_KIT (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        p_fich_entradaSaida,
        p_cab_estabelecimento,
        CASE
          WHEN p_fich_entradaSaida = 'E'
            AND p_ativ_dataTermino IS NOT NULL
            AND (p_ativ_dataInicio IS NULL
              OR p_ativ_dataTermino >= p_ativ_dataInicio)
          THEN p_ativ_dataTermino
          WHEN p_ativ_dataInicio IS NOT NULL
          THEN p_ativ_dataInicio
          WHEN p_cab_dataEntrega IS NOT NULL
            AND p_cab_dataEntrega >= p_cab_dataEmissao
          THEN p_cab_dataEntrega
          ELSE p_cab_dataEmissao
        END, -- p_dataEntrega
        p_item_modeloDocumento,
        p_fich_gradeProduto,
        p_fich_localEstoque,
        0, -- p_item_pessoaParticipante,
        p_fich_quantidadeSaldo,
        p_fich_observacoes,
        0, -- p_idItemOrcamento,
        p_fich_idFichaProdutoPrevOrcam,
        0, -- p_idItemDocTransferencia
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque, 
        r_bufferIdReservaEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      ADD_RESERVA_ESTOQUE_GRAVA (
        p_sys_estabelecimentoAtivo, 
        p_config_354_estabProximoId,
        0, -- p_idReservaEstoque
        p_cab_estabelecimento,
        CASE
          WHEN p_fich_entradaSaida = 'E'
            AND p_ativ_dataTermino IS NOT NULL
            AND (p_ativ_dataInicio IS NULL
              OR p_ativ_dataTermino >= p_ativ_dataInicio)
          THEN p_ativ_dataTermino
          WHEN p_ativ_dataInicio IS NOT NULL
          THEN p_ativ_dataInicio
          WHEN p_cab_dataEntrega IS NOT NULL
            AND p_cab_dataEntrega >= p_cab_dataEmissao
          THEN p_cab_dataEntrega
          ELSE p_cab_dataEmissao
        END, -- p_dataEntrega
        p_gradProd_produto,
        p_fich_gradeProduto,
        p_item_modeloDocumento,
        p_fich_entradaSaida,
        p_locEst_indicProprPosseItem,
        0, -- p_item_pessoaParticipante,
        p_fich_localEstoque,
        p_fich_personalizacao,
        p_fich_idLoteEstoque,
        0, -- p_idNumeroSerie
        p_fich_quantidadeSaldo,
        p_fich_observacoes,
        0, -- p_idItemOrcamento,
        p_fich_idFichaProdutoPrevOrcam,
        0, -- p_idItemDocTransferencia
        r_bufferIdReservaEstoque, 
        v_auxNumber,
        r_bufferIdReservaEstoque);
    END IF;
  END IF;
END ADD_RESERVA_ESTOQUE_ORC_FIC_PR;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_FICHA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativ_idAtividadePrevOrcament IN NUMBER,
  p_ativ_dataInicio              IN DATE,
  p_ativ_dataTermino             IN DATE,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeSaldo,
      a.observacoes,
      locEst.indicadorPropriedadePosseItem,
      gradProd.produto,
      prod.controleEstoque
    FROM MOORCAMENTOXFICHAPRODPREV a
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
    AND a.quantidadeSaldo > 0
    ORDER BY a.ordenacao)
  LOOP
    ADD_RESERVA_ESTOQUE_ORC_FIC_PR (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_modeloDocumento,
      p_ativ_dataInicio,
      p_ativ_dataTermino,
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeSaldo,
      a.observacoes,
      a.indicadorPropriedadePosseItem,
      a.produto,
      a.controleEstoque,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_FICHA;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_ATIV (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_cab_estabelecimento       IN NUMBER,
  p_cab_dataEmissao           IN DATE,
  p_cab_dataEntrega           IN DATE,
  p_item_idItemOrcamento      IN NUMBER,
  p_item_modeloDocumento      IN NUMBER,
  p_bufferIdReservaEstoque    IN VARCHAR2,
  r_bufferIdReservaEstoque    OUT VARCHAR2)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      idAtividadePrevOrcamento,
      dataInicio,
      dataTermino
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_item_idItemOrcamento
    AND statusAtividadeServico IN ('A', 'I', 'P')
    ORDER BY sequencia)
  LOOP
    ADD_RESERVA_ESTOQUE_ORC_FICHA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_modeloDocumento,
      a.idAtividadePrevOrcamento,
      a.dataInicio,
      a.dataTermino,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_ATIV;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_ITEM (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_bufferIdEstoque := p_bufferIdEstoque;
  ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
    p_item_idItemOrcamento,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  ADD_ESTOQUE_ORCAMENTO_EXCLUI (
    p_item_idItemOrcamento,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  FOR a IN (
    SELECT
      cabOrc.tipoDocumento,
      cabOrc.entradaSaida,
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        WHEN prod.estabelecimentoFaturamento > 0
        THEN prod.estabelecimentoFaturamento
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoSaida > 0
        THEN contrEntr.estabelecimentoSaida
        ELSE cabOrc.estabelecimento
      END estabelecimento,
      cabOrc.dataEmissao,
      itemOrc.dataEntrega,
      itemOrc.idItemOrcamento,
      itemOrc.modeloDocumento,
      itemOrc.gradeProduto,
      itemOrc.personalizacao,
      itemOrc.idFormulaTinta,
      itemOrc.idLoteEstoque,
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END localEstoque,
      itemOrc.pessoaParticipante,
      itemOrc.quantidadeSaldo,
      itemOrc.observacoes,
      gradProd.produto,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM MOORCAMENTOXITENS itemOrc
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemOrc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque =
      CASE
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.localEstoqueSaida > 0
        THEN contrEntr.localEstoqueSaida
        ELSE itemOrc.localEstoque
      END 
   WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND (cabOrc.tipoDocumento = 202
      OR itemOrc.quantidadeSaldo > 0)
    AND etapOrc.situacaoOrcamento BETWEEN 41 AND 89
    UNION ALL
    SELECT
      cabOrc.tipoDocumento,
      cabOrc.entradaSaida,
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END estabelecimento,
      doc.dataEmissao,
      itemOrc.dataEntrega,
      itemOrc.idItemOrcamento,
      itemOrc.modeloDocumento,
      itemDoc.gradeProduto,
      itemDoc.personalizacao,
      itemDoc.idFormulaTinta,
      itemDoc.idLoteEstoque,
      itemDoc.localEstoque,
      itemDoc.pessoaParticipante,
      ( itemDoc.quantidade
        - itemDoc.quantidadeDevolvidaRetornada
        - COALESCE ((
            SELECT SUM (entr.quantidade *
              CASE
                WHEN itemDoc.quantidadeConvertida = 0
                THEN 1
                ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
              END)
            FROM MOENTREGAS entr
            WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
            AND entr.situacaoEntrega IN (5,6)),0)) quantidadeSaldo,
      itemDoc.observacoes,
      gradProd.produto,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM MOORCAMENTOXITENS itemOrc
    JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
    ON docXOrc.idItemOrcamento = itemOrc.idItemOrcamento
    JOIN MOPREDOCUMXITENS itemDoc
    ON itemDoc.idItemPreDocumento = docXOrc.idItemPreDocumento
    JOIN MOPREDOCUMENTOS doc
    ON doc.preDocumento = itemDoc.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = itemDoc.localEstoque 
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND itemOrc.quantidadeSaldo = 0
    AND itemOrc.controleEntrega > 0
    AND cabOrc.tipoDocumento <> 202
    AND etapOrc.situacaoOrcamento BETWEEN 64 AND 89
    AND contrEntr.reservaEstoque = 1
    AND docXOrc.quantidade > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 0
    AND doc.entradaSaida = 'S'
    AND doc.devolucaoAnulacaoRetorno = 0
    AND doc.statusPreDocumento <> 'C'
    AND ( itemDoc.quantidade
      - itemDoc.quantidadeDevolvidaRetornada
      - COALESCE ((
          SELECT SUM (entr.quantidade *
            CASE
              WHEN itemDoc.quantidadeConvertida = 0
              THEN 1
              ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
            END)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
          AND entr.situacaoEntrega IN (5,6)),0)) > 0
    UNION ALL
    SELECT
      cabOrc.tipoDocumento,
      cabOrc.entradaSaida,
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END estabelecimento,
      doc.dataEmissao,
      doc.dataEntradaSaida dataEntrega,
      itemOrc.idItemOrcamento,
      itemOrc.modeloDocumento,
      itemDoc.gradeProduto,
      itemDoc.personalizacao,
      itemDoc.idFormulaTinta,
      itemDoc.idLoteEstoque,
      itemDoc.localEstoque,
      itemDoc.pessoaParticipante,
      ( itemDoc.quantidade
        - itemDoc.quantidadeDevolvidaRetornada
        - COALESCE ((
            SELECT SUM (entr.quantidade *
              CASE
                WHEN itemDoc.quantidadeConvertida = 0
                THEN 1
                ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
              END)
            FROM MOENTREGAS entr
            WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
            AND entr.situacaoEntrega IN (5,6)),0)) quantidadeSaldo,
      itemDoc.observacoes,
      gradProd.produto,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM MOORCAMENTOXITENS itemOrc
    JOIN MODOCFISCALXORCAMENTOITEM docXOrc
    ON docXOrc.idItemOrcamento = itemOrc.idItemOrcamento
    JOIN MODOCFISCALXITENS itemDoc
    ON itemDoc.idItemDocFiscal = docXOrc.idItemDocFiscal
    JOIN MODOCUMENTOSFISCAIS doc
    ON doc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = itemDoc.localEstoque 
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND itemOrc.quantidadeSaldo = 0
    AND itemOrc.controleEntrega > 0
    AND cabOrc.tipoDocumento <> 202
    AND etapOrc.situacaoOrcamento BETWEEN 64 AND 89
    AND contrEntr.reservaEstoque = 1
    AND docXOrc.quantidade > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 0
    AND doc.entradaSaida = 'S'
    AND doc.devolucaoAnulacaoRetorno = 0
    AND doc.situacaoDocumentoFiscal <= 23
    AND ( itemDoc.quantidade
      - itemDoc.quantidadeDevolvidaRetornada
      - COALESCE ((
          SELECT SUM (entr.quantidade *
            CASE
              WHEN itemDoc.quantidadeConvertida = 0
              THEN 1
              ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
            END)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
          AND entr.situacaoEntrega IN (5,6)),0)) > 0)
  LOOP
    IF a.tipoDocumento = 202 THEN
      ADD_RESERVA_ESTOQUE_ORC_ATIV (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        a.estabelecimento,
        a.dataEmissao,
        a.dataEntrega,
        a.idItemOrcamento,
        a.modeloDocumento,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
      ADD_ESTOQUE_ORCAMENTO_AT_PREV (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.estabelecimento,
        a.idItemOrcamento,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSE
      IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
        ADD_RESERVA_ESTOQUE_FORM_TINTA (
          p_sys_estabelecimentoAtivo, 
          p_config_354_estabProximoId,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntrega IS NULL OR a.dataEntrega < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntrega END, -- p_dataEntrega
          a.modeloDocumento,
          a.idFormulaTinta,
          a.localEstoque,
          a.pessoaParticipante,
          a.quantidadeSaldo,
          a.observacoes,
          a.idItemOrcamento,
          0, -- p_idFichaProdutoPrevOrcamento
          0, -- p_idItemDocTransferencia
          a.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque, 
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (3,4) THEN
        ADD_RESERVA_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          a.entradaSaida,
          a.estabelecimento,
          CASE WHEN a.dataEntrega IS NULL OR a.dataEntrega < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntrega END, -- p_dataEntrega
          a.modeloDocumento,
          a.gradeProduto,
          a.localEstoque,
          a.pessoaParticipante,
          a.quantidadeSaldo,
          a.observacoes,
          a.idItemOrcamento,
          0, -- p_idFichaProdutoPrevOrcamento
          0, -- p_idItemDocTransferencia
          a.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque,
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
        v_quantidadeNumerosSerie := 0;
        IF a.controlaNumeroSerie > 0 THEN
          ADD_RESERVA_ESTOQUE_ORC_N_SER (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntrega IS NULL OR a.dataEntrega < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntrega END, -- p_dataEntrega
            a.idItemOrcamento,
            a.modeloDocumento,
            a.gradeProduto,
            a.personalizacao,
            a.idLoteEstoque,
            a.localEstoque,
            a.pessoaParticipante,
            a.observacoes,
            a.produto,
            a.indicadorPropriedadePosseItem,
            r_bufferIdReservaEstoque, 
            r_bufferIdReservaEstoque,
            v_quantidadeNumerosSerie);
        END IF;
        IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
          ADD_RESERVA_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, --p_idReservaEstoque
            a.estabelecimento,
            CASE WHEN a.dataEntrega IS NULL OR a.dataEntrega < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntrega END, -- p_dataEntrega
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            a.entradaSaida,
            a.indicadorPropriedadePosseItem,
            a.pessoaParticipante,
            a.localEstoque,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidadeSaldo - v_quantidadeNumerosSerie, -- p_quantidadeSaldo
            a.observacoes,
            a.idItemOrcamento,
            0, -- p_idFichaProdutoPrevOrcamento
            0, -- p_idItemDocTransferencia
            r_bufferIdReservaEstoque,
            v_auxNumber,
            r_bufferIdReservaEstoque);
        END IF;
      END IF;
      FOR b IN (
        SELECT
          comp.gradeProdutoEstoque gradeProduto,
          gradProd.produto,
          b.observacoes,
          prod.controleEstoque,
          ROUND (a.quantidadeSaldo * b.quantidade, uniMed.casasDecimaisUnidadeMedida) quantidadeSaldo
        FROM MOORCAMENTOXCOMPOSICOESPR b
        JOIN CAPRODUTOXCOMPOSICOESPREC comp
        ON comp.composicaoPreco = b.composicaoPreco
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = comp.gradeProdutoEstoque
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN SIUNIDADESMEDIDA uniMed
        ON uniMed.unidadeMedida = prod.unidadeMedida
        WHERE b.idItemOrcamento = a.idItemOrcamento
        AND b.selecionado = 1
        AND comp.gradeProdutoEstoque > 0
        AND ROUND (a.quantidadeSaldo * b.quantidade, uniMed.casasDecimaisUnidadeMedida) > 0)
      LOOP
        IF b.controleEstoque IN (3,4) THEN
          ADD_RESERVA_ESTOQUE_KIT (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            a.entradaSaida,
            a.estabelecimento,
            CASE WHEN a.dataEntrega IS NULL OR a.dataEntrega < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntrega END, -- a.dataEntrega
            a.modeloDocumento,
            b.gradeProduto,
            a.localEstoque,
            a.pessoaParticipante,
            b.quantidadeSaldo,
            b.observacoes,
            a.idItemOrcamento,
            0, -- p_idFichaProdutoPrevOrcamento
            0, -- p_idItemDocTransferencia
            a.indicadorPropriedadePosseItem,
            r_bufferIdReservaEstoque,
            r_bufferIdReservaEstoque);
        ELSIF b.controleEstoque IN (1,5,6,11,12) THEN
          ADD_RESERVA_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idReservaEstoque
            a.estabelecimento,
            CASE WHEN a.dataEntrega IS NULL OR a.dataEntrega < a.dataEmissao THEN a.dataEmissao ELSE a.dataEntrega END, -- a.dataEntrega
            b.produto,
            b.gradeProduto,
            a.modeloDocumento,
            a.entradaSaida,
            a.indicadorPropriedadePosseItem,
            a.pessoaParticipante,
            a.localEstoque,
            0, -- p_personalizacao,
            0, -- p_idLoteEstoque,
            0, -- p_idNumeroSerie
            b.quantidadeSaldo,
            b.observacoes,
            a.idItemOrcamento,
            0, -- p_idFichaProdutoPrevOrcamento
            0, -- p_idItemDocTransferencia
            r_bufferIdReservaEstoque, 
            v_auxNumber,
            r_bufferIdReservaEstoque);
        END IF;
      END LOOP; 
    END IF;
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_ITEM;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_ORC_CAB (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_orcamento                    IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT idItemOrcamento
    FROM MOORCAMENTOXITENS
    WHERE orcamento = p_orcamento
    ORDER BY sequencia)
  LOOP
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo, 
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      a.idItemOrcamento,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_ORC_CAB;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_ITEM (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idItemDocTransferencia    IN NUMBER,
  /* Retornos */
  p_bufferIdReservaEstoque    IN VARCHAR2,
  r_bufferIdReservaEstoque    OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
  v_auxNumber              NUMBER;  
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
    p_idItemDocTransferencia,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimentoSaida,
      cab.estabelecimentoEntrada,
      cab.dataEmissao,
      cab.tipoDocumentoSaida,
      cab.tipoDocumentoEntrada,
      cab.situacaoDocTransferencia,
      modDoc.movimentaEstoque,
      item.idItemDocTransferencia,
      item.cancelado,
      item.validoSaida,
      item.validoEntrada,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidadeSaldo,
      item.observacoes,
      gradProd.produto,
      prod.controleEstoque,
      prod.controlaNumeroSerie,
      locEstSaida.indicadorPropriedadePosseItem locEstSaida_indicProprPosseI,
      locEstEntrada.indicadorPropriedadePosseItem locEstEntr_indicProprPosseI
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab
    ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstSaida
    ON locEstSaida.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstEntrada
    ON locEstEntrada.localEstoque = item.localEstoqueEntrada
    WHERE item.idItemDocTransferencia = p_idItemDocTransferencia
    AND item.cancelado = 0
    AND item.quantidadeSaldo <> 0
    AND cab.situacaoDocTransferencia = 'A'
    AND modDoc.movimentaEstoque = 1)
  LOOP
    IF a.tipoDocumentoSaida > 100
      AND a.validoSaida = 1
    THEN 
      IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
        ADD_RESERVA_ESTOQUE_FORM_TINTA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'S', -- p_cab_entradaSaida,
          a.estabelecimentoSaida,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.idFormulaTinta,
          a.localEstoqueSaida,
          a.pessoaParticipanteSaida,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstSaida_indicProprPosseI,
          r_bufferIdReservaEstoque,
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (3,4) THEN
        ADD_RESERVA_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'S', -- p_cab_entradaSaida,
          a.estabelecimentoSaida,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.gradeProduto,
          a.localEstoqueSaida,
          a.pessoaParticipanteSaida,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstSaida_indicProprPosseI,
          r_bufferIdReservaEstoque, 
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
        v_quantidadeNumerosSerie := 0;
        IF a.controlaNumeroSerie > 0 THEN
          ADD_RESERVA_ESTOQUE_TRA_N_SER (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            a.modeloDocumento,
            'S', -- p_cab_entradaSaida,
            a.estabelecimentoSaida,
            a.dataEmissao,
            p_idItemDocTransferencia,
            a.gradeProduto,
            a.personalizacao,
            a.idLoteEstoque,
            a.localEstoqueSaida,
            a.pessoaParticipanteSaida,
            a.observacoes,
            a.produto,
            a.locEstSaida_indicProprPosseI,
            r_bufferIdReservaEstoque, 
            r_bufferIdReservaEstoque,
            v_quantidadeNumerosSerie);
           END IF;
        IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
          ADD_RESERVA_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idReservaEstoque
            a.estabelecimentoSaida,
            a.dataEmissao, -- p_dataEntrega
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            'S', -- p_cab_entradaSaida,
            a.locEstSaida_indicProprPosseI,
            a.pessoaParticipanteSaida,
            a.localEstoqueSaida,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidadeSaldo - v_quantidadeNumerosSerie,
            a.observacoes,
            0, -- p_item_idItemOrcamento
            0, -- p_item_idFichaProdutoPrevOrcam
            p_idItemDocTransferencia,
            r_bufferIdReservaEstoque, 
            v_auxNumber,
            r_bufferIdReservaEstoque);
        END IF;
      END IF;
    END IF;
    IF a.tipoDocumentoEntrada > 100
      AND a.validoEntrada = 1
    THEN 
      IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
        ADD_RESERVA_ESTOQUE_FORM_TINTA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'E', -- p_cab_entradaSaida,
          a.estabelecimentoEntrada,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.idFormulaTinta,
          a.localEstoqueEntrada,
          a.pessoaParticipanteEntrada,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstEntr_indicProprPosseI,
          r_bufferIdReservaEstoque,
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (3,4) THEN
        ADD_RESERVA_ESTOQUE_KIT (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          'E', -- p_cab_entradaSaida,
          a.estabelecimentoEntrada,
          a.dataEmissao, -- p_dataEntrega
          a.modeloDocumento,
          a.gradeProduto,
          a.localEstoqueEntrada,
          a.pessoaParticipanteEntrada,
          a.quantidadeSaldo,
          a.observacoes,
          0, -- p_item_idItemOrcamento
          0, -- p_item_idFichaProdutoPrevOrcam
          p_idItemDocTransferencia,
          a.locEstEntr_indicProprPosseI,
          r_bufferIdReservaEstoque, 
          r_bufferIdReservaEstoque);
      ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
        v_quantidadeNumerosSerie := 0;
        IF a.controlaNumeroSerie > 0 THEN
          ADD_RESERVA_ESTOQUE_TRA_N_SER (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            a.modeloDocumento,
            'E', -- p_cab_entradaSaida,
            a.estabelecimentoEntrada,
            a.dataEmissao,
            p_idItemDocTransferencia,
            a.gradeProduto,
            a.personalizacao,
            a.idLoteEstoque,
            a.localEstoqueEntrada,
            a.pessoaParticipanteEntrada,
            a.observacoes,
            a.produto,
            a.locEstEntr_indicProprPosseI,
            r_bufferIdReservaEstoque, 
            r_bufferIdReservaEstoque,
            v_quantidadeNumerosSerie);
           END IF;
        IF a.quantidadeSaldo > v_quantidadeNumerosSerie THEN
          ADD_RESERVA_ESTOQUE_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idReservaEstoque
            a.estabelecimentoEntrada,
            a.dataEmissao, -- p_dataEntrega
            a.produto,
            a.gradeProduto,
            a.modeloDocumento,
            'E', -- p_cab_entradaSaida,
            a.locEstEntr_indicProprPosseI,
            a.pessoaParticipanteEntrada,
            a.localEstoqueEntrada,
            a.personalizacao,
            a.idLoteEstoque,
            0, -- p_idNumeroSerie
            a.quantidadeSaldo - v_quantidadeNumerosSerie,
            a.observacoes,
            0, -- p_item_idItemOrcamento
            0, -- p_item_idFichaProdutoPrevOrcam
            p_idItemDocTransferencia,
            r_bufferIdReservaEstoque, 
            v_auxNumber,
            r_bufferIdReservaEstoque);
        END IF;
      END IF;
    END IF;
  END LOOP;  
END ADD_RESERVA_ESTOQUE_TRA_ITEM;

/

create or replace PROCEDURE ADD_RESERVA_ESTOQUE_TRA_CAB (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_documentoTransferencia    IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR a IN (
    SELECT idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS
    WHERE documentoTransferencia = p_documentoTransferencia)
  LOOP
    ADD_RESERVA_ESTOQUE_TRA_EXCLUI (
      a.idItemDocTransferencia,
      v_bufferIdReservaEstoque,
      v_bufferIdReservaEstoque);
  END LOOP;
  FOR a IN (
    SELECT item.idItemDocTransferencia
    FROM MODOCUMENTOTRANSFXITENS item
    JOIN MODOCUMENTOSTRANSFERENCIA cab
    ON cab.documentoTransferencia = item.documentoTransferencia
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = cab.modeloDocumento
    WHERE item.documentoTransferencia = p_documentoTransferencia
    AND cab.situacaoDocTransferencia = 'A'
    AND modDoc.movimentaEstoque = 1
    AND item.cancelado = 0
    AND item.quantidadeSaldo <> 0)
  LOOP
    ADD_RESERVA_ESTOQUE_TRA_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      a.idItemDocTransferencia,
      v_bufferIdReservaEstoque, 
      v_bufferIdReservaEstoque);
  END LOOP;
END ADD_RESERVA_ESTOQUE_TRA_CAB;

/

create or replace PROCEDURE ADD_EFETIVA_TEMP_INVENTARIO (
  p_sessaoClient            IN VARCHAR2,
  p_estabelecimentoAtivo    IN NUMBER,
  p_contadorSessaoFiscal    IN NUMBER,
  p_contadorSessaoGerencial IN NUMBER,
  p_invEst_data             IN DATE,
  p_invEst_motivoInventario IN CHAR,
  p_invEst_observacoes      IN VARCHAR2,
  p_inEstabelecimentos      IN VARCHAR2)
IS
  v_idInventarioEstoque NUMBER;
BEGIN
  FOR estab IN (
    SELECT estabelecimento
    FROM PAESTABELECIMENTOS
    WHERE estabelecimento > 0
    AND ((p_inEstabelecimentos IS NULL
        OR p_inEstabelecimentos = ' '
        OR p_inEstabelecimentos = '0')
      AND ativo = 1
      OR NOT(p_inEstabelecimentos IS NULL)
      AND p_inEstabelecimentos <> ' '
      AND p_inEstabelecimentos <> '0'
      AND INSTR(',' || RTRIM(p_inEstabelecimentos) || ',', ',' || TRIM(TO_CHAR(estabelecimento)) || ',') > 0)
    ORDER BY estabelecimento)
  LOOP
    v_idInventarioEstoque := FUNC_ADD_BUSCA_PROXIMO_ID('MOINVENTARIOSESTOQUE', 'inventarioEstoque', 0, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOINVENTARIOSESTOQUE (
      inventarioEstoque,
      estabelecimento,
      data,
      motivoInventarioEstoque,
      observacoes)
    VALUES (
      v_idInventarioEstoque,
      estab.estabelecimento,
      p_invEst_data,
      COALESCE(p_invEst_motivoInventario,'01'),
      COALESCE(p_invEst_observacoes,' '));
    INSERT INTO MOINVENTARIOESTOQUEXFISC (
      id,
      inventarioEstoque,
      produto,
      gradeProduto,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      quantidade,
      precoUnitarioCMV,
      stICMS,
      baseICMS,
      valorICMS)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOINVENTARIOESTOQUEXFISC', 'id', 0, p_estabelecimentoAtivo, NULL),
      v_idInventarioEstoque,
      temp.produto,
      temp.gradeProduto,
      temp.indicadorPropriedadePosseItem,
      temp.pessoaParticipante,
      CASE WHEN temp.quantidade < 0 THEN 0 ELSE temp.quantidade END,
      temp.precoUnitarioCMV,
      temp.stICMS,
      temp.baseICMS,
      temp.valorICMS
    FROM TEMPINVENTARIOESTXFISCAL temp
    WHERE temp.sessaoClient = p_sessaoClient
    AND temp.contadorSessao = p_contadorSessaoFiscal
    AND temp.estabelecimento = estab.estabelecimento;
    INSERT INTO MOINVENTARIOESTOQUEXITENS (
      idItemInventarioEstoque,
      inventarioEstoque,
      produto,
      gradeProduto,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      localEstoque,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      precoUnitarioCMV,
      precoUnitarioUltimaCompra,
      precoCustoUltimaCompra,
      precoCustoUltimaFormacao)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOINVENTARIOESTOQUEXITENS', 'idItemInventarioEstoque', 0, p_estabelecimentoAtivo, NULL),
      v_idInventarioEstoque,
      temp.produto,
      temp.gradeProduto,
      temp.indicadorPropriedadePosseItem,
      temp.pessoaParticipante,
      temp.localEstoque,
      temp.personalizacao,
      temp.idLoteEstoque,
      temp.idNumeroSerie,
      CASE WHEN temp.quantidade < 0 THEN 0 ELSE temp.quantidade END,
      temp.precoUnitarioCMV,
      temp.precoUnitarioUltimaCompra,
      temp.precoCustoUltimaCompra,
      temp.precoCustoUltimaFormacao
    FROM TEMPINVENTARIOESTXGERENC temp
    WHERE temp.sessaoClient = p_sessaoClient
    AND temp.contadorSessao = p_contadorSessaoGerencial
    AND temp.estabelecimento = estab.estabelecimento;
  END LOOP;
END ADD_EFETIVA_TEMP_INVENTARIO;

/

create or replace PROCEDURE ADD_TEMPCONTABIL_GERA_TEMP (
  p_sessaoClient           IN VARCHAR,
  p_contadorSessao         IN NUMERIC,
  p_dataInicial            IN DATE,
  p_dataFinal              IN DATE,
  p_estabelecimento        IN NUMERIC,
  p_situacaoContabilizacao IN CHAR)
IS
  v_idRegraContabilizacao   NUMBER;
  v_idPlanoContaContabil    NUMBER;
  v_tipoAglutinacaoContabil NUMBER;
  v_valor                   NUMBER;
  v_residuo                 NUMBER;
  v_saldo                   NUMBER;
  v_idCriar                 NUMBER;
  v_idAtualizar             NUMBER;
  v_quebra                  VARCHAR (15);
  v_fato                    NUMBER;
  v_sequencia               NUMBER;
BEGIN
  DELETE TEMPCONTABILSINTETICO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  DELETE TEMPCONTABILANALITICO
  WHERE sessaoClient = p_sessaoClient
  AND contadorSessao = p_contadorSessao;
  IF p_situacaoContabilizacao = 'C' THEN
    -- Início Gera TEMPCONTABILSINTETICO
    v_idCriar := 0;
    FOR a IN (
      SELECT
        idContabil,
        estabelecimento,
        data,
        pessoa,
        documento,
        fatoContabil,
        ordenacao,
        debitoCredito,
        idContaContabil,
        valor,
        historicoContabil,
        complemento,
        historicoMontado,
        origemContabil
      FROM MOCONTABEIS
      WHERE idContabil > 0
      AND data BETWEEN TO_DATE (
        CASE
          WHEN p_dataInicial IS NULL
          THEN '00/00/0000'
          ELSE TO_CHAR (p_dataInicial, 'DD/MM/YYYY')
        END || ' 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
      AND TO_DATE (
        CASE
          WHEN p_dataFinal IS NULL
            OR TO_CHAR (p_dataFinal, 'DD/MM/YYYY') = '00/00/0000'
          THEN '31/12/2500'
          ELSE TO_CHAR (p_dataFinal, 'DD/MM/YYYY')
        END || ' 23:59:59', 'DD/MM/YYYY HH24:MI:SS')
      AND estabelecimento = p_estabelecimento
      ORDER BY
        fatoContabil,
        ordenacao)
    LOOP
      IF a.debitoCredito = 'D' THEN
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = '1' || LPAD (a.fatoContabil, 14, '0')
        AND b.valor = a.valor
        AND b.estabelecimento = a.estabelecimento
        AND b.historicoContabil = a.historicoContabil
        AND b.debitar = 0;
      ELSE
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = '1' || LPAD (a.fatoContabil, 14, '0')
        AND b.valor = a.valor
        AND b.historicoContabil = a.historicoContabil
        AND b.creditar = 0;
      END IF;
      IF v_idAtualizar = 0 THEN
        v_idCriar := v_idCriar + 1;
        INSERT INTO TEMPCONTABILSINTETICO (
          sessaoClient,
          contadorSessao,
          id,
          quebra,
          fato,
          sequencia,
          selecionado,
          estabelecimento,
          estabelecimentoCodigoDescricao,
          idPlanoContaContabil,
          data,
          pessoa,
          pessoaCodigoDescricao,
          documento,
          fatoContabil,
          debitar,
          debitoIdContabil,
          debitoIdContaContabil,
          debitoReduzido,
          debitoCodigoDescricao,
          creditar,
          creditoIdContabil,
          creditoIdContaContabil,
          creditoReduzido,
          creditoCodigoDescricao,
          valor,
          historicoContabil,
          complemento,
          historicoMontado,
          origemContabil,
          idDocumento,
          documentoAberto,
          erroDebito,
          erroCredito,
          erroHistorico,
          erroValor,
          erroGeral)
        VALUES (
          p_sessaoClient,
          p_contadorSessao,
          v_idCriar, -- id
          '1' || LPAD (a.fatoContabil, 14, '0'),
          0, -- fato
          0, -- sequencia
          0, -- selecionado
          a.estabelecimento,
          ' ', -- estabelecimentoCodigoDescricao
          0, -- idPlanoContaContabil
          a.data,
          a.pessoa,
          ' ', -- pessoaCodigoDescricao
          a.documento,
          a.fatoContabil,
          CASE
            WHEN a.debitoCredito = 'D'
            THEN 1
            ELSE 0
          END, -- debitar
          CASE
            WHEN a.debitoCredito = 'D'
            THEN a.idContabil
            ELSE 0
          END, -- debitoIdContabil
          CASE
            WHEN a.debitoCredito = 'D'
            THEN a.idContaContabil
            ELSE 0
          END, -- debitoIdContaContabil
          0, -- debitoReduzido
          ' ', -- debitoCodigoDescricao
          CASE
            WHEN a.debitoCredito = 'C'
            THEN 1
            ELSE 0
          END, -- creditar,
          CASE
            WHEN a.debitoCredito = 'C'
            THEN a.idContabil
            ELSE 0
          END, -- creditoIdContabil
          CASE
            WHEN a.debitoCredito = 'C'
            THEN a.idContaContabil
            ELSE 0
          END, -- creditoIdContaContabil
          0, -- creditoReduzido
          ' ', -- creditoCodigoDescricao
          a.valor,
          a.historicoContabil,
          a.complemento,
          a.historicoMontado,
          a.origemContabil,
          0, -- idDocumento
          0, -- documentoAberto
          ' ',
          ' ',
          ' ',
          ' ',
          ' ');
      ELSIF a.debitoCredito = 'D' THEN
        UPDATE TEMPCONTABILSINTETICO b SET
          b.debitoIdContabil = a.idContabil,
          b.debitar = 1,
          b.debitoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      ELSE
        UPDATE TEMPCONTABILSINTETICO b SET
          b.creditoIdContabil = a.idContabil,
          b.creditar = 1,
          b.creditoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      END IF;
    END LOOP;
    -- Fim Gera TEMPCONTABILSINTETICO
  ELSE 
    v_idCriar := 0;
    -- Início Gera TEMPCONTABILANALITICO
    FOR a IN (
      SELECT fatoContabil
      FROM MOFATOSCONTABEIS
      WHERE fatoContabil > 0
      AND data BETWEEN TO_DATE (
        CASE
          WHEN p_dataInicial IS NULL
          THEN '00/00/0000'
          ELSE TO_CHAR (p_dataInicial, 'DD/MM/YYYY')
        END || ' 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
      AND TO_DATE (
        CASE
          WHEN p_dataFinal IS NULL
            OR TO_CHAR (p_dataFinal, 'DD/MM/YYYY') = '00/00/0000'
          THEN '31/12/2500'
          ELSE TO_CHAR (p_dataFinal, 'DD/MM/YYYY')
        END || ' 23:59:59', 'DD/MM/YYYY HH24:MI:SS')
      AND estabelecimento = p_estabelecimento
      AND situacaoContabilizacao = p_situacaoContabilizacao)
    LOOP
      FOR b IN (
        SELECT
          'MODOCFISCALXITENS' tabelaSistema,
          b.idItemDocFiscal idTabelaSistema,
          100 origemContabil,
          b.idDocumentoFiscal idDocumento,
          cab.dataEmissao data,
          cab.fatoContabil,
          cab.estabelecimento,
          cab.pessoa,
          TO_CHAR (cab.documentoFiscal) documento,
          COALESCE (SUBSTR (RTRIM (
            COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
            WITHIN GROUP (ORDER BY infCompl.sequencia)
            FROM MODOCFISCALXINFOCOMPLEMEN infCompl
            WHERE infCompl.idDocumentoFiscal = b.idDocumentoFiscal
            AND infCompl.geradoPeloSistema = 0
            AND infCompl.descInformacaoComplementar <> ' '), ' ')), 1, 120),' ') complemento,
          CASE
            WHEN cab.situacaoDocumentoFiscal < 23
            THEN 1
            ELSE 0
          END documentoAberto,
          gradProd.produto,
          cab.contaFinanceira,
          0 carteiraFinanceira,
          b.valorLiquidoItem valorContabil,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorAcrescimoExtempTotal,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.valorICMSST,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.valorICMSEfetivo,
          b.valorICMSUFDestinatario,
          b.valorICMSUFRemetente,
          b.valorFCP,
          b.valorFCPST,
          b.valorFCPSTAnteriormente,
          b.valorFCPUFDestinatario,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorCustoOperacao,
          b.valorCMV,
          0 baixa_valorVariacaoIndexador,
          0 baixa_valorJurosDeMora,
          0 baixa_valorMulta,
          0 baixa_valorTarifaCartao,
          0 baixa_valorDescontos,
          0 baixa_valorOutrosAcrescimos
        FROM MODOCFISCALXITENS b
        JOIN MODOCUMENTOSFISCAIS cab
        ON cab.idDocumentoFiscal = b.idDocumentoFiscal
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = cab.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        WHERE cab.fatoContabil = a.fatoContabil
        AND b.cancelado = 0
        AND cab.situacaoDocumentoFiscal < 24
        UNION ALL
        SELECT
          'MOPREDOCUMXITENS' tabelaSistema,
          b.idItemPreDocumento idTabelaSistema,
          101 origemContabil,
          b.preDocumento idDocumento,
          cab.dataEmissao data,
          cab.fatoContabil,
          cab.estabelecimento,
          cab.pessoa,
          TO_CHAR (CASE WHEN cab.documentoFiscal = 0 THEN cab.preDocumento ELSE cab.documentoFiscal END) documento,
          COALESCE (SUBSTR (RTRIM (
            COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
            WITHIN GROUP (ORDER BY infCompl.sequencia)
            FROM MOPREDOCUMXINFOCOMPLENT infCompl
            WHERE infCompl.preDocumento = b.preDocumento
            AND infCompl.geradoPeloSistema = 0
            AND infCompl.descInformacaoComplementar <> ' '), ' ')), 1, 120),' ') complemento,
          CASE
            WHEN cab.statusPreDocumento = 'E'
            THEN 1
            ELSE 0
          END documentoAberto,
          gradProd.produto,
          cab.contaFinanceira,
          0 carteiraFinanceira,
          b.valorLiquidoItem valorContabil,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorAcrescimoExtempTotal,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.valorICMSST,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.valorICMSEfetivo,
          b.valorICMSUFDestinatario,
          b.valorICMSUFRemetente,
          b.valorFCP,
          b.valorFCPST,
          b.valorFCPSTAnteriormente,
          b.valorFCPUFDestinatario,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorCustoOperacao,
          b.valorCMV,
          0 baixa_valorVariacaoIndexador,
          0 baixa_valorJurosDeMora,
          0 baixa_valorMulta,
          0 baixa_valorTarifaCartao,
          0 baixa_valorDescontos,
          0 baixa_valorOutrosAcrescimos
        FROM MOPREDOCUMXITENS b
        JOIN MOPREDOCUMENTOS cab
        ON cab.preDocumento = b.preDocumento
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = cab.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        WHERE cab.fatoContabil = a.fatoContabil
        AND b.cancelado = 0
        AND cab.statusPreDocumento <> 'C'
        UNION ALL
        SELECT
          'MOFINANCEIROS' tabelaSistema,
          b.idFinanceiro idTabelaSistema,
          200 origemContabil,
          b.idFinanceiro idDocumento,
          b.dataEmissao data,
          b.fatoContabil,
          b.estabelecimento,
          b.pessoa,
          b.documento,
          COALESCE (RTRIM (SUBSTR (b.complemento, 1, 120)), ' ') complemento,
          0 documentoAberto,
          0 produto,
          b.contaFinanceira,
          b.carteiraFinanceira,
          b.valor valorContabil,
          0 valorFreteTotal,
          0 valorSeguroTotal,
          0 valorDescontoTotal,
          0 valorOutrasDespesasTotal,
          0 valorAdicFreteMarinhaMerTotal,
          0 valorDespesasAduaneirasTotal,
          0 valorDescontoCustoOpTotal,
          0 valorAcrescimoCustoOpTotal,
          0 valorAcrescimoExtempTotal,
          0 retidoISSQN,
          0 valorISSQN,
          0 valorRetIRRF,
          0 valorRetINSS,
          0 valorRetPIS,
          0 valorRetCOFINS,
          0 valorRetCSLL,
          0 valorRetOutros,
          0 valorII,
          0 valorIOF,
          0 valorIPI,
          0 valorIPIDevolucao,
          0 valorPIS,
          0 valorPISST,
          0 valorCOFINS,
          0 valorCOFINSST,
          0 valorCreditoSimplesNacional,
          0 valorICMSOperacao,
          0 valorICMSDiferido,
          0 valorICMS,
          0 valorICMSDesoneracao,
          0 valorICMSST,
          0 valorICMSSTAnteriormente,
          0 valorICMSProprioSubstituto,
          0 valorICMSEfetivo,
          0 valorICMSUFDestinatario,
          0 valorICMSUFRemetente,
          0 valorFCP,
          0 valorFCPST,
          0 valorFCPSTAnteriormente,
          0 valorFCPUFDestinatario,
          0 valorEstimadoImpFederais,
          0 valorEstimadoImpEstaduais,
          0 valorEstimadoImpMunicipais,
          0 valorCustoOperacao,
          0 valorCMV,
          0 baixa_valorVariacaoIndexador,
          0 baixa_valorJurosDeMora,
          0 baixa_valorMulta,
          0 baixa_valorTarifaCartao,
          0 baixa_valorDescontos,
          0 baixa_valorOutrosAcrescimos
        FROM MOFINANCEIROS b
        WHERE b.fatoContabil = a.fatoContabil
        AND b.idPagamentoPreDocumento = 0
        AND b.idPagamentoDocFiscal = 0
        UNION ALL
        SELECT
          'MOFINANCEIROXBAIXAS' tabelaSistema,
          b.idBaixaFinanceiro idTabelaSistema,
          300 origemContabil,
          b.idBaixaFinanceiro idDocumento,
          b.data,
          b.fatoContabil,
          b.estabelecimento,
          financ.pessoa,
          financ.documento,
          COALESCE (RTRIM (SUBSTR (b.observacoes, 1, 120)), ' ') complemento,
          0 documentoAberto,
          0 produto,
          b.contaFinanceira,
          b.carteiraFinanceira,
          b.valorLiquido valorContabil,
          0 valorFreteTotal,
          0 valorSeguroTotal,
          0 valorDescontoTotal,
          0 valorOutrasDespesasTotal,
          0 valorAdicFreteMarinhaMerTotal,
          0 valorDespesasAduaneirasTotal,
          0 valorDescontoCustoOpTotal,
          0 valorAcrescimoCustoOpTotal,
          0 valorAcrescimoExtempTotal,
          0 retidoISSQN,
          0 valorISSQN,
          0 valorRetIRRF,
          0 valorRetINSS,
          0 valorRetPIS,
          0 valorRetCOFINS,
          0 valorRetCSLL,
          0 valorRetOutros,
          0 valorII,
          0 valorIOF,
          0 valorIPI,
          0 valorIPIDevolucao,
          0 valorPIS,
          0 valorPISST,
          0 valorCOFINS,
          0 valorCOFINSST,
          0 valorCreditoSimplesNacional,
          0 valorICMSOperacao,
          0 valorICMSDiferido,
          0 valorICMS,
          0 valorICMSDesoneracao,
          0 valorICMSST,
          0 valorICMSSTAnteriormente,
          0 valorICMSProprioSubstituto,
          0 valorICMSEfetivo,
          0 valorICMSUFDestinatario,
          0 valorICMSUFRemetente,
          0 valorFCP,
          0 valorFCPST,
          0 valorFCPSTAnteriormente,
          0 valorFCPUFDestinatario,
          0 valorEstimadoImpFederais,
          0 valorEstimadoImpEstaduais,
          0 valorEstimadoImpMunicipais,
          0 valorCustoOperacao,
          0 valorCMV,
          b.valorVariacaoIndexador baixa_valorVariacaoIndexador,
          b.valorJurosDeMora baixa_valorJurosDeMora,
          b.valorMulta baixa_valorMulta,
          b.valorTarifaCartao baixa_valorTarifaCartao,
          b.valorDescontos baixa_valorDescontos,
          b.valorOutrosAcrescimos baixa_valorOutrosAcrescimos
        FROM MOFINANCEIROXBAIXAS b
        JOIN MOFINANCEIROS financ
        ON financ.idFinanceiro = b.idFinanceiro
        WHERE b.fatoContabil = a.fatoContabil
        AND b.baixaAutomatica = 0)
      LOOP
        SELECT COALESCE (MAX (c.idRegraContabilizacao), 0)
        INTO v_idRegraContabilizacao
        FROM (
          SELECT
            c.idRegraContabilizacao,
            ROW_NUMBER() OVER (
              ORDER BY
                c.ordenacao,
                c.idRegraContabilizacao) ordenacao
          FROM (
            SELECT
              c.idRegraContabilizacao,
              c.ordenacao,
              c.id,
              MIN (c.valido) valido
            FROM (
              SELECT
                c.idRegraContabilizacao,
                c.ordenacao,
                c.id,
                c.filtroContabil,
                MAX (c.valido) valido
              FROM (
                SELECT
                  regra.idRegraContabilizacao,
                  regra.ordenacao,
                  COALESCE (regraXFiltro.id, 0) id,
                  COALESCE (regraXFiltro.filtroContabil, 0) filtroContabil,
                  CASE
                    WHEN regraXFiltro.filtroContabil IS NULL
                    THEN 1
                    WHEN filtro.campoSelect IS NULL
                      OR filtro.campoSelect = ' '
                    THEN 0
                    ELSE FUNC_ADD_EXECUTE_IMMEDIATE_N ('SELECT
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM PAREGRACONTABXFILTROS regraXFiltro
        LEFT JOIN SIFILTROSCONTABEIS filtro
        ON filtro.filtroContabil = regraXFiltro.filtroContabil
        LEFT JOIN SITABELASSISTEMA tabelaSistema
        ON tabelaSistema.tabelaSistema = filtro.tabelaSistema'
  || CASE b.tabelaSistema
       WHEN 'MODOCFISCALXITENS'
       THEN '
        JOIN MODOCFISCALXITENS itemDoc
        ON itemDoc.idItemDocFiscal = ' || TO_CHAR (b.idTabelaSistema) || CASE WHEN filtro.cabecalhoItemPagamento = 'C' THEN '
        JOIN MODOCUMENTOSFISCAIS cabDoc
        ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal' ELSE '' END
       WHEN 'MOPREDOCUMXITENS'
       THEN '
        JOIN MOPREDOCUMXITENS itemDoc
        ON itemDoc.idItemPreDocumento = ' || TO_CHAR (b.idTabelaSistema) || CASE WHEN filtro.cabecalhoItemPagamento = 'C' THEN '
        JOIN MOPREDOCUMENTOS cabDoc
        ON cabDoc.preDocumento = itemDoc.preDocumento' ELSE '' END
       WHEN 'MOFINANCEIROS'
       THEN '
        JOIN MOFINANCEIROS financ
        ON financ.idFinanceiro = ' || TO_CHAR (b.idTabelaSistema)
       WHEN 'MOFINANCEIROXBAIXAS'
       THEN '
        JOIN MOFINANCEIROXBAIXAS baixa
        ON baixa.idBaixaFinanceiro = ' || TO_CHAR (b.idTabelaSistema)
       ELSE ''
     END
  || CASE
       WHEN filtro.campoJoin IS NULL OR filtro.campoJoin = ' '
       THEN ''
       ELSE '
       ' || filtro.campoJoin
     END
  || '
        WHERE regraXFiltro.id = ' || TO_CHAR (regraXFiltro.id) || '
        AND (' || filtro.campoSelect || ') '
                      || CASE
                           WHEN filtro.tabelaSistema <> ' '
                           THEN 'IN ('
                             || CAST (regraXFiltro.campoIn AS VARCHAR2 (4000))
                             || ')'
                           WHEN filtro.tipoCampo = 'L'
                           THEN '= '
                             || CASE
                                  WHEN regraXFiltro.faixaDe IN ('S','1')
                                  THEN '1'
                                  ELSE '0'
                                END
                           WHEN filtro.tipoCampo = 'N'
                           THEN 'BETWEEN '
                             || CASE
                                  WHEN regraXFiltro.faixaDe = ' '
                                  THEN '0'
                                  ELSE REPLACE (regraXFiltro.faixaDe,',','.')
                                END
                             || ' AND '
                             || CASE
                                  WHEN regraXFiltro.faixaAte = ' '
                                  THEN '0'
                                  ELSE REPLACE (regraXFiltro.faixaAte,',','.')
                                END
                           ELSE 'BETWEEN '
                             || regraXFiltro.faixaDe
                             || ' AND '
                             || regraXFiltro.faixaAte
                         END || ')
      THEN 1
      ELSE 0
    END
  FROM DUAL')
                  END valido
                FROM PAREGRASCONTABILIZACAO regra
                JOIN PAESTABELECIMENTOS estab
                ON estab.estabelecimento = b.estabelecimento
                LEFT JOIN PAREGRACONTABXFILTROS regraXFiltro
                ON regraXFiltro.idRegraContabilizacao = regra.idRegraContabilizacao
                LEFT JOIN SIFILTROSCONTABEIS filtro
                ON filtro.filtroContabil = regraXFiltro.filtroContabil
                LEFT JOIN SITABELASSISTEMA tabelaSistema
                ON tabelaSistema.tabelaSistema = filtro.tabelaSistema
                WHERE regra.idRegraContabilizacao > 0
                AND regra.idPlanoContaContabil = estab.idPlanoContaContabil
                AND regra.origemContabil = CASE WHEN b.origemContabil = 101 THEN 100 ELSE b.origemContabil END
                AND regra.ativo = 1
                AND TRUNC (regra.dataValidadeInicial) <= TRUNC (SYSDATE)
                AND TRUNC (regra.dataValidadeFinal) >= TRUNC (SYSDATE)) c
              GROUP BY
                c.idRegraContabilizacao,
                c.ordenacao,
                c.id,
                c.filtroContabil) c
            GROUP BY
              c.idRegraContabilizacao,
              c.ordenacao,
              c.id) c
          WHERE c.valido = 1) c
        WHERE c.ordenacao = 1;
        SELECT
          idPlanoContaContabil,
          tipoAglutinacaoContabil
        INTO
          v_idPlanoContaContabil,
          v_tipoAglutinacaoContabil
        FROM PAREGRASCONTABILIZACAO
        WHERE idRegraContabilizacao = v_idRegraContabilizacao;
        FOR c IN (
          SELECT
            c.linhaContabil,
            c.debitoCredito,
            c.tipoContabilizacao,
            c.categoriaContabil,
            c.idContaContabil,
            c.valor,
            c.historicoContabil
          FROM (
            SELECT
              c.linhaContabil,
              c.debitoCredito,
              c.tipoContabilizacao,
              c.categoriaContabil,
              c.idContaContabil,
              CASE c.linhaContabil
                -- 110 Valor Frete
                WHEN 110 THEN b.valorFreteTotal
                -- 111 Valor Seguro
                WHEN 111 THEN b.valorSeguroTotal
                -- 112 Valor Desconto
                WHEN 112 THEN b.valorDescontoTotal
                -- 113 Valor Outras Despesas
                WHEN 113 THEN b.valorOutrasDespesasTotal
                -- 114 Valor Adicional Frete Marinha Mercantil
                WHEN 114 THEN b.valorAdicFreteMarinhaMerTotal
                -- 115 Valor Despesas Aduaneiras
                WHEN 115 THEN b.valorDespesasAduaneirasTotal
                -- 116 Valor Outros Descontos Custo
                WHEN 116 THEN b.valorDescontoCustoOpTotal
                -- 117 Valor Outros Acréscimos Custo
                WHEN 117 THEN b.valorAcrescimoCustoOpTotal
                -- 118 Valor Acréscimo Extemporâneo
                WHEN 118 THEN b.valorAcrescimoExtempTotal
                -- 130 Valor ISSQN
                WHEN 130 THEN
                  CASE
                    WHEN b.retidoISSQN = 1
                    THEN 0
                    ELSE b.valorISSQN
                  END
                -- 131 Valor ISSQN Retido
                WHEN 131 THEN
                  CASE
                    WHEN b.retidoISSQN = 1
                    THEN b.valorISSQN
                    ELSE 0
                  END
                -- 132 Valor Retenção IRRF
                WHEN 132 THEN b.valorRetIRRF
                -- 133 Valor Retenção INSS
                WHEN 133 THEN b.valorRetINSS
                -- 134 Valor Retenção PIS
                WHEN 134 THEN b.valorRetPIS
                -- 135 Valor Retenção COFINS
                WHEN 135 THEN b.valorRetCOFINS
                -- 136 Valor Retenção CSLL
                WHEN 136 THEN b.valorRetCSLL
                -- 137 Valor Retenção Outros
                WHEN 137 THEN b.valorRetOutros
                -- 140 Valor Imposto Importação
                WHEN 140 THEN b.valorII
                -- 141 Valor IOF
                WHEN 141 THEN b.valorIOF
                -- 142 Valor IPI
                WHEN 142 THEN b.valorIPI
                -- 143 Valor IPI Devolução
                WHEN 143 THEN b.valorIPIDevolucao
                -- 144 Valor PIS
                WHEN 144 THEN b.valorPIS
                -- 145 Valor PIS ST
                WHEN 145 THEN b.valorPISST
                -- 146 Valor COFINS
                WHEN 146 THEN b.valorCOFINS
                -- 147 Valor COFINS ST
                WHEN 147 THEN b.valorCOFINSST
                -- 148 Valor Crédito Simples Nacional
                WHEN 148 THEN b.valorCreditoSimplesNacional
                -- 160 Valor ICMS Operação
                WHEN 160 THEN b.valorICMSOperacao
                -- 161 Valor ICMS Diferido
                WHEN 161 THEN b.valorICMSDiferido
                -- 162 Valor ICMS
                WHEN 162 THEN b.valorICMS
                -- 163 Valor ICMS Desoneração
                WHEN 163 THEN b.valorICMSDesoneracao
                -- 164 Valor ICMS ST
                WHEN 164 THEN b.valorICMSST
                -- 165 Valor ICMS ST Anteriormente
                WHEN 165 THEN b.valorICMSSTAnteriormente
                -- 166 Valor ICMS Próprio Substituto
                WHEN 166 THEN b.valorICMSProprioSubstituto
                -- 167 Valor ICMS Efetivo
                WHEN 167 THEN b.valorICMSEfetivo
                -- 168 Valor ICMS UF Destinatario
                WHEN 168 THEN b.valorICMSUFDestinatario
                -- 169 Valor ICMS UF Remetente
                WHEN 169 THEN b.valorICMSUFRemetente
                -- 180 Valor FCP
                WHEN 180 THEN b.valorFCP
                -- 181 Valor FCP ST
                WHEN 181 THEN b.valorFCPST
                -- 182 Valor FCP ST Anteriormente
                WHEN 182 THEN b.valorFCPSTAnteriormente
                -- 183 Valor FCP UF Destinatario
                WHEN 183 THEN b.valorFCPUFDestinatario
                -- 187 Valor Estimado Impostos Federais
                WHEN 187 THEN b.valorEstimadoImpFederais
                -- 188 Valor Estimado Impostos Estaduais
                WHEN 188 THEN b.valorEstimadoImpEstaduais
                -- 189 Valor Estimado Impostos Municipais
                WHEN 189 THEN b.valorEstimadoImpMunicipais
                -- 190 Valor Custo Operação
                WHEN 190 THEN b.valorCustoOperacao
                -- 191 Valor CMV
                WHEN 191 THEN b.valorCMV
                -- 301 Valor Variação Indexador Redução
                WHEN 301 THEN
                  CASE
                    WHEN b.baixa_valorVariacaoIndexador < 0
                    THEN - b.baixa_valorVariacaoIndexador
                    ELSE 0
                  END
                -- 302 Valor Variação Indexador Acréscimo
                WHEN 302 THEN
                  CASE
                    WHEN b.baixa_valorVariacaoIndexador > 0
                    THEN b.baixa_valorVariacaoIndexador
                    ELSE 0
                  END
                -- 303 Valor Juros de Mora
                WHEN 303 THEN b.baixa_valorJurosDeMora
                -- 304 Valor Multa
                WHEN 304 THEN b.baixa_valorMulta
                -- 305 Valor Tarifa Cartão
                WHEN 305 THEN b.baixa_valorTarifaCartao
                -- 306 Valor Descontos
                WHEN 306 THEN b.baixa_valorDescontos
                -- 307 Valor Outros Acréscimos
                WHEN 307 THEN b.baixa_valorOutrosAcrescimos
                -- 100 Valor Contábil
                -- 200 Valor Contábil
                -- 300 Valor Contábil
                ELSE b.valorContabil + COALESCE ((
                  SELECT SUM (
                    CASE d.linhaContabil
                      -- 110 Valor Frete
                      WHEN 110 THEN b.valorFreteTotal
                      -- 111 Valor Seguro
                      WHEN 111 THEN b.valorSeguroTotal
                      -- 112 Valor Desconto
                      WHEN 112 THEN b.valorDescontoTotal
                      -- 113 Valor Outras Despesas
                      WHEN 113 THEN b.valorOutrasDespesasTotal
                      -- 114 Valor Adicional Frete Marinha Mercantil
                      WHEN 114 THEN b.valorAdicFreteMarinhaMerTotal
                      -- 115 Valor Despesas Aduaneiras
                      WHEN 115 THEN b.valorDespesasAduaneirasTotal
                      -- 116 Valor Outros Descontos Custo
                      WHEN 116 THEN b.valorDescontoCustoOpTotal
                      -- 117 Valor Outros Acréscimos Custo
                      WHEN 117 THEN b.valorAcrescimoCustoOpTotal
                      -- 118 Valor Acréscimo Extemporâneo
                      WHEN 118 THEN b.valorAcrescimoExtempTotal
                      -- 130 Valor ISSQN
                      WHEN 130 THEN
                        CASE
                          WHEN b.retidoISSQN = 1
                          THEN 0
                          ELSE b.valorISSQN
                        END
                      -- 131 Valor ISSQN Retido
                      WHEN 131 THEN
                        CASE
                          WHEN b.retidoISSQN = 1
                          THEN b.valorISSQN
                          ELSE 0
                        END
                      -- 132 Valor Retenção IRRF
                      WHEN 132 THEN b.valorRetIRRF
                      -- 133 Valor Retenção INSS
                      WHEN 133 THEN b.valorRetINSS
                      -- 134 Valor Retenção PIS
                      WHEN 134 THEN b.valorRetPIS
                      -- 135 Valor Retenção COFINS
                      WHEN 135 THEN b.valorRetCOFINS
                      -- 136 Valor Retenção CSLL
                      WHEN 136 THEN b.valorRetCSLL
                      -- 137 Valor Retenção Outros
                      WHEN 137 THEN b.valorRetOutros
                      -- 140 Valor Imposto Importação
                      WHEN 140 THEN b.valorII
                      -- 141 Valor IOF
                      WHEN 141 THEN b.valorIOF
                      -- 142 Valor IPI
                      WHEN 142 THEN b.valorIPI
                      -- 143 Valor IPI Devolução
                      WHEN 143 THEN b.valorIPIDevolucao
                      -- 144 Valor PIS
                      WHEN 144 THEN b.valorPIS
                      -- 145 Valor PIS ST
                      WHEN 145 THEN b.valorPISST
                      -- 146 Valor COFINS
                      WHEN 146 THEN b.valorCOFINS
                      -- 147 Valor COFINS ST
                      WHEN 147 THEN b.valorCOFINSST
                      -- 148 Valor Crédito Simples Nacional
                      WHEN 148 THEN b.valorCreditoSimplesNacional
                      -- 160 Valor ICMS Operação
                      WHEN 160 THEN b.valorICMSOperacao
                      -- 161 Valor ICMS Diferido
                      WHEN 161 THEN b.valorICMSDiferido
                      -- 162 Valor ICMS
                      WHEN 162 THEN b.valorICMS
                      -- 163 Valor ICMS Desoneração
                      WHEN 163 THEN b.valorICMSDesoneracao
                      -- 164 Valor ICMS ST
                      WHEN 164 THEN b.valorICMSST
                      -- 165 Valor ICMS ST Anteriormente
                      WHEN 165 THEN b.valorICMSSTAnteriormente
                      -- 166 Valor ICMS Próprio Substituto
                      WHEN 166 THEN b.valorICMSProprioSubstituto
                      -- 167 Valor ICMS Efetivo
                      WHEN 167 THEN b.valorICMSEfetivo
                      -- 168 Valor ICMS UF Destinatario
                      WHEN 168 THEN b.valorICMSUFDestinatario
                      -- 169 Valor ICMS UF Remetente
                      WHEN 169 THEN b.valorICMSUFRemetente
                      -- 180 Valor FCP
                      WHEN 180 THEN b.valorFCP
                      -- 181 Valor FCP ST
                      WHEN 181 THEN b.valorFCPST
                      -- 182 Valor FCP ST Anteriormente
                      WHEN 182 THEN b.valorFCPSTAnteriormente
                      -- 183 Valor FCP UF Destinatario
                      WHEN 183 THEN b.valorFCPUFDestinatario
                      -- 187 Valor Estimado Impostos Federais
                      WHEN 187 THEN b.valorEstimadoImpFederais
                      -- 188 Valor Estimado Impostos Estaduais
                      WHEN 188 THEN b.valorEstimadoImpEstaduais
                      -- 189 Valor Estimado Impostos Municipais
                      WHEN 189 THEN b.valorEstimadoImpMunicipais
                      -- 190 Valor Custo Operação
                      WHEN 190 THEN b.valorCustoOperacao
                      -- 191 Valor CMV
                      WHEN 191 THEN b.valorCMV
                      -- 301 Valor Variação Indexador Redução
                      WHEN 301 THEN
                        CASE
                          WHEN b.baixa_valorVariacaoIndexador < 0
                          THEN - b.baixa_valorVariacaoIndexador
                          ELSE 0
                        END
                      -- 302 Valor Variação Indexador Acréscimo
                      WHEN 302 THEN
                        CASE
                          WHEN b.baixa_valorVariacaoIndexador > 0
                          THEN b.baixa_valorVariacaoIndexador
                          ELSE 0
                        END
                      -- 303 Valor Juros de Mora
                      WHEN 303 THEN b.baixa_valorJurosDeMora
                      -- 304 Valor Multa
                      WHEN 304 THEN b.baixa_valorMulta
                      -- 305 Valor Tarifa Cartão
                      WHEN 305 THEN b.baixa_valorTarifaCartao
                      -- 306 Valor Descontos
                      WHEN 306 THEN b.baixa_valorDescontos
                      -- 307 Valor Outros Acréscimos
                      WHEN 307 THEN b.baixa_valorOutrosAcrescimos
                      -- 100 Valor Contábil
                      -- 200 Valor Contábil
                      -- 300 Valor Contábil
                      ELSE b.valorContabil
                    END
                    * CASE
                        WHEN c.debitoCredito = 'D'
                          AND d.tipoContabilizacaoDebito = '90'
                          OR c.debitoCredito = 'C'
                          AND d.tipoContabilizacaoCredito = '90'
                        THEN -1
                        ELSE 1
                      END)
                  FROM PAREGRACONTABXLINHAS d
                  WHERE d.idRegraContabilizacao = v_idRegraContabilizacao
                  AND (c.debitoCredito = 'D'
                    AND d.tipoContabilizacaoDebito IN (90,91)
                    OR c.debitoCredito = 'C'
                    AND d.tipoContabilizacaoCredito IN (90,91))), 0)
              END valor,
              c.historicoContabil 
            FROM (
              SELECT
                c.linhaContabil,
                'D' debitoCredito,
                c.tipoContabilizacaoDebito tipoContabilizacao,
                c.idContaContabilDebito idContaContabil,
                c.categoriaContabilDebito categoriaContabil,
                c.historicoContabil
                FROM PAREGRACONTABXLINHAS c
                WHERE c.idRegraContabilizacao = v_idRegraContabilizacao
                AND c.tipoContabilizacaoDebito IN (1,10,20,40,50)
              UNION ALL
              SELECT
                c.linhaContabil,
                'C' debitoCredito,
                c.tipoContabilizacaoCredito tipoContabilizacao,
                c.idContaContabilCredito idContaContabil,
                c.categoriaContabilCredito categoriaContabil,
                c.historicoContabil
                FROM PAREGRACONTABXLINHAS c
                WHERE c.idRegraContabilizacao = v_idRegraContabilizacao
                AND c.tipoContabilizacaoCredito IN (1,10,20,40,50)) c) c
          WHERE c.valor <> 0)
        LOOP
          IF b.origemContabil = 100
            AND c.tipoContabilizacao IN (40,50)
            AND b.valorContabil <> 0
          THEN
            v_valor   := 0;
            v_residuo := 0;
            v_saldo   := c.valor;
            FOR d IN (
              SELECT
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END contaFinanceira,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END carteiraFinanceira,
                SUM (financ.valor *
                  CASE
                    WHEN pag.pagamentoTroco = 'T'
                    THEN -1
                    ELSE 1
                  END) valor
              FROM MODOCFISCALXPAGAMENTOS pag
              JOIN MOFINANCEIROS financ
              ON financ.idPagamentoDocFiscal = pag.idPagamentoDocFiscal
              WHERE pag.idDocumentoFiscal = b.idDocumento
              GROUP BY
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END)
            LOOP
              v_valor   := ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_residuo := ((c.valor * d.valor / b.valorContabil) + v_residuo)
                  - ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_saldo   := v_saldo - v_valor;
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACONTAFINANCEIRAXCONTAB conta
                    WHERE conta.contaFinanceira = d.contaFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACONTAFINANCEIRAXCONTAB conta
                      WHERE conta.contaFinanceira = d.contaFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                  -- 50 Carteira Financeira
                  ELSE COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACARTFINANCXCONTASCONTAB conta
                    WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACARTFINANCXCONTASCONTAB conta
                      WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                END, -- idContaContabil
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_valor);
            END LOOP;
            IF v_saldo <> 0 THEN
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                c.idContaContabil,
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_saldo);
            END IF;
          ELSIF b.origemContabil = 101
            AND c.tipoContabilizacao IN (40,50)
          THEN
            v_valor   := 0;
            v_residuo := 0;
            v_saldo   := c.valor;
            FOR d IN (
              SELECT
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END contaFinanceira,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END carteiraFinanceira,
                SUM (financ.valor *
                  CASE
                    WHEN pag.pagamentoTroco = 'T'
                    THEN -1
                    ELSE 1
                  END) valor
              FROM MOPREDOCUMXPAGAMENTOS pag
              JOIN MOFINANCEIROS financ
              ON financ.idPagamentoPreDocumento = pag.idPagamentoPreDocumento
              WHERE pag.preDocumento = b.idDocumento
              GROUP BY
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN financ.contaFinanceira
                  -- 50 Carteira Financeira
                  ELSE ' '
                END,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN 0
                  -- 50 Carteira Financeira
                  ELSE financ.carteiraFinanceira
                END)
            LOOP
              v_valor   := ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_residuo := ((c.valor * d.valor / b.valorContabil) + v_residuo)
                  - ROUND (((c.valor * d.valor / b.valorContabil) + v_residuo), 2);
              v_saldo   := v_saldo - v_valor;
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                CASE
                  -- 40 Conta Financeira
                  WHEN c.tipoContabilizacao = 40
                  THEN COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACONTAFINANCEIRAXCONTAB conta
                    WHERE conta.contaFinanceira = d.contaFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACONTAFINANCEIRAXCONTAB conta
                      WHERE conta.contaFinanceira = d.contaFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                  -- 50 Carteira Financeira
                  ELSE COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACARTFINANCXCONTASCONTAB conta
                    WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                    AND conta.categoriaContabil = c.categoriaContabil
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), COALESCE ((
                      SELECT MAX (conta.idContaContabil)
                      FROM PACARTFINANCXCONTASCONTAB conta
                      WHERE conta.carteiraFinanceira = d.carteiraFinanceira
                      AND conta.categoriaContabil = 0
                      AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                      AND conta.estabelecimento = b.estabelecimento
                      AND conta.ativo = 1), 0))
                END, -- idContaContabil
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_valor);
            END LOOP;
            IF v_saldo <> 0 THEN
              v_idCriar := v_idCriar + 1;
              INSERT INTO TEMPCONTABILANALITICO (
                sessaoClient,
                contadorSessao,
                id,
                debitoCredito,
                idContaContabil,
                historicoContabil,
                linhaContabil,
                quebra,
                origemContabil,
                idDocumento,
                data,
                fatoContabil,
                estabelecimento,
                pessoa,
                documento,
                complemento,
                documentoAberto,
                valor)
              VALUES (
                p_sessaoClient,
                p_contadorSessao,
                v_idCriar,
                c.debitoCredito,
                c.idContaContabil,
                c.historicoContabil,
                c.linhaContabil,
                CASE v_tipoAglutinacaoContabil
                  -- 2	Dia
                  WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                  -- 3	Mês
                  WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                  -- 1	Fato Contábil
                  ELSE '1' || LPAD (b.fatoContabil, 14, '0')
                END, -- quebra
                b.origemContabil,
                b.idDocumento,
                b.data,
                b.fatoContabil,
                b.estabelecimento,
                b.pessoa,
                b.documento,
                b.complemento,
                b.documentoAberto,
                v_saldo);
            END IF;
          ELSE
            v_idCriar := v_idCriar + 1;
            INSERT INTO TEMPCONTABILANALITICO (
              sessaoClient,
              contadorSessao,
              id,
              debitoCredito,
              idContaContabil,
              historicoContabil,
              linhaContabil,
              quebra,
              origemContabil,
              idDocumento,
              data,
              fatoContabil,
              estabelecimento,
              pessoa,
              documento,
              complemento,
              documentoAberto,
              valor)
            VALUES (
              p_sessaoClient,
              p_contadorSessao,
              v_idCriar,
              c.debitoCredito,
              CASE c.tipoContabilizacao
                -- 1 Conta Contábil
                WHEN 1 THEN c.idContaContabil
                -- 10 Pessoa
                WHEN 10 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM CAPESSOAXCONTASCONTABEIS conta
                  WHERE conta.pessoa = b.pessoa
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM CAPESSOAXCONTASCONTABEIS conta
                    WHERE conta.pessoa = b.pessoa
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 20 Produto
                WHEN 20 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM CAPRODUTOXCONTASCONTABEIS conta
                  WHERE conta.produto = b.produto
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM CAPRODUTOXCONTASCONTABEIS conta
                    WHERE conta.produto = b.produto
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 40 Conta Financeira
                WHEN 40 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM PACONTAFINANCEIRAXCONTAB conta
                  WHERE conta.contaFinanceira = b.contaFinanceira
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACONTAFINANCEIRAXCONTAB conta
                    WHERE conta.contaFinanceira = b.contaFinanceira
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 50 Carteira Financeira
                WHEN 50 THEN COALESCE ((
                  SELECT MAX (conta.idContaContabil)
                  FROM PACARTFINANCXCONTASCONTAB conta
                  WHERE conta.carteiraFinanceira = b.carteiraFinanceira
                  AND conta.categoriaContabil = c.categoriaContabil
                  AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                  AND conta.estabelecimento = b.estabelecimento
                  AND conta.ativo = 1), COALESCE ((
                    SELECT MAX (conta.idContaContabil)
                    FROM PACARTFINANCXCONTASCONTAB conta
                    WHERE conta.carteiraFinanceira = b.carteiraFinanceira
                    AND conta.categoriaContabil = 0
                    AND conta.idPlanoContaContabil = v_idPlanoContaContabil
                    AND conta.estabelecimento = b.estabelecimento
                    AND conta.ativo = 1), 0))
                -- 90 Diminuir Valor Contábil
                -- 91 Somar Valor Contábil
                ELSE 0
              END, -- idContaContabil
              c.historicoContabil,
              c.linhaContabil,
              CASE v_tipoAglutinacaoContabil
                -- 2	Dia
                WHEN 2 THEN '2' || TO_CHAR (b.data, 'YYYYMMDD')
                -- 3	Mês
                WHEN 3 THEN '3' || TO_CHAR (b.data, 'YYYYMM')
                -- 1	Fato Contábil
                ELSE '1' || LPAD (b.fatoContabil, 14, '0')
              END, -- quebra
              b.origemContabil,
              b.idDocumento,
              b.data,
              b.fatoContabil,
              b.estabelecimento,
              b.pessoa,
              b.documento,
              b.complemento,
              b.documentoAberto,
              c.valor);
          END IF;
        END LOOP;
      END LOOP;
    END LOOP;
    -- Fim Gera TEMPCONTABILANALITICO
    -- Início Gera TEMPCONTABILSINTETICO
    v_idCriar := 0;
    FOR a IN (
      SELECT
        a.quebra,
        a.debitoCredito,
        a.idContaContabil,
        a.historicoContabil,
        a.linhaContabil,
        a.origemContabil,
        a.idDocumento,
        a.data,
        a.fatoContabil,
        a.estabelecimento,
        a.pessoa,
        a.documento,
        a.complemento,
        a.documentoAberto,
        a.valor,
        pess.nomeRazaoSocial,
        hist.descricaoMontada
      FROM (
        SELECT
          quebra,
          origemContabil,
          debitoCredito,
          idContaContabil,
          historicoContabil,
          MIN (linhaContabil) linhaContabil,
          MIN (idDocumento) idDocumento,
          MIN (data) data,
          MIN (fatoContabil) fatoContabil,
          MIN (estabelecimento) estabelecimento,
          MIN (pessoa) pessoa,
          MIN (documento) documento,
          MIN (complemento) complemento,
          MAX (documentoAberto) documentoAberto,
          SUM (valor) valor
        FROM TEMPCONTABILANALITICO
        WHERE sessaoClient = p_sessaoClient
        AND contadorSessao = p_contadorSessao
        GROUP BY
          quebra,
          origemContabil,
          debitoCredito,
          idContaContabil,
          historicoContabil) a
      JOIN CAPESSOAS pess
      ON pess.pessoa = a.pessoa
      JOIN PAHISTORICOSCONTABEIS hist
      ON hist.historicoContabil = a.historicoContabil
      ORDER BY
        a.quebra,
        a.linhaContabil,
        a.valor,
        a.debitoCredito DESC,
        a.idContaContabil,
        a.historicoContabil)
    LOOP
      IF a.debitoCredito = 'D' THEN
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = a.quebra
        AND b.valor = a.valor
        AND b.estabelecimento = a.estabelecimento
        AND b.historicoContabil = a.historicoContabil
        AND b.debitar = 0;
      ELSE
        SELECT COALESCE (MIN (b.id), 0)
        INTO v_idAtualizar
        FROM TEMPCONTABILSINTETICO b
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.quebra = a.quebra
        AND b.valor = a.valor
        AND b.estabelecimento = a.estabelecimento
        AND b.historicoContabil = a.historicoContabil
        AND b.creditar = 0;
      END IF;
      IF v_idAtualizar = 0 THEN
        v_idCriar := v_idCriar + 1;
        INSERT INTO TEMPCONTABILSINTETICO (
          sessaoClient,
          contadorSessao,
          id,
          quebra,
          fato,
          sequencia,
          selecionado,
          estabelecimento,
          estabelecimentoCodigoDescricao,
          idPlanoContaContabil,
          data,
          pessoa,
          pessoaCodigoDescricao,
          documento,
          fatoContabil,
          debitar,
          debitoIdContabil,
          debitoIdContaContabil,
          debitoReduzido,
          debitoCodigoDescricao,
          creditar,
          creditoIdContabil,
          creditoIdContaContabil,
          creditoReduzido,
          creditoCodigoDescricao,
          valor,
          historicoContabil,
          complemento,
          historicoMontado,
          origemContabil,
          idDocumento,
          documentoAberto,
          erroDebito,
          erroCredito,
          erroHistorico,
          erroValor,
          erroGeral)
        VALUES (
          p_sessaoClient,
          p_contadorSessao,
          v_idCriar, -- id
          a.quebra,
          0, -- fato
          0, -- sequencia
          1, -- selecionado
          a.estabelecimento,
          ' ', -- estabelecimentoCodigoDescricao
          0, -- idPlanoContaContabil
          a.data,
          a.pessoa,
          ' ', -- pessoaCodigoDescricao
          a.documento,
          a.fatoContabil,
          CASE
            WHEN a.debitoCredito = 'D'
            THEN 1
            ELSE 0
          END, -- debitar
          0, -- debitoIdContabil
          CASE
            WHEN a.debitoCredito = 'D'
            THEN a.idContaContabil
            ELSE 0
          END, -- debitoIdContaContabil
          0, -- debitoReduzido
          ' ', -- debitoCodigoDescricao
          CASE
            WHEN a.debitoCredito = 'C'
            THEN 1
            ELSE 0
          END, -- creditar
          0, -- creditoIdContabil
          CASE
            WHEN a.debitoCredito = 'C'
            THEN a.idContaContabil
            ELSE 0
          END, -- creditoIdContaContabil
          0, -- creditoReduzido
          ' ', -- creditoCodigoDescricao
          a.valor,
          a.historicoContabil,
          a.complemento,
          REPLACE (
            REPLACE (
              REPLACE (
                REPLACE (
                  a.descricaoMontada,
                  '@DATA', COALESCE (TO_CHAR (a.data, 'DD/MM/YYYY'), '00/00/0000')),
                '@PESSOA',
                  CASE
                    WHEN a.pessoa = 0
                    THEN 'CONSUMIDOR FINAL'
                    ELSE a.nomeRazaoSocial
                  END),
              '@DOCUMENTO', a.documento),
            '@COMPLEMENTO', a.complemento), -- descricaoHistorico
          a.origemContabil,
          a.idDocumento,
          a.documentoAberto,
          ' ',
          ' ',
          ' ',
          ' ',
          ' ');
      ELSIF a.debitoCredito = 'D' THEN
        UPDATE TEMPCONTABILSINTETICO b SET
          b.debitar = 1,
          b.debitoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      ELSE
        UPDATE TEMPCONTABILSINTETICO b SET
          b.creditar = 1,
          b.creditoIdContaContabil = a.idContaContabil
        WHERE b.sessaoClient = p_sessaoClient
        AND b.contadorSessao = p_contadorSessao
        AND b.id = v_idAtualizar;
      END IF;
    END LOOP;
  END IF;
  v_quebra    := ' ';
  v_fato      := 0;
  v_sequencia := 0;
  FOR a IN (
    SELECT
      a.id,
      a.quebra,
      CASE
        WHEN a.estabelecimento = 0
        THEN ' '
        ELSE COALESCE (estab.descricao, ' ')
      END estabelecimentoCodigoDescricao,
      estab.idPlanoContaContabil,
      CASE
        WHEN a.pessoa = 0
        THEN ' '
        ELSE COALESCE (pess.nomeRazaoSocial, ' ')
      END pessoaCodigoDescricao,
      CASE
        WHEN a.debitar = 0
          OR a.debitoIdContaContabil = 0
        THEN 0
        ELSE COALESCE (contDeb.reduzido, 0)
      END debitoReduzido,
      CASE
        WHEN a.debitar = 0
          OR a.debitoIdContaContabil = 0
        THEN ' '
        ELSE COALESCE (contDeb.contaEstruturada, ' ')
          || ' - '
          || COALESCE (contDeb.descricao, ' ')
      END debitoCodigoDescricao,
      CASE
        WHEN a.creditar = 0
          OR a.creditoIdContaContabil = 0
          THEN 0
          ELSE COALESCE (contCred.reduzido, 0)
      END creditoReduzido,
      CASE
        WHEN a.creditar = 0
          OR a.creditoIdContaContabil = 0
        THEN ' '
        ELSE COALESCE (contCred.contaEstruturada, ' ')
          || ' - '
          || COALESCE (contCred.descricao, ' ')
      END creditoCodigoDescricao
    FROM TEMPCONTABILSINTETICO a
    JOIN PAESTABELECIMENTOS estab
    ON estab.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    JOIN PACONTASCONTABEIS contDeb
    ON contDeb.idContaContabil = a.debitoIdContaContabil
    JOIN PACONTASCONTABEIS contCred
    ON contCred.idContaContabil = a.creditoIdContaContabil
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    ORDER BY
      a.quebra,
      a.id)
  LOOP
    IF v_quebra <> a.quebra THEN
      v_fato      := v_fato + 1;
      v_sequencia := 0;
      v_quebra    := a.quebra;
    END IF;
    v_sequencia := v_sequencia + 1;
    UPDATE TEMPCONTABILSINTETICO b SET
      b.fato = v_fato,
      b.sequencia = v_sequencia,
      b.estabelecimentoCodigoDescricao = a.estabelecimentoCodigoDescricao,
      b.idPlanoContaContabil = a.idPlanoContaContabil,
      b.pessoaCodigoDescricao = a.pessoaCodigoDescricao,
      b.debitoReduzido = a.debitoReduzido,
      b.debitoCodigoDescricao = a.debitoCodigoDescricao,
      b.creditoReduzido = a.creditoReduzido,
      b.creditoCodigoDescricao = a.creditoCodigoDescricao
    WHERE b.sessaoClient = p_sessaoClient
    AND b.contadorSessao = p_contadorSessao
    AND b.id = a.id;
  END LOOP;
  IF p_situacaoContabilizacao <> 'C' THEN
    -- Fim Gera TEMPCONTABILSINTETICO
    ADD_TEMPCONTABIL_VERIFICA_ERRO (
      p_sessaoClient,
      p_contadorSessao,
      0); -- p_fato
  END IF;
END ADD_TEMPCONTABIL_GERA_TEMP;

/

create or replace PROCEDURE ADD_TEMPMARGEMCONTRIB_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_contadorSessao               IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                IN CHAR,
  p_item_id                      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorAdicFreteMarTotal  IN NUMBER,
  p_item_valorDespesasAduanTotal IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER)
IS
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  ADD_CALCULA_MARGEM_CONTRIB (
    p_usuarioLogado,
    p_perfilUsuarioLogado,
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_regMarg_reduzirImpostos,
    p_regMarg_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_cab_estabelecimento,
    p_cab_dataEmissao,
    p_cab_prazoMedioPonderado,
    p_munEndEst_uf,
    p_munEndPess_uf,
    p_item_modeloDocumento,
    p_item_gradeProduto,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_quantidade,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    p_item_valorRetIRRF,
    p_item_valorRetCSLL,
    p_item_valorII,
    p_item_valorIOF,
    p_item_valorIPI,
    p_item_valorIPIDevolucao,
    p_item_valorPIS,
    p_item_valorPISST,
    p_item_valorCOFINS,
    p_item_valorCOFINSST,
    p_item_valorCreditoSimplesNac,
    p_item_valorICMSOperacao,
    p_item_valorICMSDiferido,
    p_item_valorICMS,
    p_item_valorICMSDesoneracao,
    p_item_valorICMSST,
    p_item_valorICMSUFDestinatario,
    p_item_valorICMSUFRemetente,
    p_item_valorFCP,
    p_item_valorFCPST,
    p_item_valorFCPSTAnteriormente,
    p_item_valorFCPUFDestinatario,
    p_item_valorLiquidoItem,
    /* Retornos */
    v_item_valorLiquidoSemFreteSeg,
    v_item_valorCaptacao,
    v_item_valorImpostos,
    v_item_precoCusto,
    v_item_valorCusto,
    v_item_valorMargem,
    v_item_percentualMargem);
  IF p_regMarg_exibImagemMargemItem = 1
    AND p_regMarg_regraImagemItem <> 0
  THEN
    v_item_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemItem,
        v_item_percentualMargem);
  ELSE
    v_item_imagemMargem := ' ';
  END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'O'                            orcamentoPredocumentoDocumento,
      p_contadorSessao               contadorSessao,
      p_item_id                      id,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.contadorSessao = b.contadorSessao
      AND a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    contadorSessao,
    id,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.contadorSessao,
    b.id,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
END ADD_TEMPMARGEMCONTRIB_GRAVA;

/

create or replace PROCEDURE ADD_ENTREGA_CRIA_PENDENTE (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
  v_auxVarchar      VARCHAR (32000);
BEGIN
  FOR a IN (
    SELECT
      a.modeloDocumentoEntrega,
      a.estabelecimento,
      a.dataEntrega,
      a.motorista,
      a.placa,
      (a.quantidadeConvertida - a.quantidadeEntrega) quantidadePendente
    FROM (
      SELECT
        contr.modeloDocumentoEntrega,
        orc.estabelecimento,
        COALESCE (item.dataEntrega, orc.dataEntrega) dataEntrega,
        orc.motorista,
        orc.placa,
        item.quantidadeConvertida,
        COALESCE ((
          SELECT SUM (entr.quantidade)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = item.idItemOrcamento), 0) quantidadeEntrega
      FROM MOORCAMENTOXITENS item
      JOIN PACONTROLESENTREGA contr
      ON contr.controleEntrega = item.controleEntrega
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = item.orcamento
      WHERE item.idItemOrcamento = p_idItemOrcamento
      AND item.cancelado = 0
      AND item.controleEntrega > 0) a
    WHERE a.quantidadeConvertida <> a.quantidadeEntrega)
  LOOP
    IF a.quantidadePendente > 0 THEN
      ADD_ENTREGA_CRIA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        a.modeloDocumentoEntrega, -- p_modeloDocumento,
        a.estabelecimento, -- p_estabelecimento,
        a.dataEntrega, -- p_dataEntrega,
        TO_CHAR (a.dataEntrega, 'HH24MISS'), -- p_horaEntregaFinal,
        a.motorista, -- p_motorista,
        a.placa, -- p_placa,
        0, -- p_rota,
        p_idItemOrcamento,
        0, -- p_idItemPreDocumentoRemessa,
        0, -- p_idItemDocFiscalRemessa,
        a.quantidadePendente, -- p_quantidade,
        1, -- p_situacaoEntrega
        'ADD_ENTREGA_CRIA_PENDENTE'  -- p_observacoes
      );
    ELSIF a.quantidadePendente < 0 THEN
      v_quantidadeSaldo := - a.quantidadePendente;
      FOR b IN (
        SELECT
          entr.entrega,
          entr.modeloDocumento,
          entr.estabelecimento,
          entr.dataEntrega,
          entr.horaEntregaFinal,
          entr.motorista,
          entr.placa,
          entr.rota,
          entr.quantidade,
          entr.situacaoEntrega,
          entr.observacoes
        FROM MOENTREGAS entr
        WHERE entr.idItemOrcamento = p_idItemOrcamento
        AND entr.situacaoEntrega IN (1,2))
      LOOP
        IF v_quantidadeSaldo > 0
          AND b.quantidade > 0 THEN
          IF v_quantidadeSaldo < b.quantidade THEN
            ADD_ENTREGA_CRIA (
              p_sys_usuarioLogado,
              p_sys_estabelecimentoAtivo,
              b.modeloDocumento,
              b.estabelecimento,
              b.dataEntrega,
              b.horaEntregaFinal,
              b.motorista,
              b.placa,
              b.rota,
              p_idItemOrcamento,
              0,
              0,
              b.quantidade - v_quantidadeSaldo,
              b.situacaoEntrega,
              b.observacoes);
            UPDATE MOENTREGAS c SET
              c.quantidade = v_quantidadeSaldo
            WHERE c.entrega = b.entrega;
            ADD_ENTREGA_SITUACAO_CRIA (
              p_sys_usuarioLogado,
              p_sys_estabelecimentoAtivo,
              p_idItemOrcamento,
              b.entrega,
              b.situacaoEntrega,
              'ADD_ENTREGA_CRIA_PENDENTE - Ajusta Saldo');
            v_quantidadeSaldo := 0;
          ELSE
            ADD_ENTREGA_EXCLUI (
              p_sys_usuarioLogado,
              p_sys_estabelecimentoAtivo,
              b.entrega,
              0,
              'ADD_ENTREGA_CRIA_PENDENTE');
            v_quantidadeSaldo := v_quantidadeSaldo - b.quantidade;
          END IF;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_ITEM (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_idItemOrcamento,
    '',
    '',
    v_auxVarchar,
    v_auxVarchar);
END ADD_ENTREGA_CRIA_PENDENTE;

/

create or replace PROCEDURE ADD_DOCTROCA_ITEM_EXCLUI (
  p_idItemDocTroca IN NUMBER)
IS
  v_quantidade              NUMBER;
  v_idItemPreDocumentoSaida NUMBER;
  v_idItemDocFiscalSaida    NUMBER;
  v_idEstoque               NUMBER;
BEGIN
  SELECT
    quantidade,
    idItemPreDocumentoSaida,
    idItemDocFiscalSaida,
    idEstoque
  INTO
    v_quantidade,
    v_idItemPreDocumentoSaida,
    v_idItemDocFiscalSaida,
    v_idEstoque
  FROM MODOCTROCAXITENS
  WHERE idItemDocTroca = p_idItemDocTroca;
  DELETE MODOCTROCAXITENS
  WHERE idItemDocTroca = p_idItemDocTroca;
  IF v_idItemPreDocumentoSaida > 0 THEN
    UPDATE MOPREDOCUMXITENS
    SET quantidadeDevolvidaRetornada =
      CASE
        WHEN quantidadeDevolvidaRetornada < v_quantidade
        THEN 0
        ELSE quantidadeDevolvidaRetornada - v_quantidade
      END
    WHERE idItemPreDocumento = v_idItemPreDocumentoSaida;
  END IF;
  IF v_idItemDocFiscalSaida > 0 THEN
    UPDATE MODOCFISCALXITENS
    SET quantidadeDevolvidaRetornada =
      CASE
        WHEN quantidadeDevolvidaRetornada < v_quantidade
        THEN 0
        ELSE quantidadeDevolvidaRetornada - v_quantidade
      END
    WHERE idItemDocFiscal = v_idItemDocFiscalSaida;
  END IF;
  IF v_idEstoque > 0 THEN
    ADD_ESTOQUE_EXCLUI (v_idEstoque);
  END IF;
END ADD_DOCTROCA_ITEM_EXCLUI;

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
  p_estabelecimentoAtivo         IN NUMBER,
  p_idNumeroSerieOrcamento       IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_idNumeroSerie                IN NUMBER,
  p_efetivado                    IN NUMBER,
  /* Retornos */
  r_idNumeroSerieOrcamento       OUT NUMBER)
IS
BEGIN
  r_idNumeroSerieOrcamento := p_idNumeroSerieOrcamento;
  IF r_idNumeroSerieOrcamento = 0 THEN
    SELECT COALESCE (MAX (idNumeroSerieOrcamento), 0)
    INTO r_idNumeroSerieOrcamento
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamento
    AND idNumeroSerie = p_idNumeroSerie;
  END IF; 
  IF r_idNumeroSerieOrcamento = 0 THEN
    r_idNumeroSerieOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID('MOORCAMENTOXNUMEROSSERIE', 'idNumeroSerieOrcamento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOORCAMENTOXNUMEROSSERIE a 
  USING (
    SELECT
      r_idNumeroSerieOrcamento idNumeroSerieOrcamento,
      p_idItemOrcamento        idItemOrcamento,
      p_gradeProduto           gradeProduto,
      p_idNumeroSerie          idNumeroSerie,
      p_efetivado              efetivado
    FROM DUAL
  ) b ON (a.idNumeroSerieOrcamento = b.idNumeroSerieOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemOrcamento = b.idItemOrcamento,
    a.gradeProduto    = b.gradeProduto,
    a.idNumeroSerie   = b.idNumeroSerie,
    a.efetivado       = b.efetivado
  WHEN NOT MATCHED THEN INSERT (
    idNumeroSerieOrcamento,
    idItemOrcamento,
    gradeProduto,
    idNumeroSerie,
    efetivado)
  VALUES (
    b.idNumeroSerieOrcamento,
    b.idItemOrcamento,
    b.gradeProduto,
    b.idNumeroSerie,
    b.efetivado);
END ADD_ORCAMENTO_ITEM_N_SER_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_GRAVA (
  p_estabelecimentoAtivo         IN NUMBER,
  p_idNumeroSeriePreDocumento    IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_idNumeroSerie                IN NUMBER,
  p_devolvidoRetornado           IN NUMBER,
  /* Retornos */
  r_idNumeroSeriePreDocumento    OUT NUMBER)
IS
BEGIN
  r_idNumeroSeriePreDocumento := p_idNumeroSeriePreDocumento;
  IF r_idNumeroSeriePreDocumento = 0 THEN
    SELECT COALESCE (MAX (idNumeroSeriePreDocumento), 0)
    INTO r_idNumeroSeriePreDocumento
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_idItemPreDocumento
    AND idNumeroSerie = p_idNumeroSerie;
  END IF; 
  IF r_idNumeroSeriePreDocumento = 0 THEN
    r_idNumeroSeriePreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXNUMEROSSERIE', 'idNumeroSeriePreDocumento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOPREDOCUMXNUMEROSSERIE a 
  USING (
    SELECT
      r_idNumeroSeriePreDocumento idNumeroSeriePreDocumento,
      p_idItemPreDocumento        idItemPreDocumento,
      p_gradeProduto              gradeProduto,
      p_idNumeroSerie             idNumeroSerie,
      p_devolvidoRetornado        devolvidoRetornado
    FROM DUAL
  ) b ON (a.idNumeroSeriePreDocumento = b.idNumeroSeriePreDocumento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemPreDocumento = b.idItemPreDocumento,
    a.gradeProduto       = b.gradeProduto,
    a.idNumeroSerie      = b.idNumeroSerie,
    a.devolvidoRetornado = b.devolvidoRetornado
  WHEN NOT MATCHED THEN INSERT (
    idNumeroSeriePreDocumento,
    idItemPreDocumento,
    gradeProduto,
    idNumeroSerie,
    devolvidoRetornado)
  VALUES (
    b.idNumeroSeriePreDocumento,
    b.idItemPreDocumento,
    b.gradeProduto,
    b.idNumeroSerie,
    b.devolvidoRetornado);
END ADD_PRE_DOC_ITEM_N_SER_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_GRAVA (
  p_estabelecimentoAtivo       IN NUMBER,
  p_idNumeroSerieDocFiscal     IN NUMBER,
  p_idItemDocFiscal            IN NUMBER,
  p_gradeProduto               IN NUMBER,
  p_idNumeroSerie              IN NUMBER,
  p_devolvidoRetornado         IN NUMBER,
  /* Retornos */
  r_idNumeroSerieDocFiscal     OUT NUMBER)
IS
BEGIN
  r_idNumeroSerieDocFiscal := p_idNumeroSerieDocFiscal;
  IF r_idNumeroSerieDocFiscal = 0 THEN
    SELECT COALESCE (MAX (idNumeroSerieDocFiscal), 0)
    INTO r_idNumeroSerieDocFiscal
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_idItemDocFiscal
    AND idNumeroSerie = p_idNumeroSerie;
  END IF; 
  IF r_idNumeroSerieDocFiscal = 0 THEN
    r_idNumeroSerieDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MODOCFISCALXNUMEROSSERIE a 
  USING (
    SELECT
      r_idNumeroSerieDocFiscal idNumeroSerieDocFiscal,
      p_idItemDocFiscal        idItemDocFiscal,
      p_gradeProduto           gradeProduto,
      p_idNumeroSerie          idNumeroSerie,
      p_devolvidoRetornado     devolvidoRetornado
    FROM DUAL
  ) b ON (a.idNumeroSerieDocFiscal = b.idNumeroSerieDocFiscal)
  WHEN MATCHED THEN UPDATE SET
    a.idItemDocFiscal    = b.idItemDocFiscal,
    a.gradeProduto       = b.gradeProduto,
    a.idNumeroSerie      = b.idNumeroSerie,
    a.devolvidoRetornado = b.devolvidoRetornado
  WHEN NOT MATCHED THEN INSERT (
    idNumeroSerieDocFiscal,
    idItemDocFiscal,
    gradeProduto,
    idNumeroSerie,
    devolvidoRetornado)
  VALUES (
    b.idNumeroSerieDocFiscal,
    b.idItemDocFiscal,
    b.gradeProduto,
    b.idNumeroSerie,
    b.devolvidoRetornado);
END ADD_DOC_FISC_ITEM_N_SER_GRAVA;

/

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_N_SER_GRAVA (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idNumeroSerieDocTransf IN NUMBER,
  p_idItemDocTransferencia IN NUMBER,
  p_gradeProduto           IN NUMBER,
  p_idNumeroSerie          IN NUMBER,
  /* Retornos */
  r_idNumeroSerieDocTransf OUT NUMBER)
IS
BEGIN
  r_idNumeroSerieDocTransf := p_idNumeroSerieDocTransf;
  IF r_idNumeroSerieDocTransf = 0 THEN
    SELECT COALESCE (MAX (idNumeroSerieDocTransf), 0)
    INTO r_idNumeroSerieDocTransf
    FROM MODOCTRANSFXNUMEROSSERIE
    WHERE idItemDocTransferencia = p_idItemDocTransferencia
    AND idNumeroSerie = p_idNumeroSerie;
  END IF; 
  IF r_idNumeroSerieDocTransf = 0 THEN
    r_idNumeroSerieDocTransf := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCTRANSFXNUMEROSSERIE', 'idNumeroSerieDocTransf', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MODOCTRANSFXNUMEROSSERIE a 
  USING (
    SELECT
      r_idNumeroSerieDocTransf idNumeroSerieDocTransf,
      p_idItemDocTransferencia idItemDocTransferencia,
      p_gradeProduto           gradeProduto,
      p_idNumeroSerie          idNumeroSerie
    FROM DUAL
  ) b ON (a.idNumeroSerieDocTransf = b.idNumeroSerieDocTransf)
  WHEN MATCHED THEN UPDATE SET
    a.idItemDocTransferencia = b.idItemDocTransferencia,
    a.gradeProduto           = b.gradeProduto,
    a.idNumeroSerie          = b.idNumeroSerie
  WHEN NOT MATCHED THEN INSERT (
    idNumeroSerieDocTransf,
    idItemDocTransferencia,
    gradeProduto,
    idNumeroSerie)
  VALUES (
    b.idNumeroSerieDocTransf,
    b.idItemDocTransferencia,
    b.gradeProduto,
    b.idNumeroSerie);
END ADD_DOCTRANSF_ITEM_N_SER_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_N_SER_ORC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemOrcamentoPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemOrcamentoPara,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOORCAMENTOXNUMEROSSERIE b
        SET b.efetivado = 1
        WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemOrcamentoPara,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_N_SER_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemOrcamentoDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_quantidade             IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemPreDocumentoPara,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOORCAMENTOXNUMEROSSERIE b
        SET b.efetivado = 1
        WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_PRE_DOC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemPreDocumentoPara,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_PRE_DOC_ITEM_N_SER_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_ORCAM (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemDocFiscalPara,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOORCAMENTOXNUMEROSSERIE b
        SET b.efetivado = 1
        WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_DOC_FISC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemDocFiscalPara,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ITEM_N_SER_ORCAM;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_PRE_DOC (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemPreDocumentoDe   IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_quantidade             IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSeriePreDocumento,
      gradeProduto,
      idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemPreDocumentoPara,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOPREDOCUMXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSeriePreDocumento = a.idNumeroSeriePreDocumento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_PRE_DOC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemPreDocumentoPara,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_PRE_DOC_ITEM_N_SER_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_PRE (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemPreDocumentoDe IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSeriePreDocumento,
      gradeProduto,
      idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemDocFiscalPara,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOPREDOCUMXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSeriePreDocumento = a.idNumeroSeriePreDocumento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_DOC_FISC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemDocFiscalPara,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ITEM_N_SER_PRE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_DOC_FIS (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemDocFiscalDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_quantidade             IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieDocFiscal,
      gradeProduto,
      idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemPreDocumentoPara,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MODOCFISCALXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSerieDocFiscal = a.idNumeroSerieDocFiscal;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_PRE_DOC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemPreDocumentoPara,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_PRE_DOC_ITEM_N_SER_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_DOC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemDocFiscalDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieDocFiscal,
      gradeProduto,
      idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemDocFiscalPara,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MODOCFISCALXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSerieDocFiscal = a.idNumeroSerieDocFiscal;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_DOC_FISC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemDocFiscalPara,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ITEM_N_SER_DOC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
  p_estabelecimentoAtivo        IN NUMBER,
  p_cab_tipoDocumento           IN NUMBER,
  p_idItemOrcamento             IN NUMBER,
  p_item_quantidade             IN NUMBER,
  p_idItemOrcamentoReferenciado IN NUMBER,
  p_quantidadeReferenciada      IN NUMBER,
  p_atualizarObservacoes        IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes        OUT NUMBER)
IS
  v_id NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_ORCAMENTO_ITEM_N_SER_ORC (
    p_estabelecimentoAtivo,
    p_idItemOrcamentoReferenciado,
    p_idItemOrcamento,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    0,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_ORCAMENTO_ITEM_CUSTO_ORC (
    p_estabelecimentoAtivo,
    p_idItemOrcamentoReferenciado,
    p_idItemOrcamento);
  ADD_ORCAMENTO_ITEM_COMP_ORC (
    p_estabelecimentoAtivo,
    p_idItemOrcamentoReferenciado,
    p_idItemOrcamento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_cab_tipoDocumento = 103 THEN
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeReferenciada
    WHERE idItemOrcamento = p_idItemOrcamentoReferenciado;
  END IF;
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOORCAMENTOXORCAMENTO
  WHERE idItemOrcamento = p_idItemOrcamento
  AND idItemOrcamentoReferenc = p_idItemOrcamentoReferenciado;
  IF v_id > 0 THEN
    IF p_quantidadeReferenciada <> 0 THEN
      UPDATE MOORCAMENTOXORCAMENTO
      SET quantidade = quantidade + p_quantidadeReferenciada
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXORCAMENTO', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOORCAMENTOXORCAMENTO (
      id,
      idItemOrcamento,
      idItemOrcamentoReferenc,
      quantidade)
    VALUES (
      v_id,
      p_idItemOrcamento,
      p_idItemOrcamentoReferenciado,
      p_quantidadeReferenciada);
  END IF;
  IF p_item_quantidade > 0
  AND p_quantidadeReferenciada = 0
  THEN
    FOR a IN (
      SELECT
        a.idItemOrcamentoReferenc,
        a.quantidade,
        b.quantidade quantidadeOrcamento
      FROM MOORCAMENTOXORCAMENTO a
      JOIN MOORCAMENTOXITENS b
      ON b.idItemOrcamento = a.idItemOrcamento
      WHERE a.idItemOrcamento = p_idItemOrcamento
      AND a.quantidade > 0 
      AND b.quantidade > 0)
    LOOP
      IF ROUND (a.quantidade * p_item_quantidade / a.quantidadeOrcamento,7) > 0 THEN
        SELECT COALESCE (MAX (id),0)
        INTO v_id
        FROM MOORCAMENTOXORCAMENTO
        WHERE idItemOrcamento = p_idItemOrcamento
        AND idItemOrcamentoReferenc = a.idItemOrcamentoReferenc;
        IF v_id > 0 THEN
          UPDATE MOORCAMENTOXORCAMENTO
          SET quantidade = quantidade + ROUND(a.quantidade * p_item_quantidade / a.quantidadeOrcamento,7)
          WHERE id = v_id;
        ELSE
          v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXORCAMENTO', 'id', 14, p_estabelecimentoAtivo, NULL);
          INSERT INTO MOORCAMENTOXORCAMENTO (
            id,
            idItemOrcamento,
            idItemOrcamentoReferenc,
            quantidade)
          VALUES (
            v_id,
            p_idItemOrcamento,
            a.idItemOrcamentoReferenc,
            ROUND (a.quantidade * p_item_quantidade / a.quantidadeOrcamento, 7));
        END IF;
       END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
  p_idFichaProdutoRealOrcamento IN NUMBER,
  p_bufferIdEstoque             IN VARCHAR,
  r_bufferIdEstoque             OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  ADD_ESTOQUE_FIC_TEC_EXCLUI (
    p_idFichaProdutoRealOrcamento,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  DELETE MOORCAMENTOXFICHAPRODREAL
  WHERE idFichaProdutoRealOrcamento = p_idFichaProdutoRealOrcamento;
END ADD_ORCAMENTO_ITEM_REAL_FIC_EX;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
  p_idAtividadeRealOrcamento IN NUMBER,
  p_bufferIdEstoque          IN VARCHAR,
  r_bufferIdEstoque          OUT VARCHAR)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT idFichaProdutoRealOrcamento
    FROM MOORCAMENTOXFICHAPRODREAL
    WHERE idAtividadeRealOrcamento = p_idAtividadeRealOrcamento
  	AND idFichaProdutoRealOrcamento > 0)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
      a.idFichaProdutoRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
  DELETE MOORCAMENTOXATIVIDADEREAL
  WHERE idAtividadeRealOrcamento = p_idAtividadeRealOrcamento;
END ADD_ORCAMENTO_ITEM_REAL_EXCLUI;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_EX (
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_bufferIdReservaEstoque      IN VARCHAR2,
  p_bufferIdEstoque             IN VARCHAR,
  r_bufferIdReservaEstoque      OUT VARCHAR2,
  r_bufferIdEstoque             OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_bufferIdEstoque        := p_bufferIdEstoque;
  FOR a IN (
    SELECT idFichaProdutoRealOrcamento
    FROM MOORCAMENTOXFICHAPRODREAL
    WHERE idFichaProdutoPrevOrcamento = p_idFichaProdutoPrevOrcamento
	  AND idFichaProdutoRealOrcamento > 0)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
      a.idFichaProdutoRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
  ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
    p_idFichaProdutoPrevOrcamento,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
  DELETE MOORCAMENTOXFICHAPRODPREV
  WHERE idFichaProdutoPrevOrcamento = p_idFichaProdutoPrevOrcamento;
END ADD_ORCAMENTO_ITEM_PREV_FIC_EX;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
  p_idAtividadePrevOrcamento IN NUMBER,
  p_bufferIdReservaEstoque   IN VARCHAR2,
  p_bufferIdEstoque          IN VARCHAR,
  r_bufferIdReservaEstoque   OUT VARCHAR2,
  r_bufferIdEstoque          OUT VARCHAR)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_bufferIdEstoque        := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadeRealOrcamento
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
	  AND idAtividadeRealOrcamento > 0)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
      a.idAtividadeRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT idFichaProdutoPrevOrcamento
    FROM MOORCAMENTOXFICHAPRODPREV
    WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
	  AND idFichaProdutoPrevOrcamento > 0)
  LOOP
    ADD_ORCAMENTO_ITEM_PREV_FIC_EX (
      a.idFichaProdutoPrevOrcamento,
      r_bufferIdReservaEstoque,
      r_bufferIdEstoque,
      r_bufferIdReservaEstoque,
      r_bufferIdEstoque);
  END LOOP;
  DELETE MOORCAMENTOXTAREFAS
  WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento;
  DELETE MOORCAMENTOXATIVIDADEPREV
  WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento;
END ADD_ORCAMENTO_ITEM_PREV_EXCLUI;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_CANC (
  p_idItemOrcamento IN NUMBER)    
IS
BEGIN
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_idItemOrcamento
    AND statusAtividadeServico IN ('A','I','P'))
  LOOP
    UPDATE MOORCAMENTOXATIVIDADEPREV b
    SET b.statusAtividadeServico = 'C'
    WHERE b.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento;
    UPDATE MOORCAMENTOXATIVIDADEREAL b
    SET b.statusAtividadeServico = 'C'
    WHERE b.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
    AND b.statusAtividadeServico IN ('A','I','P');
  END LOOP;
  UPDATE MOORCAMENTOXITENS
  SET statusAtividadeServico = 'C'
  WHERE idItemOrcamento = p_idItemOrcamento
  AND statusAtividadeServico <> 'C';
END ADD_ORCAMENTO_ITEM_PREV_CANC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idAtividadeRealOrcamento  IN NUMBER,
  p_idAtividadePrevOrcamento  IN NUMBER,
  p_sequencia                 IN NUMBER,
  p_atividadeServico          IN NUMBER,
  p_descricao                 IN VARCHAR2,
  p_tecnico                   IN NUMBER,
  p_statusAtividadeServico    IN CHAR,
  p_dataInicio                IN DATE,
  p_dataTermino               IN DATE,
  p_modeloDocumento           IN NUMBER,
  p_motivoEstoque             IN NUMBER,
  p_quantidade                IN NUMBER,
  p_observacoes               IN VARCHAR2,
  /* Retornos */
  r_idAtividadeRealOrcamento  OUT NUMBER)
IS
BEGIN
  r_idAtividadeRealOrcamento := p_idAtividadeRealOrcamento;
  IF (r_idAtividadeRealOrcamento = 0) THEN
    r_idAtividadeRealOrcamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXATIVIDADEREAL',
      'idAtividadeRealOrcamento',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXATIVIDADEREAL a 
  USING (
    SELECT
      r_idAtividadeRealOrcamento idAtividadeRealOrcamento,
      p_idAtividadePrevOrcamento idAtividadePrevOrcamento,
      p_sequencia                sequencia,
      p_atividadeServico         atividadeServico,
      p_descricao                descricao,
      p_tecnico                  tecnico,
      p_statusAtividadeServico   statusAtividadeServico,
      p_dataInicio               dataInicio,
      p_dataTermino              dataTermino,
      p_modeloDocumento          modeloDocumento,
      p_motivoEstoque            motivoEstoque,
      p_quantidade               quantidade,
      p_observacoes              observacoes
    FROM DUAL) b
  ON (a.idAtividadeRealOrcamento = b.idAtividadeRealOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento,
    a.sequencia                = b.sequencia,
    a.atividadeServico         = b.atividadeServico,
    a.descricao                = b.descricao,
    a.tecnico                  = b.tecnico,
    a.statusAtividadeServico   = b.statusAtividadeServico,
    a.dataInicio               = b.dataInicio,
    a.dataTermino              = b.dataTermino,
    a.modeloDocumento          = b.modeloDocumento,
    a.motivoEstoque            = b.motivoEstoque,
    a.quantidade               = b.quantidade,
    a.observacoes              = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idAtividadeRealOrcamento,
    idAtividadePrevOrcamento,
    sequencia,
    atividadeServico,
    descricao,
    tecnico,
    statusAtividadeServico,
    dataInicio,
    dataTermino,
    modeloDocumento,
    motivoEstoque,
    quantidade,
    observacoes)
  VALUES (
    b.idAtividadeRealOrcamento,
    b.idAtividadePrevOrcamento,
    b.sequencia,
    b.atividadeServico,
    b.descricao,
    b.tecnico,
    b.statusAtividadeServico,
    b.dataInicio,
    b.dataTermino,
    b.modeloDocumento,
    b.motivoEstoque,
    b.quantidade,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_REAL_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidade                   IN NUMBER)
IS  
  v_orcamento                NUMBER;
  v_cancelado                NUMBER;
  v_quantidadeSaldo          NUMBER;
  v_tipoDocumento            NUMBER;
  v_novaEtapaOrcamento       NUMBER;  
  v_situacaoOrcamento        NUMBER;
  v_quantidadeSaldoOrcamento NUMBER;
  v_auxAlpha                 VARCHAR (32000);
  v_auxNumber                NUMBER;
BEGIN
  SELECT
    item.orcamento,
    item.cancelado,
    item.quantidadeSaldo,
    cab.tipoDocumento
  INTO
    v_orcamento,
    v_cancelado,
    v_quantidadeSaldo,
    v_tipoDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_idItemOrcamento;
  IF v_tipoDocumento = 201 THEN
    v_novaEtapaOrcamento := p_config_97_etapaPedCompraCanc;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (MAX (a.etapaOrcamento), 0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 60
        AND validoPedidoCompra = 1) a
      WHERE a.ordenacao = 1;
    END IF;
  ELSIF v_tipoDocumento = 102 THEN
    v_novaEtapaOrcamento := p_config_96_etapaOrdemServCanc;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (MAX (a.etapaOrcamento), 0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90
        AND validoOrdemServico = 1) a
      WHERE a.ordenacao = 1;
    END IF;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (MAX (a.etapaOrcamento), 0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90) a
      WHERE a.ordenacao = 1;
    END IF;
  ELSIF v_tipoDocumento = 103 THEN
    v_novaEtapaOrcamento := p_config_415_etapaFatContrCanc;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (MAX (a.etapaOrcamento), 0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90
        AND validoContrato = 1) a
      WHERE a.ordenacao = 1;
    END IF;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (MAX (a.etapaOrcamento), 0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90) a
      WHERE a.ordenacao = 1;
    END IF;
  ELSE
    v_novaEtapaOrcamento := p_config_95_etapaOrcamentoCanc;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (MAX (a.etapaOrcamento), 0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90
        AND validoOrcamento = 1) a
      WHERE a.ordenacao = 1;
    END IF;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (MAX (a.etapaOrcamento), 0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90) a
      WHERE a.ordenacao = 1;
    END IF;
  END IF;
  IF v_novaEtapaOrcamento = 0 THEN
    v_situacaoOrcamento := 0;
  ELSE
    SELECT COALESCE (MAX (situacaoOrcamento), 0)
    INTO v_situacaoOrcamento
    FROM PAETAPASORCAMENTO
    WHERE etapaOrcamento = v_novaEtapaOrcamento;
  END IF;
  IF p_quantidade <> 0
    AND (v_novaEtapaOrcamento = 0
      OR v_situacaoOrcamento <= 63)
  THEN
    v_quantidadeSaldo := v_quantidadeSaldo + p_quantidade;
  END IF;
  IF v_novaEtapaOrcamento <> 0
    AND v_situacaoOrcamento = 90
  THEN
    v_cancelado := 1;
  END IF;
  UPDATE MOORCAMENTOXITENS SET
    cancelado = v_cancelado,
    quantidadeSaldo = v_quantidadeSaldo
  WHERE idItemOrcamento = p_idItemOrcamento;
  IF v_cancelado = 1 THEN
    SELECT COALESCE (SUM (quantidadeSaldo), 0)
    INTO v_quantidadeSaldoOrcamento
    FROM MOORCAMENTOXITENS
    WHERE orcamento = v_orcamento
    AND cancelado = 0;
    IF v_quantidadeSaldoOrcamento <= 0 THEN
      UPDATE MOORCAMENTOS
      SET etapaOrcamento = v_novaEtapaOrcamento
      WHERE orcamento = v_orcamento;
    END IF;
  ELSIF v_novaEtapaOrcamento <> 0 THEN
    UPDATE MOORCAMENTOS
    SET etapaOrcamento = v_novaEtapaOrcamento
    WHERE orcamento = v_orcamento;
  END IF;
  IF v_novaEtapaOrcamento <> 0 THEN
    IF v_situacaoOrcamento = 90 THEN
      FOR a IN (
        SELECT
          entrega,
          quantidade
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_SITUACAO_TROCA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_idItemOrcamento,
          a.entrega,
          a.quantidade,
          8,
          'ADD_ORCAMENTO_ITEM_SALDO_VOLTA');
      END LOOP;
    ELSE
      FOR a IN (
        SELECT entrega
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          a.entrega,
          0,
          'ADD_ORCAMENTO_ITEM_SALDO_VOLTA');
      END LOOP;
    END IF;
  END IF;
  ADD_RESERVA_ESTOQUE_ORC_ITEM (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_idItemOrcamento,
    '',
    '',
    v_auxAlpha,
    v_auxAlpha);
END ADD_ORCAMENTO_ITEM_SALDO_VOLTA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_REABRE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativ_idAtividadePrevOrcament IN NUMBER,
  p_ativ_dataInicio              IN DATE,
  p_ativ_dataTermino             IN DATE,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_bufferIdEstoque        := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadeRealOrcamento
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
	  AND idAtividadeRealOrcamento > 0)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
      a.idAtividadeRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT
      idFichaProdutoPrevOrcamento,
      quantidade
    FROM MOORCAMENTOXFICHAPRODPREV
    WHERE idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
	  AND idFichaProdutoPrevOrcamento > 0)
  LOOP
    FOR b IN (
      SELECT b.idFichaProdutoRealOrcamento
      FROM MOORCAMENTOXFICHAPRODREAL b
      WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
      AND b.idFichaProdutoRealOrcamento > 0)
    LOOP
      ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
        b.idFichaProdutoRealOrcamento,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END LOOP;
    UPDATE MOORCAMENTOXFICHAPRODPREV b
    SET b.quantidadeSaldo = a.quantidade
    WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento;
    ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
      a.idFichaProdutoPrevOrcamento,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_FICHA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_cab_estabelecimento,
    p_cab_dataEmissao,
    p_cab_dataEntrega,
    p_item_modeloDocumento,
    p_ativ_idAtividadePrevOrcament,
    p_ativ_dataInicio,
    p_ativ_dataTermino,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
END ADD_ORCAMENTO_ITEM_PREV_REABRE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_BLOEST_GRAV (
  p_estabelecimentoAtivo IN NUMBER,
  p_id                   IN NUMBER,
  p_orcamento            IN NUMERIC,
  p_sequencia            IN NUMERIC,
  p_dataBloqueio         IN DATE,
  p_estabelecimento      IN NUMERIC,
  p_localEstoque         IN NUMERIC,
  p_pessoaParticipante   IN NUMERIC,
  p_gradeProduto         IN NUMERIC,
  p_personalizacao       IN NUMERIC,
  p_idLoteEstoque        IN NUMERIC,
  p_idNumeroSerie        IN NUMERIC,
  p_quantidade           IN NUMERIC,
  p_quantidadeEstoque    IN NUMERIC,
  p_quantidadeReservas   IN NUMERIC,
  p_situacaoLiberacao    IN CHAR,
  p_usuarioLiberacao     IN NUMERIC,
  p_dataLiberacao        IN DATE,
  p_observacoes          IN VARCHAR,
  /* Retornos */
  r_id                   OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXBLOQUEIOSEST', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOORCAMENTOXBLOQUEIOSEST a 
  USING (
    SELECT
      r_id                 id,
      p_orcamento          orcamento,
      p_sequencia          sequencia,
      p_dataBloqueio       dataBloqueio,
      p_estabelecimento    estabelecimento,
      p_localEstoque       localEstoque,
      p_pessoaParticipante pessoaParticipante,
      p_gradeProduto       gradeProduto,
      p_personalizacao     personalizacao,
      p_idLoteEstoque      idLoteEstoque,
      p_idNumeroSerie      idNumeroSerie,
      p_quantidade         quantidade,
      p_quantidadeEstoque  quantidadeEstoque,
      p_quantidadeReservas quantidadeReservas,
      p_situacaoLiberacao  situacaoLiberacao,
      p_usuarioLiberacao   usuarioLiberacao,
      p_dataLiberacao      dataLiberacao,
      p_observacoes        observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.orcamento          = b.orcamento,
    a.sequencia          = b.sequencia,
    a.dataBloqueio       = b.dataBloqueio,
    a.estabelecimento    = b.estabelecimento,
    a.localEstoque       = b.localEstoque,
    a.pessoaParticipante = b.pessoaParticipante,
    a.gradeProduto       = b.gradeProduto,
    a.personalizacao     = b.personalizacao,
    a.idLoteEstoque      = b.idLoteEstoque,
    a.idNumeroSerie      = b.idNumeroSerie,
    a.quantidade         = b.quantidade,
    a.quantidadeEstoque  = b.quantidadeEstoque,
    a.quantidadeReservas = b.quantidadeReservas,
    a.situacaoLiberacao  = b.situacaoLiberacao,
    a.usuarioLiberacao   = b.usuarioLiberacao,
    a.dataLiberacao      = b.dataLiberacao,
    a.observacoes        = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    orcamento,
    sequencia,
    dataBloqueio,
    estabelecimento,
    localEstoque,
    pessoaParticipante,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    quantidadeEstoque,
    quantidadeReservas,
    situacaoLiberacao,
    usuarioLiberacao,
    dataLiberacao,
    observacoes)
  VALUES (
    b.id,
    b.orcamento,
    b.sequencia,
    b.dataBloqueio,
    b.estabelecimento,
    b.localEstoque,
    b.pessoaParticipante,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidade,
    b.quantidadeEstoque,
    b.quantidadeReservas,
    b.situacaoLiberacao,
    b.usuarioLiberacao,
    b.dataLiberacao,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_BLOEST_GRAV;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_BLOEST_GRAVA (
  p_estabelecimentoAtivo IN NUMBER,
  p_id                   IN NUMBER,
  p_preDocumento         IN NUMERIC,
  p_sequencia            IN NUMERIC,
  p_dataBloqueio         IN DATE,
  p_estabelecimento      IN NUMERIC,
  p_localEstoque         IN NUMERIC,
  p_pessoaParticipante   IN NUMERIC,
  p_gradeProduto         IN NUMERIC,
  p_personalizacao       IN NUMERIC,
  p_idLoteEstoque        IN NUMERIC,
  p_idNumeroSerie        IN NUMERIC,
  p_quantidade           IN NUMERIC,
  p_quantidadeEstoque    IN NUMERIC,
  p_quantidadeReservas   IN NUMERIC,
  p_situacaoLiberacao    IN CHAR,
  p_usuarioLiberacao     IN NUMERIC,
  p_dataLiberacao        IN DATE,
  p_observacoes          IN VARCHAR,
  /* Retornos */
  r_id                   OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXBLOQUEIOSEST', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOPREDOCUMXBLOQUEIOSEST a 
  USING (
    SELECT
      r_id                 id,
      p_preDocumento       preDocumento,
      p_sequencia          sequencia,
      p_dataBloqueio       dataBloqueio,
      p_estabelecimento    estabelecimento,
      p_localEstoque       localEstoque,
      p_pessoaParticipante pessoaParticipante,
      p_gradeProduto       gradeProduto,
      p_personalizacao     personalizacao,
      p_idLoteEstoque      idLoteEstoque,
      p_idNumeroSerie      idNumeroSerie,
      p_quantidade         quantidade,
      p_quantidadeEstoque  quantidadeEstoque,
      p_quantidadeReservas quantidadeReservas,
      p_situacaoLiberacao  situacaoLiberacao,
      p_usuarioLiberacao   usuarioLiberacao,
      p_dataLiberacao      dataLiberacao,
      p_observacoes        observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.preDocumento       = b.preDocumento,
    a.sequencia          = b.sequencia,
    a.dataBloqueio       = b.dataBloqueio,
    a.estabelecimento    = b.estabelecimento,
    a.localEstoque       = b.localEstoque,
    a.pessoaParticipante = b.pessoaParticipante,
    a.gradeProduto       = b.gradeProduto,
    a.personalizacao     = b.personalizacao,
    a.idLoteEstoque      = b.idLoteEstoque,
    a.idNumeroSerie      = b.idNumeroSerie,
    a.quantidade         = b.quantidade,
    a.quantidadeEstoque  = b.quantidadeEstoque,
    a.quantidadeReservas = b.quantidadeReservas,
    a.situacaoLiberacao  = b.situacaoLiberacao,
    a.usuarioLiberacao   = b.usuarioLiberacao,
    a.dataLiberacao      = b.dataLiberacao,
    a.observacoes        = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    preDocumento,
    sequencia,
    dataBloqueio,
    estabelecimento,
    localEstoque,
    pessoaParticipante,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    quantidadeEstoque,
    quantidadeReservas,
    situacaoLiberacao,
    usuarioLiberacao,
    dataLiberacao,
    observacoes)
  VALUES (
    b.id,
    b.preDocumento,
    b.sequencia,
    b.dataBloqueio,
    b.estabelecimento,
    b.localEstoque,
    b.pessoaParticipante,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidade,
    b.quantidadeEstoque,
    b.quantidadeReservas,
    b.situacaoLiberacao,
    b.usuarioLiberacao,
    b.dataLiberacao,
    b.observacoes);
END ADD_PRE_DOC_ITEM_BLOEST_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_BLOEST_GRAVA (
  p_estabelecimentoAtivo IN NUMBER,
  p_id                   IN NUMBER,
  p_idDocumentoFiscal    IN NUMERIC,
  p_sequencia            IN NUMERIC,
  p_dataBloqueio         IN DATE,
  p_estabelecimento      IN NUMERIC,
  p_localEstoque         IN NUMERIC,
  p_pessoaParticipante   IN NUMERIC,
  p_gradeProduto         IN NUMERIC,
  p_personalizacao       IN NUMERIC,
  p_idLoteEstoque        IN NUMERIC,
  p_idNumeroSerie        IN NUMERIC,
  p_quantidade           IN NUMERIC,
  p_quantidadeEstoque    IN NUMERIC,
  p_quantidadeReservas   IN NUMERIC,
  p_situacaoLiberacao    IN CHAR,
  p_usuarioLiberacao     IN NUMERIC,
  p_dataLiberacao        IN DATE,
  p_observacoes          IN VARCHAR,
  /* Retornos */
  r_id                   OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXBLOQUEIOSEST', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MODOCFISCALXBLOQUEIOSEST a 
  USING (
    SELECT
      r_id                 id,
      p_idDocumentoFiscal  idDocumentoFiscal,
      p_sequencia          sequencia,
      p_dataBloqueio       dataBloqueio,
      p_estabelecimento    estabelecimento,
      p_localEstoque       localEstoque,
      p_pessoaParticipante pessoaParticipante,
      p_gradeProduto       gradeProduto,
      p_personalizacao     personalizacao,
      p_idLoteEstoque      idLoteEstoque,
      p_idNumeroSerie      idNumeroSerie,
      p_quantidade         quantidade,
      p_quantidadeEstoque  quantidadeEstoque,
      p_quantidadeReservas quantidadeReservas,
      p_situacaoLiberacao  situacaoLiberacao,
      p_usuarioLiberacao   usuarioLiberacao,
      p_dataLiberacao      dataLiberacao,
      p_observacoes        observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idDocumentoFiscal  = b.idDocumentoFiscal,
    a.sequencia          = b.sequencia,
    a.dataBloqueio       = b.dataBloqueio,
    a.estabelecimento    = b.estabelecimento,
    a.localEstoque       = b.localEstoque,
    a.pessoaParticipante = b.pessoaParticipante,
    a.gradeProduto       = b.gradeProduto,
    a.personalizacao     = b.personalizacao,
    a.idLoteEstoque      = b.idLoteEstoque,
    a.idNumeroSerie      = b.idNumeroSerie,
    a.quantidade         = b.quantidade,
    a.quantidadeEstoque  = b.quantidadeEstoque,
    a.quantidadeReservas = b.quantidadeReservas,
    a.situacaoLiberacao  = b.situacaoLiberacao,
    a.usuarioLiberacao   = b.usuarioLiberacao,
    a.dataLiberacao      = b.dataLiberacao,
    a.observacoes        = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idDocumentoFiscal,
    sequencia,
    dataBloqueio,
    estabelecimento,
    localEstoque,
    pessoaParticipante,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    quantidadeEstoque,
    quantidadeReservas,
    situacaoLiberacao,
    usuarioLiberacao,
    dataLiberacao,
    observacoes)
  VALUES (
    b.id,
    b.idDocumentoFiscal,
    b.sequencia,
    b.dataBloqueio,
    b.estabelecimento,
    b.localEstoque,
    b.pessoaParticipante,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidade,
    b.quantidadeEstoque,
    b.quantidadeReservas,
    b.situacaoLiberacao,
    b.usuarioLiberacao,
    b.dataLiberacao,
    b.observacoes);
END ADD_DOC_FISC_ITEM_BLOEST_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_BLOEST_ORC (
  p_estabelecimentoAtivo IN NUMBER,
  p_orcamentoDe          IN NUMBER,
  p_sequenciaDe          IN NUMBER,
  p_preDocumentolPara    IN NUMBER,
  p_sequenciaPara        IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes
    FROM MOORCAMENTOXBLOQUEIOSEST
    WHERE orcamento = p_orcamentoDe
    AND sequencia = p_sequenciaDe)
  LOOP
    ADD_PRE_DOC_ITEM_BLOEST_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_preDocumentolPara,
      p_sequenciaPara,
      a.dataBloqueio,
      a.estabelecimento,
      a.localEstoque,
      a.pessoaParticipante,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie,
      a.quantidade,
      a.quantidadeEstoque,
      a.quantidadeReservas,
      a.situacaoLiberacao,
      a.usuarioLiberacao,
      a.dataLiberacao,
      a.observacoes,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_BLOEST_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_BLOEST_PRE (
  p_estabelecimentoAtivo IN NUMBER,
  p_preDocumentoDe       IN NUMBER,
  p_sequenciaDe          IN NUMBER,
  p_preDocumentolPara    IN NUMBER,
  p_sequenciaPara        IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes
    FROM MOPREDOCUMXBLOQUEIOSEST
    WHERE preDocumento = p_preDocumentoDe
    AND sequencia = p_sequenciaDe)
  LOOP
    ADD_PRE_DOC_ITEM_BLOEST_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_preDocumentolPara,
      p_sequenciaPara,
      a.dataBloqueio,
      a.estabelecimento,
      a.localEstoque,
      a.pessoaParticipante,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie,
      a.quantidade,
      a.quantidadeEstoque,
      a.quantidadeReservas,
      a.situacaoLiberacao,
      a.usuarioLiberacao,
      a.dataLiberacao,
      a.observacoes,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_BLOEST_PRE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_BLOEST_DOC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idDocumentoFiscalDe  IN NUMBER,
  p_sequenciaDe          IN NUMBER,
  p_preDocumentolPara    IN NUMBER,
  p_sequenciaPara        IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes
    FROM MODOCFISCALXBLOQUEIOSEST
    WHERE idDocumentoFiscal = p_idDocumentoFiscalDe
    AND sequencia = p_sequenciaDe)
  LOOP
    ADD_PRE_DOC_ITEM_BLOEST_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_preDocumentolPara,
      p_sequenciaPara,
      a.dataBloqueio,
      a.estabelecimento,
      a.localEstoque,
      a.pessoaParticipante,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie,
      a.quantidade,
      a.quantidadeEstoque,
      a.quantidadeReservas,
      a.situacaoLiberacao,
      a.usuarioLiberacao,
      a.dataLiberacao,
      a.observacoes,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_PRE_DOC_ITEM_BLOEST_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_BLOEST_ORC (
  p_estabelecimentoAtivo  IN NUMBER,
  p_orcamentoDe           IN NUMBER,
  p_sequenciaDe           IN NUMBER,
  p_idDocumentoFiscalPara IN NUMBER,
  p_sequenciaPara         IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes
    FROM MOORCAMENTOXBLOQUEIOSEST
    WHERE orcamento = p_orcamentoDe
    AND sequencia = p_sequenciaDe)
  LOOP
    ADD_DOC_FISC_ITEM_BLOEST_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idDocumentoFiscalPara,
      p_sequenciaPara,
      a.dataBloqueio,
      a.estabelecimento,
      a.localEstoque,
      a.pessoaParticipante,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie,
      a.quantidade,
      a.quantidadeEstoque,
      a.quantidadeReservas,
      a.situacaoLiberacao,
      a.usuarioLiberacao,
      a.dataLiberacao,
      a.observacoes,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_BLOEST_ORC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_BLOEST_PRE (
  p_estabelecimentoAtivo  IN NUMBER,
  p_preDocumentoDe        IN NUMBER,
  p_sequenciaDe           IN NUMBER,
  p_idDocumentoFiscalPara IN NUMBER,
  p_sequenciaPara         IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes
    FROM MOPREDOCUMXBLOQUEIOSEST
    WHERE preDocumento = p_preDocumentoDe
    AND sequencia = p_sequenciaDe)
  LOOP
    ADD_DOC_FISC_ITEM_BLOEST_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idDocumentoFiscalPara,
      p_sequenciaPara,
      a.dataBloqueio,
      a.estabelecimento,
      a.localEstoque,
      a.pessoaParticipante,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie,
      a.quantidade,
      a.quantidadeEstoque,
      a.quantidadeReservas,
      a.situacaoLiberacao,
      a.usuarioLiberacao,
      a.dataLiberacao,
      a.observacoes,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_BLOEST_PRE;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_BLOEST_DOC (
  p_estabelecimentoAtivo  IN NUMBER,
  p_idDocumentoFiscalDe   IN NUMBER,
  p_sequenciaDe           IN NUMBER,
  p_idDocumentoFiscalPara IN NUMBER,
  p_sequenciaPara         IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes
    FROM MODOCFISCALXBLOQUEIOSEST
    WHERE idDocumentoFiscal = p_idDocumentoFiscalDe
    AND sequencia = p_sequenciaDe)
  LOOP
    ADD_DOC_FISC_ITEM_BLOEST_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idDocumentoFiscalPara,
      p_sequenciaPara,
      a.dataBloqueio,
      a.estabelecimento,
      a.localEstoque,
      a.pessoaParticipante,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.idNumeroSerie,
      a.quantidade,
      a.quantidadeEstoque,
      a.quantidadeReservas,
      a.situacaoLiberacao,
      a.usuarioLiberacao,
      a.dataLiberacao,
      a.observacoes,
      /* Retornos */
      v_auxNumber);
  END LOOP;
END ADD_DOC_FISC_ITEM_BLOEST_DOC;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_RESIDUO (
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorProdutos            IN NUMBER,
  p_cab_valorServicos            IN NUMBER,
  p_cab_valorBasePagamento       IN NUMBER,
  p_cab_valorAVistaMinimo        IN NUMBER,
  p_cab_valorFreteTotal          IN NUMBER,
  p_cab_valorSeguroTotal         IN NUMBER,
  p_cab_valorDescontoTotal       IN NUMBER,
  p_cab_valorOutrasDespesasTotal IN NUMBER,
  p_cab_valorAdicFreteMarinTotal IN NUMBER,
  p_cab_valorDespesasAduanTotal  IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorLiquidoItem         IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_saldoRatFreteGeral           IN NUMBER,
  p_saldoRatSeguroGeral          IN NUMBER,
  p_saldoRatDescontoGeral        IN NUMBER,
  p_saldoRatOutrasDespesasGeral  IN NUMBER,
  p_saldoRatAdicFreteMarinGeral  IN NUMBER,
  p_saldoRatDespesasAduanGeral   IN NUMBER,
  p_saldoRatDescontoPagamento    IN NUMBER,
  p_saldoRatOutrasDespPagamento  IN NUMBER,
  p_saldoRatJurosPagamento       IN NUMBER,
  p_calcularImpostosItem         IN NUMBER,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
BEGIN
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorFreteTotal          := p_cab_valorFreteTotal;
  r_cab_valorSeguroTotal         := p_cab_valorSeguroTotal;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespesasTotal := p_cab_valorOutrasDespesasTotal;
  r_cab_valorAdicFreteMarinTotal := p_cab_valorAdicFreteMarinTotal;
  r_cab_valorDespesasAduanTotal  := p_cab_valorDespesasAduanTotal;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_calcularImpostosItem         := p_calcularImpostosItem;
  FOR a IN (
    SELECT
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorLiquidoItem,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      prod.tipoProduto,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOORCAMENTOXITENS a
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idItemOrcamento = p_item_idItemOrcamento)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorFreteGeral              := a.valorFreteGeral;
    v_valorSeguroGeral             := a.valorSeguroGeral;
    v_valorDescontoGeral           := a.valorDescontoGeral;
    v_valorOutrasDespesasGeral     := a.valorOutrasDespesasGeral;
    v_valorAdicFreteMarinMerGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_valorDespesasAduaneirasGeral := a.valorDespesasAduaneirasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := a.valorDescontoPagamento;
    v_valorOutrasDespesasPagamento := a.valorOutrasDespesasPagamento;
    v_valorJurosPagamento          := a.valorJurosPagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos          := r_cab_valorServicos - v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos          := r_cab_valorProdutos - v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento - v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal - v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal - v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal - v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem - v_valorLiquidoItem;
    v_valorFreteGeral              := v_valorFreteGeral + p_saldoRatFreteGeral;
    v_valorSeguroGeral             := v_valorSeguroGeral + p_saldoRatSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + p_saldoRatAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_saldoRatDespesasAduanGeral;
    v_valorDescontoGeral           := v_valorDescontoGeral + p_saldoRatDescontoGeral;
    v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + p_saldoRatOutrasDespesasGeral;
    v_valorDescontoPagamento       := v_valorDescontoPagamento + p_saldoRatDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_saldoRatOutrasDespPagamento;
    v_valorJurosPagamento          := v_valorJurosPagamento + p_saldoRatJurosPagamento;
    ADD_CALCULA_TOTAIS_ITEM (
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = p_item_idItemOrcamento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos          := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos          := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1
      AND a.geraFinanceiro = 1
    THEN
      r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_RESIDUO;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_RATEIO (
  p_cab_orcamento                IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorFreteGeral          IN NUMBER,
  p_cab_valorSeguroGeral         IN NUMBER,
  p_cab_valorDescontoGeral       IN NUMBER,
  p_cab_valorOutrasDespesasGeral IN NUMBER,
  p_cab_valorAdicFreteMarinGeral IN NUMBER,
  p_cab_valorDespesasAduanGeral  IN NUMBER,
  p_cab_valorDescontoPagamento   IN NUMBER,
  p_cab_valorOutrasDespPagamento IN NUMBER,
  p_cab_valorJurosPagamento      IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_idItemOrcamentoUltimoItem    NUMBER;
  v_idItemOrcamentoRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
BEGIN
  v_idItemOrcamentoUltimoItem    := 0;
  v_idItemOrcamentoRateioFrete   := 0;
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;

  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MOORCAMENTOXITENS a
    JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = a.idItemOrcamento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;

  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MOORCAMENTOXITENS a
    JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = a.idItemOrcamento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

  -- v_rateioDescontofiltrarSemProm
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN EXISTS(
          SELECT 1
          FROM MOORCAMENTOXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0
          AND COALESCE((
            SELECT SUM(b.valorDesconto)
            FROM MOORCAMENTOXPROMOCOES b
            WHERE b.idItemOrcamento = a.idItemOrcamento
            AND b.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem))
        THEN 0
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOORCAMENTOXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          JOIN MOORCAMENTOXPROMOCOES b
          ON b.idItemOrcamento = a.idItemOrcamento
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOORCAMENTOXITENS a
            WHERE a.orcamento = p_cab_orcamento
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MOORCAMENTOXPROMOCOES b
              WHERE b.idItemOrcamento = a.idItemOrcamento)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
  END IF;

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOORCAMENTOXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MOORCAMENTOXPROMOCOES promo
              WHERE promo.idItemOrcamento = a.idItemOrcamento)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOORCAMENTOXITENS a
            WHERE a.orcamento = p_cab_orcamento
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = a.idItemOrcamento))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;

  -- Bases Rateio
  SELECT
    COALESCE(MAX(CASE WHEN modDoc.habilitaControleEntrega = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN 1 ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN modDoc.habilitaControleEntrega = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseFreteSemFinSemEntr,
    v_valorBaseFreteComFinSemEntr,
    v_valorBaseFreteSemFinComEntr,
    v_valorBaseFreteComFinComEntr,
    v_valorBaseRateio,
    v_valorBaseRateioComEntrega,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioOutrasDespGer,
    v_valorBaseRateioOutrasDespFin,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MOORCAMENTOXITENS a
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = a.modeloDocumento
  JOIN PACONTROLESENTREGA contr
  ON contr.controleEntrega = a.controleEntrega
  WHERE a.orcamento = p_cab_orcamento
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorLiquidoItem,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      prod.tipoProduto,
      CASE WHEN modDoc.habilitaControleEntrega = 0 OR contr.habilitaFrete = 1 THEN 1 ELSE 0 END rateioFrete,
      CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
      CASE WHEN EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento) THEN 1 ELSE 0 END promocao,
      COALESCE((SELECT SUM(promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
      COALESCE((SELECT SUM(promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
      CASE WHEN EXISTS (SELECT 1 FROM CAPRODUTOXCOMPOSICOESPREC compPrec WHERE compPrec.produto = gradProd.produto AND compPrec.ativo = 1) THEN 1 ELSE 0 END composicaoPreco
    FROM MOORCAMENTOXITENS a
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contr
    ON contr.controleEntrega = a.controleEntrega
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_idItemOrcamentoUltimoItem    := a.idItemOrcamento;
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorDescontoGeral           := v_residuoDescontoGeral;
    v_valorFreteGeral              := v_residuoFreteGeral;
    v_valorSeguroGeral             := v_residuoSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
    v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := v_residuoDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
    v_valorJurosPagamento          := v_residuoJurosPagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_valorLiquidoItem             := a.valorLiquidoItem;

    -- v_valorDescontoGeral
    IF v_valorBaseRateioDescontoGeral > 0
      AND (v_rateioDescontofiltrarAPrazo = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
    THEN
      v_valorDescontoGeral := v_valorDescontoGeral + (p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
    END IF;
    IF p_cab_valorDescontoGeral           > 0
      AND v_valorDescontoPromocaoGeral    > 0
      AND a.valorDescontoPromocaoGeral > 0
    THEN
      IF p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral;
      ELSE
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral   := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
      v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;

    -- v_valorFreteGeral / v_valorSeguroGeral
    IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 THEN
      IF a.rateioFrete = 1 AND a.geraFinanceiro = 1 THEN
        v_idItemOrcamentoRateioFrete := a.idItemOrcamento;
        v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      END IF;
    ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 THEN
      IF a.rateioFrete = 1 AND a.modDoc_geraFinanceiro = 1 THEN
        v_idItemOrcamentoRateioFrete := a.idItemOrcamento;
        v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      END IF;
    ELSIF v_valorBaseRateioComEntrega > 0 AND v_rateioFretePorControleEntr = 1 THEN
      IF a.rateioFrete = 1 THEN
        v_idItemOrcamentoRateioFrete := a.idItemOrcamento;
        v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      END IF;
    ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 THEN
      IF a.geraFinanceiro = 1 THEN
        v_idItemOrcamentoRateioFrete := a.idItemOrcamento;
        v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      END IF;
    ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 THEN
      IF a.modDoc_geraFinanceiro = 1 THEN
        v_idItemOrcamentoRateioFrete := a.idItemOrcamento;
        v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      END IF;
    ELSIF v_valorBaseRateio > 0 THEN
      v_idItemOrcamentoRateioFrete := a.idItemOrcamento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorFreteGeral, 2) >= v_saldoRatFreteGeral THEN
      v_valorFreteGeral := v_saldoRatFreteGeral;
      v_residuoFreteGeral := 0;
    ELSE
      v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral, 2);
      v_valorFreteGeral := ROUND (v_valorFreteGeral, 2);
    END IF;
    v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
    IF ROUND (v_valorSeguroGeral, 2) >= v_saldoRatSeguroGeral THEN
      v_valorSeguroGeral   := v_saldoRatSeguroGeral;
      v_residuoSeguroGeral := 0;
    ELSE
      v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral, 2);
      v_valorSeguroGeral   := ROUND (v_valorSeguroGeral, 2);
    END IF;
    v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;

    -- v_valorAdicFreteMarinMerGeral / v_valorDespesasAduaneirasGeral
    IF v_valorBaseRateioFinanceiro > 0 AND a.geraFinanceiro = 1 THEN 
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
    ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
      v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
      v_residuoAdicFreteMarinGeral  := 0;
    ELSE
      v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
      v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
    END IF;
    v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
    IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
      v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
      v_residuoDespesasAduanGeral    := 0;
    ELSE
      v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
      v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
    END IF;
    v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;

    -- v_valorOutrasDespesasGeral
    IF v_valorBaseRateioOutrasDespFin > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
    ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
    END IF;
    IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
      v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
      v_residuoOutrasDespesasGeral := 0;
    ELSE
      v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
      v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
    END IF;
    v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;

    -- v_valorDescontoPagamento
    IF p_cab_valorDescontoPagamento       > 0
      AND v_valorBaseRateioPagamFinDesc   > 0
      AND a.geraFinanceiro = 1
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
    ELSIF p_cab_valorDescontoPagamento    > 0
      AND v_valorBaseRateioPagamDesconto  > 0
      AND v_valorBaseRateioPagamFinDesc  <= 0
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
    END IF;
    IF p_cab_valorDescontoPagamento > 0
      AND v_valorDescontoPromocaoPagamen > 0
      AND a.valorDescontoPromocaoPagamento > 0
    THEN
      IF p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
      ELSE
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
      v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
    END IF;
    v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;

    -- v_valorOutrasDespesasPagamento / v_valorJurosPagamento
    IF v_valorBaseRateioPagamFinanc > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
    ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 OR a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
    END IF;
    IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
      v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
      v_residuoOutrasDespPagamento   := 0;
    ELSE
      v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
      v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
    END IF;
    v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
    IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
      v_valorJurosPagamento   := v_saldoRatJurosPagamento;
      v_residuoJurosPagamento := 0;
    ELSE
      v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
      v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
    END IF;
    v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;

    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM (
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    -- Atualiza Item
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = a.idItemOrcamento;
    -- Totaliza cabeçalho
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
  -- Se sobrou resíduo atualiza último item
  IF v_idItemOrcamentoUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_ORCAMENTO_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_origemDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorLiquidoItem,
      CASE WHEN v_idItemOrcamentoRateioFrete = 0 THEN v_idItemOrcamentoUltimoItem ELSE v_idItemOrcamentoRateioFrete END,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorLiquidoItem,
      r_calcularImpostosItem);
  END IF;
END ADD_ORCAMENTO_CALC_IMP_RATEIO;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          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,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      0,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      0,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = a.idItemOrcamento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_calcularImpostosItem         NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        ),'  ') munEndEst_uf
    FROM MOORCAMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.orcamento = p_cab_orcamento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    ADD_ORCAMENTO_CALC_IMP_RATEIO (
      a.orcamento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.modeloDocumento,
      a.entradaSaida,
      a.atualizaCustoMedio,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_ORCAMENTO_CALC_IMP_ITENS (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.orcamento,
        a.origemDocumento,
        a.entradaSaida,
        a.estabelecimento,
        a.dataEmissao,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem);
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento                 = a.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RESIDUO (
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorProdutos            IN NUMBER,
  p_cab_valorServicos            IN NUMBER,
  p_cab_valorBasePagamento       IN NUMBER,
  p_cab_valorAVistaMinimo        IN NUMBER,
  p_cab_valorFreteTotal          IN NUMBER,
  p_cab_valorSeguroTotal         IN NUMBER,
  p_cab_valorDescontoTotal       IN NUMBER,
  p_cab_valorOutrasDespesasTotal IN NUMBER,
  p_cab_valorAdicFreteMarinTotal IN NUMBER,
  p_cab_valorDespesasAduanTotal  IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorLiquidoItem         IN NUMBER,
  p_cab_valorDescCustoOpTotal    IN NUMBER,
  p_cab_valorAcrescCustoOpTotal  IN NUMBER,
  p_cab_valorCustoOperacao       IN NUMBER,
  p_cab_valorCMV                 IN NUMBER,
  p_cab_valorAcrescExtempTotal   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_saldoRatFreteGeral           IN NUMBER,
  p_saldoRatSeguroGeral          IN NUMBER,
  p_saldoRatDescontoGeral        IN NUMBER,
  p_saldoRatOutrasDespesasGeral  IN NUMBER,
  p_saldoRatAdicFreteMarinGeral  IN NUMBER,
  p_saldoRatDespesasAduanGeral   IN NUMBER,
  p_saldoRatDescontoPagamento    IN NUMBER,
  p_saldoRatOutrasDespPagamento  IN NUMBER,
  p_saldoRatJurosPagamento       IN NUMBER,
  p_saldoRatDescCustoOpGeral     IN NUMBER,
  p_saldoRatAcrescCustoOpGeral   IN NUMBER,
  p_saldoRatAcrescExtempGeral    IN NUMBER,
  p_calcularImpostosItem         IN NUMBER,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_valorBaseRateio              NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_calculoImpostosPendenteItem  NUMBER;
BEGIN
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorFreteTotal          := p_cab_valorFreteTotal;
  r_cab_valorSeguroTotal         := p_cab_valorSeguroTotal;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespesasTotal := p_cab_valorOutrasDespesasTotal;
  r_cab_valorAdicFreteMarinTotal := p_cab_valorAdicFreteMarinTotal;
  r_cab_valorDespesasAduanTotal  := p_cab_valorDespesasAduanTotal;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_cab_valorDescCustoOpTotal    := p_cab_valorDescCustoOpTotal;
  r_cab_valorAcrescCustoOpTotal  := p_cab_valorAcrescCustoOpTotal;
  r_cab_valorCustoOperacao       := p_cab_valorCustoOperacao;
  r_cab_valorCMV                 := p_cab_valorCMV;
  r_cab_valorAcrescExtempTotal   := p_cab_valorAcrescExtempTotal;
  r_calcularImpostosItem         := p_calcularImpostosItem;
  FOR a IN (
    SELECT
      a.modeloDocumento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      prod.tipoProduto,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOPREDOCUMXITENS a
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idItemPreDocumento = p_item_idItemPreDocumento
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorFreteGeral              := a.valorFreteGeral;
    v_valorSeguroGeral             := a.valorSeguroGeral;
    v_valorDescontoGeral           := a.valorDescontoGeral;
    v_valorOutrasDespesasGeral     := a.valorOutrasDespesasGeral;
    v_valorAdicFreteMarinMerGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_valorDespesasAduaneirasGeral := a.valorDespesasAduaneirasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := a.valorDescontoPagamento;
    v_valorOutrasDespesasPagamento := a.valorOutrasDespesasPagamento;
    v_valorJurosPagamento          := a.valorJurosPagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpGeral    := a.valorDescontoCustoOpGeral;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempGeral    := a.valorAcrescimoExtempGeral;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos - v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos - v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento - v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal - v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal - v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal - v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem - v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao - v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV - v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
    v_valorFreteGeral              := v_valorFreteGeral + p_saldoRatFreteGeral;
    v_valorSeguroGeral             := v_valorSeguroGeral + p_saldoRatSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + p_saldoRatAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_saldoRatDespesasAduanGeral;
    v_valorDescontoGeral           := v_valorDescontoGeral + p_saldoRatDescontoGeral;
    v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + p_saldoRatOutrasDespesasGeral;
    v_valorDescontoPagamento       := v_valorDescontoPagamento + p_saldoRatDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_saldoRatOutrasDespPagamento;
    v_valorJurosPagamento          := v_valorJurosPagamento + p_saldoRatJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + p_saldoRatDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + p_saldoRatAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + p_saldoRatAcrescExtempGeral;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      0,
      a.modeloDocumento,
      a.quantidade,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      0,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = p_item_idItemPreDocumento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos          := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos          := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_RESIDUO;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RATEIO (
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorFreteGeral          IN NUMBER,
  p_cab_valorSeguroGeral         IN NUMBER,
  p_cab_valorDescontoGeral       IN NUMBER,
  p_cab_valorOutrasDespesasGeral IN NUMBER,
  p_cab_valorAdicFreteMarinGeral IN NUMBER,
  p_cab_valorDespesasAduanGeral  IN NUMBER,
  p_cab_valorDescontoPagamento   IN NUMBER,
  p_cab_valorOutrasDespPagamento IN NUMBER,
  p_cab_valorJurosPagamento      IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorDescCustoOpGeral    IN NUMBER,
  p_cab_valorAcrescCustoOpGeral  IN NUMBER,
  p_cab_valorAcrescExtempGeral   IN NUMBER,
  p_habilitaControleEntrega      IN NUMBER,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemPreDocUltimoItem       NUMBER;
  v_idItemPreDocRateioFrete      NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_calculoImpostosPendenteItem  NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemPreDocUltimoItem       := 0;
  v_idItemPreDocRateioFrete      := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;

  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo
    ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;

  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo
    ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

  -- v_rateioDescontofiltrarSemProm
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN EXISTS(
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0
          AND COALESCE((
            SELECT SUM(b.valorDesconto)
            FROM MOPREDOCUMXPROMOCOES b
            WHERE b.idItemPreDocumento = a.idItemPreDocumento
            AND b.cabecalhoItemPagamento IN ('C','P')),0) > ( CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END
            - a.valorDescontoItem + a.valorAcrescimoItem))
        THEN 0
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          JOIN MOPREDOCUMXPROMOCOES b
          ON b.idItemPreDocumento = a.idItemPreDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES b
              WHERE b.idItemPreDocumento = a.idItemPreDocumento)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
  END IF;

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES promo
              WHERE promo.idItemPreDocumento = a.idItemPreDocumento)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = a.idItemPreDocumento))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;

  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseFreteSemFinSemEntr,
    v_valorBaseFreteComFinSemEntr,
    v_valorBaseFreteSemFinComEntr,
    v_valorBaseFreteComFinComEntr,
    v_valorBaseRateio,
    v_valorBaseRateioComEntrega,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioOutrasDespGer,
    v_valorBaseRateioOutrasDespFin,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MOPREDOCUMXITENS a
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = a.modeloDocumento
  WHERE a.preDocumento = p_cab_preDocumento
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR a IN (
    SELECT
      a.idItemPreDocumento,
      a.modeloDocumento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      prod.tipoProduto,
      CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(
        SELECT 1
        FROM MOPREDOCUMXORCAMENTOITEM docXorc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
        JOIN PACONTROLESENTREGA contr
        ON contr.controleEntrega = itemOrc.controleEntrega
        WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento
        AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
      CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
      CASE WHEN EXISTS(
        SELECT 1
        FROM MOPREDOCUMXPROMOCOES promo
        WHERE promo.idItemPreDocumento = a.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MOPREDOCUMXPROMOCOES promo
        WHERE promo.idItemPreDocumento = a.idItemPreDocumento
        AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MOPREDOCUMXPROMOCOES promo
        WHERE promo.idItemPreDocumento = a.idItemPreDocumento
        AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOPREDOCUMXITENS a
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_idItemPreDocUltimoItem       := a.idItemPreDocumento;
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorDescontoGeral           := v_residuoDescontoGeral;
    v_valorFreteGeral              := v_residuoFreteGeral;
    v_valorSeguroGeral             := v_residuoSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
    v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := v_residuoDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
    v_valorJurosPagamento          := v_residuoJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;

    -- v_valorDescontoGeral
    IF v_valorBaseRateioDescontoGeral > 0
      AND (v_rateioDescontofiltrarAPrazo = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
    THEN
      v_valorDescontoGeral := v_valorDescontoGeral + (p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
    END IF;
    IF p_cab_valorDescontoGeral           > 0
      AND v_valorDescontoPromocaoGeral    > 0
      AND a.valorDescontoPromocaoGeral > 0
    THEN
      IF p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral;
      ELSE
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral   := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
      v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;

    -- v_valorFreteGeral
    -- v_valorSeguroGeral
    IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 AND a.geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
    ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 AND a.modDoc_geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
    ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
    ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND a.geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
    ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND a.modDoc_geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
    ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorFreteGeral,2) >= v_saldoRatFreteGeral THEN
      v_valorFreteGeral := v_saldoRatFreteGeral;
      v_residuoFreteGeral := 0;
    ELSE
      v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral,2);
      v_valorFreteGeral := ROUND (v_valorFreteGeral,2);
    END IF;
    v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
    IF ROUND (v_valorSeguroGeral,2) >= v_saldoRatSeguroGeral THEN
      v_valorSeguroGeral   := v_saldoRatSeguroGeral;
      v_residuoSeguroGeral := 0;
    ELSE
      v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral,2);
      v_valorSeguroGeral   := ROUND (v_valorSeguroGeral,2);
    END IF;
    v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;

    -- v_valorAdicFreteMarinMerGeral
    -- v_valorDespesasAduaneirasGeral
    -- v_valorDescontoCustoOpGeral
    -- v_valorAcrescimoCustoOpGeral
    -- v_valorAcrescimoExtempGeral
    IF v_valorBaseRateioFinanceiro > 0 AND a.geraFinanceiro = 1 THEN 
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
    ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
      v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
      v_residuoAdicFreteMarinGeral  := 0;
    ELSE
      v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
      v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
    END IF;
    v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
    IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
      v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
      v_residuoDespesasAduanGeral    := 0;
    ELSE
      v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
      v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
    END IF;
    v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
    IF ROUND (v_valorDescontoCustoOpGeral,2) >= v_saldoRatDescCustoOpGeral THEN
      v_valorDescontoCustoOpGeral := v_saldoRatDescCustoOpGeral;
      v_residuoDescCustoOpGeral   := 0;
    ELSE
      v_residuoDescCustoOpGeral   := v_valorDescontoCustoOpGeral - ROUND (v_valorDescontoCustoOpGeral,2);
      v_valorDescontoCustoOpGeral := ROUND (v_valorDescontoCustoOpGeral,2);
    END IF;
    v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
    IF ROUND (v_valorAcrescimoCustoOpGeral,2) >= v_saldoRatAcrescCustoOpGeral THEN
      v_valorAcrescimoCustoOpGeral := v_saldoRatAcrescCustoOpGeral;
      v_residuoAcrescCustoOpGeral  := 0;
    ELSE
      v_residuoAcrescCustoOpGeral  := v_valorAcrescimoCustoOpGeral - ROUND (v_valorAcrescimoCustoOpGeral,2);
      v_valorAcrescimoCustoOpGeral := ROUND (v_valorAcrescimoCustoOpGeral,2);
    END IF;
    v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
    IF ROUND (v_valorAcrescimoExtempGeral,2) >= v_saldoRatAcrescExtempGeral THEN
      v_valorAcrescimoExtempGeral := v_saldoRatAcrescExtempGeral;
      v_residuoAcrescExtempGeral  := 0;
    ELSE
      v_residuoAcrescExtempGeral  := v_valorAcrescimoExtempGeral - ROUND (v_valorAcrescimoExtempGeral,2);
      v_valorAcrescimoExtempGeral := ROUND (v_valorAcrescimoExtempGeral,2);
    END IF;
    v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;

    -- v_valorOutrasDespesasGeral
    IF v_valorBaseRateioOutrasDespFin > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
    ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
    END IF;
    IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
      v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
      v_residuoOutrasDespesasGeral := 0;
    ELSE
      v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
      v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
    END IF;
    v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;

    -- v_valorDescontoPagamento
    IF p_cab_valorDescontoPagamento       > 0
      AND v_valorBaseRateioPagamFinDesc   > 0
      AND a.geraFinanceiro = 1
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
    ELSIF p_cab_valorDescontoPagamento    > 0
      AND v_valorBaseRateioPagamDesconto  > 0
      AND v_valorBaseRateioPagamFinDesc  <= 0
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
    END IF;
    IF p_cab_valorDescontoPagamento           > 0
      AND v_valorDescontoPromocaoPagamen      > 0
      AND a.valorDescontoPromocaoPagamento > 0
    THEN
      IF p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
      ELSE
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
      v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
    END IF;
    v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;

    -- v_valorOutrasDespesasPagamento
    -- v_valorJurosPagamento
    IF v_valorBaseRateioPagamFinanc > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
    ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
    END IF;
    IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
      v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
      v_residuoOutrasDespPagamento   := 0;
    ELSE
      v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
      v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
    END IF;
    v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
    IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
      v_valorJurosPagamento   := v_saldoRatJurosPagamento;
      v_residuoJurosPagamento := 0;
    ELSE
      v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
      v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
    END IF;
    v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;

    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      0,
      a.modeloDocumento,
      a.quantidade,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      0,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);

    -- Atualiza Item
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = a.idItemPreDocumento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
  IF v_idItemPreDocUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_PRE_DOC_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_origemDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_PRE_DOC_CALC_IMP_RATEIO;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          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,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;  
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOPREDOCUMXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      a.valorIPIDevolucao,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      0,
      a.modeloDocumento,
      a.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      0,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = a.idItemPreDocumento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MOPREDOCUMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.preDocumento = p_cab_preDocumento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;    
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXORCAMENTOITEM docXorc
          ON docXorc.idItemPreDocumento = a.idItemPreDocumento
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.preDocumento = p_cab_preDocumento
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    ADD_PRE_DOC_CALC_IMP_RATEIO (
      a.preDocumento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_PRE_DOC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.preDocumento,
        a.origemDocumento,
        a.entradaSaida,
        a.devolucaoAnulacaoRetorno,
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.dataEntradaSaida,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE preDocumento              = a.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_RESIDUO (
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorProdutos            IN NUMBER,
  p_cab_valorServicos            IN NUMBER,
  p_cab_valorBasePagamento       IN NUMBER,
  p_cab_valorAVistaMinimo        IN NUMBER,
  p_cab_valorFreteTotal          IN NUMBER,
  p_cab_valorSeguroTotal         IN NUMBER,
  p_cab_valorDescontoTotal       IN NUMBER,
  p_cab_valorOutrasDespesasTotal IN NUMBER,
  p_cab_valorAdicFreteMarinTotal IN NUMBER,
  p_cab_valorDespesasAduanTotal  IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorLiquidoItem         IN NUMBER,
  p_cab_valorDescCustoOpTotal    IN NUMBER,
  p_cab_valorAcrescCustoOpTotal  IN NUMBER,
  p_cab_valorCustoOperacao       IN NUMBER,
  p_cab_valorCMV                 IN NUMBER,
  p_cab_valorAcrescExtempTotal   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_saldoRatFreteGeral           IN NUMBER,
  p_saldoRatSeguroGeral          IN NUMBER,
  p_saldoRatDescontoGeral        IN NUMBER,
  p_saldoRatOutrasDespesasGeral  IN NUMBER,
  p_saldoRatAdicFreteMarinGeral  IN NUMBER,
  p_saldoRatDespesasAduanGeral   IN NUMBER,
  p_saldoRatDescontoPagamento    IN NUMBER,
  p_saldoRatOutrasDespPagamento  IN NUMBER,
  p_saldoRatJurosPagamento       IN NUMBER,
  p_saldoRatDescCustoOpGeral     IN NUMBER,
  p_saldoRatAcrescCustoOpGeral   IN NUMBER,
  p_saldoRatAcrescExtempGeral    IN NUMBER,
  p_calcularImpostosItem         IN NUMBER,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER,
  r_calcularImpostosItem         OUT NUMBER)  
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_calculoImpostosPendenteItem  NUMBER;
BEGIN
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorFreteTotal          := p_cab_valorFreteTotal;
  r_cab_valorSeguroTotal         := p_cab_valorSeguroTotal;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespesasTotal := p_cab_valorOutrasDespesasTotal;
  r_cab_valorAdicFreteMarinTotal := p_cab_valorAdicFreteMarinTotal;
  r_cab_valorDespesasAduanTotal  := p_cab_valorDespesasAduanTotal;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_cab_valorDescCustoOpTotal    := p_cab_valorDescCustoOpTotal;
  r_cab_valorAcrescCustoOpTotal  := p_cab_valorAcrescCustoOpTotal;
  r_cab_valorCustoOperacao       := p_cab_valorCustoOperacao;
  r_cab_valorCMV                 := p_cab_valorCMV;
  r_cab_valorAcrescExtempTotal   := p_cab_valorAcrescExtempTotal;
  r_calcularImpostosItem         := p_calcularImpostosItem;
  FOR a IN (
    SELECT
      a.modeloDocumento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      prod.tipoProduto,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MODOCFISCALXITENS a
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idItemDocFiscal = p_item_idItemDocFiscal
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorFreteGeral              := a.valorFreteGeral;
    v_valorSeguroGeral             := a.valorSeguroGeral;
    v_valorDescontoGeral           := a.valorDescontoGeral;
    v_valorOutrasDespesasGeral     := a.valorOutrasDespesasGeral;
    v_valorAdicFreteMarinMerGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_valorDespesasAduaneirasGeral := a.valorDespesasAduaneirasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := a.valorDescontoPagamento;
    v_valorOutrasDespesasPagamento := a.valorOutrasDespesasPagamento;
    v_valorJurosPagamento          := a.valorJurosPagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpGeral    := a.valorDescontoCustoOpGeral;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempGeral    := a.valorAcrescimoExtempGeral;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;    
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos          := r_cab_valorServicos - v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos          := r_cab_valorProdutos - v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento - v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal - v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal - v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal - v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem - v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao - v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV - v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
    v_valorFreteGeral              := v_valorFreteGeral + p_saldoRatFreteGeral;
    v_valorSeguroGeral             := v_valorSeguroGeral + p_saldoRatSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + p_saldoRatAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_saldoRatDespesasAduanGeral;
    v_valorDescontoGeral           := v_valorDescontoGeral + p_saldoRatDescontoGeral;
    v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + p_saldoRatOutrasDespesasGeral;
    v_valorDescontoPagamento       := v_valorDescontoPagamento + p_saldoRatDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_saldoRatOutrasDespPagamento;
    v_valorJurosPagamento          := v_valorJurosPagamento + p_saldoRatJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + p_saldoRatDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + p_saldoRatAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + p_saldoRatAcrescExtempGeral;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST,
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      a.modeloDocumento,
      a.quantidade,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = p_item_idItemDocFiscal;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_RESIDUO;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_RATEIO (
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorFreteGeral          IN NUMBER,
  p_cab_valorSeguroGeral         IN NUMBER,
  p_cab_valorDescontoGeral       IN NUMBER,
  p_cab_valorOutrasDespesasGeral IN NUMBER,
  p_cab_valorAdicFreteMarinGeral IN NUMBER,
  p_cab_valorDespesasAduanGeral  IN NUMBER,
  p_cab_valorDescontoPagamento   IN NUMBER,
  p_cab_valorOutrasDespPagamento IN NUMBER,
  p_cab_valorJurosPagamento      IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorDescCustoOpGeral    IN NUMBER,
  p_cab_valorAcrescCustoOpGeral  IN NUMBER,
  p_cab_valorAcrescExtempGeral   IN NUMBER,
  p_habilitaControleEntrega      IN NUMBER,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemDocFiscalUltimoItem    NUMBER;
  v_idItemDocFiscalRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_calculoImpostosPendenteItem  NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemDocFiscalUltimoItem    := 0;
  v_idItemDocFiscalRateioFrete   := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;
  
  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo
    ON promo.idItemDocFiscal = a.idItemDocFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;
  
  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo
    ON promo.idItemDocFiscal = a.idItemDocFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

  -- v_rateioDescontofiltrarSemProm
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN EXISTS(
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0
          AND COALESCE((
            SELECT SUM(b.valorDesconto)
            FROM MODOCFISCALXPROMOCOES b
            WHERE b.idItemDocFiscal = a.idItemDocFiscal
            AND b.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END
            - a.valorDescontoItem + a.valorAcrescimoItem))
        THEN 0
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MODOCFISCALXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          JOIN MODOCFISCALXPROMOCOES b
          ON b.idItemDocFiscal = a.idItemDocFiscal
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS a
            WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MODOCFISCALXPROMOCOES b
              WHERE b.idItemDocFiscal = a.idItemDocFiscal)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
  END IF;

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MODOCFISCALXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MODOCFISCALXPROMOCOES promo
              WHERE promo.idItemDocFiscal = a.idItemDocFiscal)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS a
            WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = a.idItemDocFiscal))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;
  
  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN a.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseFreteSemFinSemEntr,
    v_valorBaseFreteComFinSemEntr,
    v_valorBaseFreteSemFinComEntr,
    v_valorBaseFreteComFinComEntr,
    v_valorBaseRateio,
    v_valorBaseRateioComEntrega,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioOutrasDespGer,
    v_valorBaseRateioOutrasDespFin,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MODOCFISCALXITENS a
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = a.modeloDocumento
  WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR a IN (
    SELECT
      a.idItemDocFiscal,
      a.modeloDocumento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      prod.tipoProduto,
      CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(
        SELECT 1
        FROM MODOCFISCALXORCAMENTOITEM docXorc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
        JOIN PACONTROLESENTREGA contr
        ON contr.controleEntrega = itemOrc.controleEntrega
        WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal
        AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
      CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
      CASE WHEN EXISTS(
        SELECT 1
        FROM MODOCFISCALXPROMOCOES promo
        WHERE promo.idItemDocFiscal = a.idItemDocFiscal) THEN 1 ELSE 0 END promocao,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MODOCFISCALXPROMOCOES promo
        WHERE promo.idItemDocFiscal = a.idItemDocFiscal
        AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MODOCFISCALXPROMOCOES promo
        WHERE promo.idItemDocFiscal = a.idItemDocFiscal
        AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MODOCFISCALXITENS a
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_idItemDocFiscalUltimoItem    := a.idItemDocFiscal;
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorDescontoGeral           := v_residuoDescontoGeral;
    v_valorFreteGeral              := v_residuoFreteGeral;
    v_valorSeguroGeral             := v_residuoSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
    v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := v_residuoDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
    v_valorJurosPagamento          := v_residuoJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;

    -- v_valorDescontoGeral
    IF v_valorBaseRateioDescontoGeral > 0
      AND (v_rateioDescontofiltrarAPrazo = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
    THEN
      v_valorDescontoGeral := v_valorDescontoGeral + (p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
    END IF;
    IF p_cab_valorDescontoGeral        > 0
      AND v_valorDescontoPromocaoGeral > 0
      AND a.valorDescontoPromocaoGeral > 0
    THEN
      IF p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral;
      ELSE
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral   := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
      v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;

    -- v_valorFreteGeral
    -- v_valorSeguroGeral
    IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 AND a.geraFinanceiro = 1 THEN
      v_idItemDocFiscalRateioFrete := a.idItemDocFiscal;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
    ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 AND a.modDoc_geraFinanceiro = 1 THEN
      v_idItemDocFiscalRateioFrete := a.idItemDocFiscal;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
    ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 THEN
      v_idItemDocFiscalRateioFrete := a.idItemDocFiscal;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
    ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND a.geraFinanceiro = 1 THEN
      v_idItemDocFiscalRateioFrete := a.idItemDocFiscal;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
    ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND a.modDoc_geraFinanceiro = 1 THEN
      v_idItemDocFiscalRateioFrete := a.idItemDocFiscal;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
    ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
      v_idItemDocFiscalRateioFrete := a.idItemDocFiscal;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorFreteGeral,2) >= v_saldoRatFreteGeral THEN
      v_valorFreteGeral := v_saldoRatFreteGeral;
      v_residuoFreteGeral := 0;
    ELSE
      v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral,2);
      v_valorFreteGeral := ROUND (v_valorFreteGeral,2);
    END IF;
    v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
    IF ROUND (v_valorSeguroGeral,2) >= v_saldoRatSeguroGeral THEN
      v_valorSeguroGeral   := v_saldoRatSeguroGeral;
      v_residuoSeguroGeral := 0;
    ELSE
      v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral,2);
      v_valorSeguroGeral   := ROUND (v_valorSeguroGeral,2);
    END IF;
    v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;

    -- v_valorAdicFreteMarinMerGeral
    -- v_valorDespesasAduaneirasGeral
    -- v_valorDescontoCustoOpGeral
    -- v_valorAcrescimoCustoOpGeral
    -- v_valorAcrescimoExtempGeral
    IF v_valorBaseRateioFinanceiro > 0 AND a.geraFinanceiro = 1 THEN 
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
    ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
      v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
      v_residuoAdicFreteMarinGeral  := 0;
    ELSE
      v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
      v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
    END IF;
    v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
    IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
      v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
      v_residuoDespesasAduanGeral    := 0;
    ELSE
      v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
      v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
    END IF;
    v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
    IF ROUND (v_valorDescontoCustoOpGeral,2) >= v_saldoRatDescCustoOpGeral THEN
      v_valorDescontoCustoOpGeral := v_saldoRatDescCustoOpGeral;
      v_residuoDescCustoOpGeral   := 0;
    ELSE
      v_residuoDescCustoOpGeral   := v_valorDescontoCustoOpGeral - ROUND (v_valorDescontoCustoOpGeral,2);
      v_valorDescontoCustoOpGeral := ROUND (v_valorDescontoCustoOpGeral,2);
    END IF;
    v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
    IF ROUND (v_valorAcrescimoCustoOpGeral,2) >= v_saldoRatAcrescCustoOpGeral THEN
      v_valorAcrescimoCustoOpGeral := v_saldoRatAcrescCustoOpGeral;
      v_residuoAcrescCustoOpGeral  := 0;
    ELSE
      v_residuoAcrescCustoOpGeral  := v_valorAcrescimoCustoOpGeral - ROUND (v_valorAcrescimoCustoOpGeral,2);
      v_valorAcrescimoCustoOpGeral := ROUND (v_valorAcrescimoCustoOpGeral,2);
    END IF;
    v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
    IF ROUND (v_valorAcrescimoExtempGeral,2) >= v_saldoRatAcrescExtempGeral THEN
      v_valorAcrescimoExtempGeral := v_saldoRatAcrescExtempGeral;
      v_residuoAcrescExtempGeral  := 0;
    ELSE
      v_residuoAcrescExtempGeral  := v_valorAcrescimoExtempGeral - ROUND (v_valorAcrescimoExtempGeral,2);
      v_valorAcrescimoExtempGeral := ROUND (v_valorAcrescimoExtempGeral,2);
    END IF;
    v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;

    -- v_valorOutrasDespesasGeral
    IF v_valorBaseRateioOutrasDespFin > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
    ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
    END IF;
    IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
      v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
      v_residuoOutrasDespesasGeral := 0;
    ELSE
      v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
      v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
    END IF;
    v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;

    -- v_valorDescontoPagamento
    IF p_cab_valorDescontoPagamento       > 0
      AND v_valorBaseRateioPagamFinDesc   > 0
      AND a.geraFinanceiro = 1
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
    ELSIF p_cab_valorDescontoPagamento    > 0
      AND v_valorBaseRateioPagamDesconto  > 0
      AND v_valorBaseRateioPagamFinDesc  <= 0
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
    END IF;
    IF p_cab_valorDescontoPagamento        > 0
      AND v_valorDescontoPromocaoPagamen   > 0
      AND a.valorDescontoPromocaoPagamento > 0
    THEN
      IF p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
      ELSE
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
      v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
    END IF;
    v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;

    -- v_valorOutrasDespesasPagamento
    -- v_valorJurosPagamento
    IF v_valorBaseRateioPagamFinanc > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
    ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.valorProdutoServicoBruto > 0 AND (a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1) THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
    END IF;
    IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
      v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
      v_residuoOutrasDespPagamento   := 0;
    ELSE
      v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
      v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
    END IF;
    v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
    IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
      v_valorJurosPagamento   := v_saldoRatJurosPagamento;
      v_residuoJurosPagamento := 0;
    ELSE
      v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
      v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
    END IF;
    v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;

    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST,
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      a.modeloDocumento,
      a.quantidade,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);

    -- Atualiza Item
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = a.idItemDocFiscal;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
  IF v_idItemDocFiscalUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_DOC_FISC_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_origemDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      v_idItemDocFiscalUltimoItem,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_DOC_FISC_CALC_IMP_RATEIO;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       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,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSEscrituracao         NUMBER;
  v_valorICMSEscrituracao        NUMBER;
  v_valorICMSDesonEscrituracao   NUMBER;
  v_baseICMSSTEscrituracao       NUMBER;
  v_valorICMSSTEscrituracao      NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
BEGIN  
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSEscrituracao         := a.baseICMSEscrituracao;
    v_valorICMSEscrituracao        := a.valorICMSEscrituracao;
    v_valorICMSDesonEscrituracao   := a.valorICMSDesonEscrituracao;
    v_baseICMSSTEscrituracao       := a.baseICMSSTEscrituracao;
    v_valorICMSSTEscrituracao      := a.valorICMSSTEscrituracao;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      a.valorIPIDevolucao,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      1,
      a.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      1,
      a.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);    
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      a.somarICMSST,
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      a.somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      a.modeloDocumento,
      a.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSEscrituracao          = v_baseICMSEscrituracao,
      valorICMSEscrituracao         = v_valorICMSEscrituracao,
      valorICMSDesonEscrituracao    = v_valorICMSDesonEscrituracao,
      baseICMSSTEscrituracao        = v_baseICMSSTEscrituracao,
      valorICMSSTEscrituracao       = v_valorICMSSTEscrituracao,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = a.idItemDocFiscal;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MODOCUMENTOSFISCAIS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXORCAMENTOITEM docXorc
          ON docXorc.idItemDocFiscal = a.idItemDocFiscal
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    ADD_DOC_FISC_CALC_IMP_RATEIO (
      a.idDocumentoFiscal,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.nfFornecedor,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_DOC_FISC_CALC_IMP_ITENS (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.idDocumentoFiscal,
        a.origemDocumento,
        a.entradaSaida,
        a.devolucaoAnulacaoRetorno,
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.nfFornecedor,
        a.dataEntradaSaida,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = a.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_BLOEST_GRAV (
  p_estabelecimentoAtivo   IN NUMBER,
  p_id                     IN NUMBER,
  p_documentoTransferencia IN NUMERIC,
  p_sequencia              IN NUMERIC,
  p_dataBloqueio           IN DATE,
  p_estabelecimento        IN NUMERIC,
  p_localEstoque           IN NUMERIC,
  p_pessoaParticipante     IN NUMERIC,
  p_gradeProduto           IN NUMERIC,
  p_personalizacao         IN NUMERIC,
  p_idLoteEstoque          IN NUMERIC,
  p_idNumeroSerie          IN NUMERIC,
  p_quantidade             IN NUMERIC,
  p_quantidadeEstoque      IN NUMERIC,
  p_quantidadeReservas     IN NUMERIC,
  p_situacaoLiberacao      IN CHAR,
  p_usuarioLiberacao       IN NUMERIC,
  p_dataLiberacao          IN DATE,
  p_observacoes            IN VARCHAR,
  /* Retornos */
  r_id                     OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCTRANSFXBLOQUEIOSEST', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MODOCTRANSFXBLOQUEIOSEST a 
  USING (
    SELECT
      r_id                     id,
      p_documentoTransferencia documentoTransferencia,
      p_sequencia              sequencia,
      p_dataBloqueio           dataBloqueio,
      p_estabelecimento        estabelecimento,
      p_localEstoque           localEstoque,
      p_pessoaParticipante     pessoaParticipante,
      p_gradeProduto           gradeProduto,
      p_personalizacao         personalizacao,
      p_idLoteEstoque          idLoteEstoque,
      p_idNumeroSerie          idNumeroSerie,
      p_quantidade             quantidade,
      p_quantidadeEstoque      quantidadeEstoque,
      p_quantidadeReservas     quantidadeReservas,
      p_situacaoLiberacao      situacaoLiberacao,
      p_usuarioLiberacao       usuarioLiberacao,
      p_dataLiberacao          dataLiberacao,
      p_observacoes            observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.documentoTransferencia = b.documentoTransferencia,
    a.sequencia              = b.sequencia,
    a.dataBloqueio           = b.dataBloqueio,
    a.estabelecimento        = b.estabelecimento,
    a.localEstoque           = b.localEstoque,
    a.pessoaParticipante     = b.pessoaParticipante,
    a.gradeProduto           = b.gradeProduto,
    a.personalizacao         = b.personalizacao,
    a.idLoteEstoque          = b.idLoteEstoque,
    a.idNumeroSerie          = b.idNumeroSerie,
    a.quantidade             = b.quantidade,
    a.quantidadeEstoque      = b.quantidadeEstoque,
    a.quantidadeReservas     = b.quantidadeReservas,
    a.situacaoLiberacao      = b.situacaoLiberacao,
    a.usuarioLiberacao       = b.usuarioLiberacao,
    a.dataLiberacao          = b.dataLiberacao,
    a.observacoes            = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    documentoTransferencia,
    sequencia,
    dataBloqueio,
    estabelecimento,
    localEstoque,
    pessoaParticipante,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    quantidadeEstoque,
    quantidadeReservas,
    situacaoLiberacao,
    usuarioLiberacao,
    dataLiberacao,
    observacoes)
  VALUES (
    b.id,
    b.documentoTransferencia,
    b.sequencia,
    b.dataBloqueio,
    b.estabelecimento,
    b.localEstoque,
    b.pessoaParticipante,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.idNumeroSerie,
    b.quantidade,
    b.quantidadeEstoque,
    b.quantidadeReservas,
    b.situacaoLiberacao,
    b.usuarioLiberacao,
    b.dataLiberacao,
    b.observacoes);
END ADD_DOCTRANSF_ITEM_BLOEST_GRAV;

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_DOCTRANSF_ITEM_GRAVA (
  p_usuarioLogado               IN NUMBER,
  p_estabelecimentoAtivo        IN NUMBER,
  p_config_198_obs_add_referenc IN NUMBER,
  p_config_199_obs_add_caractA  IN NUMBER,
  p_config_200_obs_add_caractB  IN NUMBER,
  p_config_201_obs_add_caractC  IN NUMBER,
  p_config_202_obs_add_caractD  IN NUMBER,
  p_config_203_obs_add_caractE  IN NUMBER,
  p_config_413_obs_add_marca    IN NUMBER,
  p_config_418_obs_efetarEnter  IN NUMBER,
  p_idItemDocTransferencia      IN NUMBER,
  p_documentoTransferencia      IN NUMBER,
  p_sequencia                   IN NUMBER,
  p_cancelado                   IN NUMBER,
  p_validoSaida                 IN NUMBER,
  p_validoEntrada               IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_idFormulaTinta              IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_idNumeroSerie               IN NUMBER,
  p_localEstoqueSaida           IN NUMBER,
  p_pessoaParticipanteSaida     IN NUMBER,
  p_localEstoqueEntrada         IN NUMBER,
  p_pessoaParticipanteEntrada   IN NUMBER,
  p_controleQuantidade          IN NUMBER,
  p_unidadeMedidaConversao      IN VARCHAR,
  p_conversorQuantidade         IN NUMBER,
  p_loteMinimo                  IN NUMBER,
  p_loteMultiplo                IN NUMBER,
  p_altura                      IN NUMBER,
  p_largura                     IN NUMBER,
  p_comprimento                 IN NUMBER,
  p_pecas                       IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_quantidadeConvertida        IN NUMBER,
  p_quantidadeSaldo             IN NUMBER,
  p_pesoLiquido                 IN NUMBER,
  p_pesoBruto                   IN NUMBER,
  p_tipoPreco                   IN CHAR,
  p_tabelaPreco                 IN VARCHAR,
  p_precoSugestaoAPrazo         IN NUMBER,
  p_precoSugestaoAVista         IN NUMBER,
  p_precoDesconto               IN NUMBER,
  p_precoMinimo                 IN NUMBER,
  p_precoUnitario               IN NUMBER,
  p_precoUnitarioConvertido     IN NUMBER,
  p_valorProdutoServico         IN NUMBER,
  p_observacoesDigitadas        IN VARCHAR,
  p_orcamento                   IN NUMBER,
  p_idItemOrcamentoOriginal     IN NUMBER,
  p_idItemPreDocumentoOriginal  IN NUMBER,
  p_idItemDocFiscalOriginal     IN NUMBER,
  p_idEstoqueOriginal           IN NUMBER,
  /* Retornos */
  r_idItemDocTransferencia      OUT NUMBER)
IS
  v_observacoes                 VARCHAR (4000);
  v_aux_number                  NUMBER;
BEGIN
  r_idItemDocTransferencia  := p_idItemDocTransferencia;
  IF r_idItemDocTransferencia = 0 THEN
    r_idItemDocTransferencia := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCUMENTOTRANSFXITENS', 'idItemDocTransferencia', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
    ' ', -- p_sessaoClient
    p_config_198_obs_add_referenc,
    p_config_199_obs_add_caractA,
    p_config_200_obs_add_caractB,
    p_config_201_obs_add_caractC,
    p_config_202_obs_add_caractD,
    p_config_203_obs_add_caractE,
    p_config_413_obs_add_marca,
    p_config_418_obs_efetarEnter,
    ' ', -- p_tempComp_nomeTempComposicao
    0, -- p_tempComp_sequencia
    'T', -- p_Doc_Orc_Pre_Sep_Transf
    0, -- p_item_id
    p_gradeProduto,
    0, -- p_item_idFormulaTinta
    0, -- p_item_personalizacao
    0, -- p_item_idLoteEstoque
    1, -- p_item_controleQuantidade
    0, -- p_item_loteMultiplo
    0, -- p_item_altura
    0, -- p_item_largura
    0, -- p_item_comprimento
    p_quantidade,
    p_observacoesDigitadas);
  MERGE INTO MODOCUMENTOTRANSFXITENS a 
  USING (
    SELECT
      r_idItemDocTransferencia    idItemDocTransferencia,
      p_documentoTransferencia    documentoTransferencia,
      p_sequencia                 sequencia,
      p_cancelado                 cancelado,
      p_validoSaida               validoSaida,
      p_validoEntrada             validoEntrada,
      p_gradeProduto              gradeProduto,
      0                           servico,
      p_idFormulaTinta            idFormulaTinta,
      p_personalizacao            personalizacao,
      p_idLoteEstoque             idLoteEstoque,
      p_localEstoqueSaida         localEstoqueSaida,
      p_pessoaParticipanteSaida   pessoaParticipanteSaida,
      p_localEstoqueEntrada       localEstoqueEntrada,
      p_pessoaParticipanteEntrada pessoaParticipanteEntrada,
      p_controleQuantidade        controleQuantidade,
      p_unidadeMedidaConversao    unidadeMedidaConversao,
      p_conversorQuantidade       conversorQuantidade,
      p_loteMinimo                loteMinimo,
      p_loteMultiplo              loteMultiplo,
      p_altura                    altura,
      p_largura                   largura,
      p_comprimento               comprimento,
      p_pecas                     pecas,
      p_quantidade                quantidade,
      p_quantidadeConvertida      quantidadeConvertida,
      p_quantidadeSaldo           quantidadeSaldo,
      0                           quantidadeConferida,
      p_pesoLiquido               pesoLiquido,
      p_pesoBruto                 pesoBruto,
      p_tipoPreco                 tipoPreco,
      p_tabelaPreco               tabelaPreco,
      p_precoSugestaoAPrazo       precoSugestaoAPrazo,
      p_precoSugestaoAVista       precoSugestaoAVista,
      p_precoDesconto             precoDesconto,
      p_precoMinimo               precoMinimo,
      0                           precoPautaTabelado,
      p_precoUnitario             precoUnitario,
      p_precoUnitarioConvertido   precoUnitarioConvertido,
      p_valorProdutoServico       valorProdutoServico,
      p_observacoesDigitadas      observacoesDigitadas,
      v_observacoes               observacoes
    FROM DUAL) b
  ON (a.idItemDocTransferencia = b.idItemDocTransferencia)
  WHEN MATCHED THEN UPDATE SET
    a.documentoTransferencia    = b.documentoTransferencia,
    a.sequencia                 = b.sequencia,
    a.cancelado                 = b.cancelado,
    a.validoSaida               = b.validoSaida,
    a.validoEntrada             = b.validoEntrada,
    a.gradeProduto              = b.gradeProduto,
    a.servico                   = b.servico,
    a.idFormulaTinta            = b.idFormulaTinta,
    a.personalizacao            = b.personalizacao,
    a.idLoteEstoque             = b.idLoteEstoque,
    a.localEstoqueSaida         = b.localEstoqueSaida,
    a.pessoaParticipanteSaida   = b.pessoaParticipanteSaida,
    a.localEstoqueEntrada       = b.localEstoqueEntrada,
    a.pessoaParticipanteEntrada = b.pessoaParticipanteEntrada,
    a.controleQuantidade        = b.controleQuantidade,
    a.unidadeMedidaConversao    = b.unidadeMedidaConversao,
    a.conversorQuantidade       = b.conversorQuantidade,
    a.loteMinimo                = b.loteMinimo,
    a.loteMultiplo              = b.loteMultiplo,
    a.altura                    = b.altura,
    a.largura                   = b.largura,
    a.comprimento               = b.comprimento,
    a.pecas                     = b.pecas,
    a.quantidade                = b.quantidade,
    a.quantidadeConvertida      = b.quantidadeConvertida,
    a.quantidadeSaldo           = b.quantidadeSaldo,
    a.quantidadeConferida       = b.quantidadeConferida,
    a.pesoLiquido               = b.pesoLiquido,
    a.pesoBruto                 = b.pesoBruto,
    a.tipoPreco                 = b.tipoPreco,
    a.tabelaPreco               = b.tabelaPreco,
    a.precoSugestaoAPrazo       = b.precoSugestaoAPrazo,
    a.precoSugestaoAVista       = b.precoSugestaoAVista,
    a.precoDesconto             = b.precoDesconto,
    a.precoMinimo               = b.precoMinimo,
    a.precoPautaTabelado        = b.precoPautaTabelado,
    a.precoUnitario             = b.precoUnitario,
    a.precoUnitarioConvertido   = b.precoUnitarioConvertido,
    a.valorProdutoServico       = b.valorProdutoServico,
    a.observacoesDigitadas      = b.observacoesDigitadas,
    a.observacoes               = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idItemDocTransferencia,
    documentoTransferencia,
    sequencia,
    cancelado,
    validoSaida,
    validoEntrada,
    gradeProduto,
    servico,
    idFormulaTinta,
    personalizacao,
    idLoteEstoque,
    localEstoqueSaida,
    pessoaParticipanteSaida,
    localEstoqueEntrada,
    pessoaParticipanteEntrada,
    controleQuantidade,
    unidadeMedidaConversao,
    conversorQuantidade,
    loteMinimo,
    loteMultiplo,
    altura,
    largura,
    comprimento,
    pecas,
    quantidade,
    quantidadeConvertida,
    quantidadeSaldo,
    quantidadeConferida,
    pesoLiquido,
    pesoBruto,
    tipoPreco,
    tabelaPreco,
    precoSugestaoAPrazo,
    precoSugestaoAVista,
    precoDesconto,
    precoMinimo,
    precoPautaTabelado,
    precoUnitario,
    precoUnitarioConvertido,
    valorProdutoServico,
    observacoesDigitadas,
    observacoes)
  VALUES (
    b.idItemDocTransferencia,
    b.documentoTransferencia,
    b.sequencia,
    b.cancelado,
    b.validoSaida,
    b.validoEntrada,
    b.gradeProduto,
    b.servico,
    b.idFormulaTinta,
    b.personalizacao,
    b.idLoteEstoque,
    b.localEstoqueSaida,
    b.pessoaParticipanteSaida,
    b.localEstoqueEntrada,
    b.pessoaParticipanteEntrada,    
    b.controleQuantidade,
    b.unidadeMedidaConversao,
    b.conversorQuantidade,
    b.loteMinimo,
    b.loteMultiplo,
    b.altura,
    b.largura,
    b.comprimento,
    b.pecas,
    b.quantidade,
    b.quantidadeConvertida,
    b.quantidadeSaldo,
    b.quantidadeConferida,
    b.pesoLiquido,
    b.pesoBruto,
    b.tipoPreco,
    b.tabelaPreco,
    b.precoSugestaoAPrazo,
    b.precoSugestaoAVista,
    b.precoDesconto,
    b.precoMinimo,
    b.precoPautaTabelado,
    b.precoUnitario,
    b.precoUnitarioConvertido,
    b.valorProdutoServico,
    b.observacoesDigitadas,
    b.observacoes);
  IF p_idNumeroSerie > 0 THEN
    ADD_DOCTRANSF_ITEM_N_SER_GRAVA (
      p_estabelecimentoAtivo,
      0, -- p_idNumeroSerieDocTransf
      r_idItemDocTransferencia,
      p_gradeProduto,
      p_idNumeroSerie,
      v_aux_number);
  END IF;
  IF p_orcamento > 0 THEN
    MERGE INTO MODOCTRANSFXORCAMENTOS a 
    USING (
      SELECT
        r_idItemDocTransferencia idItemDocTransferencia,
        p_orcamento              orcamento
      FROM DUAL) b
    ON (a.idItemDocTransferencia = b.idItemDocTransferencia)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento = b.orcamento
    WHEN NOT MATCHED THEN INSERT (
      idItemDocTransferencia,
      orcamento)
    VALUES (
      b.idItemDocTransferencia,
      b.orcamento);
  END IF;
  IF p_idItemOrcamentoOriginal > 0 THEN
    ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
      p_estabelecimentoAtivo,
      'O', -- p_entradaSaidaOriginal
      r_idItemDocTransferencia,
      p_idItemOrcamentoOriginal,
      p_quantidade);
  END IF;
  IF p_idItemPreDocumentoOriginal > 0 THEN
    ADD_PRE_DOC_ITEM_TRANS_GRAVA (
      p_estabelecimentoAtivo,
      'O', -- p_entradaSaidaOriginal
      r_idItemDocTransferencia,
      p_idItemPreDocumentoOriginal,
      p_quantidade);
  END IF;
  IF p_idItemDocFiscalOriginal > 0 THEN
    ADD_DOC_FISC_ITEM_TRANS_GRAVA (
      p_estabelecimentoAtivo,
      'O', -- p_entradaSaidaOriginal
      r_idItemDocTransferencia,
      p_idItemDocFiscalOriginal,
      p_quantidade);
  END IF;
  IF p_idEstoqueOriginal > 0 THEN
    ADD_ESTOQUE_TRANS_GRAVA (
      p_estabelecimentoAtivo,
      'O', -- p_entradaSaidaOriginal
      r_idItemDocTransferencia,
      p_idEstoqueOriginal,
      p_quantidade);
  END IF;
END ADD_DOCTRANSF_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_ENCERRA_REC (
  p_usuarioLogado              IN NUMBER,
  p_estabelecimentoAtivo       IN NUMBER,
  p_documentoTransferencia     IN NUMBER,
  p_colaboradorRespRecebimento IN NUMBER)
IS
  v_colaborador NUMBER;
BEGIN
  FOR a IN (
    SELECT
      colaboradorResponsavelRetirada,
      colaboradorResponsavelRecebim
    FROM MODOCUMENTOSTRANSFERENCIA cabTransf
    WHERE documentoTransferencia = p_documentoTransferencia
    AND (colaboradorResponsavelRetirada = 0
      OR colaboradorResponsavelRecebim = 0))
  LOOP
    v_colaborador :=0;
    IF p_colaboradorRespRecebimento <> 0 THEN
      SELECT COALESCE (MAX (colaborador),0)
      INTO v_colaborador
      FROM CACOLABORADORES
      WHERE colaborador = p_colaboradorRespRecebimento
      AND ativo = 1;
    END IF;
    IF p_usuarioLogado <> 0 THEN
      SELECT COALESCE (MAX (colaborador),0)
      INTO v_colaborador
      FROM CACOLABORADORES
      WHERE colaborador = p_usuarioLogado
      AND ativo = 1;
    END IF;
    IF a.colaboradorResponsavelRetirada = 0 THEN
      IF v_colaborador <> 0 THEN
        UPDATE MODOCUMENTOSTRANSFERENCIA
        SET colaboradorResponsavelRetirada = v_colaborador
        WHERE documentoTransferencia = p_documentoTransferencia;
      END IF;
      UPDATE MODOCUMENTOSTRANSFERENCIA
      SET dataRetirada = SYSDATE
      WHERE documentoTransferencia = p_documentoTransferencia;
    END IF;
    IF a.colaboradorResponsavelRecebim = 0 THEN
      IF v_colaborador <> 0 THEN
        UPDATE MODOCUMENTOSTRANSFERENCIA
        SET colaboradorResponsavelRecebim = v_colaborador
        WHERE documentoTransferencia = p_documentoTransferencia;
      END IF;
      UPDATE MODOCUMENTOSTRANSFERENCIA
      SET dataRecebimento = SYSDATE
      WHERE documentoTransferencia = p_documentoTransferencia;
    END IF;
  END LOOP;
END ADD_DOCTRANSF_CAB_ENCERRA_REC;

/

create or replace PROCEDURE ADD_DOCTRANSF_CAB_GRAVA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_documentoTransferencia       IN NUMBER,
  p_modeloDocumento              IN NUMBER,
  p_motivoEstoque                IN NUMBER,
  p_estabelecimentoSaida         IN NUMBER,
  p_estabelecimentoEntrada       IN NUMBER,
  p_controlaSeparacaoConferencia IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_pessoa                       IN NUMBER,
  p_vendedor                     IN NUMBER,
  p_colaboradorResponsavelRetir  IN NUMBER,
  p_dataRetirada                 IN DATE,
  p_colaboradorResponsavelReceb  IN NUMBER,
  p_dataRecebimento              IN DATE,
  p_tipoDocumentoSaida           IN NUMBER,
  p_tipoDocumentoEntrada         IN NUMBER,
  p_situacaoDocTransferencia     IN CHAR,
  p_observacoes                  IN VARCHAR,
  p_origem                       IN VARCHAR,
  /* Retornos */
  r_documentoTransferencia OUT NUMBER)
IS
  v_situacaoDocTransferencia CHAR (1);
BEGIN
  r_documentoTransferencia  := p_documentoTransferencia;
  v_situacaoDocTransferencia := ' ';
  IF r_documentoTransferencia = 0 THEN
    r_documentoTransferencia := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCUMENTOSTRANSFERENCIA', 'documentoTransferencia', 14, p_estabelecimentoAtivo, NULL);
  ELSE
    SELECT COALESCE (MAX (situacaoDocTransferencia), ' ')
    INTO v_situacaoDocTransferencia
    FROM MODOCUMENTOSTRANSFERENCIA
    WHERE documentoTransferencia = r_documentoTransferencia;
  END IF;
  MERGE INTO MODOCUMENTOSTRANSFERENCIA a 
  USING (
    SELECT
      r_documentoTransferencia       documentoTransferencia,
      p_modeloDocumento              modeloDocumento,
      p_motivoEstoque                motivoEstoque,
      p_estabelecimentoSaida         estabelecimentoSaida,
      p_estabelecimentoEntrada       estabelecimentoEntrada,
      p_controlaSeparacaoConferencia controlaSeparacaoConferencia,
      p_dataEmissao                  dataEmissao,
      p_pessoa                       pessoa,
      p_vendedor                     vendedor,
      p_colaboradorResponsavelRetir  colaboradorResponsavelRetirada,
      p_dataRetirada                 dataRetirada,
      p_colaboradorResponsavelReceb  colaboradorResponsavelRecebim,
      p_dataRecebimento              dataRecebimento,
      p_tipoDocumentoSaida           tipoDocumentoSaida,
      p_tipoDocumentoEntrada         tipoDocumentoEntrada,
      p_situacaoDocTransferencia     situacaoDocTransferencia,
      p_observacoes                  observacoes
    FROM DUAL) b
  ON (a.documentoTransferencia = b.documentoTransferencia)
  WHEN MATCHED THEN UPDATE SET
    a.modeloDocumento                = b.modeloDocumento,
    a.motivoEstoque                  = b.motivoEstoque,
    a.estabelecimentoSaida           = b.estabelecimentoSaida,
    a.estabelecimentoEntrada         = b.estabelecimentoEntrada,
    a.controlaSeparacaoConferencia   = b.controlaSeparacaoConferencia,
    a.dataEmissao                    = b.dataEmissao,
    a.pessoa                         = b.pessoa,
    a.vendedor                       = b.vendedor,
    a.colaboradorResponsavelRetirada = b.colaboradorResponsavelRetirada,
    a.dataRetirada                   = b.dataRetirada,
    a.colaboradorResponsavelRecebim  = b.colaboradorResponsavelRecebim,
    a.dataRecebimento                = b.dataRecebimento,
    a.tipoDocumentoSaida             = b.tipoDocumentoSaida,
    a.tipoDocumentoEntrada           = b.tipoDocumentoEntrada,
    a.situacaoDocTransferencia       = b.situacaoDocTransferencia,
    a.observacoes                    = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    documentoTransferencia,
    modeloDocumento,
    motivoEstoque,
    estabelecimentoSaida,
    estabelecimentoEntrada,
    controlaSeparacaoConferencia,
    dataEmissao,
    pessoa,
    vendedor,
    colaboradorResponsavelRetirada,
    dataRetirada,
    colaboradorResponsavelRecebim,
    dataRecebimento,
    tipoDocumentoSaida,
    tipoDocumentoEntrada,
    situacaoDocTransferencia,
    observacoes)
  VALUES (
    b.documentoTransferencia,
    b.modeloDocumento,
    b.motivoEstoque,
    b.estabelecimentoSaida,
    b.estabelecimentoEntrada,
    b.controlaSeparacaoConferencia,
    b.dataEmissao,
    b.pessoa,
    b.vendedor,
    b.colaboradorResponsavelRetirada,
    b.dataRetirada,
    b.colaboradorResponsavelRecebim,
    b.dataRecebimento,
    b.tipoDocumentoSaida,
    b.tipoDocumentoEntrada,
    b.situacaoDocTransferencia,
    b.observacoes);
  IF p_documentoTransferencia = 0
    OR p_situacaoDocTransferencia <> v_situacaoDocTransferencia
  THEN
    ADD_DOCTRANSF_CAB_SIT_CRIA (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      r_documentoTransferencia,
      0, -- p_usuario
      p_situacaoDocTransferencia,
      CASE
        WHEN p_origem IS NULL
          OR p_origem = ' '
        THEN ''
        ELSE TRIM(p_origem) || ' - '
      END || 'ADD_DOCTRANSF_CAB_GRAVA');
  END IF;
END ADD_DOCTRANSF_CAB_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_cancelando_Excluindo_Outros  IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := ' ';
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      a.orcamento,
      a.gradeProduto,
      a.cancelado,
      a.usarPrecoAVista,
      a.geraFinanceiro,
      a.controleQuantidade,
      a.loteMultiplo,
      a.quantidade,
      a.quantidadeConvertida,
      a.controleEntrega,
      a.pesoLiquido,
      a.pesoBruto,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorLiquidoItem,
      prod.tipoProduto,
      contrEntr.habilitaFrete,
      modDoc.somaFreteSeguroPrUnit
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = a.controleEntrega
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idItemOrcamento = p_item_idItemOrcamento)
  LOOP
    SELECT
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.estabelecimento,
      cab.pessoa,
      cab.enderecoEntregaPessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.transportadora,
      cab.enderecoTransportadora,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem
    INTO
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_estabelecimento,
      v_cab_pessoa,
      v_cab_enderecoEntregaPessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_transportadora,
      v_cab_enderecoTransportadora,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem
    FROM MOORCAMENTOS cab
    WHERE cab.orcamento = a.orcamento;
    v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
    v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOORCAMENTOXPROMOCOES
      WHERE orcamento = a.orcamento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      IF a.controleEntrega <> 0
        AND a.habilitaFrete <> 0
        AND a.cancelado = 0
        AND a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem <> 0
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0,
          r_calcularImpostos,
          a.orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit,
          p_item_idItemOrcamento,
          0, -- p_item_pesoLiquido,
          0, -- p_item_pesoBruto,
          0, -- p_item_valorProdutoServicoBrut,
          0, -- p_item_valorDescontoItem,
          0, -- p_item_valorAcrescimoItem,
          0, -- p_item_controleEntrega,
          0, -- p_item_valorFreteGeral,
          0, -- p_contrEntr_habilitaFrete,
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_cab_valorFreteGeral,
          v_auxNumber);
      ELSE
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit);
      END IF;
      UPDATE MOORCAMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        transportadora                = v_cab_transportadora,
        enderecoTransportadora        = v_cab_enderecoTransportadora,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem
      WHERE orcamento = a.orcamento;
    END IF;
    FOR b IN (
      SELECT
        id,
        idItemOrcamentoReferenc,
        quantidade
      FROM MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      IF v_cab_tipoDocumento = 103 THEN
        UPDATE MOORCAMENTOXITENS c
        SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
        WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc;
      ELSIF v_cab_tipoDocumento = 201
        AND p_person_138_etapOrcEmProcesso <> 0
        AND p_person_139_etapOrcLiberado <> 0
        AND p_person_138_etapOrcEmProcesso <> p_person_139_etapOrcLiberado
      THEN
        FOR c IN (
          SELECT c.orcamento
          FROM MOORCAMENTOXITENS c
          JOIN MOORCAMENTOS d
          ON d.orcamento = c.orcamento
          WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc
          AND c.cancelado = 0
          AND d.tipoDocumento = 101
          AND d.etapaOrcamento = p_person_138_etapOrcEmProcesso
          GROUP BY c.orcamento)
        LOOP
          UPDATE MOORCAMENTOS d
          SET d.etapaOrcamento = p_person_139_etapOrcLiberado
          WHERE d.orcamento = c.orcamento;
          ADD_ORCAMENTO_CAB_ETAPA_CRIA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.orcamento,
            p_sys_usuarioLogado,
            p_person_139_etapOrcLiberado,
            ' ');
          ADD_RESERVA_ESTOQUE_ORC_CAB (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.orcamento);
        END LOOP;
      END IF;
      DELETE MOORCAMENTOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- Cancela / Exclui Transferências vinculadas.
    IF p_cancelando_Excluindo_Outros <> 'O' THEN
      FOR b IN (
        SELECT
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND (docXTransf2.entradaSaidaOriginal <> docXTransf.entradaSaidaOriginal
            OR docXTransf2.idItemOrcamento <> docXTransf.idItemOrcamento))
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOS docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia)
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXPREDOCUM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXDOCFISCAL docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        GROUP BY
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal)
      LOOP
        IF b.entradaSaidaOriginal = 'O' THEN
          ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
        ELSIF p_cancelando_Excluindo_Outros = 'C' THEN
          ADD_DOCTRANSF_CAB_SIT_GRAVA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            b.documentoTransferencia,
            'C',
            0,
            'Cancelamento Automático',
            'ADD_ORCAMENTO_ITEM_EXCLUI');
        END IF;
      END LOOP;
      FOR b IN (
        SELECT
          docXTransf.idItemDocTransferencia,
          cabTransf.situacaoDocTransferencia
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
        ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND docXTransf.entradaSaidaOriginal = 'O')
      LOOP
        ADD_DOCTRANSF_ITEM_EXCLUI (
          b.idItemDocTransferencia,
          'C', -- p_cancela_Exclui_Reabre
          b.situacaoDocTransferencia,
          0, -- p_cab_quantidadeConvertida,
          0, -- p_cab_valorProdutoServico,
          /* Retornos */
          v_auxNumber, -- r_cab_quantidadeConvertida
          v_auxNumber); -- r_cab_valorProdutoServico
      END LOOP;
    END IF;
    -- Desvincula Painel de Compras
    FOR b IN (
      SELECT
        b.idGradePainelCompra,
        b.idItemPainelCompra,
        c.painelCompra
      FROM MOPAINELCOMPRAXGRADE b
      JOIN MOPAINELCOMPRAXITENS c
      ON c.idItemPainelCompra = b.idItemPainelCompra
      WHERE b.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOPAINELCOMPRAXGRADE c
      SET c.idItemOrcamento = 0
      WHERE c.idGradePainelCompra = b.idGradePainelCompra;
      UPDATE MOPAINELCOMPRAXITENS c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.idItemPainelCompra = b.idItemPainelCompra
      AND c.situacaoPainelCompras <> 'E';
      UPDATE MOPAINEISCOMPRA c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.painelCompra = b.painelCompra
      AND c.situacaoPainelCompras <> 'E';
    END LOOP;
    ADD_MOTIVO_ORCAMENTO_ITE_EXCL (
      p_item_idItemOrcamento,
      0,
      v_auxNumber);
    ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
      p_item_idItemOrcamento,
      '',
      v_auxVarchar);
    ADD_ORCAMENTO_ITEM_LISTA_EXCL (p_item_idItemOrcamento);
    DELETE MOORCAMENTOXPROMOCOES
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    DELETE MOINGRESSOS
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXORCAMENTO docXDoc
      WHERE docXDoc.idItemOrcamento = p_item_idItemOrcamento
      AND docXDoc.idItemOrcamentoReferenc = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemOrcamento = p_item_idItemOrcamento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    IF p_cancelando_Excluindo_Outros = 'C' THEN
      ADD_ORCAMENTO_ITEM_PREV_CANC (p_item_idItemOrcamento);
      FOR a IN (
        SELECT
          entrega,
          quantidade
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_SITUACAO_TROCA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_item_idItemOrcamento,
          a.entrega,
          a.quantidade,
          8,
          'ADD_ORCAMENTO_ITEM_EXCLUI - CANCELA');
      END LOOP;
      UPDATE MOORCAMENTOXITENS
      SET cancelado = 1
      WHERE idItemOrcamento = p_item_idItemOrcamento;
    ELSE
      DELETE MOORCAMENTOXCOMPOSICOESPR
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXNUMEROSSERIE
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXEMBALAGENSTIN
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXCENTROSCUSTOS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXATIVIDADEPROJ
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamentoReferenc = p_item_idItemOrcamento;     
      DELETE MOPREDOCUMXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCFISCALXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT idAtividadePrevOrcamento
        FROM MOORCAMENTOXATIVIDADEPREV
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
          b.idAtividadePrevOrcamento,
          '',
          '',
          v_auxVarchar,
          v_auxVarchar);
      END LOOP;
      DELETE MODISTRIBUICAODFEXORCAM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCTRANSFXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOENTREGAXSITUACOES
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT entrega
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          b.entrega,
          CASE WHEN p_cancelando_Excluindo_Outros = 'C' THEN 0 ELSE 1 END,
          'ADD_ORCAMENTO_ITEM_EXCLUI');
      END LOOP;
      DELETE MOORCAMENTOXITENS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemOrcamento
          FROM MOORCAMENTOXITENS b
          WHERE b.orcamento = a.orcamento
          AND b.idItemOrcamento <> p_item_idItemOrcamento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOORCAMENTOXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemOrcamento = b.idItemOrcamento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_ATUALIZA_ENTR (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_serieFiscal                  IN VARCHAR2,
  p_subserieFiscal               IN NUMBER,
  p_documentoFiscal              IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_timezoneEmissao              IN VARCHAR2,
  p_dataEntradaSaida             IN DATE,
  p_chaveNfe                     IN VARCHAR)
IS
BEGIN
  FOR a IN (
  SELECT DISTINCT itemDocE.idDocumentoFiscal
  FROM MODOCFISCALXITENS itemDocS
  JOIN MODOCTRANSFXDOCFISCAL transfXDocS
  ON transfXDocS.idItemDocFiscal = itemDocS.idItemDocFiscal
  JOIN MODOCTRANSFXDOCFISCAL transfXDocE
  ON transfXDocE.idItemDocTransferencia = transfXDocS.idItemDocTransferencia
  JOIN MODOCFISCALXITENS itemDocE
  ON itemDocE.idItemDocFiscal = transfXDocE.idItemDocFiscal
  WHERE itemDocS.idDocumentoFiscal = p_idDocumentoFiscal
  AND transfXDocS.entradaSaidaOriginal = 'S'
  AND transfXDocE.entradaSaidaOriginal = 'E'
  AND itemDocE.idDocumentoFiscal > 0)
  LOOP
    UPDATE MODOCUMENTOSFISCAIS b SET
      b.serieFiscal      = p_serieFiscal,
      b.subserieFiscal   = p_subserieFiscal,
      b.documentoFiscal  = p_documentoFiscal,
      b.dataEmissao      = p_dataEmissao,
      b.timezoneEmissao  = p_timezoneEmissao,
      b.dataEntradaSaida = p_dataEntradaSaida,
      b.chaveNfe         = p_chaveNfe
    WHERE b.idDocumentoFiscal = a.idDocumentoFiscal;
    ADD_ESTOQUE_DOC_FISC_CABECALHO (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      a.idDocumentoFiscal);
  END LOOP;
END ADD_DOC_FISC_CAB_ATUALIZA_ENTR;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_ETAPA_TROCA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_usuario                      IN NUMBER,
  p_novaEtapaOrcamento           IN NUMBER,
  p_justificativaCancelamento    IN VARCHAR,
  p_cancelandoOrcamento          IN NUMBER,
  p_colaboradorRespRecebimento   IN NUMBER)
IS
  v_cab_etapaOrcamento      NUMBER;
  v_etOrc_situacaoOrcamento NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  SELECT situacaoOrcamento
  INTO v_etOrc_situacaoOrcamento
  FROM PAETAPASORCAMENTO
  WHERE etapaOrcamento = p_novaEtapaOrcamento;
  SELECT etapaOrcamento
  INTO v_cab_etapaOrcamento
  FROM MOORCAMENTOS
  WHERE orcamento = p_orcamento;
  IF v_cab_etapaOrcamento <> p_novaEtapaOrcamento THEN
    IF p_cancelandoOrcamento = 1
      OR v_etOrc_situacaoOrcamento = 90
    THEN
      IF NOT (p_justificativaCancelamento IS NULL)
        AND p_justificativaCancelamento <> ' '
      THEN
        ADD_ORCAMENTO_INFO_GRAVA (
          p_sys_estabelecimentoAtivo,
          0,
          p_orcamento,
          0,
          0,
          0,
          0,
          p_justificativaCancelamento,
          /* Retornos */
          v_auxNumber);
      END IF;
      FOR a IN (
        SELECT idItemOrcamento
        FROM MOORCAMENTOXITENS
        WHERE orcamento = p_orcamento
        AND cancelado = 0)
      LOOP
        ADD_ORCAMENTO_ITEM_EXCLUI (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_138_etapOrcEmProcesso,
          p_person_139_etapOrcLiberado,
          p_person_190_modeloFrete,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_378_calcularVolumes,
          0,
          a.idItemOrcamento,
          'C',
          1,
          /* Retornos */
          v_auxVarchar,
          v_auxNumber);
      END LOOP;
      FOR a IN (
        SELECT idPagamentoOrcamento
        FROM MOORCAMENTOXPAGAMENTOS
        WHERE orcamento = p_orcamento)
      LOOP
        ADD_ORCAMENTO_PAG_EXCLUI_CORR (a.idPagamentoOrcamento);
        UPDATE MOORCAMENTOXPAGAMENTOS b
        SET b.saldoEfetivar = 0
        WHERE b.idPagamentoOrcamento = a.idPagamentoOrcamento;
      END LOOP;
    ELSIF v_etOrc_situacaoOrcamento <= 30 THEN
      FOR a IN (
        SELECT b.entrega
        FROM MOORCAMENTOXITENS a
        JOIN MOENTREGAS b
        ON b.idItemOrcamento = a.idItemOrcamento
        WHERE a.orcamento = p_orcamento
        AND a.cancelado = 0
        AND b.situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          a.entrega,
          0,
          'ADD_ORCAMENTO_CAB_ETAPA_TROCA');
      END LOOP;
    END IF;
    UPDATE MOORCAMENTOS
    SET etapaOrcamento = p_novaEtapaOrcamento
    WHERE orcamento = p_orcamento;
    v_cab_etapaOrcamento := p_novaEtapaOrcamento;    
    ADD_ORCAMENTO_CAB_ETAPA_CRIA (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_orcamento,
      p_usuario,
      p_novaEtapaOrcamento,
      ' ');
  END IF;
  ADD_RESERVA_ESTOQUE_ORC_CAB (
    p_sys_estabelecimentoAtivo, 
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  IF NOT (v_etOrc_situacaoOrcamento IN(11,90))
    AND p_cancelandoOrcamento = 0
  THEN
    FOR a IN (
      SELECT itemTransf.documentoTransferencia
      FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      JOIN MOORCAMENTOXITENS itemDoc
      ON itemDoc.idItemOrcamento = transfXDoc.idItemOrcamento
      WHERE itemDoc.orcamento = p_orcamento
      AND itemTransf.documentoTransferencia > 0
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND (cabTransf.colaboradorResponsavelRetirada = 0
        OR cabTransf.colaboradorResponsavelRecebim = 0)
      GROUP BY itemTransf.documentoTransferencia)
    LOOP
      ADD_DOCTRANSF_CAB_ENCERRA_REC (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        a.documentoTransferencia,
        p_colaboradorRespRecebimento);
    END LOOP;
  END IF;
END ADD_ORCAMENTO_CAB_ETAPA_TROCA;

/

create or replace PROCEDURE ADD_DOC_ATUALIZA_RESERVAS (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_idItemDocFiscal              IN NUMBER)
IS
  v_auxVarchar VARCHAR (32000);
BEGIN
  IF p_idItemPreDocumento > 0 THEN
    FOR a IN (
      SELECT idItemOrcamento
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_idItemPreDocumento
      AND idItemOrcamento > 0)
    LOOP
      ADD_RESERVA_ESTOQUE_ORC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.idItemOrcamento,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END LOOP;
    IF p_cab_devolucaoAnulacaoRetorno = 1 THEN
      FOR a IN (
        SELECT
          a.idItemPreDocReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MOPREDOCUMXPREDOCUM a
        JOIN MOPREDOCUMXITENS b
        ON b.idItemPreDocumento = a.idItemPreDocumento
        JOIN MOPREDOCUMENTOS c
        ON c.preDocumento = b.preDocumento
        WHERE a.idItemPreDocumento = p_idItemPreDocumento
        AND a.idItemPreDocReferenciado > 0
        AND a.quantidade <> 0)
      LOOP
        ADD_DOC_ATUALIZA_RESERVAS (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          a.idItemPreDocReferenciado,
          0);
      END LOOP;
      FOR a IN (
        SELECT
          a.idItemDocFiscalReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MOPREDOCUMXDOCFISCAL a
        JOIN MOPREDOCUMXITENS b
        ON b.idItemPreDocumento = a.idItemPreDocumento
        JOIN MOPREDOCUMENTOS c
        ON c.preDocumento = b.preDocumento
        WHERE a.idItemPreDocumento = p_idItemPreDocumento
        AND a.idItemDocFiscalReferenciado > 0
        AND a.quantidade <> 0)
      LOOP
        ADD_DOC_ATUALIZA_RESERVAS (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          0,
          a.idItemDocFiscalReferenciado);
      END LOOP;
    END IF;
  END IF;
  IF p_idItemDocFiscal > 0 THEN
    FOR a IN (
      SELECT idItemOrcamento
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_idItemDocFiscal
      AND idItemOrcamento > 0)
    LOOP
      ADD_RESERVA_ESTOQUE_ORC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.idItemOrcamento,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END LOOP;
    IF p_cab_devolucaoAnulacaoRetorno = 1 THEN
      FOR a IN (
        SELECT
          a.idItemPreDocReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MODOCFISCALXPREDOCUM a
        JOIN MODOCFISCALXITENS b
        ON b.idItemDocFiscal = a.idItemDocFiscal
        JOIN MODOCUMENTOSFISCAIS c
        ON c.idDocumentoFiscal = b.idDocumentoFiscal
        WHERE a.idItemDocFiscal = p_idItemDocFiscal
        AND a.idItemPreDocReferenciado > 0
        AND a.quantidade <> 0
        AND c.origemDocumento <> 13)
      LOOP
        ADD_DOC_ATUALIZA_RESERVAS (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          a.idItemPreDocReferenciado,
          0);
      END LOOP;
      FOR a IN (
        SELECT
          a.idItemDocFiscalReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MODOCFISCALXDOCFISCAL a
        JOIN MODOCFISCALXITENS b
        ON b.idItemDocFiscal = a.idItemDocFiscal
        JOIN MODOCUMENTOSFISCAIS c
        ON c.idDocumentoFiscal = b.idDocumentoFiscal
        WHERE a.idItemDocFiscal = p_idItemDocFiscal
        AND a.idItemDocFiscalReferenciado > 0
        AND a.quantidade <> 0)
      LOOP
        ADD_DOC_ATUALIZA_RESERVAS (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          0,
          a.idItemDocFiscalReferenciado);
      END LOOP;
    END IF;
  END IF;
END ADD_DOC_ATUALIZA_RESERVAS;

/

create or replace PROCEDURE ADD_DOC_ATUALIZA_QUANT_DEVOLV (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_tipoDocumentoAtual           IN CHAR, -- D = Documento Fiscal, 'P', Pré-Documento,
  p_idItemAtual                  IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- D = Documento Fiscal, 'P', Pré-Documento,
  p_idItemReferenciado           IN NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
  v_auxVarchar      VARCHAR (32000);
BEGIN
  IF p_tipoDocumentoReferenciado = 'P'
    AND p_idItemReferenciado > 0
    AND p_item_quantidadeConvertida > 0
    AND p_cab_devolucaoAnulacaoRetorno = 1 THEN
    -- Entrega Marca Devolvida
    v_quantidadeSaldo := p_item_quantidadeConvertida;
    FOR a IN (
      SELECT
        entrega,
        modeloDocumento,
        estabelecimento,
        dataEntrega,
        horaEntregaFinal,
        motorista,
        placa,
        rota,
        idItemOrcamento,
        idItemPreDocumentoRemessa,
        idItemDocFiscalRemessa,
        quantidade,
        situacaoEntrega,
        observacoes
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_idItemReferenciado)
    LOOP
      IF v_quantidadeSaldo > 0
        AND a.quantidade > 0
        AND a.situacaoEntrega < 7 THEN
        IF v_quantidadeSaldo < a.quantidade THEN
          ADD_ENTREGA_CRIA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            a.modeloDocumento,
            a.estabelecimento,
            a.dataEntrega,
            a.horaEntregaFinal,
            a.motorista,
            a.placa,
            a.rota,
            a.idItemOrcamento,
            a.idItemPreDocumentoRemessa,
            a.idItemDocFiscalRemessa,
            a.quantidade - v_quantidadeSaldo,
            a.situacaoEntrega,
            a.observacoes);
          UPDATE MOENTREGAS b SET
            b.quantidade = v_quantidadeSaldo,
            b.situacaoEntrega = 7
          WHERE b.entrega = a.entrega;
          v_quantidadeSaldo := 0;
        ELSE
          UPDATE MOENTREGAS b SET
            b.situacaoEntrega = 7
          WHERE b.entrega = a.entrega;
          v_quantidadeSaldo := v_quantidadeSaldo - a.quantidade;
        END IF;
        ADD_ENTREGA_SITUACAO_CRIA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          a.idItemOrcamento,
          a.entrega,
          7,
          'ADD_DOC_ATUALIZA_QUANT_DEVOLV - Entrega Marca Devolvida');
      END IF;
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.idItemOrcamento);
    END LOOP;
    -- Entrega Marca Cancelada
    FOR a IN (
      SELECT
        preXOrc.idItemOrcamento,
        contrEntr.modeloDocumentoEntrega
      FROM MOPREDOCUMXORCAMENTOITEM preXOrc
      JOIN MOORCAMENTOXITENS item
      ON item.idItemOrcamento = preXOrc.idItemOrcamento
      JOIN PACONTROLESENTREGA contrEntr
      ON contrEntr.controleEntrega = item.controleEntrega
      WHERE preXOrc.idItemPreDocumento = p_idItemReferenciado
      AND preXOrc.idItemOrcamento > 0
      AND item.controleEntrega > 0)
    LOOP
      -- Reduz Quantidade Programada
      v_quantidadeSaldo := p_item_quantidadeConvertida;
      FOR b IN (
        SELECT
          entr.entrega,
          entr.quantidade
        FROM MOENTREGAS entr
        WHERE entr.idItemOrcamento = a.idItemOrcamento
        AND entr.situacaoEntrega < 5
        ORDER BY
          entr.situacaoEntrega DESC,
          entr.entrega DESC)
      LOOP
        IF v_quantidadeSaldo > 0
          AND b.quantidade > 0 THEN
          IF b.quantidade <= v_quantidadeSaldo THEN
            UPDATE MOENTREGAXSITUACOES c SET
              c.entrega = 0,
              c.observacoes = 'Entrega "'
                || TO_CHAR(b.entrega)
                || '" excluída '
                || TO_CHAR(SYSDATE, 'DD/MM/YYYY')
                || ' às '
                || TO_CHAR(SYSDATE, 'HH24:MI:SS')
            WHERE c.entrega = b.entrega;
            DELETE MOENTREGAS c WHERE c.entrega = b.entrega;
            v_quantidadeSaldo := v_quantidadeSaldo - b.quantidade;
          ELSE
            UPDATE MOENTREGAS entr
            SET entr.quantidade = entr.quantidade - v_quantidadeSaldo
            WHERE entr.entrega = b.entrega;
            v_quantidadeSaldo := 0;
          END IF;
        END IF;
      END LOOP;
      ADD_ENTREGA_CRIA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        a.modeloDocumentoEntrega,
        p_sys_estabelecimentoAtivo,
        SYSDATE,
        TO_CHAR(SYSDATE, 'HH24MISS'),
        0,
        ' ',
        0,
        a.idItemOrcamento,
        CASE WHEN p_tipoDocumentoAtual = 'P' THEN p_idItemAtual ELSE 0 END,
        CASE WHEN p_tipoDocumentoAtual = 'D' THEN p_idItemAtual ELSE 0 END,
        p_item_quantidadeConvertida,
        8,
        'ADD_DOC_ATUALIZA_QUANT_DEVOLV - Reduz Quantidade Programada');
    END LOOP;
  ELSIF p_tipoDocumentoReferenciado = 'D'
    AND p_idItemReferenciado > 0
    AND p_item_quantidadeConvertida > 0
    AND p_cab_devolucaoAnulacaoRetorno = 1 THEN
    -- Entrega Marca Devolvida
    v_quantidadeSaldo := p_item_quantidadeConvertida;
    FOR a IN (
      SELECT
        entr.entrega,
        entr.modeloDocumento,
        entr.estabelecimento,
        entr.dataEntrega,
        entr.horaEntregaFinal,
        entr.motorista,
        entr.placa,
        entr.rota,
        entr.idItemOrcamento,
        entr.idItemPreDocumentoRemessa,
        entr.idItemDocFiscalRemessa,
        entr.quantidade,
        entr.situacaoEntrega,
        entr.observacoes
      FROM MOENTREGAS entr
      WHERE entr.idItemDocFiscalRemessa = p_idItemReferenciado)
    LOOP
      IF v_quantidadeSaldo > 0
        AND a.quantidade > 0
        AND a.situacaoEntrega < 7 THEN
        IF v_quantidadeSaldo < a.quantidade THEN
          ADD_ENTREGA_CRIA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            a.modeloDocumento,
            a.estabelecimento,
            a.dataEntrega,
            a.horaEntregaFinal,
            a.motorista,
            a.placa,
            a.rota,
            a.idItemOrcamento,
            a.idItemPreDocumentoRemessa,
            a.idItemDocFiscalRemessa,
            a.quantidade - v_quantidadeSaldo,
            a.situacaoEntrega,
            a.observacoes);
          UPDATE MOENTREGAS b SET
            b.quantidade = v_quantidadeSaldo,
            b.situacaoEntrega = 7
          WHERE b.entrega = a.entrega;
          v_quantidadeSaldo := 0;
        ELSE
          UPDATE MOENTREGAS b SET
            b.situacaoEntrega = 7
          WHERE b.entrega = a.entrega;
          v_quantidadeSaldo := v_quantidadeSaldo - a.quantidade;
        END IF;
        ADD_ENTREGA_SITUACAO_CRIA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          a.idItemOrcamento,
          a.entrega,
          7,
          'ADD_DOC_ATUALIZA_QUANT_DEVOLV - Entrega Marca Devolvida');
      END IF;
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.idItemOrcamento);
    END LOOP;
    -- Entrega Marca Cancelada
    FOR a IN (
      SELECT
        docXOrc.idItemOrcamento,
        contrEntr.modeloDocumentoEntrega
      FROM MODOCFISCALXORCAMENTOITEM docXOrc
      JOIN MOORCAMENTOXITENS item
      ON item.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN PACONTROLESENTREGA contrEntr
      ON contrEntr.controleEntrega = item.controleEntrega
      WHERE docXOrc.idItemDocFiscal = p_idItemReferenciado
      AND docXOrc.idItemOrcamento > 0
      AND item.controleEntrega > 0
      UNION ALL
      SELECT
        docXOrc.idItemOrcamento,
        contrEntr.modeloDocumentoEntrega
      FROM MODOCFISCALXPREDOCUM docXPre
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = docXPre.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = docXPre.idItemPreDocReferenciado
      JOIN MOORCAMENTOXITENS item
      ON item.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN PACONTROLESENTREGA contrEntr
      ON contrEntr.controleEntrega = item.controleEntrega
      WHERE docXPre.idItemDocFiscal = p_idItemReferenciado
      AND itemDoc.idDocumentoFiscal > 0
      AND docXPre.idItemPreDocReferenciado > 0
      AND docXOrc.idItemOrcamento > 0
      AND cabDoc.origemDocumento = 13
      AND item.controleEntrega > 0)
    LOOP
      -- Reduz Quantidade Programada
      v_quantidadeSaldo := p_item_quantidadeConvertida;
      FOR b IN (
        SELECT
          entr.entrega,
          entr.quantidade
        FROM MOENTREGAS entr
        WHERE entr.idItemOrcamento = a.idItemOrcamento
        AND entr.situacaoEntrega < 5
        ORDER BY
          entr.situacaoEntrega DESC,
          entr.entrega DESC)
      LOOP
        IF v_quantidadeSaldo > 0
          AND b.quantidade > 0 THEN
          IF b.quantidade <= v_quantidadeSaldo THEN
            UPDATE MOENTREGAXSITUACOES c SET
              c.entrega = 0,
              c.observacoes = 'Entrega "'
                || TO_CHAR(b.entrega)
                || '" excluída '
                || TO_CHAR(SYSDATE, 'DD/MM/YYYY')
                || ' às '
                || TO_CHAR(SYSDATE, 'HH24:MI:SS')
            WHERE c.entrega = b.entrega;
            DELETE MOENTREGAS c WHERE c.entrega = b.entrega;
            v_quantidadeSaldo := v_quantidadeSaldo - b.quantidade;
          ELSE
            UPDATE MOENTREGAS entr
            SET entr.quantidade = entr.quantidade - v_quantidadeSaldo
            WHERE entr.entrega = b.entrega;
            v_quantidadeSaldo := 0;
          END IF;
        END IF;
      END LOOP;
      ADD_ENTREGA_CRIA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        a.modeloDocumentoEntrega,
        p_sys_estabelecimentoAtivo,
        SYSDATE,
        TO_CHAR(SYSDATE, 'HH24MISS'),
        0,
        ' ',
        0,
        a.idItemOrcamento,
        CASE WHEN p_tipoDocumentoAtual = 'P' THEN p_idItemAtual ELSE 0 END,
        CASE WHEN p_tipoDocumentoAtual = 'D' THEN p_idItemAtual ELSE 0 END,
        p_item_quantidadeConvertida,
        8,
        'ADD_DOC_ATUALIZA_QUANT_DEVOLV - Reduz Quantidade Programada');
    END LOOP;
  END IF;
  IF p_item_quantidade <> 0
    AND p_tipoDocumentoReferenciado = 'P'
    AND p_idItemReferenciado > 0
  THEN
    UPDATE MOPREDOCUMXITENS
    SET quantidadeDevolvidaRetornada = 
      CASE
        WHEN p_item_quantidade < 0
          AND quantidadeDevolvidaRetornada + p_item_quantidade < 0
        THEN 0
        ELSE quantidadeDevolvidaRetornada + p_item_quantidade
      END
    WHERE idItemPreDocumento = p_idItemReferenciado;
    FOR a IN (
      SELECT idItemOrcamento
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_idItemReferenciado
      AND idItemOrcamento > 0)
    LOOP
      ADD_RESERVA_ESTOQUE_ORC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.idItemOrcamento,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END LOOP;
    IF p_cab_devolucaoAnulacaoRetorno = 1 THEN
      FOR a IN (
        SELECT
          a.idItemPreDocReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MOPREDOCUMXPREDOCUM a
        JOIN MOPREDOCUMXITENS b
        ON b.idItemPreDocumento = p_idItemReferenciado
        JOIN MOPREDOCUMENTOS c
        ON c.preDocumento = b.preDocumento
        WHERE a.idItemPreDocumento = p_idItemReferenciado
        AND a.idItemPreDocReferenciado > 0
        AND a.quantidade <> 0)
      LOOP
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado,
          - p_item_quantidade,
          - p_item_quantidadeConvertida,
          'P',
          a.idItemPreDocReferenciado);
      END LOOP;
      FOR a IN (
        SELECT
          a.idItemDocFiscalReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MOPREDOCUMXDOCFISCAL a
        JOIN MOPREDOCUMXITENS b
        ON b.idItemPreDocumento = p_idItemReferenciado
        JOIN MOPREDOCUMENTOS c
        ON c.preDocumento = b.preDocumento
        WHERE a.idItemPreDocumento = p_idItemReferenciado
        AND a.idItemDocFiscalReferenciado > 0
        AND a.quantidade <> 0)
      LOOP
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado,
          - p_item_quantidade,
          - p_item_quantidadeConvertida,
          'D',
          a.idItemDocFiscalReferenciado);
      END LOOP;
    END IF;
  END IF;
  IF p_item_quantidade <> 0
    AND p_tipoDocumentoReferenciado = 'D'
    AND p_idItemReferenciado > 0 THEN
    UPDATE MODOCFISCALXITENS
    SET quantidadeDevolvidaRetornada = 
      CASE
        WHEN p_item_quantidade < 0
          AND quantidadeDevolvidaRetornada + p_item_quantidade < 0
        THEN 0
        ELSE quantidadeDevolvidaRetornada + p_item_quantidade
      END
    WHERE idItemDocFiscal = p_idItemReferenciado;
    FOR a IN (
      SELECT idItemOrcamento
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_idItemReferenciado
      AND idItemOrcamento > 0)
    LOOP
      ADD_RESERVA_ESTOQUE_ORC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        a.idItemOrcamento,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END LOOP;
    IF p_cab_devolucaoAnulacaoRetorno = 1 THEN
      FOR a IN (
        SELECT
          a.idItemPreDocReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MODOCFISCALXPREDOCUM a
        JOIN MODOCFISCALXITENS b
        ON b.idItemDocFiscal = p_idItemReferenciado
        JOIN MODOCUMENTOSFISCAIS c
        ON c.idDocumentoFiscal = b.idDocumentoFiscal
        WHERE a.idItemDocFiscal = p_idItemReferenciado
        AND a.idItemPreDocReferenciado > 0
        AND a.quantidade <> 0
        AND c.origemDocumento <> 13)
      LOOP
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado,
          - p_item_quantidade,
          - p_item_quantidadeConvertida,
          'P',
          a.idItemPreDocReferenciado);
      END LOOP;
      FOR a IN (
        SELECT
          a.idItemDocFiscalReferenciado,
          c.devolucaoAnulacaoRetorno
        FROM MODOCFISCALXDOCFISCAL a
        JOIN MODOCFISCALXITENS b
        ON b.idItemDocFiscal = p_idItemReferenciado
        JOIN MODOCUMENTOSFISCAIS c
        ON c.idDocumentoFiscal = b.idDocumentoFiscal
        WHERE a.idItemDocFiscal = p_idItemReferenciado
        AND a.idItemDocFiscalReferenciado > 0
        AND a.quantidade <> 0)
      LOOP
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          a.devolucaoAnulacaoRetorno,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado,
          - p_item_quantidade,
          - p_item_quantidadeConvertida,
          'D',
          a.idItemDocFiscalReferenciado);
      END LOOP;
    END IF;
  END IF;
END ADD_DOC_ATUALIZA_QUANT_DEVOLV;

/

create or replace PROCEDURE ADD_CONSERTO_CANCELA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idConserto                   IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  FOR a IN (
    SELECT
      cliente,
      documentoTransferenciaLojaCd,
      documentoTransferenciaFornec,
      documentoTransferenciaCdLoja
    FROM MOCONSERTOS
    WHERE idConserto = p_idConserto
    AND situacaoConserto <> 'C')
  LOOP
    IF a.documentoTransferenciaLojaCd <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        a.documentoTransferenciaLojaCd,
        'C',
        0,
        'Cancelamento Automático.',
        'ADD_CONSERTO_CANCELA');
    END IF;
    IF a.documentoTransferenciaFornec <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        a.documentoTransferenciaFornec,
        'C',
        0,
        'Cancelamento Automático.',
        'ADD_CONSERTO_CANCELA');
    END IF;
    IF a.documentoTransferenciaCdLoja <> 0 THEN
      ADD_DOCTRANSF_CAB_SIT_GRAVA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        a.documentoTransferenciaCdLoja,
        'C',
        0,
        'Cancelamento Automático.',
        'ADD_CONSERTO_CANCELA');
    END IF;
    ADD_EVENTO_GRAVA (
      p_sys_estabelecimentoAtivo,
      0, -- p_evento
      'MOCONSERTOS', -- p_tabelaSistema
      p_idConserto, -- p_id
      a.cliente, -- p_pessoa
      ' ', -- p_projeto
      SYSDATE, -- p_data
      p_sys_usuarioLogado, -- p_usuario
      1, -- p_sistema
      p_person_184_tipoEventoCancCon, -- p_tipoEvento
      'Cancelamento Automático.', -- p_descricao
      ' ', -- p_observacoes
      /* Retornos */
      v_auxNumber);
    UPDATE MOCONSERTOS
    SET situacaoConserto = 'C'
    WHERE idConserto = p_idConserto;
  END LOOP;
END ADD_CONSERTO_CANCELA;

/

create or replace PROCEDURE ADD_BALANCO_ITEM_INSERE (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_bal_balanco               IN NUMBER,
  p_bal_modeloDocumento       IN NUMBER,
  p_bal_estabelecimento       IN NUMBER,
  p_bal_localEstoque          IN NUMBER,
  p_bal_pessoaParticipante    IN NUMBER,
  p_lista_idListaBalanco      IN NUMBER,
  p_lista_sequencia           IN NUMBER,
  p_lista_colaborador         IN NUMBER,
  p_lista_arquivo             IN VARCHAR2,
  p_lista_observacoes         IN VARCHAR2,
  p_item_ordenacao            IN NUMBER,
  p_item_linhaImportada       IN VARCHAR2,
  p_item_mensagemBalanco      IN NUMBER,
  p_item_gradeProduto         IN NUMBER,
  p_item_personalizacao       IN NUMBER,
  p_item_idLoteEstoque        IN NUMBER,
  p_item_idNumeroSerie        IN NUMBER,
  p_item_quantidade           IN NUMBER,
  r_bal_balanco               OUT NUMBER,
  r_lista_idListaBalanco      OUT NUMBER,
  r_lista_sequencia           OUT NUMBER,
  r_item_ordenacao            OUT NUMBER)
IS
BEGIN
  r_bal_balanco := p_bal_balanco;
  r_lista_idListaBalanco := p_lista_idListaBalanco;
  r_lista_sequencia := p_lista_sequencia;
  r_item_ordenacao := p_item_ordenacao;
  IF r_bal_balanco <= 0 THEN
    r_bal_balanco := FUNC_ADD_PROXIMO_ID (p_sys_estabelecimentoAtivo, p_config_354_estabProximoId, 'MOBALANCOS', 'balanco', 14);
    INSERT INTO MOBALANCOS (
      balanco,
      modeloDocumento,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      data,
      situacaoBalanco,
      observacoes)
    VALUES (
      r_bal_balanco,
      p_bal_modeloDocumento,
      p_bal_estabelecimento,
      p_bal_localEstoque,
      p_bal_pessoaParticipante,
      SYSDATE,
      'E',
      ' ');
    r_lista_idListaBalanco := 0;
    r_lista_sequencia := 0;
    r_item_ordenacao := 0;
  END IF;
  IF r_lista_idListaBalanco <= 0 THEN
    r_lista_idListaBalanco := FUNC_ADD_PROXIMO_ID (p_sys_estabelecimentoAtivo, p_config_354_estabProximoId, 'MOBALANCOXLISTAS', 'idListaBalanco', 14);
    r_lista_sequencia := r_lista_sequencia + 1;
    INSERT INTO MOBALANCOXLISTAS (
      idListaBalanco,
      balanco,
      sequencia,
      colaborador,
      data,
      arquivo,
      listaAberta,
      observacoes)
    VALUES (
      r_lista_idListaBalanco,
      r_bal_balanco,
      r_lista_sequencia,
      p_lista_colaborador,
      SYSDATE,
      p_lista_arquivo,
      0,
      p_lista_observacoes);
    r_item_ordenacao := 0;
  END IF;
  r_item_ordenacao := r_item_ordenacao + 1;
  INSERT INTO MOBALANCOXITENS (
    idItemBalanco,
    idListaBalanco,
    ordenacao,
    cancelado,
    linhaImportada,
    mensagemBalanco,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idNumeroSerie,
    quantidade,
    observacoes)
  VALUES (
    FUNC_ADD_PROXIMO_ID (p_sys_estabelecimentoAtivo, p_config_354_estabProximoId, 'MOBALANCOXITENS', 'idItemBalanco', 14),
    r_lista_idListaBalanco,
    r_item_ordenacao,
    0,
    p_item_linhaImportada,
    p_item_mensagemBalanco,
    p_item_gradeProduto,
    p_item_personalizacao,
    p_item_idLoteEstoque,
    p_item_idNumeroSerie,
    p_item_quantidade,
    ' ');
END ADD_BALANCO_ITEM_INSERE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_ORCAMEN (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOPREDOCUMXORCAMENTOITEM
  WHERE idItemPreDocumento = p_item_idItemPreDocumento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MOPREDOCUMXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXORCAMENTOITEM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
    INSERT INTO MOPREDOCUMXORCAMENTOITEM (
      id,
      idItemPreDocumento,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemPreDocumento,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_PRE_DOC_ITEM_BLOEST_ORC (
      p_sys_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_ORCAMEN (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento);
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento,
      '',
      '',
      v_auxAlpha,
      v_auxAlpha);
  END IF;
END ADD_PRE_DOC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_PRE_DOC (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                       NUMBER;
  v_preDocumentoReferenciado NUMBER;
  v_sequenciaReferenciado    NUMBER;
  v_orc_pessoa               NUMBER;
  v_auxAlpha                 VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_PRE_DOC (
    p_sys_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_PRE_DOC (
    p_sys_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_PRE_DOC (
    p_sys_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_PRE_DOC (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemPreDocumentoReferenc);
  ELSE
    SELECT
      preDocumento,
      sequencia
    INTO
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado
    FROM MOPREDOCUMXITENS
    WHERE idItemPreDocumento = p_idItemPreDocumentoReferenc;
    ADD_PRE_DOC_ITEM_BLOEST_PRE (
      p_sys_estabelecimentoAtivo,
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idItemPreDocReferenciado = p_idItemPreDocumentoReferenc;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MOPREDOCUMXPREDOCUM SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXPREDOCUM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
      INSERT INTO MOPREDOCUMXPREDOCUM (
        id,
        idItemPreDocumento,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemPreDocumento,
        p_idItemPreDocumentoReferenc,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_REF_PRE_DOC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_DOC_FIS (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                           NUMBER;
  v_idDocumentoFiscalReferenciad NUMBER;
  v_sequenciaReferenciado        NUMBER;
  v_orc_pessoa                   NUMBER;
  v_auxAlpha                     VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_DOC_FIS (
    p_sys_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_DOC_FIS (
    p_sys_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_DOC_FIS (
    p_sys_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_DOC_FIS (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemDocFiscalReferenciado);
  ELSE
    SELECT
      idDocumentoFiscal,
      sequencia
    INTO
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado
    FROM MODOCFISCALXITENS
    WHERE idItemDocFiscal = p_idItemDocFiscalReferenciado;
    ADD_PRE_DOC_ITEM_BLOEST_DOC (
      p_sys_estabelecimentoAtivo,
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MOPREDOCUMXDOCFISCAL
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idItemDocFiscalReferenciado = p_idItemDocFiscalReferenciado;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MOPREDOCUMXDOCFISCAL SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXDOCFISCAL', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
      INSERT INTO MOPREDOCUMXDOCFISCAL (
        id,
        idItemPreDocumento,
        idItemDocFiscalReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemPreDocumento,
        p_idItemDocFiscalReferenciado,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_REF_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_ORCAMEN (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_ORCAM (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_ORCAM (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_ORCAMEN (
    p_sys_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCFISCALXORCAMENTOITEM
  WHERE idItemDocFiscal = p_item_idItemDocFiscal
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MODOCFISCALXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXORCAMENTOITEM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCFISCALXORCAMENTOITEM (
      id,
      idItemDocFiscal,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemDocFiscal,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_DOC_FISC_ITEM_BLOEST_ORC (
      p_sys_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_ORCAMEN (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento);
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_idItemOrcamento,
      '',
      '',
      v_auxAlpha,
      v_auxAlpha);
  END IF;
END ADD_DOC_FISC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_gradeDistribuicaoDFe         IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_novaEtapaOrcamento NUMBER;
  v_quantidadeSaldo    NUMBER;
  v_auxNumber          NUMBER;
  v_auxChar            CHAR (1);
  v_auxVarchar         VARCHAR2 (32000);
BEGIN
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.quantidadeSaldo,
      a.quantidadeBaixar,
      a.zerarSaldo,
      b.orcamento
    FROM MODISTRIBUICAODFEXORCAM a
    JOIN MOORCAMENTOXITENS b
    ON b.idItemOrcamento = a.idItemOrcamento
    WHERE a.gradeDistribuicaoDFe = p_gradeDistribuicaoDFe
    AND a.quantidadeBaixar > 0
    ORDER BY a.sequencia)
  LOOP
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = p_item_idItemDocFiscal
    WHERE gradeDistribuicaoDFe = p_gradeDistribuicaoDFe;
    ADD_DOC_FISC_ITEM_REF_ORCAMEN (
      p_sys_usuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_227_manterPessoaOrcam,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_quantidade,
      p_item_valorLiquidoItem,
      a.idItemOrcamento,
      CASE WHEN a.zerarSaldo = 1 THEN a.quantidadeSaldo ELSE a.quantidadeBaixar END,
      r_atualizarObservacoes,
      r_atualizarObservacoes);  
    SELECT COALESCE (SUM(b.quantidadeSaldo),0)
    INTO v_quantidadeSaldo
    FROM MOORCAMENTOXITENS b
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
    IF v_quantidadeSaldo <= 0 THEN
      SELECT COALESCE(MAX(etapaOrcamento),0)
      INTO v_novaEtapaOrcamento
      FROM PAETAPASORCAMENTO
      WHERE etapaOrcamento > 0
      AND ativo = 1
      AND situacaoOrcamento = 80;      
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_138_etapOrcEmProcesso,
        p_person_139_etapOrcLiberado,
        p_person_190_modeloFrete,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_sys_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0);
    ELSE
      v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
    END IF;  
    IF v_novaEtapaOrcamento <> 0 THEN
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_138_etapOrcEmProcesso,
        p_person_139_etapOrcLiberado,
        p_person_190_modeloFrete,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_sys_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_REF_DFE_GRAD;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_PRE_DOC (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                       NUMBER;
  v_preDocumentoReferenciado NUMBER;
  v_sequenciaReferenciado    NUMBER;
  v_orc_pessoa               NUMBER;
  v_auxAlpha                 VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_PRE (
    p_sys_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_PRE (
    p_sys_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_PRE_DOC (
    p_sys_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_PRE_DOC (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemPreDocumentoReferenc);
  ELSE
    SELECT
      preDocumento,
      sequencia
    INTO
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado
    FROM MOPREDOCUMXITENS
    WHERE idItemPreDocumento = p_idItemPreDocumentoReferenc;
    ADD_DOC_FISC_ITEM_BLOEST_PRE (
      p_sys_estabelecimentoAtivo,
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MODOCFISCALXPREDOCUM
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idItemPreDocReferenciado = p_idItemPreDocumentoReferenc;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MODOCFISCALXPREDOCUM SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXPREDOCUM', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
      INSERT INTO MODOCFISCALXPREDOCUM (
        id,
        idItemDocFiscal,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemDocFiscal,
        p_idItemPreDocumentoReferenc,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_REF_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DOC_FIS (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                           NUMBER;
  v_idDocumentoFiscalReferenciad NUMBER;
  v_sequenciaReferenciado        NUMBER;
  v_orc_pessoa                   NUMBER;
  v_auxAlpha                     VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_PRE (
    p_sys_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_DOC (
    p_sys_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_DOC_FIS (
    p_sys_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_DOC_FIS (
      p_sys_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemDocFiscalReferenciado);
  ELSE
    SELECT
      idDocumentoFiscal,
      sequencia
    INTO
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado
    FROM MODOCFISCALXITENS
    WHERE idItemDocFiscal = p_idItemDocFiscalReferenciado;
    ADD_DOC_FISC_ITEM_BLOEST_DOC (
      p_sys_estabelecimentoAtivo,
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idItemDocFiscalReferenciado = p_idItemDocFiscalReferenciado;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MODOCFISCALXDOCFISCAL SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXDOCFISCAL', 'id', 14, p_sys_estabelecimentoAtivo, NULL);
      INSERT INTO MODOCFISCALXDOCFISCAL (
        id,
        idItemDocFiscal,
        idItemDocFiscalReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemDocFiscal,
        p_idItemDocFiscalReferenciado,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_REF_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal))
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_DOC_FISC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MODOCFISCALXATENDIMENTO
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MODOCFISCALXATENDIMENTO c WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXPREDOCUM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXDOCFISCAL docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalEntrada = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento))
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_PRE_DOC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MOPREDOCUMXATENDIMENTO
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MOPREDOCUMXATENDIMENTO c WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXPREDOCUM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXDOCFISCAL docXDoc
      WHERE docXDoc.idItemPreDocumento > 0
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento > 0
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_nivel                        IN NUMBER,
  p_buffer_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_statusPreDocumento       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemPreDocumento    NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_statusPreDocumento,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.preDocumento = p_item_preDocumento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_item_quantidadeDevolvidaRet  := 0;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_geraFinanceiro          := a.geraFinanceiro;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> p_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_PRE_DOC_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_227_manterPessoaOrcam,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND(a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemPreDocumento IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemPreDocumento)) >= 14
      LOOP
        v_ajuste_idItemPreDocumento := TO_NUMBER(SUBSTR(r_buffer_idItemPreDocumento,1,14));
        r_buffer_idItemPreDocumento := RTRIM(SUBSTR(r_buffer_idItemPreDocumento,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MOPREDOCUMXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemPreDocumento = v_ajuste_idItemPreDocumento;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MOPREDOCUMXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemPreDocumento = v_ajuste_idItemPreDocumento;
      END LOOP;
      UPDATE MOPREDOCUMENTOS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE preDocumento       = p_item_preDocumento;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 0)
        THEN
          r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        p_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        0, -- p_cab_vendaConsumidor
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        0, -- p_movimentaEstoqueFiscal
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_auxNumber, -- r_movimentaEstoqueFiscal
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar, -- r_item_stICMSEscrit
        v_auxNumber, -- r_item_reducaoBaseICMSEscrit
        v_auxNumber, -- r_item_aliquotaICMSEscrit
        v_auxNumber, -- r_item_diferimentoICMSEscritur
        v_auxNumber, -- r_item_margemValorAdicSTEscrit
        v_auxNumber, -- r_item_reducaoBaseSTEscrit
        v_auxNumber, -- r_item_aliquotaICMSSTEscrit
        v_auxNumber, -- r_item_somarICMSST
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        p_item_valorIPIDevolucao,
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        0, -- p_calcularICMSEscrituracao
        '  ', -- p_stICMSEscrituracao
        0, -- p_reducaoBaseICMSEscrituracao
        0, -- p_aliquotaICMSEscrituracao
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        0, -- p_calcularICMSSTEscrituracao
        0, -- p_margemValorAdicSTEscriturac
        0, -- p_reducaoBaseSTEscrituracao
        0, -- p_aliquotaICMSSTEscrituracao
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber, -- r_baseICMSEscrituracao
        v_auxNumber, -- r_valorICMSEscrituracao
        v_auxNumber, -- r_valorICMSDesonEscrituracao
        v_auxNumber, -- r_baseICMSSTEscrituracao
        v_auxNumber, -- r_valorICMSSTEscrituracao
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      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,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    ADD_DOC_ATUALIZA_RESERVAS (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      v_cab_devolucaoAnulacaoRetorno,
      r_item_idItemPreDocumento,
      0); -- p_idItemDocFiscal
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'P',
      r_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MOPREDOCUMXITENS
    SET observacoes = v_observacoes
    WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_ESTOQUE_PRE_DOC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_nivel                        IN NUMBER,
  p_buffer_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_movimentaEstoqueFiscal  NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemDocFiscal       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_item_quantidadeDevolvidaRet  := 0;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        v_item_geraFinanceiro          := a.geraFinanceiro;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> p_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
        AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_DOC_FISC_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_138_etapOrcEmProcesso,
        p_person_139_etapOrcLiberado,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado,
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND(a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemDocFiscal IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemDocFiscal)) >= 14
      LOOP
        v_ajuste_idItemDocFiscal := TO_NUMBER(SUBSTR(r_buffer_idItemDocFiscal,1,14));
        r_buffer_idItemDocFiscal := RTRIM(SUBSTR(r_buffer_idItemDocFiscal,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MODOCFISCALXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemDocFiscal = v_ajuste_idItemDocFiscal;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MODOCFISCALXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemDocFiscal = v_ajuste_idItemDocFiscal;
      END LOOP;
      UPDATE MODOCUMENTOSFISCAIS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE idDocumentoFiscal  = p_item_idDocumentoFiscal;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND ( v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 0)
        THEN
          r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        p_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_cab_vendaConsumidor,
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        1, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_item_movimentaEstoqueFiscal,
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_item_somarICMSST,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        p_item_valorIPIDevolucao,
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      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,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_138_etapOrcEmProcesso,
          p_person_139_etapOrcLiberado,
          p_person_190_modeloFrete,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    ELSE
    ADD_DOC_ATUALIZA_RESERVAS (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      v_cab_devolucaoAnulacaoRetorno,
      0, -- p_idItemPreDocumento
      r_item_idItemDocFiscal);
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'D',
      r_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MODOCFISCALXITENS
    SET observacoes = v_observacoes
    WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_ESTOQUE_DOC_FISC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_PRE_DOC (
  p_exclusivo               IN VARCHAR2,
  p_1_NFCe_2_ConsFinal_3_NF IN VARCHAR2,
  p_preDocumento            IN NUMBER,
  p_estabelecimentoAtivo    IN NUMBER,
  p_nfFornecedor            IN NUMBER,
  p_idSerieFiscal           IN NUMBER,
  p_serieFiscal             IN VARCHAR2,
  p_subSerieFiscal          IN NUMBER,
  p_modeloDocumentoFiscal   IN VARCHAR2,
  p_documentoFiscal         IN NUMBER,
  p_data                    IN DATE,
  p_timezone                IN VARCHAR2,
  p_versaoAplicativo        IN VARCHAR2,
  r_idDocumentoFiscal       OUT NUMBER)
IS
  v_excluirPreDoc     NUMBER;
  v_tipoDocumento     NUMBER;
  v_fatocontabil      NUMBER;
  v_estabelecimento   NUMBER;
  v_pessoa            NUMBER;
  v_sequenciaItem     NUMBER;
  v_documentoFiscal   NUMBER;
  CURSOR c_itens IS
    SELECT
      item.idItemPreDocumento,
      CASE
        WHEN cancelado = 0
        THEN FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXITENS', 'idItemDocFiscal', 0, p_estabelecimentoAtivo, NULL)
        ELSE 0
      END idItemDocFiscal,
      item.sequencia,
      item.cancelado,
      item.pedidoCompraFornecedor,
      item.sequenciaPedidoCompraFornec,
      item.estabelecimentoOriginal,
      item.modeloDocumento,
      item.vendedor,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.controleQuantidade,
      item.unidadeMedidaConversao,
      item.conversorQuantidade,
      item.loteMinimo,
      item.loteMultiplo,
      item.altura,
      item.largura,
      item.comprimento,
      item.pecas,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.tipoPreco,
      item.tabelaPreco,
      item.precoSugestaoAPrazo,
      item.precoSugestaoAVista,
      item.precoDesconto,
      item.precoMinimo,
      item.usarPrecoAVista,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.precoUnitarioConvertido,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.percDescontoItem,
      item.valorDescontoItem,
      item.percAcrescimoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorDescontoCustoOpItem,
      item.valorAcrescimoCustoOpItem, 
      item.observacoesDigitadas,
      item.observacoes,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorAcrescimoExtempGeral,
      item.valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorAcrescimoExtempTotal,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpTotal,
      item.percentualDevolucao,
      item.valorIPIDevolucao, 
      item.operacaoFiscal,
      item.movimentaEstoque,
      item.geraFinanceiro,
      item.cfop,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      item.retidoISSQN,
      item.tributadoForaMunicipio,
      item.incentivoFiscal,
      item.listaServicos,
      item.cnae,
      item.idServicoMunicipio,
      item.numeroProcessoAdministrativo,
      item.retencaoIRRF,
      item.retencaoINSS,
      item.retencaoPIS,
      item.retencaoCOFINS,
      item.retencaoCSLL,
      item.retencaoOutros,
      item.aliquotaII,
      item.aliquotaIOF,
      item.codigoEnquadramentoIPI,
      item.stIPI,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      item.stPIS,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      item.stCOFINS,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      item.motivoDesoneracaoICMS,
      item.idBeneficio,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      item.aliquotaSTSuportConsFinal,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND prod.tipoProduto IN('07','08')
        THEN '90'
        WHEN p_nfFornecedor = 1 AND item.stICMS IN('10','30','70')
          OR p_nfFornecedor = 1 AND item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203')
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN '60'
        WHEN item.stICMS <> ' '
        THEN item.stICMS
        WHEN item.stSimplesNacional IN ('101','102') AND item.reducaoBaseICMS = 0
        THEN '00'
        WHEN item.stSimplesNacional IN ('101','102')
        THEN '20'
        WHEN item.stSimplesNacional IN ('103','300')
        THEN '40'
        WHEN item.stSimplesNacional IN ('201','202','203') AND item.reducaoBaseICMS = 0
        THEN '10' WHEN item.stSimplesNacional IN ('201','202','203')
        THEN '70' WHEN item.stSimplesNacional = '400'
        THEN '41'
        ELSE '90'
      END stICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.reducaoBaseICMS
        ELSE 0
      END reducaoBaseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.aliquotaICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.creditoSimplesNacional
        ELSE 0
      END aliquotaICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.diferimentoICMS
        ELSE 0
      END diferimentoICMSEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.margemValorAdicionadoST
      END margemValorAdicSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.reducaoBaseST
      END reducaoBaseSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.aliquotaICMSST
      END aliquotaICMSSTEscrituracao,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      item.aliquotaFCP,
      item.aliquotaFCPST,
      item.aliquotaFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      item.baseISSQN,
      item.valorISSQN,
      item.baseRetIRRF,
      item.valorRetIRRF,
      item.baseRetINSS,
      item.valorRetINSS,
      item.baseRetPIS,
      item.valorRetPIS,
      item.baseRetCOFINS,
      item.valorRetCOFINS,
      item.baseRetCSLL,
      item.valorRetCSLL,
      item.baseRetOutros,
      item.valorRetOutros,
      item.baseII,
      item.valorII,
      item.baseIOF,
      item.valorIOF,
      item.baseIPI,
      item.valorIPI,
      item.basePIS,
      item.valorPIS,
      item.basePISST,
      item.valorPISST,
      item.baseCOFINS,
      item.valorCOFINS,
      item.baseCOFINSST,
      item.valorCOFINSST,
      item.baseCreditoSimplesNacional,
      item.valorCreditoSimplesNacional,
      item.baseICMS,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMSProprioSubstituto,
      item.baseICMSEfetivo,
      item.valorICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' ' AND p_nfFornecedor = 1
        THEN ROUND(item.baseICMS *(1-item.diferimentoICMS/100),2)
        WHEN item.stICMS <> ' '
        THEN item.baseICMS
        WHEN item.stSimplesNacional IN ('101','201') AND item.baseCreditoSimplesNacional = 0
        THEN item.valorProdutoServico
          - item.valorDescontoTotal
          + item.valorOutrasDespesasTotal
          + item.valorAdicFreteMarinhaMerTotal
          + item.valorDespesasAduaneirasTotal
          + item.valorII
          + item.valorIOF
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.baseCreditoSimplesNacional
        ELSE 0
      END baseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.valorCreditoSimplesNacional
        ELSE 0
      END valorICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMSDesoneracao
        ELSE 0
      END valorICMSDesonEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.baseICMSST
      END baseICMSSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.valorICMSST
      END valorICMSSTEscrituracao,
      1 somarICMSST,
      item.baseICMSUFDestinatario,
      item.valorICMSUFDestinatario,
      item.baseICMSUFRemetente,
      item.valorICMSUFRemetente,
      item.baseFCP,
      item.valorFCP,
      item.baseFCPST,
      item.valorFCPST,
      item.baseFCPSTAnteriormente,
      item.valorFCPSTAnteriormente,
      item.baseFCPUFDestinatario,
      item.valorFCPUFDestinatario,
      item.baseEstimadaImpostos,
      item.valorEstimadoImpFederais,
      item.valorEstimadoImpEstaduais,
      item.valorEstimadoImpMunicipais,
      item.valorBasePagamento,
      item.valorLiquidoItem,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV
     FROM MOPREDOCUMXITENS item
     JOIN CAGRADESPRODUTO gradProd
     ON gradProd.gradeProduto = item.gradeProduto
     JOIN CAPRODUTOS prod
     ON prod.produto = gradProd.produto
     WHERE item.preDocumento = p_preDocumento
     ORDER BY item.sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT a.idMotivoBloqueioDocumento, a.idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMPAGAM a
    JOIN MOPREDOCUMXPAGAMENTOS b ON b.idPagamentoPreDocumento = a.idPagamentoPreDocumento
    WHERE b.preDocumento = p_preDocumento;
  CURSOR c_mot_pag2 IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'P'
      AND a.idCabecalho = p_preDocumento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXPREDOCUMPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
  r_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS', 'idDocumentoFiscal', 0, p_estabelecimentoAtivo, NULL);
  SELECT 
    CASE
      WHEN COALESCE(TRUNC(preDoc.dataEmissao),TO_DATE('01/01/1900','DD/MM/YYYY'))
         = COALESCE(TRUNC(p_data),TO_DATE('01/01/1900','DD/MM/YYYY'))
      THEN 1
      ELSE 0
    END,
    CASE
      WHEN preDoc.entradaSaida='E'
        AND preDoc.devolucaoAnulacaoRetorno = 1
      THEN 602
      WHEN preDoc.entradaSaida='E'
      THEN 601
      WHEN preDoc.devolucaoAnulacaoRetorno = 1
      THEN 502
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '1'
        OR p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN 503
      ELSE 501
    END,
    preDoc.fatocontabil,
    preDoc.estabelecimento,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN 0
      ELSE preDoc.pessoa
    END,
    CASE
      WHEN p_nfFornecedor = 1
      THEN p_documentoFiscal
      ELSE FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS|' || LPAD (preDoc.estabelecimento,4,'0') || '|' || LPAD (p_idSerieFiscal,14,'0'), ' ', 0, 0,TRUNC(p_data))
    END
  INTO
    v_excluirPreDoc,
    v_tipoDocumento,
    v_fatocontabil,
    v_estabelecimento,
    v_pessoa,
    v_documentoFiscal
  FROM MOPREDOCUMENTOS preDoc
  WHERE preDoc.preDocumento = p_preDocumento;
  IF v_excluirPreDoc = 1 THEN
    IF v_fatocontabil > 0 THEN
      UPDATE MOFATOSCONTABEIS a SET a.situacaoContabilizacao = 'A' WHERE a.fatocontabil = v_fatocontabil AND a.situacaoContabilizacao = 'N';
    END IF;
  ELSE
    v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOFATOSCONTABEIS (
      fatoContabil,
      estabelecimento,
      data,
      ordenacao,
      situacaoTransacao,
      situacaoContabilizacao,
      sessao,
      observacoes)
    VALUES (
      v_fatoContabil,
      v_estabelecimento,
      p_data,
      0,
      'A',
      'A',
      0,
      ' ');
  END IF;
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    tipoVenda,
    modeloDocumento,
    entradaSaida,
    devolucaoAnulacaoRetorno,
    finalidadeNota,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    validoFaturamento,
    usarPrecoAVista,
    sessao,
    sessaoCaixa,
    fatoContabil,
    idTerminalSiTef,
    estabelecimentoOriginal,
    estabelecimento,
    enderecoRetiradaEstabeleciment,
    indicadorPresencaComprador,
    controlaSeparacaoConferencia,
    nfFornecedor,
    idSerieFiscal,
    serieFiscal,
    subserieFiscal,
    modeloDocumentoFiscal,
    documentoFiscal,
    dataEmissao,
    timezoneEmissao,
    dataEntradaSaida,
    pessoa,
    vendaConsumidor,
    indicadorPessoa,
    indicadorDocumentoPessoa,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    fone,
    indicadorFone,
    operadoraTelefonia,
    autorizadoPessoa,
    enderecoEntregaPessoa,
    municipioFatoGerador,
    localDestinoOperacao,
    indicadorConsumidorFinal,
    projeto,
    contratoCompra,
    comissionadoB,
    comissionadoC,
    modalidadeFrete,
    tipoPagamentoFrete,
    transportadora,
    enderecoTransportadora,
    motorista,
    placa,
    vagao,
    balsa,
    quantidadeVolume,
    especieVolume,
    descricaoMarca,
    numeracaoVolume,
    codigoIntegracao,
    atendimento,
    tipoCTe,
    idContingenciaNfe,
    codigoNumericoNfe,
    digitoVerificadorNfe,
    formaEmissaoNfe,
    indicadorAmbienteNfe,
    qrCode,
    chaveNfe,
    situacaoDocumentoFiscal,
    ultimoVendedorItem,
    quantidade,
    pesoLiquido,
    pesoBruto,
    valorProdutosBruto,
    valorProdutos,
    valorDescontoProdutos,
    valorAcrescimoProdutos,
    valorServicosBruto,
    valorServicos,
    valorDescontoServicos,
    valorAcrescimoServicos,
    valorFreteItem,
    valorSeguroItem,
    valorAdicFreteMarinhaMerItem,
    valorDespesasAduaneirasItem,
    valorFreteGeral,
    valorSeguroGeral,
    valorDescontoGeral,
    valorOutrasDespesasGeral,
    valorAdicFreteMarinhaMerGeral,
    valorDespesasAduaneirasGeral,
    condicaoPagamento,
    contaFinanceira,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorBasePagamento,
    valorAVistaMinimo,
    valorEntradaMinima,
    valorAVistaEntrada,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorTroco,
    valorFreteTotal,
    valorSeguroTotal,
    valorDescontoTotal,
    valorOutrasDespesasTotal,
    valorAdicFreteMarinhaMerTotal,
    valorDespesasAduaneirasTotal,
    impostosEditados,
    valorImpostosSomaPagamento,
    valorImpostosDiminuiPagamento,
    valorLiquidoItem,
    valorDescontoCustoOpItem,
    valorDescontoCustoOpGeral,
    valorDescontoCustoOpTotal,
    valorAcrescimoCustoOpItem,
    valorAcrescimoCustoOpGeral,
    valorAcrescimoCustoOpTotal,
    valorCustoOperacao,
    valorCMV,
    quantidadeExtemporanea,
    valorAcrescimoExtempSubtotal,
    valorAcrescimoExtempItem,
    valorAcrescimoExtempGeral,
    valorAcrescimoExtempTotal,
    versaoAplicativo)
  SELECT
    r_idDocumentoFiscal,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.origemDocumento ELSE 13 END,
    v_tipoDocumento,
    preDoc.tipoVenda,
    preDoc.modeloDocumento,
    preDoc.entradaSaida,
    preDoc.devolucaoAnulacaoRetorno,
    preDoc.finalidadeNota,
    preDoc.atualizaCustoMedio,
    preDoc.atualizaUltimaCompra,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.validoFaturamento ELSE 0 END,
    preDoc.usarPrecoAVista,
    preDoc.sessao,
    preDoc.sessaoCaixa,
    v_fatoContabil,
    preDoc.idTerminalSiTef,
    preDoc.estabelecimentoOriginal,
    v_estabelecimento,
    preDoc.enderecoRetiradaEstabeleciment,
    preDoc.indicadorPresencaComprador,
    preDoc.controlaSeparacaoConferencia,
    p_nfFornecedor,
    p_idSerieFiscal,
    p_serieFiscal,
    p_subserieFiscal,
    p_modeloDocumentoFiscal,
    v_documentoFiscal,
    p_data dataEmissao,
    p_timezone timezoneEmissao,
    p_data dataEntradaSaida,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.pessoa END pessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 1 ELSE 0 END vendaConsumidor,
    preDoc.indicadorPessoa,
    preDoc.indicadorDocumentoPessoa,
    preDoc.cnpjCpfIdEstrangeiro,
    preDoc.nomeRazaoSocial,
    preDoc.fone,
    preDoc.indicadorFone,
    preDoc.operadoraTelefonia,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.autorizadoPessoa END autorizadoPessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.enderecoEntregaPessoa END enderecoEntregaPessoa,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN COALESCE ((SELECT MAX(endEst.municipio) FROM CAENDERECOSPESSOA endEst WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1),0)
      ELSE preDoc.municipioFatoGerador
    END municipioFatoGerador,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE preDoc.localDestinoOperacao END localDestinoOperacao,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE preDoc.indicadorConsumidorFinal END indicadorConsumidorFinal,
    preDoc.projeto,
    preDoc.contratoCompra,
    preDoc.comissionadoB,
    preDoc.comissionadoC,
    CASE WHEN preDoc.modalidadeFrete = ' ' THEN '9' ELSE preDoc.modalidadeFrete END,
    CASE WHEN preDoc.tipoPagamentoFrete = ' ' THEN 'N' ELSE preDoc.tipoPagamentoFrete END,
    preDoc.transportadora,
    preDoc.enderecoTransportadora,
    preDoc.motorista,
    preDoc.placa,
    preDoc.vagao,
    preDoc.balsa,
    preDoc.quantidadeVolume,
    preDoc.especieVolume,
    preDoc.descricaoMarca,
    preDoc.numeracaoVolume,
    preDoc.codigoIntegracao,
    preDoc.atendimento,
    '0' tipoCTe,
    0 idContingenciaNfe,
    0 codigoNumericoNfe,
    0 digitoVerificadorNfe,
    ' ' formaEmissaoNfe,
    est.indicadorAmbienteNfe,
    ' ' qrCode,
    ' ' chaveNfe,
    11 situacaoDocumentoFiscal,
    preDoc.ultimoVendedorItem,
    preDoc.quantidade,
    preDoc.pesoLiquido,
    preDoc.pesoBruto,
    preDoc.valorProdutosBruto,
    preDoc.valorProdutos,
    preDoc.valorDescontoProdutos,
    preDoc.valorAcrescimoProdutos,
    preDoc.valorServicosBruto,
    preDoc.valorServicos,
    preDoc.valorDescontoServicos,
    preDoc.valorAcrescimoServicos,
    preDoc.valorFreteItem,
    preDoc.valorSeguroItem,
    preDoc.valorAdicFreteMarinhaMerItem,
    preDoc.valorDespesasAduaneirasItem,
    preDoc.valorFreteGeral,
    preDoc.valorSeguroGeral,
    preDoc.valorDescontoGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorDescontoPagamento END,
    preDoc.valorOutrasDespesasGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorOutrasDespesasPagamento + preDoc.valorJurosPagamento END,
    preDoc.valorAdicFreteMarinhaMerGeral,
    preDoc.valorDespesasAduaneirasGeral,
    preDoc.condicaoPagamento,
    preDoc.contaFinanceira,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.numeroParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.somaPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorXPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedio ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedioPonderado ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorBasePagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaMinimo ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorEntradaMinima ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaEntrada ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoBruto ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorDescontoPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorOutrasDespesasPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorJurosPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoLiquido ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorTroco ELSE 0 END,
    preDoc.valorFreteTotal,
    preDoc.valorSeguroTotal,
    preDoc.valorDescontoTotal,
    preDoc.valorOutrasDespesasTotal,
    preDoc.valorAdicFreteMarinhaMerTotal,
    preDoc.valorDespesasAduaneirasTotal,
    preDoc.impostosEditados,
    preDoc.valorImpostosSomaPagamento,
    preDoc.valorImpostosDiminuiPagamento,
    preDoc.valorLiquidoItem,
    preDoc.valorDescontoCustoOpItem,
    preDoc.valorDescontoCustoOpGeral,
    preDoc.valorDescontoCustoOpTotal,
    preDoc.valorAcrescimoCustoOpItem,
    preDoc.valorAcrescimoCustoOpGeral,
    preDoc.valorAcrescimoCustoOpTotal,
    preDoc.valorCustoOperacao,
    preDoc.valorCMV,
    preDoc.quantidadeExtemporanea,
    preDoc.valorAcrescimoExtempSubtotal,
    preDoc.valorAcrescimoExtempItem,
    preDoc.valorAcrescimoExtempGeral,
    preDoc.valorAcrescimoExtempTotal,
    p_versaoAplicativo
  FROM MOPREDOCUMENTOS preDoc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = preDoc.estabelecimento
  WHERE preDoc.preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXPERSPROJETO (
    idPersonProjetoDocFiscal,
    idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPERSPROJETO', 'idPersonProjetoDocFiscal', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo
  FROM MOPREDOCUMXPERSPROJETO
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXINFOCOMPLEMEN (
    id,
    idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXINFOCOMPLEMEN', 'id', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar
  FROM MOPREDOCUMXINFOCOMPLENT
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXPROMOCOES (
    id,
    idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    idItemDocFiscal,
    idPagamentoDocFiscal,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    0,
    0,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes
  FROM MOPREDOCUMXPROMOCOES
  WHERE preDocumento = p_preDocumento
  AND idItemPreDocumento = 0
  AND idPagamentoPreDocumento = 0;
  v_sequenciaItem := 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0 THEN
      v_sequenciaItem := v_sequenciaItem + 1;
        INSERT INTO MODOCFISCALXITENS (
        idItemDocFiscal,
        idDocumentoFiscal,
        sequencia,
        cancelado,
        pedidoCompraFornecedor,
        sequenciaPedidoCompraFornec,
        modeloDocumento,
        estabelecimentoOriginal,
        vendedor,
        gradeProduto,
        idFormulaTinta,
        personalizacao,
        idLoteEstoque,
        localEstoque,
        pessoaParticipante,
        controleQuantidade,
        unidadeMedidaConversao,
        conversorQuantidade,
        loteMinimo,
        loteMultiplo,
        altura,
        largura,
        comprimento,
        pecas,
        quantidade,
        quantidadeConvertida,
        quantidadeDevolvidaRetornada,
        pesoLiquido,
        pesoBruto,
        tipoPreco,
        tabelaPreco,
        precoSugestaoAPrazo,
        precoSugestaoAVista,
        precoDesconto,
        precoMinimo,
        usarPrecoAVista,
        precoUnitarioBruto,
        acrescimoUnitarioComposicao,
        precoUnitario,
        precoUnitarioConvertido,
        valorProdutoServicoBruto,
        valorProdutoServico,
        percDescontoItem,
        valorDescontoItem,
        percAcrescimoItem,
        valorAcrescimoItem,
        valorFreteItem,
        valorSeguroItem,
        valorAdicFreteMarinhaMerItem,
        valorDespesasAduaneirasItem,
        quantidadeExtemporanea,
        acrescimoUnitarioExtemporaneo,
        valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempItem,
        valorDescontoCustoOpItem,
        valorAcrescimoCustoOpItem,
        observacoesDigitadas,
        observacoes,
        valorFreteGeral,
        valorSeguroGeral,
        valorDescontoGeral,
        valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral,
        valorDespesasAduaneirasGeral,
        valorAcrescimoExtempGeral,
        valorDescontoCustoOpGeral,
        valorAcrescimoCustoOpGeral,
        valorDescontoPagamento,
        valorOutrasDespesasPagamento,
        valorJurosPagamento,
        valorFreteTotal,
        valorSeguroTotal,
        valorDescontoTotal,
        valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal,
        valorDespesasAduaneirasTotal,
        valorAcrescimoExtempTotal,
        valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpTotal,
        percentualDevolucao,
        valorIPIDevolucao,
        operacaoFiscal,
        movimentaEstoque,
        movimentaEstoqueFiscal,
        geraFinanceiro,
        cfop,
        indicadorISSQN,
        aliquotaISSQN,
        retidoISSQN,
        tributadoForaMunicipio,
        incentivoFiscal,
        listaServicos,
        cnae,
        idServicoMunicipio,
        numeroProcessoAdministrativo,
        retencaoIRRF,
        retencaoINSS,
        retencaoPIS,
        retencaoCOFINS,
        retencaoCSLL,
        retencaoOutros,
        aliquotaII,
        aliquotaIOF,
        codigoEnquadramentoIPI,
        stIPI,
        aliquotaIPI,
        valorAliquotaIPI,
        stPIS,
        aliquotaPIS,
        valorAliquotaPIS,
        aliquotaPISST,
        valorAliquotaPISST,
        stCOFINS,
        aliquotaCOFINS,
        valorAliquotaCOFINS,
        aliquotaCOFINSST,
        valorAliquotaCOFINSST,
        stSimplesNacional,
        creditoSimplesNacional,
        stICMS,
        modalidadeBaseCalcICMS,
        reducaoBaseICMS,
        aliquotaICMS,
        diferimentoICMS,
        motivoDesoneracaoICMS,
        idBeneficio,
        modalidadeBaseCalcICMSST,
        margemValorAdicionadoST,
        reducaoBaseST,
        aliquotaICMSST,
        aliquotaSTSuportConsFinal,
        reducaoBaseICMSEfetivo,
        aliquotaICMSEfetivo,
        stICMSEscrituracao,
        reducaoBaseICMSEscrituracao,
        aliquotaICMSEscrituracao,
        diferimentoICMSEscrituracao,
        margemValorAdicSTEscrituracao,
        reducaoBaseSTEscrituracao,
        aliquotaICMSSTEscrituracao,
        somarICMSST,
        aliquotaICMSUFDestinatario,
        aliquotaICMSInterestadual,
        partilhaICMSInterestadual,
        aliquotaFCP,
        aliquotaFCPST,
        aliquotaFCPSTAnteriormente,
        aliquotaFCPUFDestinatario,
        aliquotaEstimadaImpFederais,
        aliquotaEstimadaImpEstaduais,
        aliquotaEstimadaImpMunicipais,
        baseISSQN,
        valorISSQN,
        baseRetIRRF,
        valorRetIRRF,
        baseRetINSS,
        valorRetINSS,
        baseRetPIS,
        valorRetPIS,
        baseRetCOFINS,
        valorRetCOFINS,
        baseRetCSLL,
        valorRetCSLL,
        baseRetOutros,
        valorRetOutros,
        baseII,
        valorII,
        baseIOF,
        valorIOF,
        baseIPI,
        valorIPI,
        basePIS,
        valorPIS,
        basePISST,
        valorPISST,
        baseCOFINS,
        valorCOFINS,
        baseCOFINSST,
        valorCOFINSST,
        baseCreditoSimplesNacional,
        valorCreditoSimplesNacional,
        baseICMS,
        valorICMSOperacao,
        valorICMSDiferido,
        valorICMS,
        valorICMSDesoneracao,
        baseICMSST,
        valorICMSST,
        baseICMSSTAnteriormente,
        valorICMSSTAnteriormente,
        valorICMSProprioSubstituto,
        baseICMSEfetivo,
        valorICMSEfetivo,
        baseICMSEscrituracao,
        valorICMSEscrituracao,
        valorICMSDesonEscrituracao,
        baseICMSSTEscrituracao,
        valorICMSSTEscrituracao,
        baseICMSUFDestinatario,
        valorICMSUFDestinatario,
        baseICMSUFRemetente,
        valorICMSUFRemetente,
        baseFCP,
        valorFCP,
        baseFCPST,
        valorFCPST,
        baseFCPSTAnteriormente,
        valorFCPSTAnteriormente,
        baseFCPUFDestinatario,
        valorFCPUFDestinatario,
        baseEstimadaImpostos,
        valorEstimadoImpFederais,
        valorEstimadoImpEstaduais,
        valorEstimadoImpMunicipais,
        valorBasePagamento,
        valorLiquidoItem,
        precoCustoOperacao,
        valorCustoOperacao,
        precoCMV,
        valorCMV)
      VALUES (
        itens.idItemDocFiscal,
        r_idDocumentoFiscal,
        itens.sequencia,
        itens.cancelado,
        itens.pedidoCompraFornecedor,
        itens.sequenciaPedidoCompraFornec,
        itens.modeloDocumento,
        itens.estabelecimentoOriginal,
        itens.vendedor,
        itens.gradeProduto,
        itens.idFormulaTinta,
        itens.personalizacao,
        itens.idLoteEstoque,
        itens.localEstoque,
        itens.pessoaParticipante,
        itens.controleQuantidade,
        itens.unidadeMedidaConversao,
        itens.conversorQuantidade,
        itens.loteMinimo,
        itens.loteMultiplo,
        itens.altura,
        itens.largura,
        itens.comprimento,
        itens.pecas,
        itens.quantidade,
        itens.quantidadeConvertida,
        0,
        itens.pesoLiquido,
        itens.pesoBruto,
        itens.tipoPreco,
        itens.tabelaPreco,
        itens.precoSugestaoAPrazo,
        itens.precoSugestaoAVista,
        itens.precoDesconto,
        itens.precoMinimo,
        itens.usarPrecoAVista,
        itens.precoUnitarioBruto,
        itens.acrescimoUnitarioComposicao,
        itens.precoUnitario,
        itens.precoUnitarioConvertido,
        itens.valorProdutoServicoBruto,
        itens.valorProdutoServico,
        itens.percDescontoItem,
        itens.valorDescontoItem,
        itens.percAcrescimoItem,
        itens.valorAcrescimoItem,
        itens.valorFreteItem,
        itens.valorSeguroItem,
        itens.valorAdicFreteMarinhaMerItem,
        itens.valorDespesasAduaneirasItem,
        itens.quantidadeExtemporanea,
        itens.acrescimoUnitarioExtemporaneo,
        itens.valorAcrescimoExtempSubtotal,
        itens.valorAcrescimoExtempItem,
        itens.valorDescontoCustoOpItem,
        itens.valorAcrescimoCustoOpItem,
        itens.observacoesDigitadas,
        itens.observacoes,
        itens.valorFreteGeral,
        itens.valorSeguroGeral,
        itens.valorDescontoGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorDescontoPagamento
        END,
        itens.valorOutrasDespesasGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorOutrasDespesasPagamento + itens.valorJurosPagamento
        END,
        itens.valorAdicFreteMarinhaMerGeral,
        itens.valorDespesasAduaneirasGeral,
        itens.valorAcrescimoExtempGeral,
        itens.valorDescontoCustoOpGeral,
        itens.valorAcrescimoCustoOpGeral,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorDescontoPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorOutrasDespesasPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorJurosPagamento
          ELSE 0
        END,
        itens.valorFreteTotal,
        itens.valorSeguroTotal,
        itens.valorDescontoTotal,
        itens.valorOutrasDespesasTotal,
        itens.valorAdicFreteMarinhaMerTotal,
        itens.valorDespesasAduaneirasTotal,
        itens.valorAcrescimoExtempTotal,
        itens.valorDescontoCustoOpTotal,
        itens.valorAcrescimoCustoOpTotal,
        itens.percentualDevolucao,
        itens.valorIPIDevolucao,
        itens.operacaoFiscal,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.movimentaEstoque
          ELSE 0
        END,
        itens.movimentaEstoque,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.geraFinanceiro
          ELSE 0
        END,
        itens.cfop,
        itens.indicadorISSQN,
        itens.aliquotaISSQN,
        itens.retidoISSQN,
        itens.tributadoForaMunicipio,
        itens.incentivoFiscal,
        itens.listaServicos,
        itens.cnae,
        itens.idServicoMunicipio,
        itens.numeroProcessoAdministrativo,
        itens.retencaoIRRF,
        itens.retencaoINSS,
        itens.retencaoPIS,
        itens.retencaoCOFINS,
        itens.retencaoCSLL,
        itens.retencaoOutros,
        itens.aliquotaII,
        itens.aliquotaIOF,
        itens.codigoEnquadramentoIPI,
        itens.stIPI,
        itens.aliquotaIPI,
        itens.valorAliquotaIPI,
        itens.stPIS,
        itens.aliquotaPIS,
        itens.valorAliquotaPIS,
        itens.aliquotaPISST,
        itens.valorAliquotaPISST,
        itens.stCOFINS,
        itens.aliquotaCOFINS,
        itens.valorAliquotaCOFINS,
        itens.aliquotaCOFINSST,
        itens.valorAliquotaCOFINSST,
        itens.stSimplesNacional,
        itens.creditoSimplesNacional,
        itens.stICMS,
        itens.modalidadeBaseCalcICMS,
        itens.reducaoBaseICMS,
        itens.aliquotaICMS,
        itens.diferimentoICMS,
        itens.motivoDesoneracaoICMS,
        itens.idBeneficio,
        itens.modalidadeBaseCalcICMSST,
        itens.margemValorAdicionadoST,
        itens.reducaoBaseST,
        itens.aliquotaICMSST,
        itens.aliquotaSTSuportConsFinal,
        itens.reducaoBaseICMSEfetivo,
        itens.aliquotaICMSEfetivo,
        itens.stICMSEscrituracao,
        itens.reducaoBaseICMSEscrituracao,
        itens.aliquotaICMSEscrituracao,
        itens.diferimentoICMSEscrituracao,
        itens.margemValorAdicSTEscrituracao,
        itens.reducaoBaseSTEscrituracao,
        itens.aliquotaICMSSTEscrituracao,
        itens.somarICMSST,
        itens.aliquotaICMSUFDestinatario,
        itens.aliquotaICMSInterestadual,
        itens.partilhaICMSInterestadual,
        itens.aliquotaFCP,
        itens.aliquotaFCPST,
        itens.aliquotaFCPSTAnteriormente,
        itens.aliquotaFCPUFDestinatario,
        itens.aliquotaEstimadaImpFederais,
        itens.aliquotaEstimadaImpEstaduais,
        itens.aliquotaEstimadaImpMunicipais,
        itens.baseISSQN,
        itens.valorISSQN,
        itens.baseRetIRRF,
        itens.valorRetIRRF,
        itens.baseRetINSS,
        itens.valorRetINSS,
        itens.baseRetPIS,
        itens.valorRetPIS,
        itens.baseRetCOFINS,
        itens.valorRetCOFINS,
        itens.baseRetCSLL,
        itens.valorRetCSLL,
        itens.baseRetOutros,
        itens.valorRetOutros,
        itens.baseII,
        itens.valorII,
        itens.baseIOF,
        itens.valorIOF,
        itens.baseIPI,
        itens.valorIPI,
        itens.basePIS,
        itens.valorPIS,
        itens.basePISST,
        itens.valorPISST,
        itens.baseCOFINS,
        itens.valorCOFINS,
        itens.baseCOFINSST,
        itens.valorCOFINSST,
        itens.baseCreditoSimplesNacional,
        itens.valorCreditoSimplesNacional,
        itens.baseICMS,
        itens.valorICMSOperacao,
        itens.valorICMSDiferido,
        itens.valorICMS,
        itens.valorICMSDesoneracao,
        itens.baseICMSST,
        itens.valorICMSST,
        itens.baseICMSSTAnteriormente,
        itens.valorICMSSTAnteriormente,
        itens.valorICMSProprioSubstituto,
        itens.baseICMSEfetivo,
        itens.valorICMSEfetivo,
        itens.baseICMSEscrituracao,
        itens.valorICMSEscrituracao,
        itens.valorICMSDesonEscrituracao,
        itens.baseICMSSTEscrituracao,
        itens.valorICMSSTEscrituracao,
        itens.baseICMSUFDestinatario,
        itens.valorICMSUFDestinatario,
        itens.baseICMSUFRemetente,
        itens.valorICMSUFRemetente,
        itens.baseFCP,
        itens.valorFCP,
        itens.baseFCPST,
        itens.valorFCPST,
        itens.baseFCPSTAnteriormente,
        itens.valorFCPSTAnteriormente,
        itens.baseFCPUFDestinatario,
        itens.valorFCPUFDestinatario,
        itens.baseEstimadaImpostos,
        itens.valorEstimadoImpFederais,
        itens.valorEstimadoImpEstaduais,
        itens.valorEstimadoImpMunicipais,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorBasePagamento
          ELSE 0
        END,
        itens.valorLiquidoItem,
        itens.precoCustoOperacao,
        itens.valorCustoOperacao,
        itens.precoCMV,
        itens.valorCMV);
      INSERT INTO MODOCFISCALXCOMPOSICOESPR (
        id,
        idItemDocFiscal,
        composicaoPreco,
        selecionado,
        quantidade,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCOMPOSICOESPR', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.composicaoPreco,
        x.selecionado,
        x.quantidade,
        x.observacoes
      FROM MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXEMBALAGENSTIN (
        idEmbalagemTintaDocFiscal,
        idItemDocFiscal,
        embalagemTinta,
        quantidade,
        quantidadeSaldo,
        quantidadeConferida,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXEMBALAGENSTIN', 'idEmbalagemTintaDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.embalagemTinta,
        x.quantidade,
        x.quantidadeSaldo,
        x.quantidadeConferida,
        x.observacoes
      FROM MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXNUMEROSSERIE (
        idNumeroSerieDocFiscal,
        idItemDocFiscal,
        gradeProduto,
        idNumeroSerie,
        devolvidoRetornado)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.gradeProduto,
        x.idNumeroSerie,
        x.devolvidoRetornado
      FROM MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXCENTROSCUSTOS (
        idCentroCustoDocFiscal,
        idItemDocFiscal,
        idCentroCusto,
        percentualRateio)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.idCentroCusto,
        x.percentualRateio
      FROM MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROJETOS (id,
        idItemDocFiscal,
        projeto)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROJETOS', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.projeto
      FROM MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        itens.sequencia,
        itens.idItemDocFiscal,
        0,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    END IF;
    FOR mot IN c_mot_item
    LOOP
      IF mot.idItemPreDocumento = itens.idItemPreDocumento THEN
        INSERT INTO MOMOTIVOSBLOQUEIOS (
          idMotivoBloqueioDocumento,
          origem,
          idCabecalho,
          tipoDocumento,
          idDocumento,
          estabelecimento,
          pessoa,
          cabecalhoItemPagamento,
          sequencia,
          condicaoPagamento,
          vendedor,
          gradeProduto,
          unidadeMedidaConversao,
          quantidadeConvertida,
          valorLiquido,
          motivoBloqueioDocumento,
          dataBloqueio,
          baseBloqueado,
          valorBloqueado,
          percentualBloqueado,
          situacaoLiberacao,
          observacoes)
        SELECT
          mot.idMotivoBloqueioNovo,
          'D',
          r_idDocumentoFiscal,
          v_tipoDocumento,
          v_documentoFiscal,
          v_estabelecimento,
          v_pessoa,
          a.cabecalhoItemPagamento,
          itens.sequencia,
          a.condicaoPagamento,
          a.vendedor,
          a.gradeProduto,
          a.unidadeMedidaConversao,
          a.quantidadeConvertida,
          a.valorLiquido,
          a.motivoBloqueioDocumento,
          a.dataBloqueio,
          a.baseBloqueado,
          a.valorBloqueado,
          a.percentualBloqueado,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTIVOSBLOQUEIOS a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        INSERT INTO MOMOTBLOQXDOCFISCALITENS (
          id,
          idMotivoBloqueioDocumento,
          idItemDocFiscal)
        VALUES (
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALITENS', 'id', 0, p_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          itens.idItemDocFiscal);
        INSERT INTO MOMOTBLOQXLIBERACOES (
          id,
          idMotivoBloqueioDocumento,
          usuario,
          dataLiberacao,
          valorLiberado,
          percentualLiberado,
          percentualAlcada,
          situacaoLiberacao,
          observacoes)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          a.usuario,
          a.dataLiberacao,
          a.valorLiberado,
          a.percentualLiberado,
          a.percentualAlcada,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTBLOQXLIBERACOES a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        IF v_excluirPreDoc = 1 THEN
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMITENS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END IF;
    END LOOP;
    IF v_excluirPreDoc = 1 THEN
      IF itens.cancelado = 0 THEN
        INSERT INTO MODOCFISCALXORCAMENTOITEM (
          id,
          idItemDocFiscal,
          idItemOrcamento,
          quantidade,
          efetivacao)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemOrcamento,
          x.quantidade,
          x.efetivacao
        FROM MOPREDOCUMXORCAMENTOITEM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOPREDOCUMXDOCFISCAL (
          id,
          idItemPreDocumento,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idItemPreDocumento,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXPREDOCUM (
          id,
          idItemDocFiscal,
          idItemPreDocReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemPreDocReferenciado,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idItemDocFiscal,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCFISCALXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemDocFiscalReferenciado,
          x.quantidade
        FROM MOPREDOCUMXDOCFISCAL x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCTRANSFXDOCFISCAL (
          id,
          entradaSaidaOriginal,
          idItemDocTransferencia,
          idItemDocFiscal,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCTRANSFXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.entradaSaidaOriginal,
          x.idItemDocTransferencia,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCTRANSFXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXESTOQUE (
          id,
          idItemDocFiscal,
          idEstoque)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXESTOQUE', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idEstoque
        FROM MOPREDOCUMXESTOQUE x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOVALEDESCXITEMDOCFISCAL (
          id,
          idValeDesconto,
          idItemDocFiscal)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXITEMDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idValeDesconto,
          itens.idItemDocFiscal
        FROM MOVALEDESCXITEMPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      END IF;
      UPDATE MODOCTROCAXITENS x SET
        x.idItemPreDocumentoSaida = 0,
        x.idItemDocFiscalSaida = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoSaida = itens.idItemPreDocumento;
      UPDATE MOENTREGAS x SET
        x.idItemPreDocumentoRemessa = 0,
        x.idItemDocFiscalRemessa = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoRemessa = itens.idItemPreDocumento;
      UPDATE MOINGRESSOS x SET
        x.idItemPreDocumento = 0,
        x.idItemDocFiscal = itens.idItemDocFiscal
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXESTOQUE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPRODUTOFILHO x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MODOCFISCALXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXDOCFISCAL x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MODOCTRANSFXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXORCAMENTOITEM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOVALEDESCXITEMPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    ELSIF itens.cancelado = 0 THEN
      INSERT INTO MODOCFISCALXPREDOCUM (
        id,
        idItemDocFiscal,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        itens.idItemPreDocumento,
        itens.quantidade);
    END IF;
  END LOOP;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      0,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXDOCUMENTOSFISC (
      id,
      idMotivoBloqueioDocumento,
      idDocumentoFiscal)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      r_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTBLOQXPREDOCUMENTOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  FOR mot IN c_mot_pag2
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      a.sequencia,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  IF v_excluirPreDoc = 1 THEN
    FOR pagtos IN (
      SELECT
        idPagamentoPreDocumento,
        FUNC_ADD_BUSCA_PROXIMO_ID (
          'MODOCFISCALXPAGAMENTOS',
          'idPagamentoDocFiscal',
          0,
          p_estabelecimentoAtivo,
          NULL) idPagamentoDocFiscal,
        pagamentoTroco,
        sequencia,
        indicadorFormaPagamento,
        meioPagamento,
        condicaoPagamento,
        cobranca,
        numeroParcelas,
        somaPrazoParcelas,
        valorXPrazoParcelas,
        prazoMedio,
        prazoMedioPonderado,
        valorEntradaMinima,
        valorPagamentoBruto,
        percDescontoPagamento,
        valorDescontoPagamento,
        percOutrasDespesasPagamento,
        valorOutrasDespesasPagamento,
        fatorJurosPagamento,
        valorJurosPagamento,
        valorPagamentoImpostosSoma,
        valorPagamentoImpostosDiminui,
        valorPagamentoLiquido,
        valorFinanceiro,
        observacoes
      FROM MOPREDOCUMXPAGAMENTOS
      WHERE preDocumento = p_preDocumento
      ORDER BY
        pagamentoTroco,
        sequencia)
    LOOP
      INSERT INTO MODOCFISCALXPAGAMENTOS (
        idPagamentoDocFiscal,
        idDocumentoFiscal,
        pagamentoTroco,
        sequencia,
        indicadorFormaPagamento,
        meioPagamento,
        condicaoPagamento,
        cobranca,
        numeroParcelas,
        somaPrazoParcelas,
        valorXPrazoParcelas,
        prazoMedio,
        prazoMedioPonderado,
        valorEntradaMinima,
        valorPagamentoBruto,
        percDescontoPagamento,
        valorDescontoPagamento,
        percOutrasDespesasPagamento,
        valorOutrasDespesasPagamento,
        fatorJurosPagamento,
        valorJurosPagamento,
        valorPagamentoImpostosSoma,
        valorPagamentoImpostosDiminui,
        valorPagamentoLiquido,
        valorFinanceiro,
        observacoes)
      VALUES (
        pagtos.idPagamentoDocFiscal,
        r_idDocumentoFiscal,
        pagtos.pagamentoTroco,
        pagtos.sequencia,
        pagtos.indicadorFormaPagamento,
        pagtos.meioPagamento,
        pagtos.condicaoPagamento,
        pagtos.cobranca,
        pagtos.numeroParcelas,
        pagtos.somaPrazoParcelas,
        pagtos.valorXPrazoParcelas,
        pagtos.prazoMedio,
        pagtos.prazoMedioPonderado,
        pagtos.valorEntradaMinima,
        pagtos.valorPagamentoBruto,
        pagtos.percDescontoPagamento,
        pagtos.valorDescontoPagamento,
        pagtos.percOutrasDespesasPagamento,
        pagtos.valorOutrasDespesasPagamento,
        pagtos.fatorJurosPagamento,
        pagtos.valorJurosPagamento,
        pagtos.valorPagamentoImpostosSoma,
        pagtos.valorPagamentoImpostosDiminui,
        pagtos.valorPagamentoLiquido,
        pagtos.valorFinanceiro,
        pagtos.observacoes);
      UPDATE MOPREVFINANCXFINANCEIRO x SET
      x.preDocumento = 0,
      x.idDocumentoFiscal = r_idDocumentoFiscal
      WHERE EXISTS (
        SELECT 1
        FROM MOFINANCEIROS y
        WHERE y.idFinanceiro = x.idFinanceiro
        AND y.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento);
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal),
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      UPDATE MOTRANSACOESTEF x SET
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        x.sequencia,
        0,
        pagtos.idPagamentoDocFiscal,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      FOR mot IN c_mot_pag
      LOOP
        IF mot.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (
            idMotivoBloqueioDocumento,
            origem,
            idCabecalho,
            tipoDocumento,
            idDocumento,
            estabelecimento,
            pessoa,
            cabecalhoItemPagamento,
            sequencia,
            condicaoPagamento,
            vendedor,
            gradeProduto,
            unidadeMedidaConversao,
            quantidadeConvertida,
            valorLiquido,
            motivoBloqueioDocumento,
            dataBloqueio,
            baseBloqueado,
            valorBloqueado,
            percentualBloqueado,
            situacaoLiberacao,
            observacoes)
          SELECT
            mot.idMotivoBloqueioNovo,
            'D',
            r_idDocumentoFiscal,
            v_tipoDocumento,
            v_documentoFiscal,
            v_estabelecimento,
            v_pessoa,
            a.cabecalhoItemPagamento,
            pagtos.sequencia,
            a.condicaoPagamento,
            a.vendedor,
            a.gradeProduto,
            a.unidadeMedidaConversao,
            a.quantidadeConvertida,
            a.valorLiquido,
            a.motivoBloqueioDocumento,
            a.dataBloqueio,
            a.baseBloqueado,
            a.valorBloqueado,
            a.percentualBloqueado,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXDOCFISCALPAGAM (
            id,
            idMotivoBloqueioDocumento,
            idPagamentoDocFiscal)
          VALUES (
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALPAGAM', 'id', 0, p_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            pagtos.idPagamentoDocFiscal);
          INSERT INTO MOMOTBLOQXLIBERACOES (
            id,
            idMotivoBloqueioDocumento,
            usuario,
            dataLiberacao,
            valorLiberado,
            percentualLiberado,
            percentualAlcada,
            situacaoLiberacao,
            observacoes)
          SELECT
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            a.usuario,
            a.dataLiberacao,
            a.valorLiberado,
            a.percentualLiberado,
            a.percentualAlcada,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMPAGAM a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a WHERE
          a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END LOOP;
    INSERT INTO MOBAIXAFINANCXDOCFISCAL (
      id,
      idBaixaFinanceiro,
      idDocumentoFiscal)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOBAIXAFINANCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
      x.idBaixaFinanceiro,
      r_idDocumentoFiscal
    FROM MOBAIXAFINANCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MOVALEDESCXDOCFISCAL (
      id,
      idValeDesconto,
      idDocumentoFiscal,
      valor)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
      x.idValeDesconto,
      r_idDocumentoFiscal,
      x.valor
    FROM MOVALEDESCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MODOCFISCALXBLOQUEIOSEST (
      id,
      idDocumentoFiscal,
      sequencia,
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXBLOQUEIOSEST', 'id', 0, p_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.sequencia,
      x.dataBloqueio,
      x.estabelecimento,
      x.localEstoque,
      x.pessoaParticipante,
      x.gradeProduto,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.quantidade,
      x.quantidadeEstoque,
      x.quantidadeReservas,
      x.situacaoLiberacao,
      x.usuarioLiberacao,
      x.dataLiberacao,
      x.observacoes
    FROM MOPREDOCUMXBLOQUEIOSEST x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MODOCFISCALXCONFERENCIAS (
      id,
      idDocumentoFiscal,
      documentoTransferencia,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      codigoErro,
      quantidadeConferida,
      encerrado,
      idItemDocTransferencia,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCONFERENCIAS', 'id', 0, p_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.documentoTransferencia,
      x.gradeProduto,
      x.idFormulaTinta,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.codigoErro,
      x.quantidadeConferida,
      x.encerrado,
      x.idItemDocTransferencia,
      x.observacoes
    FROM MOPREDOCUMXCONFERENCIAS x
    WHERE x.preDocumento = p_preDocumento;
    DELETE MOBAIXAFINANCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPERSPROJETO
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXINFOCOMPLENT
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_preDocumento
    AND idItemPreDocumento = 0
    AND idPagamentoPreDocumento = 0;
    DELETE MOVALEDESCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXBLOQUEIOSEST
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXCONFERENCIAS
    WHERE preDocumento = p_preDocumento;
    UPDATE MOPREVFINANCXFINANCEIRO SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXCOMISSOES SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXDOCUMENTOS SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOEVENTOS SET
      tabelaSistema = 'MODOCUMENTOSFISCAIS',
      id = r_idDocumentoFiscal
    WHERE tabelaSistema = 'MOPREDOCUMENTOS'
    AND id = p_preDocumento;
    DELETE MOPREDOCUMXPAGAMENTOS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXSTATUS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  ELSE
    UPDATE MOPREDOCUMENTOS
    SET statusPreDocumento = 'F'
    WHERE preDocumento = p_preDocumento;
    FOR pagtos IN (
      SELECT idPagamentoPreDocumento
      FROM MOPREDOCUMXPAGAMENTOS
      WHERE preDocumento = p_preDocumento)
    LOOP
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal)
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ROT_EFET_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_ORCAMENT (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_sessao                       IN NUMBER,
  p_idTerminalSiTef              IN VARCHAR2,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_1_NFCe_2_ConsFinal_3_NF      IN VARCHAR2,
  p_orcamento                    IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_nfFornecedor                 IN NUMBER,
  p_idSerieFiscal                IN NUMBER,
  p_serieFiscal                  IN VARCHAR2,
  p_subSerieFiscal               IN NUMBER,
  p_modeloDocumentoFiscal        IN VARCHAR2,
  p_documentoFiscal              IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_timezone                     IN VARCHAR2,
  p_dataEntradaSaida             IN DATE,
  p_comissionadoB                IN NUMBER,
  p_comissionadoC                IN NUMBER,
  p_chaveNfe                     IN VARCHAR2,
  p_novaEtapaOrcamento           IN NUMBER,
  p_versaoAplicativo             IN VARCHAR2,
  r_idDocumentoFiscal            OUT NUMBER)
IS
  v_tipoDocumento          NUMBER;
  v_fatoContabil           NUMBER;
  v_idDocumentoFiscal      NUMBER;
  v_estabelecimento        NUMBER;
  v_pessoa                 NUMBER;
  v_colaboradorResponsavel NUMBER;
  v_documentoFiscal        NUMBER;
  CURSOR c_itens IS
    SELECT
      item.idItemOrcamento,
      CASE
        WHEN cancelado = 0
        THEN FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXITENS', 'idItemDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL)
        ELSE 0
      END idItemDocFiscal,
      item.sequencia,
      item.cancelado,
      item.pedidoCompraFornecedor,
      item.sequenciaPedidoCompraFornec,
      item.modeloDocumento,
      item.vendedor,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.controleQuantidade,
      item.unidadeMedidaConversao,
      item.conversorQuantidade,
      item.loteMinimo,
      item.loteMultiplo,
      item.altura,
      item.largura,
      item.comprimento,
      item.pecas,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.tipoPreco,
      item.tabelaPreco,
      item.precoSugestaoAPrazo,
      item.precoSugestaoAVista,
      item.precoDesconto,
      item.precoMinimo,
      item.usarPrecoAVista,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.precoUnitarioConvertido,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.percDescontoItem,
      item.valorDescontoItem,
      item.percAcrescimoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.observacoesDigitadas,
      item.observacoes,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.operacaoFiscal,
      item.movimentaEstoque,
      item.movimentaEstoque movimentaEstoqueFiscal,
      item.geraFinanceiro,
      item.cfop,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      item.retidoISSQN,
      item.tributadoForaMunicipio,
      item.incentivoFiscal,
      item.listaServicos,
      item.cnae,
      item.idServicoMunicipio,
      item.numeroProcessoAdministrativo,
      item.retencaoIRRF,
      item.retencaoINSS,
      item.retencaoPIS,
      item.retencaoCOFINS,
      item.retencaoCSLL,
      item.retencaoOutros,
      item.aliquotaII,
      item.aliquotaIOF,
      item.codigoEnquadramentoIPI,
      item.stIPI,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      item.stPIS,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      item.stCOFINS,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      item.motivoDesoneracaoICMS,
      item.idBeneficio,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      item.aliquotaSTSuportConsFinal,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND prod.tipoProduto IN('07','08')
        THEN '90'
        WHEN p_nfFornecedor = 1 AND item.stICMS IN('10','30','70')
          OR p_nfFornecedor = 1 AND item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203')
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN '60'
        WHEN item.stICMS <> ' '
        THEN item.stICMS
        WHEN item.stSimplesNacional IN ('101','102') AND item.reducaoBaseICMS = 0
        THEN '00'
        WHEN item.stSimplesNacional IN ('101','102')
        THEN '20'
        WHEN item.stSimplesNacional IN ('103','300')
        THEN '40'
        WHEN item.stSimplesNacional IN ('201','202','203') AND item.reducaoBaseICMS = 0
        THEN '10' WHEN item.stSimplesNacional IN ('201','202','203')
        THEN '70' WHEN item.stSimplesNacional = '400'
        THEN '41'
        ELSE '90'
      END stICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.reducaoBaseICMS
        ELSE 0
      END reducaoBaseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.aliquotaICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.creditoSimplesNacional
        ELSE 0
      END aliquotaICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.diferimentoICMS
        ELSE 0
      END diferimentoICMSEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.margemValorAdicionadoST
      END margemValorAdicSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.reducaoBaseST
      END reducaoBaseSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.aliquotaICMSST
      END aliquotaICMSSTEscrituracao,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      item.aliquotaFCP,
      item.aliquotaFCPST,
      item.aliquotaFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      item.baseISSQN,
      item.valorISSQN,
      item.baseRetIRRF,
      item.valorRetIRRF,
      item.baseRetINSS,
      item.valorRetINSS,
      item.baseRetPIS,
      item.valorRetPIS,
      item.baseRetCOFINS,
      item.valorRetCOFINS,
      item.baseRetCSLL,
      item.valorRetCSLL,
      item.baseRetOutros,
      item.valorRetOutros,
      item.baseII,
      item.valorII,
      item.baseIOF,
      item.valorIOF,
      item.baseIPI,
      item.valorIPI,
      item.basePIS,
      item.valorPIS,
      item.basePISST,
      item.valorPISST,
      item.baseCOFINS,
      item.valorCOFINS,
      item.baseCOFINSST,
      item.valorCOFINSST,
      item.baseCreditoSimplesNacional,
      item.valorCreditoSimplesNacional,
      item.baseICMS,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMSProprioSubstituto,
      item.baseICMSEfetivo,
      item.valorICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' ' AND p_nfFornecedor = 1
        THEN ROUND(item.baseICMS *(1-item.diferimentoICMS/100),2)
        WHEN item.stICMS <> ' '
        THEN item.baseICMS
        WHEN item.stSimplesNacional IN ('101','201') AND item.baseCreditoSimplesNacional = 0
        THEN item.valorProdutoServico
          - item.valorDescontoTotal
          + item.valorOutrasDespesasTotal
          + item.valorAdicFreteMarinhaMerTotal
          + item.valorDespesasAduaneirasTotal
          + item.valorII
          + item.valorIOF
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.baseCreditoSimplesNacional
        ELSE 0
      END baseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.valorCreditoSimplesNacional
        ELSE 0
      END valorICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMSDesoneracao
        ELSE 0
      END valorICMSDesonEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.baseICMSST
      END baseICMSSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.valorICMSST
      END valorICMSSTEscrituracao,
      1 somarICMSST,
      item.baseICMSUFDestinatario,
      item.valorICMSUFDestinatario,
      item.baseICMSUFRemetente,
      item.valorICMSUFRemetente,
      item.baseFCP,
      item.valorFCP,
      item.baseFCPST,
      item.valorFCPST,
      item.baseFCPSTAnteriormente,
      item.valorFCPSTAnteriormente,
      item.baseFCPUFDestinatario,
      item.valorFCPUFDestinatario,
      item.baseEstimadaImpostos,
      item.valorEstimadoImpFederais,
      item.valorEstimadoImpEstaduais,
      item.valorEstimadoImpMunicipais,
      item.valorBasePagamento,
      item.valorLiquidoItem
    FROM MOORCAMENTOXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.orcamento = p_orcamento
    ORDER BY item.sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOS
    WHERE orcamento = p_orcamento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOORCAMENTOXITENS b ON b.idItemOrcamento = a.idItemOrcamento
    WHERE b.orcamento = p_orcamento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'O'
      AND a.idCabecalho = p_orcamento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXORCAMENTOPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
SELECT
  CASE
    WHEN orc.entradaSaida='E'
    THEN 601
    WHEN p_1_NFCe_2_ConsFinal_3_NF = '1'
    OR p_1_NFCe_2_ConsFinal_3_NF   = '2'
    THEN 503
    ELSE 501
  END,
  orc.estabelecimento,
  CASE
    WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
    THEN 0
    ELSE orc.pessoa
  END,
  CASE
    WHEN orc.tipoDocumento = 102
      AND orc.colaboradorResponsavel <> 0
      AND EXISTS (
        SELECT 1
        FROM CAVENDEDORES
        WHERE vendedor = orc.colaboradorResponsavel
        AND ativo = 1)
    THEN orc.colaboradorResponsavel
    ELSE 0
  END,
  CASE
    WHEN p_nfFornecedor = 1
    THEN p_documentoFiscal
    ELSE FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS|'
      || LPAD (orc.estabelecimento,4,'0')
      || '|'
      || LPAD (p_idSerieFiscal,14,'0'), ' ', 0, 0,TRUNC(p_dataEmissao))
  END
INTO v_tipoDocumento,
  v_estabelecimento,
  v_pessoa,
  v_colaboradorResponsavel,
  v_documentoFiscal
FROM MOORCAMENTOS orc
WHERE orcamento = p_orcamento;
  v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOFATOSCONTABEIS (
    fatoContabil,
    estabelecimento,
    data,
    ordenacao,
    situacaoTransacao,
    situacaoContabilizacao,
    sessao,
    observacoes)
  VALUES (
    v_fatoContabil,
    v_estabelecimento,
    p_dataEmissao,
    0,
    'A',
    'A',
    p_sessao,
    ' ');
  v_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS', 'idDocumentoFiscal', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    tipoVenda,
    modeloDocumento,
    entradaSaida,
    devolucaoAnulacaoRetorno,
    finalidadeNota,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    validoFaturamento,
    usarPrecoAVista,
    sessao,
    sessaoCaixa,
    fatoContabil,
    idTerminalSiTef,
    estabelecimentoOriginal,
    estabelecimento,
    enderecoRetiradaEstabeleciment,
    indicadorPresencaComprador,
    controlaSeparacaoConferencia,
    nfFornecedor,
    idSerieFiscal,
    serieFiscal,
    subserieFiscal,
    modeloDocumentoFiscal,
    documentoFiscal,
    dataEmissao,
    timezoneEmissao,
    dataEntradaSaida,
    pessoa,
    vendaConsumidor,
    indicadorPessoa,
    indicadorDocumentoPessoa,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    fone,
    indicadorFone,
    operadoraTelefonia,
    autorizadoPessoa,
    enderecoEntregaPessoa,
    municipioFatoGerador,
    localDestinoOperacao,
    indicadorConsumidorFinal,
    projeto,
    contratoCompra,
    comissionadoB,
    comissionadoC,
    modalidadeFrete,
    tipoPagamentoFrete,
    transportadora,
    enderecoTransportadora,
    motorista,
    placa,
    vagao,
    balsa,
    quantidadeVolume,
    especieVolume,
    descricaoMarca,
    numeracaoVolume,
    codigoIntegracao,
    atendimento,
    tipoCTe,
    idContingenciaNfe,
    codigoNumericoNfe,
    digitoVerificadorNfe,
    formaEmissaoNfe,
    indicadorAmbienteNfe,
    qrCode,
    chaveNfe,
    situacaoDocumentoFiscal,
    ultimoVendedorItem,
    quantidade,
    pesoLiquido,
    pesoBruto,
    valorProdutosBruto,
    valorProdutos,
    valorDescontoProdutos,
    valorAcrescimoProdutos,
    valorServicosBruto,
    valorServicos,
    valorDescontoServicos,
    valorAcrescimoServicos,
    valorFreteItem,
    valorSeguroItem,
    valorAdicFreteMarinhaMerItem,
    valorDespesasAduaneirasItem,
    valorFreteGeral,
    valorSeguroGeral,
    valorDescontoGeral,
    valorOutrasDespesasGeral,
    valorAdicFreteMarinhaMerGeral,
    valorDespesasAduaneirasGeral,
    condicaoPagamento,
    contaFinanceira,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorBasePagamento,
    valorAVistaMinimo,
    valorEntradaMinima,
    valorAVistaEntrada,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorTroco,
    valorFreteTotal,
    valorSeguroTotal,
    valorDescontoTotal,
    valorOutrasDespesasTotal,
    valorAdicFreteMarinhaMerTotal,
    valorDespesasAduaneirasTotal,
    impostosEditados,
    valorImpostosSomaPagamento,
    valorImpostosDiminuiPagamento,
    valorLiquidoItem,
    valorDescontoCustoOpItem,
    valorDescontoCustoOpGeral,
    valorDescontoCustoOpTotal,
    valorAcrescimoCustoOpItem,
    valorAcrescimoCustoOpGeral,
    valorAcrescimoCustoOpTotal,
    valorCustoOperacao,
    valorCMV,
    versaoAplicativo)
  SELECT
    v_idDocumentoFiscal,
    2,
    v_tipoDocumento,
    orc.tipoVenda,
    orc.modeloDocumento,
    orc.entradaSaida,
    0 devolucaoAnulacaoRetorno,
    orc.finalidadeNota,
    orc.atualizaCustoMedio,
    orc.atualizaUltimaCompra,
    orc.validoFaturamento,
    orc.usarPrecoAVista,
    p_sessao,
    p_sessaoCaixa,
    v_fatoContabil,
    p_idTerminalSiTef,
    orc.estabelecimento,
    orc.estabelecimento,
    orc.enderecoRetiradaEstabeleciment,
    orc.indicadorPresencaComprador,
    orc.controlaSeparacaoConferencia,
    p_nfFornecedor,
    p_idSerieFiscal,
    p_serieFiscal,
    p_subserieFiscal,
    p_modeloDocumentoFiscal,
    v_documentoFiscal,
    p_dataEmissao dataEmissao,
    p_timezone timezoneEmissao,
    p_dataEntradaSaida dataEntradaSaida,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE orc.pessoa END pessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 1 ELSE 0 END vendaConsumidor,
    'F' indicadorPessoa,
    'C' indicadorDocumentoPessoa,
    ' ' cnpjCpfIdEstrangeiro,
    ' ' nomeRazaoSocial,
    ' ' fone,
    0 indicadorFone,
    0 operadoraTelefonia,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE orc.autorizadoPessoa END autorizadoPessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE orc.enderecoEntregaPessoa END enderecoEntregaPessoa,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN COALESCE ((SELECT MAX(endEst.municipio) FROM CAENDERECOSPESSOA endEst WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1),0)
      ELSE orc.municipioFatoGerador
    END municipioFatoGerador,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE orc.localDestinoOperacao END localDestinoOperacao,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE orc.indicadorConsumidorFinal END indicadorConsumidorFinal,
    orc.projeto,
    orc.contratoCompra,
    p_comissionadoB comissionadoB,
    p_comissionadoC comissionadoC,
    CASE WHEN orc.modalidadeFrete = ' ' THEN '9' ELSE orc.modalidadeFrete END,
    CASE WHEN orc.tipoPagamentoFrete = ' ' THEN 'N' ELSE orc.tipoPagamentoFrete END,
    orc.transportadora,
    orc.enderecoTransportadora,
    orc.motorista,
    orc.placa,
    orc.vagao,
    orc.balsa,
    orc.quantidadeVolume,
    orc.especieVolume,
    orc.descricaoMarca,
    orc.numeracaoVolume,
    orc.codigoIntegracao,
    orc.atendimento,
    '0' tipoCTe,
    0 idContingenciaNfe,
    0 codigoNumericoNfe,
    0 digitoVerificadorNfe,
    ' ' formaEmissaoNfe,
    est.indicadorAmbienteNfe,
    ' ' qrCode,
    p_chaveNfe chaveNfe,
    11 situacaoDocumentoFiscal,
    CASE WHEN orc.ultimoVendedorItem = 0 THEN v_colaboradorResponsavel ELSE orc.ultimoVendedorItem END,
    orc.quantidade,
    orc.pesoLiquido,
    orc.pesoBruto,
    orc.valorProdutosBruto,
    orc.valorProdutos,
    orc.valorDescontoProdutos,
    orc.valorAcrescimoProdutos,
    orc.valorServicosBruto,
    orc.valorServicos,
    orc.valorDescontoServicos,
    orc.valorAcrescimoServicos,
    orc.valorFreteItem,
    orc.valorSeguroItem,
    orc.valorAdicFreteMarinhaMerItem,
    orc.valorDespesasAduaneirasItem,
    orc.valorFreteGeral,
    orc.valorSeguroGeral,
    orc.valorDescontoGeral,
    orc.valorOutrasDespesasGeral,
    orc.valorAdicFreteMarinhaMerGeral,
    orc.valorDespesasAduaneirasGeral,
    orc.condicaoPagamento,
    orc.contaFinanceira,
    0 numeroParcelas,
    0 somaPrazoParcelas,
    0 valorXPrazoParcelas,
    0 prazoMedio,
    0 prazoMedioPonderado,
    orc.valorBasePagamento,
    orc.valorAVistaMinimo,
    0 valorEntradaMinima,
    0 valorAVistaEntrada,
    0 valorPagamentoBruto,
    0 valorDescontoPagamento,
    0 valorOutrasDespesasPagamento,
    0 valorJurosPagamento,
    0 valorPagamentoLiquido,
    0 valorTroco,
    orc.valorFreteTotal,
    orc.valorSeguroTotal,
    orc.valorDescontoTotal - CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END,
    orc.valorOutrasDespesasTotal - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    orc.valorAdicFreteMarinhaMerTotal,
    orc.valorDespesasAduaneirasTotal,
    orc.impostosEditados,
    orc.valorImpostosSomaPagamento,
    orc.valorImpostosDiminuiPagamento,
    orc.valorLiquidoItem + CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    p_versaoAplicativo
  FROM MOORCAMENTOS orc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = orc.estabelecimento
  WHERE orcamento = p_orcamento;
  UPDATE MOORCAMENTOS SET etapaOrcamento = p_novaEtapaOrcamento WHERE orcamento = p_orcamento;
  INSERT INTO MOORCAMENTOXETAPAS (id, orcamento, data, usuario, etapaOrcamento, observacoes) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOORCAMENTOXETAPAS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), p_orcamento, sysdate, p_sys_usuarioLogado, p_novaEtapaOrcamento, ' ');
  INSERT INTO MODOCFISCALXPERSPROJETO (idPersonProjetoDocFiscal, idDocumentoFiscal, personalizacaoProjeto, conteudo) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPERSPROJETO', 'idPersonProjetoDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.personalizacaoProjeto, x.conteudo FROM MOORCAMENTOXPERSPROJETO x WHERE x.orcamento = p_orcamento;
  INSERT INTO MODOCFISCALXINFOCOMPLEMEN (id, idDocumentoFiscal, sequencia, geradoPeloSistema, imprimir, destaque, informacaoComplementar, descInformacaoComplementar) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXINFOCOMPLEMEN', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.sequencia, x.geradoPeloSistema, x.imprimir, x.destaque, x.informacaoComplementar, x.descInformacaoComplementar FROM MOORCAMENTOXINFOCOMPLENT x WHERE x.orcamento = p_orcamento;
  INSERT INTO MODOCFISCALXPROMOCOES (id, idDocumentoFiscal, cabecalhoItemPagamento, sequencia, idItemDocFiscal, idPagamentoDocFiscal, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.cabecalhoItemPagamento, x.sequencia, 0, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes
  FROM MOORCAMENTOXPROMOCOES x WHERE x.orcamento = p_orcamento AND x.idItemOrcamento = 0 AND x.idPagamentoOrcamento = 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0
    THEN
      INSERT INTO MODOCFISCALXITENS (idItemDocFiscal, idDocumentoFiscal, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorDescontoCustoOpItem, valorAcrescimoCustoOpItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorAcrescimoExtempGeral, valorDescontoCustoOpGeral, valorAcrescimoCustoOpGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, valorAcrescimoExtempTotal, valorDescontoCustoOpTotal, valorAcrescimoCustoOpTotal, percentualDevolucao, valorIPIDevolucao, operacaoFiscal, movimentaEstoque, movimentaEstoqueFiscal, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, diferimentoICMSEscrituracao, margemValorAdicSTEscrituracao, reducaoBaseSTEscrituracao, aliquotaICMSSTEscrituracao, somarICMSST, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSEscrituracao, valorICMSEscrituracao, valorICMSDesonEscrituracao, baseICMSSTEscrituracao, valorICMSSTEscrituracao, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV) VALUES (itens.idItemDocFiscal, v_idDocumentoFiscal, itens.sequencia, itens.cancelado, itens.pedidoCompraFornecedor, itens.sequenciaPedidoCompraFornec, itens.modeloDocumento, v_estabelecimento, CASE WHEN itens.vendedor = 0 THEN v_colaboradorResponsavel ELSE itens.vendedor END, itens.gradeProduto, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.localEstoque, itens.pessoaParticipante, itens.controleQuantidade, itens.unidadeMedidaConversao, itens.conversorQuantidade, itens.loteMinimo, itens.loteMultiplo, itens.altura, itens.largura, itens.comprimento, itens.pecas, itens.quantidade, itens.quantidadeConvertida, 0, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoUnitarioBruto, itens.acrescimoUnitarioComposicao, itens.precoUnitario, itens.precoUnitarioConvertido, itens.valorProdutoServicoBruto, itens.valorProdutoServico, itens.percDescontoItem, itens.valorDescontoItem, itens.percAcrescimoItem, itens.valorAcrescimoItem, itens.valorFreteItem, itens.valorSeguroItem, itens.valorAdicFreteMarinhaMerItem, itens.valorDespesasAduaneirasItem, 0, 0, 0, 0, 0, 0, itens.observacoesDigitadas, itens.observacoes, itens.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, 0, 0, 0, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, 0, 0, 0, 0, 0, itens.operacaoFiscal, itens.movimentaEstoque, itens. movimentaEstoqueFiscal,itens.geraFinanceiro, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.retidoISSQN, itens.tributadoForaMunicipio, itens.incentivoFiscal, itens.listaServicos, itens.cnae, itens.idServicoMunicipio, itens.numeroProcessoAdministrativo, itens.retencaoIRRF, itens.retencaoINSS, itens.retencaoPIS, itens.retencaoCOFINS, itens.retencaoCSLL, itens.retencaoOutros, itens.aliquotaII, itens.aliquotaIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.idBeneficio, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.stICMSEscrituracao, itens.reducaoBaseICMSEscrituracao, itens.aliquotaICMSEscrituracao, itens.diferimentoICMSEscrituracao, itens.margemValorAdicSTEscrituracao, itens.reducaoBaseSTEscrituracao, itens.aliquotaICMSSTEscrituracao, itens.somarICMSST, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.aliquotaFCP, itens.aliquotaFCPST, itens.aliquotaFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseISSQN, itens.valorISSQN, itens.baseRetIRRF, itens.valorRetIRRF, itens.baseRetINSS, itens.valorRetINSS, itens.baseRetPIS, itens.valorRetPIS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.baseRetCSLL, itens.valorRetCSLL, itens.baseRetOutros, itens.valorRetOutros, itens.baseII, itens.valorII, itens.baseIOF, itens.valorIOF, itens.baseIPI, itens.valorIPI, itens.basePIS, itens.valorPIS, itens.basePISST, itens.valorPISST, itens.baseCOFINS, itens.valorCOFINS, itens.baseCOFINSST, itens.valorCOFINSST, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.baseICMSEscrituracao, itens.valorICMSEscrituracao, itens.valorICMSDesonEscrituracao, itens.baseICMSSTEscrituracao, itens.valorICMSSTEscrituracao, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.baseFCP, itens.valorFCP, itens.baseFCPST, itens.valorFCPST, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorBasePagamento, itens.valorLiquidoItem, 0, 0, 0, 0);
      INSERT INTO MODOCFISCALXCOMPOSICOESPR (id, idItemDocFiscal, composicaoPreco, selecionado, quantidade, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCOMPOSICOESPR', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.composicaoPreco, x.selecionado, x.quantidade, x.observacoes FROM MOORCAMENTOXCOMPOSICOESPR x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXEMBALAGENSTIN (idEmbalagemTintaDocFiscal, idItemDocFiscal, embalagemTinta, quantidade, quantidadeSaldo, quantidadeConferida, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXEMBALAGENSTIN', 'idEmbalagemTintaDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.embalagemTinta, x.quantidade, x.quantidadeSaldo, x.quantidadeConferida, x.observacoes FROM MOORCAMENTOXEMBALAGENSTIN x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXNUMEROSSERIE (idNumeroSerieDocFiscal, idItemDocFiscal, gradeProduto, idNumeroSerie, devolvidoRetornado) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.gradeProduto, x.idNumeroSerie, 0 FROM MOORCAMENTOXNUMEROSSERIE x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXCENTROSCUSTOS (idCentroCustoDocFiscal, idItemDocFiscal, idCentroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.idCentroCusto, x.percentualRateio FROM MOORCAMENTOXCENTROSCUSTOS x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXORCAMENTOITEM (id, idItemDocFiscal, idItemOrcamento, quantidade, efetivacao) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, itens.idItemOrcamento, itens.quantidade, 1);
      INSERT INTO MODOCFISCALXPROMOCOES (id, idDocumentoFiscal, cabecalhoItemPagamento, sequencia, idItemDocFiscal, idPagamentoDocFiscal, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_idDocumentoFiscal, x.cabecalhoItemPagamento, itens.sequencia, itens.idItemDocFiscal, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      UPDATE MOCONSERTOS cons SET cons.situacaoConserto = 'R' WHERE cons.documentoTransferenciaFornec > 0 AND cons.situacaoConserto = 'E' AND EXISTS (SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec AND transfXDoc.entradaSaidaOriginal = 'E' AND transfXDoc.idItemOrcamento = itens.idItemOrcamento);
    FOR mot IN c_mot_item
      LOOP
        IF mot.idItemOrcamento = itens.idItemOrcamento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'D', v_idDocumentoFiscal, v_tipoDocumento, v_documentoFiscal, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, itens.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXDOCFISCALITENS (id, idMotivoBloqueioDocumento, idItemDocFiscal) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALITENS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, itens.idItemDocFiscal);
          INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
  UPDATE MOORCAMENTOXITENS SET quantidadeSaldo = 0 WHERE orcamento = p_orcamento AND cancelado = 0;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'D', v_idDocumentoFiscal, v_tipoDocumento, v_documentoFiscal, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, 0, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXDOCUMENTOSFISC (id, idMotivoBloqueioDocumento, idDocumentoFiscal) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, v_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  FOR mot IN c_mot_pag
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'D', v_idDocumentoFiscal, v_tipoDocumento, v_documentoFiscal, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, a.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_CAB (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  r_idDocumentoFiscal := v_idDocumentoFiscal;
END ADD_DOC_FISC_ROT_EFET_ORCAMENT;

/

create or replace PROCEDURE ADD_PRE_DOC_ROT_EFET_ORCAMENTO (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_sessao                       IN NUMBER,
  p_idTerminalSiTef              IN VARCHAR2,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  p_serieFiscal                  IN VARCHAR2,
  p_subSerieFiscal               IN NUMBER,
  p_documentoFiscal              IN NUMBER,
  p_dataEmissao                  IN DATE,
  p_timezone                     IN VARCHAR2,
  p_dataEntradaSaida             IN DATE,
  p_comissionadoB                IN NUMBER,
  p_comissionadoC                IN NUMBER,
  p_novaEtapaOrcamento           IN NUMBER,
  p_versaoAplicativo             IN VARCHAR2,
  r_preDocumento                 OUT NUMBER)
IS
  v_tipoDocumento          NUMBER;
  v_fatoContabil           NUMBER;
  v_preDocumento           NUMBER;
  v_estabelecimento        NUMBER;
  v_pessoa                 NUMBER;
  v_colaboradorResponsavel NUMBER;
  CURSOR c_itens
  IS SELECT idItemOrcamento, CASE WHEN cancelado = 0 THEN FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXITENS', 'idItemPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL) ELSE 0 END idItemPreDocumento, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, operacaoFiscal, movimentaEstoque, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem
     FROM MOORCAMENTOXITENS
     WHERE orcamento = p_orcamento
     ORDER BY sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOS
    WHERE orcamento = p_orcamento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOITENS a
    JOIN MOORCAMENTOXITENS b ON b.idItemOrcamento = a.idItemOrcamento
    WHERE b.orcamento = p_orcamento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_sys_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'O'
      AND a.idCabecalho = p_orcamento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXORCAMENTOPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
  SELECT
    CASE
      WHEN orc.entradaSaida='E'
      THEN 401
      ELSE 301
    END,
    orc.estabelecimento,
    orc.pessoa,
    CASE
      WHEN orc.tipoDocumento = 102
        AND orc.colaboradorResponsavel <> 0
        AND EXISTS (
          SELECT 1
          FROM CAVENDEDORES vend
          WHERE vend.vendedor = orc.colaboradorResponsavel
          AND vend.ativo = 1)
      THEN orc.colaboradorResponsavel
      ELSE 0
    END
  INTO
    v_tipoDocumento,
    v_estabelecimento,
    v_pessoa,
    v_colaboradorResponsavel
  FROM MOORCAMENTOS orc
  WHERE orcamento = p_orcamento;
  v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOFATOSCONTABEIS (fatoContabil, estabelecimento, data, ordenacao, situacaoTransacao, situacaoContabilizacao, sessao, observacoes) VALUES (v_fatoContabil, v_estabelecimento, p_dataEmissao, 0, 'A', 'N', p_sessao, ' ');
  v_preDocumento := FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMENTOS', 'preDocumento', 0, p_sys_estabelecimentoAtivo, NULL);
  INSERT INTO MOPREDOCUMENTOS (preDocumento, origemDocumento, tipoDocumento, tipoVenda, modeloDocumento, entradaSaida, devolucaoAnulacaoRetorno, finalidadeNota, atualizaCustoMedio, atualizaUltimaCompra, validoFaturamento, usarPrecoAVista, sessao, sessaoCaixa, fatoContabil, idTerminalSiTef, estabelecimentoOriginal, estabelecimento, enderecoRetiradaEstabeleciment, indicadorPresencaComprador, controlaSeparacaoConferencia, serieFiscal, subserieFiscal, documentoFiscal, dataEmissao, timezoneEmissao, dataEntradaSaida, pessoa, indicadorPessoa, indicadorDocumentoPessoa, cnpjCpfIdEstrangeiro, nomeRazaoSocial, fone, indicadorFone, operadoraTelefonia, autorizadoPessoa, enderecoEntregaPessoa, municipioFatoGerador, localDestinoOperacao, indicadorConsumidorFinal, projeto, contratoCompra, comissionadoB, comissionadoC, modalidadeFrete, tipoPagamentoFrete, transportadora, enderecoTransportadora, motorista, placa, vagao, balsa, quantidadeVolume, especieVolume, descricaoMarca, numeracaoVolume, codigoIntegracao, atendimento, statusPreDocumento, ultimoVendedorItem, quantidade, pesoLiquido, pesoBruto, valorProdutosBruto, valorProdutos, valorDescontoProdutos, valorAcrescimoProdutos, valorServicosBruto, valorServicos, valorDescontoServicos, valorAcrescimoServicos, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, condicaoPagamento, contaFinanceira, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorBasePagamento, valorAVistaMinimo, valorEntradaMinima, valorAVistaEntrada, valorPagamentoBruto, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorPagamentoLiquido, valorTroco, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, impostosEditados, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, valorCustoOperacao, valorCMV, versaoAplicativo)
  SELECT v_preDocumento,
    2,
    v_tipoDocumento,
    orc.tipoVenda,
    orc.modeloDocumento,
    orc.entradaSaida,
    0 devolucaoAnulacaoRetorno,
    orc.finalidadeNota,
    orc.atualizaCustoMedio,
    orc.atualizaUltimaCompra,
    orc.validoFaturamento,
    orc.usarPrecoAVista,
    p_sessao,
    p_sessaoCaixa,
    v_fatoContabil,
    p_idTerminalSiTef,
    orc.estabelecimento,
    orc.estabelecimento,
    orc.enderecoRetiradaEstabeleciment,
    orc.indicadorPresencaComprador,
    orc.controlaSeparacaoConferencia,
    p_serieFiscal,
    p_subserieFiscal,
    p_documentoFiscal,
    p_dataEmissao dataEmissao,
    p_timezone timezoneEmissao,
    p_dataEntradaSaida dataEntradaSaida,
    orc.pessoa,
    'F' indicadorPessoa,
    'C' indicadorDocumentoPessoa,
    ' ' cnpjCpfIdEstrangeiro,
    ' ' nomeRazaoSocial,
    ' ' fone,
    0 indicadorFone,
    0 operadoraTelefonia,
    orc.autorizadoPessoa,
    orc.enderecoEntregaPessoa,
    orc.municipioFatoGerador,
    orc.localDestinoOperacao,
    orc.indicadorConsumidorFinal,
    orc.projeto,
    orc.contratoCompra,
    p_comissionadoB comissionadoB,
    p_comissionadoC comissionadoC,
    CASE WHEN orc.modalidadeFrete = ' ' THEN '9' ELSE orc.modalidadeFrete END,
    CASE WHEN orc.tipoPagamentoFrete = ' ' THEN 'N' ELSE orc.tipoPagamentoFrete END,
    orc.transportadora,
    orc.enderecoTransportadora,
    orc.motorista,
    orc.placa,
    orc.vagao,
    orc.balsa,
    orc.quantidadeVolume,
    orc.especieVolume,
    orc.descricaoMarca,
    orc.numeracaoVolume,
    orc.codigoIntegracao,
    orc.atendimento,
    'E' statusPreDocumento,
    CASE WHEN orc.ultimoVendedorItem = 0 THEN v_colaboradorResponsavel ELSE orc.ultimoVendedorItem END,
    orc.quantidade,
    orc.pesoLiquido,
    orc.pesoBruto,
    orc.valorProdutosBruto,
    orc.valorProdutos,
    orc.valorDescontoProdutos,
    orc.valorAcrescimoProdutos,
    orc.valorServicosBruto,
    orc.valorServicos,
    orc.valorDescontoServicos,
    orc.valorAcrescimoServicos,
    orc.valorFreteItem,
    orc.valorSeguroItem,
    orc.valorAdicFreteMarinhaMerItem,
    orc.valorDespesasAduaneirasItem,
    orc.valorFreteGeral,
    orc.valorSeguroGeral,
    orc.valorDescontoGeral,
    orc.valorOutrasDespesasGeral,
    orc.valorAdicFreteMarinhaMerGeral,
    orc.valorDespesasAduaneirasGeral,
    orc.condicaoPagamento,
    orc.contaFinanceira,
    0 numeroParcelas,
    0 somaPrazoParcelas,
    0 valorXPrazoParcelas,
    0 prazoMedio,
    0 prazoMedioPonderado,
    orc.valorBasePagamento,
    orc.valorAVistaMinimo,
    0 valorEntradaMinima,
    0 valorAVistaEntrada,
    0 valorPagamentoBruto,
    0 valorDescontoPagamento,
    0 valorOutrasDespesasPagamento,
    0 valorJurosPagamento,
    0 valorPagamentoLiquido,
    0 valorTroco,
    orc.valorFreteTotal,
    orc.valorSeguroTotal,
    orc.valorDescontoTotal - CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END,
    orc.valorOutrasDespesasTotal - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    orc.valorAdicFreteMarinhaMerTotal,
    orc.valorDespesasAduaneirasTotal,
    orc.impostosEditados,
    orc.valorImpostosSomaPagamento,
    orc.valorImpostosDiminuiPagamento,
    orc.valorLiquidoItem + CASE WHEN orc.valorDescontoTotal >= orc.valorDescontoPagamento THEN orc.valorDescontoPagamento ELSE 0 END - CASE WHEN orc.valorOutrasDespesasTotal > orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento THEN orc.valorOutrasDespesasPagamento + orc.valorJurosPagamento ELSE 0 END,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    p_versaoAplicativo
  FROM MOORCAMENTOS orc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = orc.estabelecimento
  WHERE orcamento = p_orcamento;
  UPDATE MOORCAMENTOS SET etapaOrcamento = p_novaEtapaOrcamento WHERE orcamento = p_orcamento;
  INSERT INTO MOORCAMENTOXETAPAS (id, orcamento, data, usuario, etapaOrcamento, observacoes) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOORCAMENTOXETAPAS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), p_orcamento, sysdate, p_sys_usuarioLogado, p_novaEtapaOrcamento, ' ');
  INSERT INTO MOPREDOCUMXPERSPROJETO (idPersonProjetoPreDocumento, preDocumento, personalizacaoProjeto, conteudo) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPERSPROJETO', 'idPersonProjetoPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.personalizacaoProjeto, x.conteudo FROM MOORCAMENTOXPERSPROJETO x WHERE x.orcamento = p_orcamento;
  INSERT INTO MOPREDOCUMXINFOCOMPLENT (id, preDocumento, sequencia, geradoPeloSistema, imprimir, destaque, informacaoComplementar, descInformacaoComplementar) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXINFOCOMPLENT', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.sequencia, x.geradoPeloSistema, x.imprimir, x.destaque, x.informacaoComplementar, x.descInformacaoComplementar FROM MOORCAMENTOXINFOCOMPLENT x WHERE x.orcamento = p_orcamento;
  INSERT INTO MOPREDOCUMXPROMOCOES (id, preDocumento, cabecalhoItemPagamento, sequencia, idItemPreDocumento, idPagamentoPreDocumento, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.cabecalhoItemPagamento, x.sequencia, 0, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.orcamento = p_orcamento AND x.idItemOrcamento = 0 AND x.idPagamentoOrcamento = 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0
    THEN
      INSERT INTO MOPREDOCUMXITENS (idItemPreDocumento, preDocumento, sequencia, cancelado, pedidoCompraFornecedor, sequenciaPedidoCompraFornec, modeloDocumento, estabelecimentoOriginal, vendedor, gradeProduto, idFormulaTinta, personalizacao, idLoteEstoque, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoUnitarioBruto, acrescimoUnitarioComposicao, precoUnitario, precoUnitarioConvertido, valorProdutoServicoBruto, valorProdutoServico, percDescontoItem, valorDescontoItem, percAcrescimoItem, valorAcrescimoItem, valorFreteItem, valorSeguroItem, valorAdicFreteMarinhaMerItem, valorDespesasAduaneirasItem, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorDescontoCustoOpItem, valorAcrescimoCustoOpItem, observacoesDigitadas, observacoes, valorFreteGeral, valorSeguroGeral, valorDescontoGeral, valorOutrasDespesasGeral, valorAdicFreteMarinhaMerGeral, valorDespesasAduaneirasGeral, valorAcrescimoExtempGeral, valorDescontoCustoOpGeral, valorAcrescimoCustoOpGeral, valorDescontoPagamento, valorOutrasDespesasPagamento, valorJurosPagamento, valorFreteTotal, valorSeguroTotal, valorDescontoTotal, valorOutrasDespesasTotal, valorAdicFreteMarinhaMerTotal, valorDespesasAduaneirasTotal, valorAcrescimoExtempTotal, valorDescontoCustoOpTotal, valorAcrescimoCustoOpTotal, percentualDevolucao, valorIPIDevolucao, operacaoFiscal, movimentaEstoque, geraFinanceiro, cfop, indicadorISSQN, aliquotaISSQN, retidoISSQN, tributadoForaMunicipio, incentivoFiscal, listaServicos, cnae, idServicoMunicipio, numeroProcessoAdministrativo, retencaoIRRF, retencaoINSS, retencaoPIS, retencaoCOFINS, retencaoCSLL, retencaoOutros, aliquotaII, aliquotaIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, stPIS, aliquotaPIS, valorAliquotaPIS, aliquotaPISST, valorAliquotaPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, stSimplesNacional, creditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, idBeneficio, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, aliquotaFCP, aliquotaFCPST, aliquotaFCPSTAnteriormente, aliquotaFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseISSQN, valorISSQN, baseRetIRRF, valorRetIRRF, baseRetINSS, valorRetINSS, baseRetPIS, valorRetPIS, baseRetCOFINS, valorRetCOFINS, baseRetCSLL, valorRetCSLL, baseRetOutros, valorRetOutros, baseII, valorII, baseIOF, valorIOF, baseIPI, valorIPI, basePIS, valorPIS, basePISST, valorPISST, baseCOFINS, valorCOFINS, baseCOFINSST, valorCOFINSST, baseCreditoSimplesNacional, valorCreditoSimplesNacional, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, baseICMSEfetivo, valorICMSEfetivo, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, baseFCP, valorFCP, baseFCPST, valorFCPST, baseFCPSTAnteriormente, valorFCPSTAnteriormente, baseFCPUFDestinatario, valorFCPUFDestinatario, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorBasePagamento, valorLiquidoItem, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV) VALUES (itens.idItemPreDocumento, v_preDocumento, itens.sequencia, itens.cancelado, itens.pedidoCompraFornecedor, itens.sequenciaPedidoCompraFornec, itens.modeloDocumento, v_estabelecimento, CASE WHEN itens.vendedor = 0 THEN v_colaboradorResponsavel ELSE itens.vendedor END, itens.gradeProduto, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.localEstoque, itens.pessoaParticipante, itens.controleQuantidade, itens.unidadeMedidaConversao, itens.conversorQuantidade, itens.loteMinimo, itens.loteMultiplo, itens.altura, itens.largura, itens.comprimento, itens.pecas, itens.quantidade, itens.quantidadeConvertida, 0, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoUnitarioBruto, itens.acrescimoUnitarioComposicao, itens.precoUnitario, itens.precoUnitarioConvertido, itens.valorProdutoServicoBruto, itens.valorProdutoServico, itens.percDescontoItem, itens.valorDescontoItem, itens.percAcrescimoItem, itens.valorAcrescimoItem, itens.valorFreteItem, itens.valorSeguroItem, itens.valorAdicFreteMarinhaMerItem, itens.valorDespesasAduaneirasItem, 0, 0, 0, 0, 0, 0, itens.observacoesDigitadas, itens.observacoes, itens.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, 0, 0, 0, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, 0, 0, 0, 0, 0, itens.operacaoFiscal, itens.movimentaEstoque, itens.geraFinanceiro, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.retidoISSQN, itens.tributadoForaMunicipio, itens.incentivoFiscal, itens.listaServicos, itens.cnae, itens.idServicoMunicipio, itens.numeroProcessoAdministrativo, itens.retencaoIRRF, itens.retencaoINSS, itens.retencaoPIS, itens.retencaoCOFINS, itens.retencaoCSLL, itens.retencaoOutros, itens.aliquotaII, itens.aliquotaIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.idBeneficio, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.aliquotaFCP, itens.aliquotaFCPST, itens.aliquotaFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseISSQN, itens.valorISSQN, itens.baseRetIRRF, itens.valorRetIRRF, itens.baseRetINSS, itens.valorRetINSS, itens.baseRetPIS, itens.valorRetPIS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.baseRetCSLL, itens.valorRetCSLL, itens.baseRetOutros, itens.valorRetOutros, itens.baseII, itens.valorII, itens.baseIOF, itens.valorIOF, itens.baseIPI, itens.valorIPI, itens.basePIS, itens.valorPIS, itens.basePISST, itens.valorPISST, itens.baseCOFINS, itens.valorCOFINS, itens.baseCOFINSST, itens.valorCOFINSST, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.baseFCP, itens.valorFCP, itens.baseFCPST, itens.valorFCPST, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorBasePagamento, itens.valorLiquidoItem, 0, 0, 0, 0);
      INSERT INTO MOPREDOCUMXCOMPOSICOESPR (id, idItemPreDocumento, composicaoPreco, selecionado, quantidade, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXCOMPOSICOESPR', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.composicaoPreco, x.selecionado, x.quantidade, x.observacoes FROM MOORCAMENTOXCOMPOSICOESPR x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXEMBALAGENSTIN (idEmbalagemTintaPreDocumento, idItemPreDocumento, embalagemTinta, quantidade, quantidadeSaldo, quantidadeConferida, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXEMBALAGENSTIN', 'idEmbalagemTintaPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.embalagemTinta, x.quantidade, x.quantidadeSaldo, x.quantidadeConferida, x.observacoes FROM MOORCAMENTOXEMBALAGENSTIN x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXNUMEROSSERIE (idNumeroSeriePreDocumento, idItemPreDocumento, gradeProduto, idNumeroSerie, devolvidoRetornado) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXNUMEROSSERIE', 'idNumeroSeriePreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.gradeProduto, x.idNumeroSerie, 0 FROM MOORCAMENTOXNUMEROSSERIE x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXCENTROSCUSTOS (idCentroCustoPreDocumento, idItemPreDocumento, idCentroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXCENTROSCUSTOS', 'idCentroCustoPreDocumento', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.idCentroCusto, x.percentualRateio FROM MOORCAMENTOXCENTROSCUSTOS x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXORCAMENTOITEM (id, idItemPreDocumento, idItemOrcamento, quantidade, efetivacao) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXORCAMENTOITEM', 'id', 0, p_sys_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, itens.idItemOrcamento, itens.quantidade, 1);
      INSERT INTO MOPREDOCUMXPROMOCOES (id, preDocumento, cabecalhoItemPagamento, sequencia, idItemPreDocumento, idPagamentoPreDocumento, regraPromocao, tipoBeneficio, multiplicador, precoUnitarioDe, precoUnitarioPor, precoDesconto, precoMinimo, percentualDesconto, valorDesconto, pontuacao, gerarPontuacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPROMOCOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), v_preDocumento, x.cabecalhoItemPagamento, itens.sequencia, itens.idItemPreDocumento, 0, x.regraPromocao, x.tipoBeneficio, x.multiplicador, x.precoUnitarioDe, x.precoUnitarioPor, x.precoDesconto, x.precoMinimo, x.percentualDesconto, x.valorDesconto, x.pontuacao, x.gerarPontuacao, x.observacoes FROM MOORCAMENTOXPROMOCOES x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      UPDATE MOCONSERTOS cons SET cons.situacaoConserto = 'R' WHERE cons.documentoTransferenciaFornec > 0 AND cons.situacaoConserto = 'E' AND EXISTS (SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec AND transfXDoc.entradaSaidaOriginal = 'E' AND transfXDoc.idItemOrcamento = itens.idItemOrcamento);
      FOR mot IN c_mot_item
      LOOP
        IF mot.idItemOrcamento = itens.idItemOrcamento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, itens.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXPREDOCUMITENS (id, idMotivoBloqueioDocumento, idItemPreDocumento) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXPREDOCUMITENS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, itens.idItemPreDocumento);
          INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
  UPDATE MOORCAMENTOXITENS SET quantidadeSaldo = 0 WHERE orcamento = p_orcamento AND cancelado = 0;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, 0, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXPREDOCUMENTOS (id, idMotivoBloqueioDocumento, preDocumento) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXPREDOCUMENTOS', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, v_preDocumento);
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  FOR mot IN c_mot_pag
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento, origem, idCabecalho, tipoDocumento, idDocumento, estabelecimento, pessoa, cabecalhoItemPagamento, sequencia, condicaoPagamento, vendedor, gradeProduto, unidadeMedidaConversao, quantidadeConvertida, valorLiquido, motivoBloqueioDocumento, dataBloqueio, baseBloqueado, valorBloqueado, percentualBloqueado, situacaoLiberacao, observacoes) SELECT mot.idMotivoBloqueioNovo, 'P', v_preDocumento, v_tipoDocumento, v_preDocumento, v_estabelecimento, v_pessoa, a.cabecalhoItemPagamento, a.sequencia, a.condicaoPagamento, a.vendedor, a.gradeProduto, a.unidadeMedidaConversao, a.quantidadeConvertida, a.valorLiquido, a.motivoBloqueioDocumento, a.dataBloqueio, a.baseBloqueado, a.valorBloqueado, a.percentualBloqueado, a.situacaoLiberacao, a.observacoes FROM MOMOTIVOSBLOQUEIOS a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_sys_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_CAB (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  r_preDocumento := v_preDocumento;
END ADD_PRE_DOC_ROT_EFET_ORCAMENTO;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_STATUS_CALC (
  p_idItemOrcamento IN NUMBER)
IS
BEGIN
  UPDATE MOORCAMENTOXITENS a
  SET a.statusAtividadeServico =
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN
        CASE
          WHEN
            EXISTS (
              SELECT 1
              FROM MOORCAMENTOXATIVIDADEPREV prev
              WHERE prev.idItemOrcamento = a.idItemOrcamento
              AND prev.statusAtividadeServico = 'E')
          THEN 'I'
          ELSE 'P'
        END
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END
  WHERE a.idItemOrcamento = p_idItemOrcamento
  AND a.statusAtividadeServico <>
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN
        CASE
          WHEN
            EXISTS (
              SELECT 1
              FROM MOORCAMENTOXATIVIDADEPREV prev
              WHERE prev.idItemOrcamento = a.idItemOrcamento
              AND prev.statusAtividadeServico = 'E')
          THEN 'I'
          ELSE 'P'
        END
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END;
END ADD_ORCAMENTO_ITEM_STATUS_CALC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idAtividadePrevOrcamento  IN NUMBER,
  p_idItemOrcamento           IN NUMBER,
  p_sequencia                 IN NUMBER,
  p_atividadeServico          IN NUMBER,
  p_descricao                 IN VARCHAR2,
  p_tecnico                   IN NUMBER,
  p_faturarAtividade          IN CHAR,
  p_checklist                 IN NUMBER,
  p_tipoApontamento           IN CHAR,
  p_editaQuantidades          IN NUMBER,
  p_etapaAtividade            IN NUMBER,
  p_statusAtividadeServico    IN CHAR,
  p_dataInicio                IN DATE,
  p_dataTermino               IN DATE,
  p_quantidade                IN NUMBER,
  p_precoUnitario             IN NUMBER,
  p_observacoes               IN VARCHAR2,
  /* Retornos */
  r_idAtividadePrevOrcamento  OUT NUMBER)
IS
BEGIN
  r_idAtividadePrevOrcamento := p_idAtividadePrevOrcamento;
  IF r_idAtividadePrevOrcamento = 0 THEN
    r_idAtividadePrevOrcamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXATIVIDADEPREV',
      'idAtividadePrevOrcamento',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXATIVIDADEPREV a USING (
    SELECT
      r_idAtividadePrevOrcamento idAtividadePrevOrcamento,
      p_idItemOrcamento          idItemOrcamento,
      p_sequencia                sequencia,
      p_atividadeServico         atividadeServico,
      p_descricao                descricao,
      p_tecnico                  tecnico,
      p_faturarAtividade         faturarAtividade,
      p_checklist                checklist,
      p_tipoApontamento          tipoApontamento,
      p_editaQuantidades         editaQuantidades,
      p_etapaAtividade           etapaAtividade,
      p_statusAtividadeServico   statusAtividadeServico,
      p_dataInicio               dataInicio,
      p_dataTermino              dataTermino,
      p_quantidade               quantidade,
      p_precoUnitario            precoUnitario,
      p_observacoes              observacoes
    FROM DUAL) b
  ON (a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemOrcamento        = b.idItemOrcamento,
    a.sequencia              = b.sequencia,
    a.atividadeServico       = b.atividadeServico,
    a.descricao              = b.descricao,
    a.tecnico                = b.tecnico,
    a.faturarAtividade       = b.faturarAtividade,
    a.checklist              = b.checklist,
    a.tipoApontamento        = b.tipoApontamento,
    a.editaQuantidades       = b.editaQuantidades,
    a.etapaAtividade         = b.etapaAtividade,
    a.statusAtividadeServico = b.statusAtividadeServico,
    a.dataInicio             = b.dataInicio,
    a.dataTermino            = b.dataTermino,
    a.quantidade             = b.quantidade,
    a.precoUnitario          = b.precoUnitario,
    a.observacoes            = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idAtividadePrevOrcamento,
    idItemOrcamento,
    sequencia,
    atividadeServico,
    descricao,
    tecnico,
    faturarAtividade,
    checklist,
    tipoApontamento,
    editaQuantidades,
    etapaAtividade,
    statusAtividadeServico,
    dataInicio,
    dataTermino,
    quantidade,
    precoUnitario,
    observacoes)
  VALUES (
    b.idAtividadePrevOrcamento,
    b.idItemOrcamento,
    b.sequencia,
    b.atividadeServico,
    b.descricao,
    b.tecnico,
    b.faturarAtividade,
    b.checklist,
    b.tipoApontamento,
    b.editaQuantidades,
    b.etapaAtividade,
    b.statusAtividadeServico,
    b.dataInicio,
    b.dataTermino,
    b.quantidade,
    b.precoUnitario,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_PREV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idAtividadePrevOrcamento    IN NUMBER,
  p_ordenacao                   IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_localEstoque                IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_quantidadeSaldo             IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  /* Retornos */
  r_idFichaProdutoPrevOrcamento OUT NUMBER)
IS
BEGIN
  r_idFichaProdutoPrevOrcamento := p_idFichaProdutoPrevOrcamento;
  IF r_idFichaProdutoPrevOrcamento = 0 THEN
    r_idFichaProdutoPrevOrcamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXFICHAPRODPREV',
      'idFichaProdutoPrevOrcamento',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXFICHAPRODPREV a 
  USING (
    SELECT
      r_idFichaProdutoPrevOrcamento idFichaProdutoPrevOrcamento,
      p_idAtividadePrevOrcamento    idAtividadePrevOrcamento,
      p_ordenacao                   ordenacao,
      p_entradaSaida                entradaSaida,
      p_localEstoque                localEstoque,
      p_gradeProduto                gradeProduto,
      p_personalizacao              personalizacao,
      p_idLoteEstoque               idLoteEstoque,
      p_quantidade                  quantidade,
      p_quantidadeSaldo             quantidadeSaldo,
      p_observacoes                 observacoes
    FROM DUAL) b
  ON (a.idFichaProdutoPrevOrcamento = b.idFichaProdutoPrevOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento,
    a.ordenacao                = b.ordenacao,
    a.entradaSaida             = b.entradaSaida,
    a.localEstoque             = b.localEstoque,
    a.gradeProduto             = b.gradeProduto,
    a.personalizacao           = b.personalizacao,
    a.idLoteEstoque            = b.idLoteEstoque,
    a.quantidade               = b.quantidade,
    a.quantidadeSaldo          = b.quantidadeSaldo,
    a.observacoes              = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idFichaProdutoPrevOrcamento,
    idAtividadePrevOrcamento,
    ordenacao,
    entradaSaida,
    localEstoque,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    quantidade,
    quantidadeSaldo,
    observacoes)
  VALUES (
    b.idFichaProdutoPrevOrcamento,
    b.idAtividadePrevOrcamento,
    b.ordenacao,
    b.entradaSaida,
    b.localEstoque,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.quantidade,
    b.quantidadeSaldo,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_PREV_FIC_GR;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idFichaProdutoRealOrcamento IN NUMBER,
  p_idAtividadeRealOrcamento    IN NUMBER,
  p_ordenacao                   IN NUMBER,
  p_atualizaCustoMedio          IN NUMBER,
  p_atualizaUltimaCompra        IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_localEstoque                IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_zerarSaldo                  IN NUMBER,
  p_precoCustoOperacao          IN NUMBER,
  p_totalCustoOperacao          IN NUMBER,
  p_precoCMV                    IN NUMBER,
  p_valorCMV                    IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  /* Retornos */
  r_idFichaProdutoRealOrcamento OUT NUMBER)
IS
BEGIN
  r_idFichaProdutoRealOrcamento := p_idFichaProdutoRealOrcamento;
  IF r_idFichaProdutoRealOrcamento = 0 THEN
    r_idFichaProdutoRealOrcamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXFICHAPRODREAL',
      'idFichaProdutoRealOrcamento',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXFICHAPRODREAL a 
  USING (
    SELECT
      r_idFichaProdutoRealOrcamento idFichaProdutoRealOrcamento,
      p_idAtividadeRealOrcamento    idAtividadeRealOrcamento,
      p_ordenacao                   ordenacao,
      p_atualizaCustoMedio          atualizaCustoMedio,
      p_atualizaUltimaCompra        atualizaUltimaCompra,
      p_entradaSaida                entradaSaida,
      p_localEstoque                localEstoque,
      p_idFichaProdutoPrevOrcamento idFichaProdutoPrevOrcamento,
      p_gradeProduto                gradeProduto,
      p_personalizacao              personalizacao,
      p_idLoteEstoque               idLoteEstoque,
      p_quantidade                  quantidade,
      p_zerarSaldo                  zerarSaldo,
      p_precoCustoOperacao          precoCustoOperacao,
      p_totalCustoOperacao          totalCustoOperacao,
      p_precoCMV                    precoCMV,
      p_valorCMV                    valorCMV,
      p_observacoes                 observacoes
    FROM DUAL) b
  ON (a.idFichaProdutoRealOrcamento = b.idFichaProdutoRealOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idAtividadeRealOrcamento    = b.idAtividadeRealOrcamento,
    a.ordenacao                   = b.ordenacao,
    a.atualizaCustoMedio          = b.atualizaCustoMedio,
    a.atualizaUltimaCompra        = b.atualizaUltimaCompra,
    a.entradaSaida                = b.entradaSaida,
    a.localEstoque                = b.localEstoque,
    a.idFichaProdutoPrevOrcamento = b.idFichaProdutoPrevOrcamento,
    a.gradeProduto                = b.gradeProduto,
    a.personalizacao              = b.personalizacao,
    a.idLoteEstoque               = b.idLoteEstoque,
    a.quantidade                  = b.quantidade,
    a.zerarSaldo                  = b.zerarSaldo,
    a.precoCustoOperacao          = b.precoCustoOperacao,
    a.totalCustoOperacao          = b.totalCustoOperacao,
    a.precoCMV                    = b.precoCMV,
    a.valorCMV                    = b.valorCMV,
    a.observacoes                 = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idFichaProdutoRealOrcamento,
    idAtividadeRealOrcamento,
    ordenacao,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    entradaSaida,
    localEstoque,
    idFichaProdutoPrevOrcamento,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    quantidade,
    zerarSaldo,
    precoCustoOperacao,
    totalCustoOperacao,
    precoCMV,
    valorCMV,
    observacoes)
  VALUES (
    b.idFichaProdutoRealOrcamento,
    b.idAtividadeRealOrcamento,
    b.ordenacao,
    b.atualizaCustoMedio,
    b.atualizaUltimaCompra,
    b.entradaSaida,
    b.localEstoque,
    b.idFichaProdutoPrevOrcamento,
    b.gradeProduto,
    b.personalizacao,
    b.idLoteEstoque,
    b.quantidade,
    b.zerarSaldo,
    b.precoCustoOperacao,
    b.totalCustoOperacao,
    b.precoCMV,
    b.valorCMV,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_REAL_FIC_GR;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativ_dataInicio              IN DATE,
  p_ativ_dataTermino             IN DATE,
  p_idFichaProdutoPrevOrcamento  IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  r_quantidadeSaldo              OUT NUMBER,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
BEGIN
  r_quantidadeSaldo        := 0;
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      COALESCE ((
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MOORCAMENTOXFICHAPRODREAL b
            WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
            AND b.zerarSaldo = 1)
          THEN 0
         ELSE a.quantidade - COALESCE ((
            SELECT SUM (b.quantidade)
            FROM MOORCAMENTOXFICHAPRODREAL b
            WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento), 0)
        END), 0) quantidadeSaldo,
      a.observacoes,
      locEst.indicadorPropriedadePosseItem,
      gradProd.produto,
      prod.controleEstoque
    FROM MOORCAMENTOXFICHAPRODPREV a
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idFichaProdutoPrevOrcamento = p_idFichaProdutoPrevOrcamento)
  LOOP
    r_quantidadeSaldo := a.quantidadeSaldo;
    UPDATE MOORCAMENTOXFICHAPRODPREV b
    SET b.quantidadeSaldo = a.quantidadeSaldo
    WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento;
    ADD_RESERVA_ESTOQUE_ORC_FIC_PR (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_modeloDocumento,
      p_ativ_dataInicio,
      p_ativ_dataTermino,
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeSaldo,
      a.observacoes,
      a.indicadorPropriedadePosseItem,
      a.produto,
      a.controleEstoque,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_PREV_FIC_SA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativPrev_idAtividadePrevOrc  IN NUMBER,
  p_ativPrev_dataInicio          IN DATE,
  p_ativPrev_dataTermino         IN DATE,
  p_ativReal_idAtividadeRealOrc  IN NUMBER,
  p_ativReal_dataTermino         IN DATE,
  p_ativReal_modeloDocumento     IN NUMBER,
  p_ativReal_motivoEstoque       IN NUMBER,  
  p_proporcao                    IN NUMBER,
  p_quantidadeEntrada            IN NUMBER,
  p_zerarSaldo                   IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_ordenacao NUMBER;
  v_idFichaProdutoRealOrcamento NUMBER;
  v_auxNumber NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_ordenacao := 0;
  ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
    p_ativReal_idAtividadeRealOrc,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      locEst.indicadorPropriedadePosseItem,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar,
      0 precoCustoOperacao,
      0 totalCustoOperacao,
      0 precoCMV,
      0 valorCMV,
      a.observacoes,
      CASE WHEN a.entradaSaida = 'E' THEN modDoc.atualizaCustoMedio ELSE 0 END atualizaCustoMedio,
      CASE WHEN a.entradaSaida = 'E' THEN modDoc.atualizaUltimaCompra ELSE 0 END atualizaUltimaCompra,
      a.produto,
      a.controleEstoque
    FROM (
      SELECT
        a.idFichaProdutoPrevOrcamento,
        a.ordenacao,
        a.entradaSaida,
        a.localEstoque,
        a.gradeProduto,
        a.personalizacao,
        a.idLoteEstoque,
        CASE
          WHEN p_quantidadeEntrada > 0
            AND a.entradaSaida = 'E'
          THEN p_quantidadeEntrada
          ELSE ROUND (CASE
            WHEN EXISTS (
              SELECT 1
              FROM MOORCAMENTOXFICHAPRODREAL b
              WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
              AND b.zerarSaldo = 1)
            THEN 0
            ELSE a.quantidade - COALESCE ((
              SELECT SUM (b.quantidade)
              FROM MOORCAMENTOXFICHAPRODREAL b
              WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento), 0)
          END * p_proporcao, TO_NUMBER (uniMed.casasDecimaisUnidadeMedida))
        END quantidadeBaixar,
        a.observacoes,
        gradProd.produto,
        prod.controleEstoque
      FROM MOORCAMENTOXFICHAPRODPREV a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed
      ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE a.idAtividadePrevOrcamento = p_ativPrev_idAtividadePrevOrc
      AND a.quantidadeSaldo > 0) a
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = p_ativReal_modeloDocumento
    WHERE a.quantidadeBaixar > 0
    ORDER BY a.ordenacao)
  LOOP
    v_ordenacao := v_ordenacao + 1;
    ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idFichaProdutoRealOrcamento
      p_ativReal_idAtividadeRealOrc,
      v_ordenacao,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.idFichaProdutoPrevOrcamento,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar, -- quantidade
      p_zerarSaldo,
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      v_idFichaProdutoRealOrcamento);
    ADD_ESTOQUE_ORCAMENTO_FIC_PROD (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_ativReal_idAtividadeRealOrc,
      p_ativReal_dataTermino,
      p_ativReal_modeloDocumento,
      p_ativReal_motivoEstoque,
      v_idFichaProdutoRealOrcamento,
      a.gradeProduto,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar, -- quantidade
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.indicadorPropriedadePosseItem,
      a.produto,
      a.controleEstoque,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
    ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_modeloDocumento,
      p_ativPrev_dataInicio,
      p_ativPrev_dataTermino,
      a.idFichaProdutoPrevOrcamento,
      r_bufferIdReservaEstoque,
      v_auxNumber, -- r_quantidadeSaldo
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_REAL_FIC_GE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_AT (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idFichaProdutoRealOrcamento  IN NUMBER,
  p_idAtividadeRealOrcamento     IN NUMBER,
  p_ordenacao                    IN NUMBER,
  p_atualizaCustoMedio           IN NUMBER,
  p_atualizaUltimaCompra         IN NUMBER,
  p_entradaSaida                 IN CHAR,
  p_localEstoque                 IN NUMBER,
  p_idFichaProdutoPrevOrcamento  IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_personalizacao               IN NUMBER,
  p_idLoteEstoque                IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_zerarSaldo                   IN NUMBER,
  p_precoCustoOperacao           IN NUMBER,
  p_totalCustoOperacao           IN NUMBER,
  p_precoCMV                     IN NUMBER,
  p_valorCMV                     IN NUMBER,
  p_observacoes                  IN VARCHAR2,
  /* Retornos */
  r_idFichaProdutoRealOrcamento  OUT NUMBER)
IS
  v_cab_estabelecimento        NUMBER;
  v_cab_dataEmissao            DATE;
  v_cab_dataEntrega            DATE;
  v_item_modeloDocumento       NUMBER;
  v_ativPrev_dataInicio        DATE;
  v_ativPrev_dataTermino       DATE;
  v_ativReal_dataTermino       DATE;
  v_ativReal_modeloDocumento   NUMBER;
  v_ativReal_motivoEstoque     NUMBER;
  v_locEst_indicProprPosseItem CHAR (1);
  v_gradProd_produto           NUMBER;
  v_prod_controleEstoque       NUMBER;
  v_bufferIdReservaEstoque     VARCHAR2 (32000);
  v_bufferIdEstoque            VARCHAR2 (32000);
  v_auxNumber                  NUMBER;
BEGIN
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0),
    MAX (ativPrev.dataInicio),
    MAX (ativPrev.dataTermino),
    MAX (ativReal.dataTermino),
    COALESCE (MAX (ativReal.modeloDocumento), 0),
    COALESCE (MAX (ativReal.motivoEstoque), 0),
    COALESCE (MAX (gradProd.produto), 0),
    COALESCE (MAX (prod.controleEstoque), 0),
    COALESCE (MAX (locEst.indicadorPropriedadePosseItem), ' ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento,
    v_ativPrev_dataInicio,
    v_ativPrev_dataTermino,
    v_ativReal_dataTermino,
    v_ativReal_modeloDocumento,
    v_ativReal_motivoEstoque,
    v_locEst_indicProprPosseItem,
    v_gradProd_produto,
    v_prod_controleEstoque
  FROM MOORCAMENTOXATIVIDADEREAL ativReal
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = p_localEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = p_gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
  ON ativPrev.idAtividadePrevOrcamento = ativReal.idAtividadePrevOrcamento
  JOIN MOORCAMENTOXITENS item
  ON item.idItemOrcamento = ativPrev.idItemOrcamento
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE ativReal.idAtividadeRealOrcamento = p_idAtividadeRealOrcamento;
  ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idFichaProdutoRealOrcamento,
    p_idAtividadeRealOrcamento,
    p_ordenacao,
    p_atualizaCustoMedio,
    p_atualizaUltimaCompra,
    p_entradaSaida,
    p_localEstoque,
    p_idFichaProdutoPrevOrcamento,
    p_gradeProduto,
    p_personalizacao,
    p_idLoteEstoque,
    p_quantidade,
    p_zerarSaldo,
    p_precoCustoOperacao,
    p_totalCustoOperacao,
    p_precoCMV,
    p_valorCMV,
    p_observacoes,
    r_idFichaProdutoRealOrcamento);
  ADD_ESTOQUE_ORCAMENTO_FIC_PROD (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    v_cab_estabelecimento,
    p_idAtividadeRealOrcamento,
    v_ativReal_dataTermino,
    v_ativReal_modeloDocumento,
    v_ativReal_motivoEstoque,
    r_idFichaProdutoRealOrcamento,
    p_gradeProduto,
    p_atualizaCustoMedio,
    p_atualizaUltimaCompra,
    p_entradaSaida,
    p_localEstoque,
    p_personalizacao,
    p_idLoteEstoque,
    p_quantidade,
    p_precoCustoOperacao,
    p_totalCustoOperacao,
    p_precoCMV,
    p_valorCMV,
    p_observacoes,
    v_locEst_indicProprPosseItem,
    v_gradProd_produto,
    v_prod_controleEstoque,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  IF p_idFichaProdutoPrevOrcamento > 0 THEN
    ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      v_ativPrev_dataInicio,
      v_ativPrev_dataTermino,
      p_idFichaProdutoPrevOrcamento,
      v_bufferIdReservaEstoque,
      v_auxNumber, -- r_quantidadeSaldo
      v_bufferIdReservaEstoque);
  END IF;
END ADD_ORCAMENTO_ITEM_REAL_FIC_AT;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_AT (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idAtividadePrevOrcamento    IN NUMBER,
  p_ordenacao                   IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_localEstoque                IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_quantidadeSaldo             IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  /* Retornos */
  r_idFichaProdutoPrevOrcamento OUT NUMBER)
IS
  v_cab_estabelecimento        NUMBER;
  v_cab_dataEmissao            DATE;
  v_cab_dataEntrega            DATE;
  v_item_modeloDocumento       NUMBER;
  v_ativPrev_dataInicio        DATE;
  v_ativPrev_dataTermino       DATE;
  v_bufferIdReservaEstoque     VARCHAR2 (32000);
  v_auxNumber                  NUMBER;
BEGIN
  v_bufferIdReservaEstoque  := '';
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0),
    MAX (ativPrev.dataInicio),
    MAX (ativPrev.dataTermino)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento,
    v_ativPrev_dataInicio,
    v_ativPrev_dataTermino
  FROM MOORCAMENTOXATIVIDADEPREV ativPrev
  JOIN MOORCAMENTOXITENS item
  ON item.idItemOrcamento = ativPrev.idItemOrcamento
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE ativPrev.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento;
  ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idFichaProdutoPrevOrcamento,
    p_idAtividadePrevOrcamento,
    p_ordenacao,
    p_entradaSaida,
    p_localEstoque,
    p_gradeProduto,
    p_personalizacao,
    p_idLoteEstoque,
    p_quantidade,
    p_quantidadeSaldo,
    p_observacoes,
    r_idFichaProdutoPrevOrcamento);
  ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento,
    v_ativPrev_dataInicio,
    v_ativPrev_dataTermino,
    p_idFichaProdutoPrevOrcamento,
    v_bufferIdReservaEstoque,
    v_auxNumber, -- r_quantidadeSaldo
    v_bufferIdReservaEstoque);
END ADD_ORCAMENTO_ITEM_PREV_FIC_AT;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_EC (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idFichaProdutoRealOrcamento IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
  v_bufferIdEstoque        VARCHAR2 (32000);
  v_auxNumber              NUMBER;
BEGIN
  v_bufferIdReservaEstoque := '';
  v_bufferIdEstoque        := '';
  FOR A IN (
    SELECT
      cab.estabelecimento cab_estabelecimento,
      cab.dataEmissao cab_dataEmissao,
      cab.dataEntrega cab_dataEntrega,
      item.modeloDocumento item_modeloDocumento,
      ativPrev.dataInicio ativPrev_dataInicio,
      ativPrev.dataTermino ativPrev_dataTermino,
      a.idFichaProdutoPrevOrcamento
    FROM MOORCAMENTOXFICHAPRODREAL a
    JOIN MOORCAMENTOXATIVIDADEREAL ativReal
    ON ativReal.idAtividadeRealOrcamento = a.idAtividadeRealOrcamento
    JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
    ON ativPrev.idAtividadePrevOrcamento = ativReal.idAtividadePrevOrcamento
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = ativPrev.idItemOrcamento
    JOIN MOORCAMENTOS cab
    ON cab.orcamento = item.orcamento
    WHERE a.idFichaProdutoRealOrcamento = p_idFichaProdutoRealOrcamento)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
      p_idFichaProdutoRealOrcamento,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    IF a.idFichaProdutoPrevOrcamento > 0 THEN
      ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        a.cab_estabelecimento,
        a.cab_dataEmissao,
        a.cab_dataEntrega,
        a.item_modeloDocumento,
        a.ativPrev_dataInicio,
        a.ativPrev_dataTermino,
        a.idFichaProdutoPrevOrcamento,
        v_bufferIdReservaEstoque,
        v_auxNumber, -- r_quantidadeSaldo
        v_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_REAL_FIC_EC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idTarefaOrcamento         IN NUMBER,
  p_idAtividadePrevOrcamento  IN NUMBER,
  p_idCheckListXTarefas       IN NUMBER,
  p_ordenacao                 IN NUMBER,
  p_conteudo                  IN VARCHAR2,
  p_observacoes               IN VARCHAR2,
  /* Retornos */
  r_idTarefaOrcamento         OUT NUMBER)
IS
BEGIN
  r_idTarefaOrcamento := p_idTarefaOrcamento;
  IF r_idTarefaOrcamento = 0 THEN
    r_idTarefaOrcamento := FUNC_ADD_PROXIMO_ID (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      'MOORCAMENTOXTAREFAS',
      'idTarefaOrcamento',
      14);
  END IF;
  MERGE INTO MOORCAMENTOXTAREFAS a 
  USING (
    SELECT
      r_idTarefaOrcamento        idTarefaOrcamento,
      p_idAtividadePrevOrcamento idAtividadePrevOrcamento,
      p_idCheckListXTarefas      idCheckListXTarefas,
      p_ordenacao                ordenacao,
      p_conteudo                 conteudo,
      p_observacoes              observacoes
    FROM DUAL) b
  ON (a.idTarefaOrcamento = b.idTarefaOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento,
    a.idCheckListXTarefas      = b.idCheckListXTarefas,
    a.ordenacao                = b.ordenacao,
    a.conteudo                 = b.conteudo,
    a.observacoes              = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idTarefaOrcamento,
    idAtividadePrevOrcamento,
    idCheckListXTarefas,
    ordenacao,
    conteudo,
    observacoes)
  VALUES (
    b.idTarefaOrcamento,
    b.idAtividadePrevOrcamento,
    b.idCheckListXTarefas,
    b.ordenacao,
    b.conteudo,
    b.observacoes);
END ADD_ORCAMENTO_ITEM_TAREF_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_TAREF_GERA (
  p_sys_estabelecimentoAtivo  IN NUMBER,
  p_config_354_estabProximoId IN NUMBER,
  p_idAtividadePrevOrcamento  IN NUMBER,
  p_checklist                 IN NUMBER)
IS
  v_ordenacao NUMBER;  
  v_auxNumber NUMBER;  
BEGIN
  v_ordenacao := 0;
  DELETE MOORCAMENTOXTAREFAS
  WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento;
  IF p_checklist <> 0 THEN
    FOR a IN (
      SELECT
        idCheckListXTarefas,
        conteudoSugestao
      FROM PACHECKLISTXTAREFAS
      WHERE checklist = p_checklist
      AND ativo = 1
      ORDER BY
        sequencia,
        idCheckListXTarefas)
    LOOP
      v_ordenacao := v_ordenacao + 1;
      ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        p_idAtividadePrevOrcamento,
        a.idCheckListXTarefas,
        v_ordenacao,
        a.conteudoSugestao,
        ' ',
        /* Retornos */
        v_auxNumber);
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_TAREF_GERA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- C = Painel de Compras, 'F' Fatura Contrato, L = Lista Evento, O = Orçamento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_mensagemAviso                IN VARCHAR,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_orcamento               IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_ambiente                IN NUMBER,
  p_item_ambienteObservacoes     IN VARCHAR2,
  p_item_vinculoItemDocumento    IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_statusAtividadeServico  IN CHAR,
  p_item_controleEntrega         IN NUMBER,
  p_item_dataEntrega             IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_atividadeProjeto        IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_idAtividadesPrevistasSelec   IN VARCHAR2,
  p_nivel                        IN NUMBER,
  p_buffer_idItemOrcamento       IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_idItemOrcamento       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_finalidadeNota           CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_controleEntrega          NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_contrEntr_habilitaFrete  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeSaldo         NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorFreteGeral         NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_contrEntr_habilitaFrete      NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemOrcamento       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_ativ_criouPendenteIniciado   NUMBER;
  v_ativ_idAtividadePrevOrcamen  NUMBER;
  v_ativ_sequencia               NUMBER;
  v_ativ_tecnico                 NUMBER;
  v_ativ_checklist               NUMBER;
  v_ativ_gradeProdutoXFichaAtiv  NUMBER;
  v_ativ_idAtividadeRealOrcament NUMBER;
  v_ativ_idFichaProdutoPrevOrcam NUMBER;
  v_ativ_ordenacaoFichaProdutoPr NUMBER;
  v_ativ_atualizaCustoMedio      NUMBER;
  v_ativ_atualizaUltimaCompra    NUMBER;
  v_ativ_selecionaAtividadePrev  NUMBER;
  v_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          NUMBER;
  v_ativ_geraFinanceiro          NUMBER;
  v_valorFreteRegra              NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := p_mensagemAviso;
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemOrcamento := p_item_idItemOrcamento;
  r_buffer_idItemOrcamento := p_buffer_idItemOrcamento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.transportadora,
    cab.enderecoTransportadora,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_finalidadeNota,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_transportadora,
    v_cab_enderecoTransportadora,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.orcamento = p_item_orcamento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_controleEntrega          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_contrEntr_habilitaFrete  := 0;
  v_item_quantidadeSaldo         := p_item_quantidade;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorFreteGeral         := p_item_valorFreteGeral;
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  v_contrEntr_habilitaFrete      := 0;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOORCAMENTOXPROMOCOES
    WHERE orcamento = p_item_orcamento;
  END IF;
  IF p_item_idItemOrcamento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeSaldo,
        a.controleEntrega,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        prod.tipoProduto,
        b.habilitaFrete
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA b
      ON b.controleEntrega = a.controleEntrega
      WHERE a.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_controleEntrega := a.controleEntrega;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_contrEntr_habilitaFrete := 0;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_contrEntr_habilitaFrete := a.habilitaFrete;
      IF p_buscarAliquotas_CalcularImp = 'T' THEN
        IF p_buscarGeraFinanceiroEstoque = 1 THEN
          v_item_movimentaEstoque        := a.movimentaEstoque;
          v_item_geraFinanceiro          := a.geraFinanceiro;
        END IF;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF a.cancelado = 0 THEN
        v_item_quantidadeSaldo := v_item_quantidadeSaldo + a.quantidadeSaldo - a.quantidade;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> v_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    v_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = 'E'
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        0, -- v_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_ORCAMENTO_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_config_430_sugerirUsuLogTec,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, 
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND (a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_mensagemAviso,
        r_calcularImpostos,
        0, -- p_item_idItemOrcamento
        p_item_orcamento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_ambiente,
        p_item_ambienteObservacoes,
        999, -- p_item_vinculoItemDocumento
        0, -- p_item_atividadeServico
        'A', -- p_item_statusAtividadeServico
        p_item_controleEntrega,
        p_item_dataEntrega,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_atividadeProjeto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(v_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- v_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        ' ', -- p_idAtividadesPrevistasSelec
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_idItemOrcamento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemOrcamento)) >= 14
      LOOP
        v_ajuste_idItemOrcamento := TO_NUMBER(SUBSTR(r_buffer_idItemOrcamento,1,14));
        r_buffer_idItemOrcamento := RTRIM(SUBSTR(r_buffer_idItemOrcamento,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MOORCAMENTOXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemOrcamento = v_ajuste_idItemOrcamento;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MOORCAMENTOXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemOrcamento = v_ajuste_idItemOrcamento;
      END LOOP;
      UPDATE MOORCAMENTOS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE orcamento          = p_item_orcamento;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemOrcamento <= 0 THEN
      r_item_idItemOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXITENS', 'idItemOrcamento', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF p_item_controleEntrega > 0 THEN
        SELECT habilitaFrete
        INTO v_contrEntr_habilitaFrete
        FROM PACONTROLESENTREGA
        WHERE controleEntrega = p_item_controleEntrega;
      END IF;
      IF
        CASE
          WHEN v_ini_controleEntrega = 0
            OR v_ini_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_ini_valorProdutoServicoBruto - v_ini_valorDescontoItem + v_ini_valorAcrescimoItem
        END <>
        CASE
          WHEN p_item_controleEntrega = 0
            OR v_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem
        END
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0, -- p_buscarESalvarInternamente
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_ini_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit,
          r_item_idItemOrcamento,
          p_item_pesoLiquido,
          p_item_pesoBruto,
          v_item_valorProdutoServicoBrut,
          p_item_valorDescontoItem,
          p_item_valorAcrescimoItem,
          p_item_controleEntrega,
          v_item_valorFreteGeral,
          v_contrEntr_habilitaFrete,
          /* Retornos */
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_valorFreteRegra,
          v_auxNumber);
        IF v_valorFreteRegra <> v_ini_cab_valorFreteGeral THEN
          v_item_valorFreteGeral := v_valorFreteRegra - v_cab_valorFreteGeral;
        END IF;
      ELSIF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        v_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        0, -- p_cab_vendaConsumidor
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        0, -- p_movimentaEstoqueFiscal
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_auxNumber, -- r_movimentaEstoqueFiscal
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar, -- r_item_stICMSEscrit
        v_auxNumber, -- r_item_reducaoBaseICMSEscrit
        v_auxNumber, -- r_item_aliquotaICMSEscrit
        v_auxNumber, -- r_item_diferimentoICMSEscritur
        v_auxNumber, -- r_item_margemValorAdicSTEscrit
        v_auxNumber, -- r_item_reducaoBaseSTEscrit
        v_auxNumber, -- r_item_aliquotaICMSSTEscrit
        v_auxNumber, -- r_item_somarICMSST
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        0, -- p_valorIPIDevolucao
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        0, -- p_calcularICMSEscrituracao
        '  ', -- p_stICMSEscrituracao
        0, -- p_reducaoBaseICMSEscrituracao
        0, -- p_aliquotaICMSEscrituracao
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        0, -- p_calcularICMSSTEscrituracao
        0, -- p_margemValorAdicSTEscriturac
        0, -- p_reducaoBaseSTEscrituracao
        0, -- p_aliquotaICMSSTEscrituracao
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber, -- r_baseICMSEscrituracao
        v_auxNumber, -- r_valorICMSEscrituracao
        v_auxNumber, -- r_valorICMSDesonEscrituracao
        v_auxNumber, -- r_baseICMSSTEscrituracao
        v_auxNumber, -- r_valorICMSSTEscrituracao
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    END IF;
    UPDATE MOORCAMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      transportadora                = v_cab_transportadora,
      enderecoTransportadora        = v_cab_enderecoTransportadora,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      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,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_sys_estabelecimentoAtivo,
          v_cab_tipoDocumento,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'O',
      r_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MOORCAMENTOXITENS
    SET observacoes = v_observacoes
    WHERE idItemOrcamento = r_item_idItemOrcamento;
    r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
    THEN
      v_ativ_criouPendenteIniciado := 0;
      v_ativ_sequencia             := 0;
      v_ativ_tecnico               := 0;
      v_ativ_checklist             := 0;
      -- Atividades Previstas Ordem Serviço
      IF v_cab_tipoDocumento = 102
        AND p_item_atividadeServico > 0
      THEN
        SELECT
          habilitaAtividadePrevista,
          selecionaAtividadePrevista
        INTO
          v_auxNumber,
          v_ativ_selecionaAtividadePrev
        FROM PAATIVIDADESSERVICO
        WHERE atividadeServico = p_item_atividadeServico;
        IF p_config_430_sugerirUsuLogTec = 1 THEN
          SELECT COALESCE (MAX (tecnico), 0)
          INTO v_ativ_tecnico
          FROM CATECNICOS
          WHERE tecnico = p_sys_usuarioLogado
          AND ativo = 1;
        END IF;
        IF v_auxNumber = 1 THEN
          FOR a IN (
            SELECT
              a.atividadeServicoPrevista,
              a.tecnico,
              a.faturarAtividade,
              a.etapaAtividade,
              a.observacoes,
              COALESCE ((
                SELECT MAX (b.checklist)
                FROM (
                  SELECT
                    b.atividadeServico,
                    b.checklist,
                    ROW_NUMBER() OVER (
                      PARTITION BY b.atividadeServico
                      ORDER BY
                        b.atividadeServico,
                        b.ordenacao,
                        b.id) ordenacao
                  FROM PAATIVIDADESERVXCHECKLIST b
                  WHERE b.ativo = 1) b
                WHERE b.atividadeServico = a.atividadeServicoPrevista
                AND b.ordenacao = 1), 0) checklist,
              CASE ativ.gradeProduto
                WHEN 0
                THEN 0
                WHEN p_item_gradeProduto
                THEN v_item_precoUnitario
                ELSE FUNC_ADD_BUSCA_PRECO (
                  p_config_64_casasDecSaidas,
                  p_config_209_filtrarGrupoEcon,
                  p_config_362_calcCustoPorGrade,
                  p_sys_perfilUsuarioLogado,
                  p_sys_usuarioLogado,
                  v_cab_estabelecimento,
                  SYSDATE, -- p_cab_dataPrecoFinal
                  v_cab_pessoa,
                  v_munEndEst_uf,
                  v_munEndPess_uf,
                  p_item_vendedor,
                  0, -- p_item_idFormulaTinta
                  0, -- p_item_personalizacao
                  gradProd.produto,
                  gradProd.cor,
                  gradProd.tamanho,
                  prod.controleEstoque,
                  p_item_tipoPreco,
                  p_item_tabelaPreco)
              END precoUnitario
            FROM PAATIVIDADEOSXPREVISTA a
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = a.atividadeServicoPrevista
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE a.id > 0
            AND (v_ativ_selecionaAtividadePrev = 0
              AND a.atividadeServicoOs = p_item_atividadeServico
              AND a.ativo = 1
              AND a.sugestao = 1
              OR v_ativ_selecionaAtividadePrev = 1
              AND INSTR (',' || TRIM (p_idAtividadesPrevistasSelec) || ',', ',' || TO_CHAR (a.id) || ',') > 0)
            ORDER BY
              a.atividadeServicoOs,
              a.ordenacao,
              a.id)
          LOOP
            v_ativ_sequencia := v_ativ_sequencia + 1;
            ADD_ORCAMENTO_ITEM_PREV_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadePrevOrcamento
              r_item_idItemOrcamento,
              v_ativ_sequencia, -- p_sequencia
              a.atividadeServicoPrevista, -- p_atividadeServico
              ' ', -- p_descricao
              CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
              a.faturarAtividade, -- p_faturarAtividade
              a.checklist, -- p_checklist
              'I', -- p_tipoApontamento
              0, -- p_editaQuantidades
              a.etapaAtividade, -- p_etapaAtividade
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
              0, -- p_quantidade
              a.precoUnitario, -- p_precoUnitario
              a.observacoes, -- p_observacoes
              v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
            v_ativ_criouPendenteIniciado := 1;
            IF a.checklist > 0 THEN
              ADD_ORCAMENTO_ITEM_TAREF_GERA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                a.checklist); -- p_checklist
            END IF;
            IF v_ativ_criouPendenteIniciado = 0
              AND CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado
            THEN
              ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadeRealOrcamento
                v_ativ_idAtividadePrevOrcamen,
                1, -- p_sequencia
                a.atividadeServicoPrevista, -- p_atividadeServico
                ' ', -- p_descricao
                CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
                'I', -- p_statusAtividadeServico
                SYSDATE, -- p_dataInicio
                NULL, -- p_dataTermino
                p_item_modeloDocumento,
                0, -- p_motivoEstoque
                0, -- p_quantidade
                ' ', -- p_observacoes
                /* Retornos */
                v_ativ_idAtividadeRealOrcament);
            END IF;
          END LOOP;
          IF v_ativ_sequencia = 0
            AND v_ativ_selecionaAtividadePrev = 0
          THEN
            SELECT COALESCE (MAX (validoPrevisto), 0)
            INTO v_auxNumber
            FROM PAATIVIDADESSERVICO
            WHERE atividadeServico = p_item_atividadeServico;
            IF v_auxNumber = 1 THEN
              SELECT COALESCE (MAX (c.checklist),0)
              INTO v_ativ_checklist
              FROM (
                SELECT
                  b.checklist,
                  ROW_NUMBER() OVER (
                    ORDER BY
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.atividadeServico = p_item_atividadeServico
                AND b.ativo = 1) c
              WHERE c.ordenacao = 1;
              v_ativ_sequencia := v_ativ_sequencia + 1;
              ADD_ORCAMENTO_ITEM_PREV_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadePrevOrcamento
                r_item_idItemOrcamento,
                v_ativ_sequencia,  -- p_sequencia
                p_item_atividadeServico, -- p_atividadeServico
                ' ', -- p_descricao
                v_ativ_tecnico, -- p_tecnico
                'N', -- p_faturarAtividade
                v_ativ_checklist, -- p_checklist
                'I', -- p_tipoApontamento
                0, -- p_editaQuantidades
                0, -- p_etapaAtividade
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN v_ativ_tecnico = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
                0, -- p_quantidade
                v_item_precoUnitario, -- p_precoUnitario
                ' ', -- p_observacoes
                v_ativ_idAtividadePrevOrcamen);  -- r_idAtividadePrevOrcamento
              v_ativ_criouPendenteIniciado := 1;
              IF v_ativ_checklist > 0 THEN
                ADD_ORCAMENTO_ITEM_TAREF_GERA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                  v_ativ_checklist); -- p_checklist
              END IF;
              IF v_ativ_criouPendenteIniciado = 0
                AND v_ativ_tecnico = p_sys_usuarioLogado
              THEN
                ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  0, -- p_idAtividadeRealOrcamento
                  v_ativ_idAtividadePrevOrcamen,
                  1, -- p_sequencia
                  p_item_atividadeServico, -- p_atividadeServico
                  ' ', -- p_descricao
                  v_ativ_tecnico, -- p_tecnico
                  'I', -- p_statusAtividadeServico
                  SYSDATE, -- p_dataInicio
                  NULL, -- p_dataTermino
                  p_item_modeloDocumento,
                  0, -- p_motivoEstoque
                  0, -- p_quantidade
                  ' ', -- p_observacoes
                  /* Retornos */
                  v_ativ_idAtividadeRealOrcament);
              END IF;
            END IF;
          END IF;
        END IF;
      -- Atividades Previstas Ordem Produção
      ELSIF v_cab_tipoDocumento = 202
        AND v_prod_controleEstoque = 6
      THEN
        SELECT COALESCE (MAX (a.gradeProdutoXFichaAtividade), 0)
        INTO v_ativ_gradeProdutoXFichaAtiv
        FROM (
        SELECT
          ROW_NUMBER() OVER (ORDER BY ordenacao DESC) ordenacao,
          gradeProdutoXFichaAtividade  
        FROM CAGRADEPRODUTOXFICHAATIV
        WHERE gradeProduto = p_item_gradeProduto
        AND gradeProdutoXFichaAtividade > 0
        AND ativo = 1) a
        WHERE a.ordenacao = 1;
        FOR a IN (
          SELECT
            a.gradeProdutoXFichaAtividade,
            a.atividadeServico,
            a.tipoApontamento,
            a.editaQuantidades,
            a.quantidade,
            a.observacoes,
            COALESCE ((
              SELECT MAX (b.checklist)
              FROM (
                SELECT
                  b.atividadeServico,
                  b.checklist,
                  ROW_NUMBER() OVER (
                    PARTITION BY b.atividadeServico
                    ORDER BY
                      b.atividadeServico,
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.ativo = 1) b
              WHERE b.atividadeServico = a.atividadeServico
              AND b.ordenacao = 1), 0) checklist,
            CASE ativ.gradeProduto
              WHEN 0
              THEN 0
              WHEN p_item_gradeProduto
              THEN v_item_precoUnitario
              ELSE FUNC_ADD_BUSCA_PRECO (
                p_config_64_casasDecSaidas,
                p_config_209_filtrarGrupoEcon,
                p_config_362_calcCustoPorGrade,
                p_sys_perfilUsuarioLogado,
                p_sys_usuarioLogado,
                v_cab_estabelecimento,
                SYSDATE, -- p_cab_dataPrecoFinal
                v_cab_pessoa,
                v_munEndEst_uf,
                v_munEndPess_uf,
                p_item_vendedor,
                0, -- p_item_idFormulaTinta
                0, -- p_item_personalizacao
                gradProd.produto,
                gradProd.cor,
                gradProd.tamanho,
                prod.controleEstoque,
                p_item_tipoPreco,
                p_item_tabelaPreco)
            END precoUnitario
          FROM CAGRADEPRODUTOXFICHAATIV a
          JOIN PAATIVIDADESSERVICO ativ
          ON ativ.atividadeServico = a.atividadeServico
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = ativ.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE a.gradeProduto = p_item_gradeProduto
          AND a.gradeProdutoXFichaAtividade > 0
          AND a.ativo = 1
          ORDER BY a.ordenacao)
        LOOP
          v_ativ_sequencia := v_ativ_sequencia + 1;
          ADD_ORCAMENTO_ITEM_PREV_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idAtividadePrevOrcamento
            r_item_idItemOrcamento,
            v_ativ_sequencia, -- p_sequencia
            a.atividadeServico, -- p_atividadeServico
            ' ', -- p_descricao
            0, -- p_tecnico
            'N', -- p_faturarAtividade
            a.checklist, -- p_checklist
            a.tipoApontamento, -- p_tipoApontamento
            a.editaQuantidades, -- p_editaQuantidades
            0, -- p_etapaAtividade
            CASE WHEN a.tipoApontamento = 'N' THEN 'E' WHEN v_ativ_criouPendenteIniciado = 0 THEN 'P' ELSE 'A' END, -- p_statusAtividadeServico
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataInicio
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataTermino
            a.quantidade, -- p_quantidade
            a.precoUnitario, -- p_precoUnitario
            a.observacoes, -- p_observacoes
            v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
          IF a.checklist > 0 THEN
            ADD_ORCAMENTO_ITEM_TAREF_GERA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
              a.checklist); -- p_checklist
          END IF;
          IF a.tipoApontamento = 'N' THEN
            ADD_ORCAMENTO_ITEM_REAL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadeRealOrcamento
              v_ativ_idAtividadePrevOrcamen,
              1, -- p_sequencia
              a.atividadeServico, -- p_atividadeServico
              ' ', -- p_descricao
              0, -- p_tecnico
              'E', -- p_statusAtividadeServico
              SYSDATE, -- p_dataInicio
              SYSDATE, -- p_dataTermino
              p_item_modeloDocumento,
              0, -- p_motivoEstoque
              a.quantidade, -- p_quantidade
              ' ', -- p_observacoes
              /* Retornos */
              v_ativ_idAtividadeRealOrcament);
          ELSE
            v_ativ_criouPendenteIniciado := 1;
          END IF;
          v_ativ_ordenacaoFichaProdutoPr := 0;
          IF a.gradeProdutoXFichaAtividade = v_ativ_gradeProdutoXFichaAtiv THEN
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'E', -- entradaSaida,
              p_item_localEstoque, -- p_localEstoque
              p_item_gradeProduto,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              p_item_quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE p_item_quantidade END, -- p_quantidadeSaldo
              V_observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              SELECT
                atualizaCustoMedio,
                atualizaUltimaCompra
              INTO
                v_ativ_atualizaCustoMedio,
                v_ativ_atualizaUltimaCompra
              FROM PAMODELOSDOCUMENTO
              WHERE modeloDocumento = p_item_modeloDocumento;
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                v_ativ_atualizaCustoMedio, -- p_atualizaCustoMedio
                v_ativ_atualizaUltimaCompra, -- p_atualizaUltimaCompra
                'E', -- p_entradaSaida,
                p_item_localEstoque, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                p_item_gradeProduto,
                p_item_personalizacao,
                p_item_idLoteEstoque,
                p_item_quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                v_observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
              UPDATE MOORCAMENTOXITENS
              SET quantidadeSaldo = 0
              WHERE idItemOrcamento = r_item_idItemOrcamento;
            END IF;
          END IF;
          FOR b IN (
            SELECT
              b.ordenacao,
              b.gradeProduto,
              b.quantidade,
              b.localEstoque,
              b.observacoes
            FROM CAGRADEPRODUTOXFICHAPROD b
            WHERE b.gradeProdutoXFichaAtividade = a.gradeProdutoXFichaAtividade
            AND b.id > 0
            AND b.ativo = 1
            ORDER BY b.ordenacao)
          LOOP
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'S', -- entradaSaida,
              CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
              b.gradeProduto,
              0, -- personalizacao,
              0, -- b.idLoteEstoque,
              b.quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE b.quantidade END, -- p_quantidadeSaldo
              b.observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                'S', -- p_entradaSaida,
                CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                b.gradeProduto,
                0, -- personalizacao,
                0, -- b.idLoteEstoque,
                b.quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                b.observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
            END IF;
          END LOOP;
        END LOOP;
      END IF;
      -- Se inseriu Atividades Previstas
      IF v_ativ_sequencia > 0 THEN
        SELECT
          COUNT (1) numeroAtividades,
          SUM (
            CASE
              WHEN prev.faturarAtividade = 'P'
              THEN prev.quantidade
              ELSE COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
            END) quantidade,
          MIN (prev.precoUnitario) precoUnitarioMenor,
          MAX (prev.precoUnitario) precoUnitarioMaior,
          SUM (ROUND (
            CASE
              WHEN prev.faturarAtividade = 'P'
              THEN prev.quantidade
              ELSE COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
            END * prev.precoUnitario, 2)) valorTotalItem
        INTO
          v_ativ_numero,
          v_ativ_quantidade,
          v_ativ_precoUnitarioMenor,
          v_ativ_precoUnitario,
          v_ativ_valorTotalItem
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = r_item_idItemOrcamento
        AND prev.statusAtividadeServico <> 'C'
        AND prev.faturarAtividade IN ('P','R');
        IF v_ativ_numero > 0 THEN
          v_ativ_geraFinanceiro := 1;
          IF v_ativ_numero > 1
            AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
            AND v_ativ_quantidade <> 0
          THEN
            v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
          END IF;
        ELSE
          SELECT
            COUNT (1) numeroAtividades,
            SUM (COALESCE ((
              SELECT realiz.quantidade
              FROM MOORCAMENTOXATIVIDADEREAL realiz
              WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
              AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (COALESCE ((
              SELECT realiz.quantidade
              FROM MOORCAMENTOXATIVIDADEREAL realiz
              WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
              AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          JOIN PAATIVIDADESSERVICO ativ
          ON ativ.atividadeServico = prev.atividadeServico
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = ativ.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND ativ.gradeProduto > 0
          AND prod.unidadeMedida = v_prod_unidadeMedida;
          IF v_ativ_numero > 0 THEN
            v_ativ_geraFinanceiro := 0;
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          END IF;
        END IF;
        IF v_ativ_numero > 0
          AND (v_ativ_quantidade <> p_item_quantidade
            OR v_ativ_precoUnitario <> v_item_precoUnitario
            OR v_ativ_geraFinanceiro <> v_item_geraFinanceiro)
        THEN
          ADD_ORCAMENTO_ITEM_GRAVA (
            ' ', -- p_sessaoClient
            p_sys_usuarioLogado,
            p_sys_perfilUsuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_190_modeloFrete,
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_198_obs_add_referenc,
            p_config_199_obs_add_caractA,
            p_config_200_obs_add_caractB,
            p_config_201_obs_add_caractC,
            p_config_202_obs_add_caractD,
            p_config_203_obs_add_caractE,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            p_config_413_obs_add_marca,
            p_config_418_obs_efetarEnter,
            p_config_430_sugerirUsuLogTec,
            0, -- p_manterFinanceiro_Retotalizar,
            'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
            0, -- p_buscarGeraFinanceiroEstoque,
            ' ', -- p_tipoDocumentoReferenciado, 
            0, -- p_idItemReferenciado,
            0, -- p_quantidadeReferenciada
            ' ', -- p_tempComp_nomeTempComposicao,
            0, -- p_tempComp_sequencia
            ' ', -- p_mensagemAviso,
            r_calcularImpostos,
            r_item_idItemOrcamento,
            p_item_orcamento,
            p_item_pedidoCompraFornecedor,
            p_item_sequenciaPedidoCompraFo,
            p_item_ambiente,
            p_item_ambienteObservacoes,
            p_item_vinculoItemDocumento,
            p_item_atividadeServico,
            p_item_statusAtividadeServico,
            p_item_controleEntrega,
            p_item_dataEntrega,
            p_item_modeloDocumento,
            p_item_estabelecimentoOriginal,
            p_item_vendedor,
            p_item_gradeProduto,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            0, -- p_item_idNumeroSerie
            0, -- p_item_atividadeProjeto,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_controleQuantidade,
            p_item_unidadeMedidaConversao,
            p_item_conversorQuantidade,
            p_item_loteMinimo,
            p_item_loteMultiplo,
            p_item_altura,
            p_item_largura,
            p_item_comprimento,
            ROUND (CASE p_item_controleQuantidade
              WHEN 2
              THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
              WHEN 3
              THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
              WHEN 4
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE v_ativ_quantidade / p_item_conversorQuantidade END
              ELSE 0
            END, 3), -- p_item_pecas
            v_ativ_quantidade,
            ROUND (CASE p_item_controleQuantidade
              WHEN 2
              THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
              WHEN 3
              THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
              WHEN 4
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade / p_item_conversorQuantidade END
              WHEN 5
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade * p_item_conversorQuantidade END
              ELSE v_ativ_quantidade
            END, 6), -- p_item_quantidadeConvertida
            ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
            ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
            p_item_tipoPreco,
            p_item_tabelaPreco,
            p_item_precoSugestaoAPrazo,
            p_item_precoSugestaoAVista,
            p_item_precoDesconto,
            p_item_precoMinimo,
            p_item_usarPrecoAVista,
            v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
            p_item_acrescimoUnitarioCompos,
            v_ativ_precoUnitario, -- p_item_precoUnitario
            p_item_percDescontoItem,
            p_item_valorDescontoItem,
            p_item_percAcrescimoItem,
            p_item_valorAcrescimoItem,
            p_item_valorFreteItem,
            p_item_valorSeguroItem,
            p_item_valorAdicFreteMarItem,
            p_item_valorDespesasAduanItem,
            p_item_observacoesDigitadas,
            v_item_valorFreteGeral,
            p_item_valorSeguroGeral,
            v_item_valorDescontoGeral,
            p_item_valorOutrasDespesasGer,
            p_item_valorAdicFreteMarGeral,
            p_item_valorDespesasAduanGeral,
            v_item_valorDescontoPagamento,
            v_item_valorOutrasDespPagament,
            v_item_valorJurosPagamento,
            p_item_operacaoFiscal,
            v_item_movimentaEstoque,
            v_ativ_geraFinanceiro,
            0, -- p_item_cfop
            ' ', -- p_item_indicadorISSQN
            0, -- p_item_aliquotaISSQN
            0, -- p_item_retidoISSQN
            0, -- p_item_tributadoForaMunicipio
            0, -- p_item_incentivoFiscal
            0, -- p_item_listaServicos
            0, -- p_item_cnae
            0, -- p_item_idServicoMunicipio
            ' ', -- p_item_numeroProcessoAdministr
            0, -- p_item_retencaoIRRF
            0, -- p_item_retencaoINSS
            0, -- p_item_retencaoPIS
            0, -- p_item_retencaoCOFINS
            0, -- p_item_retencaoCSLL
            0, -- p_item_retencaoOutros
            0, -- p_item_aliquotaII
            0, -- p_item_aliquotaIOF
            0, -- p_item_codigoEnquadramentoIPI
            0, -- p_item_stIPI
            0, -- p_item_aliquotaIPI
            0, -- p_item_valorAliquotaIPI
            ' ', -- p_item_stPIS
            0, -- p_item_aliquotaPIS
            0, -- p_item_valorAliquotaPIS
            0, -- p_item_aliquotaPISST
            0, -- p_item_valorAliquotaPISST
            ' ', -- p_item_stCOFINS
            0, -- p_item_aliquotaCOFINS
            0, -- p_item_valorAliquotaCOFINS
            0, -- p_item_aliquotaCOFINSST
            0, -- p_item_valorAliquotaCOFINSST
            '   ', -- p_item_stSimplesNacional
            0, -- p_item_creditoSimplesNacional
            '  ', -- p_item_stICMS
            0, -- p_item_modalBaseCalcICMS
            0, -- p_item_reducaoBaseICMS
            0, -- p_item_aliquotaICMS
            0, -- p_item_diferimentoICMS
            ' ', -- p_item_motivoDesoneracaoICMS
            0, -- p_item_idBeneficio
            ' ', -- p_item_modalBaseCalcICMSST
            0, -- p_item_margemValorAdicionadoST
            0, -- p_item_reducaoBaseST
            0, -- p_item_aliquotaICMSST
            0, -- p_item_aliquotaSTSuportConsFin
            0, -- p_item_reducaoBaseICMSEfetivo
            0, -- p_item_aliquotaICMSEfetivo
            0, -- p_item_aliquotaICMSUFDestinat
            0, -- p_item_aliquotaICMSInterestad
            0, -- p_item_partilhaICMSInterestad
            0, -- p_item_aliquotaFCP
            0, -- p_item_aliquotaFCPST
            0, -- p_item_aliquotaFCPSTAnteriorm
            0, -- p_item_aliquotaFCPUFDestinat
            0, -- p_item_aliquotaEstImpFederais
            0, -- p_item_aliquotaEstImpEstaduais
            0, -- p_item_aliquotaEstImpMunicipai
            0, -- p_item_baseISSQN
            0, -- p_item_valorISSQN
            0, -- p_item_baseRetIRRF
            0, -- p_item_valorRetIRRF
            0, -- p_item_baseRetINSS
            0, -- p_item_valorRetINSS
            0, -- p_item_baseRetPIS
            0, -- p_item_valorRetPIS
            0, -- p_item_baseRetCOFINS
            0, -- p_item_valorRetCOFINS
            0, -- p_item_baseRetCSLL
            0, -- p_item_valorRetCSLL
            0, -- p_item_baseRetOutros
            0, -- p_item_valorRetOutros
            0, -- p_item_baseII
            0, -- p_item_valorII
            0, -- p_item_baseIOF
            0, -- p_item_valorIOF
            0, -- p_item_baseIPI
            0, -- p_item_valorIPI
            0, -- p_item_basePIS
            0, -- p_item_valorPIS
            0, -- p_item_basePISST
            0, -- p_item_valorPISST
            0, -- p_item_baseCOFINS
            0, -- p_item_valorCOFINS
            0, -- p_item_baseCOFINSST
            0, -- p_item_valorCOFINSST
            0, -- p_item_baseCreditoSimplesNac
            0, -- p_item_valorCreditoSimplesNac
            0, -- p_item_baseICMS
            0, -- p_item_valorICMSOperacao
            0, -- p_item_valorICMSDiferido
            0, -- p_item_valorICMS
            0, -- p_item_valorICMSDesoneracao
            0, -- p_item_baseICMSST
            0, -- p_item_valorICMSST
            0, -- p_item_baseICMSSTAnteriormente
            0, -- p_item_valorICMSSTAnteriorment
            0, -- p_item_valorICMSProprioSubstit
            0, -- p_item_baseICMSEfetivo
            0, -- p_item_valorICMSEfetivo
            0, -- p_item_baseICMSUFDestinatario
            0, -- p_item_valorICMSUFDestinatario
            0, -- p_item_baseICMSUFRemetente
            0, -- p_item_valorICMSUFRemetente
            0, -- p_item_baseFCP
            0, -- p_item_valorFCP
            0, -- p_item_baseFCPST
            0, -- p_item_valorFCPST
            0, -- p_item_baseFCPSTAnteriormente
            0, -- p_item_valorFCPSTAnteriormente
            0, -- p_item_baseFCPUFDestinatario
            0, -- p_item_valorFCPUFDestinatario
            0, -- p_item_baseEstimadaImpostos
            0, -- p_item_valorEstImpFederais
            0, -- p_item_valorEstImpEstaduais
            0, -- p_item_valorEstImpMunicipais
            ' ', -- p_idAtividadesPrevistasSelec
            0, -- p_nivel,
            ' ',
            v_auxVarchar, -- r_mensagemAviso
            r_calcularImpostos,
            v_auxNumber, -- idItemOrcamento
            v_auxVarchar, -- r_buffer_idItemOrcamento
            v_auxNumber); -- r_valorInserido
        END IF;
        ADD_ORCAMENTO_ITEM_STATUS_CALC (r_item_idItemOrcamento);
      END IF;
    END IF;
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      r_item_idItemOrcamento,
      '',
      '',
      v_auxVarchar,
      v_auxVarchar);
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_ativ_geraFinanceiro     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    v_ativ_geraFinanceiro := 1;
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
        MIN (prev.precoUnitario) precoUnitarioMenor,
        MAX (prev.precoUnitario) precoUnitarioMaior,
        SUM (ROUND (COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
    INTO
      v_ativ_numero,
      v_ativ_quantidade,
      v_ativ_precoUnitarioMenor,
      v_ativ_precoUnitario,
      v_ativ_valorTotalItem
    FROM MOORCAMENTOXATIVIDADEPREV prev
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = p_idItemOrcamento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = prev.atividadeServico
    JOIN CAGRADESPRODUTO gradProdAtiv
    ON gradProdAtiv.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prodAtiv
    ON prodAtiv.produto = gradProdAtiv.produto
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C'
    AND ativ.gradeProduto > 0
    AND prodAtiv.unidadeMedida = prod.unidadeMedida;
    IF v_ativ_numero > 0 THEN
      v_ativ_geraFinanceiro := 0;
      IF v_ativ_numero > 1
        AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
        AND v_ativ_quantidade <> 0
      THEN
        v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
      END IF;
    END IF;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
        OR v_ativ_geraFinanceiro <> a.geraFinanceiro
      THEN
        ADD_ORCAMENTO_ITEM_GRAVA (
          ' ', -- p_sessaoClient
          p_usuarioLogado,
          p_perfilUsuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_64_casasDecSaidas,
          p_config_65_casasDecEntrada,
          p_config_198_obs_add_referenc,
          p_config_199_obs_add_caractA,
          p_config_200_obs_add_caractB,
          p_config_201_obs_add_caractC,
          p_config_202_obs_add_caractD,
          p_config_203_obs_add_caractE,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_378_calcularVolumes,
          p_config_413_obs_add_marca,
          p_config_418_obs_efetarEnter,
          p_config_430_sugerirUsuLogTec,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          v_ativ_geraFinanceiro,
          0, -- p_item_cfop
          ' ', -- p_item_indicadorISSQN
          0, -- p_item_aliquotaISSQN
          0, -- p_item_retidoISSQN
          0, -- p_item_tributadoForaMunicipio
          0, -- p_item_incentivoFiscal
          0, -- p_item_listaServicos
          0, -- p_item_cnae
          0, -- p_item_idServicoMunicipio
          ' ', -- p_item_numeroProcessoAdministr
          0, -- p_item_retencaoIRRF
          0, -- p_item_retencaoINSS
          0, -- p_item_retencaoPIS
          0, -- p_item_retencaoCOFINS
          0, -- p_item_retencaoCSLL
          0, -- p_item_retencaoOutros
          0, -- p_item_aliquotaII
          0, -- p_item_aliquotaIOF
          0, -- p_item_codigoEnquadramentoIPI
          0, -- p_item_stIPI
          0, -- p_item_aliquotaIPI
          0, -- p_item_valorAliquotaIPI
          ' ', -- p_item_stPIS
          0, -- p_item_aliquotaPIS
          0, -- p_item_valorAliquotaPIS
          0, -- p_item_aliquotaPISST
          0, -- p_item_valorAliquotaPISST
          ' ', -- p_item_stCOFINS
          0, -- p_item_aliquotaCOFINS
          0, -- p_item_valorAliquotaCOFINS
          0, -- p_item_aliquotaCOFINSST
          0, -- p_item_valorAliquotaCOFINSST
          '   ', -- p_item_stSimplesNacional
          0, -- p_item_creditoSimplesNacional
          '  ', -- p_item_stICMS
          0, -- p_item_modalBaseCalcICMS
          0, -- p_item_reducaoBaseICMS
          0, -- p_item_aliquotaICMS
          0, -- p_item_diferimentoICMS
          ' ', -- p_item_motivoDesoneracaoICMS
          0, -- p_item_idBeneficio
          ' ', -- p_item_modalBaseCalcICMSST
          0, -- p_item_margemValorAdicionadoST
          0, -- p_item_reducaoBaseST
          0, -- p_item_aliquotaICMSST
          0, -- p_item_aliquotaSTSuportConsFin
          0, -- p_item_reducaoBaseICMSEfetivo
          0, -- p_item_aliquotaICMSEfetivo
          0, -- p_item_aliquotaICMSUFDestinat
          0, -- p_item_aliquotaICMSInterestad
          0, -- p_item_partilhaICMSInterestad
          0, -- p_item_aliquotaFCP
          0, -- p_item_aliquotaFCPST
          0, -- p_item_aliquotaFCPSTAnteriorm
          0, -- p_item_aliquotaFCPUFDestinat
          0, -- p_item_aliquotaEstImpFederais
          0, -- p_item_aliquotaEstImpEstaduais
          0, -- p_item_aliquotaEstImpMunicipai
          0, -- p_item_baseISSQN
          0, -- p_item_valorISSQN
          0, -- p_item_baseRetIRRF
          0, -- p_item_valorRetIRRF
          0, -- p_item_baseRetINSS
          0, -- p_item_valorRetINSS
          0, -- p_item_baseRetPIS
          0, -- p_item_valorRetPIS
          0, -- p_item_baseRetCOFINS
          0, -- p_item_valorRetCOFINS
          0, -- p_item_baseRetCSLL
          0, -- p_item_valorRetCSLL
          0, -- p_item_baseRetOutros
          0, -- p_item_valorRetOutros
          0, -- p_item_baseII
          0, -- p_item_valorII
          0, -- p_item_baseIOF
          0, -- p_item_valorIOF
          0, -- p_item_baseIPI
          0, -- p_item_valorIPI
          0, -- p_item_basePIS
          0, -- p_item_valorPIS
          0, -- p_item_basePISST
          0, -- p_item_valorPISST
          0, -- p_item_baseCOFINS
          0, -- p_item_valorCOFINS
          0, -- p_item_baseCOFINSST
          0, -- p_item_valorCOFINSST
          0, -- p_item_baseCreditoSimplesNac
          0, -- p_item_valorCreditoSimplesNac
          0, -- p_item_baseICMS
          0, -- p_item_valorICMSOperacao
          0, -- p_item_valorICMSDiferido
          0, -- p_item_valorICMS
          0, -- p_item_valorICMSDesoneracao
          0, -- p_item_baseICMSST
          0, -- p_item_valorICMSST
          0, -- p_item_baseICMSSTAnteriormente
          0, -- p_item_valorICMSSTAnteriorment
          0, -- p_item_valorICMSProprioSubstit
          0, -- p_item_baseICMSEfetivo
          0, -- p_item_valorICMSEfetivo
          0, -- p_item_baseICMSUFDestinatario
          0, -- p_item_valorICMSUFDestinatario
          0, -- p_item_baseICMSUFRemetente
          0, -- p_item_valorICMSUFRemetente
          0, -- p_item_baseFCP
          0, -- p_item_valorFCP
          0, -- p_item_baseFCPST
          0, -- p_item_valorFCPST
          0, -- p_item_baseFCPSTAnteriormente
          0, -- p_item_valorFCPSTAnteriormente
          0, -- p_item_baseFCPUFDestinatario
          0, -- p_item_valorFCPUFDestinatario
          0, -- p_item_baseEstimadaImpostos
          0, -- p_item_valorEstImpFederais
          0, -- p_item_valorEstImpEstaduais
          0, -- p_item_valorEstImpMunicipais
          ' ', -- p_idAtividadesPrevistasSelec
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber); -- r_valorInserido
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_PEND (
  p_idAtividadePrevOrcamento IN NUMBER,
  p_idItemOrcamento          IN NUMBER,
  p_tecnico                  IN NUMBER)    
IS
BEGIN
UPDATE MOORCAMENTOXATIVIDADEPREV prev
SET prev.tecnico = CASE WHEN prev.tecnico = 0 THEN p_tecnico ELSE prev.tecnico END,
  prev.statusAtividadeServico = 'P',
  prev.dataInicio = CASE WHEN prev.dataInicio IS NULL THEN SYSDATE ELSE prev.dataInicio END,
  prev.dataTermino = CASE WHEN prev.dataTermino IS NULL THEN SYSDATE ELSE prev.dataTermino END
WHERE prev.idItemOrcamento = p_idItemOrcamento
AND prev.statusAtividadeServico = 'A'
AND prev.idAtividadePrevOrcamento <> p_idAtividadePrevOrcamento
AND (p_idAtividadePrevOrcamento = 0
  OR NOT EXISTS (
    SELECT 1
    FROM MOORCAMENTOXATIVIDADEPREV prev2
    WHERE prev2.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
    AND prev2.statusAtividadeServico IN ('A','I','P')))
AND prev.sequencia =
  ( SELECT MIN (prev2.sequencia)
    FROM MOORCAMENTOXATIVIDADEPREV prev2
    WHERE prev2.idItemOrcamento = prev.idItemOrcamento
    AND prev2.statusAtividadeServico IN ('A','I','P'));
END ADD_ORCAMENTO_ITEM_PREV_PEND;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
  p_idAtividadePrevOrcamento IN NUMBER)
IS
BEGIN
  UPDATE MOORCAMENTOXATIVIDADEPREV a
  SET a.statusAtividadeServico =
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico IN ('A','P','I'))
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'P'
    END
  WHERE a.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
  AND a.statusAtividadeServico <>
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico IN ('A','P','I'))
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'P'
    END;
END ADD_ORCAMENTO_ITEM_PREV_ST_CAL;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_registrosRealizado           OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  IF p_previsto_realizado = 'R' THEN
    r_registrosRealizado := CASE WHEN p_real_idAtividadeRealOrcament = 0 THEN 0 ELSE 1 END;
  ELSIF r_prev_idAtividadePrevOrcament = 0 THEN
    r_registrosRealizado := 0;
  ELSE
    SELECT COALESCE (SUM (1), 0)
    INTO r_registrosRealizado
    FROM MOORCAMENTOXATIVIDADEREAL real
    WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF r_registrosRealizado < 2
    AND (p_previsto_realizado = 'R'
      OR p_real_idAtividadeRealOrcament > 0
      OR p_prev_statusAtividadeServico IN ('C','E','I'))
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0 THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    IF p_real_idAtividadeRealOrcament = 0 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico = 'E'
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico <> 'E')
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_quantidadeFabricada > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        r_registrosRealizado := r_registrosRealizado + 1;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealOrcament);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealOrcament,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        r_real_idAtividadeRealOrcament := 0;
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        p_real_dataTermino, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        p_real_modeloDocumento,
        p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        r_real_idAtividadeRealOrcament);
        r_real_idAtividadeRealOrcament := 0;
      v_atualizarStatusPrevisto := 1;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF i_prev_faturarAtividade <> p_prev_faturarAtividade
    OR i_prev_precoUnitario <> p_prev_precoUnitario
    OR i_prev_statusAtividadeServico = 'C'
    AND p_prev_statusAtividadeServico <> 'C'
    OR i_prev_statusAtividadeServico <> 'C'
    AND p_prev_statusAtividadeServico = 'C'
    OR p_prev_faturarAtividade = 'R'
    AND r_registrosRealizado < 2
    AND (p_previsto_realizado='R'
      AND (i_real_statusAtividadeServico = 'C'
        AND p_real_statusAtividadeServico <> 'C'
        OR i_real_statusAtividadeServico <> 'C'
        AND p_real_statusAtividadeServico = 'C')
      OR i_real_quantidade <> p_real_quantidade)
    OR p_prev_faturarAtividade <> 'R'
    AND i_prev_quantidade <> p_prev_quantidade
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_real_idAtividadeRealOrcament IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
  v_bufferIdEstoque        VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  FOR a IN (
    SELECT
      idAtividadePrevOrcamento,
      idItemOrcamento,
      tecnico,
      faturarAtividade
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament)
  LOOP
  IF p_previsto_realizado = 'P' THEN
    ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
      a.idAtividadePrevOrcamento,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque);
  ELSE
    ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
      p_real_idAtividadeRealOrcament,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      a.idAtividadePrevOrcamento);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    a.idAtividadePrevOrcamento,
    a.idItemOrcamento,
    a.tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    a.idItemOrcamento);
  IF a.faturarAtividade <> 'N' THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      a.idItemOrcamento);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_ATIV_EXCLUI;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_EFETIVA (
  p_sessaoClient                IN VARCHAR,
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_contadorSessao              IN NUMERIC,
  p_DocFisc_PreDoc_Orcam_Tarefa IN CHAR,
  p_idPai                       IN NUMBER)
IS
  v_idSalvar  NUMBER;
  v_ordenacao NUMBER;
BEGIN
  FOR a IN (
    SELECT
      contador,
      idSalvar
    FROM TEMPQUESTIONARIO
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessao
    AND excluido = 1
    AND idSalvar > 0)
  LOOP
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      DELETE MODOCFISCALXPERSPROJETO b
      WHERE b.idPersonProjetoDocFiscal = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      DELETE MOPREDOCUMXPERSPROJETO b
      WHERE b.idPersonProjetoPreDocumento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      DELETE MOORCAMENTOXPERSPROJETO b
      WHERE b.idPersonProjetoOrcamento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      DELETE MOORCAMENTOXTAREFAS b
      WHERE b.idTarefaOrcamento = a.idSalvar;
    END IF;
  END LOOP;
  FOR a IN (
    SELECT
      a.contador,
      a.idSalvar,
      a.idQuestionario,
      CASE
        WHEN a.tabelaSistema <> ' '
        THEN
          CASE
            WHEN tabSist.nomeCampoIdSeDiferenteCodigo <> ' '
              OR tabSist.tipoCampoCodigo = 'N'
            THEN CASE WHEN a.conteudoId = 0 THEN ' ' ELSE TRIM (TO_CHAR (a.conteudoId)) END
            ELSE a.conteudoCodigo
          END
        WHEN a.tipoCampo = 'D'
        THEN CASE WHEN COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000') = '00/00/0000' THEN ' ' ELSE COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000') END
        WHEN a.tipoCampo = 'H'
        THEN CASE WHEN COALESCE (conteudoHora, '000000') = '000000' THEN ' ' ELSE COALESCE (SUBSTR (a.conteudoHora, 1, 2) || ':' || SUBSTR (a.conteudoHora, 3, 2) || ':' || SUBSTR (a.conteudoHora, 5, 2), '00:00:00') END 
        WHEN a.tipoCampo = 'L'
        THEN
          CASE
            WHEN a.conteudoLogico = '1'
            THEN 'S'
            ELSE ' '
          END
        WHEN a.tipoCampo = 'N'
        THEN CASE WHEN a.conteudoNumerico = 0 THEN ' ' ELSE REPLACE (TRIM (TO_CHAR (a.conteudoNumerico, 'FM99999999999999999990D99999999999999999990')), '.', ',') END
        WHEN a.exibirCampo = 'P'
        THEN a.conteudoCombo
        ELSE a.conteudoEdit
      END conteudo,
      a.observacoes
    FROM TEMPQUESTIONARIO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    AND a.excluido = 0
    ORDER BY
      a.ordenacao,
      a.subOrdenacao)
  LOOP
    v_idSalvar  := a.idSalvar;
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      ADD_DOC_FISC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoDocFiscal
        p_idPai, -- p_idDocumentoFiscal
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      ADD_PRE_DOC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoPreDocumento
        p_idPai, -- p_preDocumento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      ADD_ORCAMENTO_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoOrcamento
        p_idPai, -- p_orcamento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      v_ordenacao := 0;
      IF v_idSalvar > 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0)
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idTarefaOrcamento = v_idSalvar;
      END IF;
      IF v_ordenacao <= 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0) + 1
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idAtividadePrevOrcamento = p_idPai
        AND idCheckListXTarefas = a.idQuestionario;
      END IF;
      ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        v_idSalvar, -- p_idTarefaOrcamento
        p_idPai, -- p_idAtividadePrevOrcamento
        a.idQuestionario, -- p_idCheckListXTarefas
        v_ordenacao,
        a.conteudo,
        a.observacoes,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    END IF;
  END LOOP;
  DELETE TEMPQUESTIONARIO b
  WHERE b.sessaoClient = p_sessaoClient
  AND b.contadorSessao = p_contadorSessao;
END ADD_TEMPQUESTIONARIO_EFETIVA;

/

DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_CAB;
DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_ITENS;
DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_RATEIO;
DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_RESIDUO;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_ITENS;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_RATEIO;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_RESIDUO;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_CAB;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_ITENS;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_RATEIO;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_RESIDUO;

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

/

create or replace PROCEDURE ADD_ORCAMENTO_CALCULA_IMPOSTOS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_idItemOrcamentoUltimoItem    NUMBER;
  v_idItemOrcamentoRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.orcamento,
      a.origemDocumento,
      a.modeloDocumento,
      a.entradaSaida,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      pess.indicadorInscricaoEstadual,
      COALESCE ((
        SELECT MIN (munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        ),'  ') munEndEst_uf
    FROM MOORCAMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.orcamento = p_cab_orcamento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_idItemOrcamentoUltimoItem    := 0;
    v_idItemOrcamentoRateioFrete   := 0;
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_residuoFreteGeral            := 0;
    v_residuoSeguroGeral           := 0;
    v_residuoDescontoGeral         := 0;
    v_residuoOutrasDespesasGeral   := 0;
    v_residuoAdicFreteMarinGeral   := 0;
    v_residuoDespesasAduanGeral    := 0;
    v_residuoDescontoPagamento     := 0;
    v_residuoOutrasDespPagamento   := 0;
    v_residuoJurosPagamento        := 0;
    v_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MOORCAMENTOXITENS b
      JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = b.idItemOrcamento
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
  
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MOORCAMENTOXITENS b
      JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = b.idItemOrcamento
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS(
            SELECT 1
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MOORCAMENTOXPROMOCOES promo
              WHERE promo.idItemOrcamento = b.idItemOrcamento
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MOORCAMENTOXPROMOCOES promo
            ON promo.idItemOrcamento = b.idItemOrcamento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOORCAMENTOXITENS b
              WHERE b.orcamento = a.orcamento
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = b.idItemOrcamento))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT EXISTS (
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = b.idItemOrcamento))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOORCAMENTOXITENS b
              WHERE b.orcamento = a.orcamento
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MOORCAMENTOXPROMOCOES promo
                  WHERE promo.idItemOrcamento = b.idItemOrcamento))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
  
    -- Bases Rateio
    SELECT
      COALESCE (MAX (CASE WHEN modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN 1 ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0)
    INTO
      v_rateioFretePorControleEntr,
      v_valorBaseFreteSemFinSemEntr,
      v_valorBaseFreteComFinSemEntr,
      v_valorBaseFreteSemFinComEntr,
      v_valorBaseFreteComFinComEntr,
      v_valorBaseRateio,
      v_valorBaseRateioComEntrega,
      v_valorBaseRateioFinanceiro,
      v_valorBaseRateioOutrasDespGer,
      v_valorBaseRateioOutrasDespFin,
      v_valorBaseRateioDescontoGeral,
      v_valorBaseRateioPagamento,
      v_valorBaseRateioPagamFinanc,
      v_valorBaseRateioPagamDesconto,
      v_valorBaseRateioPagamFinDesc
    FROM MOORCAMENTOXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    JOIN PACONTROLESENTREGA contr
    ON contr.controleEntrega = b.controleEntrega
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemOrcamento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorLiquidoItem,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        prod.tipoProduto,
        CASE WHEN modDoc.habilitaControleEntrega = 0 OR contr.habilitaFrete = 1 THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento) THEN 1 ELSE 0 END promocao,
        COALESCE ((SELECT SUM (promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((SELECT SUM (promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE WHEN EXISTS (SELECT 1 FROM CAPRODUTOXCOMPOSICOESPREC compPrec WHERE compPrec.produto = gradProd.produto AND compPrec.ativo = 1) THEN 1 ELSE 0 END composicaoPreco
      FROM MOORCAMENTOXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA contr
      ON contr.controleEntrega = b.controleEntrega
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemOrcamentoUltimoItem    := b.idItemOrcamento;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.valorProdutoServico;
      v_valorDescontoGeral           := v_residuoDescontoGeral;
      v_valorFreteGeral              := v_residuoFreteGeral;
      v_valorSeguroGeral             := v_residuoSeguroGeral;
      v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
      v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
      v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
      v_valorBasePagamento           := b.valorBasePagamento;
      v_valorDescontoPagamento       := v_residuoDescontoPagamento;
      v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
      v_valorJurosPagamento          := v_residuoJurosPagamento;
      v_valorFreteTotal              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral        > 0
        AND v_valorDescontoPromocaoGeral > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoGeral, 2) >= v_saldoRatDescontoGeral THEN
        v_valorDescontoGeral   := v_saldoRatDescontoGeral;
        v_residuoDescontoGeral := 0;
      ELSE
        v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral, 2);
        v_valorDescontoGeral   := ROUND (v_valorDescontoGeral, 2);
      END IF;
      v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
  
      -- v_valorFreteGeral / v_valorSeguroGeral
      IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 THEN
        IF b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        END IF;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 THEN
        IF b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        END IF;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_rateioFretePorControleEntr = 1 THEN
        IF b.rateioFrete = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        END IF;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 THEN
        IF b.geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        END IF;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 THEN
        IF b.modDoc_geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        END IF;
      ELSIF v_valorBaseRateio > 0 THEN
        v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorFreteGeral, 2) >= v_saldoRatFreteGeral THEN
        v_valorFreteGeral := v_saldoRatFreteGeral;
        v_residuoFreteGeral := 0;
      ELSE
        v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral, 2);
        v_valorFreteGeral := ROUND (v_valorFreteGeral, 2);
      END IF;
      v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
      IF ROUND (v_valorSeguroGeral, 2) >= v_saldoRatSeguroGeral THEN
        v_valorSeguroGeral   := v_saldoRatSeguroGeral;
        v_residuoSeguroGeral := 0;
      ELSE
        v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral, 2);
        v_valorSeguroGeral   := ROUND (v_valorSeguroGeral, 2);
      END IF;
      v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
  
      -- v_valorAdicFreteMarinMerGeral / v_valorDespesasAduaneirasGeral
      IF v_valorBaseRateioFinanceiro > 0 AND b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorAdicFreteMarinMerGeral, 2) >= v_saldoRatAdicFreteMarinGeral THEN
        v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
        v_residuoAdicFreteMarinGeral  := 0;
      ELSE
        v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral, 2);
        v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral, 2);
      END IF;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      IF ROUND (v_valorDespesasAduaneirasGeral, 2) >= v_saldoRatDespesasAduanGeral THEN
        v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
        v_residuoDespesasAduanGeral    := 0;
      ELSE
        v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral, 2);
        v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral, 2);
      END IF;
      v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
  
      -- v_valorOutrasDespesasGeral
      IF v_valorBaseRateioOutrasDespFin > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
      END IF;
      IF ROUND (v_valorOutrasDespesasGeral, 2) >= v_saldoRatOutrasDespesasGeral THEN
        v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
        v_residuoOutrasDespesasGeral := 0;
      ELSE
        v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral, 2);
        v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral, 2);
      END IF;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
  
      -- v_valorDescontoPagamento
      IF a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento > 0
        AND v_valorDescontoPromocaoPagamen > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoPagamento, 2) >= v_saldoRatDescontoPagamento THEN
        v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
        v_residuoDescontoPagamento := 0;
      ELSE
        v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento, 2);
        v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento, 2);
      END IF;
      v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
  
      -- v_valorOutrasDespesasPagamento / v_valorJurosPagamento
      IF v_valorBaseRateioPagamFinanc > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      END IF;
      IF ROUND (v_valorOutrasDespesasPagamento, 2) >= v_saldoRatOutrasDespPagamento THEN
        v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
        v_residuoOutrasDespPagamento   := 0;
      ELSE
        v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento, 2);
        v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento, 2);
      END IF;
      v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      IF ROUND (v_valorJurosPagamento, 2) >= v_saldoRatJurosPagamento THEN
        v_valorJurosPagamento   := v_saldoRatJurosPagamento;
        v_residuoJurosPagamento := 0;
      ELSE
        v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento, 2);
        v_valorJurosPagamento   := ROUND (v_valorJurosPagamento, 2);
      END IF;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
  
      -- Recalcula Valores
      ADD_CALCULA_TOTAIS_ITEM (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      IF a.impostosEditados = 0 
        OR v_valorProdutoServico <> b.valorProdutoServico
        OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
        OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
        OR v_valorDescontoTotal <> b.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> b.precoUnitario
        OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        0, -- p_item_valorIPIDevolucao
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0, -- p_item_somarICMSST
        0, -- p_item_valorAcrescExtempTotal
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        0, -- p_item_valorIPIDevolucao
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0 -- p_item_somarICMSST
        );
      -- Atualiza Item
      UPDATE MOORCAMENTOXITENS SET
        precoUnitario                 = v_precoUnitario,
        precoUnitarioConvertido       = v_precoUnitarioConvertido,
        valorProdutoServico           = v_valorProdutoServico,
        valorFreteGeral               = v_valorFreteGeral,
        valorSeguroGeral              = v_valorSeguroGeral,
        valorDescontoGeral            = v_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
        valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
        valorBasePagamento            = v_valorBasePagamento,
        valorDescontoPagamento        = v_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
        valorJurosPagamento           = v_valorJurosPagamento,
        valorFreteTotal               = v_valorFreteTotal,
        valorSeguroTotal              = v_valorSeguroTotal,
        valorDescontoTotal            = v_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
        valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
        valorLiquidoItem              = v_valorLiquidoItem
      WHERE idItemOrcamento           = b.idItemOrcamento;
      -- Totaliza cabeçalho
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1
        AND b.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
    END LOOP;
    -- Se sobrou resíduo atualiza último item
    IF v_idItemOrcamentoUltimoItem <> 0
      AND (v_saldoRatDescontoGeral <> 0
        OR v_saldoRatOutrasDespesasGeral <> 0
        OR v_saldoRatDescontoPagamento <> 0
        OR v_saldoRatOutrasDespPagamento <> 0
        OR v_saldoRatJurosPagamento <> 0
        OR v_saldoRatFreteGeral <> 0
        OR v_saldoRatSeguroGeral <> 0
        OR v_saldoRatAdicFreteMarinGeral <> 0
        OR v_saldoRatDespesasAduanGeral <> 0)
    THEN
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorLiquidoItem,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOORCAMENTOXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemOrcamento = CASE WHEN v_idItemOrcamentoRateioFrete = 0 THEN v_idItemOrcamentoUltimoItem ELSE v_idItemOrcamentoRateioFrete END)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
              <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
              <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          0, -- p_item_valorAcrescExtempTotal
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        UPDATE MOORCAMENTOXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem
        WHERE idItemOrcamento           = CASE WHEN v_idItemOrcamentoRateioFrete = 0 THEN v_idItemOrcamentoUltimoItem ELSE v_idItemOrcamentoRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1
          AND b.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemOrcamento,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOORCAMENTOXITENS b
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        WHERE b.orcamento = a.orcamento
        AND b.cancelado = 0
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_baseISSQN                    := b.baseISSQN;
        v_valorISSQN                   := b.valorISSQN;
        v_baseRetIRRF                  := b.baseRetIRRF;
        v_valorRetIRRF                 := b.valorRetIRRF;
        v_baseRetINSS                  := b.baseRetINSS;
        v_valorRetINSS                 := b.valorRetINSS;
        v_baseRetOutros                := b.baseRetOutros;
        v_valorRetOutros               := b.valorRetOutros;
        v_baseRetPIS                   := b.baseRetPIS;
        v_valorRetPIS                  := b.valorRetPIS;
        v_baseRetCOFINS                := b.baseRetCOFINS;
        v_valorRetCOFINS               := b.valorRetCOFINS;
        v_baseRetCSLL                  := b.baseRetCSLL;
        v_valorRetCSLL                 := b.valorRetCSLL;
        v_baseII                       := b.baseII;
        v_valorII                      := b.valorII;
        v_baseIOF                      := b.baseIOF;
        v_valorIOF                     := b.valorIOF;
        v_baseIPI                      := b.baseIPI;
        v_valorIPI                     := b.valorIPI;
        v_basePIS                      := b.basePIS;
        v_valorPIS                     := b.valorPIS;
        v_basePISST                    := b.basePISST;
        v_valorPISST                   := b.valorPISST;
        v_baseCOFINS                   := b.baseCOFINS;
        v_valorCOFINS                  := b.valorCOFINS;
        v_baseCOFINSST                 := b.baseCOFINSST;
        v_valorCOFINSST                := b.valorCOFINSST;
        v_baseCreditoSimplesNacional   := b.baseCreditoSimplesNacional;
        v_valorCreditoSimplesNacional  := b.valorCreditoSimplesNacional;
        v_baseICMS                     := b.baseICMS;
        v_valorICMSOperacao            := b.valorICMSOperacao;
        v_valorICMSDiferido            := b.valorICMSDiferido;
        v_valorICMS                    := b.valorICMS;
        v_valorICMSDesoneracao         := b.valorICMSDesoneracao;
        v_baseICMSST                   := b.baseICMSST;
        v_valorICMSST                  := b.valorICMSST;
        v_baseICMSSTAnteriormente      := b.baseICMSSTAnteriormente;
        v_valorICMSSTAnteriormente     := b.valorICMSSTAnteriormente;
        v_valorICMSProprioSubstituto   := b.valorICMSProprioSubstituto;
        v_baseICMSEfetivo              := b.baseICMSEfetivo;
        v_valorICMSEfetivo             := b.valorICMSEfetivo;
        v_baseICMSUFDestinatario       := b.baseICMSUFDestinatario;
        v_valorICMSUFDestinatario      := b.valorICMSUFDestinatario;
        v_baseICMSUFRemetente          := b.baseICMSUFRemetente;
        v_valorICMSUFRemetente         := b.valorICMSUFRemetente;
        v_baseFCP                      := b.baseFCP;
        v_valorFCP                     := b.valorFCP;
        v_baseFCPST                    := b.baseFCPST;
        v_valorFCPST                   := b.valorFCPST;
        v_baseFCPSTAnteriormente       := b.baseFCPSTAnteriormente;
        v_valorFCPSTAnteriormente      := b.valorFCPSTAnteriormente;
        v_baseFCPUFDestinatario        := b.baseFCPUFDestinatario;
        v_valorFCPUFDestinatario       := b.valorFCPUFDestinatario;
        v_baseEstimadaImpostos         := b.baseEstimadaImpostos;
        v_valorEstimadoImpFederais     := b.valorEstimadoImpFederais;
        v_valorEstimadoImpEstaduais    := b.valorEstimadoImpEstaduais;
        v_valorEstimadoImpMunicipais   := b.valorEstimadoImpMunicipais;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        ADD_CALCULA_IMPOSTOS_ITEM (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          a.entradaSaida,
          0,
          a.estabelecimento,
          0,
          a.dataEmissao,
          a.pessoa,
          a.localDestinoOperacao,
          a.indicadorConsumidorFinal,
          a.tipoPagamentoFrete,
          a.indicadorInscricaoEstadual,
          b.personalizacao,
          b.quantidade,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal,
          b.cfop,
          1,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          1,
          b.retencaoIRRF,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          1,
          b.retencaoINSS,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          1,
          b.retencaoPIS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          1,
          b.retencaoCOFINS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          1,
          b.retencaoCSLL,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          1,
          b.retencaoOutros,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          1,
          b.aliquotaII,
          v_baseII,
          v_valorII,
          1,
          b.aliquotaIOF,
          v_baseIOF,
          v_valorIOF,
          1,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          v_baseIPI,
          v_valorIPI,
          0,
          1,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          v_basePIS,
          v_valorPIS,
          1,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          v_basePISST,
          v_valorPISST,
          1,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          v_baseCOFINS,
          v_valorCOFINS,
          1,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          v_baseCOFINSST,
          v_valorCOFINSST,
          1,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          1,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          1,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          v_baseICMSST,
          v_valorICMSST,
          1,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          0,
          '  ',
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          1,
          b.aliquotaFCP,
          v_baseFCP,
          v_valorFCP,
          b.aliquotaFCPST,
          v_baseFCPST,
          v_valorFCPST,
          b.aliquotaFCPSTAnteriormente,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          1,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais,
          b.produto,
          b.cor,
          b.tamanho,
          b.controleEstoque,
          b.tipoProduto,
          b.precoPautaTabelado,
          /* Retornos */
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          v_baseII,
          v_valorII,
          v_baseIOF,
          v_valorIOF,
          v_baseIPI,
          v_valorIPI,
          v_basePIS,
          v_valorPIS,
          v_basePISST,
          v_valorPISST,
          v_baseCOFINS,
          v_valorCOFINS,
          v_baseCOFINSST,
          v_valorCOFINSST,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          v_baseICMSST,
          v_valorICMSST,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          v_baseFCP,
          v_valorFCP,
          v_baseFCPST,
          v_valorFCPST,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais);
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          b.retidoISSQN,
          v_valorISSQN,
          v_valorRetIRRF,
          v_valorRetINSS,
          v_valorRetPIS,
          v_valorRetCOFINS,
          v_valorRetCSLL,
          v_valorRetOutros,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          0, -- p_item_valorAcrescExtempTotal
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        UPDATE MOORCAMENTOXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorBasePagamento            = v_valorBasePagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          baseISSQN                     = v_baseISSQN,
          valorISSQN                    = v_valorISSQN,
          baseRetIRRF                   = v_baseRetIRRF,
          valorRetIRRF                  = v_valorRetIRRF,
          baseRetINSS                   = v_baseRetINSS,
          valorRetINSS                  = v_valorRetINSS,
          baseRetPIS                    = v_baseRetPIS,
          valorRetPIS                   = v_valorRetPIS,
          baseRetCOFINS                 = v_baseRetCOFINS,
          valorRetCOFINS                = v_valorRetCOFINS,
          baseRetCSLL                   = v_baseRetCSLL,
          valorRetCSLL                  = v_valorRetCSLL,
          baseRetOutros                 = v_baseRetOutros,
          valorRetOutros                = v_valorRetOutros,
          baseII                        = v_baseII,
          valorII                       = v_valorII,
          baseIOF                       = v_baseIOF,
          valorIOF                      = v_valorIOF,
          baseIPI                       = v_baseIPI,
          valorIPI                      = v_valorIPI,
          basePIS                       = v_basePIS,
          valorPIS                      = v_valorPIS,
          basePISST                     = v_basePISST,
          valorPISST                    = v_valorPISST,
          baseCOFINS                    = v_baseCOFINS,
          valorCOFINS                   = v_valorCOFINS,
          baseCOFINSST                  = v_baseCOFINSST,
          valorCOFINSST                 = v_valorCOFINSST,
          baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
          valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
          baseICMS                      = v_baseICMS,
          valorICMSOperacao             = v_valorICMSOperacao,
          valorICMSDiferido             = v_valorICMSDiferido,
          valorICMS                     = v_valorICMS,
          valorICMSDesoneracao          = v_valorICMSDesoneracao,
          baseICMSST                    = v_baseICMSST,
          valorICMSST                   = v_valorICMSST,
          baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
          valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
          valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
          baseICMSEfetivo               = v_baseICMSEfetivo,
          valorICMSEfetivo              = v_valorICMSEfetivo,
          baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
          valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
          baseICMSUFRemetente           = v_baseICMSUFRemetente,
          valorICMSUFRemetente          = v_valorICMSUFRemetente,
          baseFCP                       = v_baseFCP,
          valorFCP                      = v_valorFCP,
          baseFCPST                     = v_baseFCPST,
          valorFCPST                    = v_valorFCPST,
          baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
          valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
          baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
          valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
          baseEstimadaImpostos          = v_baseEstimadaImpostos,
          valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
          valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
          valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
          valorLiquidoItem              = v_valorLiquidoItem
        WHERE idItemOrcamento           = b.idItemOrcamento;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + b.valorDescontoPagamento - b.valorOutrasDespesasPagamento - b.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      END LOOP;
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento                 = a.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALCULA_IMPOSTOS;

/

create or replace PROCEDURE ADD_PRE_DOC_CALCULA_IMPOSTOS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemPreDocUltimoItem       NUMBER;
  v_idItemPreDocRateioFrete      NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.preDocumento,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEntradaSaida,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpTotal,
      a.valorCustoOperacao,
      a.valorCMV,
      a.valorAcrescimoExtempTotal,
      pess.indicadorInscricaoEstadual,
      COALESCE ((
        SELECT MIN (munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MOPREDOCUMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.preDocumento = p_cab_preDocumento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;    
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXORCAMENTOITEM docXorc
          ON docXorc.idItemPreDocumento = a.idItemPreDocumento
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.preDocumento = p_cab_preDocumento
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_cab_valorDescCustoOpTotal    := 0;
    v_cab_valorAcrescCustoOpTotal  := 0;
    v_cab_valorCustoOperacao       := 0;
    v_cab_valorCMV                 := 0;
    v_cab_valorAcrescExtempTotal   := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_saldoRatDescCustoOpGeral     := a.valorDescontoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescExtempGeral    := a.valorAcrescimoExtempGeral;
    v_residuoFreteGeral            := 0;
    v_residuoSeguroGeral           := 0;
    v_residuoDescontoGeral         := 0;
    v_residuoOutrasDespesasGeral   := 0;
    v_residuoAdicFreteMarinGeral   := 0;
    v_residuoDespesasAduanGeral    := 0;
    v_residuoDescontoPagamento     := 0;
    v_residuoOutrasDespPagamento   := 0;
    v_residuoJurosPagamento        := 0;
    v_residuoDescCustoOpGeral      := 0;
    v_residuoAcrescCustoOpGeral    := 0;
    v_residuoAcrescExtempGeral     := 0;
    v_idItemPreDocUltimoItem       := 0;
    v_idItemPreDocRateioFrete      := 0;
    v_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MOPREDOCUMXITENS b
      JOIN MOPREDOCUMXPROMOCOES promo
      ON promo.idItemPreDocumento = b.idItemPreDocumento
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
  
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MOPREDOCUMXITENS b
      JOIN MOPREDOCUMXPROMOCOES promo
      ON promo.idItemPreDocumento = b.idItemPreDocumento
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MOPREDOCUMXPROMOCOES promo
              WHERE promo.idItemPreDocumento = b.idItemPreDocumento
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > ( CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END
              - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MOPREDOCUMXPROMOCOES promo
            ON promo.idItemPreDocumento = b.idItemPreDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOPREDOCUMXITENS b
              WHERE b.preDocumento = a.preDocumento
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = b.idItemPreDocumento))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = b.idItemPreDocumento)))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOPREDOCUMXITENS b
              WHERE b.preDocumento = a.preDocumento
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MOPREDOCUMXPROMOCOES promo
                  WHERE promo.idItemPreDocumento = b.idItemPreDocumento))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
  
    -- Bases Rateio
    SELECT
      MAX (COALESCE ((CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0)
    INTO
      v_rateioFretePorControleEntr,
      v_valorBaseFreteSemFinSemEntr,
      v_valorBaseFreteComFinSemEntr,
      v_valorBaseFreteSemFinComEntr,
      v_valorBaseFreteComFinComEntr,
      v_valorBaseRateio,
      v_valorBaseRateioComEntrega,
      v_valorBaseRateioFinanceiro,
      v_valorBaseRateioOutrasDespGer,
      v_valorBaseRateioOutrasDespFin,
      v_valorBaseRateioDescontoGeral,
      v_valorBaseRateioPagamento,
      v_valorBaseRateioPagamFinanc,
      v_valorBaseRateioPagamDesconto,
      v_valorBaseRateioPagamFinDesc
    FROM MOPREDOCUMXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    WHERE b.preDocumento = a.preDocumento
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemPreDocumento,
        b.modeloDocumento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        b.valorDescontoCustoOpGeral,
        b.valorDescontoCustoOpTotal,
        b.valorAcrescimoCustoOpItem,
        b.valorAcrescimoCustoOpGeral,
        b.valorAcrescimoCustoOpTotal,
        b.precoCustoOperacao,
        b.valorCustoOperacao,
        b.precoCMV,
        b.valorCMV,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo,
        b.valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        b.valorAcrescimoExtempGeral,
        b.valorAcrescimoExtempTotal,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        prod.tipoProduto,
        CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(
          SELECT 1
          FROM MOPREDOCUMXORCAMENTOITEM docXorc
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE docXorc.idItemPreDocumento = b.idItemPreDocumento
          AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(
          SELECT 1
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM CAPRODUTOXCOMPOSICOESPREC compPrec
            WHERE compPrec.produto = gradProd.produto
            AND compPrec.ativo = 1)
          THEN 1
          ELSE 0
        END composicaoPreco
      FROM MOPREDOCUMXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemPreDocUltimoItem       := b.idItemPreDocumento;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.valorProdutoServico;
      v_valorDescontoGeral           := v_residuoDescontoGeral;
      v_valorFreteGeral              := v_residuoFreteGeral;
      v_valorSeguroGeral             := v_residuoSeguroGeral;
      v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
      v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
      v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
      v_valorBasePagamento           := b.valorBasePagamento;
      v_valorDescontoPagamento       := v_residuoDescontoPagamento;
      v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
      v_valorJurosPagamento          := v_residuoJurosPagamento;
      v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
      v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
      v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
      v_valorFreteTotal              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
      v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
      v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
      v_precoCustoOperacao           := b.precoCustoOperacao;
      v_valorCustoOperacao           := b.valorCustoOperacao;
      v_precoCMV                     := b.precoCMV;
      v_valorCMV                     := b.valorCMV;
      v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
      v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral           > 0
        AND v_valorDescontoPromocaoGeral    > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
        v_valorDescontoGeral   := v_saldoRatDescontoGeral;
        v_residuoDescontoGeral := 0;
      ELSE
        v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
        v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
      END IF;
      v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
  
      -- v_valorFreteGeral
      -- v_valorSeguroGeral
      IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND b.geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorFreteGeral,2) >= v_saldoRatFreteGeral THEN
        v_valorFreteGeral := v_saldoRatFreteGeral;
        v_residuoFreteGeral := 0;
      ELSE
        v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral,2);
        v_valorFreteGeral := ROUND (v_valorFreteGeral,2);
      END IF;
      v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
      IF ROUND (v_valorSeguroGeral,2) >= v_saldoRatSeguroGeral THEN
        v_valorSeguroGeral   := v_saldoRatSeguroGeral;
        v_residuoSeguroGeral := 0;
      ELSE
        v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral,2);
        v_valorSeguroGeral   := ROUND (v_valorSeguroGeral,2);
      END IF;
      v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
  
      -- v_valorAdicFreteMarinMerGeral
      -- v_valorDespesasAduaneirasGeral
      -- v_valorDescontoCustoOpGeral
      -- v_valorAcrescimoCustoOpGeral
      -- v_valorAcrescimoExtempGeral
      IF v_valorBaseRateioFinanceiro > 0 AND b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
        v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
        v_residuoAdicFreteMarinGeral  := 0;
      ELSE
        v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
        v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
      END IF;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
        v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
        v_residuoDespesasAduanGeral    := 0;
      ELSE
        v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
        v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
      END IF;
      v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
      IF ROUND (v_valorDescontoCustoOpGeral,2) >= v_saldoRatDescCustoOpGeral THEN
        v_valorDescontoCustoOpGeral := v_saldoRatDescCustoOpGeral;
        v_residuoDescCustoOpGeral   := 0;
      ELSE
        v_residuoDescCustoOpGeral   := v_valorDescontoCustoOpGeral - ROUND (v_valorDescontoCustoOpGeral,2);
        v_valorDescontoCustoOpGeral := ROUND (v_valorDescontoCustoOpGeral,2);
      END IF;
      v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
      IF ROUND (v_valorAcrescimoCustoOpGeral,2) >= v_saldoRatAcrescCustoOpGeral THEN
        v_valorAcrescimoCustoOpGeral := v_saldoRatAcrescCustoOpGeral;
        v_residuoAcrescCustoOpGeral  := 0;
      ELSE
        v_residuoAcrescCustoOpGeral  := v_valorAcrescimoCustoOpGeral - ROUND (v_valorAcrescimoCustoOpGeral,2);
        v_valorAcrescimoCustoOpGeral := ROUND (v_valorAcrescimoCustoOpGeral,2);
      END IF;
      v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
      IF ROUND (v_valorAcrescimoExtempGeral,2) >= v_saldoRatAcrescExtempGeral THEN
        v_valorAcrescimoExtempGeral := v_saldoRatAcrescExtempGeral;
        v_residuoAcrescExtempGeral  := 0;
      ELSE
        v_residuoAcrescExtempGeral  := v_valorAcrescimoExtempGeral - ROUND (v_valorAcrescimoExtempGeral,2);
        v_valorAcrescimoExtempGeral := ROUND (v_valorAcrescimoExtempGeral,2);
      END IF;
      v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
  
      -- v_valorOutrasDespesasGeral
      IF v_valorBaseRateioOutrasDespFin > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
      END IF;
      IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
        v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
        v_residuoOutrasDespesasGeral := 0;
      ELSE
        v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
        v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
      END IF;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
  
      -- v_valorDescontoPagamento
      IF a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento           > 0
        AND v_valorDescontoPromocaoPagamen      > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
        v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
        v_residuoDescontoPagamento := 0;
      ELSE
        v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
        v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
      END IF;
      v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
  
      -- v_valorOutrasDespesasPagamento
      -- v_valorJurosPagamento
      IF v_valorBaseRateioPagamFinanc > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      END IF;
      IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
        v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
        v_residuoOutrasDespPagamento   := 0;
      ELSE
        v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
        v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
      END IF;
      v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
        v_valorJurosPagamento   := v_saldoRatJurosPagamento;
        v_residuoJurosPagamento := 0;
      ELSE
        v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
        v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
      END IF;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
  
      -- Recalcula Valores
      ADD_CALCULA_TOTAIS_ITEM (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
        b.quantidade,
        v_precoUnitario,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo);
      v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
        v_valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        v_valorAcrescimoExtempGeral);
      IF a.impostosEditados = 0 
          OR v_valorProdutoServico <> b.valorProdutoServico
          OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
          OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
          OR v_valorDescontoTotal <> b.valorDescontoTotal
          OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
          OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
          OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
          OR v_precoUnitario <> b.precoUnitario
          OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0, -- p_item_somarICMSST
        v_valorAcrescimoExtempTotal,
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0 -- p_item_somarICMSST
        );
      ADD_CALCULA_CUSTO_CMV (
        a.atualizaCustoMedio,
        a.estabelecimento,
        0,
        b.modeloDocumento,
        b.quantidade,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorIPIDevolucao,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        0,
        v_valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        v_valorDescontoCustoOpGeral,
        b.valorAcrescimoCustoOpItem,
        v_valorAcrescimoCustoOpGeral,
        v_valorAcrescimoExtempTotal,
        /* Retornos */
        v_valorDescontoCustoOpTotal,
        v_valorAcrescimoCustoOpTotal,
        v_precoCustoOperacao,
        v_valorCustoOperacao,
        v_precoCMV,
        v_valorCMV);
  
      -- Atualiza Item
      UPDATE MOPREDOCUMXITENS SET
        precoUnitario                 = v_precoUnitario,
        precoUnitarioConvertido       = v_precoUnitarioConvertido,
        valorProdutoServico           = v_valorProdutoServico,
        valorFreteGeral               = v_valorFreteGeral,
        valorSeguroGeral              = v_valorSeguroGeral,
        valorDescontoGeral            = v_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
        valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
        valorBasePagamento            = v_valorBasePagamento,
        valorDescontoPagamento        = v_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
        valorJurosPagamento           = v_valorJurosPagamento,
        valorFreteTotal               = v_valorFreteTotal,
        valorSeguroTotal              = v_valorSeguroTotal,
        valorDescontoTotal            = v_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
        valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
        valorLiquidoItem              = v_valorLiquidoItem,
        valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
        valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
        valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
        precoCustoOperacao            = v_precoCustoOperacao,
        valorCustoOperacao            = v_valorCustoOperacao,
        precoCMV                      = v_precoCMV,
        valorCMV                      = v_valorCMV,
        valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
        valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
      WHERE idItemPreDocumento        = b.idItemPreDocumento;
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
      v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
      v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
      v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
    END LOOP;
    IF v_idItemPreDocUltimoItem <> 0
      AND (v_saldoRatDescontoGeral <> 0
        OR v_saldoRatOutrasDespesasGeral <> 0
        OR v_saldoRatDescontoPagamento <> 0
        OR v_saldoRatOutrasDespPagamento <> 0
        OR v_saldoRatJurosPagamento <> 0
        OR v_saldoRatFreteGeral <> 0
        OR v_saldoRatSeguroGeral <> 0
        OR v_saldoRatAdicFreteMarinGeral <> 0
        OR v_saldoRatDespesasAduanGeral <> 0)
    THEN
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.modeloDocumento,
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          b.valorAcrescimoCustoOpTotal,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral,
          b.valorAcrescimoExtempTotal,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOPREDOCUMXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemPreDocumento = CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpGeral    := b.valorDescontoCustoOpGeral;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpGeral   := b.valorAcrescimoCustoOpGeral;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempGeral    := b.valorAcrescimoExtempGeral;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao - v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV - v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + v_saldoRatDescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + v_saldoRatAcrescCustoOpGeral;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + v_saldoRatAcrescExtempGeral;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          v_valorAcrescimoExtempGeral);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          0,
          b.modeloDocumento,
          b.quantidade,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          0,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          v_valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          v_valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MOPREDOCUMXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemPreDocumento        = CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_cab_valorDescCustoOpTotal    := 0;
      v_cab_valorAcrescCustoOpTotal  := 0;
      v_cab_valorCustoOperacao       := 0;
      v_cab_valorCMV                 := 0;
      v_cab_valorAcrescExtempTotal   := 0;  
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemPreDocumento,
          b.modeloDocumento,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorDescontoCustoOpItem,
          b.valorAcrescimoCustoOpItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorAcrescimoExtempGeral,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorAcrescimoExtempTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorIPIDevolucao,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOPREDOCUMXITENS b
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        WHERE b.preDocumento = a.preDocumento
        AND b.cancelado = 0
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_baseISSQN                    := b.baseISSQN;
        v_valorISSQN                   := b.valorISSQN;
        v_baseRetIRRF                  := b.baseRetIRRF;
        v_valorRetIRRF                 := b.valorRetIRRF;
        v_baseRetINSS                  := b.baseRetINSS;
        v_valorRetINSS                 := b.valorRetINSS;
        v_baseRetPIS                   := b.baseRetPIS;
        v_valorRetPIS                  := b.valorRetPIS;
        v_baseRetCOFINS                := b.baseRetCOFINS;
        v_valorRetCOFINS               := b.valorRetCOFINS;
        v_baseRetCSLL                  := b.baseRetCSLL;
        v_valorRetCSLL                 := b.valorRetCSLL;
        v_baseRetOutros                := b.baseRetOutros;
        v_valorRetOutros               := b.valorRetOutros;
        v_baseII                       := b.baseII;
        v_valorII                      := b.valorII;
        v_baseIOF                      := b.baseIOF;
        v_valorIOF                     := b.valorIOF;
        v_baseIPI                      := b.baseIPI;
        v_valorIPI                     := b.valorIPI;
        v_basePIS                      := b.basePIS;
        v_valorPIS                     := b.valorPIS;
        v_basePISST                    := b.basePISST;
        v_valorPISST                   := b.valorPISST;
        v_baseCOFINS                   := b.baseCOFINS;
        v_valorCOFINS                  := b.valorCOFINS;
        v_baseCOFINSST                 := b.baseCOFINSST;
        v_valorCOFINSST                := b.valorCOFINSST;
        v_baseCreditoSimplesNacional   := b.baseCreditoSimplesNacional;
        v_valorCreditoSimplesNacional  := b.valorCreditoSimplesNacional;
        v_baseICMS                     := b.baseICMS;
        v_valorICMSOperacao            := b.valorICMSOperacao;
        v_valorICMSDiferido            := b.valorICMSDiferido;
        v_valorICMS                    := b.valorICMS;
        v_valorICMSDesoneracao         := b.valorICMSDesoneracao;
        v_baseICMSST                   := b.baseICMSST;
        v_valorICMSST                  := b.valorICMSST;
        v_baseICMSSTAnteriormente      := b.baseICMSSTAnteriormente;
        v_valorICMSSTAnteriormente     := b.valorICMSSTAnteriormente;
        v_valorICMSProprioSubstituto   := b.valorICMSProprioSubstituto;
        v_baseICMSEfetivo              := b.baseICMSEfetivo;
        v_valorICMSEfetivo             := b.valorICMSEfetivo;
        v_baseICMSUFDestinatario       := b.baseICMSUFDestinatario;
        v_valorICMSUFDestinatario      := b.valorICMSUFDestinatario;
        v_baseICMSUFRemetente          := b.baseICMSUFRemetente;
        v_valorICMSUFRemetente         := b.valorICMSUFRemetente;
        v_baseFCP                      := b.baseFCP;
        v_valorFCP                     := b.valorFCP;
        v_baseFCPST                    := b.baseFCPST;
        v_valorFCPST                   := b.valorFCPST;
        v_baseFCPSTAnteriormente       := b.baseFCPSTAnteriormente;
        v_valorFCPSTAnteriormente      := b.valorFCPSTAnteriormente;
        v_baseFCPUFDestinatario        := b.baseFCPUFDestinatario;
        v_valorFCPUFDestinatario       := b.valorFCPUFDestinatario;
        v_baseEstimadaImpostos         := b.baseEstimadaImpostos;
        v_valorEstimadoImpFederais     := b.valorEstimadoImpFederais;
        v_valorEstimadoImpEstaduais    := b.valorEstimadoImpEstaduais;
        v_valorEstimadoImpMunicipais   := b.valorEstimadoImpMunicipais;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        ADD_CALCULA_TOTAIS_ITEM(
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral);
        ADD_CALCULA_IMPOSTOS_ITEM (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          a.entradaSaida,
          a.devolucaoAnulacaoRetorno,
          a.estabelecimento,
          0,
          a.dataEntradaSaida,
          a.pessoa,
          a.localDestinoOperacao,
          a.indicadorConsumidorFinal,
          a.tipoPagamentoFrete,
          a.indicadorInscricaoEstadual,
          b.personalizacao,
          b.quantidade,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal,
          b.cfop,
          1,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          1,
          b.retencaoIRRF,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          1,
          b.retencaoINSS,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          1,
          b.retencaoPIS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          1,
          b.retencaoCOFINS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          1,
          b.retencaoCSLL,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          1,
          b.retencaoOutros,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          1,
          b.aliquotaII,
          v_baseII,
          v_valorII,
          1,
          b.aliquotaIOF,
          v_baseIOF,
          v_valorIOF,
          1,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          v_baseIPI,
          v_valorIPI,
          b.valorIPIDevolucao,
          1,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          v_basePIS,
          v_valorPIS,
          1,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          v_basePISST,
          v_valorPISST,
          1,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          v_baseCOFINS,
          v_valorCOFINS,
          1,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          v_baseCOFINSST,
          v_valorCOFINSST,
          1,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          1,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          1,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          v_baseICMSST,
          v_valorICMSST,
          1,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          0,
          '  ',
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          1,
          b.aliquotaFCP,
          v_baseFCP,
          v_valorFCP,
          b.aliquotaFCPST,
          v_baseFCPST,
          v_valorFCPST,
          b.aliquotaFCPSTAnteriormente,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          1,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais,
          b.produto,
          b.cor,
          b.tamanho,
          b.controleEstoque,
          b.tipoProduto,
          b.precoPautaTabelado,
          /* Retornos */
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          v_baseII,
          v_valorII,
          v_baseIOF,
          v_valorIOF,
          v_baseIPI,
          v_valorIPI,
          v_basePIS,
          v_valorPIS,
          v_basePISST,
          v_valorPISST,
          v_baseCOFINS,
          v_valorCOFINS,
          v_baseCOFINSST,
          v_valorCOFINSST,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          v_baseICMSST,
          v_valorICMSST,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          v_baseFCP,
          v_valorFCP,
          v_baseFCPST,
          v_valorFCPST,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais);
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          v_valorISSQN,
          v_valorRetIRRF,
          v_valorRetINSS,
          v_valorRetPIS,
          v_valorRetCOFINS,
          v_valorRetCSLL,
          v_valorRetOutros,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          0,
          b.modeloDocumento,
          b.quantidade,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          b.valorIPIDevolucao,
          v_valorPIS,
          v_valorPISST,
          v_valorCOFINS,
          v_valorCOFINSST,
          v_valorCreditoSimplesNacional,
          v_valorICMS,
          v_valorICMSST,
          0,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MOPREDOCUMXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorBasePagamento            = v_valorBasePagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          baseISSQN                     = v_baseISSQN,
          valorISSQN                    = v_valorISSQN,
          baseRetIRRF                   = v_baseRetIRRF,
          valorRetIRRF                  = v_valorRetIRRF,
          baseRetINSS                   = v_baseRetINSS,
          valorRetINSS                  = v_valorRetINSS,
          baseRetPIS                    = v_baseRetPIS,
          valorRetPIS                   = v_valorRetPIS,
          baseRetCOFINS                 = v_baseRetCOFINS,
          valorRetCOFINS                = v_valorRetCOFINS,
          baseRetCSLL                   = v_baseRetCSLL,
          valorRetCSLL                  = v_valorRetCSLL,
          baseRetOutros                 = v_baseRetOutros,
          valorRetOutros                = v_valorRetOutros,
          baseII                        = v_baseII,
          valorII                       = v_valorII,
          baseIOF                       = v_baseIOF,
          valorIOF                      = v_valorIOF,
          baseIPI                       = v_baseIPI,
          valorIPI                      = v_valorIPI,
          basePIS                       = v_basePIS,
          valorPIS                      = v_valorPIS,
          basePISST                     = v_basePISST,
          valorPISST                    = v_valorPISST,
          baseCOFINS                    = v_baseCOFINS,
          valorCOFINS                   = v_valorCOFINS,
          baseCOFINSST                  = v_baseCOFINSST,
          valorCOFINSST                 = v_valorCOFINSST,
          baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
          valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
          baseICMS                      = v_baseICMS,
          valorICMSOperacao             = v_valorICMSOperacao,
          valorICMSDiferido             = v_valorICMSDiferido,
          valorICMS                     = v_valorICMS,
          valorICMSDesoneracao          = v_valorICMSDesoneracao,
          baseICMSST                    = v_baseICMSST,
          valorICMSST                   = v_valorICMSST,
          baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
          valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
          valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
          baseICMSEfetivo               = v_baseICMSEfetivo,
          valorICMSEfetivo              = v_valorICMSEfetivo,
          baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
          valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
          baseICMSUFRemetente           = v_baseICMSUFRemetente,
          valorICMSUFRemetente          = v_valorICMSUFRemetente,
          baseFCP                       = v_baseFCP,
          valorFCP                      = v_valorFCP,
          baseFCPST                     = v_baseFCPST,
          valorFCPST                    = v_valorFCPST,
          baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
          valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
          baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
          valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
          baseEstimadaImpostos          = v_baseEstimadaImpostos,
          valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
          valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
          valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemPreDocumento        = b.idItemPreDocumento;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + b.valorDescontoPagamento - b.valorOutrasDespesasPagamento - b.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE preDocumento              = a.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALCULA_IMPOSTOS;

/

create or replace PROCEDURE ADD_DOC_FISC_CALCULA_IMPOSTOS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemDocFiscalUltimoItem    NUMBER;
  v_idItemDocFiscalRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSEscrituracao         NUMBER;
  v_valorICMSEscrituracao        NUMBER;
  v_valorICMSDesonEscrituracao   NUMBER;
  v_baseICMSSTEscrituracao       NUMBER;
  v_valorICMSSTEscrituracao      NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idDocumentoFiscal,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.nfFornecedor,
      a.dataEntradaSaida,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpTotal,
      a.valorCustoOperacao,
      a.valorCMV,
      a.valorAcrescimoExtempTotal,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MODOCUMENTOSFISCAIS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXORCAMENTOITEM docXorc
          ON docXorc.idItemDocFiscal = a.idItemDocFiscal
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_cab_valorDescCustoOpTotal    := 0;
    v_cab_valorAcrescCustoOpTotal  := 0;
    v_cab_valorCustoOperacao       := 0;
    v_cab_valorCMV                 := 0;
    v_cab_valorAcrescExtempTotal   := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_saldoRatDescCustoOpGeral     := a.valorDescontoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescExtempGeral    := a.valorAcrescimoExtempGeral;
    v_residuoFreteGeral            := 0;
    v_residuoSeguroGeral           := 0;
    v_residuoDescontoGeral         := 0;
    v_residuoOutrasDespesasGeral   := 0;
    v_residuoAdicFreteMarinGeral   := 0;
    v_residuoDespesasAduanGeral    := 0;
    v_residuoDescontoPagamento     := 0;
    v_residuoOutrasDespPagamento   := 0;
    v_residuoJurosPagamento        := 0;
    v_residuoDescCustoOpGeral      := 0;
    v_residuoAcrescCustoOpGeral    := 0;
    v_residuoAcrescExtempGeral     := 0;
    v_idItemDocFiscalUltimoItem    := 0;
    v_idItemDocFiscalRateioFrete   := 0;
    v_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
    
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MODOCFISCALXITENS b
      JOIN MODOCFISCALXPROMOCOES promo
      ON promo.idItemDocFiscal = b.idItemDocFiscal
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
    
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MODOCFISCALXITENS b
      JOIN MODOCFISCALXPROMOCOES promo
      ON promo.idItemDocFiscal = b.idItemDocFiscal
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MODOCFISCALXPROMOCOES promo
              WHERE promo.idItemDocFiscal = b.idItemDocFiscal
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END
              - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MODOCFISCALXPROMOCOES promo
            ON promo.idItemDocFiscal = b.idItemDocFiscal
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MODOCFISCALXITENS b
              WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = b.idItemDocFiscal))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT EXISTS (
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = b.idItemDocFiscal))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MODOCFISCALXITENS b
              WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MODOCFISCALXPROMOCOES promo
                  WHERE promo.idItemDocFiscal = b.idItemDocFiscal))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
    
    -- Bases Rateio
    SELECT
      MAX (COALESCE ((CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0)
    INTO
      v_rateioFretePorControleEntr,
      v_valorBaseFreteSemFinSemEntr,
      v_valorBaseFreteComFinSemEntr,
      v_valorBaseFreteSemFinComEntr,
      v_valorBaseFreteComFinComEntr,
      v_valorBaseRateio,
      v_valorBaseRateioComEntrega,
      v_valorBaseRateioFinanceiro,
      v_valorBaseRateioOutrasDespGer,
      v_valorBaseRateioOutrasDespFin,
      v_valorBaseRateioDescontoGeral,
      v_valorBaseRateioPagamento,
      v_valorBaseRateioPagamFinanc,
      v_valorBaseRateioPagamDesconto,
      v_valorBaseRateioPagamFinDesc
    FROM MODOCFISCALXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemDocFiscal,
        b.modeloDocumento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST,
        b.valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        b.valorDescontoCustoOpGeral,
        b.valorDescontoCustoOpTotal,
        b.valorAcrescimoCustoOpItem,
        b.valorAcrescimoCustoOpGeral,
        b.valorAcrescimoCustoOpTotal,
        b.precoCustoOperacao,
        b.valorCustoOperacao,
        b.precoCMV,
        b.valorCMV,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo,
        b.valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        b.valorAcrescimoExtempGeral,
        b.valorAcrescimoExtempTotal,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        prod.tipoProduto,
        CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(
          SELECT 1
          FROM MODOCFISCALXORCAMENTOITEM docXorc
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal
          AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(
          SELECT 1
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal) THEN 1 ELSE 0 END promocao,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal
          AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal
          AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM CAPRODUTOXCOMPOSICOESPREC compPrec
            WHERE compPrec.produto = gradProd.produto
            AND compPrec.ativo = 1)
          THEN 1
          ELSE 0
        END composicaoPreco
      FROM MODOCFISCALXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemDocFiscalUltimoItem    := b.idItemDocFiscal;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.valorProdutoServico;
      v_valorDescontoGeral           := v_residuoDescontoGeral;
      v_valorFreteGeral              := v_residuoFreteGeral;
      v_valorSeguroGeral             := v_residuoSeguroGeral;
      v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
      v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
      v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
      v_valorBasePagamento           := b.valorBasePagamento;
      v_valorDescontoPagamento       := v_residuoDescontoPagamento;
      v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
      v_valorJurosPagamento          := v_residuoJurosPagamento;
      v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
      v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
      v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
      v_valorFreteTotal              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
      v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
      v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
      v_precoCustoOperacao           := b.precoCustoOperacao;
      v_valorCustoOperacao           := b.valorCustoOperacao;
      v_precoCMV                     := b.precoCMV;
      v_valorCMV                     := b.valorCMV;
      v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
      v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral        > 0
        AND v_valorDescontoPromocaoGeral > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
        v_valorDescontoGeral   := v_saldoRatDescontoGeral;
        v_residuoDescontoGeral := 0;
      ELSE
        v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
        v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
      END IF;
      v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
  
      -- v_valorFreteGeral
      -- v_valorSeguroGeral
      IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND b.geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorFreteGeral,2) >= v_saldoRatFreteGeral THEN
        v_valorFreteGeral := v_saldoRatFreteGeral;
        v_residuoFreteGeral := 0;
      ELSE
        v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral,2);
        v_valorFreteGeral := ROUND (v_valorFreteGeral,2);
      END IF;
      v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
      IF ROUND (v_valorSeguroGeral,2) >= v_saldoRatSeguroGeral THEN
        v_valorSeguroGeral   := v_saldoRatSeguroGeral;
        v_residuoSeguroGeral := 0;
      ELSE
        v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral,2);
        v_valorSeguroGeral   := ROUND (v_valorSeguroGeral,2);
      END IF;
      v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
  
      -- v_valorAdicFreteMarinMerGeral
      -- v_valorDespesasAduaneirasGeral
      -- v_valorDescontoCustoOpGeral
      -- v_valorAcrescimoCustoOpGeral
      -- v_valorAcrescimoExtempGeral
      IF v_valorBaseRateioFinanceiro > 0 AND b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
      END IF;
      IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
        v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
        v_residuoAdicFreteMarinGeral  := 0;
      ELSE
        v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
        v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
      END IF;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
        v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
        v_residuoDespesasAduanGeral    := 0;
      ELSE
        v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
        v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
      END IF;
      v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
      IF ROUND (v_valorDescontoCustoOpGeral,2) >= v_saldoRatDescCustoOpGeral THEN
        v_valorDescontoCustoOpGeral := v_saldoRatDescCustoOpGeral;
        v_residuoDescCustoOpGeral   := 0;
      ELSE
        v_residuoDescCustoOpGeral   := v_valorDescontoCustoOpGeral - ROUND (v_valorDescontoCustoOpGeral,2);
        v_valorDescontoCustoOpGeral := ROUND (v_valorDescontoCustoOpGeral,2);
      END IF;
      v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
      IF ROUND (v_valorAcrescimoCustoOpGeral,2) >= v_saldoRatAcrescCustoOpGeral THEN
        v_valorAcrescimoCustoOpGeral := v_saldoRatAcrescCustoOpGeral;
        v_residuoAcrescCustoOpGeral  := 0;
      ELSE
        v_residuoAcrescCustoOpGeral  := v_valorAcrescimoCustoOpGeral - ROUND (v_valorAcrescimoCustoOpGeral,2);
        v_valorAcrescimoCustoOpGeral := ROUND (v_valorAcrescimoCustoOpGeral,2);
      END IF;
      v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
      IF ROUND (v_valorAcrescimoExtempGeral,2) >= v_saldoRatAcrescExtempGeral THEN
        v_valorAcrescimoExtempGeral := v_saldoRatAcrescExtempGeral;
        v_residuoAcrescExtempGeral  := 0;
      ELSE
        v_residuoAcrescExtempGeral  := v_valorAcrescimoExtempGeral - ROUND (v_valorAcrescimoExtempGeral,2);
        v_valorAcrescimoExtempGeral := ROUND (v_valorAcrescimoExtempGeral,2);
      END IF;
      v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
  
      -- v_valorOutrasDespesasGeral
      IF v_valorBaseRateioOutrasDespFin > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
      END IF;
      IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
        v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
        v_residuoOutrasDespesasGeral := 0;
      ELSE
        v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
        v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
      END IF;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
  
      -- v_valorDescontoPagamento
      IF a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento            > 0
        AND v_valorDescontoPromocaoPagamen   > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento;
        END IF;
      END IF;
      IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
        v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
        v_residuoDescontoPagamento := 0;
      ELSE
        v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
        v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
      END IF;
      v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
  
      -- v_valorOutrasDespesasPagamento
      -- v_valorJurosPagamento
      IF v_valorBaseRateioPagamFinanc > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento          * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento          * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      END IF;
      IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
        v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
        v_residuoOutrasDespPagamento   := 0;
      ELSE
        v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
        v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
      END IF;
      v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
        v_valorJurosPagamento   := v_saldoRatJurosPagamento;
        v_residuoJurosPagamento := 0;
      ELSE
        v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
        v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
      END IF;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
  
      -- Recalcula Valores
      ADD_CALCULA_TOTAIS_ITEM (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL (
        b.quantidade,
        v_precoUnitario,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo);
      v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
        v_valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        v_valorAcrescimoExtempGeral);
      IF a.impostosEditados = 0 
          OR v_valorProdutoServico <> b.valorProdutoServico
          OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
          OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
          OR v_valorDescontoTotal <> b.valorDescontoTotal
          OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
          OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
          OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
          OR v_precoUnitario <> b.precoUnitario
          OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        a.nfFornecedor,
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST,
        v_valorAcrescimoExtempTotal,
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        a.nfFornecedor,
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST);
      ADD_CALCULA_CUSTO_CMV (
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.nfFornecedor,
        b.modeloDocumento,
        b.quantidade,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorIPIDevolucao,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        v_valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        v_valorDescontoCustoOpGeral,
        b.valorAcrescimoCustoOpItem,
        v_valorAcrescimoCustoOpGeral,
        v_valorAcrescimoExtempTotal,
        /* Retornos */
        v_valorDescontoCustoOpTotal,
        v_valorAcrescimoCustoOpTotal,
        v_precoCustoOperacao,
        v_valorCustoOperacao,
        v_precoCMV,
        v_valorCMV);
  
      -- Atualiza Item
      UPDATE MODOCFISCALXITENS SET
        precoUnitario                 = v_precoUnitario,
        precoUnitarioConvertido       = v_precoUnitarioConvertido,
        valorProdutoServico           = v_valorProdutoServico,
        valorFreteGeral               = v_valorFreteGeral,
        valorSeguroGeral              = v_valorSeguroGeral,
        valorDescontoGeral            = v_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
        valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
        valorBasePagamento            = v_valorBasePagamento,
        valorDescontoPagamento        = v_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
        valorJurosPagamento           = v_valorJurosPagamento,
        valorFreteTotal               = v_valorFreteTotal,
        valorSeguroTotal              = v_valorSeguroTotal,
        valorDescontoTotal            = v_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
        valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
        valorLiquidoItem              = v_valorLiquidoItem,
        valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
        valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
        valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
        precoCustoOperacao            = v_precoCustoOperacao,
        valorCustoOperacao            = v_valorCustoOperacao,
        precoCMV                      = v_precoCMV,
        valorCMV                      = v_valorCMV,
        valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
        valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
      WHERE idItemDocFiscal           = b.idItemDocFiscal;
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
      v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
      v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
      v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
    END LOOP;
    IF v_idItemDocFiscalUltimoItem <> 0
      AND (v_saldoRatDescontoGeral <> 0
        OR v_saldoRatOutrasDespesasGeral <> 0
        OR v_saldoRatDescontoPagamento <> 0
        OR v_saldoRatOutrasDespPagamento <> 0
        OR v_saldoRatJurosPagamento <> 0
        OR v_saldoRatFreteGeral <> 0
        OR v_saldoRatSeguroGeral <> 0
        OR v_saldoRatAdicFreteMarinGeral <> 0
        OR v_saldoRatDespesasAduanGeral <> 0)
    THEN
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.modeloDocumento,
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST,
          b.valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          b.valorAcrescimoCustoOpTotal,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral,
          b.valorAcrescimoExtempTotal,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MODOCFISCALXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemDocFiscal = CASE WHEN v_idItemDocFiscalRateioFrete = 0 THEN v_idItemDocFiscalUltimoItem ELSE v_idItemDocFiscalRateioFrete END
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpGeral    := b.valorDescontoCustoOpGeral;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpGeral   := b.valorAcrescimoCustoOpGeral;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempGeral    := b.valorAcrescimoExtempGeral;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;    
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao - v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV - v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + v_saldoRatDescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + v_saldoRatAcrescCustoOpGeral;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + v_saldoRatAcrescExtempGeral;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL (
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          v_valorAcrescimoExtempGeral);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST,
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST);
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          a.nfFornecedor,
          b.modeloDocumento,
          b.quantidade,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          v_valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          v_valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MODOCFISCALXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemDocFiscal           = CASE WHEN v_idItemDocFiscalRateioFrete = 0 THEN v_idItemDocFiscalUltimoItem ELSE v_idItemDocFiscalRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_cab_valorDescCustoOpTotal    := 0;
      v_cab_valorAcrescCustoOpTotal  := 0;
      v_cab_valorCustoOperacao       := 0;
      v_cab_valorCMV                 := 0;
      v_cab_valorAcrescExtempTotal   := 0;
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemDocFiscal,
          b.modeloDocumento,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorDescontoCustoOpItem,
          b.valorAcrescimoCustoOpItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorAcrescimoExtempGeral,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorAcrescimoExtempTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorIPIDevolucao,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.stICMSEscrituracao,
          b.reducaoBaseICMSEscrituracao,
          b.aliquotaICMSEscrituracao,
          b.diferimentoICMSEscrituracao,
          b.margemValorAdicSTEscrituracao,
          b.reducaoBaseSTEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          b.somarICMSST,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSEscrituracao,
          b.valorICMSEscrituracao,
          b.valorICMSDesonEscrituracao,
          b.baseICMSSTEscrituracao,
          b.valorICMSSTEscrituracao,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MODOCFISCALXITENS b
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
        AND b.cancelado = 0
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_baseISSQN                    := b.baseISSQN;
        v_valorISSQN                   := b.valorISSQN;
        v_baseRetIRRF                  := b.baseRetIRRF;
        v_valorRetIRRF                 := b.valorRetIRRF;
        v_baseRetINSS                  := b.baseRetINSS;
        v_valorRetINSS                 := b.valorRetINSS;
        v_baseRetPIS                   := b.baseRetPIS;
        v_valorRetPIS                  := b.valorRetPIS;
        v_baseRetCOFINS                := b.baseRetCOFINS;
        v_valorRetCOFINS               := b.valorRetCOFINS;
        v_baseRetCSLL                  := b.baseRetCSLL;
        v_valorRetCSLL                 := b.valorRetCSLL;
        v_baseRetOutros                := b.baseRetOutros;
        v_valorRetOutros               := b.valorRetOutros;
        v_baseII                       := b.baseII;
        v_valorII                      := b.valorII;
        v_baseIOF                      := b.baseIOF;
        v_valorIOF                     := b.valorIOF;
        v_baseIPI                      := b.baseIPI;
        v_valorIPI                     := b.valorIPI;
        v_basePIS                      := b.basePIS;
        v_valorPIS                     := b.valorPIS;
        v_basePISST                    := b.basePISST;
        v_valorPISST                   := b.valorPISST;
        v_baseCOFINS                   := b.baseCOFINS;
        v_valorCOFINS                  := b.valorCOFINS;
        v_baseCOFINSST                 := b.baseCOFINSST;
        v_valorCOFINSST                := b.valorCOFINSST;
        v_baseCreditoSimplesNacional   := b.baseCreditoSimplesNacional;
        v_valorCreditoSimplesNacional  := b.valorCreditoSimplesNacional;
        v_baseICMS                     := b.baseICMS;
        v_valorICMSOperacao            := b.valorICMSOperacao;
        v_valorICMSDiferido            := b.valorICMSDiferido;
        v_valorICMS                    := b.valorICMS;
        v_valorICMSDesoneracao         := b.valorICMSDesoneracao;
        v_baseICMSST                   := b.baseICMSST;
        v_valorICMSST                  := b.valorICMSST;
        v_baseICMSSTAnteriormente      := b.baseICMSSTAnteriormente;
        v_valorICMSSTAnteriormente     := b.valorICMSSTAnteriormente;
        v_valorICMSProprioSubstituto   := b.valorICMSProprioSubstituto;
        v_baseICMSEfetivo              := b.baseICMSEfetivo;
        v_valorICMSEfetivo             := b.valorICMSEfetivo;
        v_baseICMSEscrituracao         := b.baseICMSEscrituracao;
        v_valorICMSEscrituracao        := b.valorICMSEscrituracao;
        v_valorICMSDesonEscrituracao   := b.valorICMSDesonEscrituracao;
        v_baseICMSSTEscrituracao       := b.baseICMSSTEscrituracao;
        v_valorICMSSTEscrituracao      := b.valorICMSSTEscrituracao;
        v_baseICMSUFDestinatario       := b.baseICMSUFDestinatario;
        v_valorICMSUFDestinatario      := b.valorICMSUFDestinatario;
        v_baseICMSUFRemetente          := b.baseICMSUFRemetente;
        v_valorICMSUFRemetente         := b.valorICMSUFRemetente;
        v_baseFCP                      := b.baseFCP;
        v_valorFCP                     := b.valorFCP;
        v_baseFCPST                    := b.baseFCPST;
        v_valorFCPST                   := b.valorFCPST;
        v_baseFCPSTAnteriormente       := b.baseFCPSTAnteriormente;
        v_valorFCPSTAnteriormente      := b.valorFCPSTAnteriormente;
        v_baseFCPUFDestinatario        := b.baseFCPUFDestinatario;
        v_valorFCPUFDestinatario       := b.valorFCPUFDestinatario;
        v_baseEstimadaImpostos         := b.baseEstimadaImpostos;
        v_valorEstimadoImpFederais     := b.valorEstimadoImpFederais;
        v_valorEstimadoImpEstaduais    := b.valorEstimadoImpEstaduais;
        v_valorEstimadoImpMunicipais   := b.valorEstimadoImpMunicipais;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral);
        ADD_CALCULA_IMPOSTOS_ITEM (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          a.entradaSaida,
          a.devolucaoAnulacaoRetorno,
          a.estabelecimento,
          a.nfFornecedor,
          a.dataEntradaSaida,
          a.pessoa,
          a.localDestinoOperacao,
          a.indicadorConsumidorFinal,
          a.tipoPagamentoFrete,
          a.indicadorInscricaoEstadual,
          b.personalizacao,
          b.quantidade,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal,
          b.cfop,
          1,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          1,
          b.retencaoIRRF,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          1,
          b.retencaoINSS,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          1,
          b.retencaoPIS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          1,
          b.retencaoCOFINS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          1,
          b.retencaoCSLL,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          1,
          b.retencaoOutros,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          1,
          b.aliquotaII,
          v_baseII,
          v_valorII,
          1,
          b.aliquotaIOF,
          v_baseIOF,
          v_valorIOF,
          1,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          v_baseIPI,
          v_valorIPI,
          b.valorIPIDevolucao,
          1,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          v_basePIS,
          v_valorPIS,
          1,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          v_basePISST,
          v_valorPISST,
          1,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          v_baseCOFINS,
          v_valorCOFINS,
          1,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          v_baseCOFINSST,
          v_valorCOFINSST,
          1,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          1,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          1,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          v_baseICMSST,
          v_valorICMSST,
          1,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          1,
          b.stICMSEscrituracao,
          b.reducaoBaseICMSEscrituracao,
          b.aliquotaICMSEscrituracao,
          b.diferimentoICMSEscrituracao,
          v_baseICMSEscrituracao,
          v_valorICMSEscrituracao,
          v_valorICMSDesonEscrituracao,
          1,
          b.margemValorAdicSTEscrituracao,
          b.reducaoBaseSTEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          v_baseICMSSTEscrituracao,
          v_valorICMSSTEscrituracao,
          1,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          1,
          b.aliquotaFCP,
          v_baseFCP,
          v_valorFCP,
          b.aliquotaFCPST,
          v_baseFCPST,
          v_valorFCPST,
          b.aliquotaFCPSTAnteriormente,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          1,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais,
          b.produto,
          b.cor,
          b.tamanho,
          b.controleEstoque,
          b.tipoProduto,
          b.precoPautaTabelado,
          /* Retornos */
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          v_baseII,
          v_valorII,
          v_baseIOF,
          v_valorIOF,
          v_baseIPI,
          v_valorIPI,
          v_basePIS,
          v_valorPIS,
          v_basePISST,
          v_valorPISST,
          v_baseCOFINS,
          v_valorCOFINS,
          v_baseCOFINSST,
          v_valorCOFINSST,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          v_baseICMSST,
          v_valorICMSST,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          v_baseICMSEscrituracao,
          v_valorICMSEscrituracao,
          v_valorICMSDesonEscrituracao,
          v_baseICMSSTEscrituracao,
          v_valorICMSSTEscrituracao,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          v_baseFCP,
          v_valorFCP,
          v_baseFCPST,
          v_valorFCPST,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais);    
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          v_valorISSQN,
          v_valorRetIRRF,
          v_valorRetINSS,
          v_valorRetPIS,
          v_valorRetCOFINS,
          v_valorRetCSLL,
          v_valorRetOutros,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          v_valorICMSSTEscrituracao,
          b.somarICMSST,
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          v_valorICMSSTEscrituracao,
          b.somarICMSST);
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          a.nfFornecedor,
          b.modeloDocumento,
          b.quantidade,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          b.valorIPIDevolucao,
          v_valorPIS,
          v_valorPISST,
          v_valorCOFINS,
          v_valorCOFINSST,
          v_valorCreditoSimplesNacional,
          v_valorICMS,
          v_valorICMSST,
          v_valorICMSSTEscrituracao,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MODOCFISCALXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorBasePagamento            = v_valorBasePagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          baseISSQN                     = v_baseISSQN,
          valorISSQN                    = v_valorISSQN,
          baseRetIRRF                   = v_baseRetIRRF,
          valorRetIRRF                  = v_valorRetIRRF,
          baseRetINSS                   = v_baseRetINSS,
          valorRetINSS                  = v_valorRetINSS,
          baseRetPIS                    = v_baseRetPIS,
          valorRetPIS                   = v_valorRetPIS,
          baseRetCOFINS                 = v_baseRetCOFINS,
          valorRetCOFINS                = v_valorRetCOFINS,
          baseRetCSLL                   = v_baseRetCSLL,
          valorRetCSLL                  = v_valorRetCSLL,
          baseRetOutros                 = v_baseRetOutros,
          valorRetOutros                = v_valorRetOutros,
          baseII                        = v_baseII,
          valorII                       = v_valorII,
          baseIOF                       = v_baseIOF,
          valorIOF                      = v_valorIOF,
          baseIPI                       = v_baseIPI,
          valorIPI                      = v_valorIPI,
          basePIS                       = v_basePIS,
          valorPIS                      = v_valorPIS,
          basePISST                     = v_basePISST,
          valorPISST                    = v_valorPISST,
          baseCOFINS                    = v_baseCOFINS,
          valorCOFINS                   = v_valorCOFINS,
          baseCOFINSST                  = v_baseCOFINSST,
          valorCOFINSST                 = v_valorCOFINSST,
          baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
          valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
          baseICMS                      = v_baseICMS,
          valorICMSOperacao             = v_valorICMSOperacao,
          valorICMSDiferido             = v_valorICMSDiferido,
          valorICMS                     = v_valorICMS,
          valorICMSDesoneracao          = v_valorICMSDesoneracao,
          baseICMSST                    = v_baseICMSST,
          valorICMSST                   = v_valorICMSST,
          baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
          valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
          valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
          baseICMSEfetivo               = v_baseICMSEfetivo,
          valorICMSEfetivo              = v_valorICMSEfetivo,
          baseICMSEscrituracao          = v_baseICMSEscrituracao,
          valorICMSEscrituracao         = v_valorICMSEscrituracao,
          valorICMSDesonEscrituracao    = v_valorICMSDesonEscrituracao,
          baseICMSSTEscrituracao        = v_baseICMSSTEscrituracao,
          valorICMSSTEscrituracao       = v_valorICMSSTEscrituracao,
          baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
          valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
          baseICMSUFRemetente           = v_baseICMSUFRemetente,
          valorICMSUFRemetente          = v_valorICMSUFRemetente,
          baseFCP                       = v_baseFCP,
          valorFCP                      = v_valorFCP,
          baseFCPST                     = v_baseFCPST,
          valorFCPST                    = v_valorFCPST,
          baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
          valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
          baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
          valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
          baseEstimadaImpostos          = v_baseEstimadaImpostos,
          valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
          valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
          valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemDocFiscal           = b.idItemDocFiscal;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + b.valorDescontoPagamento - b.valorOutrasDespesasPagamento - b.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = a.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALCULA_IMPOSTOS;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- C = Painel de Compras, 'F' Fatura Contrato, L = Lista Evento, O = Orçamento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_mensagemAviso                IN VARCHAR,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_orcamento               IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_ambiente                IN NUMBER,
  p_item_ambienteObservacoes     IN VARCHAR2,
  p_item_vinculoItemDocumento    IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_statusAtividadeServico  IN CHAR,
  p_item_controleEntrega         IN NUMBER,
  p_item_dataEntrega             IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_atividadeProjeto        IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_idAtividadesPrevistasSelec   IN VARCHAR2,
  p_nivel                        IN NUMBER,
  p_buffer_idItemOrcamento       IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_idItemOrcamento       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_finalidadeNota           CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_controleEntrega          NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_valorISSQN               NUMBER;
  v_ini_valorRetIRRF             NUMBER;
  v_ini_valorRetINSS             NUMBER;
  v_ini_valorRetPIS              NUMBER;
  v_ini_valorRetCOFINS           NUMBER;
  v_ini_valorRetCSLL             NUMBER;
  v_ini_valorRetOutros           NUMBER;
  v_ini_contrEntr_habilitaFrete  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeSaldo         NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorFreteGeral         NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_residuoISSQN            NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_residuoRetIRRF          NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_residuoRetINSS          NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_residuoRetPIS           NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_residuoRetCOFINS        NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_residuoRetCSLL          NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_residuoRetOutros        NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_contrEntr_habilitaFrete      NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemOrcamento       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_ativ_criouPendenteIniciado   NUMBER;
  v_ativ_idAtividadePrevOrcamen  NUMBER;
  v_ativ_sequencia               NUMBER;
  v_ativ_tecnico                 NUMBER;
  v_ativ_checklist               NUMBER;
  v_ativ_gradeProdutoXFichaAtiv  NUMBER;
  v_ativ_idAtividadeRealOrcament NUMBER;
  v_ativ_idFichaProdutoPrevOrcam NUMBER;
  v_ativ_ordenacaoFichaProdutoPr NUMBER;
  v_ativ_atualizaCustoMedio      NUMBER;
  v_ativ_atualizaUltimaCompra    NUMBER;
  v_ativ_selecionaAtividadePrev  NUMBER;
  v_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          NUMBER;
  v_ativ_geraFinanceiro          NUMBER;
  v_valorFreteRegra              NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := p_mensagemAviso;
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemOrcamento := p_item_idItemOrcamento;
  r_buffer_idItemOrcamento := p_buffer_idItemOrcamento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.transportadora,
    cab.enderecoTransportadora,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_finalidadeNota,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_transportadora,
    v_cab_enderecoTransportadora,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.orcamento = p_item_orcamento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_controleEntrega          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_valorISSQN               := 0;
  v_ini_valorRetIRRF             := 0;
  v_ini_valorRetINSS             := 0;
  v_ini_valorRetPIS              := 0;
  v_ini_valorRetCOFINS           := 0;
  v_ini_valorRetCSLL             := 0;
  v_ini_valorRetOutros           := 0;
  v_ini_contrEntr_habilitaFrete  := 0;
  v_item_quantidadeSaldo         := p_item_quantidade;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorFreteGeral         := p_item_valorFreteGeral;
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_residuoISSQN            := 0;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_residuoRetIRRF          := 0;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_residuoRetINSS          := 0;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_residuoRetPIS           := 0;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_residuoRetCOFINS        := 0;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_residuoRetCSLL          := 0;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_residuoRetOutros        := 0;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  v_contrEntr_habilitaFrete      := 0;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOORCAMENTOXPROMOCOES
    WHERE orcamento = p_item_orcamento;
  END IF;
  IF p_item_idItemOrcamento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeSaldo,
        a.controleEntrega,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        prod.tipoProduto,
        b.habilitaFrete
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA b
      ON b.controleEntrega = a.controleEntrega
      WHERE a.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_controleEntrega := a.controleEntrega;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_valorISSQN := a.valorISSQN;
      v_ini_valorRetIRRF := a.valorRetIRRF;
      v_ini_valorRetINSS := a.valorRetINSS;
      v_ini_valorRetPIS := a.valorRetPIS;
      v_ini_valorRetCOFINS := a.valorRetCOFINS;
      v_ini_valorRetCSLL := a.valorRetCSLL;
      v_ini_valorRetOutros := a.valorRetOutros;
      v_ini_contrEntr_habilitaFrete := 0;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_contrEntr_habilitaFrete := a.habilitaFrete;
      IF p_buscarAliquotas_CalcularImp = 'T' THEN
        IF p_buscarGeraFinanceiroEstoque = 1 THEN
          v_item_movimentaEstoque        := a.movimentaEstoque;
          v_item_geraFinanceiro          := a.geraFinanceiro;
        END IF;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF a.cancelado = 0 THEN
        v_item_quantidadeSaldo := v_item_quantidadeSaldo + a.quantidadeSaldo - a.quantidade;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> v_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    v_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = 'E'
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        0, -- v_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_ORCAMENTO_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_config_430_sugerirUsuLogTec,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, 
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND (a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_mensagemAviso,
        r_calcularImpostos,
        0, -- p_item_idItemOrcamento
        p_item_orcamento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_ambiente,
        p_item_ambienteObservacoes,
        999, -- p_item_vinculoItemDocumento
        0, -- p_item_atividadeServico
        'A', -- p_item_statusAtividadeServico
        p_item_controleEntrega,
        p_item_dataEntrega,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_atividadeProjeto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(v_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- v_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        ' ', -- p_idAtividadesPrevistasSelec
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_idItemOrcamento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemOrcamento)) >= 14
      LOOP
        v_ajuste_idItemOrcamento := TO_NUMBER(SUBSTR(r_buffer_idItemOrcamento,1,14));
        r_buffer_idItemOrcamento := RTRIM(SUBSTR(r_buffer_idItemOrcamento,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MOORCAMENTOXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemOrcamento = v_ajuste_idItemOrcamento;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MOORCAMENTOXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemOrcamento = v_ajuste_idItemOrcamento;
      END LOOP;
      UPDATE MOORCAMENTOS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE orcamento          = p_item_orcamento;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemOrcamento <= 0 THEN
      r_item_idItemOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXITENS', 'idItemOrcamento', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF p_item_controleEntrega > 0 THEN
        SELECT habilitaFrete
        INTO v_contrEntr_habilitaFrete
        FROM PACONTROLESENTREGA
        WHERE controleEntrega = p_item_controleEntrega;
      END IF;
      IF
        CASE
          WHEN v_ini_controleEntrega = 0
            OR v_ini_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_ini_valorProdutoServicoBruto - v_ini_valorDescontoItem + v_ini_valorAcrescimoItem
        END <>
        CASE
          WHEN p_item_controleEntrega = 0
            OR v_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem
        END
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0, -- p_buscarESalvarInternamente
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_ini_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit,
          r_item_idItemOrcamento,
          p_item_pesoLiquido,
          p_item_pesoBruto,
          v_item_valorProdutoServicoBrut,
          p_item_valorDescontoItem,
          p_item_valorAcrescimoItem,
          p_item_controleEntrega,
          v_item_valorFreteGeral,
          v_contrEntr_habilitaFrete,
          /* Retornos */
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_valorFreteRegra,
          v_auxNumber);
        IF v_valorFreteRegra <> v_ini_cab_valorFreteGeral THEN
          v_item_valorFreteGeral := v_valorFreteRegra - v_cab_valorFreteGeral;
        END IF;
      ELSIF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        v_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        0, -- p_cab_vendaConsumidor
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        0, -- p_movimentaEstoqueFiscal
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_auxNumber, -- r_movimentaEstoqueFiscal
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar, -- r_item_stICMSEscrit
        v_auxNumber, -- r_item_reducaoBaseICMSEscrit
        v_auxNumber, -- r_item_aliquotaICMSEscrit
        v_auxNumber, -- r_item_diferimentoICMSEscritur
        v_auxNumber, -- r_item_margemValorAdicSTEscrit
        v_auxNumber, -- r_item_reducaoBaseSTEscrit
        v_auxNumber, -- r_item_aliquotaICMSSTEscrit
        v_auxNumber, -- r_item_somarICMSST
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        v_item_residuoISSQN,
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        v_item_residuoRetIRRF,
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        v_item_residuoRetINSS,
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        v_item_residuoRetPIS,
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        v_item_residuoRetCOFINS,
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        v_item_residuoRetCSLL,
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        v_item_residuoRetOutros,
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        0, -- p_valorIPIDevolucao
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        0, -- p_calcularICMSEscrituracao
        '  ', -- p_stICMSEscrituracao
        0, -- p_reducaoBaseICMSEscrituracao
        0, -- p_aliquotaICMSEscrituracao
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        0, -- p_calcularICMSSTEscrituracao
        0, -- p_margemValorAdicSTEscriturac
        0, -- p_reducaoBaseSTEscrituracao
        0, -- p_aliquotaICMSSTEscrituracao
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_residuoISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_residuoRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_residuoRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_residuoRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_residuoRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_residuoRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_residuoRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber, -- r_baseICMSEscrituracao
        v_auxNumber, -- r_valorICMSEscrituracao
        v_auxNumber, -- r_valorICMSDesonEscrituracao
        v_auxNumber, -- r_baseICMSSTEscrituracao
        v_auxNumber, -- r_valorICMSSTEscrituracao
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    END IF;
    UPDATE MOORCAMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      transportadora                = v_cab_transportadora,
      enderecoTransportadora        = v_cab_enderecoTransportadora,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    IF v_item_valorISSQN <> v_ini_valorISSQN
      OR v_item_valorRetIRRF <> v_ini_valorRetIRRF
      OR v_item_valorRetINSS <> v_ini_valorRetINSS
      OR v_item_valorRetPIS <> v_ini_valorRetPIS
      OR v_item_valorRetCOFINS <> v_ini_valorRetCOFINS
      OR v_item_valorRetCSLL <> v_ini_valorRetCSLL
      OR v_item_valorRetOutros <> v_ini_valorRetOutros
    THEN
      r_calcularImpostos := 1;
    END IF;
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      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,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_sys_estabelecimentoAtivo,
          v_cab_tipoDocumento,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'O',
      r_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MOORCAMENTOXITENS
    SET observacoes = v_observacoes
    WHERE idItemOrcamento = r_item_idItemOrcamento;
    r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
    THEN
      v_ativ_criouPendenteIniciado := 0;
      v_ativ_sequencia             := 0;
      v_ativ_tecnico               := 0;
      v_ativ_checklist             := 0;
      -- Atividades Previstas Ordem Serviço
      IF v_cab_tipoDocumento = 102
        AND p_item_atividadeServico > 0
      THEN
        SELECT
          habilitaAtividadePrevista,
          selecionaAtividadePrevista
        INTO
          v_auxNumber,
          v_ativ_selecionaAtividadePrev
        FROM PAATIVIDADESSERVICO
        WHERE atividadeServico = p_item_atividadeServico;
        IF p_config_430_sugerirUsuLogTec = 1 THEN
          SELECT COALESCE (MAX (tecnico), 0)
          INTO v_ativ_tecnico
          FROM CATECNICOS
          WHERE tecnico = p_sys_usuarioLogado
          AND ativo = 1;
        END IF;
        IF v_auxNumber = 1 THEN
          FOR a IN (
            SELECT
              a.atividadeServicoPrevista,
              a.tecnico,
              a.faturarAtividade,
              a.etapaAtividade,
              a.observacoes,
              COALESCE ((
                SELECT MAX (b.checklist)
                FROM (
                  SELECT
                    b.atividadeServico,
                    b.checklist,
                    ROW_NUMBER() OVER (
                      PARTITION BY b.atividadeServico
                      ORDER BY
                        b.atividadeServico,
                        b.ordenacao,
                        b.id) ordenacao
                  FROM PAATIVIDADESERVXCHECKLIST b
                  WHERE b.ativo = 1) b
                WHERE b.atividadeServico = a.atividadeServicoPrevista
                AND b.ordenacao = 1), 0) checklist,
              CASE ativ.gradeProduto
                WHEN 0
                THEN 0
                WHEN p_item_gradeProduto
                THEN v_item_precoUnitario
                ELSE FUNC_ADD_BUSCA_PRECO (
                  p_config_64_casasDecSaidas,
                  p_config_209_filtrarGrupoEcon,
                  p_config_362_calcCustoPorGrade,
                  p_sys_perfilUsuarioLogado,
                  p_sys_usuarioLogado,
                  v_cab_estabelecimento,
                  SYSDATE, -- p_cab_dataPrecoFinal
                  v_cab_pessoa,
                  v_munEndEst_uf,
                  v_munEndPess_uf,
                  p_item_vendedor,
                  0, -- p_item_idFormulaTinta
                  0, -- p_item_personalizacao
                  gradProd.produto,
                  gradProd.cor,
                  gradProd.tamanho,
                  prod.controleEstoque,
                  p_item_tipoPreco,
                  p_item_tabelaPreco)
              END precoUnitario
            FROM PAATIVIDADEOSXPREVISTA a
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = a.atividadeServicoPrevista
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE a.id > 0
            AND (v_ativ_selecionaAtividadePrev = 0
              AND a.atividadeServicoOs = p_item_atividadeServico
              AND a.ativo = 1
              AND a.sugestao = 1
              OR v_ativ_selecionaAtividadePrev = 1
              AND INSTR (',' || TRIM (p_idAtividadesPrevistasSelec) || ',', ',' || TO_CHAR (a.id) || ',') > 0)
            ORDER BY
              a.atividadeServicoOs,
              a.ordenacao,
              a.id)
          LOOP
            v_ativ_sequencia := v_ativ_sequencia + 1;
            ADD_ORCAMENTO_ITEM_PREV_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadePrevOrcamento
              r_item_idItemOrcamento,
              v_ativ_sequencia, -- p_sequencia
              a.atividadeServicoPrevista, -- p_atividadeServico
              ' ', -- p_descricao
              CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
              a.faturarAtividade, -- p_faturarAtividade
              a.checklist, -- p_checklist
              'I', -- p_tipoApontamento
              0, -- p_editaQuantidades
              a.etapaAtividade, -- p_etapaAtividade
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
              0, -- p_quantidade
              a.precoUnitario, -- p_precoUnitario
              a.observacoes, -- p_observacoes
              v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
            v_ativ_criouPendenteIniciado := 1;
            IF a.checklist > 0 THEN
              ADD_ORCAMENTO_ITEM_TAREF_GERA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                a.checklist); -- p_checklist
            END IF;
            IF v_ativ_criouPendenteIniciado = 0
              AND CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado
            THEN
              ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadeRealOrcamento
                v_ativ_idAtividadePrevOrcamen,
                1, -- p_sequencia
                a.atividadeServicoPrevista, -- p_atividadeServico
                ' ', -- p_descricao
                CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
                'I', -- p_statusAtividadeServico
                SYSDATE, -- p_dataInicio
                NULL, -- p_dataTermino
                p_item_modeloDocumento,
                0, -- p_motivoEstoque
                0, -- p_quantidade
                ' ', -- p_observacoes
                /* Retornos */
                v_ativ_idAtividadeRealOrcament);
            END IF;
          END LOOP;
          IF v_ativ_sequencia = 0
            AND v_ativ_selecionaAtividadePrev = 0
          THEN
            SELECT COALESCE (MAX (validoPrevisto), 0)
            INTO v_auxNumber
            FROM PAATIVIDADESSERVICO
            WHERE atividadeServico = p_item_atividadeServico;
            IF v_auxNumber = 1 THEN
              SELECT COALESCE (MAX (c.checklist),0)
              INTO v_ativ_checklist
              FROM (
                SELECT
                  b.checklist,
                  ROW_NUMBER() OVER (
                    ORDER BY
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.atividadeServico = p_item_atividadeServico
                AND b.ativo = 1) c
              WHERE c.ordenacao = 1;
              v_ativ_sequencia := v_ativ_sequencia + 1;
              ADD_ORCAMENTO_ITEM_PREV_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadePrevOrcamento
                r_item_idItemOrcamento,
                v_ativ_sequencia,  -- p_sequencia
                p_item_atividadeServico, -- p_atividadeServico
                ' ', -- p_descricao
                v_ativ_tecnico, -- p_tecnico
                'N', -- p_faturarAtividade
                v_ativ_checklist, -- p_checklist
                'I', -- p_tipoApontamento
                0, -- p_editaQuantidades
                0, -- p_etapaAtividade
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN v_ativ_tecnico = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
                0, -- p_quantidade
                v_item_precoUnitario, -- p_precoUnitario
                ' ', -- p_observacoes
                v_ativ_idAtividadePrevOrcamen);  -- r_idAtividadePrevOrcamento
              v_ativ_criouPendenteIniciado := 1;
              IF v_ativ_checklist > 0 THEN
                ADD_ORCAMENTO_ITEM_TAREF_GERA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                  v_ativ_checklist); -- p_checklist
              END IF;
              IF v_ativ_criouPendenteIniciado = 0
                AND v_ativ_tecnico = p_sys_usuarioLogado
              THEN
                ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  0, -- p_idAtividadeRealOrcamento
                  v_ativ_idAtividadePrevOrcamen,
                  1, -- p_sequencia
                  p_item_atividadeServico, -- p_atividadeServico
                  ' ', -- p_descricao
                  v_ativ_tecnico, -- p_tecnico
                  'I', -- p_statusAtividadeServico
                  SYSDATE, -- p_dataInicio
                  NULL, -- p_dataTermino
                  p_item_modeloDocumento,
                  0, -- p_motivoEstoque
                  0, -- p_quantidade
                  ' ', -- p_observacoes
                  /* Retornos */
                  v_ativ_idAtividadeRealOrcament);
              END IF;
            END IF;
          END IF;
        END IF;
      -- Atividades Previstas Ordem Produção
      ELSIF v_cab_tipoDocumento = 202
        AND v_prod_controleEstoque = 6
      THEN
        SELECT COALESCE (MAX (a.gradeProdutoXFichaAtividade), 0)
        INTO v_ativ_gradeProdutoXFichaAtiv
        FROM (
        SELECT
          ROW_NUMBER() OVER (ORDER BY ordenacao DESC) ordenacao,
          gradeProdutoXFichaAtividade  
        FROM CAGRADEPRODUTOXFICHAATIV
        WHERE gradeProduto = p_item_gradeProduto
        AND gradeProdutoXFichaAtividade > 0
        AND ativo = 1) a
        WHERE a.ordenacao = 1;
        FOR a IN (
          SELECT
            a.gradeProdutoXFichaAtividade,
            a.atividadeServico,
            a.tipoApontamento,
            a.editaQuantidades,
            a.quantidade,
            a.observacoes,
            COALESCE ((
              SELECT MAX (b.checklist)
              FROM (
                SELECT
                  b.atividadeServico,
                  b.checklist,
                  ROW_NUMBER() OVER (
                    PARTITION BY b.atividadeServico
                    ORDER BY
                      b.atividadeServico,
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.ativo = 1) b
              WHERE b.atividadeServico = a.atividadeServico
              AND b.ordenacao = 1), 0) checklist,
            CASE ativ.gradeProduto
              WHEN 0
              THEN 0
              WHEN p_item_gradeProduto
              THEN v_item_precoUnitario
              ELSE FUNC_ADD_BUSCA_PRECO (
                p_config_64_casasDecSaidas,
                p_config_209_filtrarGrupoEcon,
                p_config_362_calcCustoPorGrade,
                p_sys_perfilUsuarioLogado,
                p_sys_usuarioLogado,
                v_cab_estabelecimento,
                SYSDATE, -- p_cab_dataPrecoFinal
                v_cab_pessoa,
                v_munEndEst_uf,
                v_munEndPess_uf,
                p_item_vendedor,
                0, -- p_item_idFormulaTinta
                0, -- p_item_personalizacao
                gradProd.produto,
                gradProd.cor,
                gradProd.tamanho,
                prod.controleEstoque,
                p_item_tipoPreco,
                p_item_tabelaPreco)
            END precoUnitario
          FROM CAGRADEPRODUTOXFICHAATIV a
          JOIN PAATIVIDADESSERVICO ativ
          ON ativ.atividadeServico = a.atividadeServico
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = ativ.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE a.gradeProduto = p_item_gradeProduto
          AND a.gradeProdutoXFichaAtividade > 0
          AND a.ativo = 1
          ORDER BY a.ordenacao)
        LOOP
          v_ativ_sequencia := v_ativ_sequencia + 1;
          ADD_ORCAMENTO_ITEM_PREV_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idAtividadePrevOrcamento
            r_item_idItemOrcamento,
            v_ativ_sequencia, -- p_sequencia
            a.atividadeServico, -- p_atividadeServico
            ' ', -- p_descricao
            0, -- p_tecnico
            'N', -- p_faturarAtividade
            a.checklist, -- p_checklist
            a.tipoApontamento, -- p_tipoApontamento
            a.editaQuantidades, -- p_editaQuantidades
            0, -- p_etapaAtividade
            CASE WHEN a.tipoApontamento = 'N' THEN 'E' WHEN v_ativ_criouPendenteIniciado = 0 THEN 'P' ELSE 'A' END, -- p_statusAtividadeServico
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataInicio
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataTermino
            a.quantidade, -- p_quantidade
            a.precoUnitario, -- p_precoUnitario
            a.observacoes, -- p_observacoes
            v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
          IF a.checklist > 0 THEN
            ADD_ORCAMENTO_ITEM_TAREF_GERA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
              a.checklist); -- p_checklist
          END IF;
          IF a.tipoApontamento = 'N' THEN
            ADD_ORCAMENTO_ITEM_REAL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadeRealOrcamento
              v_ativ_idAtividadePrevOrcamen,
              1, -- p_sequencia
              a.atividadeServico, -- p_atividadeServico
              ' ', -- p_descricao
              0, -- p_tecnico
              'E', -- p_statusAtividadeServico
              SYSDATE, -- p_dataInicio
              SYSDATE, -- p_dataTermino
              p_item_modeloDocumento,
              0, -- p_motivoEstoque
              a.quantidade, -- p_quantidade
              ' ', -- p_observacoes
              /* Retornos */
              v_ativ_idAtividadeRealOrcament);
          ELSE
            v_ativ_criouPendenteIniciado := 1;
          END IF;
          v_ativ_ordenacaoFichaProdutoPr := 0;
          IF a.gradeProdutoXFichaAtividade = v_ativ_gradeProdutoXFichaAtiv THEN
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'E', -- entradaSaida,
              p_item_localEstoque, -- p_localEstoque
              p_item_gradeProduto,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              p_item_quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE p_item_quantidade END, -- p_quantidadeSaldo
              V_observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              SELECT
                atualizaCustoMedio,
                atualizaUltimaCompra
              INTO
                v_ativ_atualizaCustoMedio,
                v_ativ_atualizaUltimaCompra
              FROM PAMODELOSDOCUMENTO
              WHERE modeloDocumento = p_item_modeloDocumento;
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                v_ativ_atualizaCustoMedio, -- p_atualizaCustoMedio
                v_ativ_atualizaUltimaCompra, -- p_atualizaUltimaCompra
                'E', -- p_entradaSaida,
                p_item_localEstoque, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                p_item_gradeProduto,
                p_item_personalizacao,
                p_item_idLoteEstoque,
                p_item_quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                v_observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
              UPDATE MOORCAMENTOXITENS
              SET quantidadeSaldo = 0
              WHERE idItemOrcamento = r_item_idItemOrcamento;
            END IF;
          END IF;
          FOR b IN (
            SELECT
              b.ordenacao,
              b.gradeProduto,
              b.quantidade,
              b.localEstoque,
              b.observacoes
            FROM CAGRADEPRODUTOXFICHAPROD b
            WHERE b.gradeProdutoXFichaAtividade = a.gradeProdutoXFichaAtividade
            AND b.id > 0
            AND b.ativo = 1
            ORDER BY b.ordenacao)
          LOOP
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'S', -- entradaSaida,
              CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
              b.gradeProduto,
              0, -- personalizacao,
              0, -- b.idLoteEstoque,
              b.quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE b.quantidade END, -- p_quantidadeSaldo
              b.observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                'S', -- p_entradaSaida,
                CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                b.gradeProduto,
                0, -- personalizacao,
                0, -- b.idLoteEstoque,
                b.quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                b.observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
            END IF;
          END LOOP;
        END LOOP;
      END IF;
      -- Se inseriu Atividades Previstas
      IF v_ativ_sequencia > 0 THEN
        SELECT
          COUNT (1) numeroAtividades,
          SUM (
            CASE
              WHEN prev.faturarAtividade = 'P'
              THEN prev.quantidade
              ELSE COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
            END) quantidade,
          MIN (prev.precoUnitario) precoUnitarioMenor,
          MAX (prev.precoUnitario) precoUnitarioMaior,
          SUM (ROUND (
            CASE
              WHEN prev.faturarAtividade = 'P'
              THEN prev.quantidade
              ELSE COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
            END * prev.precoUnitario, 2)) valorTotalItem
        INTO
          v_ativ_numero,
          v_ativ_quantidade,
          v_ativ_precoUnitarioMenor,
          v_ativ_precoUnitario,
          v_ativ_valorTotalItem
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = r_item_idItemOrcamento
        AND prev.statusAtividadeServico <> 'C'
        AND prev.faturarAtividade IN ('P','R');
        IF v_ativ_numero > 0 THEN
          v_ativ_geraFinanceiro := 1;
          IF v_ativ_numero > 1
            AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
            AND v_ativ_quantidade <> 0
          THEN
            v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
          END IF;
        ELSE
          SELECT
            COUNT (1) numeroAtividades,
            SUM (COALESCE ((
              SELECT realiz.quantidade
              FROM MOORCAMENTOXATIVIDADEREAL realiz
              WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
              AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (COALESCE ((
              SELECT realiz.quantidade
              FROM MOORCAMENTOXATIVIDADEREAL realiz
              WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
              AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          JOIN PAATIVIDADESSERVICO ativ
          ON ativ.atividadeServico = prev.atividadeServico
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = ativ.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND ativ.gradeProduto > 0
          AND prod.unidadeMedida = v_prod_unidadeMedida;
          IF v_ativ_numero > 0 THEN
            v_ativ_geraFinanceiro := 0;
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          END IF;
        END IF;
        IF v_ativ_numero > 0
          AND (v_ativ_quantidade <> p_item_quantidade
            OR v_ativ_precoUnitario <> v_item_precoUnitario
            OR v_ativ_geraFinanceiro <> v_item_geraFinanceiro)
        THEN
          ADD_ORCAMENTO_ITEM_GRAVA (
            ' ', -- p_sessaoClient
            p_sys_usuarioLogado,
            p_sys_perfilUsuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_190_modeloFrete,
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_198_obs_add_referenc,
            p_config_199_obs_add_caractA,
            p_config_200_obs_add_caractB,
            p_config_201_obs_add_caractC,
            p_config_202_obs_add_caractD,
            p_config_203_obs_add_caractE,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            p_config_413_obs_add_marca,
            p_config_418_obs_efetarEnter,
            p_config_430_sugerirUsuLogTec,
            0, -- p_manterFinanceiro_Retotalizar,
            'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
            0, -- p_buscarGeraFinanceiroEstoque,
            ' ', -- p_tipoDocumentoReferenciado, 
            0, -- p_idItemReferenciado,
            0, -- p_quantidadeReferenciada
            ' ', -- p_tempComp_nomeTempComposicao,
            0, -- p_tempComp_sequencia
            ' ', -- p_mensagemAviso,
            r_calcularImpostos,
            r_item_idItemOrcamento,
            p_item_orcamento,
            p_item_pedidoCompraFornecedor,
            p_item_sequenciaPedidoCompraFo,
            p_item_ambiente,
            p_item_ambienteObservacoes,
            p_item_vinculoItemDocumento,
            p_item_atividadeServico,
            p_item_statusAtividadeServico,
            p_item_controleEntrega,
            p_item_dataEntrega,
            p_item_modeloDocumento,
            p_item_estabelecimentoOriginal,
            p_item_vendedor,
            p_item_gradeProduto,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            0, -- p_item_idNumeroSerie
            0, -- p_item_atividadeProjeto,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_controleQuantidade,
            p_item_unidadeMedidaConversao,
            p_item_conversorQuantidade,
            p_item_loteMinimo,
            p_item_loteMultiplo,
            p_item_altura,
            p_item_largura,
            p_item_comprimento,
            ROUND (CASE p_item_controleQuantidade
              WHEN 2
              THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
              WHEN 3
              THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
              WHEN 4
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE v_ativ_quantidade / p_item_conversorQuantidade END
              ELSE 0
            END, 3), -- p_item_pecas
            v_ativ_quantidade,
            ROUND (CASE p_item_controleQuantidade
              WHEN 2
              THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
              WHEN 3
              THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
              WHEN 4
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade / p_item_conversorQuantidade END
              WHEN 5
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade * p_item_conversorQuantidade END
              ELSE v_ativ_quantidade
            END, 6), -- p_item_quantidadeConvertida
            ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
            ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
            p_item_tipoPreco,
            p_item_tabelaPreco,
            p_item_precoSugestaoAPrazo,
            p_item_precoSugestaoAVista,
            p_item_precoDesconto,
            p_item_precoMinimo,
            p_item_usarPrecoAVista,
            v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
            p_item_acrescimoUnitarioCompos,
            v_ativ_precoUnitario, -- p_item_precoUnitario
            p_item_percDescontoItem,
            p_item_valorDescontoItem,
            p_item_percAcrescimoItem,
            p_item_valorAcrescimoItem,
            p_item_valorFreteItem,
            p_item_valorSeguroItem,
            p_item_valorAdicFreteMarItem,
            p_item_valorDespesasAduanItem,
            p_item_observacoesDigitadas,
            v_item_valorFreteGeral,
            p_item_valorSeguroGeral,
            v_item_valorDescontoGeral,
            p_item_valorOutrasDespesasGer,
            p_item_valorAdicFreteMarGeral,
            p_item_valorDespesasAduanGeral,
            v_item_valorDescontoPagamento,
            v_item_valorOutrasDespPagament,
            v_item_valorJurosPagamento,
            p_item_operacaoFiscal,
            v_item_movimentaEstoque,
            v_ativ_geraFinanceiro,
            0, -- p_item_cfop
            ' ', -- p_item_indicadorISSQN
            0, -- p_item_aliquotaISSQN
            0, -- p_item_retidoISSQN
            0, -- p_item_tributadoForaMunicipio
            0, -- p_item_incentivoFiscal
            0, -- p_item_listaServicos
            0, -- p_item_cnae
            0, -- p_item_idServicoMunicipio
            ' ', -- p_item_numeroProcessoAdministr
            0, -- p_item_retencaoIRRF
            0, -- p_item_retencaoINSS
            0, -- p_item_retencaoPIS
            0, -- p_item_retencaoCOFINS
            0, -- p_item_retencaoCSLL
            0, -- p_item_retencaoOutros
            0, -- p_item_aliquotaII
            0, -- p_item_aliquotaIOF
            0, -- p_item_codigoEnquadramentoIPI
            0, -- p_item_stIPI
            0, -- p_item_aliquotaIPI
            0, -- p_item_valorAliquotaIPI
            ' ', -- p_item_stPIS
            0, -- p_item_aliquotaPIS
            0, -- p_item_valorAliquotaPIS
            0, -- p_item_aliquotaPISST
            0, -- p_item_valorAliquotaPISST
            ' ', -- p_item_stCOFINS
            0, -- p_item_aliquotaCOFINS
            0, -- p_item_valorAliquotaCOFINS
            0, -- p_item_aliquotaCOFINSST
            0, -- p_item_valorAliquotaCOFINSST
            '   ', -- p_item_stSimplesNacional
            0, -- p_item_creditoSimplesNacional
            '  ', -- p_item_stICMS
            0, -- p_item_modalBaseCalcICMS
            0, -- p_item_reducaoBaseICMS
            0, -- p_item_aliquotaICMS
            0, -- p_item_diferimentoICMS
            ' ', -- p_item_motivoDesoneracaoICMS
            0, -- p_item_idBeneficio
            ' ', -- p_item_modalBaseCalcICMSST
            0, -- p_item_margemValorAdicionadoST
            0, -- p_item_reducaoBaseST
            0, -- p_item_aliquotaICMSST
            0, -- p_item_aliquotaSTSuportConsFin
            0, -- p_item_reducaoBaseICMSEfetivo
            0, -- p_item_aliquotaICMSEfetivo
            0, -- p_item_aliquotaICMSUFDestinat
            0, -- p_item_aliquotaICMSInterestad
            0, -- p_item_partilhaICMSInterestad
            0, -- p_item_aliquotaFCP
            0, -- p_item_aliquotaFCPST
            0, -- p_item_aliquotaFCPSTAnteriorm
            0, -- p_item_aliquotaFCPUFDestinat
            0, -- p_item_aliquotaEstImpFederais
            0, -- p_item_aliquotaEstImpEstaduais
            0, -- p_item_aliquotaEstImpMunicipai
            0, -- p_item_baseISSQN
            0, -- p_item_valorISSQN
            0, -- p_item_baseRetIRRF
            0, -- p_item_valorRetIRRF
            0, -- p_item_baseRetINSS
            0, -- p_item_valorRetINSS
            0, -- p_item_baseRetPIS
            0, -- p_item_valorRetPIS
            0, -- p_item_baseRetCOFINS
            0, -- p_item_valorRetCOFINS
            0, -- p_item_baseRetCSLL
            0, -- p_item_valorRetCSLL
            0, -- p_item_baseRetOutros
            0, -- p_item_valorRetOutros
            0, -- p_item_baseII
            0, -- p_item_valorII
            0, -- p_item_baseIOF
            0, -- p_item_valorIOF
            0, -- p_item_baseIPI
            0, -- p_item_valorIPI
            0, -- p_item_basePIS
            0, -- p_item_valorPIS
            0, -- p_item_basePISST
            0, -- p_item_valorPISST
            0, -- p_item_baseCOFINS
            0, -- p_item_valorCOFINS
            0, -- p_item_baseCOFINSST
            0, -- p_item_valorCOFINSST
            0, -- p_item_baseCreditoSimplesNac
            0, -- p_item_valorCreditoSimplesNac
            0, -- p_item_baseICMS
            0, -- p_item_valorICMSOperacao
            0, -- p_item_valorICMSDiferido
            0, -- p_item_valorICMS
            0, -- p_item_valorICMSDesoneracao
            0, -- p_item_baseICMSST
            0, -- p_item_valorICMSST
            0, -- p_item_baseICMSSTAnteriormente
            0, -- p_item_valorICMSSTAnteriorment
            0, -- p_item_valorICMSProprioSubstit
            0, -- p_item_baseICMSEfetivo
            0, -- p_item_valorICMSEfetivo
            0, -- p_item_baseICMSUFDestinatario
            0, -- p_item_valorICMSUFDestinatario
            0, -- p_item_baseICMSUFRemetente
            0, -- p_item_valorICMSUFRemetente
            0, -- p_item_baseFCP
            0, -- p_item_valorFCP
            0, -- p_item_baseFCPST
            0, -- p_item_valorFCPST
            0, -- p_item_baseFCPSTAnteriormente
            0, -- p_item_valorFCPSTAnteriormente
            0, -- p_item_baseFCPUFDestinatario
            0, -- p_item_valorFCPUFDestinatario
            0, -- p_item_baseEstimadaImpostos
            0, -- p_item_valorEstImpFederais
            0, -- p_item_valorEstImpEstaduais
            0, -- p_item_valorEstImpMunicipais
            ' ', -- p_idAtividadesPrevistasSelec
            0, -- p_nivel,
            ' ',
            v_auxVarchar, -- r_mensagemAviso
            r_calcularImpostos,
            v_auxNumber, -- idItemOrcamento
            v_auxVarchar, -- r_buffer_idItemOrcamento
            v_auxNumber); -- r_valorInserido
        END IF;
        ADD_ORCAMENTO_ITEM_STATUS_CALC (r_item_idItemOrcamento);
      END IF;
    END IF;
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      r_item_idItemOrcamento,
      '',
      '',
      v_auxVarchar,
      v_auxVarchar);
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_nivel                        IN NUMBER,
  p_buffer_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_statusPreDocumento       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_valorISSQN               NUMBER;
  v_ini_valorRetIRRF             NUMBER;
  v_ini_valorRetINSS             NUMBER;
  v_ini_valorRetPIS              NUMBER;
  v_ini_valorRetCOFINS           NUMBER;
  v_ini_valorRetCSLL             NUMBER;
  v_ini_valorRetOutros           NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_residuoISSQN            NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_residuoRetIRRF          NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_residuoRetINSS          NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_residuoRetPIS           NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_residuoRetCOFINS        NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_residuoRetCSLL          NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_residuoRetOutros        NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemPreDocumento    NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_statusPreDocumento,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.preDocumento = p_item_preDocumento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_valorISSQN               := 0;
  v_ini_valorRetIRRF             := 0;
  v_ini_valorRetINSS             := 0;
  v_ini_valorRetPIS              := 0;
  v_ini_valorRetCOFINS           := 0;
  v_ini_valorRetCSLL             := 0;
  v_ini_valorRetOutros           := 0;
  v_item_quantidadeDevolvidaRet  := 0;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_residuoISSQN            := 0;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_residuoRetIRRF          := 0;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_residuoRetINSS          := 0;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_residuoRetPIS           := 0;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_residuoRetCOFINS        := 0;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_residuoRetCSLL          := 0;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_residuoRetOutros        := 0;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_valorISSQN := a.valorISSQN;
      v_ini_valorRetIRRF := a.valorRetIRRF;
      v_ini_valorRetINSS := a.valorRetINSS;
      v_ini_valorRetPIS := a.valorRetPIS;
      v_ini_valorRetCOFINS := a.valorRetCOFINS;
      v_ini_valorRetCSLL := a.valorRetCSLL;
      v_ini_valorRetOutros := a.valorRetOutros;
      v_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_geraFinanceiro          := a.geraFinanceiro;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> p_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_PRE_DOC_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_227_manterPessoaOrcam,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND(a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemPreDocumento IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemPreDocumento)) >= 14
      LOOP
        v_ajuste_idItemPreDocumento := TO_NUMBER(SUBSTR(r_buffer_idItemPreDocumento,1,14));
        r_buffer_idItemPreDocumento := RTRIM(SUBSTR(r_buffer_idItemPreDocumento,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MOPREDOCUMXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemPreDocumento = v_ajuste_idItemPreDocumento;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MOPREDOCUMXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemPreDocumento = v_ajuste_idItemPreDocumento;
      END LOOP;
      UPDATE MOPREDOCUMENTOS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE preDocumento       = p_item_preDocumento;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 0)
        THEN
          r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        p_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        0, -- p_cab_vendaConsumidor
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        0, -- p_movimentaEstoqueFiscal
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_auxNumber, -- r_movimentaEstoqueFiscal
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar, -- r_item_stICMSEscrit
        v_auxNumber, -- r_item_reducaoBaseICMSEscrit
        v_auxNumber, -- r_item_aliquotaICMSEscrit
        v_auxNumber, -- r_item_diferimentoICMSEscritur
        v_auxNumber, -- r_item_margemValorAdicSTEscrit
        v_auxNumber, -- r_item_reducaoBaseSTEscrit
        v_auxNumber, -- r_item_aliquotaICMSSTEscrit
        v_auxNumber, -- r_item_somarICMSST
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        v_item_residuoISSQN,
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        v_item_residuoRetIRRF,
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        v_item_residuoRetINSS,
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        v_item_residuoRetPIS,
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        v_item_residuoRetCOFINS,
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        v_item_residuoRetCSLL,
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        v_item_residuoRetOutros,
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        p_item_valorIPIDevolucao,
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        0, -- p_calcularICMSEscrituracao
        '  ', -- p_stICMSEscrituracao
        0, -- p_reducaoBaseICMSEscrituracao
        0, -- p_aliquotaICMSEscrituracao
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        0, -- p_calcularICMSSTEscrituracao
        0, -- p_margemValorAdicSTEscriturac
        0, -- p_reducaoBaseSTEscrituracao
        0, -- p_aliquotaICMSSTEscrituracao
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_residuoISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_residuoRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_residuoRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_residuoRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_residuoRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_residuoRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_residuoRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber, -- r_baseICMSEscrituracao
        v_auxNumber, -- r_valorICMSEscrituracao
        v_auxNumber, -- r_valorICMSDesonEscrituracao
        v_auxNumber, -- r_baseICMSSTEscrituracao
        v_auxNumber, -- r_valorICMSSTEscrituracao
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    IF v_item_valorISSQN <> v_ini_valorISSQN
      OR v_item_valorRetIRRF <> v_ini_valorRetIRRF
      OR v_item_valorRetINSS <> v_ini_valorRetINSS
      OR v_item_valorRetPIS <> v_ini_valorRetPIS
      OR v_item_valorRetCOFINS <> v_ini_valorRetCOFINS
      OR v_item_valorRetCSLL <> v_ini_valorRetCSLL
      OR v_item_valorRetOutros <> v_ini_valorRetOutros
    THEN
      r_calcularImpostos := 1;
    END IF;
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      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,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    ADD_DOC_ATUALIZA_RESERVAS (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      v_cab_devolucaoAnulacaoRetorno,
      r_item_idItemPreDocumento,
      0); -- p_idItemDocFiscal
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'P',
      r_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MOPREDOCUMXITENS
    SET observacoes = v_observacoes
    WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_ESTOQUE_PRE_DOC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_nivel                        IN NUMBER,
  p_buffer_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_valorISSQN               NUMBER;
  v_ini_valorRetIRRF             NUMBER;
  v_ini_valorRetINSS             NUMBER;
  v_ini_valorRetPIS              NUMBER;
  v_ini_valorRetCOFINS           NUMBER;
  v_ini_valorRetCSLL             NUMBER;
  v_ini_valorRetOutros           NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_movimentaEstoqueFiscal  NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_residuoISSQN            NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_residuoRetIRRF          NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_residuoRetINSS          NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_residuoRetPIS           NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_residuoRetCOFINS        NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_residuoRetCSLL          NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_residuoRetOutros        NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemDocFiscal       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_valorISSQN               := 0;
  v_ini_valorRetIRRF             := 0;
  v_ini_valorRetINSS             := 0;
  v_ini_valorRetPIS              := 0;
  v_ini_valorRetCOFINS           := 0;
  v_ini_valorRetCSLL             := 0;
  v_ini_valorRetOutros           := 0;
  v_item_quantidadeDevolvidaRet  := 0;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_residuoISSQN            := 0;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_residuoRetIRRF          := 0;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_residuoRetINSS          := 0;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_residuoRetPIS           := 0;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_residuoRetCOFINS        := 0;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_residuoRetCSLL          := 0;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_residuoRetOutros        := 0;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_valorISSQN := a.valorISSQN;
      v_ini_valorRetIRRF := a.valorRetIRRF;
      v_ini_valorRetINSS := a.valorRetINSS;
      v_ini_valorRetPIS := a.valorRetPIS;
      v_ini_valorRetCOFINS := a.valorRetCOFINS;
      v_ini_valorRetCSLL := a.valorRetCSLL;
      v_ini_valorRetOutros := a.valorRetOutros;
      v_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        v_item_geraFinanceiro          := a.geraFinanceiro;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> p_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
        AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_DOC_FISC_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_138_etapOrcEmProcesso,
        p_person_139_etapOrcLiberado,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado,
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND(a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemDocFiscal IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemDocFiscal)) >= 14
      LOOP
        v_ajuste_idItemDocFiscal := TO_NUMBER(SUBSTR(r_buffer_idItemDocFiscal,1,14));
        r_buffer_idItemDocFiscal := RTRIM(SUBSTR(r_buffer_idItemDocFiscal,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MODOCFISCALXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemDocFiscal = v_ajuste_idItemDocFiscal;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MODOCFISCALXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemDocFiscal = v_ajuste_idItemDocFiscal;
      END LOOP;
      UPDATE MODOCUMENTOSFISCAIS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE idDocumentoFiscal  = p_item_idDocumentoFiscal;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND ( v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 0)
        THEN
          r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        p_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_cab_vendaConsumidor,
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        1, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_item_movimentaEstoqueFiscal,
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_item_somarICMSST,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        v_item_residuoISSQN,
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        v_item_residuoRetIRRF,
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        v_item_residuoRetINSS,
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        v_item_residuoRetPIS,
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        v_item_residuoRetCOFINS,
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        v_item_residuoRetCSLL,
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        v_item_residuoRetOutros,
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        p_item_valorIPIDevolucao,
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_residuoISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_residuoRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_residuoRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_residuoRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_residuoRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_residuoRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_residuoRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    IF v_item_valorISSQN <> v_ini_valorISSQN
      OR v_item_valorRetIRRF <> v_ini_valorRetIRRF
      OR v_item_valorRetINSS <> v_ini_valorRetINSS
      OR v_item_valorRetPIS <> v_ini_valorRetPIS
      OR v_item_valorRetCOFINS <> v_ini_valorRetCOFINS
      OR v_item_valorRetCSLL <> v_ini_valorRetCSLL
      OR v_item_valorRetOutros <> v_ini_valorRetOutros
    THEN
      r_calcularImpostos := 1;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      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,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_138_etapOrcEmProcesso,
          p_person_139_etapOrcLiberado,
          p_person_190_modeloFrete,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_sys_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    ELSE
    ADD_DOC_ATUALIZA_RESERVAS (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      v_cab_devolucaoAnulacaoRetorno,
      0, -- p_idItemPreDocumento
      r_item_idItemDocFiscal);
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'D',
      r_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MODOCFISCALXITENS
    SET observacoes = v_observacoes
    WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_ESTOQUE_DOC_FISC_ITEM (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        '',
        '',
        v_auxVarchar,
        v_auxVarchar);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_ativ_geraFinanceiro     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    v_ativ_geraFinanceiro := 1;
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
        MIN (prev.precoUnitario) precoUnitarioMenor,
        MAX (prev.precoUnitario) precoUnitarioMaior,
        SUM (ROUND (COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
    INTO
      v_ativ_numero,
      v_ativ_quantidade,
      v_ativ_precoUnitarioMenor,
      v_ativ_precoUnitario,
      v_ativ_valorTotalItem
    FROM MOORCAMENTOXATIVIDADEPREV prev
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = p_idItemOrcamento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = prev.atividadeServico
    JOIN CAGRADESPRODUTO gradProdAtiv
    ON gradProdAtiv.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prodAtiv
    ON prodAtiv.produto = gradProdAtiv.produto
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C'
    AND ativ.gradeProduto > 0
    AND prodAtiv.unidadeMedida = prod.unidadeMedida;
    IF v_ativ_numero > 0 THEN
      v_ativ_geraFinanceiro := 0;
      IF v_ativ_numero > 1
        AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
        AND v_ativ_quantidade <> 0
      THEN
        v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
      END IF;
    END IF;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
        OR v_ativ_geraFinanceiro <> a.geraFinanceiro
      THEN
        ADD_ORCAMENTO_ITEM_GRAVA (
          ' ', -- p_sessaoClient
          p_usuarioLogado,
          p_perfilUsuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_64_casasDecSaidas,
          p_config_65_casasDecEntrada,
          p_config_198_obs_add_referenc,
          p_config_199_obs_add_caractA,
          p_config_200_obs_add_caractB,
          p_config_201_obs_add_caractC,
          p_config_202_obs_add_caractD,
          p_config_203_obs_add_caractE,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_378_calcularVolumes,
          p_config_413_obs_add_marca,
          p_config_418_obs_efetarEnter,
          p_config_430_sugerirUsuLogTec,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          v_ativ_geraFinanceiro,
          0, -- p_item_cfop
          ' ', -- p_item_indicadorISSQN
          0, -- p_item_aliquotaISSQN
          0, -- p_item_retidoISSQN
          0, -- p_item_tributadoForaMunicipio
          0, -- p_item_incentivoFiscal
          0, -- p_item_listaServicos
          0, -- p_item_cnae
          0, -- p_item_idServicoMunicipio
          ' ', -- p_item_numeroProcessoAdministr
          0, -- p_item_retencaoIRRF
          0, -- p_item_retencaoINSS
          0, -- p_item_retencaoPIS
          0, -- p_item_retencaoCOFINS
          0, -- p_item_retencaoCSLL
          0, -- p_item_retencaoOutros
          0, -- p_item_aliquotaII
          0, -- p_item_aliquotaIOF
          0, -- p_item_codigoEnquadramentoIPI
          0, -- p_item_stIPI
          0, -- p_item_aliquotaIPI
          0, -- p_item_valorAliquotaIPI
          ' ', -- p_item_stPIS
          0, -- p_item_aliquotaPIS
          0, -- p_item_valorAliquotaPIS
          0, -- p_item_aliquotaPISST
          0, -- p_item_valorAliquotaPISST
          ' ', -- p_item_stCOFINS
          0, -- p_item_aliquotaCOFINS
          0, -- p_item_valorAliquotaCOFINS
          0, -- p_item_aliquotaCOFINSST
          0, -- p_item_valorAliquotaCOFINSST
          '   ', -- p_item_stSimplesNacional
          0, -- p_item_creditoSimplesNacional
          '  ', -- p_item_stICMS
          0, -- p_item_modalBaseCalcICMS
          0, -- p_item_reducaoBaseICMS
          0, -- p_item_aliquotaICMS
          0, -- p_item_diferimentoICMS
          ' ', -- p_item_motivoDesoneracaoICMS
          0, -- p_item_idBeneficio
          ' ', -- p_item_modalBaseCalcICMSST
          0, -- p_item_margemValorAdicionadoST
          0, -- p_item_reducaoBaseST
          0, -- p_item_aliquotaICMSST
          0, -- p_item_aliquotaSTSuportConsFin
          0, -- p_item_reducaoBaseICMSEfetivo
          0, -- p_item_aliquotaICMSEfetivo
          0, -- p_item_aliquotaICMSUFDestinat
          0, -- p_item_aliquotaICMSInterestad
          0, -- p_item_partilhaICMSInterestad
          0, -- p_item_aliquotaFCP
          0, -- p_item_aliquotaFCPST
          0, -- p_item_aliquotaFCPSTAnteriorm
          0, -- p_item_aliquotaFCPUFDestinat
          0, -- p_item_aliquotaEstImpFederais
          0, -- p_item_aliquotaEstImpEstaduais
          0, -- p_item_aliquotaEstImpMunicipai
          0, -- p_item_baseISSQN
          0, -- p_item_valorISSQN
          0, -- p_item_baseRetIRRF
          0, -- p_item_valorRetIRRF
          0, -- p_item_baseRetINSS
          0, -- p_item_valorRetINSS
          0, -- p_item_baseRetPIS
          0, -- p_item_valorRetPIS
          0, -- p_item_baseRetCOFINS
          0, -- p_item_valorRetCOFINS
          0, -- p_item_baseRetCSLL
          0, -- p_item_valorRetCSLL
          0, -- p_item_baseRetOutros
          0, -- p_item_valorRetOutros
          0, -- p_item_baseII
          0, -- p_item_valorII
          0, -- p_item_baseIOF
          0, -- p_item_valorIOF
          0, -- p_item_baseIPI
          0, -- p_item_valorIPI
          0, -- p_item_basePIS
          0, -- p_item_valorPIS
          0, -- p_item_basePISST
          0, -- p_item_valorPISST
          0, -- p_item_baseCOFINS
          0, -- p_item_valorCOFINS
          0, -- p_item_baseCOFINSST
          0, -- p_item_valorCOFINSST
          0, -- p_item_baseCreditoSimplesNac
          0, -- p_item_valorCreditoSimplesNac
          0, -- p_item_baseICMS
          0, -- p_item_valorICMSOperacao
          0, -- p_item_valorICMSDiferido
          0, -- p_item_valorICMS
          0, -- p_item_valorICMSDesoneracao
          0, -- p_item_baseICMSST
          0, -- p_item_valorICMSST
          0, -- p_item_baseICMSSTAnteriormente
          0, -- p_item_valorICMSSTAnteriorment
          0, -- p_item_valorICMSProprioSubstit
          0, -- p_item_baseICMSEfetivo
          0, -- p_item_valorICMSEfetivo
          0, -- p_item_baseICMSUFDestinatario
          0, -- p_item_valorICMSUFDestinatario
          0, -- p_item_baseICMSUFRemetente
          0, -- p_item_valorICMSUFRemetente
          0, -- p_item_baseFCP
          0, -- p_item_valorFCP
          0, -- p_item_baseFCPST
          0, -- p_item_valorFCPST
          0, -- p_item_baseFCPSTAnteriormente
          0, -- p_item_valorFCPSTAnteriormente
          0, -- p_item_baseFCPUFDestinatario
          0, -- p_item_valorFCPUFDestinatario
          0, -- p_item_baseEstimadaImpostos
          0, -- p_item_valorEstImpFederais
          0, -- p_item_valorEstImpEstaduais
          0, -- p_item_valorEstImpMunicipais
          ' ', -- p_idAtividadesPrevistasSelec
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber); -- r_valorInserido
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALCULA_IMPOSTOS (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            0, -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;



/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_real_idAtividadeRealOrcament IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
  v_bufferIdEstoque        VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  FOR a IN (
    SELECT
      idAtividadePrevOrcamento,
      idItemOrcamento,
      tecnico,
      faturarAtividade
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament)
  LOOP
  IF p_previsto_realizado = 'P' THEN
    ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
      a.idAtividadePrevOrcamento,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque);
  ELSE
    ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
      p_real_idAtividadeRealOrcament,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      a.idAtividadePrevOrcamento);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    a.idAtividadePrevOrcamento,
    a.idItemOrcamento,
    a.tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    a.idItemOrcamento);
  IF a.faturarAtividade <> 'N' THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      a.idItemOrcamento);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_ATIV_EXCLUI;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_registrosRealizado           OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  IF p_previsto_realizado = 'R' THEN
    r_registrosRealizado := CASE WHEN p_real_idAtividadeRealOrcament = 0 THEN 0 ELSE 1 END;
  ELSIF r_prev_idAtividadePrevOrcament = 0 THEN
    r_registrosRealizado := 0;
  ELSE
    SELECT COALESCE (SUM (1), 0)
    INTO r_registrosRealizado
    FROM MOORCAMENTOXATIVIDADEREAL real
    WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF r_registrosRealizado < 2
    AND (p_previsto_realizado = 'R'
      OR p_real_idAtividadeRealOrcament > 0
      OR p_prev_statusAtividadeServico IN ('C','E','I'))
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0 THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    IF p_real_idAtividadeRealOrcament = 0 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico = 'E'
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico <> 'E')
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_quantidadeFabricada > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        r_registrosRealizado := r_registrosRealizado + 1;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealOrcament);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealOrcament,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        r_real_idAtividadeRealOrcament := 0;
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        p_real_dataTermino, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        p_real_modeloDocumento,
        p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        r_real_idAtividadeRealOrcament);
        r_real_idAtividadeRealOrcament := 0;
      v_atualizarStatusPrevisto := 1;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF i_prev_faturarAtividade <> p_prev_faturarAtividade
    OR i_prev_precoUnitario <> p_prev_precoUnitario
    OR i_prev_statusAtividadeServico = 'C'
    AND p_prev_statusAtividadeServico <> 'C'
    OR i_prev_statusAtividadeServico <> 'C'
    AND p_prev_statusAtividadeServico = 'C'
    OR p_prev_faturarAtividade = 'R'
    AND r_registrosRealizado < 2
    AND (p_previsto_realizado='R'
      AND (i_real_statusAtividadeServico = 'C'
        AND p_real_statusAtividadeServico <> 'C'
        OR i_real_statusAtividadeServico <> 'C'
        AND p_real_statusAtividadeServico = 'C')
      OR i_real_quantidade <> p_real_quantidade)
    OR p_prev_faturarAtividade <> 'R'
    AND i_prev_quantidade <> p_prev_quantidade
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_138_etapOrcEmProcesso IN NUMBER,
  p_person_139_etapOrcLiberado   IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_cancelando_Excluindo_Outros  IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := ' ';
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      a.orcamento,
      a.gradeProduto,
      a.cancelado,
      a.usarPrecoAVista,
      a.geraFinanceiro,
      a.controleQuantidade,
      a.loteMultiplo,
      a.quantidade,
      a.quantidadeConvertida,
      a.controleEntrega,
      a.pesoLiquido,
      a.pesoBruto,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorLiquidoItem,
      prod.tipoProduto,
      contrEntr.habilitaFrete,
      modDoc.somaFreteSeguroPrUnit
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = a.controleEntrega
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idItemOrcamento = p_item_idItemOrcamento)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.estabelecimento,
      cab.pessoa,
      cab.enderecoEntregaPessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.transportadora,
      cab.enderecoTransportadora,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem
    INTO
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_estabelecimento,
      v_cab_pessoa,
      v_cab_enderecoEntregaPessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_transportadora,
      v_cab_enderecoTransportadora,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem
    FROM MOORCAMENTOS cab
    WHERE cab.orcamento = a.orcamento;
    v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
    v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOORCAMENTOXPROMOCOES
      WHERE orcamento = a.orcamento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      IF a.controleEntrega <> 0
        AND a.habilitaFrete <> 0
        AND a.cancelado = 0
        AND a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem <> 0
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0,
          r_calcularImpostos,
          a.orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit,
          p_item_idItemOrcamento,
          0, -- p_item_pesoLiquido,
          0, -- p_item_pesoBruto,
          0, -- p_item_valorProdutoServicoBrut,
          0, -- p_item_valorDescontoItem,
          0, -- p_item_valorAcrescimoItem,
          0, -- p_item_controleEntrega,
          0, -- p_item_valorFreteGeral,
          0, -- p_contrEntr_habilitaFrete,
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_cab_valorFreteGeral,
          v_auxNumber);
      ELSE
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          a.somaFreteSeguroPrUnit);
      END IF;
      UPDATE MOORCAMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        transportadora                = v_cab_transportadora,
        enderecoTransportadora        = v_cab_enderecoTransportadora,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem
      WHERE orcamento = a.orcamento;
    END IF;
    FOR b IN (
      SELECT
        id,
        idItemOrcamentoReferenc,
        quantidade
      FROM MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      IF v_cab_tipoDocumento = 103 THEN
        UPDATE MOORCAMENTOXITENS c
        SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
        WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc;
      ELSIF v_cab_tipoDocumento = 201
        AND p_person_138_etapOrcEmProcesso <> 0
        AND p_person_139_etapOrcLiberado <> 0
        AND p_person_138_etapOrcEmProcesso <> p_person_139_etapOrcLiberado
      THEN
        FOR c IN (
          SELECT c.orcamento
          FROM MOORCAMENTOXITENS c
          JOIN MOORCAMENTOS d
          ON d.orcamento = c.orcamento
          WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc
          AND c.cancelado = 0
          AND d.tipoDocumento = 101
          AND d.etapaOrcamento = p_person_138_etapOrcEmProcesso
          GROUP BY c.orcamento)
        LOOP
          UPDATE MOORCAMENTOS d
          SET d.etapaOrcamento = p_person_139_etapOrcLiberado
          WHERE d.orcamento = c.orcamento;
          ADD_ORCAMENTO_CAB_ETAPA_CRIA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.orcamento,
            p_sys_usuarioLogado,
            p_person_139_etapOrcLiberado,
            ' ');
          ADD_RESERVA_ESTOQUE_ORC_CAB (
            p_sys_estabelecimentoAtivo, 
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.orcamento);
        END LOOP;
      END IF;
      DELETE MOORCAMENTOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- Cancela / Exclui Transferências vinculadas.
    IF p_cancelando_Excluindo_Outros <> 'O' THEN
      FOR b IN (
        SELECT
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND (docXTransf2.entradaSaidaOriginal <> docXTransf.entradaSaidaOriginal
            OR docXTransf2.idItemOrcamento <> docXTransf.idItemOrcamento))
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOS docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia)
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXPREDOCUM docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXDOCFISCAL docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
          AND docXTransf2.entradaSaidaOriginal <> 'O')
        GROUP BY
          itemTransf.documentoTransferencia,
          docXTransf.entradaSaidaOriginal)
      LOOP
        IF b.entradaSaidaOriginal = 'O' THEN
          ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
        ELSIF p_cancelando_Excluindo_Outros = 'C' THEN
          ADD_DOCTRANSF_CAB_SIT_GRAVA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            b.documentoTransferencia,
            'C',
            0,
            'Cancelamento Automático',
            'ADD_ORCAMENTO_ITEM_EXCLUI');
        END IF;
      END LOOP;
      FOR b IN (
        SELECT
          docXTransf.idItemDocTransferencia,
          cabTransf.situacaoDocTransferencia
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
        ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND docXTransf.entradaSaidaOriginal = 'O')
      LOOP
        ADD_DOCTRANSF_ITEM_EXCLUI (
          b.idItemDocTransferencia,
          'C', -- p_cancela_Exclui_Reabre
          b.situacaoDocTransferencia,
          0, -- p_cab_quantidadeConvertida,
          0, -- p_cab_valorProdutoServico,
          /* Retornos */
          v_auxNumber, -- r_cab_quantidadeConvertida
          v_auxNumber); -- r_cab_valorProdutoServico
      END LOOP;
    END IF;
    -- Desvincula Painel de Compras
    FOR b IN (
      SELECT
        b.idGradePainelCompra,
        b.idItemPainelCompra,
        c.painelCompra
      FROM MOPAINELCOMPRAXGRADE b
      JOIN MOPAINELCOMPRAXITENS c
      ON c.idItemPainelCompra = b.idItemPainelCompra
      WHERE b.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOPAINELCOMPRAXGRADE c
      SET c.idItemOrcamento = 0
      WHERE c.idGradePainelCompra = b.idGradePainelCompra;
      UPDATE MOPAINELCOMPRAXITENS c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.idItemPainelCompra = b.idItemPainelCompra
      AND c.situacaoPainelCompras <> 'E';
      UPDATE MOPAINEISCOMPRA c
      SET c.situacaoPainelCompras = 'E'
      WHERE c.painelCompra = b.painelCompra
      AND c.situacaoPainelCompras <> 'E';
    END LOOP;
    ADD_MOTIVO_ORCAMENTO_ITE_EXCL (
      p_item_idItemOrcamento,
      0,
      v_auxNumber);
    ADD_RESERVA_ESTOQUE_ORC_EXCLUI (
      p_item_idItemOrcamento,
      '',
      v_auxVarchar);
    ADD_ORCAMENTO_ITEM_LISTA_EXCL (p_item_idItemOrcamento);
    DELETE MOORCAMENTOXPROMOCOES
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    DELETE MOINGRESSOS
    WHERE idItemOrcamento = p_item_idItemOrcamento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXORCAMENTO docXDoc
      WHERE docXDoc.idItemOrcamento = p_item_idItemOrcamento
      AND docXDoc.idItemOrcamentoReferenc = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemOrcamento = p_item_idItemOrcamento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    IF p_cancelando_Excluindo_Outros = 'C' THEN
      ADD_ORCAMENTO_ITEM_PREV_CANC (p_item_idItemOrcamento);
      FOR a IN (
        SELECT
          entrega,
          quantidade
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_SITUACAO_TROCA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_item_idItemOrcamento,
          a.entrega,
          a.quantidade,
          8,
          'ADD_ORCAMENTO_ITEM_EXCLUI - CANCELA');
      END LOOP;
      UPDATE MOORCAMENTOXITENS
      SET cancelado = 1
      WHERE idItemOrcamento = p_item_idItemOrcamento;
    ELSE
      DELETE MOORCAMENTOXCOMPOSICOESPR
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXNUMEROSSERIE
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXEMBALAGENSTIN
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXCENTROSCUSTOS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXATIVIDADEPROJ
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamentoReferenc = p_item_idItemOrcamento;     
      DELETE MOPREDOCUMXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCFISCALXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT idAtividadePrevOrcamento
        FROM MOORCAMENTOXATIVIDADEPREV
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
          b.idAtividadePrevOrcamento,
          '',
          '',
          v_auxVarchar,
          v_auxVarchar);
      END LOOP;
      DELETE MODISTRIBUICAODFEXORCAM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MODOCTRANSFXORCAMENTOITEM
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      DELETE MOENTREGAXSITUACOES
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      FOR b IN (
        SELECT entrega
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_item_idItemOrcamento)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          b.entrega,
          CASE WHEN p_cancelando_Excluindo_Outros = 'C' THEN 0 ELSE 1 END,
          'ADD_ORCAMENTO_ITEM_EXCLUI');
      END LOOP;
      DELETE MOORCAMENTOXITENS
      WHERE idItemOrcamento = p_item_idItemOrcamento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemOrcamento
          FROM MOORCAMENTOXITENS b
          WHERE b.orcamento = a.orcamento
          AND b.idItemOrcamento <> p_item_idItemOrcamento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOORCAMENTOXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemOrcamento = b.idItemOrcamento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento))
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_PRE_DOC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MOPREDOCUMXATENDIMENTO
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MOPREDOCUMXATENDIMENTO c WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXPREDOCUM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXDOCFISCAL docXDoc
      WHERE docXDoc.idItemPreDocumento > 0
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento > 0
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorISSQN,
      item.valorRetIRRF,
      item.valorRetINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorRetOutros,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    IF a.valorISSQN <> 0
      OR a.valorRetIRRF <> 0
      OR a.valorRetINSS <> 0
      OR a.valorRetPIS <> 0
      OR a.valorRetCOFINS <> 0
      OR a.valorRetCSLL <> 0
      OR a.valorRetOutros <> 0
    THEN
      r_calcularImpostos := 1;
    END IF;
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      cab.ultimoVendedorItem,
      cab.quantidadeVolume,
      cab.quantidade,
      cab.pesoLiquido,
      cab.pesoBruto,
      cab.valorProdutosBruto,
      cab.valorProdutos,
      cab.valorDescontoProdutos,
      cab.valorAcrescimoProdutos,
      cab.valorServicosBruto,
      cab.valorServicos,
      cab.valorDescontoServicos,
      cab.valorAcrescimoServicos,
      cab.valorFreteItem,
      cab.valorSeguroItem,
      cab.valorAdicFreteMarinhaMerItem,
      cab.valorDespesasAduaneirasItem,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.condicaoPagamento,
      cab.numeroParcelas,
      cab.somaPrazoParcelas,
      cab.valorXPrazoParcelas,
      cab.prazoMedio,
      cab.prazoMedioPonderado,
      cab.valorBasePagamento,
      cab.valorAVistaMinimo,
      cab.valorEntradaMinima,
      cab.valorAVistaEntrada,
      cab.valorPagamentoBruto,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.valorPagamentoLiquido,
      cab.valorTroco,
      cab.valorFreteTotal,
      cab.valorSeguroTotal,
      cab.valorDescontoTotal,
      cab.valorOutrasDespesasTotal,
      cab.valorAdicFreteMarinhaMerTotal,
      cab.valorDespesasAduaneirasTotal,
      cab.valorLiquidoItem,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      v_cab_ultimoVendedorItem,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorFreteItem,
      v_cab_valorSeguroItem,
      v_cab_valorAdicFreteMarItem,
      v_cab_valorDespesasAduanItem,
      v_cab_valorFreteGeral,
      v_cab_valorSeguroGeral,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespesasGeral,
      v_cab_valorAdicFreteMarGeral,
      v_cab_valorDespesasAduanGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPagamento,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      IF v_cab_valorFreteGeral <> 0
        OR v_cab_valorSeguroGeral <> 0
        OR v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorAdicFreteMarGeral <> 0
        OR v_cab_valorDespesasAduanGeral <> 0
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      END IF;    
      IF p_config_378_calcularVolumes = 1 THEN
        v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
      END IF;
      v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
      v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
      v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
      IF a.tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
        v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
        v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
      IF a.usarPrecoAVista = 1
        AND a.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          a.valorDescontoGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_auxNumber, -- r_item_valorDescontoGeral
          v_auxNumber, -- r_item_valorDescontoPagamento
          v_auxNumber, -- r_item_valorOutrasDespPag
          v_auxNumber); -- r_item_valorJurosPagamento
      END IF;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        ultimoVendedorItem            = v_cab_ultimoVendedorItem,
        quantidadeVolume              = v_cab_quantidadeVolume,
        quantidade                    = v_cab_quantidade,
        pesoLiquido                   = v_cab_pesoLiquido,
        pesoBruto                     = v_cab_pesoBruto,
        valorProdutosBruto            = v_cab_valorProdutosBruto,
        valorProdutos                 = v_cab_valorProdutos,
        valorDescontoProdutos         = v_cab_valorDescontoProdutos,
        valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
        valorServicosBruto            = v_cab_valorServicosBruto,
        valorServicos                 = v_cab_valorServicos,
        valorDescontoServicos         = v_cab_valorDescontoServicos,
        valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
        valorFreteItem                = v_cab_valorFreteItem,
        valorSeguroItem               = v_cab_valorSeguroItem,
        valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
        valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
        valorFreteGeral               = v_cab_valorFreteGeral,
        valorSeguroGeral              = v_cab_valorSeguroGeral,
        valorDescontoGeral            = v_cab_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
        valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
        condicaoPagamento             = v_cab_condicaoPagamento,
        numeroParcelas                = v_cab_numeroParcelas,
        somaPrazoParcelas             = v_cab_somaPrazoParcelas,
        valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
        prazoMedio                    = v_cab_prazoMedio,
        prazoMedioPonderado           = v_cab_prazoMedioPonderado,
        valorBasePagamento            = v_cab_valorBasePagamento,
        valorAVistaMinimo             = v_cab_valorAVistaMinimo,
        valorEntradaMinima            = v_cab_valorEntradaMinima,
        valorAVistaEntrada            = v_cab_valorAVistaEntrada,
        valorPagamentoBruto           = v_cab_valorPagamentoBruto,
        valorDescontoPagamento        = v_cab_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
        valorJurosPagamento           = v_cab_valorJurosPagamento,
        valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
        valorTroco                    = v_cab_valorTroco,
        valorFreteTotal               = v_cab_valorFreteTotal,
        valorSeguroTotal              = v_cab_valorSeguroTotal,
        valorDescontoTotal            = v_cab_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
        valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
        valorLiquidoItem              = v_cab_valorLiquidoItem,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXORCAMENTOITEM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND docXTransf2.entradaSaidaOriginal <> 'O')
      AND NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXDOCFISCAL docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal))
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          b.documentoTransferencia,
          'C',
          0,
          'Cancelamento Automático',
          'ADD_DOC_FISC_ITEM_EXCLUI');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    FOR b IN (
      SELECT idProdutoXCusto
      FROM CAPRODUTOXCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      ADD_PRODUTO_CUSTO_EXCLUI (b.idProdutoXCusto);
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idAtendimento
      FROM MODOCFISCALXATENDIMENTO
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      UPDATE MOATENDIMENTOS c SET
        c.situacaoAtendimento = 'P',
        c.dataAtendimento = NULL,
        c.cliente = 0,
        c.comissionadoB = 0,
        c.comissionadoC = 0
      WHERE c.idAtendimento = b.idAtendimento;
      DELETE MODOCFISCALXATENDIMENTO c WHERE c.id = b.id;
    END LOOP;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXPREDOCUM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXDOCFISCAL docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_sys_usuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_354_estabProximoId,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_sys_usuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_sys_usuarioLogado,
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalEntrada = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

-- PATIPOSCRM
CREATE TABLE PATIPOSCRM
  (
    tipoCRM     NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao   VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao   NUMERIC (11,0) DEFAULT 0 NOT NULL,
    observacoes VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PATIPOSCRM ADD CONSTRAINT PATIPOSCRM_PK1 PRIMARY KEY (tipoCRM);
CREATE INDEX PATIPOSCRM_K2 ON PATIPOSCRM (descricao);
CREATE INDEX PATIPOSCRM_K3 ON PATIPOSCRM (ordenacao, tipoCRM);

INSERT INTO PATIPOSCRM (tipoCRM, descricao, ativo, ordenacao, observacoes) VALUES (0, 'SELECIONE', 1, 0, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PATIPOSCRM', 'Tipos CRM', 1, 31671, 'PA', 'tipoCRM', 'N', 4, 'descricao', 1, ' ', 0, 800001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposCRM', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (979, 'Tipos CRM', 1, 5060009790, 10, 'PAR', 40, 979, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTiposCRM', ' ', 0, 0, NULL, ' ');

COMMIT;

CREATE TABLE MOCRMS_2501 AS SELECT * FROM MOCRMS;

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

DROP TABLE MOCRMS;

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

INSERT INTO MOCRMS (idCRM, descricao, listaCRM, tipoCRM, tipoVenda, estabelecimento, pessoa, enderecoPessoa, vendedor, usuario, dataCriacao, etapaFunilCRM, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, dataPrevisaoFechamento, observacoes) VALUES (0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0, ' ', NULL, NULL, NULL, NULL, NULL, ' ');
INSERT INTO MOCRMS (idCRM, descricao, listaCRM, tipoCRM, tipoVenda, estabelecimento, pessoa, enderecoPessoa, vendedor, usuario, dataCriacao, etapaFunilCRM, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, dataPrevisaoFechamento, observacoes) SELECT a.idCRM, a.descricao, a.listaCRM, 0, a.tipoVenda, a.estabelecimento, a.pessoa, a.enderecoPessoa, COALESCE ((
  SELECT MAX (orc.ultimoVendedorItem)
  FROM MOCRMXORCAMENTOS crmxOrc
  JOIN MOORCAMENTOS orc
  ON orc.orcamento = crmxOrc.orcamento
  WHERE crmxOrc.idCrm = a.idCrm), 0), a.usuario, a.dataCriacao, a.etapaFunilCRM, a.tipoAcaoCRM, a.situacaoCRM, a.dataInicio, a.dataTermino, a.dataProximoContato, a.horaProximoContatoFinal, NULL, a.observacoes FROM MOCRMS_2501 a WHERE a.idCRM > 0;

COMMIT;

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

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (252, 30001001, 'Tipo CRM', 1, 30001, 'N', '4', 'P', 0, 0, 0, 0, 1, 0, 'Tipo CRM', '0', 'PATIPOSCRM', ' ');

COMMIT;

DROP INDEX MOCRMXHISTORICO_K7;
DROP INDEX MOCRMXHISTORICO_K8;
DROP INDEX MOCRMXHISTORICO_K9;
DROP INDEX MOCRMXHISTORICO_K10;
CREATE INDEX MOCRMXHISTORICO_K7 ON MOCRMXHISTORICO (idCRM, dataCriacao DESC);
CREATE INDEX MOCRMXHISTORICO_K8 ON MOCRMXHISTORICO (idCRM, dataInicio DESC);
CREATE INDEX MOCRMXHISTORICO_K9 ON MOCRMXHISTORICO (idCRM, dataTermino DESC);
CREATE INDEX MOCRMXHISTORICO_K10 ON MOCRMXHISTORICO (idCRM, dataProximoContato DESC);


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

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_PEND (
  p_idAtividadePrevOrcamento IN NUMBER,
  p_idItemOrcamento          IN NUMBER,
  p_tecnico                  IN NUMBER)    
IS
BEGIN
UPDATE MOORCAMENTOXATIVIDADEPREV prev
SET prev.tecnico = CASE WHEN prev.tecnico = 0 THEN p_tecnico ELSE prev.tecnico END,
  prev.statusAtividadeServico = 'P',
  prev.dataInicio = CASE WHEN prev.dataInicio IS NULL AND EXISTS (SELECT 1 FROM MOORCAMENTOXITENS itemOrc JOIN MOORCAMENTOS orc on orc.orcamento = itemOrc.orcamento WHERE itemOrc.idItemOrcamento = prev.idItemOrcamento AND orc.tipoDocumento = 102) THEN SYSDATE ELSE prev.dataInicio END,
  prev.dataTermino = CASE WHEN prev.dataTermino IS NULL AND EXISTS (SELECT 1 FROM MOORCAMENTOXITENS itemOrc JOIN MOORCAMENTOS orc on orc.orcamento = itemOrc.orcamento WHERE itemOrc.idItemOrcamento = prev.idItemOrcamento AND orc.tipoDocumento = 102) THEN SYSDATE ELSE prev.dataTermino END
WHERE prev.idItemOrcamento = p_idItemOrcamento
AND prev.statusAtividadeServico = 'A'
AND prev.idAtividadePrevOrcamento <> p_idAtividadePrevOrcamento
AND (p_idAtividadePrevOrcamento = 0
  OR NOT EXISTS (
    SELECT 1
    FROM MOORCAMENTOXATIVIDADEPREV prev2
    WHERE prev2.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
    AND prev2.statusAtividadeServico IN ('A','I','P')))
AND prev.sequencia =
  ( SELECT MIN (prev2.sequencia)
    FROM MOORCAMENTOXATIVIDADEPREV prev2
    WHERE prev2.idItemOrcamento = prev.idItemOrcamento
    AND prev2.statusAtividadeServico IN ('A','I','P'));
END ADD_ORCAMENTO_ITEM_PREV_PEND;

/

create or replace PROCEDURE ADD_GRADE_PRODUTO_TROCA (
  p_config_28_somenteProdEst     IN NUMBER,
  p_config_31_pesqPeloIdProduto  IN NUMBER,
  p_config_32_pesqPeloEanGtin    IN NUMBER,
  p_config_33_pesqPelaReferencia IN NUMBER,
  p_config_34_pesqPeloIdGradePro IN NUMBER,
  p_config_35_pesqPeloProdutoImp IN NUMBER,
  p_config_36_pesqPeloCodFabrica IN NUMBER,
  p_config_37_pesqPeloCodAnterio IN NUMBER,
  p_config_38_pesqPeloProdXPess  IN CHAR,
  p_config_39_pesqPeloLote       IN NUMBER,
  p_config_40_pesqPeloNumSerie   IN NUMBER,
  p_config_142_digitosProdEanInt IN CHAR,
  p_config_348_excessaoBuscaCod  IN NUMBER,
  p_config_424_pesqPeloIdLoteEst IN NUMBER,
  p_config_429_pesqPeloProdXForn IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_codigoDescricao              IN VARCHAR2,
  p_trocou                       IN NUMBER,
  p_join                         IN CLOB,
  p_andWhere                     IN CLOB,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_produto                      IN NUMBER,
  /* Retornos */
  r_gradeProduto                 OUT NUMBER,
  r_codigoDescricao              OUT VARCHAR2,
  r_trocou                       OUT NUMBER,
  r_selecionou                   OUT NUMBER,
  r_abrirTelaOnline              OUT NUMBER,
  r_mensagemErro                 OUT VARCHAR2,
  r_observacoesErro              OUT CLOB,
  r_codigoEANInterno             OUT VARCHAR2,
  r_idLoteEstoque                OUT NUMBER,
  r_loteEstoque                  OUT VARCHAR2,
  r_idNumeroSerie                OUT NUMBER,
  r_numeroSerie                  OUT VARCHAR2,
  r_quantidade                   OUT NUMBER)
IS
  v_codigoDescricaoComPontos   VARCHAR2(4000);
  v_codigoDescricaoSemPontos   VARCHAR2(4000);
  v_codigoDescricaoLoop        VARCHAR2(4000);
  v_contadorSubSelects         NUMBER;
  v_select                     CLOB;
  v_gradeProduto               NUMBER;
  v_produtoImpresso            VARCHAR2(60);
  v_descricaoImpressa          VARCHAR2(120);
  v_idLoteEstoque              NUMBER;
  v_loteEstoque                VARCHAR2(20);
  v_idNumeroSerie              NUMBER;
  v_numeroSerie                VARCHAR2(60);
  v_quantidade                 NUMBER;
  v_contaRegistros             NUMBER;
BEGIN
  r_gradeProduto               := p_gradeProduto;
  r_codigoDescricao            := p_codigoDescricao;
  r_trocou                     := p_trocou;
  r_selecionou                 := 0;
  r_abrirTelaOnline            := 0;
  r_mensagemErro               := ' ';
  r_observacoesErro            := ' ';
  r_codigoEANInterno           := ' ';
  r_idLoteEstoque              := 0;
  r_loteEstoque                := ' ';
  r_idNumeroSerie              := 0;
  r_numeroSerie                := ' ';
  r_quantidade                 := p_quantidade;
  v_codigoDescricaoComPontos   := ' ';
  v_codigoDescricaoSemPontos   := ' ';
  v_codigoDescricaoLoop        := ' ';
  v_contadorSubSelects         := 0;
  v_select                     := ' ';
  v_gradeProduto               := 0;
  v_produtoImpresso            := ' ';
  v_descricaoImpressa          := ' ';
  v_idLoteEstoque              := 0;
  v_loteEstoque                := ' ';
  v_idNumeroSerie              := 0;
  v_numeroSerie                := ' ';
  v_quantidade                 := 0;
  v_contaRegistros             := 0;
  IF p_codigoDescricao = ' ' AND p_produto = 0 THEN
    r_gradeProduto := 0;
    r_selecionou   := 1;
    r_trocou       := 0;
  ELSE
    IF p_config_142_digitosProdEanInt IN ('4','5','6')
      AND p_produto = 0
      AND SUBSTR(p_codigoDescricao,1,1)='2'
      AND LENGTH (RTRIM(p_codigoDescricao))=13
      AND FUNC_ADD_CONTEUDO_NUMERICO(p_codigoDescricao) = 1 THEN
      SELECT
        COALESCE(MAX(gradeProduto),0),
        COALESCE(MAX(produtoImpresso),' '),
        COALESCE(MAX(descricaoImpressa),' '),
        COUNT(1) contaRegistros
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_contaRegistros
      FROM CAGRADESPRODUTO
      WHERE produtoImpresso = TRIM(TO_CHAR(TO_NUMBER(SUBSTR(p_codigoDescricao,2,TO_NUMBER(p_config_142_digitosProdEanInt)))));
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_codigoEANInterno  := p_codigoDescricao;
      ELSE
        v_gradeProduto      := 0;
        v_produtoImpresso   := ' ';
        v_descricaoImpressa := ' ';
        v_contaRegistros    := 0;
      END IF;
    END IF;
    IF v_contaRegistros = 0 THEN
      IF p_codigoDescricao = ' ' THEN
        v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.ativo = 1
    AND ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END
  || '
  ) a
  WHERE ROWNUM <=2
  ) a';
      ELSE
        v_codigoDescricaoComPontos := UPPER (REPLACE (REPLACE (TRIM (r_codigoDescricao), '*', '%'), '''', ''''''));
        IF p_config_348_excessaoBuscaCod = 1 AND LENGTH (TRIM (v_codigoDescricaoComPontos)) = 16 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoComPontos) = 1 THEN
          v_codigoDescricaoComPontos := SUBSTR(v_codigoDescricaoComPontos,1,12);
        END IF;
        v_codigoDescricaoSemPontos := REPLACE (REPLACE (REPLACE (REPLACE (RTRIM (v_codigoDescricaoComPontos), '.', '') , '-', ''), '/', ''), '\', '');
        IF v_codigoDescricaoSemPontos = ' ' THEN 
          v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.ativo = 1
    AND ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END
  || '
  ) a
  WHERE ROWNUM <=2
  ) a';
        ELSE
          v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (';
          v_contadorSubSelects := 0;
          -- Se digitou número
          IF LENGTH (TRIM (v_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoSemPontos) = 1 THEN
            IF p_config_31_pesqPeloIdProduto = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_32_pesqPeloEanGtin = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_34_pesqPeloIdGradePro = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.gradeProduto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_35_pesqPeloProdutoImp = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
              v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
              WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
              END LOOP;
              IF v_codigoDescricaoLoop <> ' ' THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_36_pesqPeloCodFabrica = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_424_pesqPeloIdLoteEst = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.idLoteEstoque = ' || RTRIM (v_codigoDescricaoSemPontos) || '
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          -- Se não digitou número
          ELSE
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (v_codigoDescricaoComPontos), ' ', '%')) || '%'''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
              v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
              WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
              END LOOP;
              IF v_codigoDescricaoLoop <> ' ' THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
          END IF;
          -- Válido tanto para números quanto não números
          IF p_config_33_pesqPelaReferencia = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_37_pesqPeloCodAnterio = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_38_pesqPeloProdXPess IN ('S','T') THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      prodXPess.quantidadePorEmbalagem quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXPESSOAS prodXPess
    ON prodXPess.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
    AND prodXPess.pessoa = 0' ELSE '
    AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXPess.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      prodXPess.quantidadePorEmbalagem quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXPESSOAS prodXPess
    ON prodXPess.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
    AND prodXPess.pessoa = 0' ELSE '
    AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXPess.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_39_pesqPeloLote = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_40_pesqPeloNumSerie = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXNumSer.idLoteEstoque,
      prodXLote.loteEstoque,
      prodXNumSer.idNumeroSerie,
      prodXNumSer.numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
    ON prodXNumSer.gradeProduto = a.gradeProduto
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXNumSer.ativo = 1
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXNumSer.idLoteEstoque,
      prodXLote.loteEstoque,
      prodXNumSer.idNumeroSerie,
      prodXNumSer.numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
    ON prodXNumSer.gradeProduto = a.gradeProduto
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXNumSer.ativo = 1
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_429_pesqPeloProdXForn = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAPRODUTOXFORNECEDORES prodXForn
    ON prodXForn.produto = a.produto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXForn.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAPRODUTOXFORNECEDORES prodXForn
    ON prodXForn.produto = a.produto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXForn.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          v_select := v_select || '
  ) a
  WHERE ROWNUM <=2
) a';
          IF v_contadorSubSelects = 0 THEN
            v_select := 'SELECT
  0,
  '' '',
  '' '',
  0,
  '' '',
  0,
  '' '',
  0,
  0
FROM DUAL';
          END IF;
        END IF;
      END IF;
      EXECUTE IMMEDIATE v_select
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_idLoteEstoque,
        v_loteEstoque,
        v_idNumeroSerie,
        v_numeroSerie,
        v_quantidade,
        v_contaRegistros;
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_idLoteEstoque     := v_idLoteEstoque;
        r_loteEstoque       := v_loteEstoque;
        r_idNumeroSerie     := v_idNumeroSerie;
        r_numeroSerie       := v_numeroSerie;
        IF v_quantidade > 0 THEN
          r_quantidade      := v_quantidade;
        END IF;
      ELSE
        IF v_contaRegistros > 1 THEN
          r_abrirTelaOnline   := 1;
        ELSE
          r_mensagemErro      := 'Nenhum produto encontrado.';
          r_observacoesErro   := '-- Componente: TrocaGradeProduto
-- Select da pesquisa:
' || v_select;
          IF v_codigoDescricaoSemPontos <> ' ' THEN
            v_select := 'SELECT COUNT (1)
FROM (';
            v_contadorSubSelects := 0;
            -- Se digitou número
            IF LENGTH (TRIM (v_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoSemPontos) = 1 THEN
              IF p_config_31_pesqPeloIdProduto = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_32_pesqPeloEanGtin = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_34_pesqPeloIdGradePro = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.gradeProduto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_36_pesqPeloCodFabrica = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_424_pesqPeloIdLoteEst = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.idLoteEstoque = ' || RTRIM (v_codigoDescricaoSemPontos) || '
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            -- Se não digitou número
            ELSE
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (v_codigoDescricaoComPontos), ' ', '%')) || '%'''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
            END IF;
            -- Válido tanto para números quanto não números
            IF p_config_33_pesqPelaReferencia = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_37_pesqPeloCodAnterio = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_38_pesqPeloProdXPess IN ('S','T') THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
  AND prodXPess.pessoa = 0' ELSE '
  AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXPess.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
    AND prodXPess.pessoa = 0' ELSE '
    AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXPess.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_39_pesqPeloLote = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_40_pesqPeloNumSerie = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_429_pesqPeloProdXForn = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAPRODUTOXFORNECEDORES prodXForn
  ON prodXForn.produto = a.produto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXForn.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAPRODUTOXFORNECEDORES prodXForn
  ON prodXForn.produto = a.produto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXForn.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            v_select := v_select || '
) a';
            IF v_contadorSubSelects = 0 THEN
              v_select := 'SELECT 0 FROM DUAL';
            END IF;
            EXECUTE IMMEDIATE v_select
            INTO v_contaRegistros;            
            IF v_contaRegistros > 0 THEN
              r_mensagemErro      := 'Produto inativo.';
            END IF;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_GRADE_PRODUTO_TROCA;

/

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (253, 50002010, 'Etapa Ordem Produção', 1, 30001, 'N', '4', 'P', 0, 0, 0, 1, 1, 1, 'Etapa Ordem Produção', ' ', 'PAETAPASORCAMENTO', ' ');

COMMIT;

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_registrosRealizado           OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  IF p_previsto_realizado = 'R' THEN
    r_registrosRealizado := CASE WHEN p_real_idAtividadeRealOrcament = 0 THEN 0 ELSE 1 END;
  ELSIF r_prev_idAtividadePrevOrcament = 0 THEN
    r_registrosRealizado := 0;
  ELSE
    SELECT COALESCE (SUM (1), 0)
    INTO r_registrosRealizado
    FROM MOORCAMENTOXATIVIDADEREAL real
    WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF r_registrosRealizado < 2
    AND (p_previsto_realizado = 'R'
      OR p_real_idAtividadeRealOrcament > 0
      OR p_prev_statusAtividadeServico IN ('C','E','I'))
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0 THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    IF p_real_idAtividadeRealOrcament = 0 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico = 'E'
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico <> 'E')
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_quantidadeFabricada > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        r_registrosRealizado := r_registrosRealizado + 1;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealOrcament);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealOrcament,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        r_real_idAtividadeRealOrcament := 0;
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        p_real_dataTermino, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        p_real_modeloDocumento,
        p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        r_real_idAtividadeRealOrcament);
        r_real_idAtividadeRealOrcament := 0;
      v_atualizarStatusPrevisto := 1;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF p_servico_producao = 'S'
    AND (i_prev_faturarAtividade <> p_prev_faturarAtividade
      OR i_prev_precoUnitario <> p_prev_precoUnitario
      OR i_prev_statusAtividadeServico = 'C'
      AND p_prev_statusAtividadeServico <> 'C'
      OR i_prev_statusAtividadeServico <> 'C'
      AND p_prev_statusAtividadeServico = 'C'
      OR p_prev_faturarAtividade = 'R'
      AND r_registrosRealizado < 2
      AND (p_previsto_realizado='R'
        AND (i_real_statusAtividadeServico = 'C'
          AND p_real_statusAtividadeServico <> 'C'
          OR i_real_statusAtividadeServico <> 'C'
          AND p_real_statusAtividadeServico = 'C')
        OR i_real_quantidade <> p_real_quantidade)
      OR p_prev_faturarAtividade <> 'R'
      AND i_prev_quantidade <> p_prev_quantidade)
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- C = Painel de Compras, 'F' Fatura Contrato, L = Lista Evento, O = Orçamento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_mensagemAviso                IN VARCHAR,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_orcamento               IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_ambiente                IN NUMBER,
  p_item_ambienteObservacoes     IN VARCHAR2,
  p_item_vinculoItemDocumento    IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_statusAtividadeServico  IN CHAR,
  p_item_controleEntrega         IN NUMBER,
  p_item_dataEntrega             IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_atividadeProjeto        IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_idAtividadesPrevistasSelec   IN VARCHAR2,
  p_nivel                        IN NUMBER,
  p_buffer_idItemOrcamento       IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_idItemOrcamento       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_finalidadeNota           CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_controleEntrega          NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_valorISSQN               NUMBER;
  v_ini_valorRetIRRF             NUMBER;
  v_ini_valorRetINSS             NUMBER;
  v_ini_valorRetPIS              NUMBER;
  v_ini_valorRetCOFINS           NUMBER;
  v_ini_valorRetCSLL             NUMBER;
  v_ini_valorRetOutros           NUMBER;
  v_ini_contrEntr_habilitaFrete  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeSaldo         NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorFreteGeral         NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_residuoISSQN            NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_residuoRetIRRF          NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_residuoRetINSS          NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_residuoRetPIS           NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_residuoRetCOFINS        NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_residuoRetCSLL          NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_residuoRetOutros        NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_contrEntr_habilitaFrete      NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemOrcamento       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_ativ_criouPendenteIniciado   NUMBER;
  v_ativ_idAtividadePrevOrcamen  NUMBER;
  v_ativ_sequencia               NUMBER;
  v_ativ_tecnico                 NUMBER;
  v_ativ_checklist               NUMBER;
  v_ativ_gradeProdutoXFichaAtiv  NUMBER;
  v_ativ_idAtividadeRealOrcament NUMBER;
  v_ativ_idFichaProdutoPrevOrcam NUMBER;
  v_ativ_ordenacaoFichaProdutoPr NUMBER;
  v_ativ_atualizaCustoMedio      NUMBER;
  v_ativ_atualizaUltimaCompra    NUMBER;
  v_ativ_selecionaAtividadePrev  NUMBER;
  v_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          NUMBER;
  v_ativ_geraFinanceiro          NUMBER;
  v_valorFreteRegra              NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := p_mensagemAviso;
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemOrcamento := p_item_idItemOrcamento;
  r_buffer_idItemOrcamento := p_buffer_idItemOrcamento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.transportadora,
    cab.enderecoTransportadora,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_finalidadeNota,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_transportadora,
    v_cab_enderecoTransportadora,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.orcamento = p_item_orcamento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_controleEntrega          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_valorISSQN               := 0;
  v_ini_valorRetIRRF             := 0;
  v_ini_valorRetINSS             := 0;
  v_ini_valorRetPIS              := 0;
  v_ini_valorRetCOFINS           := 0;
  v_ini_valorRetCSLL             := 0;
  v_ini_valorRetOutros           := 0;
  v_ini_contrEntr_habilitaFrete  := 0;
  v_item_quantidadeSaldo         := p_item_quantidade;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorFreteGeral         := p_item_valorFreteGeral;
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_residuoISSQN            := 0;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_residuoRetIRRF          := 0;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_residuoRetINSS          := 0;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_residuoRetPIS           := 0;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_residuoRetCOFINS        := 0;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_residuoRetCSLL          := 0;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_residuoRetOutros        := 0;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  v_contrEntr_habilitaFrete      := 0;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOORCAMENTOXPROMOCOES
    WHERE orcamento = p_item_orcamento;
  END IF;
  IF p_item_idItemOrcamento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeSaldo,
        a.controleEntrega,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        prod.tipoProduto,
        b.habilitaFrete
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA b
      ON b.controleEntrega = a.controleEntrega
      WHERE a.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_controleEntrega := a.controleEntrega;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_valorISSQN := a.valorISSQN;
      v_ini_valorRetIRRF := a.valorRetIRRF;
      v_ini_valorRetINSS := a.valorRetINSS;
      v_ini_valorRetPIS := a.valorRetPIS;
      v_ini_valorRetCOFINS := a.valorRetCOFINS;
      v_ini_valorRetCSLL := a.valorRetCSLL;
      v_ini_valorRetOutros := a.valorRetOutros;
      v_ini_contrEntr_habilitaFrete := 0;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_contrEntr_habilitaFrete := a.habilitaFrete;
      IF p_buscarAliquotas_CalcularImp = 'T' THEN
        IF p_buscarGeraFinanceiroEstoque = 1 THEN
          v_item_movimentaEstoque        := a.movimentaEstoque;
          v_item_geraFinanceiro          := a.geraFinanceiro;
        END IF;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF a.cancelado = 0 THEN
        v_item_quantidadeSaldo := v_item_quantidadeSaldo + a.quantidadeSaldo - a.quantidade;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> v_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    v_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = 'E'
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        0, -- v_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_ORCAMENTO_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_config_430_sugerirUsuLogTec,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, 
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND (a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_mensagemAviso,
        r_calcularImpostos,
        0, -- p_item_idItemOrcamento
        p_item_orcamento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_ambiente,
        p_item_ambienteObservacoes,
        999, -- p_item_vinculoItemDocumento
        0, -- p_item_atividadeServico
        'A', -- p_item_statusAtividadeServico
        p_item_controleEntrega,
        p_item_dataEntrega,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_atividadeProjeto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(v_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- v_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        ' ', -- p_idAtividadesPrevistasSelec
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_idItemOrcamento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemOrcamento)) >= 14
      LOOP
        v_ajuste_idItemOrcamento := TO_NUMBER(SUBSTR(r_buffer_idItemOrcamento,1,14));
        r_buffer_idItemOrcamento := RTRIM(SUBSTR(r_buffer_idItemOrcamento,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MOORCAMENTOXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemOrcamento = v_ajuste_idItemOrcamento;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MOORCAMENTOXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemOrcamento = v_ajuste_idItemOrcamento;
      END LOOP;
      UPDATE MOORCAMENTOS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE orcamento          = p_item_orcamento;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemOrcamento <= 0 THEN
      r_item_idItemOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXITENS', 'idItemOrcamento', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF p_item_controleEntrega > 0 THEN
        SELECT habilitaFrete
        INTO v_contrEntr_habilitaFrete
        FROM PACONTROLESENTREGA
        WHERE controleEntrega = p_item_controleEntrega;
      END IF;
      IF
        CASE
          WHEN v_ini_controleEntrega = 0
            OR v_ini_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_ini_valorProdutoServicoBruto - v_ini_valorDescontoItem + v_ini_valorAcrescimoItem
        END <>
        CASE
          WHEN p_item_controleEntrega = 0
            OR v_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem
        END
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0, -- p_buscarESalvarInternamente
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_ini_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit,
          r_item_idItemOrcamento,
          p_item_pesoLiquido,
          p_item_pesoBruto,
          v_item_valorProdutoServicoBrut,
          p_item_valorDescontoItem,
          p_item_valorAcrescimoItem,
          p_item_controleEntrega,
          v_item_valorFreteGeral,
          v_contrEntr_habilitaFrete,
          /* Retornos */
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_valorFreteRegra,
          v_auxNumber);
        IF v_valorFreteRegra <> v_ini_cab_valorFreteGeral THEN
          v_item_valorFreteGeral := v_valorFreteRegra - v_cab_valorFreteGeral;
        END IF;
      ELSIF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        v_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        0, -- p_cab_vendaConsumidor
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        0, -- p_movimentaEstoqueFiscal
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_auxNumber, -- r_movimentaEstoqueFiscal
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar, -- r_item_stICMSEscrit
        v_auxNumber, -- r_item_reducaoBaseICMSEscrit
        v_auxNumber, -- r_item_aliquotaICMSEscrit
        v_auxNumber, -- r_item_diferimentoICMSEscritur
        v_auxNumber, -- r_item_margemValorAdicSTEscrit
        v_auxNumber, -- r_item_reducaoBaseSTEscrit
        v_auxNumber, -- r_item_aliquotaICMSSTEscrit
        v_auxNumber, -- r_item_somarICMSST
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        v_item_residuoISSQN,
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        v_item_residuoRetIRRF,
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        v_item_residuoRetINSS,
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        v_item_residuoRetPIS,
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        v_item_residuoRetCOFINS,
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        v_item_residuoRetCSLL,
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        v_item_residuoRetOutros,
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        0, -- p_valorIPIDevolucao
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        0, -- p_calcularICMSEscrituracao
        '  ', -- p_stICMSEscrituracao
        0, -- p_reducaoBaseICMSEscrituracao
        0, -- p_aliquotaICMSEscrituracao
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        0, -- p_calcularICMSSTEscrituracao
        0, -- p_margemValorAdicSTEscriturac
        0, -- p_reducaoBaseSTEscrituracao
        0, -- p_aliquotaICMSSTEscrituracao
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_residuoISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_residuoRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_residuoRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_residuoRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_residuoRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_residuoRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_residuoRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber, -- r_baseICMSEscrituracao
        v_auxNumber, -- r_valorICMSEscrituracao
        v_auxNumber, -- r_valorICMSDesonEscrituracao
        v_auxNumber, -- r_baseICMSSTEscrituracao
        v_auxNumber, -- r_valorICMSSTEscrituracao
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    END IF;
    UPDATE MOORCAMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      transportadora                = v_cab_transportadora,
      enderecoTransportadora        = v_cab_enderecoTransportadora,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    IF v_item_valorISSQN <> v_ini_valorISSQN
      OR v_item_valorRetIRRF <> v_ini_valorRetIRRF
      OR v_item_valorRetINSS <> v_ini_valorRetINSS
      OR v_item_valorRetPIS <> v_ini_valorRetPIS
      OR v_item_valorRetCOFINS <> v_ini_valorRetCOFINS
      OR v_item_valorRetCSLL <> v_ini_valorRetCSLL
      OR v_item_valorRetOutros <> v_ini_valorRetOutros
    THEN
      r_calcularImpostos := 1;
    END IF;
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      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,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_sys_estabelecimentoAtivo,
          v_cab_tipoDocumento,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'O',
      r_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MOORCAMENTOXITENS
    SET observacoes = v_observacoes
    WHERE idItemOrcamento = r_item_idItemOrcamento;
    r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
    THEN
      v_ativ_criouPendenteIniciado := 0;
      v_ativ_sequencia             := 0;
      v_ativ_tecnico               := 0;
      v_ativ_checklist             := 0;
      -- Atividades Previstas Ordem Serviço
      IF v_cab_tipoDocumento = 102
        AND p_item_atividadeServico > 0
      THEN
        SELECT
          habilitaAtividadePrevista,
          selecionaAtividadePrevista
        INTO
          v_auxNumber,
          v_ativ_selecionaAtividadePrev
        FROM PAATIVIDADESSERVICO
        WHERE atividadeServico = p_item_atividadeServico;
        IF p_config_430_sugerirUsuLogTec = 1 THEN
          SELECT COALESCE (MAX (tecnico), 0)
          INTO v_ativ_tecnico
          FROM CATECNICOS
          WHERE tecnico = p_sys_usuarioLogado
          AND ativo = 1;
        END IF;
        IF v_auxNumber = 1 THEN
          FOR a IN (
            SELECT
              a.atividadeServicoPrevista,
              a.tecnico,
              a.faturarAtividade,
              a.etapaAtividade,
              a.observacoes,
              COALESCE ((
                SELECT MAX (b.checklist)
                FROM (
                  SELECT
                    b.atividadeServico,
                    b.checklist,
                    ROW_NUMBER() OVER (
                      PARTITION BY b.atividadeServico
                      ORDER BY
                        b.atividadeServico,
                        b.ordenacao,
                        b.id) ordenacao
                  FROM PAATIVIDADESERVXCHECKLIST b
                  WHERE b.ativo = 1) b
                WHERE b.atividadeServico = a.atividadeServicoPrevista
                AND b.ordenacao = 1), 0) checklist,
              CASE ativ.gradeProduto
                WHEN 0
                THEN 0
                WHEN p_item_gradeProduto
                THEN v_item_precoUnitario
                ELSE FUNC_ADD_BUSCA_PRECO (
                  p_config_64_casasDecSaidas,
                  p_config_209_filtrarGrupoEcon,
                  p_config_362_calcCustoPorGrade,
                  p_sys_perfilUsuarioLogado,
                  p_sys_usuarioLogado,
                  v_cab_estabelecimento,
                  SYSDATE, -- p_cab_dataPrecoFinal
                  v_cab_pessoa,
                  v_munEndEst_uf,
                  v_munEndPess_uf,
                  p_item_vendedor,
                  0, -- p_item_idFormulaTinta
                  0, -- p_item_personalizacao
                  gradProd.produto,
                  gradProd.cor,
                  gradProd.tamanho,
                  prod.controleEstoque,
                  p_item_tipoPreco,
                  p_item_tabelaPreco)
              END precoUnitario
            FROM PAATIVIDADEOSXPREVISTA a
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = a.atividadeServicoPrevista
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE a.id > 0
            AND (v_ativ_selecionaAtividadePrev = 0
              AND a.atividadeServicoOs = p_item_atividadeServico
              AND a.ativo = 1
              AND a.sugestao = 1
              OR v_ativ_selecionaAtividadePrev = 1
              AND INSTR (',' || TRIM (p_idAtividadesPrevistasSelec) || ',', ',' || TO_CHAR (a.id) || ',') > 0)
            ORDER BY
              a.atividadeServicoOs,
              a.ordenacao,
              a.id)
          LOOP
            v_ativ_sequencia := v_ativ_sequencia + 1;
            ADD_ORCAMENTO_ITEM_PREV_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadePrevOrcamento
              r_item_idItemOrcamento,
              v_ativ_sequencia, -- p_sequencia
              a.atividadeServicoPrevista, -- p_atividadeServico
              ' ', -- p_descricao
              CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
              a.faturarAtividade, -- p_faturarAtividade
              a.checklist, -- p_checklist
              'I', -- p_tipoApontamento
              0, -- p_editaQuantidades
              a.etapaAtividade, -- p_etapaAtividade
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
              0, -- p_quantidade
              a.precoUnitario, -- p_precoUnitario
              a.observacoes, -- p_observacoes
              v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
            v_ativ_criouPendenteIniciado := 1;
            IF a.checklist > 0 THEN
              ADD_ORCAMENTO_ITEM_TAREF_GERA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                a.checklist); -- p_checklist
            END IF;
            IF v_ativ_criouPendenteIniciado = 0
              AND CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado
            THEN
              ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadeRealOrcamento
                v_ativ_idAtividadePrevOrcamen,
                1, -- p_sequencia
                a.atividadeServicoPrevista, -- p_atividadeServico
                ' ', -- p_descricao
                CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
                'I', -- p_statusAtividadeServico
                SYSDATE, -- p_dataInicio
                NULL, -- p_dataTermino
                p_item_modeloDocumento,
                0, -- p_motivoEstoque
                0, -- p_quantidade
                ' ', -- p_observacoes
                /* Retornos */
                v_ativ_idAtividadeRealOrcament);
            END IF;
          END LOOP;
          IF v_ativ_sequencia = 0
            AND v_ativ_selecionaAtividadePrev = 0
          THEN
            SELECT COALESCE (MAX (validoPrevisto), 0)
            INTO v_auxNumber
            FROM PAATIVIDADESSERVICO
            WHERE atividadeServico = p_item_atividadeServico;
            IF v_auxNumber = 1 THEN
              SELECT COALESCE (MAX (c.checklist),0)
              INTO v_ativ_checklist
              FROM (
                SELECT
                  b.checklist,
                  ROW_NUMBER() OVER (
                    ORDER BY
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.atividadeServico = p_item_atividadeServico
                AND b.ativo = 1) c
              WHERE c.ordenacao = 1;
              v_ativ_sequencia := v_ativ_sequencia + 1;
              ADD_ORCAMENTO_ITEM_PREV_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadePrevOrcamento
                r_item_idItemOrcamento,
                v_ativ_sequencia,  -- p_sequencia
                p_item_atividadeServico, -- p_atividadeServico
                ' ', -- p_descricao
                v_ativ_tecnico, -- p_tecnico
                'N', -- p_faturarAtividade
                v_ativ_checklist, -- p_checklist
                'I', -- p_tipoApontamento
                0, -- p_editaQuantidades
                0, -- p_etapaAtividade
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN v_ativ_tecnico = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
                0, -- p_quantidade
                v_item_precoUnitario, -- p_precoUnitario
                ' ', -- p_observacoes
                v_ativ_idAtividadePrevOrcamen);  -- r_idAtividadePrevOrcamento
              v_ativ_criouPendenteIniciado := 1;
              IF v_ativ_checklist > 0 THEN
                ADD_ORCAMENTO_ITEM_TAREF_GERA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                  v_ativ_checklist); -- p_checklist
              END IF;
              IF v_ativ_criouPendenteIniciado = 0
                AND v_ativ_tecnico = p_sys_usuarioLogado
              THEN
                ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  0, -- p_idAtividadeRealOrcamento
                  v_ativ_idAtividadePrevOrcamen,
                  1, -- p_sequencia
                  p_item_atividadeServico, -- p_atividadeServico
                  ' ', -- p_descricao
                  v_ativ_tecnico, -- p_tecnico
                  'I', -- p_statusAtividadeServico
                  SYSDATE, -- p_dataInicio
                  NULL, -- p_dataTermino
                  p_item_modeloDocumento,
                  0, -- p_motivoEstoque
                  0, -- p_quantidade
                  ' ', -- p_observacoes
                  /* Retornos */
                  v_ativ_idAtividadeRealOrcament);
              END IF;
            END IF;
          END IF;
        END IF;
        -- Se inseriu Atividades Previstas
        IF v_ativ_sequencia > 0 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            v_ativ_geraFinanceiro := 1;
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
              MIN (prev.precoUnitario) precoUnitarioMenor,
              MAX (prev.precoUnitario) precoUnitarioMaior,
              SUM (ROUND (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
            INTO
              v_ativ_numero,
              v_ativ_quantidade,
              v_ativ_precoUnitarioMenor,
              v_ativ_precoUnitario,
              v_ativ_valorTotalItem
            FROM MOORCAMENTOXATIVIDADEPREV prev
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = prev.atividadeServico
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C'
            AND ativ.gradeProduto > 0
            AND prod.unidadeMedida = v_prod_unidadeMedida;
            IF v_ativ_numero > 0 THEN
              v_ativ_geraFinanceiro := 0;
              IF v_ativ_numero > 1
                AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
                AND v_ativ_quantidade <> 0
              THEN
                v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
              END IF;
            END IF;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario
              OR v_ativ_geraFinanceiro <> v_item_geraFinanceiro)
          THEN
            ADD_ORCAMENTO_ITEM_GRAVA (
              ' ', -- p_sessaoClient
              p_sys_usuarioLogado,
              p_sys_perfilUsuarioLogado,
              p_sys_estabelecimentoAtivo,
              p_person_190_modeloFrete,
              p_config_64_casasDecSaidas,
              p_config_65_casasDecEntrada,
              p_config_198_obs_add_referenc,
              p_config_199_obs_add_caractA,
              p_config_200_obs_add_caractB,
              p_config_201_obs_add_caractC,
              p_config_202_obs_add_caractD,
              p_config_203_obs_add_caractE,
              p_config_209_filtrarGrupoEcon,
              p_config_354_estabProximoId,
              p_config_362_calcCustoPorGrade,
              p_config_378_calcularVolumes,
              p_config_413_obs_add_marca,
              p_config_418_obs_efetarEnter,
              p_config_430_sugerirUsuLogTec,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              ROUND (CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE v_ativ_quantidade / p_item_conversorQuantidade END
                ELSE 0
              END, 3), -- p_item_pecas
              v_ativ_quantidade,
              ROUND (CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade / p_item_conversorQuantidade END
                WHEN 5
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade * p_item_conversorQuantidade END
                ELSE v_ativ_quantidade
              END, 6), -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              v_item_valorFreteGeral,
              p_item_valorSeguroGeral,
              v_item_valorDescontoGeral,
              p_item_valorOutrasDespesasGer,
              p_item_valorAdicFreteMarGeral,
              p_item_valorDespesasAduanGeral,
              v_item_valorDescontoPagamento,
              v_item_valorOutrasDespPagament,
              v_item_valorJurosPagamento,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_ativ_geraFinanceiro,
              0, -- p_item_cfop
              ' ', -- p_item_indicadorISSQN
              0, -- p_item_aliquotaISSQN
              0, -- p_item_retidoISSQN
              0, -- p_item_tributadoForaMunicipio
              0, -- p_item_incentivoFiscal
              0, -- p_item_listaServicos
              0, -- p_item_cnae
              0, -- p_item_idServicoMunicipio
              ' ', -- p_item_numeroProcessoAdministr
              0, -- p_item_retencaoIRRF
              0, -- p_item_retencaoINSS
              0, -- p_item_retencaoPIS
              0, -- p_item_retencaoCOFINS
              0, -- p_item_retencaoCSLL
              0, -- p_item_retencaoOutros
              0, -- p_item_aliquotaII
              0, -- p_item_aliquotaIOF
              0, -- p_item_codigoEnquadramentoIPI
              0, -- p_item_stIPI
              0, -- p_item_aliquotaIPI
              0, -- p_item_valorAliquotaIPI
              ' ', -- p_item_stPIS
              0, -- p_item_aliquotaPIS
              0, -- p_item_valorAliquotaPIS
              0, -- p_item_aliquotaPISST
              0, -- p_item_valorAliquotaPISST
              ' ', -- p_item_stCOFINS
              0, -- p_item_aliquotaCOFINS
              0, -- p_item_valorAliquotaCOFINS
              0, -- p_item_aliquotaCOFINSST
              0, -- p_item_valorAliquotaCOFINSST
              '   ', -- p_item_stSimplesNacional
              0, -- p_item_creditoSimplesNacional
              '  ', -- p_item_stICMS
              0, -- p_item_modalBaseCalcICMS
              0, -- p_item_reducaoBaseICMS
              0, -- p_item_aliquotaICMS
              0, -- p_item_diferimentoICMS
              ' ', -- p_item_motivoDesoneracaoICMS
              0, -- p_item_idBeneficio
              ' ', -- p_item_modalBaseCalcICMSST
              0, -- p_item_margemValorAdicionadoST
              0, -- p_item_reducaoBaseST
              0, -- p_item_aliquotaICMSST
              0, -- p_item_aliquotaSTSuportConsFin
              0, -- p_item_reducaoBaseICMSEfetivo
              0, -- p_item_aliquotaICMSEfetivo
              0, -- p_item_aliquotaICMSUFDestinat
              0, -- p_item_aliquotaICMSInterestad
              0, -- p_item_partilhaICMSInterestad
              0, -- p_item_aliquotaFCP
              0, -- p_item_aliquotaFCPST
              0, -- p_item_aliquotaFCPSTAnteriorm
              0, -- p_item_aliquotaFCPUFDestinat
              0, -- p_item_aliquotaEstImpFederais
              0, -- p_item_aliquotaEstImpEstaduais
              0, -- p_item_aliquotaEstImpMunicipai
              0, -- p_item_baseISSQN
              0, -- p_item_valorISSQN
              0, -- p_item_baseRetIRRF
              0, -- p_item_valorRetIRRF
              0, -- p_item_baseRetINSS
              0, -- p_item_valorRetINSS
              0, -- p_item_baseRetPIS
              0, -- p_item_valorRetPIS
              0, -- p_item_baseRetCOFINS
              0, -- p_item_valorRetCOFINS
              0, -- p_item_baseRetCSLL
              0, -- p_item_valorRetCSLL
              0, -- p_item_baseRetOutros
              0, -- p_item_valorRetOutros
              0, -- p_item_baseII
              0, -- p_item_valorII
              0, -- p_item_baseIOF
              0, -- p_item_valorIOF
              0, -- p_item_baseIPI
              0, -- p_item_valorIPI
              0, -- p_item_basePIS
              0, -- p_item_valorPIS
              0, -- p_item_basePISST
              0, -- p_item_valorPISST
              0, -- p_item_baseCOFINS
              0, -- p_item_valorCOFINS
              0, -- p_item_baseCOFINSST
              0, -- p_item_valorCOFINSST
              0, -- p_item_baseCreditoSimplesNac
              0, -- p_item_valorCreditoSimplesNac
              0, -- p_item_baseICMS
              0, -- p_item_valorICMSOperacao
              0, -- p_item_valorICMSDiferido
              0, -- p_item_valorICMS
              0, -- p_item_valorICMSDesoneracao
              0, -- p_item_baseICMSST
              0, -- p_item_valorICMSST
              0, -- p_item_baseICMSSTAnteriormente
              0, -- p_item_valorICMSSTAnteriorment
              0, -- p_item_valorICMSProprioSubstit
              0, -- p_item_baseICMSEfetivo
              0, -- p_item_valorICMSEfetivo
              0, -- p_item_baseICMSUFDestinatario
              0, -- p_item_valorICMSUFDestinatario
              0, -- p_item_baseICMSUFRemetente
              0, -- p_item_valorICMSUFRemetente
              0, -- p_item_baseFCP
              0, -- p_item_valorFCP
              0, -- p_item_baseFCPST
              0, -- p_item_valorFCPST
              0, -- p_item_baseFCPSTAnteriormente
              0, -- p_item_valorFCPSTAnteriormente
              0, -- p_item_baseFCPUFDestinatario
              0, -- p_item_valorFCPUFDestinatario
              0, -- p_item_baseEstimadaImpostos
              0, -- p_item_valorEstImpFederais
              0, -- p_item_valorEstImpEstaduais
              0, -- p_item_valorEstImpMunicipais
              ' ', -- p_idAtividadesPrevistasSelec
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_idItemOrcamento
              v_auxNumber); -- r_valorInserido
          END IF;
          ADD_ORCAMENTO_ITEM_STATUS_CALC (r_item_idItemOrcamento);
        END IF;
      -- Atividades Previstas Ordem Produção
      ELSIF v_cab_tipoDocumento = 202
        AND v_prod_controleEstoque = 6
      THEN
        SELECT COALESCE (MAX (a.gradeProdutoXFichaAtividade), 0)
        INTO v_ativ_gradeProdutoXFichaAtiv
        FROM (
        SELECT
          ROW_NUMBER() OVER (ORDER BY ordenacao DESC) ordenacao,
          gradeProdutoXFichaAtividade  
        FROM CAGRADEPRODUTOXFICHAATIV
        WHERE gradeProduto = p_item_gradeProduto
        AND gradeProdutoXFichaAtividade > 0
        AND ativo = 1) a
        WHERE a.ordenacao = 1;
        FOR a IN (
          SELECT
            a.gradeProdutoXFichaAtividade,
            a.atividadeServico,
            a.tipoApontamento,
            a.editaQuantidades,
            a.quantidade,
            a.observacoes,
            COALESCE ((
              SELECT MAX (b.checklist)
              FROM (
                SELECT
                  b.atividadeServico,
                  b.checklist,
                  ROW_NUMBER() OVER (
                    PARTITION BY b.atividadeServico
                    ORDER BY
                      b.atividadeServico,
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.ativo = 1) b
              WHERE b.atividadeServico = a.atividadeServico
              AND b.ordenacao = 1), 0) checklist,
            CASE ativ.gradeProduto
              WHEN 0
              THEN 0
              WHEN p_item_gradeProduto
              THEN v_item_precoUnitario
              ELSE FUNC_ADD_BUSCA_PRECO (
                p_config_64_casasDecSaidas,
                p_config_209_filtrarGrupoEcon,
                p_config_362_calcCustoPorGrade,
                p_sys_perfilUsuarioLogado,
                p_sys_usuarioLogado,
                v_cab_estabelecimento,
                SYSDATE, -- p_cab_dataPrecoFinal
                v_cab_pessoa,
                v_munEndEst_uf,
                v_munEndPess_uf,
                p_item_vendedor,
                0, -- p_item_idFormulaTinta
                0, -- p_item_personalizacao
                gradProd.produto,
                gradProd.cor,
                gradProd.tamanho,
                prod.controleEstoque,
                p_item_tipoPreco,
                p_item_tabelaPreco)
            END precoUnitario
          FROM CAGRADEPRODUTOXFICHAATIV a
          JOIN PAATIVIDADESSERVICO ativ
          ON ativ.atividadeServico = a.atividadeServico
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = ativ.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE a.gradeProduto = p_item_gradeProduto
          AND a.gradeProdutoXFichaAtividade > 0
          AND a.ativo = 1
          ORDER BY a.ordenacao)
        LOOP
          v_ativ_sequencia := v_ativ_sequencia + 1;
          ADD_ORCAMENTO_ITEM_PREV_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idAtividadePrevOrcamento
            r_item_idItemOrcamento,
            v_ativ_sequencia, -- p_sequencia
            a.atividadeServico, -- p_atividadeServico
            ' ', -- p_descricao
            0, -- p_tecnico
            'N', -- p_faturarAtividade
            a.checklist, -- p_checklist
            a.tipoApontamento, -- p_tipoApontamento
            a.editaQuantidades, -- p_editaQuantidades
            0, -- p_etapaAtividade
            CASE WHEN a.tipoApontamento = 'N' THEN 'E' WHEN v_ativ_criouPendenteIniciado = 0 THEN 'P' ELSE 'A' END, -- p_statusAtividadeServico
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataInicio
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataTermino
            p_item_quantidade * a.quantidade, -- p_quantidade
            a.precoUnitario, -- p_precoUnitario
            a.observacoes, -- p_observacoes
            v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
          IF a.checklist > 0 THEN
            ADD_ORCAMENTO_ITEM_TAREF_GERA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
              a.checklist); -- p_checklist
          END IF;
          IF a.tipoApontamento = 'N' THEN
            ADD_ORCAMENTO_ITEM_REAL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadeRealOrcamento
              v_ativ_idAtividadePrevOrcamen,
              1, -- p_sequencia
              a.atividadeServico, -- p_atividadeServico
              ' ', -- p_descricao
              0, -- p_tecnico
              'E', -- p_statusAtividadeServico
              SYSDATE, -- p_dataInicio
              SYSDATE, -- p_dataTermino
              p_item_modeloDocumento,
              0, -- p_motivoEstoque
              p_item_quantidade * a.quantidade, -- p_quantidade
              ' ', -- p_observacoes
              /* Retornos */
              v_ativ_idAtividadeRealOrcament);
          ELSE
            v_ativ_criouPendenteIniciado := 1;
          END IF;
          v_ativ_ordenacaoFichaProdutoPr := 0;
          IF a.gradeProdutoXFichaAtividade = v_ativ_gradeProdutoXFichaAtiv THEN
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'E', -- entradaSaida,
              p_item_localEstoque, -- p_localEstoque
              p_item_gradeProduto,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              p_item_quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE p_item_quantidade END, -- p_quantidadeSaldo
              V_observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              SELECT
                atualizaCustoMedio,
                atualizaUltimaCompra
              INTO
                v_ativ_atualizaCustoMedio,
                v_ativ_atualizaUltimaCompra
              FROM PAMODELOSDOCUMENTO
              WHERE modeloDocumento = p_item_modeloDocumento;
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                v_ativ_atualizaCustoMedio, -- p_atualizaCustoMedio
                v_ativ_atualizaUltimaCompra, -- p_atualizaUltimaCompra
                'E', -- p_entradaSaida,
                p_item_localEstoque, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                p_item_gradeProduto,
                p_item_personalizacao,
                p_item_idLoteEstoque,
                p_item_quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                v_observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
              UPDATE MOORCAMENTOXITENS
              SET quantidadeSaldo = 0
              WHERE idItemOrcamento = r_item_idItemOrcamento;
            END IF;
          END IF;
          FOR b IN (
            SELECT
              b.ordenacao,
              b.gradeProduto,
              b.quantidade,
              b.localEstoque,
              b.observacoes
            FROM CAGRADEPRODUTOXFICHAPROD b
            WHERE b.gradeProdutoXFichaAtividade = a.gradeProdutoXFichaAtividade
            AND b.id > 0
            AND b.ativo = 1
            ORDER BY b.ordenacao)
          LOOP
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'S', -- entradaSaida,
              CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
              b.gradeProduto,
              0, -- personalizacao,
              0, -- b.idLoteEstoque,
              p_item_quantidade * b.quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE b.quantidade END, -- p_quantidadeSaldo
              b.observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                'S', -- p_entradaSaida,
                CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                b.gradeProduto,
                0, -- personalizacao,
                0, -- b.idLoteEstoque,
                p_item_quantidade * b.quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                b.observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
            END IF;
          END LOOP;
        END LOOP;
      END IF;
    END IF;
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      r_item_idItemOrcamento,
      '',
      '',
      v_auxVarchar,
      v_auxVarchar);
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

-- Município: 4209102- Joinville - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
UPDATE SIMUNICIPIOS SET tecnologiaNFSe = 1, certificadoDigitalAcessoSite = 0, versaoNFSe = '1.00' WHERE municipio = 4209102;

DELETE SISERVICOSNFSE WHERE id IN (4209102000, 4209102020, 4209102100);

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

COMMIT;

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF p_previsto_realizado = 'R'
    OR p_real_idAtividadeRealOrcament > 0
    OR p_prev_statusAtividadeServico IN ('C','E','I')
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0 THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico = 'E'
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico <> 'E')
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_quantidadeFabricada > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealOrcament);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealOrcament,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        r_real_idAtividadeRealOrcament := 0;
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        p_real_dataTermino, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        p_real_modeloDocumento,
        p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        r_real_idAtividadeRealOrcament);
        r_real_idAtividadeRealOrcament := 0;
      v_atualizarStatusPrevisto := 1;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF p_servico_producao = 'S'
    AND (i_prev_faturarAtividade <> p_prev_faturarAtividade
      OR i_prev_precoUnitario <> p_prev_precoUnitario
      OR i_prev_statusAtividadeServico = 'C'
      AND p_prev_statusAtividadeServico <> 'C'
      OR i_prev_statusAtividadeServico <> 'C'
      AND p_prev_statusAtividadeServico = 'C'
      OR p_prev_faturarAtividade = 'R'
      AND (p_previsto_realizado='R'
        AND (i_real_statusAtividadeServico = 'C'
          AND p_real_statusAtividadeServico <> 'C'
          OR i_real_statusAtividadeServico <> 'C'
          AND p_real_statusAtividadeServico = 'C')
        OR i_real_quantidade <> p_real_quantidade)
      OR p_prev_faturarAtividade <> 'R'
      AND i_prev_quantidade <> p_prev_quantidade)
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

INSERT INTO SITECNOLOGIASNFSE (tecnologiaNFSe, descricao, ativo, solicitaLogon, observacoes) values (5, 'Elotech', 1, 1, ' ');

COMMIT;

CREATE TABLE PAESTABELECIMENTOXNFSE_2501 as select * from PAESTABELECIMENTOXNFSE;
DROP TABLE PAESTABELECIMENTOXNFSE;

-- PAESTABELECIMENTOXNFSE
CREATE TABLE PAESTABELECIMENTOXNFSE
  (
    estabelecimento          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indicadorAmbienteNfse    CHAR (1) DEFAULT ' ' NOT NULL,
    regimeEspecialTributacao CHAR (1) DEFAULT ' ' NOT NULL,
    incentivadorCultural     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    usuarioNFSe              VARCHAR (256) DEFAULT ' ' NOT NULL,
    senhaNFSe                VARCHAR (256) DEFAULT ' ' NOT NULL,
    senhaWS                  VARCHAR (256) DEFAULT ' ' NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAESTABELECIMENTOXNFSE ADD CONSTRAINT PAESTABELECIMENTOXNFSE_PK1 PRIMARY KEY (estabelecimento);
ALTER TABLE PAESTABELECIMENTOXNFSE ADD CONSTRAINT PAESTABELECIMENTOXNFSE_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAESTABELECIMENTOXNFSE ADD CONSTRAINT PAESTABELECIMENTOXNFSE_FK2 FOREIGN KEY (indicadorAmbienteNfse) REFERENCES SIINDICAMBIENTENFE (indicadorAmbienteNfe);
ALTER TABLE PAESTABELECIMENTOXNFSE ADD CONSTRAINT PAESTABELECIMENTOXNFSE_FK3 FOREIGN KEY (regimeEspecialTributacao) REFERENCES SIREGIMESESPECIAISTRIBUT (regimeEspecialTributacao);

INSERT INTO PAESTABELECIMENTOXNFSE (estabelecimento, indicadorAmbienteNfse, regimeEspecialTributacao, incentivadorCultural, usuarioNFSe, senhaNFSe, senhaWS, observacoes) VALUES (0, ' ', ' ', 0, ' ', ' ', ' ', ' ');
INSERT INTO PAESTABELECIMENTOXNFSE (estabelecimento, indicadorAmbienteNfse, regimeEspecialTributacao, incentivadorCultural, usuarioNFSe, senhaNFSe, senhaWS, observacoes) SELECT estabelecimento, indicadorAmbienteNfse, regimeEspecialTributacao, incentivadorCultural, usuarioNFSe, senhaNFSe, ' ', observacoes FROM PAESTABELECIMENTOXNFSE_2501 WHERE estabelecimento > 0;

COMMIT;

/

create or replace PROCEDURE ADD_DOC_FISC_INFO_SISTEMA_CRIA (
  p_exclusivo                    IN VARCHAR2,
  p_paf                          IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER)
IS
  v_entradaSaida                 CHAR(1);
  v_modeloDocumentoFiscal        CHAR(2);
  v_indicadorConsumidorFinal     CHAR(1);
  v_regimeTributario             CHAR(1);
  v_md5                          VARCHAR(32);
  v_documentoFiscalRefProduto    NUMBER;
  v_dataEmissaoRefProduto        DATE;
  v_documentoFiscalRefServico    NUMBER;
  v_dataEmissaoRefServico        DATE;
  v_valorPagamentoBruto          NUMBER;
  v_creditoSimplesNacional       NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_valorFCP                     NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpostos        NUMBER;
  v_possui_1913                  NUMBER;
  v_possui_5912                  NUMBER;
  v_motorista                    NUMBER;
  v_motoristaNomeRazaoSocial     VARCHAR2(60);
BEGIN
  SELECT
    cab.entradaSaida,
    cab.modeloDocumentoFiscal,
    cab.indicadorConsumidorFinal,
    cab.valorPagamentoBruto,
    pess.regimeTributario
  INTO
    v_entradaSaida,
    v_modeloDocumentoFiscal,
    v_indicadorConsumidorFinal,
    v_valorPagamentoBruto,
    v_regimeTributario
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = est.pessoaEstabelecimento
  WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal;
  IF p_paf = 1
    AND FUNC_ADD_BUSCA_CONFIG (322, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S'
  THEN
    SELECT COALESCE (MAX (md5PAFECF), ' ')
    INTO v_md5
    FROM SIPAFLAUDO
    WHERE idLaudo = 1;
    DELETE MODOCFISCALXINFOCOMPLEMEN
    WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND geradoPeloSistema = 1
    AND descInformacaoComplementar LIKE 'MD5:%';
  ELSE
    v_md5 := ' ';
  END IF;
  SELECT
    COALESCE (MAX (docRef.documentoFiscal), 0),
    MAX (TRUNC (doc.dataEmissao))
  INTO
    v_documentoFiscalRefProduto,
    v_dataEmissaoRefProduto
  FROM MODOCFISCALXITENS item
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = item.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN MODOCUMENTOSFISCAIS doc
  ON doc.idDocumentoFiscal = item.idDocumentoFiscal
  JOIN MOENTREGAS entr
  ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  JOIN MODOCFISCALXDOCFISCAL docXDoc
  ON docXDoc.idItemDocFiscal = item.idItemDocFiscal
  JOIN MODOCFISCALXITENS itemRef
  ON itemRef.idItemDocFiscal = docXDoc.idItemDocFiscalReferenciado
  JOIN MODOCUMENTOSFISCAIS docRef
  ON docRef.idDocumentoFiscal = itemRef.idDocumentoFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND prod.tipoProduto <> '09'
  AND doc.entradaSaida = 'S'
  AND doc.devolucaoAnulacaoRetorno = 0
  AND docRef.entradaSaida = 'S'
  AND docRef.devolucaoAnulacaoRetorno = 0;
  SELECT
    COALESCE (MAX (docRef.documentoFiscal), 0),
    MAX (TRUNC (doc.dataEmissao))
  INTO
    v_documentoFiscalRefServico,
    v_dataEmissaoRefServico
  FROM MODOCFISCALXITENS item
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = item.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN MODOCUMENTOSFISCAIS doc
  ON doc.idDocumentoFiscal = item.idDocumentoFiscal
  JOIN MOENTREGAS entr
  ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  JOIN MODOCFISCALXDOCFISCAL docXDoc
  ON docXDoc.idItemDocFiscal = item.idItemDocFiscal
  JOIN MODOCFISCALXITENS itemRef
  ON itemRef.idItemDocFiscal = docXDoc.idItemDocFiscalReferenciado
  JOIN MODOCUMENTOSFISCAIS docRef
  ON docRef.idDocumentoFiscal = itemRef.idDocumentoFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND prod.tipoProduto = '09'
  AND doc.entradaSaida = 'S'
  AND doc.devolucaoAnulacaoRetorno = 0
  AND docRef.entradaSaida = 'S'
  AND docRef.devolucaoAnulacaoRetorno = 0;
  SELECT
    COALESCE (MAX (item.creditoSimplesNacional), 0),
    COALESCE (SUM (item.valorCreditoSimplesNacional), 0),
    COALESCE (SUM (item.valorFCP), 0),
    COALESCE (SUM (item.valorFCPUFDestinatario), 0),
    COALESCE (SUM (item.valorICMSUFDestinatario), 0),
    COALESCE (SUM (item.valorICMSUFRemetente), 0),
    COALESCE (SUM (item.baseEstimadaImpostos), 0),
    COALESCE (SUM (item.valorEstimadoImpFederais + item.valorEstimadoImpEstaduais + item.valorEstimadoImpMunicipais), 0),
    COALESCE (MAX (CASE WHEN cfop IN (1913, 2913) THEN 1 ELSE 0 END), 0),
    COALESCE (MAX (CASE WHEN cfop IN (5912, 6912) THEN 1 ELSE 0 END), 0),
    COALESCE (MAX (entr.motorista), 0)
  INTO
    v_creditoSimplesNacional,
    v_valorCreditoSimplesNacional,
    v_valorFCP,
    v_valorFCPUFDestinatario,
    v_valorICMSUFDestinatario,
    v_valorICMSUFRemetente,
    v_baseEstimadaImpostos,
    v_valorEstimadoImpostos,
    v_possui_1913,
    v_possui_5912,
    v_motorista
  FROM MODOCFISCALXITENS item
  LEFT JOIN MOENTREGAS entr
  ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND item.cancelado = 0;
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'NF-e Ref.:%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP: R$';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS Interestadual para a UF de destino: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS Interestadual para a UF do remetente: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor Aproximado Tributos: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Venda destinada a consumidor final sem fins comerciais.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Nota de transporte referente a nota de antecipação de faturamento%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Nota de transporte referente a nota de serviço%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Permite aproveitamento de credito de ICMS no valor de R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Mercadoria remetida para demonstracao.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Imposto suspenso nos termos do Ajuste SINIEF 02/18.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Motorista:%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND informacaoComplementar > 0;
  DELETE MODOCFISCALXINFOCOMPLEMEN
  WHERE IdDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND imprimir = 1
  AND informacaoComplementar = 0
  AND (descInformacaoComplementar LIKE 'P%R$%'
    OR descInformacaoComplementar LIKE 'T%R$%')
  AND SUBSTR(descInformacaoComplementar,2,1) BETWEEN '1' AND '9';
  IF v_md5 <> ' ' THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'MD5: ' || RTRIM(v_md5));
  END IF;
  IF v_modeloDocumentoFiscal <> '58' THEN
    FOR a IN (
      SELECT chaveNfe
      FROM MODOCFISCALXNFREF
      WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND chaveNfe <> ' ')
    LOOP      
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'NF-e Ref.: '
        || SUBSTR(a.chaveNfe,1,2)
        || '-' || SUBSTR(a.chaveNfe,3,4)
        || '-' || SUBSTR(a.chaveNfe,7,2)
        || '.' || SUBSTR(a.chaveNfe,9,3)
        || '.' || SUBSTR(a.chaveNfe,12,3)
        || '/' || SUBSTR(a.chaveNfe,15,4)
        || '-' || SUBSTR(a.chaveNfe,19,2)
        || '-' || SUBSTR(a.chaveNfe,21,2)
        || '-' || SUBSTR(a.chaveNfe,23,3)
        || '-' || SUBSTR(a.chaveNfe,26,3)
        || '.' || SUBSTR(a.chaveNfe,29,3)
        || '.' || SUBSTR(a.chaveNfe,32,3)
        || '-' || SUBSTR(a.chaveNfe,35,3)
        || '.' || SUBSTR(a.chaveNfe,38,3)
        || '.' || SUBSTR(a.chaveNfe,41,3)
        || '-' || SUBSTR(a.chaveNfe,44,1));
    END LOOP;
  END IF;
  IF v_valorFCP > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP: R$ ' || TRIM (TO_CHAR (v_valorFCP, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorFCPUFDestinatario > 0 THEN  
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$ ' || TRIM (TO_CHAR (v_valorFCPUFDestinatario, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS Interestadual para a UF de destino: R$ ' || TRIM (TO_CHAR (v_valorICMSUFDestinatario, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS Interestadual para a UF do remetente: R$ ' || TRIM (TO_CHAR (v_valorICMSUFRemetente, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorEstimadoImpostos > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor Aproximado Tributos: R$ ' || TRIM (TO_CHAR (v_valorEstimadoImpostos, 'FM999G999G999G999G999G990D00')) || ' (' || CASE WHEN v_baseEstimadaImpostos = 0 THEN '0,00' ELSE TRIM (TO_CHAR (100* ROUND(v_valorEstimadoImpostos / v_baseEstimadaImpostos,2), 'FM999G999G999G999G999G990D00')) END || '%) Fonte: IBPT.');
  END IF;
  IF v_entradaSaida = 'S'
    AND v_indicadorConsumidorFinal = '1'
  THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Venda destinada a consumidor final sem fins comerciais.');
  END IF;
  IF v_documentoFiscalRefProduto > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Nota de transporte referente a nota de antecipação de faturamento ' || TRIM (TO_CHAR (v_documentoFiscalRefProduto)) || CASE WHEN v_dataEmissaoRefProduto IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRefProduto,'DD/MM/YYYY') END || '.');
  END IF;
  IF v_documentoFiscalRefServico > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Nota de transporte referente a nota de serviço ' || TRIM (TO_CHAR (v_documentoFiscalRefServico)) || CASE WHEN v_dataEmissaoRefServico IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRefServico,'DD/MM/YYYY') END || '.');
  END IF;
  IF v_regimeTributario IN ('1','2') AND v_valorCreditoSimplesNacional > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Permite aproveitamento de credito de ICMS no valor de R$ ' || TRIM (TO_CHAR (v_valorCreditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || ', correspondente a aliquota de ' || TRIM (TO_CHAR (v_creditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || '%, nos termos do art. 23 da LC. 123, de 2006.');
  END IF;
  IF v_regimeTributario IN ('1','2') THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.');
  END IF;
  FOR obs IN (
    SELECT
      a.informacaoComplementar,
      a.descInformacaoComplementar
    FROM PAINFORMACOESCOMPLEMENTAR a
    WHERE a.informacaoComplementar > 0
    AND (
      EXISTS (
        SELECT 1
        FROM MODOCFISCALXITENS item
        JOIN PAOPERFISCALXINFOCOMPLEM opXInfo
        ON opXInfo.operacaoFiscal = item.operacaoFiscal
        WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
        AND item.cancelado = 0
        AND item.operacaoFiscal > 0
        AND opXInfo.informacaoComplementar = a.informacaoComplementar)
      OR EXISTS (
        SELECT 1
        FROM MODOCUMENTOSFISCAIS cab
        JOIN MODOCFISCALXITENS item
        ON item.idDocumentoFiscal = cab.idDocumentoFiscal
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = item.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAESTABELECIMENTOS est
        ON est.estabelecimento = cab.idDocumentoFiscal
        LEFT JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        JOIN SIMUNICIPIOS munEst
        ON munEst.municipio = COALESCE(endEst.municipio,0)
        LEFT JOIN CAENDERECOSPESSOA endPess
        ON endPess.pessoa = cab.pessoa
        AND endPess.ativo = 1 AND
        endPess.principal = 1
        JOIN SIMUNICIPIOS munPess
        ON munPess.municipio = COALESCE(endPess.municipio,0)
        WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal
        AND item.cancelado = 0
        AND a.informacaoComplementar = 
          FUNC_ADD_BUSCA_INFO_DESON (
            cab.tipoDocumento,
            cab.entradaSaida,
            cab.estabelecimento,
            cab.pessoa,
            cab.vendaConsumidor,
            munEst.uf,
            munPess.uf,
            item.stICMS,
            gradProd.produto,
            prod.origemMercadoria,
            prod.idNcm)))
    ORDER BY a.informacaoComplementar)
  LOOP
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      obs.informacaoComplementar,
      obs.descInformacaoComplementar);
  END LOOP;
  IF v_possui_5912 = 1 THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Mercadoria remetida para demonstracao.');
  END IF;
  IF v_possui_5912 = 1 OR v_possui_1913 = 1 THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Imposto suspenso nos termos do Ajuste SINIEF 02/18.');
  END IF;
  IF v_motorista <> 0 THEN
    SELECT COALESCE (MAX (nomeRazaoSocial), ' ')
    INTO v_motoristaNomeRazaoSocial
    FROM CAPESSOAS
    WHERE pessoa = v_motorista;
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Motorista: ' || TRIM (v_motoristaNomeRazaoSocial));
  END IF;
  IF p_exclusivo = 'BITELO' THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'ATENÇÃO: 
CONFIRA A MERCADORIA NO ATO DA ENTREGA, OS MATERIAIS SERÃO DESCARREGADOS AO LADO DO CAMINHÃO. 
DÚVIDAS E RECLAMAÇÕES SOBRE ENTREGAS LIGAR PARA (51) 3497-7589.');
  END IF;
  IF p_exclusivo = 'DC' THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Declaro que o produto acima se encontra em perfeito estado, não constando nenhum dano físico, ou avarias, e, sobretudo com número de série idêntico ao da embalagem e com todos os acessórios e itens que o acompanham, bem como sua embalagem também em perfeito estado.

______________________________
    Assinatura do Recebido
    CPF/RG:');
  END IF;
  IF v_modeloDocumentoFiscal = '55'
    AND v_valorPagamentoBruto > 0
    AND FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S' THEN
    ADD_DOC_FISC_INFO_PAG_DOC_FISC (
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      p_cab_idDocumentoFiscal,
      0);
  END IF;
END ADD_DOC_FISC_INFO_SISTEMA_CRIA;

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativ_dataInicio              IN DATE,
  p_ativ_dataTermino             IN DATE,
  p_idFichaProdutoPrevOrcamento  IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      COALESCE ((
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MOORCAMENTOXFICHAPRODREAL b
            WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
            AND b.zerarSaldo = 1)
          THEN 0
         ELSE a.quantidade - COALESCE ((
            SELECT SUM (b.quantidade)
            FROM MOORCAMENTOXFICHAPRODREAL b
            WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento), 0)
        END), 0) quantidadeSaldo,
      a.observacoes,
      locEst.indicadorPropriedadePosseItem,
      gradProd.produto,
      prod.controleEstoque,
      ativPrev.idItemOrcamento
    FROM MOORCAMENTOXFICHAPRODPREV a
    JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
    ON ativPrev.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idFichaProdutoPrevOrcamento = p_idFichaProdutoPrevOrcamento)
  LOOP
    UPDATE MOORCAMENTOXFICHAPRODPREV b
    SET b.quantidadeSaldo = a.quantidadeSaldo
    WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento;
    IF a.entradaSaida = 'E' THEN
      UPDATE MOORCAMENTOXITENS b
      SET b.quantidadeSaldo = COALESCE ((
        SELECT SUM (fichPrev.quantidadeSaldo)
        FROM MOORCAMENTOXATIVIDADEPREV ativPrev
        JOIN MOORCAMENTOXFICHAPRODPREV fichPrev
        ON fichPrev.idAtividadePrevOrcamento = ativPrev.idAtividadePrevOrcamento
        WHERE ativPrev.idItemOrcamento = b.idItemOrcamento
        AND fichPrev.entradaSaida = 'E'), 0)
      WHERE b.idItemOrcamento = a.idItemOrcamento;  
    END IF;
    ADD_RESERVA_ESTOQUE_ORC_FIC_PR (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_modeloDocumento,
      p_ativ_dataInicio,
      p_ativ_dataTermino,
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeSaldo,
      a.observacoes,
      a.indicadorPropriedadePosseItem,
      a.produto,
      a.controleEstoque,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_PREV_FIC_SA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativPrev_idAtividadePrevOrc  IN NUMBER,
  p_ativPrev_dataInicio          IN DATE,
  p_ativPrev_dataTermino         IN DATE,
  p_ativReal_idAtividadeRealOrc  IN NUMBER,
  p_ativReal_dataTermino         IN DATE,
  p_ativReal_modeloDocumento     IN NUMBER,
  p_ativReal_motivoEstoque       IN NUMBER,  
  p_proporcao                    IN NUMBER,
  p_quantidadeEntrada            IN NUMBER,
  p_zerarSaldo                   IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_ordenacao                   NUMBER;
  v_idFichaProdutoRealOrcamento NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_ordenacao := 0;
  ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
    p_ativReal_idAtividadeRealOrc,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      locEst.indicadorPropriedadePosseItem,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar,
      0 precoCustoOperacao,
      0 totalCustoOperacao,
      0 precoCMV,
      0 valorCMV,
      a.observacoes,
      CASE WHEN a.entradaSaida = 'E' THEN modDoc.atualizaCustoMedio ELSE 0 END atualizaCustoMedio,
      CASE WHEN a.entradaSaida = 'E' THEN modDoc.atualizaUltimaCompra ELSE 0 END atualizaUltimaCompra,
      a.produto,
      a.controleEstoque
    FROM (
      SELECT
        a.idFichaProdutoPrevOrcamento,
        a.ordenacao,
        a.entradaSaida,
        a.localEstoque,
        a.gradeProduto,
        a.personalizacao,
        a.idLoteEstoque,
        CASE
          WHEN p_quantidadeEntrada > 0
            AND a.entradaSaida = 'E'
          THEN p_quantidadeEntrada
          ELSE ROUND (CASE
            WHEN EXISTS (
              SELECT 1
              FROM MOORCAMENTOXFICHAPRODREAL b
              WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
              AND b.zerarSaldo = 1)
            THEN 0
            ELSE a.quantidade - COALESCE ((
              SELECT SUM (b.quantidade)
              FROM MOORCAMENTOXFICHAPRODREAL b
              WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento), 0)
          END * p_proporcao, TO_NUMBER (uniMed.casasDecimaisUnidadeMedida))
        END quantidadeBaixar,
        a.observacoes,
        gradProd.produto,
        prod.controleEstoque
      FROM MOORCAMENTOXFICHAPRODPREV a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed
      ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE a.idAtividadePrevOrcamento = p_ativPrev_idAtividadePrevOrc
      AND a.quantidadeSaldo > 0) a
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = p_ativReal_modeloDocumento
    WHERE a.quantidadeBaixar > 0
    ORDER BY a.ordenacao)
  LOOP
    v_ordenacao := v_ordenacao + 1;
    ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idFichaProdutoRealOrcamento
      p_ativReal_idAtividadeRealOrc,
      v_ordenacao,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.idFichaProdutoPrevOrcamento,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar, -- quantidade
      p_zerarSaldo,
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      v_idFichaProdutoRealOrcamento);
    ADD_ESTOQUE_ORCAMENTO_FIC_PROD (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_ativReal_idAtividadeRealOrc,
      p_ativReal_dataTermino,
      p_ativReal_modeloDocumento,
      p_ativReal_motivoEstoque,
      v_idFichaProdutoRealOrcamento,
      a.gradeProduto,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar, -- quantidade
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.indicadorPropriedadePosseItem,
      a.produto,
      a.controleEstoque,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
    ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_modeloDocumento,
      p_ativPrev_dataInicio,
      p_ativPrev_dataTermino,
      a.idFichaProdutoPrevOrcamento,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_REAL_FIC_GE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_AT (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idFichaProdutoRealOrcamento  IN NUMBER,
  p_idAtividadeRealOrcamento     IN NUMBER,
  p_ordenacao                    IN NUMBER,
  p_atualizaCustoMedio           IN NUMBER,
  p_atualizaUltimaCompra         IN NUMBER,
  p_entradaSaida                 IN CHAR,
  p_localEstoque                 IN NUMBER,
  p_idFichaProdutoPrevOrcamento  IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_personalizacao               IN NUMBER,
  p_idLoteEstoque                IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_zerarSaldo                   IN NUMBER,
  p_precoCustoOperacao           IN NUMBER,
  p_totalCustoOperacao           IN NUMBER,
  p_precoCMV                     IN NUMBER,
  p_valorCMV                     IN NUMBER,
  p_observacoes                  IN VARCHAR2,
  /* Retornos */
  r_idFichaProdutoRealOrcamento  OUT NUMBER)
IS
  v_cab_estabelecimento        NUMBER;
  v_cab_dataEmissao            DATE;
  v_cab_dataEntrega            DATE;
  v_item_modeloDocumento       NUMBER;
  v_ativPrev_dataInicio        DATE;
  v_ativPrev_dataTermino       DATE;
  v_ativReal_dataTermino       DATE;
  v_ativReal_modeloDocumento   NUMBER;
  v_ativReal_motivoEstoque     NUMBER;
  v_locEst_indicProprPosseItem CHAR (1);
  v_gradProd_produto           NUMBER;
  v_prod_controleEstoque       NUMBER;
  v_bufferIdReservaEstoque     VARCHAR2 (32000);
  v_bufferIdEstoque            VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0),
    MAX (ativPrev.dataInicio),
    MAX (ativPrev.dataTermino),
    MAX (ativReal.dataTermino),
    COALESCE (MAX (ativReal.modeloDocumento), 0),
    COALESCE (MAX (ativReal.motivoEstoque), 0),
    COALESCE (MAX (gradProd.produto), 0),
    COALESCE (MAX (prod.controleEstoque), 0),
    COALESCE (MAX (locEst.indicadorPropriedadePosseItem), ' ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento,
    v_ativPrev_dataInicio,
    v_ativPrev_dataTermino,
    v_ativReal_dataTermino,
    v_ativReal_modeloDocumento,
    v_ativReal_motivoEstoque,
    v_locEst_indicProprPosseItem,
    v_gradProd_produto,
    v_prod_controleEstoque
  FROM MOORCAMENTOXATIVIDADEREAL ativReal
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = p_localEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = p_gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
  ON ativPrev.idAtividadePrevOrcamento = ativReal.idAtividadePrevOrcamento
  JOIN MOORCAMENTOXITENS item
  ON item.idItemOrcamento = ativPrev.idItemOrcamento
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE ativReal.idAtividadeRealOrcamento = p_idAtividadeRealOrcamento;
  ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idFichaProdutoRealOrcamento,
    p_idAtividadeRealOrcamento,
    p_ordenacao,
    p_atualizaCustoMedio,
    p_atualizaUltimaCompra,
    p_entradaSaida,
    p_localEstoque,
    p_idFichaProdutoPrevOrcamento,
    p_gradeProduto,
    p_personalizacao,
    p_idLoteEstoque,
    p_quantidade,
    p_zerarSaldo,
    p_precoCustoOperacao,
    p_totalCustoOperacao,
    p_precoCMV,
    p_valorCMV,
    p_observacoes,
    r_idFichaProdutoRealOrcamento);
  ADD_ESTOQUE_ORCAMENTO_FIC_PROD (
    p_sys_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_354_estabProximoId,
    p_config_362_calcCustoPorGrade,
    v_cab_estabelecimento,
    p_idAtividadeRealOrcamento,
    v_ativReal_dataTermino,
    v_ativReal_modeloDocumento,
    v_ativReal_motivoEstoque,
    r_idFichaProdutoRealOrcamento,
    p_gradeProduto,
    p_atualizaCustoMedio,
    p_atualizaUltimaCompra,
    p_entradaSaida,
    p_localEstoque,
    p_personalizacao,
    p_idLoteEstoque,
    p_quantidade,
    p_precoCustoOperacao,
    p_totalCustoOperacao,
    p_precoCMV,
    p_valorCMV,
    p_observacoes,
    v_locEst_indicProprPosseItem,
    v_gradProd_produto,
    v_prod_controleEstoque,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  IF p_idFichaProdutoPrevOrcamento > 0 THEN
    ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      v_ativPrev_dataInicio,
      v_ativPrev_dataTermino,
      p_idFichaProdutoPrevOrcamento,
      v_bufferIdReservaEstoque,
      v_bufferIdReservaEstoque);
  END IF;
END ADD_ORCAMENTO_ITEM_REAL_FIC_AT;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_FIC_AT (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idFichaProdutoPrevOrcamento IN NUMBER,
  p_idAtividadePrevOrcamento    IN NUMBER,
  p_ordenacao                   IN NUMBER,
  p_entradaSaida                IN CHAR,
  p_localEstoque                IN NUMBER,
  p_gradeProduto                IN NUMBER,
  p_personalizacao              IN NUMBER,
  p_idLoteEstoque               IN NUMBER,
  p_quantidade                  IN NUMBER,
  p_quantidadeSaldo             IN NUMBER,
  p_observacoes                 IN VARCHAR2,
  /* Retornos */
  r_idFichaProdutoPrevOrcamento OUT NUMBER)
IS
  v_cab_estabelecimento    NUMBER;
  v_cab_dataEmissao        DATE;
  v_cab_dataEntrega        DATE;
  v_item_modeloDocumento   NUMBER;
  v_ativPrev_dataInicio    DATE;
  v_ativPrev_dataTermino   DATE;
  v_bufferIdReservaEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque  := '';
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0),
    MAX (ativPrev.dataInicio),
    MAX (ativPrev.dataTermino)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento,
    v_ativPrev_dataInicio,
    v_ativPrev_dataTermino
  FROM MOORCAMENTOXATIVIDADEPREV ativPrev
  JOIN MOORCAMENTOXITENS item
  ON item.idItemOrcamento = ativPrev.idItemOrcamento
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE ativPrev.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento;
  ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_idFichaProdutoPrevOrcamento,
    p_idAtividadePrevOrcamento,
    p_ordenacao,
    p_entradaSaida,
    p_localEstoque,
    p_gradeProduto,
    p_personalizacao,
    p_idLoteEstoque,
    p_quantidade,
    p_quantidadeSaldo,
    p_observacoes,
    r_idFichaProdutoPrevOrcamento);
  ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento,
    v_ativPrev_dataInicio,
    v_ativPrev_dataTermino,
    p_idFichaProdutoPrevOrcamento,
    v_bufferIdReservaEstoque,
    v_bufferIdReservaEstoque);
END ADD_ORCAMENTO_ITEM_PREV_FIC_AT;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_EC (
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_idFichaProdutoRealOrcamento IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
  v_bufferIdEstoque        VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  v_bufferIdEstoque        := '';
  FOR A IN (
    SELECT
      cab.estabelecimento cab_estabelecimento,
      cab.dataEmissao cab_dataEmissao,
      cab.dataEntrega cab_dataEntrega,
      item.modeloDocumento item_modeloDocumento,
      ativPrev.dataInicio ativPrev_dataInicio,
      ativPrev.dataTermino ativPrev_dataTermino,
      a.idFichaProdutoPrevOrcamento
    FROM MOORCAMENTOXFICHAPRODREAL a
    JOIN MOORCAMENTOXATIVIDADEREAL ativReal
    ON ativReal.idAtividadeRealOrcamento = a.idAtividadeRealOrcamento
    JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
    ON ativPrev.idAtividadePrevOrcamento = ativReal.idAtividadePrevOrcamento
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = ativPrev.idItemOrcamento
    JOIN MOORCAMENTOS cab
    ON cab.orcamento = item.orcamento
    WHERE a.idFichaProdutoRealOrcamento = p_idFichaProdutoRealOrcamento)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
      p_idFichaProdutoRealOrcamento,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    IF a.idFichaProdutoPrevOrcamento > 0 THEN
      ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        a.cab_estabelecimento,
        a.cab_dataEmissao,
        a.cab_dataEntrega,
        a.item_modeloDocumento,
        a.ativPrev_dataInicio,
        a.ativPrev_dataTermino,
        a.idFichaProdutoPrevOrcamento,
        v_bufferIdReservaEstoque,
        v_bufferIdReservaEstoque);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_REAL_FIC_EC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_real_idAtividadeRealPerda    OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
  v_auxNumber                   NUMBER;
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  r_real_idAtividadeRealPerda    := 0;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF p_previsto_realizado = 'R'
    OR p_real_idAtividadeRealOrcament > 0
    OR p_prev_statusAtividadeServico IN ('C','E','I')
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0 THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico = 'E'
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico <> 'E')
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          r_real_idAtividadeRealPerda,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealPerda);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealPerda,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        NULL, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        p_real_modeloDocumento,
        p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        v_auxNumber);
      v_atualizarStatusPrevisto := 1;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF p_servico_producao = 'S'
    AND (i_prev_faturarAtividade <> p_prev_faturarAtividade
      OR i_prev_precoUnitario <> p_prev_precoUnitario
      OR i_prev_statusAtividadeServico = 'C'
      AND p_prev_statusAtividadeServico <> 'C'
      OR i_prev_statusAtividadeServico <> 'C'
      AND p_prev_statusAtividadeServico = 'C'
      OR p_prev_faturarAtividade = 'R'
      AND (p_previsto_realizado='R'
        AND (i_real_statusAtividadeServico = 'C'
          AND p_real_statusAtividadeServico <> 'C'
          OR i_real_statusAtividadeServico <> 'C'
          AND p_real_statusAtividadeServico = 'C')
        OR i_real_quantidade <> p_real_quantidade)
      OR p_prev_faturarAtividade <> 'R'
      AND i_prev_quantidade <> p_prev_quantidade)
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_REABRE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativ_idAtividadePrevOrcament IN NUMBER,
  p_ativ_dataInicio              IN DATE,
  p_ativ_dataTermino             IN DATE,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  r_bufferIdEstoque        := p_bufferIdEstoque;
  FOR a IN (
    SELECT idAtividadeRealOrcamento
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
	  AND idAtividadeRealOrcamento > 0)
  LOOP
    ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
      a.idAtividadeRealOrcamento,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.quantidade,
      ativPrev.idItemOrcamento
    FROM MOORCAMENTOXFICHAPRODPREV a
    JOIN MOORCAMENTOXATIVIDADEPREV ativPrev
    ON ativPrev.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
    WHERE a.idAtividadePrevOrcamento = p_ativ_idAtividadePrevOrcament
	  AND a.idFichaProdutoPrevOrcamento > 0)
  LOOP
    FOR b IN (
      SELECT b.idFichaProdutoRealOrcamento
      FROM MOORCAMENTOXFICHAPRODREAL b
      WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
      AND b.idFichaProdutoRealOrcamento > 0)
    LOOP
      ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
        b.idFichaProdutoRealOrcamento,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    END LOOP;
    UPDATE MOORCAMENTOXFICHAPRODPREV b
    SET b.quantidadeSaldo = a.quantidade
    WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento;
    IF a.entradaSaida = 'E' THEN
      UPDATE MOORCAMENTOXITENS b
      SET b.quantidadeSaldo = COALESCE ((
        SELECT SUM (fichPrev.quantidadeSaldo)
        FROM MOORCAMENTOXATIVIDADEPREV ativPrev
        JOIN MOORCAMENTOXFICHAPRODPREV fichPrev
        ON fichPrev.idAtividadePrevOrcamento = ativPrev.idAtividadePrevOrcamento
        WHERE ativPrev.idItemOrcamento = b.idItemOrcamento
        AND fichPrev.entradaSaida = 'E'), 0)
      WHERE b.idItemOrcamento = a.idItemOrcamento;  
    END IF;
    ADD_RESERVA_ESTOQUE_FIC_EXCLUI (
      a.idFichaProdutoPrevOrcamento,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
  ADD_RESERVA_ESTOQUE_ORC_FICHA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_cab_estabelecimento,
    p_cab_dataEmissao,
    p_cab_dataEntrega,
    p_item_modeloDocumento,
    p_ativ_idAtividadePrevOrcament,
    p_ativ_dataInicio,
    p_ativ_dataTermino,
    r_bufferIdReservaEstoque,
    r_bufferIdReservaEstoque);
END ADD_ORCAMENTO_ITEM_PREV_REABRE;

/

DELETE SISERVICOSNFSE WHERE id = 4309100020;
DELETE SISERVICOSNFSE WHERE id = 4308607020;

-- Município: 4302105 - Bento Gonçalves - RS
-- Empresa: Elotech
-- Tecnologia: 5 - Elotech
-- Versão: Abrasf 2.03
-- Assinar: InfDeclaracaoPrestacaoServico, InfPedidoCancelamento
-- Síncrono

UPDATE SIMUNICIPIOS SET tecnologiaNFSe = 5, certificadoDigitalAcessoSite = 0, versaoNFSe = '2.03' WHERE municipio = 4302105;

DELETE SISERVICOSNFSE WHERE id IN (4302105000, 4302105020, 4302105100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4302105000, 4302105, 'EnviarLoteRps', ' ', 'https://bentogoncalves.oxy.elotech.com.br/iss-ws/nfseService', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nfse="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd"><soapenv:Body>', '</soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsResposta', ' ' , ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4302105020, 4302105, 'ConsultarLoteRps', ' ', 'https://bentogoncalves.oxy.elotech.com.br/iss-ws/nfseService', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nfse="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd"><soapenv:Body>', '</soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio xmlns="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd"><IdentificacaoRequerente><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><Senha><!$MG_senhaWS></Senha><Homologa>false</Homologa></IdentificacaoRequerente><NumeroLote><!$MG_protocolo></NumeroLote></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4302105100, 4302105, 'CancelarNfse', ' ', 'https://bentogoncalves.oxy.elotech.com.br/iss-ws/nfseService', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nfse="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd"><soapenv:Body>', '</soapenv:Body></soapenv:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio xmlns="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd"><IdentificacaoRequerente><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><Senha><!$MG_senhaWS></Senha><Homologa>false</Homologa></IdentificacaoRequerente><Pedido><InfPedidoCancelamento Id="C<!$MG_numeroNFSe>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><ChaveAcesso><!$MG_chaveNFe></ChaveAcesso><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>',  ' ');

COMMIT;

UPDATE SIREGIMESESPECIAISTRIBUT SET descricao = '5 Microempresário Individual (MEI)' WHERE regimeEspecialTributacao = '5';
UPDATE SIREGIMESESPECIAISTRIBUT SET descricao = '6 Microempresário e Empresa de Pequeno Porte (ME EPP)' WHERE regimeEspecialTributacao = '6';

COMMIT;


exec dbms_utility.compile_schema('ADDERI');
exec dbms_stats.gather_schema_stats('ADDERI');

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2025001001, '2025.1.1', TO_DATE ('18/02/2025', 'DD/MM/YYYY'), 1, 1, sysdate, 'BETA 1');

COMMIT;

-- FIM BETA 1 - 18/02/2025

create or replace FUNCTION FUNC_ADD_BUSCA_DESCR_SERVICO (
  p_idDocumentoFiscal IN NUMBER)
  RETURN VARCHAR
IS
  v_descricaoServico VARCHAR (32000);
BEGIN
  SELECT COALESCE (MAX (docXServ.descricaoServico), ' ')
  INTO v_descricaoServico
  FROM MODOCFISCALXSERVICO docXServ
  WHERE docXServ.idDocumentoFiscal = p_idDocumentoFiscal;
  IF v_descricaoServico = ' ' THEN
    SELECT COALESCE (SUBSTR (TRIM (LISTAGG (a.descricao, '
')
    WITHIN GROUP (ORDER BY a.sequencia)), 1, 2000), ' ')
    INTO v_descricaoServico
    FROM (
      SELECT
        TRIM (TRIM (gradProd.descricaoImpressa)) ||
          CASE
            WHEN item.observacoes = ' '
            THEN ''
            ELSE '
' || TRIM (item.observacoes)
          END  ||
          CASE
            WHEN item.pedidoCompraFornecedor = ' '
            THEN ''
            ELSE '
Pedido Fornecedor: ' || TRIM (item.pedidoCompraFornecedor) ||
            CASE
              WHEN item.sequenciaPedidoCompraFornec = 0
              THEN ''
              ELSE ' / ' || TO_CHAR (item.sequenciaPedidoCompraFornec)
            END
          END descricao,
        MIN (item.sequencia) sequencia
      FROM MODOCFISCALXITENS item
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
      AND item.cancelado = 0
      GROUP BY
        gradProd.descricaoImpressa,
        item.observacoes,
        item.pedidoCompraFornecedor,
        item.sequenciaPedidoCompraFornec) a;
  END IF;
  RETURN v_descricaoServico;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_ESTOQUE_GERENC (
  p_dataPosicaoEstoque          IN DATE,   -- Obrigatório
  p_estabelecimento             IN NUMBER, -- Obrigatório
  p_indicadorPropriedadePosseIt IN CHAR,   -- Enviar ' ' para todos
  p_pessoaParticipante          IN NUMBER, -- Enviar -1 para todos
  p_localEstoque                IN NUMBER, -- Enviar -1 para todos
  p_gradeProduto                IN NUMBER, -- Obrigatório
  p_personalizacao              IN NUMBER, -- Enviar -1 para todos
  p_idLoteEstoque               IN NUMBER, -- Enviar -1 para todos
  p_idNumeroSerie               IN NUMBER, -- Enviar -1 para todos
  p_tipoDocumentoDesconsiderar  IN CHAR,   -- D = Documento Fiscal, I = Inventário Estoque, P = Pré-Documento
  p_idDocumentoDesconsiderar    IN NUMBER) -- D = idDocumentoFiscal, I = inventarioEstoque, P = preDocumento
RETURN NUMBER
IS
  v_gradProd_produto          NUMBER;
  v_prod_controleEstoque      NUMBER;
  v_idInventarioEstoque       NUMBER;
  v_dataInventario            DATE;
  v_dataPosicaoEstoqueInicial DATE;
  v_quantidadeInventario      NUMBER;
  v_quantidadeEstoque         NUMBER;
  v_quantidadeDocumentoFiscal NUMBER;
  v_quantidadePreDocumento    NUMBER;
BEGIN
  v_quantidadeInventario      := 0;
  v_quantidadeEstoque         := 0;
  v_quantidadeDocumentoFiscal := 0;
  v_quantidadePreDocumento    := 0;
  SELECT
    gradProd.produto,
    prod.controleEstoque
  INTO
    v_gradProd_produto,
    v_prod_controleEstoque
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_gradeProduto;
  -- KIT / COMBO
  IF v_prod_controleEstoque IN (3,4) THEN
    -- Busca estoque do item filho com menor estoque
    SELECT COALESCE((
      SELECT MIN (TRUNC ((FUNC_ADD_BUSCA_ESTOQUE_GERENC (
        p_dataPosicaoEstoque,
        p_estabelecimento,
        p_indicadorPropriedadePosseIt,
        p_pessoaParticipante,
        p_localEstoque,
        kit.gradeProdutoFilho,
        -1,
        -1,
        -1,
        p_tipoDocumentoDesconsiderar,
        p_idDocumentoDesconsiderar) / kit.quantidade), uniMedPai.casasDecimaisUnidadeMedida))
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProdFilho
      ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prodFilho
      ON prodFilho.produto = gradProdFilho.produto
      JOIN CAGRADESPRODUTO gradProdPai
      ON gradProdPai.gradeProduto = kit.gradeProduto
      JOIN CAPRODUTOS prodPai
      ON prodPai.produto = gradProdPai.produto
      JOIN SIUNIDADESMEDIDA uniMedPai
      ON uniMedPai.unidadeMedida = prodPai.unidadeMedida
      WHERE kit.gradeProduto = p_gradeProduto
      AND kit.ativo = 1
      AND kit.quantidade > 0
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND prodFilho.controleEstoque IN (1,3,4,5,6,11,12)), 0)
    INTO v_quantidadeEstoque
    FROM DUAL;
  -- DEMAIS PRODUTOS (EXCETO KIT / COMBO)
  ELSIF v_prod_controleEstoque IN (1,5,6,11,12) THEN
    -- v_idInventarioEstoque / v_dataInventario
    SELECT
      TO_NUMBER(SUBSTR(a.ordenacao,9,14)), 
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD')
    INTO
      v_idInventarioEstoque,
      v_dataInventario
    FROM (
      SELECT
        COALESCE(MAX(TO_CHAR(TRUNC(inv.data),'YYYYMMDD')
          || LPAD (inv.inventarioEstoque,14,'0')),'1900010100000000000000') ordenacao
      FROM MOINVENTARIOSESTOQUE inv
      WHERE inv.estabelecimento = p_estabelecimento
      AND inv.inventarioEstoque <> 0
      AND (p_tipoDocumentoDesconsiderar <> 'I'
        OR inv.inventarioEstoque <> p_idDocumentoDesconsiderar)
      AND inv.data < TRUNC(p_dataPosicaoEstoque)
        + CASE WHEN p_tipoDocumentoDesconsiderar <> 'I' AND inv.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
      AND (inv.motivoInventarioEstoque = '01'
        OR EXISTS (
          SELECT 1
          FROM MOINVENTARIOESTOQUEXITENS itemInv
          WHERE itemInv.inventarioEstoque = inv.inventarioEstoque
          AND itemInv.produto = v_gradProd_produto))) a;
    -- v_dataPosicaoEstoqueInicial
    SELECT COALESCE ((
      SELECT MAX (est.data)
        FROM MOESTOQUES est
        WHERE est.produto = v_gradProd_produto
        AND est.estabelecimento = p_estabelecimento
        AND est.operacaoInternaEstoque = 1
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND (v_idInventarioEstoque <= 0
		  OR est.data >= TRUNC(v_dataInventario)+1)),
      CASE
        WHEN v_idInventarioEstoque > 0 AND NOT (v_dataInventario IS NULL)
        THEN TRUNC (v_dataInventario) + 1
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END)
    INTO v_dataPosicaoEstoqueInicial
    FROM DUAL;
    -- v_quantidadeInventario
    IF v_idInventarioEstoque > 0 THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade)
        FROM MOINVENTARIOESTOQUEXITENS est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE est.inventarioEstoque = v_idInventarioEstoque
        AND est.gradeProduto = p_gradeProduto
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeInventario
      FROM DUAL;
    END IF;
    -- v_quantidadeEstoque
    IF TRUNC (v_dataPosicaoEstoqueInicial) <= TRUNC (p_dataPosicaoEstoque) THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOESTOQUES est
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data >= TRUNC (v_dataPosicaoEstoqueInicial)
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeEstoque
      FROM DUAL;
    END IF;
    -- v_quantidadeDocumentoFiscal
    IF p_tipoDocumentoDesconsiderar = 'D' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MODOCFISCALXITENS itemDoc
        JOIN MODOCFISCALXESTOQUE docXEst
        ON docXEst.idItemDocFiscal = itemDoc.idItemDocFiscal
        JOIN MOESTOQUES est
        ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.idDocumentoFiscal = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadeDocumentoFiscal
      FROM DUAL;
    END IF;
    -- v_quantidadePreDocumento
    IF p_tipoDocumentoDesconsiderar = 'P' AND p_idDocumentoDesconsiderar > 0 THEN
      SELECT COALESCE ((
        SELECT SUM (est.quantidade * CASE WHEN est.entradaSaida = 'S' THEN (-1) ELSE 1 END)
        FROM MOPREDOCUMXITENS itemDoc
        JOIN MOPREDOCUMXESTOQUE docXEst
        ON docXEst.idItemPreDocumento = itemDoc.idItemPreDocumento
        JOIN MOESTOQUES est
        ON est.idEstoque = docXEst.idEstoque
        JOIN PALOCAISESTOQUE locEst
        ON locEst.localEstoque = est.localEstoque
        WHERE itemDoc.preDocumento = p_idDocumentoDesconsiderar
        AND est.gradeProduto = p_gradeProduto
        AND est.estabelecimento = p_estabelecimento
        AND est.data < TRUNC (p_dataPosicaoEstoque) + 1
        AND est.indicadorPropriedadePosseItem = p_indicadorPropriedadePosseIt
        AND est.pessoaParticipante = p_pessoaParticipante
        AND (p_localEstoque < 0
		      AND locEst.validoEstoqueTotal = 1
		      OR est.localEstoque = p_localEstoque)
        AND (p_personalizacao < 0
		      OR est.personalizacao = p_personalizacao)
        AND (p_idLoteEstoque < 0
		      OR est.idLoteEstoque = p_idLoteEstoque)
        AND (p_idNumeroSerie < 0
		      OR est.idNumeroSerie = p_idNumeroSerie)),0)
      INTO v_quantidadePreDocumento
      FROM DUAL;
    END IF;
  END IF;
  RETURN
    v_quantidadeInventario
    + v_quantidadeEstoque
    - v_quantidadeDocumentoFiscal
    - v_quantidadePreDocumento;
END;

/

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (181, '62', '62 - Dress', 204, 1, 62, ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('24/03/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 2' WHERE idVersaoSistema = 2025001001;

COMMIT;

-- FIM BETA 2 - 24/03/2025

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_ativPrev_idAtividadePrevOrc  IN NUMBER,
  p_ativPrev_dataInicio          IN DATE,
  p_ativPrev_dataTermino         IN DATE,
  p_ativReal_idAtividadeRealOrc  IN NUMBER,
  p_ativReal_dataTermino         IN DATE,
  p_ativReal_modeloDocumento     IN NUMBER,
  p_ativReal_motivoEstoque       IN NUMBER,  
  p_proporcao                    IN NUMBER,
  p_quantidadeEntrada            IN NUMBER,
  p_zerarSaldo                   IN NUMBER,
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_bufferIdEstoque              IN VARCHAR2,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_ordenacao                   NUMBER;
  v_idFichaProdutoRealOrcamento NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_ordenacao := 0;
  ADD_ORCAMENTO_ITEM_REAL_FIC_EX (
    p_ativReal_idAtividadeRealOrc,
    r_bufferIdEstoque,
    r_bufferIdEstoque);
  FOR a IN (
    SELECT
      a.idFichaProdutoPrevOrcamento,
      a.entradaSaida,
      a.localEstoque,
      locEst.indicadorPropriedadePosseItem,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar,
      0 precoCustoOperacao,
      0 totalCustoOperacao,
      0 precoCMV,
      0 valorCMV,
      a.observacoes,
      CASE WHEN a.entradaSaida = 'E' THEN modDoc.atualizaCustoMedio ELSE 0 END atualizaCustoMedio,
      CASE WHEN a.entradaSaida = 'E' THEN modDoc.atualizaUltimaCompra ELSE 0 END atualizaUltimaCompra,
      a.produto,
      a.controleEstoque
    FROM (
      SELECT
        a.idFichaProdutoPrevOrcamento,
        a.ordenacao,
        a.entradaSaida,
        a.localEstoque,
        a.gradeProduto,
        a.personalizacao,
        a.idLoteEstoque,
        CASE
          WHEN p_quantidadeEntrada > 0
            AND a.entradaSaida = 'E'
          THEN p_quantidadeEntrada
          WHEN EXISTS (
            SELECT 1
            FROM MOORCAMENTOXFICHAPRODREAL b
            WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento
            AND b.zerarSaldo = 1)
          THEN 0
          WHEN ROUND (a.quantidade * p_proporcao, TO_NUMBER (uniMed.casasDecimaisUnidadeMedida)) < ROUND (a.quantidade - COALESCE ((
            SELECT SUM (b.quantidade)
            FROM MOORCAMENTOXFICHAPRODREAL b
            WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento), 0), TO_NUMBER (uniMed.casasDecimaisUnidadeMedida))
          THEN ROUND (a.quantidade * p_proporcao, TO_NUMBER (uniMed.casasDecimaisUnidadeMedida))
          ELSE ROUND (a.quantidade - COALESCE ((
            SELECT SUM (b.quantidade)
            FROM MOORCAMENTOXFICHAPRODREAL b
            WHERE b.idFichaProdutoPrevOrcamento = a.idFichaProdutoPrevOrcamento), 0), TO_NUMBER (uniMed.casasDecimaisUnidadeMedida))
        END quantidadeBaixar,
        a.observacoes,
        gradProd.produto,
        prod.controleEstoque
      FROM MOORCAMENTOXFICHAPRODPREV a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA uniMed
      ON uniMed.unidadeMedida = prod.unidadeMedida
      WHERE a.idAtividadePrevOrcamento = p_ativPrev_idAtividadePrevOrc
      AND a.quantidadeSaldo > 0) a
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = p_ativReal_modeloDocumento
    WHERE a.quantidadeBaixar > 0
    ORDER BY a.ordenacao)
  LOOP
    v_ordenacao := v_ordenacao + 1;
    ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      0, -- p_idFichaProdutoRealOrcamento
      p_ativReal_idAtividadeRealOrc,
      v_ordenacao,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.idFichaProdutoPrevOrcamento,
      a.gradeProduto,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar, -- quantidade
      p_zerarSaldo,
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      v_idFichaProdutoRealOrcamento);
    ADD_ESTOQUE_ORCAMENTO_FIC_PROD (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_ativReal_idAtividadeRealOrc,
      p_ativReal_dataTermino,
      p_ativReal_modeloDocumento,
      p_ativReal_motivoEstoque,
      v_idFichaProdutoRealOrcamento,
      a.gradeProduto,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.quantidadeBaixar, -- quantidade
      a.precoCustoOperacao,
      a.totalCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.indicadorPropriedadePosseItem,
      a.produto,
      a.controleEstoque,
      r_bufferIdEstoque,
      r_bufferIdEstoque);
    ADD_ORCAMENTO_ITEM_PREV_FIC_SA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_item_modeloDocumento,
      p_ativPrev_dataInicio,
      p_ativPrev_dataTermino,
      a.idFichaProdutoPrevOrcamento,
      r_bufferIdReservaEstoque,
      r_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_ITEM_REAL_FIC_GE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- C = Painel de Compras, 'F' Fatura Contrato, L = Lista Evento, O = Orçamento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_mensagemAviso                IN VARCHAR,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_orcamento               IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_ambiente                IN NUMBER,
  p_item_ambienteObservacoes     IN VARCHAR2,
  p_item_vinculoItemDocumento    IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_statusAtividadeServico  IN CHAR,
  p_item_controleEntrega         IN NUMBER,
  p_item_dataEntrega             IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_atividadeProjeto        IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       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_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_idAtividadesPrevistasSelec   IN VARCHAR2,
  p_nivel                        IN NUMBER,
  p_buffer_idItemOrcamento       IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_idItemOrcamento       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_finalidadeNota           CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_controleEntrega          NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_valorISSQN               NUMBER;
  v_ini_valorRetIRRF             NUMBER;
  v_ini_valorRetINSS             NUMBER;
  v_ini_valorRetPIS              NUMBER;
  v_ini_valorRetCOFINS           NUMBER;
  v_ini_valorRetCSLL             NUMBER;
  v_ini_valorRetOutros           NUMBER;
  v_ini_contrEntr_habilitaFrete  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeSaldo         NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorFreteGeral         NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_residuoISSQN            NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_residuoRetIRRF          NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_residuoRetINSS          NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_residuoRetPIS           NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_residuoRetCOFINS        NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_residuoRetCSLL          NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_residuoRetOutros        NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_contrEntr_habilitaFrete      NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemOrcamento       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_ativ_criouPendenteIniciado   NUMBER;
  v_ativ_idAtividadePrevOrcamen  NUMBER;
  v_ativ_sequencia               NUMBER;
  v_ativ_tecnico                 NUMBER;
  v_ativ_checklist               NUMBER;
  v_ativ_gradeProdutoXFichaAtiv  NUMBER;
  v_ativ_idAtividadeRealOrcament NUMBER;
  v_ativ_idFichaProdutoPrevOrcam NUMBER;
  v_ativ_ordenacaoFichaProdutoPr NUMBER;
  v_ativ_atualizaCustoMedio      NUMBER;
  v_ativ_atualizaUltimaCompra    NUMBER;
  v_ativ_selecionaAtividadePrev  NUMBER;
  v_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          NUMBER;
  v_ativ_geraFinanceiro          NUMBER;
  v_valorFreteRegra              NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := p_mensagemAviso;
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemOrcamento := p_item_idItemOrcamento;
  r_buffer_idItemOrcamento := p_buffer_idItemOrcamento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.transportadora,
    cab.enderecoTransportadora,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_finalidadeNota,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_transportadora,
    v_cab_enderecoTransportadora,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.orcamento = p_item_orcamento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_controleEntrega          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_valorISSQN               := 0;
  v_ini_valorRetIRRF             := 0;
  v_ini_valorRetINSS             := 0;
  v_ini_valorRetPIS              := 0;
  v_ini_valorRetCOFINS           := 0;
  v_ini_valorRetCSLL             := 0;
  v_ini_valorRetOutros           := 0;
  v_ini_contrEntr_habilitaFrete  := 0;
  v_item_quantidadeSaldo         := p_item_quantidade;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorFreteGeral         := p_item_valorFreteGeral;
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_residuoISSQN            := 0;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_residuoRetIRRF          := 0;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_residuoRetINSS          := 0;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_residuoRetPIS           := 0;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_residuoRetCOFINS        := 0;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_residuoRetCSLL          := 0;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_residuoRetOutros        := 0;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  v_contrEntr_habilitaFrete      := 0;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOORCAMENTOXPROMOCOES
    WHERE orcamento = p_item_orcamento;
  END IF;
  IF p_item_idItemOrcamento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeSaldo,
        a.controleEntrega,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        prod.tipoProduto,
        b.habilitaFrete
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA b
      ON b.controleEntrega = a.controleEntrega
      WHERE a.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_controleEntrega := a.controleEntrega;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_valorISSQN := a.valorISSQN;
      v_ini_valorRetIRRF := a.valorRetIRRF;
      v_ini_valorRetINSS := a.valorRetINSS;
      v_ini_valorRetPIS := a.valorRetPIS;
      v_ini_valorRetCOFINS := a.valorRetCOFINS;
      v_ini_valorRetCSLL := a.valorRetCSLL;
      v_ini_valorRetOutros := a.valorRetOutros;
      v_ini_contrEntr_habilitaFrete := 0;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_contrEntr_habilitaFrete := a.habilitaFrete;
      IF p_buscarAliquotas_CalcularImp = 'T' THEN
        IF p_buscarGeraFinanceiroEstoque = 1 THEN
          v_item_movimentaEstoque        := a.movimentaEstoque;
          v_item_geraFinanceiro          := a.geraFinanceiro;
        END IF;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF a.cancelado = 0 THEN
        v_item_quantidadeSaldo := v_item_quantidadeSaldo + a.quantidadeSaldo - a.quantidade;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> v_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    v_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = 'E'
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_sys_perfilUsuarioLogado,
        p_sys_usuarioLogado,
        v_cab_entradaSaida,
        0, -- v_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_ORCAMENTO_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_sys_usuarioLogado,
        p_sys_perfilUsuarioLogado,
        p_sys_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_config_430_sugerirUsuLogTec,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, 
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND (a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_mensagemAviso,
        r_calcularImpostos,
        0, -- p_item_idItemOrcamento
        p_item_orcamento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_ambiente,
        p_item_ambienteObservacoes,
        999, -- p_item_vinculoItemDocumento
        0, -- p_item_atividadeServico
        'A', -- p_item_statusAtividadeServico
        p_item_controleEntrega,
        p_item_dataEntrega,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idNumeroSerie
        p_item_atividadeProjeto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(v_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- v_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        ' ', -- p_idAtividadesPrevistasSelec
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_idItemOrcamento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemOrcamento)) >= 14
      LOOP
        v_ajuste_idItemOrcamento := TO_NUMBER(SUBSTR(r_buffer_idItemOrcamento,1,14));
        r_buffer_idItemOrcamento := RTRIM(SUBSTR(r_buffer_idItemOrcamento,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MOORCAMENTOXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemOrcamento = v_ajuste_idItemOrcamento;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MOORCAMENTOXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemOrcamento = v_ajuste_idItemOrcamento;
      END LOOP;
      UPDATE MOORCAMENTOS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE orcamento          = p_item_orcamento;
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemOrcamento <= 0 THEN
      r_item_idItemOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXITENS', 'idItemOrcamento', 14, p_sys_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF p_item_controleEntrega > 0 THEN
        SELECT habilitaFrete
        INTO v_contrEntr_habilitaFrete
        FROM PACONTROLESENTREGA
        WHERE controleEntrega = p_item_controleEntrega;
      END IF;
      IF
        CASE
          WHEN v_ini_controleEntrega = 0
            OR v_ini_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_ini_valorProdutoServicoBruto - v_ini_valorDescontoItem + v_ini_valorAcrescimoItem
        END <>
        CASE
          WHEN p_item_controleEntrega = 0
            OR v_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem
        END
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0, -- p_buscarESalvarInternamente
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_ini_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit,
          r_item_idItemOrcamento,
          p_item_pesoLiquido,
          p_item_pesoBruto,
          v_item_valorProdutoServicoBrut,
          p_item_valorDescontoItem,
          p_item_valorAcrescimoItem,
          p_item_controleEntrega,
          v_item_valorFreteGeral,
          v_contrEntr_habilitaFrete,
          /* Retornos */
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_valorFreteRegra,
          v_auxNumber);
        IF v_valorFreteRegra <> v_ini_cab_valorFreteGeral THEN
          v_item_valorFreteGeral := v_valorFreteRegra - v_cab_valorFreteGeral;
        END IF;
      ELSIF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        v_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        0, -- p_cab_vendaConsumidor
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_modDoc_movimentaEstoque,
        v_modDoc_geraFinanceiro,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_endPess_enderecoPessoa,
        v_munEndPess_uf,
        v_munEndEntr_uf,
        p_item_operacaoFiscal,
        v_gradProd_produto,
        v_prod_tipoProduto,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        p_item_movimentaEstoque,
        0, -- p_movimentaEstoqueFiscal
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_auxNumber, -- r_movimentaEstoqueFiscal
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar, -- r_item_stICMSEscrit
        v_auxNumber, -- r_item_reducaoBaseICMSEscrit
        v_auxNumber, -- r_item_aliquotaICMSEscrit
        v_auxNumber, -- r_item_diferimentoICMSEscritur
        v_auxNumber, -- r_item_margemValorAdicSTEscrit
        v_auxNumber, -- r_item_reducaoBaseSTEscrit
        v_auxNumber, -- r_item_aliquotaICMSSTEscrit
        v_auxNumber, -- r_item_somarICMSST
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        v_item_residuoISSQN,
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        v_item_residuoRetIRRF,
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        v_item_residuoRetINSS,
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        v_item_residuoRetPIS,
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        v_item_residuoRetCOFINS,
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        v_item_residuoRetCSLL,
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        v_item_residuoRetOutros,
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        0, -- p_valorIPIDevolucao
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        0, -- p_calcularICMSEscrituracao
        '  ', -- p_stICMSEscrituracao
        0, -- p_reducaoBaseICMSEscrituracao
        0, -- p_aliquotaICMSEscrituracao
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        0, -- p_calcularICMSSTEscrituracao
        0, -- p_margemValorAdicSTEscriturac
        0, -- p_reducaoBaseSTEscrituracao
        0, -- p_aliquotaICMSSTEscrituracao
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_residuoISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_residuoRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_residuoRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_residuoRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_residuoRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_residuoRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_residuoRetOutros,
        v_item_valorRetOutros,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber, -- r_baseICMSEscrituracao
        v_auxNumber, -- r_valorICMSEscrituracao
        v_auxNumber, -- r_valorICMSDesonEscrituracao
        v_auxNumber, -- r_baseICMSSTEscrituracao
        v_auxNumber, -- r_valorICMSSTEscrituracao
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    END IF;
    UPDATE MOORCAMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      transportadora                = v_cab_transportadora,
      enderecoTransportadora        = v_cab_enderecoTransportadora,
      ultimoVendedorItem            = v_cab_ultimoVendedorItem,
      quantidadeVolume              = v_cab_quantidadeVolume,
      quantidade                    = v_cab_quantidade,
      pesoLiquido                   = v_cab_pesoLiquido,
      pesoBruto                     = v_cab_pesoBruto,
      valorProdutosBruto            = v_cab_valorProdutosBruto,
      valorProdutos                 = v_cab_valorProdutos,
      valorDescontoProdutos         = v_cab_valorDescontoProdutos,
      valorAcrescimoProdutos        = v_cab_valorAcrescimoProdutos,
      valorServicosBruto            = v_cab_valorServicosBruto,
      valorServicos                 = v_cab_valorServicos,
      valorDescontoServicos         = v_cab_valorDescontoServicos,
      valorAcrescimoServicos        = v_cab_valorAcrescimoServicos,
      valorFreteItem                = v_cab_valorFreteItem,
      valorSeguroItem               = v_cab_valorSeguroItem,
      valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
      valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
      valorFreteGeral               = v_cab_valorFreteGeral,
      valorSeguroGeral              = v_cab_valorSeguroGeral,
      valorDescontoGeral            = v_cab_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_cab_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
      valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
      condicaoPagamento             = v_cab_condicaoPagamento,
      numeroParcelas                = v_cab_numeroParcelas,
      somaPrazoParcelas             = v_cab_somaPrazoParcelas,
      valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
      prazoMedio                    = v_cab_prazoMedio,
      prazoMedioPonderado           = v_cab_prazoMedioPonderado,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorEntradaMinima            = v_cab_valorEntradaMinima,
      valorAVistaEntrada            = v_cab_valorAVistaEntrada,
      valorPagamentoBruto           = v_cab_valorPagamentoBruto,
      valorDescontoPagamento        = v_cab_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPagamento,
      valorJurosPagamento           = v_cab_valorJurosPagamento,
      valorPagamentoLiquido         = v_cab_valorPagamentoLiquido,
      valorTroco                    = v_cab_valorTroco,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    IF v_item_valorISSQN <> v_ini_valorISSQN
      OR v_item_valorRetIRRF <> v_ini_valorRetIRRF
      OR v_item_valorRetINSS <> v_ini_valorRetINSS
      OR v_item_valorRetPIS <> v_ini_valorRetPIS
      OR v_item_valorRetCOFINS <> v_ini_valorRetCOFINS
      OR v_item_valorRetCSLL <> v_ini_valorRetCSLL
      OR v_item_valorRetOutros <> v_ini_valorRetOutros
    THEN
      r_calcularImpostos := 1;
    END IF;
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      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,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      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,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      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,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_sys_estabelecimentoAtivo,
          v_cab_tipoDocumento,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_sys_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_sys_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        0,
        v_auxNumber);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'O',
      r_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    UPDATE MOORCAMENTOXITENS
    SET observacoes = v_observacoes
    WHERE idItemOrcamento = r_item_idItemOrcamento;
    r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    r_valorInserido := v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
    THEN
      v_ativ_criouPendenteIniciado := 0;
      v_ativ_sequencia             := 0;
      v_ativ_tecnico               := 0;
      v_ativ_checklist             := 0;
      -- Atividades Previstas Ordem Serviço
      IF v_cab_tipoDocumento = 102
        AND p_item_atividadeServico > 0
      THEN
        SELECT
          habilitaAtividadePrevista,
          selecionaAtividadePrevista
        INTO
          v_auxNumber,
          v_ativ_selecionaAtividadePrev
        FROM PAATIVIDADESSERVICO
        WHERE atividadeServico = p_item_atividadeServico;
        IF p_config_430_sugerirUsuLogTec = 1 THEN
          SELECT COALESCE (MAX (tecnico), 0)
          INTO v_ativ_tecnico
          FROM CATECNICOS
          WHERE tecnico = p_sys_usuarioLogado
          AND ativo = 1;
        END IF;
        IF v_auxNumber = 1 THEN
          FOR a IN (
            SELECT
              a.atividadeServicoPrevista,
              a.tecnico,
              a.faturarAtividade,
              a.etapaAtividade,
              a.observacoes,
              COALESCE ((
                SELECT MAX (b.checklist)
                FROM (
                  SELECT
                    b.atividadeServico,
                    b.checklist,
                    ROW_NUMBER() OVER (
                      PARTITION BY b.atividadeServico
                      ORDER BY
                        b.atividadeServico,
                        b.ordenacao,
                        b.id) ordenacao
                  FROM PAATIVIDADESERVXCHECKLIST b
                  WHERE b.ativo = 1) b
                WHERE b.atividadeServico = a.atividadeServicoPrevista
                AND b.ordenacao = 1), 0) checklist,
              CASE ativ.gradeProduto
                WHEN 0
                THEN 0
                WHEN p_item_gradeProduto
                THEN v_item_precoUnitario
                ELSE FUNC_ADD_BUSCA_PRECO (
                  p_config_64_casasDecSaidas,
                  p_config_209_filtrarGrupoEcon,
                  p_config_362_calcCustoPorGrade,
                  p_sys_perfilUsuarioLogado,
                  p_sys_usuarioLogado,
                  v_cab_estabelecimento,
                  SYSDATE, -- p_cab_dataPrecoFinal
                  v_cab_pessoa,
                  v_munEndEst_uf,
                  v_munEndPess_uf,
                  p_item_vendedor,
                  0, -- p_item_idFormulaTinta
                  0, -- p_item_personalizacao
                  gradProd.produto,
                  gradProd.cor,
                  gradProd.tamanho,
                  prod.controleEstoque,
                  p_item_tipoPreco,
                  p_item_tabelaPreco)
              END precoUnitario
            FROM PAATIVIDADEOSXPREVISTA a
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = a.atividadeServicoPrevista
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE a.id > 0
            AND (v_ativ_selecionaAtividadePrev = 0
              AND a.atividadeServicoOs = p_item_atividadeServico
              AND a.ativo = 1
              AND a.sugestao = 1
              OR v_ativ_selecionaAtividadePrev = 1
              AND INSTR (',' || TRIM (p_idAtividadesPrevistasSelec) || ',', ',' || TO_CHAR (a.id) || ',') > 0)
            ORDER BY
              a.atividadeServicoOs,
              a.ordenacao,
              a.id)
          LOOP
            v_ativ_sequencia := v_ativ_sequencia + 1;
            ADD_ORCAMENTO_ITEM_PREV_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadePrevOrcamento
              r_item_idItemOrcamento,
              v_ativ_sequencia, -- p_sequencia
              a.atividadeServicoPrevista, -- p_atividadeServico
              ' ', -- p_descricao
              CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
              a.faturarAtividade, -- p_faturarAtividade
              a.checklist, -- p_checklist
              'I', -- p_tipoApontamento
              0, -- p_editaQuantidades
              a.etapaAtividade, -- p_etapaAtividade
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
              CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
              0, -- p_quantidade
              a.precoUnitario, -- p_precoUnitario
              a.observacoes, -- p_observacoes
              v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
            v_ativ_criouPendenteIniciado := 1;
            IF a.checklist > 0 THEN
              ADD_ORCAMENTO_ITEM_TAREF_GERA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                a.checklist); -- p_checklist
            END IF;
            IF v_ativ_criouPendenteIniciado = 0
              AND CASE WHEN a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END = p_sys_usuarioLogado
            THEN
              ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadeRealOrcamento
                v_ativ_idAtividadePrevOrcamen,
                1, -- p_sequencia
                a.atividadeServicoPrevista, -- p_atividadeServico
                ' ', -- p_descricao
                CASE WHEN v_ativ_criouPendenteIniciado = 0 AND a.tecnico = 0 THEN v_ativ_tecnico ELSE a.tecnico END, -- p_tecnico
                'I', -- p_statusAtividadeServico
                SYSDATE, -- p_dataInicio
                NULL, -- p_dataTermino
                p_item_modeloDocumento,
                0, -- p_motivoEstoque
                0, -- p_quantidade
                ' ', -- p_observacoes
                /* Retornos */
                v_ativ_idAtividadeRealOrcament);
            END IF;
          END LOOP;
          IF v_ativ_sequencia = 0
            AND v_ativ_selecionaAtividadePrev = 0
          THEN
            SELECT COALESCE (MAX (validoPrevisto), 0)
            INTO v_auxNumber
            FROM PAATIVIDADESSERVICO
            WHERE atividadeServico = p_item_atividadeServico;
            IF v_auxNumber = 1 THEN
              SELECT COALESCE (MAX (c.checklist),0)
              INTO v_ativ_checklist
              FROM (
                SELECT
                  b.checklist,
                  ROW_NUMBER() OVER (
                    ORDER BY
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.atividadeServico = p_item_atividadeServico
                AND b.ativo = 1) c
              WHERE c.ordenacao = 1;
              v_ativ_sequencia := v_ativ_sequencia + 1;
              ADD_ORCAMENTO_ITEM_PREV_GRAVA (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idAtividadePrevOrcamento
                r_item_idItemOrcamento,
                v_ativ_sequencia,  -- p_sequencia
                p_item_atividadeServico, -- p_atividadeServico
                ' ', -- p_descricao
                v_ativ_tecnico, -- p_tecnico
                'N', -- p_faturarAtividade
                v_ativ_checklist, -- p_checklist
                'I', -- p_tipoApontamento
                0, -- p_editaQuantidades
                0, -- p_etapaAtividade
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN CASE WHEN v_ativ_tecnico = p_sys_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END, -- p_statusAtividadeServico
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataInicio
                CASE WHEN v_ativ_criouPendenteIniciado = 0 THEN SYSDATE ELSE NULL END, -- p_dataTermino
                0, -- p_quantidade
                v_item_precoUnitario, -- p_precoUnitario
                ' ', -- p_observacoes
                v_ativ_idAtividadePrevOrcamen);  -- r_idAtividadePrevOrcamento
              v_ativ_criouPendenteIniciado := 1;
              IF v_ativ_checklist > 0 THEN
                ADD_ORCAMENTO_ITEM_TAREF_GERA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
                  v_ativ_checklist); -- p_checklist
              END IF;
              IF v_ativ_criouPendenteIniciado = 0
                AND v_ativ_tecnico = p_sys_usuarioLogado
              THEN
                ADD_ORCAMENTO_ITEM_REAL_GRAVA (
                  p_sys_estabelecimentoAtivo,
                  p_config_354_estabProximoId,
                  0, -- p_idAtividadeRealOrcamento
                  v_ativ_idAtividadePrevOrcamen,
                  1, -- p_sequencia
                  p_item_atividadeServico, -- p_atividadeServico
                  ' ', -- p_descricao
                  v_ativ_tecnico, -- p_tecnico
                  'I', -- p_statusAtividadeServico
                  SYSDATE, -- p_dataInicio
                  NULL, -- p_dataTermino
                  p_item_modeloDocumento,
                  0, -- p_motivoEstoque
                  0, -- p_quantidade
                  ' ', -- p_observacoes
                  /* Retornos */
                  v_ativ_idAtividadeRealOrcament);
              END IF;
            END IF;
          END IF;
        END IF;
        -- Se inseriu Atividades Previstas
        IF v_ativ_sequencia > 0 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            v_ativ_geraFinanceiro := 1;
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
              MIN (prev.precoUnitario) precoUnitarioMenor,
              MAX (prev.precoUnitario) precoUnitarioMaior,
              SUM (ROUND (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
            INTO
              v_ativ_numero,
              v_ativ_quantidade,
              v_ativ_precoUnitarioMenor,
              v_ativ_precoUnitario,
              v_ativ_valorTotalItem
            FROM MOORCAMENTOXATIVIDADEPREV prev
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = prev.atividadeServico
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C'
            AND ativ.gradeProduto > 0
            AND prod.unidadeMedida = v_prod_unidadeMedida;
            IF v_ativ_numero > 0 THEN
              v_ativ_geraFinanceiro := 0;
              IF v_ativ_numero > 1
                AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
                AND v_ativ_quantidade <> 0
              THEN
                v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
              END IF;
            END IF;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario
              OR v_ativ_geraFinanceiro <> v_item_geraFinanceiro)
          THEN
            ADD_ORCAMENTO_ITEM_GRAVA (
              ' ', -- p_sessaoClient
              p_sys_usuarioLogado,
              p_sys_perfilUsuarioLogado,
              p_sys_estabelecimentoAtivo,
              p_person_190_modeloFrete,
              p_config_64_casasDecSaidas,
              p_config_65_casasDecEntrada,
              p_config_198_obs_add_referenc,
              p_config_199_obs_add_caractA,
              p_config_200_obs_add_caractB,
              p_config_201_obs_add_caractC,
              p_config_202_obs_add_caractD,
              p_config_203_obs_add_caractE,
              p_config_209_filtrarGrupoEcon,
              p_config_354_estabProximoId,
              p_config_362_calcCustoPorGrade,
              p_config_378_calcularVolumes,
              p_config_413_obs_add_marca,
              p_config_418_obs_efetarEnter,
              p_config_430_sugerirUsuLogTec,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              ROUND (CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE v_ativ_quantidade / p_item_conversorQuantidade END
                ELSE 0
              END, 3), -- p_item_pecas
              v_ativ_quantidade,
              ROUND (CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade / p_item_conversorQuantidade END
                WHEN 5
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade * p_item_conversorQuantidade END
                ELSE v_ativ_quantidade
              END, 6), -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              v_item_valorFreteGeral,
              p_item_valorSeguroGeral,
              v_item_valorDescontoGeral,
              p_item_valorOutrasDespesasGer,
              p_item_valorAdicFreteMarGeral,
              p_item_valorDespesasAduanGeral,
              v_item_valorDescontoPagamento,
              v_item_valorOutrasDespPagament,
              v_item_valorJurosPagamento,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_ativ_geraFinanceiro,
              0, -- p_item_cfop
              ' ', -- p_item_indicadorISSQN
              0, -- p_item_aliquotaISSQN
              0, -- p_item_retidoISSQN
              0, -- p_item_tributadoForaMunicipio
              0, -- p_item_incentivoFiscal
              0, -- p_item_listaServicos
              0, -- p_item_cnae
              0, -- p_item_idServicoMunicipio
              ' ', -- p_item_numeroProcessoAdministr
              0, -- p_item_retencaoIRRF
              0, -- p_item_retencaoINSS
              0, -- p_item_retencaoPIS
              0, -- p_item_retencaoCOFINS
              0, -- p_item_retencaoCSLL
              0, -- p_item_retencaoOutros
              0, -- p_item_aliquotaII
              0, -- p_item_aliquotaIOF
              0, -- p_item_codigoEnquadramentoIPI
              0, -- p_item_stIPI
              0, -- p_item_aliquotaIPI
              0, -- p_item_valorAliquotaIPI
              ' ', -- p_item_stPIS
              0, -- p_item_aliquotaPIS
              0, -- p_item_valorAliquotaPIS
              0, -- p_item_aliquotaPISST
              0, -- p_item_valorAliquotaPISST
              ' ', -- p_item_stCOFINS
              0, -- p_item_aliquotaCOFINS
              0, -- p_item_valorAliquotaCOFINS
              0, -- p_item_aliquotaCOFINSST
              0, -- p_item_valorAliquotaCOFINSST
              '   ', -- p_item_stSimplesNacional
              0, -- p_item_creditoSimplesNacional
              '  ', -- p_item_stICMS
              0, -- p_item_modalBaseCalcICMS
              0, -- p_item_reducaoBaseICMS
              0, -- p_item_aliquotaICMS
              0, -- p_item_diferimentoICMS
              ' ', -- p_item_motivoDesoneracaoICMS
              0, -- p_item_idBeneficio
              ' ', -- p_item_modalBaseCalcICMSST
              0, -- p_item_margemValorAdicionadoST
              0, -- p_item_reducaoBaseST
              0, -- p_item_aliquotaICMSST
              0, -- p_item_aliquotaSTSuportConsFin
              0, -- p_item_reducaoBaseICMSEfetivo
              0, -- p_item_aliquotaICMSEfetivo
              0, -- p_item_aliquotaICMSUFDestinat
              0, -- p_item_aliquotaICMSInterestad
              0, -- p_item_partilhaICMSInterestad
              0, -- p_item_aliquotaFCP
              0, -- p_item_aliquotaFCPST
              0, -- p_item_aliquotaFCPSTAnteriorm
              0, -- p_item_aliquotaFCPUFDestinat
              0, -- p_item_aliquotaEstImpFederais
              0, -- p_item_aliquotaEstImpEstaduais
              0, -- p_item_aliquotaEstImpMunicipai
              0, -- p_item_baseISSQN
              0, -- p_item_valorISSQN
              0, -- p_item_baseRetIRRF
              0, -- p_item_valorRetIRRF
              0, -- p_item_baseRetINSS
              0, -- p_item_valorRetINSS
              0, -- p_item_baseRetPIS
              0, -- p_item_valorRetPIS
              0, -- p_item_baseRetCOFINS
              0, -- p_item_valorRetCOFINS
              0, -- p_item_baseRetCSLL
              0, -- p_item_valorRetCSLL
              0, -- p_item_baseRetOutros
              0, -- p_item_valorRetOutros
              0, -- p_item_baseII
              0, -- p_item_valorII
              0, -- p_item_baseIOF
              0, -- p_item_valorIOF
              0, -- p_item_baseIPI
              0, -- p_item_valorIPI
              0, -- p_item_basePIS
              0, -- p_item_valorPIS
              0, -- p_item_basePISST
              0, -- p_item_valorPISST
              0, -- p_item_baseCOFINS
              0, -- p_item_valorCOFINS
              0, -- p_item_baseCOFINSST
              0, -- p_item_valorCOFINSST
              0, -- p_item_baseCreditoSimplesNac
              0, -- p_item_valorCreditoSimplesNac
              0, -- p_item_baseICMS
              0, -- p_item_valorICMSOperacao
              0, -- p_item_valorICMSDiferido
              0, -- p_item_valorICMS
              0, -- p_item_valorICMSDesoneracao
              0, -- p_item_baseICMSST
              0, -- p_item_valorICMSST
              0, -- p_item_baseICMSSTAnteriormente
              0, -- p_item_valorICMSSTAnteriorment
              0, -- p_item_valorICMSProprioSubstit
              0, -- p_item_baseICMSEfetivo
              0, -- p_item_valorICMSEfetivo
              0, -- p_item_baseICMSUFDestinatario
              0, -- p_item_valorICMSUFDestinatario
              0, -- p_item_baseICMSUFRemetente
              0, -- p_item_valorICMSUFRemetente
              0, -- p_item_baseFCP
              0, -- p_item_valorFCP
              0, -- p_item_baseFCPST
              0, -- p_item_valorFCPST
              0, -- p_item_baseFCPSTAnteriormente
              0, -- p_item_valorFCPSTAnteriormente
              0, -- p_item_baseFCPUFDestinatario
              0, -- p_item_valorFCPUFDestinatario
              0, -- p_item_baseEstimadaImpostos
              0, -- p_item_valorEstImpFederais
              0, -- p_item_valorEstImpEstaduais
              0, -- p_item_valorEstImpMunicipais
              ' ', -- p_idAtividadesPrevistasSelec
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_idItemOrcamento
              v_auxNumber); -- r_valorInserido
          END IF;
          ADD_ORCAMENTO_ITEM_STATUS_CALC (r_item_idItemOrcamento);
        END IF;
      -- Atividades Previstas Ordem Produção
      ELSIF v_cab_tipoDocumento = 202
        AND v_prod_controleEstoque = 6
      THEN
        SELECT COALESCE (MAX (a.gradeProdutoXFichaAtividade), 0)
        INTO v_ativ_gradeProdutoXFichaAtiv
        FROM (
        SELECT
          ROW_NUMBER() OVER (ORDER BY ordenacao DESC) ordenacao,
          gradeProdutoXFichaAtividade  
        FROM CAGRADEPRODUTOXFICHAATIV
        WHERE gradeProduto = p_item_gradeProduto
        AND gradeProdutoXFichaAtividade > 0
        AND ativo = 1) a
        WHERE a.ordenacao = 1;
        FOR a IN (
          SELECT
            a.gradeProdutoXFichaAtividade,
            a.atividadeServico,
            a.tipoApontamento,
            a.editaQuantidades,
            a.quantidade,
            a.observacoes,
            COALESCE ((
              SELECT MAX (b.checklist)
              FROM (
                SELECT
                  b.atividadeServico,
                  b.checklist,
                  ROW_NUMBER() OVER (
                    PARTITION BY b.atividadeServico
                    ORDER BY
                      b.atividadeServico,
                      b.ordenacao,
                      b.id) ordenacao
                FROM PAATIVIDADESERVXCHECKLIST b
                WHERE b.ativo = 1) b
              WHERE b.atividadeServico = a.atividadeServico
              AND b.ordenacao = 1), 0) checklist,
            CASE ativ.gradeProduto
              WHEN 0
              THEN 0
              WHEN p_item_gradeProduto
              THEN v_item_precoUnitario
              ELSE FUNC_ADD_BUSCA_PRECO (
                p_config_64_casasDecSaidas,
                p_config_209_filtrarGrupoEcon,
                p_config_362_calcCustoPorGrade,
                p_sys_perfilUsuarioLogado,
                p_sys_usuarioLogado,
                v_cab_estabelecimento,
                SYSDATE, -- p_cab_dataPrecoFinal
                v_cab_pessoa,
                v_munEndEst_uf,
                v_munEndPess_uf,
                p_item_vendedor,
                0, -- p_item_idFormulaTinta
                0, -- p_item_personalizacao
                gradProd.produto,
                gradProd.cor,
                gradProd.tamanho,
                prod.controleEstoque,
                p_item_tipoPreco,
                p_item_tabelaPreco)
            END precoUnitario
          FROM CAGRADEPRODUTOXFICHAATIV a
          JOIN PAATIVIDADESSERVICO ativ
          ON ativ.atividadeServico = a.atividadeServico
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = ativ.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE a.gradeProduto = p_item_gradeProduto
          AND a.gradeProdutoXFichaAtividade > 0
          AND a.ativo = 1
          ORDER BY a.ordenacao)
        LOOP
          v_ativ_sequencia := v_ativ_sequencia + 1;
          ADD_ORCAMENTO_ITEM_PREV_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            0, -- p_idAtividadePrevOrcamento
            r_item_idItemOrcamento,
            v_ativ_sequencia, -- p_sequencia
            a.atividadeServico, -- p_atividadeServico
            ' ', -- p_descricao
            0, -- p_tecnico
            'N', -- p_faturarAtividade
            a.checklist, -- p_checklist
            a.tipoApontamento, -- p_tipoApontamento
            a.editaQuantidades, -- p_editaQuantidades
            0, -- p_etapaAtividade
            CASE WHEN a.tipoApontamento = 'N' THEN 'E' WHEN v_ativ_criouPendenteIniciado = 0 THEN 'P' ELSE 'A' END, -- p_statusAtividadeServico
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataInicio
            CASE WHEN a.tipoApontamento = 'N' THEN SYSDATE ELSE NULL END, -- p_dataTermino
            p_item_quantidade * a.quantidade, -- p_quantidade
            a.precoUnitario, -- p_precoUnitario
            a.observacoes, -- p_observacoes
            v_ativ_idAtividadePrevOrcamen); -- r_idAtividadePrevOrcamento
          IF a.checklist > 0 THEN
            ADD_ORCAMENTO_ITEM_TAREF_GERA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              v_ativ_idAtividadePrevOrcamen, -- r_idAtividadePrevOrcamento
              a.checklist); -- p_checklist
          END IF;
          IF a.tipoApontamento = 'N' THEN
            ADD_ORCAMENTO_ITEM_REAL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idAtividadeRealOrcamento
              v_ativ_idAtividadePrevOrcamen,
              1, -- p_sequencia
              a.atividadeServico, -- p_atividadeServico
              ' ', -- p_descricao
              0, -- p_tecnico
              'E', -- p_statusAtividadeServico
              SYSDATE, -- p_dataInicio
              SYSDATE, -- p_dataTermino
              p_item_modeloDocumento,
              0, -- p_motivoEstoque
              p_item_quantidade * a.quantidade, -- p_quantidade
              ' ', -- p_observacoes
              /* Retornos */
              v_ativ_idAtividadeRealOrcament);
          ELSE
            v_ativ_criouPendenteIniciado := 1;
          END IF;
          v_ativ_ordenacaoFichaProdutoPr := 0;
          IF a.gradeProdutoXFichaAtividade = v_ativ_gradeProdutoXFichaAtiv THEN
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'E', -- entradaSaida,
              p_item_localEstoque, -- p_localEstoque
              p_item_gradeProduto,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              p_item_quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE p_item_quantidade END, -- p_quantidadeSaldo
              V_observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              SELECT
                atualizaCustoMedio,
                atualizaUltimaCompra
              INTO
                v_ativ_atualizaCustoMedio,
                v_ativ_atualizaUltimaCompra
              FROM PAMODELOSDOCUMENTO
              WHERE modeloDocumento = p_item_modeloDocumento;
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                v_ativ_atualizaCustoMedio, -- p_atualizaCustoMedio
                v_ativ_atualizaUltimaCompra, -- p_atualizaUltimaCompra
                'E', -- p_entradaSaida,
                p_item_localEstoque, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                p_item_gradeProduto,
                p_item_personalizacao,
                p_item_idLoteEstoque,
                p_item_quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                v_observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
              UPDATE MOORCAMENTOXITENS
              SET quantidadeSaldo = 0
              WHERE idItemOrcamento = r_item_idItemOrcamento;
            END IF;
          END IF;
          FOR b IN (
            SELECT
              b.ordenacao,
              b.gradeProduto,
              b.quantidade,
              b.localEstoque,
              b.observacoes
            FROM CAGRADEPRODUTOXFICHAPROD b
            WHERE b.gradeProdutoXFichaAtividade = a.gradeProdutoXFichaAtividade
            AND b.id > 0
            AND b.ativo = 1
            ORDER BY b.ordenacao)
          LOOP
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'S', -- entradaSaida,
              CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
              b.gradeProduto,
              0, -- personalizacao,
              0, -- b.idLoteEstoque,
              p_item_quantidade * b.quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE p_item_quantidade * b.quantidade END, -- p_quantidadeSaldo
              b.observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                'S', -- p_entradaSaida,
                CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                b.gradeProduto,
                0, -- personalizacao,
                0, -- b.idLoteEstoque,
                p_item_quantidade * b.quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                b.observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
            END IF;
          END LOOP;
        END LOOP;
      END IF;
    END IF;
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      r_item_idItemOrcamento,
      '',
      '',
      v_auxVarchar,
      v_auxVarchar);
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_real_idAtividadeRealPerda    OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
  v_auxNumber                   NUMBER;
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  r_real_idAtividadeRealPerda    := 0;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF p_previsto_realizado = 'R'
    OR p_real_idAtividadeRealOrcament > 0
    OR p_prev_statusAtividadeServico IN ('C','E','I')
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0 THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico IN ('C','E')
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico NOT IN ('C','E'))
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          r_real_idAtividadeRealPerda,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealPerda);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealPerda,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        NULL, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        p_real_modeloDocumento,
        p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        v_auxNumber);
      v_atualizarStatusPrevisto := 1;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF p_servico_producao = 'S'
    AND (i_prev_faturarAtividade <> p_prev_faturarAtividade
      OR i_prev_precoUnitario <> p_prev_precoUnitario
      OR i_prev_statusAtividadeServico = 'C'
      AND p_prev_statusAtividadeServico <> 'C'
      OR i_prev_statusAtividadeServico <> 'C'
      AND p_prev_statusAtividadeServico = 'C'
      OR p_prev_faturarAtividade = 'R'
      AND (p_previsto_realizado='R'
        AND (i_real_statusAtividadeServico = 'C'
          AND p_real_statusAtividadeServico <> 'C'
          OR i_real_statusAtividadeServico <> 'C'
          AND p_real_statusAtividadeServico = 'C')
        OR i_real_quantidade <> p_real_quantidade)
      OR p_prev_faturarAtividade <> 'R'
      AND i_prev_quantidade <> p_prev_quantidade)
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

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

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

COMMIT;

create or replace FUNCTION FUNC_ADD_GERA_XML_ENVIO (
  p_config_425_addInfoComplNFSe IN NUMBER,
  p_idDocumentoFiscal           IN NUMBER,
  p_seqLoteWebServiceEnvio      IN NUMBER,
  p_loteWebService              IN VARCHAR)
  RETURN CLOB
IS
  v_xml                         CLOB;
  v_estab_nomeRazaoSocial       VARCHAR (60);
  v_estab_apelidoFantasia       VARCHAR (60);
  v_estab_indicadorPessoa       CHAR (1);
  v_estab_tipo                  VARCHAR (4);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR (20);
  v_estab_inscricaoEstadual     VARCHAR (14);
  v_estab_inscricaoMunicipal    VARCHAR (15);
  v_estab_logradouro            VARCHAR (60);
  v_estab_numero                VARCHAR (60);
  v_estab_complemento           VARCHAR (60);
  v_estab_bairroDistrito        VARCHAR (60);
  v_estab_municipio             VARCHAR (7);
  v_estab_municipioDescricao    VARCHAR (60);
  v_estab_uf                    CHAR (2);
  v_estab_cep                   CHAR (8);
  v_estab_pais                  VARCHAR (4);
  v_estab_paisDescricao         VARCHAR (60);
  v_estab_tecnologiaNfse        NUMBER;
  v_estab_fone                  VARCHAR (14);
  v_estab_fone2                 VARCHAR (14);
  v_estab_email                 VARCHAR (60);
  v_estab_site                  VARCHAR (60);
  v_estab_senhaWS               VARCHAR (256);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_estab_regimeTributario      CHAR (1);
  v_optanteSimplesNacional      CHAR (1);
  v_incentivadorCultural        CHAR (1);
  v_indicadorAmbienteNfse       CHAR (1);
  v_incentivoFiscal             CHAR (1);
  v_intermediario               NUMBER;
  v_pess_nomeRazaoSocial        VARCHAR (60);
  v_pess_apelidoFantasia        VARCHAR (60);
  v_pess_indicadorPessoa        CHAR (1);
  v_pess_tipo                   VARCHAR (4);
  v_pess_cnpjCpfIdEstrangeiro   VARCHAR (20);
  v_pess_inscricaoEstadual      VARCHAR (14);
  v_pess_inscricaoMunicipal     VARCHAR (15);
  v_pess_logradouro             VARCHAR (60);
  v_pess_numero                 VARCHAR (60);
  v_pess_complemento            VARCHAR (60);
  v_pess_bairroDistrito         VARCHAR (60);
  v_pess_municipio              VARCHAR (7);
  v_pess_municipioDescricao    VARCHAR (60);
  v_pess_uf                    CHAR (2);
  v_pess_cep                   CHAR (8);
  v_pess_pais                  VARCHAR (4);
  v_pess_paisDescricao         VARCHAR (60);
  v_pess_observacoesEndereco    VARCHAR (4000);
  v_pess_fone                   VARCHAR (14);
  v_pess_fone2                  VARCHAR (14);
  v_pess_email                  VARCHAR (60);
  v_entr_logradouro             VARCHAR (60);
  v_entr_numero                 VARCHAR (60);
  v_entr_complemento            VARCHAR (60);
  v_entr_bairroDistrito         VARCHAR (60);
  v_entr_municipio              VARCHAR (7);
  v_entr_municipioDescricao     VARCHAR (60);
  v_entr_cep                    CHAR (8);
  v_entr_uf                     CHAR (2);
  v_entr_pais                   VARCHAR (4);
  v_entr_paisDescricao          VARCHAR (60);
  v_interm_nomeRazaoSocial      VARCHAR (60);
  v_interm_indicadorPessoa      CHAR (1);
  v_interm_cnpjCpfIdEstrangeiro VARCHAR (20);
  v_interm_inscricaoMunicipal   VARCHAR (15);
  v_interm_logradouro           VARCHAR (60);
  v_interm_numero               VARCHAR (60);
  v_interm_complemento          VARCHAR (60);
  v_interm_bairroDistrito       VARCHAR (60);
  v_interm_municipio            VARCHAR (7);
  v_interm_cep                  CHAR (8);
  v_interm_fone                 VARCHAR (14);
  v_interm_email                VARCHAR (60);
  v_numeroRPS                   VARCHAR (15);
  v_serieFiscal                 VARCHAR (4);
  v_municipioFatoGerador        NUMBER;
  v_dataEmissao                 DATE;
  v_dataHoraEmissao             VARCHAR (20);
  v_dataCompetencia             VARCHAR (20);
  v_dataCompetenciaDDMMYYYY     VARCHAR (20);
  v_dataHoraCompetencia         VARCHAR (20);
  v_chaveNFe                    VARCHAR (60);
  v_numeroProcesso              VARCHAR (60);
  v_codigoObra                  VARCHAR (60);
  v_art                         VARCHAR (60);
  v_outrasInformacoes           VARCHAR (4000);
  v_descricaoServico            VARCHAR (4000);
  v_valorServicos               VARCHAR (20);
  v_valorTotal                  VARCHAR (20);
  v_valorLiquidoItem            NUMBER;
  v_aliquotaIssqn               VARCHAR (20);
  v_baseIssqn                   VARCHAR (20);
  v_valorIssqn                  VARCHAR (20);
  v_retencaoInss                VARCHAR (20);
  v_baseRetInss                 VARCHAR (20);
  v_valorRetInss                VARCHAR (20);
  v_retencaoIrrf                VARCHAR (20);
  v_baseRetIrrf                 VARCHAR (20);
  v_valorRetIrrf                VARCHAR (20);
  v_retencaoPis                 VARCHAR (20);
  v_baseRetPis                  VARCHAR (20);
  v_valorRetPis                 VARCHAR (20);
  v_retencaoCofins              VARCHAR (20);
  v_baseRetCofins               VARCHAR (20);
  v_valorRetCofins              VARCHAR (20);
  v_retencaoCsll                VARCHAR (20);
  v_baseRetCsll                 VARCHAR (20);
  v_valorRetCsll                VARCHAR (20);
  v_valorOutrasRetencoes        VARCHAR (20);
  v_stPis                       CHAR (2);
  v_aliquotaPis                 VARCHAR (20);
  v_basePis                     VARCHAR (20);
  v_valorPis                    VARCHAR (20);
  v_aliquotaCofins              VARCHAR (20);
  v_valorCofins                 VARCHAR (20);
  v_pisCofinsRetido             CHAR (1);
  v_percentualCargaTributariaFe VARCHAR (20);
  v_valorCargaTributariaFederal VARCHAR (20);
  v_percentualCargaTributariaEs VARCHAR (20);
  v_valorCargaTributariaEstad   VARCHAR (20);
  v_percentualCargaTributariaMu VARCHAR (20);
  v_valorCargaTributariaMunicip VARCHAR (20);
  v_valorDescontoTotal          VARCHAR (20);
  v_issRetido                   CHAR (1);
  v_tributadoForaMunicipio      CHAR (1);
  v_municipioIncidencia         VARCHAR (7);
  v_listaServicos               CHAR (5);
  v_cnae                        CHAR (7);
  v_codigoServicoMunicipio      VARCHAR (60);
  v_sequencia                   NUMBER;
  v_valor                       NUMBER;
  v_saldo                       NUMBER;
BEGIN
  WITH DOC AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      a.serieFiscal,
      a.documentoFiscal,
      a.dataEmissao,
      a.qrCode,
      a.enderecoEntregaPessoa,
      a.municipioFatoGerador,
      a.chaveNFe,
      est.pessoaEstabelecimento,
      docXServ.dataCompetencia,
      docxServ.intermediario,
      docxServ.numeroRPS,
      docxServ.numeroNFSe,
      docxServ.codigoVerificacaoNFSe,
      docXServ.idObra,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = est.pessoaEstabelecimento
        AND end.ativo = 1
        AND end.principal = 1), 0) endEst_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = est.pessoaEstabelecimento
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonEst_idFonePessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = est.pessoaEstabelecimento
        AND fon.ativo = 1
        AND fon.principal = 0), 0) fonEst2_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = est.pessoaEstabelecimento
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) siteEst_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = COALESCE (docXServ.intermediario, 0)
        AND end.ativo = 1
        AND end.principal = 1), 0) endInterm_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = COALESCE (docXServ.intermediario, 0)
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonInterm_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = COALESCE (docXServ.intermediario, 0)
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailInterm_idEmailPessoa,
      COALESCE ((
        SELECT MAX (end.enderecoPessoa)
        FROM CAENDERECOSPESSOA end
        WHERE end.pessoa = a.pessoa
        AND end.ativo = 1
        AND end.principal = 1), 0) endPess_enderecoPessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = a.pessoa
        AND fon.ativo = 1
        AND fon.principal = 1), 0) fonPess_idFonePessoa,
      COALESCE ((
        SELECT MAX (fon.idFonePessoa)
        FROM CAFONESPESSOA fon
        WHERE fon.pessoa = a.pessoa
        AND fon.ativo = 1
        AND fon.principal = 0), 0) fonPess2_idFonePessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 1), 0) emailPess_idEmailPessoa,
      COALESCE ((
        SELECT MAX (email.idEmailPessoa)
        FROM CAEMAILSPESSOA email
        WHERE email.pessoa = a.pessoa
        AND email.ativo = 1
        AND email.tipoEmailSite = 2), 0) sitePess_idEmailPessoa
    FROM MODOCUMENTOSFISCAIS a
    LEFT JOIN MODOCFISCALXSERVICO docXServ
    ON docXServ.idDocumentoFiscal = a.idDocumentoFiscal
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal),
  ITEM AS (
    SELECT
      COALESCE (MAX (a.incentivoFiscal), 0) incentivoFiscal,
      COALESCE (MAX (a.cnae), 0) cnae,
      COALESCE (MAX (a.numeroProcessoAdministrativo), ' ') numeroProcessoAdministrativo,
      COALESCE (MAX (a.tributadoForaMunicipio), 0) tributadoForaMunicipio,
      COALESCE (MAX (a.unidadeMedidaConversao), ' ') unidadeMedidaConversao,
      COALESCE (SUM (a.quantidadeConvertida), 0) quantidadeConvertida,
      COALESCE ((SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END) / CASE WHEN SUM (a.quantidadeConvertida) = 0 THEN 1 ELSE SUM (a.quantidadeConvertida) END), 0) precoUnitarioConvertido,
      COALESCE (SUM (a.valorProdutoServico + a.valorOutrasDespesasTotal - CASE WHEN endEst.municipio = 4309407 THEN a.valorDescontoTotal ELSE 0 END), 0) valorProdutoServico,
      COALESCE (SUM (CASE WHEN endEst.municipio = 4309407 THEN 0 ELSE a.valorDescontoTotal END), 0) valorDescontoTotal,
      COALESCE (SUM (a.valorOutrasDespesasTotal), 0) valorOutrasDespesasTotal,
      COALESCE (SUM (a.valorLiquidoItem), 0) valorLiquidoItem,
      COALESCE (MAX (a.indicadorIssqn), ' ') indicadorIssqn,
      COALESCE (MAX (a.aliquotaIssqn), 0) aliquotaIssqn,
      COALESCE (MAX (a.retidoIssqn), 0) retidoIssqn,
      COALESCE (MAX (a.listaServicos), 0) listaServicos,
      COALESCE (SUM (a.baseIssqn), 0) baseIssqn,
      COALESCE (SUM (a.valorIssqn), 0) valorIssqn,
      COALESCE (MAX (a.retencaoIrrf), 0) retencaoIrrf,
      COALESCE (SUM (a.baseRetIrrf), 0) baseRetIrrf,
      COALESCE (SUM (a.valorRetIrrf), 0) valorRetIrrf,
      COALESCE (MAX (a.retencaoInss), 0) retencaoInss,
      COALESCE (SUM (a.baseRetInss), 0) baseRetInss,
      COALESCE (SUM (a.valorRetInss), 0) valorRetInss,
      COALESCE (MAX (a.retencaoPis), 0) retencaoPis,
      COALESCE (SUM (a.baseRetPis), 0) baseRetPis,
      COALESCE (SUM (a.valorRetPis), 0) valorRetPis,
      COALESCE (MAX (a.retencaoCofins), 0) retencaoCofins,
      COALESCE (SUM (a.baseRetCofins), 0) baseRetCofins,
      COALESCE (SUM (a.valorRetCofins), 0) valorRetCofins,
      COALESCE (MAX (a.retencaoCsll), 0) retencaoCsll,
      COALESCE (SUM (a.baseRetCsll), 0) baseRetCsll,
      COALESCE (SUM (a.valorRetCsll), 0) valorRetCsll,
      COALESCE (SUM (a.valorRetOutros), 0) valorRetOutros,
      COALESCE (SUM (a.valorIof), 0) valorIof,
      COALESCE (SUM (a.valorIpi), 0) valorIpi,
      COALESCE (MAX (a.stPis), '00') stPis,
      COALESCE (MAX (a.aliquotaPis), 0) aliquotaPis,
      COALESCE (SUM (a.basePis), 0) basePis,
      COALESCE (SUM (a.valorPis), 0) valorPis,
      COALESCE (MAX (a.aliquotaCofins), 0) aliquotaCofins,
      COALESCE (SUM (a.valorCofins), 0) valorCofins,
      COALESCE (SUM (a.valorIcms), 0) valorIcms,
      CASE WHEN COALESCE (SUM (a.valorRetPis), 0) + COALESCE (SUM (a.valorRetCofins), 0) > 0 THEN 1 ELSE 0 END pisCofinsRetido,
      COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0) aliquotaEstimadaImpFederais,
      COALESCE (SUM (a.valorEstimadoImpFederais), 0) valorEstimadoImpFederais,
      COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0) aliquotaEstimadaImpEstaduais,
      COALESCE (SUM (a.valorEstimadoImpEstaduais), 0) valorEstimadoImpEstaduais,
      COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0) aliquotaEstimadaImpMunicipais,
      COALESCE (SUM (a.valorEstimadoImpMunicipais), 0) valorEstimadoImpMunicipais,
      COALESCE (MAX (CASE WHEN servMun.codigoServicoMunicipio = ' ' THEN '0' ELSE servMun.codigoServicoMunicipio END), '0') codigoServicoMunicipio,
      COALESCE (MAX (servMun.descricao), ' ') servMun_descricao,
      COALESCE (MAX (listServ.descricao), ' ') listServ_descricao,
      COALESCE (MAX (indicIssqn.descricao), ' ') indicIssqn_descricao
    FROM MODOCFISCALXITENS a
    JOIN PASERVICOSMUNICIPIOS servMun
    ON servMun.idServicoMunicipio = a.idServicoMunicipio
    JOIN SILISTASERVICOS listServ
    ON listServ.listaServicos = a.listaServicos
    JOIN SIINDICISSQN indicIssqn
    ON indicIssqn.indicadorISSQN = a.indicadorISSQN
    JOIN DOC doc
    ON 1=1
    JOIN CAENDERECOSPESSOA endEst
    ON endEst.enderecoPessoa = doc.endEst_enderecoPessoa
    WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
    AND a.cancelado = 0)
  SELECT
    CASE
      WHEN endEst.municipio = 4314902
        AND munEst.tecnologiaNfse <> 4
      THEN TO_CHAR (a.dataEmissao, 'YYYY')
        || LPAD (a.documentoFiscal, 11, '0')
      ELSE TO_CHAR (a.documentoFiscal)
    END,
    a.serieFiscal,
    a.municipioFatoGerador,
    a.dataEmissao,
    CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '00/00/00000' ELSE TO_CHAR (a.dataEmissao, 'DD/MM/YYYY') END ELSE TO_CHAR (a.dataCompetencia, 'DD/MM/YYYY') END,
    CASE WHEN a.dataCompetencia IS NULL THEN CASE WHEN a.dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (a.dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataEmissao, 'HH24:MI:SS') END ELSE TO_CHAR (a.dataCompetencia, 'YYYY-MM-DD') || 'T' || TO_CHAR (a.dataCompetencia, 'HH24:MI:SS') END,
    a.chaveNFe,
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.codigoObra),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.art),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.nomeRazaoSocial),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.apelidoFantasia),
    pessEst.indicadorPessoa,
    CASE WHEN pessEst.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pessEst.cnpjCpfIdEstrangeiro <> ' '
      THEN pessEst.cnpjCpfIdEstrangeiro
      WHEN pessEst.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    pessEst.regimeTributario,
    CASE WHEN pessEst.regimeTributario IN ('1', '2', '4') THEN '1' ELSE '2' END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEst.bairroDistrito),
    TO_CHAR (endEst.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munEst.descricao),
    munEst.uf,
    LPAD (endEst.cep, 8 , '0'),
    paisEst.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisEst.descricao),
    munEst.tecnologiaNfse,
    CASE WHEN fonEst.idFonePessoa = 0 THEN ' ' ELSE fonEst.fone END,
    CASE WHEN fonEst2.idFonePessoa = 0 THEN ' ' ELSE fonEst2.fone END,
    CASE WHEN emailEst.idEmailPessoa = 0 THEN ' ' ELSE emailEst.email END,
    CASE WHEN siteEst.idEmailPessoa = 0 THEN ' ' ELSE siteEst.email END,
    COALESCE (estXnfse.senhaWS, ' '),
    COALESCE (estXnfse.regimeEspecialTributacao, ' '),
    CASE WHEN COALESCE (estXnfse.incentivadorCultural, 0) = 1 THEN '1' ELSE '2' END,
    COALESCE (estXnfse.indicadorAmbienteNfse, '0'),
    a.intermediario,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.nomeRazaoSocial) END,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.apelidoFantasia) END,
    pess.indicadorPessoa,
    CASE WHEN pess.indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END,
    CASE
      WHEN pess.cnpjCpfIdEstrangeiro <> ' '
      THEN pess.cnpjCpfIdEstrangeiro
      WHEN pess.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.bairroDistrito),
    TO_CHAR (endPess.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munPess.descricao),
    munPess.uf,
    LPAD (endPess.cep, 8 , '0'),
    paisPess.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisPess.descricao),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.observacoes),
    CASE WHEN fonPess.idFonePessoa = 0 THEN ' ' ELSE fonPess.fone END,
    CASE WHEN fonPess2.idFonePessoa = 0 THEN ' ' ELSE fonPess2.fone END,
    CASE WHEN emailPess.idEmailPessoa = 0 THEN ' ' ELSE emailPess.email END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endEntr.bairroDistrito),
    TO_CHAR (endEntr.municipio),
    FUNC_ADD_REMOVE_CARACT_ESPEC (munEntr.descricao),
    munEntr.uf,
    LPAD (endEntr.cep, 8 , '0'),
    endEntr.pais,
    FUNC_ADD_REMOVE_CARACT_ESPEC (paisEntr.descricao),
    CASE WHEN COALESCE (a.intermediario, 0) = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (interm.nomeRazaoSocial) END,
    interm.indicadorPessoa,
    CASE
      WHEN interm.cnpjCpfIdEstrangeiro <> ' '
      THEN interm.cnpjCpfIdEstrangeiro
      WHEN interm.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (interm.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endInterm.bairroDistrito),
    TO_CHAR (endInterm.municipio),
    LPAD (endInterm.cep, 8 , '0'),
    CASE WHEN fonInterm.idFonePessoa = 0 THEN ' ' ELSE fonInterm.fone END,
    CASE WHEN emailInterm.idEmailPessoa = 0 THEN ' ' ELSE emailInterm.email END,
    COALESCE (SUBSTR( TRIM (FUNC_ADD_REMOVE_CARACT_ESPEC (REPLACE (FUNC_ADD_BUSCA_DESCR_SERVICO (p_idDocumentoFiscal) ||
      CASE
        WHEN endEst.municipio IN (4202008,4209102,4314902)
        THEN '
Trib. Aprox.: R$ ' || TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00') || ' Federal e R$ '
        || TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00') || ' Municipal'
        ELSE ''
      END ||
      CASE
        WHEN p_config_425_addInfoComplNFSe = 1
        AND munEst.versaoNFSe <> '2.00'
        AND endEst.municipio NOT IN (4304606, 4305108, 4308607)
        AND EXISTS (
          SELECT 1
          FROM MODOCFISCALXINFOCOMPLEMEN infCompl
          WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
          AND infCompl.geradoPeloSistema = 1
          AND infCompl.descInformacaoComplementar <> ' ')
        THEN '
        ' || COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.geradoPeloSistema = 1
      AND infCompl.descInformacaoComplementar <> ' '), '')
        ELSE ''
      END, '
', '&#xD&#xA'))), 1, 2000), ' '),
    COALESCE (SUBSTR( TRIM (COALESCE ((SELECT LISTAGG (UPPER (infCompl.descInformacaoComplementar), ' ')
      WITHIN GROUP (ORDER BY infCompl.sequencia)
      FROM MODOCFISCALXINFOCOMPLEMEN infCompl
      WHERE infCompl.idDocumentoFiscal = p_idDocumentoFiscal
      AND infCompl.descInformacaoComplementar <> ' '), ' ')), 1, 2000),' '),
    REPLACE (TO_CHAR (item.valorProdutoServico, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorProdutoServico - item.valorDescontoTotal + item.valorOutrasDespesasTotal, 'FM9999999999990D00'), ',', '.'),
    item.valorLiquidoItem,
    REPLACE (TO_CHAR (item.valorDescontoTotal, 'FM9999999999990D00'), ',', '.'),
    item.indicadorIssqn,
    REPLACE (CASE WHEN endEst.municipio = 4318705 THEN TO_CHAR (item.aliquotaIssqn / 100, 'FM0D0000') ELSE TO_CHAR (item.aliquotaIssqn, 'FM9999999999990D00') END, ',', '.'),
    REPLACE (TO_CHAR (item.baseIssqn, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorIssqn, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.retidoIssqn = 1 THEN '1' ELSE '2' END,
    CASE WHEN item.tributadoForaMunicipio = 1 THEN '1' ELSE '2' END,
    TO_CHAR (CASE WHEN item.tributadoForaMunicipio = 1 THEN a.municipioFatoGerador ELSE endEst.municipio END),
    CASE WHEN item.incentivoFiscal = 1 THEN '1' ELSE '2' END,
    SUBSTR (LPAD (item.listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (item.listaServicos, 4, '0'), 3, 2),
    LPAD (item.cnae, 7, '0'),
    item.codigoServicoMunicipio,
    item.numeroProcessoAdministrativo,
    REPLACE (TO_CHAR (item.retencaoInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetInss, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetIrrf, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.retencaoCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.baseRetCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetCsll, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorRetOutros, 'FM9999999999990D00'), ',', '.'),
    item.stPis,
    REPLACE (TO_CHAR (item.aliquotaPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.basePis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorPis, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaCofins, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorCofins, 'FM9999999999990D00'), ',', '.'),
    CASE WHEN item.pisCofinsRetido = 1 THEN '1' ELSE '2' END,
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpFederais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpEstaduais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.aliquotaEstimadaImpMunicipais, 'FM9999999999990D00'), ',', '.'),
    REPLACE (TO_CHAR (item.valorEstimadoImpMunicipais, 'FM9999999999990D00'), ',', '.')
  INTO
    v_numeroRPS,
    v_serieFiscal,
    v_municipioFatoGerador,
    v_dataEmissao,
    v_dataHoraEmissao,
    v_dataCompetencia,
    v_dataCompetenciaDDMMYYYY,
    v_dataHoraCompetencia,
    v_chaveNFe,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_apelidoFantasia,
    v_estab_indicadorPessoa,
    v_estab_tipo,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoEstadual,
    v_estab_inscricaoMunicipal,
    v_estab_regimeTributario,
    v_optanteSimplesNacional,
    v_estab_logradouro,
    v_estab_numero,
    v_estab_complemento,
    v_estab_bairroDistrito,
    v_estab_municipio,
    v_estab_municipioDescricao,
    v_estab_uf,
    v_estab_cep,
    v_estab_pais,
    v_estab_paisDescricao,
    v_estab_tecnologiaNfse,
    v_estab_fone,
    v_estab_fone2,
    v_estab_email,
    v_estab_site,
    v_estab_senhaWS,
    v_regimeEspecialTributacao,
    v_incentivadorCultural,
    v_indicadorAmbienteNfse,
    v_intermediario,
    v_pess_nomeRazaoSocial,
    v_pess_apelidoFantasia,
    v_pess_indicadorPessoa,
    v_pess_tipo,
    v_pess_cnpjCpfIdEstrangeiro,
    v_pess_inscricaoEstadual,
    v_pess_inscricaoMunicipal,
    v_pess_logradouro,
    v_pess_numero,
    v_pess_complemento,
    v_pess_bairroDistrito,
    v_pess_municipio,
    v_pess_municipioDescricao,
    v_pess_uf,
    v_pess_cep,
    v_pess_pais,
    v_pess_paisDescricao,
    v_pess_observacoesEndereco,
    v_pess_fone,
    v_pess_fone2,
    v_pess_email,
    v_entr_logradouro,
    v_entr_numero,
    v_entr_complemento,
    v_entr_bairroDistrito,
    v_entr_municipio,
    v_entr_municipioDescricao,
    v_entr_uf,
    v_entr_cep,
    v_entr_pais,
    v_entr_paisDescricao,
    v_interm_nomeRazaoSocial,
    v_interm_indicadorPessoa,
    v_interm_cnpjCpfIdEstrangeiro,
    v_interm_inscricaoMunicipal,
    v_interm_logradouro,
    v_interm_numero,
    v_interm_complemento,
    v_interm_bairroDistrito,
    v_interm_municipio,
    v_interm_cep,
    v_interm_fone,
    v_interm_email,
    v_descricaoServico,
    v_outrasInformacoes,
    v_valorServicos,
    v_valorTotal,
    v_valorLiquidoItem,
    v_valorDescontoTotal,
    v_indicadorIssqn,
    v_aliquotaIssqn,
    v_baseIssqn,
    v_valorIssqn,
    v_issRetido,
    v_tributadoForaMunicipio,
    v_municipioIncidencia,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoServicoMunicipio,
    v_numeroProcesso,
    v_retencaoInss,
    v_baseRetInss,
    v_valorRetInss,
    v_retencaoIrrf,
    v_baseRetIrrf,
    v_valorRetIrrf,
    v_retencaoPis,
    v_baseRetPis,
    v_valorRetPis,
    v_retencaoCofins,
    v_baseRetCofins,
    v_valorRetCofins,
    v_retencaoCsll,
    v_baseRetCsll,
    v_valorRetCsll,
    v_valorOutrasRetencoes,
    v_stPis,
    v_aliquotaPis,
    v_basePis,
    v_valorPis,
    v_aliquotaCofins,
    v_valorCofins,
    v_pisCofinsRetido,
    v_percentualCargaTributariaFe,
    v_valorCargaTributariaFederal,
    v_percentualCargaTributariaEs,
    v_valorCargaTributariaEstad,
    v_percentualCargaTributariaMu,
    v_valorCargaTributariaMunicip
  FROM DOC a
  JOIN ITEM item
  ON 1=1
  JOIN PAOBRAS obra
  ON obra.idObra = a.idObra
  JOIN PAESTABELECIMENTOXNFSE estXnfse
  ON estXnfse.estabelecimento = a.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = a.pessoaEstabelecimento
  JOIN SIREGIMESTRIBUTARIO regTrib
  ON regTrib.regimeTributario = pessEst.regimeTributario
  JOIN CAENDERECOSPESSOA endEst
  ON endEst.enderecoPessoa = a.endEst_enderecoPessoa
  JOIN SIMUNICIPIOS munEst
  ON munEst.municipio = endEst.municipio
  JOIN SIPAISES paisEst
  ON paisEst.pais = CASE WHEN endEst.pais = ' ' THEN '1058' ELSE endEst.pais END
  JOIN CAFONESPESSOA fonEst
  ON fonEst.idFonePessoa = a.fonEst_idFonePessoa
  JOIN CAFONESPESSOA fonEst2
  ON fonEst2.idFonePessoa = a.fonEst2_idFonePessoa
  JOIN CAEMAILSPESSOA emailEst
  ON emailEst.idEmailPessoa = a.emailEst_idEmailPessoa
  JOIN CAEMAILSPESSOA siteEst
  ON siteEst.idEmailPessoa = a.siteEst_idEmailPessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = a.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEntr
  ON munEntr.municipio = endEntr.municipio
  JOIN SIPAISES paisEntr
  ON paisEntr.pais = CASE WHEN endEntr.pais = ' ' THEN '1058' ELSE endEntr.pais END
  JOIN CAPESSOAS interm
  ON interm.pessoa = a.intermediario
  JOIN CAENDERECOSPESSOA endInterm
  ON endInterm.enderecoPessoa = a.endInterm_enderecoPessoa
  JOIN SIMUNICIPIOS munInterm
  ON munInterm.municipio = endInterm.municipio
  JOIN CAFONESPESSOA fonInterm
  ON fonInterm.idFonePessoa = a.fonInterm_idFonePessoa
  JOIN CAEMAILSPESSOA emailInterm
  ON emailInterm.idEmailPessoa = a.emailInterm_idEmailPessoa
  JOIN CAPESSOAS pess
  ON pess.pessoa = a.pessoa
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.enderecoPessoa = a.endPess_enderecoPessoa
  JOIN SIMUNICIPIOS munPess
  ON munPess.municipio = endPess.municipio
  JOIN SIPAISES paisPess
  ON paisPess.pais = CASE WHEN endPess.pais = ' ' THEN '1058' ELSE endPess.pais END
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = a.fonPess_idFonePessoa
  JOIN CAFONESPESSOA fonPess2
  ON fonPess2.idFonePessoa = a.fonPess2_idFonePessoa
  JOIN CAEMAILSPESSOA emailPess
  ON emailPess.idEmailPessoa = a.emailPess_idEmailPessoa
  JOIN CAEMAILSPESSOA sitePess
  ON sitePess.idEmailPessoa = a.sitePess_idEmailPessoa
  JOIN SIMUNICIPIOS munServ
  ON munServ.municipio =
    CASE
      WHEN item.tributadoForaMunicipio = 1
      THEN a.municipioFatoGerador
      ELSE endEst.municipio
    END
  JOIN SIUNIDADESMEDIDA unid
  ON unid.unidadeMedida = item.unidadeMedidaConversao;
  IF v_estab_tecnologiaNfse = 4 THEN
    -- NFS-e
    v_xml := '<NFSe xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
  || '<infNFSe id="NFS' || v_chaveNFe || '">'
    || '<DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00">'
      || '<infDPS id="DPS'
      || v_estab_municipio
      || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '2' ELSE '1' END
      || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
      || SUBSTR ('00000' || TRIM (v_serieFiscal), -5)
      || SUBSTR ('000000000000000' || TRIM (v_numeroRPS), -15)
      || '">'
-- 1 - Producao, 2 - Homologacao
        || '<tpAmb>' || v_indicadorAmbienteNfse || '</tpAmb>'
-- Formato AAAA-MM-DDThh:mm:ssTZD
        || '<dhEmi>' || v_dataHoraEmissao || '</dhEmi>'
-- Versão do aplicativo que gerou o DPS
        || '<verAplic>ADDERI 2024</verAplic>'
-- Número do equipamento emissor do DPS ou série do DPS</serie>'
        || '<serie>' || v_serieFiscal || '</serie>'
        || '<nDPS>' || v_numeroRPS || '</nDPS>'
-- Data em que se iniciou a prestação do serviço: Dia, mês e ano (AAAAMMDD)
        || '<dCompet>' || v_dataCompetencia || '</dCompet>'
-- Emitente da DPS: 1 - Prestador; 2 - Tomador; 3 - Intermediário
        || '<tpEmit>1</tpEmit>'
        || '<cLocEmi>' || v_estab_municipio || '</cLocEmi>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
        || '<prest>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_estab_indicadorPessoa = 'J' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_estab_indicadorPessoa = 'F' THEN v_estab_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_estab_inscricaoMunicipal)
          || '<xNome>' || v_estab_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_estab_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_estab_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_estab_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_estab_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_estab_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_estab_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_estab_fone)
          || FUNC_ADD_TAG_XML ('email', v_estab_email)
        || '</prest>';

    -- Tomador (Cliente)
    v_xml := v_xml
        || '<toma>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_pess_indicadorPessoa = 'J' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_pess_indicadorPessoa = 'F' THEN v_pess_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_pess_inscricaoMunicipal)
          || '<xNome>' || v_pess_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_pess_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_pess_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_pess_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_pess_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_pess_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_pess_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_pess_fone)
          || FUNC_ADD_TAG_XML ('email', v_pess_email)
        || '</toma>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
        || '<interm>'
          || FUNC_ADD_TAG_XML ('CNPJ', CASE WHEN v_interm_indicadorPessoa = 'J' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
          || FUNC_ADD_TAG_XML ('CPF', CASE WHEN v_interm_indicadorPessoa = 'F' THEN v_interm_cnpjCpfIdEstrangeiro ELSE ' ' END)
-- Número de Identificação Fiscal fornecido por órgão de administração tributária no exterior
          || '<NIF>0</NIF>'
-- Motivo para não informação do NIF: 1 - Dispensado do NIF; 2 - Não exigência do NIF;
          || '<cNaoNIF>1</cNaoNIF>'
          || FUNC_ADD_TAG_XML ('IM', v_interm_inscricaoMunicipal)
          || '<xNome>' || v_interm_nomeRazaoSocial || '</xNome>'
          || '<end>'
            || '<endNac>'
              || FUNC_ADD_TAG_XML ('cMun', v_interm_municipio)
              || FUNC_ADD_TAG_XML ('CEP', v_interm_cep)
            || '</endNac>'
            || FUNC_ADD_TAG_XML ('xLgr', v_interm_logradouro)
            || FUNC_ADD_TAG_XML ('nro', v_interm_numero)
            || FUNC_ADD_TAG_XML ('xCpl', v_interm_complemento)
            || FUNC_ADD_TAG_XML ('xBairro', v_interm_bairroDistrito)
          || '</end>'
          || FUNC_ADD_TAG_XML ('fone', v_interm_fone)
          || FUNC_ADD_TAG_XML ('email', v_interm_email)
        || '</interm>';
    END IF;

-- Serviço
    v_xml := v_xml
        || '<serv>'
          || '<locPrest>'
-- Codigo ibge do municipio onde o servico e prestado</locPrest>
            || '<locPrest>' || v_municipioIncidencia || '</locPrest>'
-- Pais onde ocorreu a prestacao do servico
            || '<cPaisPrestacao>1058</cPaisPrestacao>'
          || '</locPrest>'
          || '<cServ>'
-- Código de tributação nacional do ISSQN.
            || '<cTribNac>' || v_indicadorIssqn || '</cTribNac>'
-- Descrição completa do serviço prestado
            || '<xDescServ>' || v_descricaoServico || '</xDescServ>'
          || '</cServ>'
          || '<obra>'
-- numero identificacao da obra
            || '<cObra>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</cObra>'
            || '<end>'
              || FUNC_ADD_TAG_XML ('CEP', v_entr_cep)
              || FUNC_ADD_TAG_XML ('xLgr', v_entr_logradouro)
              || FUNC_ADD_TAG_XML ('nro', v_entr_numero)
              || FUNC_ADD_TAG_XML ('xCpl', v_entr_complemento)
              || FUNC_ADD_TAG_XML ('xBairro', v_entr_bairroDistrito)
            || '</end>'
          || '</obra>'
        || '</serv>';

-- Valores
    v_xml := v_xml
        || '<valores>'
          || '<vServPrest>'
-- Valor monetário recebido pelo intermediário do serviço (R$)
            || '<vReceb>0.00</vReceb>'
-- Valor do serviço (R$)
            || '<vServ>' || v_valorServicos || '</vServ>'
          || '</vServPrest>'
          || '<vDescCondIncond>'
            || '<vDescIncond>' || v_valorDescontoTotal || '</vDescIncond>'
            || '<vDescCond>0.00</vDescCond>'
          || '</vDescCondIncond>'
          || '<trib>'
            || '<tribFed>'
              || '<piscofins>'
-- Código de Situação Tributária do PIS/COFINS (CST):
-- 00 - Nenhum;
-- 01 - Operação Tributável com Alíquota Básica;
-- 02 - Operação Tributável com Alíquota Diferenciada;
-- 03 - Operação Tributável com Alíquota por Unidade de Medida de Produto;
-- 04 - Operação Tributável monofásica - Revenda a Alíquota Zero;
-- 05 - Operação Tributável por Substituição Tributária;
-- 06 - Operação Tributável a Alíquota Zero;
-- 07 - Operação Tributável da Contribuição;
-- 08 - Operação sem Incidência da Contribuição;
-- 09 - Operação com Suspensão da Contribuição;
            || '<CST>' || CASE WHEN v_pisCofinsRetido = '1' THEN '01' ELSE v_stPis END || '</CST>'
-- Valor da Base de Cálculo do PIS/COFINS (R$)
            || '<vBCPisCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_baseRetPis ELSE v_basePis END || '</vBCPisCofins>'
-- Valor da Alíquota do PIS (%).
            || '<pAliqPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoPis ELSE v_aliquotaPis END || '</pAliqPis>'
-- Valor da Alíquota da COFINS (%).
            || '<pAliqCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoCofins ELSE v_aliquotaCofins END || '</pAliqCofins>'
-- Valor monetário do PIS (R$).
            || '<vPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetPis ELSE v_valorPis END || '</vPis>'
-- Valor monetário do COFINS (R$).
            || '<vCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetCofins ELSE v_valorCofins END || '</vCofins>'
-- Tipo de retencao do Pis/Cofins:1 - Retido;2 - Não Retido;
            || '<tpRetPisCofins>' || v_pisCofinsRetido || '</tpRetPisCofins>' 
              || '</piscofins>'
-- Valor monetário do CP(R$).
              || '<vRetCP>0.00</vRetCP>'
-- Valor monetário do IRRF (R$).
              || '<vRetIRRF>' || v_valorRetIrrf || '</vRetIRRF>'
-- Valor monetário do CSLL (R$).
              || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
            || '</tribFed>'
            || '<tribMun>'
-- Tributação do ISSQN sobre o serviço prestado: 1 - Operação tributável; 2 - Exportação de serviço; 3 - Não Incidência; 4 - Imunidade;
              || '<tribISSQN>' || CASE v_indicadorIssqn WHEN '2' THEN '3' WHEN '4' THEN '2' WHEN '5' THEN '4' ELSE '1' END ||'</tribISSQN>'
-- Tipo de retencao do ISSQN: 1 - Não Retido; 2 - Retido pelo Tomador; 3 - Retido pelo Intermediario;
              || '<tpRetISSQN>' || CASE WHEN v_issRetido = '1' THEN '2' ELSE '1' END || '</tpRetISSQN>'
            || '</tribMun>'
            || '<totTrib>'
-- Valor monetário total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<vTotTrib>0</vTotTrib>'
-- Valor percentual total aproximado dos tributos, em conformidade com o artigo 1o da Lei no 12.741/2012
              || '<pTotTrib>0</pTotTrib>'
-- Indicador de informação de valor total de tributos. Possui valor fixo igual a zero (indTotTrib=0). Não informar nenhum valor estimado para os Tributos (Decreto 8.264/2014). 0 - Não;
              || '<indTotTrib>0</indTotTrib>'
-- Valor percentual aproximado do total dos tributos da alíquota do Simples Nacional (%)
              || '<pTotTribSN>0</pTotTribSN>'
            || '</totTrib>'
          || '</trib>'
        || '</valores>'
      || '</infDPS>'
    || '</DPS>'
  || '</infNFSe>'
|| '</NFSe>';

-- Município: 4202008 - Balneário Camboriú - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4202008' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.publica.inf.br">'
      || '<LoteRps id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' ||
                CASE v_indicadorIssqn
                  -- 118 ISS NÃO TRIBUTÁVEL
                  WHEN '2' THEN '118'
                  -- 103 ISENTO
                  WHEN '3' THEN '103'
                  -- 119 NÃO INCIDÊNCIA DE ISS - TOMADOR INTERNACIONAL
                  WHEN '4' THEN '119'
                  -- 104 IMUNE
                  WHEN '5' THEN '104'
                  -- 111 Exigibilidade suspensa por decisão judicial
                  WHEN '6' THEN '111'
                  -- 112 Exigibilidade suspensa por Processo Administrativo
                  WHEN '7' THEN '112'
                  ELSE
                    CASE
                      -- 114 ISS retido pelo tomador, devido para Outros Municípios (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '114'
                      -- 110 ISS retido pelo tomador (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                      THEN '110'  
                      -- 108 ISS devido para outro Município (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '108'
                      -- 116 ISS devido em Balneário Camboriú, prestado fora (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '116'
                      -- 107 ISS devido para Balneário Camboriú (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                      THEN '107'
                      -- 113 ISS retido pelo tomador - Devido para Outros Municípios
                      WHEN v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '113'
                      -- 105 ISS retido pelo tomador
                      WHEN v_issRetido = '1'
                      THEN '105'
                      -- 102 ISS devido para outro Município
                      WHEN v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '102'
                      -- 115 ISS devido em Balneário Camboriú, prestado fora
                      WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '115'
                      -- 101 ISS devido para Balneário Camboriú
                      ELSE '101'
                      -- NÃO TRATADOS:
                      -- 106 ISS FIXO Prestado em Balneário Camboriú
                      -- 117 ISS Fixo Devido em Balneário Camboriú Prestado Fora
                      -- 150 NOTA AVULSA
                    END
                END || '</NaturezaOperacao>'
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || TO_CHAR (v_municipioFatoGerador) || '</CodigoMunicipio>'
              || '</Servico>';

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

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

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

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

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

-- Município: 4209102 - Joinville - SC
-- Empresa: PUBLICA
-- Tecnologia: 1 - SOAP
-- Versão: 1.00
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4209102' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.publica.inf.br">'
      || '<LoteRps id="lote" versao="1.00">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps>'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>' || v_serieFiscal || '</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' ||
                CASE v_indicadorIssqn
                  -- ISS NÃO TRIBUTÁVEL (NÃO TRATADO)
                  WHEN '2' THEN '000'
                  -- ISENTO (NÃO TRATADO)
                  WHEN '3' THEN '000'
                  -- 113 Não incidência de ISS - Tomador internacional
                  WHEN '4' THEN '113'
                  -- 104 IMUNE
                  WHEN '5' THEN '104'
                  -- Exigibilidade suspensa por decisão judicial (NÃO TRATADO)
                  WHEN '6' THEN '000'
                  -- Exigibilidade suspensa por Processo Administrativo (NÃO TRATADO)
                  WHEN '7' THEN '000'
                  ELSE
                    CASE
                      -- ISS retido pelo tomador, devido para Outros Municípios (Simples Nacional)
--                      WHEN v_optanteSimplesNacional = '1'
--                        AND v_issRetido = '1'
--                        AND v_tributadoForaMunicipio = 1
--                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                      THEN '000'
                      -- 110 ISS retido pelo tomador (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_issRetido = '1'
                      THEN '110'  
                      -- 108 ISS devido para outro Município (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '108'
                      -- 115 ISS devido em Joinville, prestado fora (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '115'
                      -- 107 ISS devido para Joinville (Simples Nacional)
                      WHEN v_optanteSimplesNacional = '1'
                      THEN '107'
                      -- 114 ISS retido pelo tomador - Devido para Outros Municípios
                      WHEN v_issRetido = '1'
                        AND v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '114'
                      -- 105 ISS retido pelo tomador
                      WHEN v_issRetido = '1'
                      THEN '105'
                      -- 102 ISS devido para outro Município
                      WHEN v_tributadoForaMunicipio = 1
                        AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '102'
                      -- 112  ISS devido em Joinville, prestado fora
                      WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                      THEN '112'
                      -- 101 ISS devido para Joinville
                      ELSE '101'
                      -- NÃO TRATADOS:
                      -- 106  Prestador enquadrado como ISS Fixo ou estimado
                      -- 112 ISS Retido pelo prestador 
                      -- 116 ISS devido para Joinville - Tomador internacional
                      -- 117 Não incidência de ISS (Simples Nacional) - Tomador internacional
                      -- 118 ISS devido para Joinville (Simples Nacional) - Tomador internacional
                      -- 119 ISS retido pelo tomador (Poder Publico) 
                      -- 150 NOTA AVULSA
                    END
                END || '</NaturezaOperacao>'
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || TO_CHAR (v_municipioFatoGerador) || '</CodigoMunicipio>'
              || '</Servico>';

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

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

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

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

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

-- Município: 4218004 - Tijucas - SC
-- Empresa: IPM
-- Tecnologia: 2 - IPM
-- Versão: PRÓPRIA
-- Assinar: itens
-- Síncrono
  ELSIF v_estab_municipio = '4218004' THEN
    -- NFS-e
    v_xml := '<nfse>'
  || '<rps>'
    || '<nro_recibo_provisorio>' || v_numeroRPS || '</nro_recibo_provisorio>'
    || '<serie_recibo_provisorio>1</serie_recibo_provisorio>'
    || '<data_emissao_recibo_provisorio>' || CASE WHEN v_dataEmissao IS NULL THEN '00/00/0000' ELSE TO_CHAR (v_dataEmissao, 'DD/MM/YYYY') END || '</data_emissao_recibo_provisorio>'
    || '<hora_emissao_recibo_provisorio>' || CASE WHEN v_dataEmissao IS NULL THEN '00:00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END || '</hora_emissao_recibo_provisorio>'
  || '</rps>';

    -- NF
    v_xml := v_xml
  || '<nf>'
--    || '<serie_nfse>' || v_serieFiscal || '</serie_nfse>'
--    || '<data_fato_gerador>' || v_dataCompetenciaDDMMYYYY || '</data_fato_gerador>'
    || '<valor_total>' || REPLACE (v_valorTotal, '.', ',') || '</valor_total>'
    || '<valor_desconto>0,00</valor_desconto>'
    || '<valor_ir>' || REPLACE (v_valorRetIrrf, '.', ',') || '</valor_ir>'
    || '<valor_inss>' || REPLACE (v_valorRetInss, '.', ',') || '</valor_inss>'
    || '<valor_contribuicao_social>' || REPLACE (v_valorRetCsll, '.', ',') || '</valor_contribuicao_social>'
    || '<valor_rps>0,00</valor_rps>'
    || '<valor_pis>' || REPLACE (v_valorPis, '.', ',') || '</valor_pis>'
    || '<valor_cofins>' || REPLACE (v_valorCofins, '.', ',') || '</valor_cofins>'
    || FUNC_ADD_TAG_XML ('observacao', v_outrasInformacoes)
  || '</nf>';

    -- Prestador
    v_xml := v_xml
  || '<prestador>'
    || '<cpfcnpj>' || v_estab_cnpjCpfIdEstrangeiro || '</cpfcnpj>'
    || '<cidade>' || v_estab_municipio || '</cidade>'
  || '</prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
  || '<tomador>'
--    || '<endereco_informado>' || CASE WHEN v_pess_logradouro = ' ' THEN '0' ELSE '1' END || '</endereco_informado>'
    || '<tipo>' || v_pess_indicadorPessoa || '</tipo>'
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_pess_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('ie', v_pess_inscricaoEstadual)
    || FUNC_ADD_TAG_XML ('nome_razao_social', v_pess_nomeRazaoSocial)
    || '<sobrenome_nome_fantasia/>'
--    || FUNC_ADD_TAG_XML ('sobrenome_nome_fantasia', v_pess_apelidoFantasia)
    || FUNC_ADD_TAG_XML ('logradouro', v_pess_logradouro || ', ' || v_pess_numero)
    || FUNC_ADD_TAG_XML ('email', v_pess_email)
--    || FUNC_ADD_TAG_XML ('numero_residencia', v_pess_numero)
    || FUNC_ADD_TAG_XML ('complemento', v_pess_complemento)
    || FUNC_ADD_TAG_XML ('ponto_referencia', v_pess_observacoesEndereco)
    || FUNC_ADD_TAG_XML ('bairro', v_pess_bairroDistrito)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_pess_municipio))
    || FUNC_ADD_TAG_XML ('cep', TO_CHAR (v_pess_cep))
    || '<ddd_fone_comercial/>'
    || FUNC_ADD_TAG_XML ('fone_comercial', v_pess_fone)
    || '<ddd_fone_residencial/>'
    || '<fone_residencial/>'
    || '<ddd_fax/>'
    || '<fone_fax/>'
  || '</tomador>';

    -- Itens
    v_xml := v_xml
  || '<itens>'
    || '<lista>'
      || '<codigo_local_prestacao_servico>' || v_municipioIncidencia || '</codigo_local_prestacao_servico>'
      || FUNC_ADD_TAG_XML ('codigo_item_lista_servico', REPLACE (v_listaServicos, '.', ''))
      || FUNC_ADD_TAG_XML ('descritivo', v_descricaoServico)
      || '<aliquota_item_lista_servico>' || REPLACE (v_aliquotaIssqn, '.', ',') || '</aliquota_item_lista_servico>'
      || '<situacao_tributaria>00</situacao_tributaria>'
      || '<valor_tributavel>' || REPLACE (v_valorTotal, '.', ',') || '</valor_tributavel>'
      || '<valor_deducao>0,00</valor_deducao>'
      || '<valor_issrf>' || CASE WHEN v_issRetido = '1' THEN REPLACE (v_valorIssqn, '.', ',') ELSE '0,00' END || '</valor_issrf>'
      || '<tributa_municipio_prestador>' || CASE WHEN v_tributadoForaMunicipio = '1' THEN 'N' ELSE 'S' END|| '</tributa_municipio_prestador>'
      || '<unidade_codigo>1</unidade_codigo>'
      || '<unidade_quantidade>1,00</unidade_quantidade>'
      || '<unidade_valor_unitario>' || REPLACE (v_valorTotal, '.', ',') || '</unidade_valor_unitario>'
--      || '<codigo_atividade>0</codigo_atividade>'
--      || FUNC_ADD_TAG_XML ('cno', v_codigoObra)
    || '</lista>'
  || '</itens>'
  || '<produtos> </produtos>'
  -- Assinar Aqui
|| '</nfse>';

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

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

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

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

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

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

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

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

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || CASE WHEN v_issRetido = '1' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' ELSE '' END
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

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

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

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

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

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

-- Município: 4302105 - Bento Gonçalves - RS
-- Empresa: Elotech
-- Tecnologia: 5 - Elotech
-- Versão: 2.03
-- Assinar: LoteRps
-- Assíncrono
  ELSIF v_estab_municipio = '4302105' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://shad.elotech.com.br/schemas/iss/nfse_v2_03.xsd">'
  || '<IdentificacaoRequerente>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<Senha>' || v_estab_senhaWS || '</Senha>'
    || '<Homologa>false</Homologa>'
  || '</IdentificacaoRequerente>'
  || '<LoteRps versao="2.03">'
    || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
    || '<CpfCnpj>'
      || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || '<Numero>' || v_numeroRPS || '</Numero>'
              || '<Serie>RPS</Serie>'
              || '<Tipo>1</Tipo>'
            || '</IdentificacaoRps>'
            || '<DataEmissao>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</DataEmissao>'
            || '<Status>1</Status>'
          || '</Rps>'
          || '<Competencia>' || v_dataCompetencia || '</Competencia>';

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<AliquotaPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoPis ELSE v_aliquotaPis END || '</AliquotaPis>'
              || '<RetidoPis>' || v_pisCofinsRetido || '</RetidoPis>'
              || '<ValorPis>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetPis ELSE v_valorPis END || '</ValorPis>'
              || '<AliquotaCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_retencaoCofins ELSE v_aliquotaCofins END || '</AliquotaCofins>'
              || '<RetidoCofins>' || v_pisCofinsRetido || '</RetidoCofins>'
              || '<ValorCofins>' || CASE WHEN v_pisCofinsRetido = '1' THEN v_valorRetCofins ELSE v_valorCofins END || '</ValorCofins>'
              || '<AliquotaInss>' || v_retencaoInss || '</AliquotaInss>'
              || '<RetidoInss>1</RetidoInss>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<AliquotaIr>' || v_retencaoIrrf || '</AliquotaIr>'
              || '<RetidoIr>1</RetidoIr>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<AliquotaCsll>' || v_retencaoCsll || '</AliquotaCsll>'
              || '<RetidoCsll>1</RetidoCsll>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<AliquotaCpp>0.00</AliquotaCpp>'
              || '<RetidoCpp>1</RetidoCpp>'
              || '<ValorCpp>0.00</ValorCpp>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<RetidoOutrasRetencoes>1</RetidoOutrasRetencoes>'
              || '<AliquotaTotTributos>0.00</AliquotaTotTributos>'
              || '<ValTotTributos>0.00</ValTotTributos>'
--              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
--              || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || CASE WHEN v_issRetido = '1' THEN '<ResponsavelRetencao>1</ResponsavelRetencao>' ELSE '' END
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<CodigoNbs>0</CodigoNbs>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
            || '<ListaItensServico>'
              || '<ItemServico>'
                || '<ItemListaServico>' || REPLACE (v_listaServicos, '.', '') || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
                || '<Descricao>' || v_descricaoServico || '</Descricao>'
                || '<Unidade>UN</Unidade>'
                || '<Tributavel>1</Tributavel>'
                || '<Quantidade>1</Quantidade>'
                || '<ValorUnitario>' || v_valorTotal || '</ValorUnitario>'
                || '<ValorDesconto>0.00</ValorDesconto>'
                || '<ValorLiquido>' || v_valorTotal || '</ValorLiquido>'
              || '</ItemServico>'
            || '</ListaItensServico>'
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
            || '</CpfCnpj>'
            || CASE WHEN v_estab_inscricaoMunicipal = ' ' THEN '' ELSE '<InscricaoMunicipal>' || v_estab_inscricaoMunicipal || '</InscricaoMunicipal>' END
          || '</Prestador>';

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

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

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

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

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

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

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

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

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

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

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

-- Município: 4305108 - Caxias do Sul - RS
-- Empresa: INFISC
-- Tecnologia: 3 - INFISC
-- Versão: 2.03
-- Assinar: InfDeclaracaoPrestacaoServico, LoteRps
-- Síncrono
  ELSIF v_estab_municipio = '4305108' THEN

    -- NFS-e
    v_xml := '<envioLote versao="1.0">'
  || '<CNPJ>' || v_estab_cnpjCpfIdEstrangeiro || '</CNPJ>'
  || '<dhTrans>' || REPLACE (v_dataHoraEmissao, 'T', ' ' ) || '</dhTrans>'
  || '<NFS-e>'
    || '<infNFSe versao="1.1">'
      || '<Id>'
        || '<cNFS-e>' || p_loteWebService || '</cNFS-e>'
        || '<mod>90</mod>'
        || '<serie>' || v_serieFiscal || '</serie>'
        || '<nNFS-e>' || v_numeroRPS || '</nNFS-e>'
        || '<dEmi>' || CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END || '</dEmi>'
        || '<hEmi>' || CASE WHEN v_dataEmissao IS NULL THEN '00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI') END || '</hEmi>'
        || '<tpNF>1</tpNF>'
        || '<refNF>' || v_chaveNFe || '</refNF>'
        || '<tpImp>1</tpImp>'
        || '<tpEmis>N</tpEmis>'
        || '<cancelada>N</cancelada>'
        || '<canhoto>1</canhoto>'
      || '</Id>';

    -- Prestador
    v_xml := v_xml
      || '<prest>'
        || '<CNPJ>' || v_estab_cnpjCpfIdEstrangeiro || '</CNPJ>'
        || '<xNome>' || v_estab_nomeRazaoSocial || '</xNome>'
        || '<xFant>' || v_estab_apelidoFantasia || '</xFant>'
        || FUNC_ADD_TAG_XML ('IM', v_estab_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('xEmail', v_estab_email)
        || FUNC_ADD_TAG_XML ('xSite', v_estab_site)
        || '<end>'
          || FUNC_ADD_TAG_XML ('xLgr', v_estab_logradouro)
          || FUNC_ADD_TAG_XML ('nro', v_estab_numero)
          || FUNC_ADD_TAG_XML ('xCpl', v_estab_complemento)
          || FUNC_ADD_TAG_XML ('xBairro', v_estab_bairroDistrito)
          || FUNC_ADD_TAG_XML ('cMun', v_estab_municipio)
          || FUNC_ADD_TAG_XML ('xMun', v_estab_municipioDescricao)
          || FUNC_ADD_TAG_XML ('UF', v_estab_uf)
          || FUNC_ADD_TAG_XML ('CEP', v_estab_cep)
          || FUNC_ADD_TAG_XML ('cPais', v_estab_pais)
          || FUNC_ADD_TAG_XML ('xPais', v_estab_paisDescricao)
        || '</end>'
        || FUNC_ADD_TAG_XML ('fone', v_estab_fone)
        || FUNC_ADD_TAG_XML ('fone2', v_estab_fone2)
        || FUNC_ADD_TAG_XML ('IE', v_estab_inscricaoEstadual)
        || FUNC_ADD_TAG_XML ('regimeTrib', v_estab_regimeTributario)
      || '</prest>';

    -- Tomador
    v_xml := v_xml
      || '<TomS>'
        || '<'|| UPPER (v_pess_tipo) || '>' || v_pess_cnpjCpfIdEstrangeiro || '</'|| UPPER (v_pess_tipo) || '>'
        || FUNC_ADD_TAG_XML ('xNome', v_pess_nomeRazaoSocial)
        || '<ender>'
          || FUNC_ADD_TAG_XML ('xLgr', v_pess_logradouro)
          || FUNC_ADD_TAG_XML ('nro', v_pess_numero)
          || FUNC_ADD_TAG_XML ('xCpl', v_pess_complemento)
          || FUNC_ADD_TAG_XML ('xBairro', v_pess_bairroDistrito)
          || FUNC_ADD_TAG_XML ('cMun', v_pess_municipio)
          || FUNC_ADD_TAG_XML ('xMun', v_pess_municipioDescricao)
          || FUNC_ADD_TAG_XML ('UF', v_pess_uf)
          || FUNC_ADD_TAG_XML ('CEP', v_pess_cep)
          || FUNC_ADD_TAG_XML ('cPais', v_pess_pais)
          || FUNC_ADD_TAG_XML ('xPais', v_pess_paisDescricao)
        || '</ender>'
        || FUNC_ADD_TAG_XML ('xEmail', v_pess_email)
        || FUNC_ADD_TAG_XML ('IE', v_pess_inscricaoEstadual)
        || FUNC_ADD_TAG_XML ('IM', v_pess_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('fone', v_pess_fone)
        || FUNC_ADD_TAG_XML ('fone2', v_pess_fone2)
      || '</TomS>';

    -- Construção Civil
    v_xml := v_xml
      || '<dadosDaObra>'
        || FUNC_ADD_TAG_XML ('xLogObra', v_entr_logradouro)
        || FUNC_ADD_TAG_XML ('xComplObra', v_entr_complemento)
        || FUNC_ADD_TAG_XML ('vNumeroObra', v_entr_numero)
        || FUNC_ADD_TAG_XML ('xBairroObra', v_entr_bairroDistrito)
        || FUNC_ADD_TAG_XML ('xCepObra', v_entr_cep)
        || FUNC_ADD_TAG_XML ('cCidadeObra', v_entr_municipio)
        || FUNC_ADD_TAG_XML ('xCidadeObra', v_entr_municipioDescricao)
        || FUNC_ADD_TAG_XML ('xUfObra', v_entr_uf)
        || FUNC_ADD_TAG_XML ('cPaisObra', v_entr_pais)
        || FUNC_ADD_TAG_XML ('xPaisObra', v_entr_paisDescricao)
        || '<numeroArt>' || CASE WHEN v_art = ' ' THEN '0' ELSE v_art END || '</numeroArt>'
        || '<numeroCei>' || CASE WHEN v_codigoObra = ' ' THEN '0' ELSE v_codigoObra END || '</numeroCei>'
        || '<numeroProj/>'
        || '<numeroMatri/>'
      || '</dadosDaObra>';

    -- Transportadora
    v_xml := v_xml
      || '<transportadora>'
        || '<xNomeTrans>' || v_estab_nomeRazaoSocial || '</xNomeTrans>'
        || '<xCpfCnpjTrans>' || v_estab_cnpjCpfIdEstrangeiro || '</xCpfCnpjTrans>'
        || FUNC_ADD_TAG_XML ('xInscEstTrans', v_estab_inscricaoEstadual)
        || '<xPlacaTrans/>'
        || FUNC_ADD_TAG_XML ('xEndTrans', v_estab_logradouro)
        || FUNC_ADD_TAG_XML ('cMunTrans', v_estab_municipio)
        || FUNC_ADD_TAG_XML ('xMunTrans', v_estab_municipioDescricao)
        || FUNC_ADD_TAG_XML ('xUfTrans', v_estab_uf)
        || FUNC_ADD_TAG_XML ('cPaisTrans', v_estab_pais)
        || FUNC_ADD_TAG_XML ('xPaisTrans', v_estab_paisDescricao)
        || '<vTipoFreteTrans>0</vTipoFreteTrans>'
      || '</transportadora>';

    -- Itens
    v_sequencia := 0;
    FOR a IN (
      SELECT
        a.listaServicos,
        a.unidadeMedidaConversao,
        a.quantidadeConvertida,
        a.valorProdutoServico,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.tributadoForaMunicipio,
        a.baseIssqn,
        a.aliquotaIssqn,
        a.valorIssqn,
        a.baseRetInss,
        a.retencaoInss,
        a.valorRetInss,
        a.baseRetIrrf,
        a.retencaoIrrf,
        a.valorRetIrrf,
        a.baseRetCofins,
        a.retencaoCofins,
        a.valorRetCofins,
        a.baseRetCsll,
        a.retencaoCsll,
        a.valorRetCsll,
        a.baseRetPis,
        a.retencaoPis,
        a.valorRetPis,
        a.observacoes,
        gradProd.descricaoImpressa,
        servMun.codigoServicoMunicipio
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PASERVICOSMUNICIPIOS servMun
      ON servMun.idServicoMunicipio = a.idServicoMunicipio
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.cancelado = 0
      ORDER BY a.sequencia)
    LOOP
      v_sequencia := v_sequencia + 1;
      v_xml := v_xml
      || '<det>'
        || '<nItem>' || TO_CHAR (v_sequencia) || '</nItem>'
        || '<serv>'
          || '<cServ>' || COALESCE (CASE WHEN a.codigoServicoMunicipio = ' ' THEN '0' ELSE a.codigoServicoMunicipio END, '0') || '</cServ>'
          || '<cLCServ>' || LPAD (a.listaServicos, 4, '0') || '</cLCServ>'
          || '<xServ>' || COALESCE (SUBSTR( TRIM (FUNC_ADD_REMOVE_CARACT_ESPEC (REPLACE (TRIM (TRIM (a.descricaoImpressa) || ' ' || TRIM (a.observacoes)), '
', '&#xD&#xA'))), 1, 2000), ' ') || '</xServ>'
          || '<localTributacao>' || CASE WHEN a.tributadoForaMunicipio = 1 THEN TO_CHAR (v_municipioFatoGerador) ELSE v_estab_municipio END || '</localTributacao>'
          || '<localVerifResServ>1</localVerifResServ>'
          || '<uTrib>' || a.unidadeMedidaConversao || '</uTrib>'
          || '<qTrib>' || REPLACE (TO_CHAR (a.quantidadeConvertida, 'FM9999999999990D00'), ',', '.') || '</qTrib>'
          || '<vUnit>' || REPLACE (TO_CHAR (((a.valorProdutoServico + a.valorOutrasDespesasTotal) / CASE WHEN a.quantidadeConvertida = 0 THEN 1 ELSE a.quantidadeConvertida END), 'FM9999999999990D00'), ',', '.') || '</vUnit>'
          || '<vServ>' || REPLACE (TO_CHAR ((a.valorProdutoServico + a.valorOutrasDespesasTotal - a.valorDescontoTotal), 'FM9999999999990D00'), ',', '.') || '</vServ>'
          || '<vDesc>' || REPLACE (TO_CHAR (a.valorDescontoTotal, 'FM9999999999990D00'), ',', '.') || '</vDesc>'
          || '<vBCISS>' || REPLACE (TO_CHAR (a.baseIssqn, 'FM9999999999990D00'), ',', '.') || '</vBCISS>'
          || '<pISS>' || REPLACE (TO_CHAR (a.aliquotaIssqn, 'FM9999999999990D00'), ',', '.') || '</pISS>'
          || '<vISS>' || REPLACE (TO_CHAR (a.valorIssqn, 'FM9999999999990D00'), ',', '.') || '</vISS>'
          || '<vBCINSS>' || REPLACE (TO_CHAR (a.baseRetInss, 'FM9999999999990D00'), ',', '.') || '</vBCINSS>'
          || '<pRetINSS>' || REPLACE (TO_CHAR (a.retencaoInss, 'FM9999999999990D00'), ',', '.') || '</pRetINSS>'
          || '<vRetINSS>' || REPLACE (TO_CHAR (a.valorRetInss, 'FM9999999999990D00'), ',', '.') || '</vRetINSS>'
          || '<vRed>0.00</vRed>'
          || '<vBCRetIR>' || REPLACE (TO_CHAR (a.baseRetIrrf, 'FM9999999999990D00'), ',', '.') || '</vBCRetIR>'
          || '<pRetIR>' || REPLACE (TO_CHAR (a.retencaoIrrf, 'FM9999999999990D00'), ',', '.') || '</pRetIR>'
          || '<vRetIR>' || REPLACE (TO_CHAR (a.valorRetIrrf, 'FM9999999999990D00'), ',', '.') || '</vRetIR>'
          || '<vBCCOFINS>' || REPLACE (TO_CHAR (a.baseRetCofins, 'FM9999999999990D00'), ',', '.') || '</vBCCOFINS>'
          || '<pRetCOFINS>' || REPLACE (TO_CHAR (a.retencaoCofins, 'FM9999999999990D00'), ',', '.') || '</pRetCOFINS>'
          || '<vRetCOFINS>' || REPLACE (TO_CHAR (a.valorRetCofins, 'FM9999999999990D00'), ',', '.') || '</vRetCOFINS>'
          || '<vBCCSLL>' || REPLACE (TO_CHAR (a.baseRetCsll, 'FM9999999999990D00'), ',', '.') || '</vBCCSLL>'
          || '<pRetCSLL>' || REPLACE (TO_CHAR (a.retencaoCsll, 'FM9999999999990D00'), ',', '.') || '</pRetCSLL>'
          || '<vRetCSLL>' || REPLACE (TO_CHAR (a.valorRetCsll, 'FM9999999999990D00'), ',', '.') || '</vRetCSLL>'
          || '<vBCPISPASEP>' || REPLACE (TO_CHAR (a.baseRetPis, 'FM9999999999990D00'), ',', '.') || '</vBCPISPASEP>'
          || '<pRetPISPASEP>' || REPLACE (TO_CHAR (a.retencaoPis, 'FM9999999999990D00'), ',', '.') || '</pRetPISPASEP>'
          || '<vRetPISPASEP>' || REPLACE (TO_CHAR (a.valorRetPis, 'FM9999999999990D00'), ',', '.') || '</vRetPISPASEP>'
        || '</serv>'
      || '</det>';
    END LOOP;

    -- Totais
    v_xml := v_xml
      || '<total>'
        || '<vServ>' || v_valorTotal  || '</vServ>'
        || '<vDesc>' || v_valorDescontoTotal  || '</vDesc>'
        || '<vtNF>' || v_valorTotal || '</vtNF>'
        || '<vtLiq>' || v_valorTotal || '</vtLiq>'
        || '<Ret>'
          || '<vRetIR>' || v_valorRetIrrf || '</vRetIR>'
          || '<vRetPISPASEP>' || v_valorRetPis || '</vRetPISPASEP>'
          || '<vRetCOFINS>' || v_valorRetCofins || '</vRetCOFINS>'
          || '<vRetCSLL>' || v_valorRetCsll || '</vRetCSLL>'
          || '<vRetINSS>' || v_valorRetInss || '</vRetINSS>'
        || '</Ret>'
        || '<vtLiqFaturas>' || REPLACE (TO_CHAR (v_valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</vtLiqFaturas>'
        || '<ISS>'
          || '<vBCISS>' || v_baseIssqn || '</vBCISS>'
          || '<vISS>' || v_valorIssqn || '</vISS>'
        || '</ISS>'
      || '</total>';

    -- Faturas
    v_xml := v_xml
      || '<faturas>';
    v_sequencia := 0;
    v_saldo := v_valorLiquidoItem;
    FOR a IN (
      SELECT
        fin.vencimento,
        fin.valor
      FROM MODOCFISCALXPAGAMENTOS a
      JOIN MOFINANCEIROS fin
      ON fin.idPagamentoDocFiscal = a.idPagamentoDocFiscal
      WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
      AND a.pagamentoTroco = 'P'
      ORDER BY
        a.sequencia,
        fin.parcelaAtual)
    LOOP
      v_valor := a.valor;
      IF v_valor > v_saldo THEN
        v_valor := v_saldo;
      END IF;
      v_saldo := v_saldo - v_valor;
      IF v_valor > 0 THEN
        v_sequencia := v_sequencia + 1;
        v_xml := v_xml
        || '<fat>'
          || '<nItem>' || TO_CHAR (v_sequencia) || '</nItem>'
          || '<nFat>' || v_numeroRPS || '/' || TO_CHAR (v_sequencia) || '</nFat>'
          || '<dVenc>' || CASE WHEN a.vencimento IS NULL THEN '0000-00-00' ELSE TO_CHAR (a.vencimento, 'YYYY-MM-DD') END || '</dVenc>'
          || '<vFat>' || REPLACE (TO_CHAR (v_valor, 'FM9999999999990D00'), ',', '.') || '</vFat>'
        || '</fat>';
      END IF;
    END LOOP;
    v_xml := v_xml
      || '</faturas>';

    -- Outros
    v_xml := v_xml
      || '<infAdicLT>' || v_municipioIncidencia || '</infAdicLT>'
      || FUNC_ADD_TAG_XML ('infAdic',v_outrasInformacoes)
    || '</infNFSe>'
  || '</NFS-e>'
|| '</envioLote>';

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

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

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

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

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

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

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

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

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

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

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

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

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

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

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

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

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

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

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

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

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
              || '<ValorDeducoes>0.00</ValorDeducoes>'
              || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
              || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
              || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
              || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
              || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
              || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
              || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
              || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
              || '<DescontoCondicionado>0.00</DescontoCondicionado>'
            || '</Valores>'
            || '<IssRetido>' || v_issRetido || '</IssRetido>'
            || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
            || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
            || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
            || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
            || '<CodigoMunicipio>' || v_municipioIncidencia || '</CodigoMunicipio>'
            || '<CodigoPais>1058</CodigoPais>'
            || '<ExigibilidadeISS>' || v_indicadorIssqn || '</ExigibilidadeISS>'
            || '<MunicipioIncidencia>' || v_municipioIncidencia || '</MunicipioIncidencia>'
          || '</Servico>';

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || v_listaServicos || '</ItemListaServico>'
                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_estab_municipio || '</CodigoMunicipio>'
              || '</Servico>';

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

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

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

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

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

-- Município: 4318705 - São Leopoldo - RS
-- Empresa: THEMA
-- Tecnologia: 1 - SOAP
-- Versão: 2.00
-- Assinar: InfDeclaracaoPrestacaoServico
-- Síncrono
  ELSIF v_estab_municipio = '4318705' THEN
    -- NFS-e
    v_xml := '<?xml version="1.0" encoding="ISO-8859-1"?>'
      || '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">'
      || '<LoteRps Id="L' || p_loteWebService || '">'
        || '<NumeroLote>' || p_loteWebService || '</NumeroLote>'
        || '<' || v_estab_tipo || '>' || v_estab_cnpjCpfIdEstrangeiro || '</' || v_estab_tipo || '>'
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || '<QuantidadeRps>1</QuantidadeRps>'
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="R' || v_numeroRPS || '00000">'
              || '<IdentificacaoRps>'
                || '<Numero>' || v_numeroRPS || '</Numero>'
                || '<Serie>00000</Serie>'
                || '<Tipo>1</Tipo>'
              || '</IdentificacaoRps>'
              || '<DataEmissao>' || v_dataHoraEmissao || '</DataEmissao>'
              || '<NaturezaOperacao>' ||
                CASE
                  -- 6.9 Prestação outro Município: Imposto recolhido pelo regime único de arrecadação 
                  -- Simples Nacional; Utilizar quando o prestador do serviço estiver enquadrado 
                  -- no Simples Nacional ou MEI 
                  WHEN v_optanteSimplesNacional = '1'
                    AND v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '69'
                  -- 5.9 Prestação no Município: Imposto recolhido pelo regime único de arrecadação 
                  -- Simples Nacional; Utilizar quando o prestador do serviço estiver enquadrado 
                  -- no Simples Nacional ou MEI 
                  WHEN v_optanteSimplesNacional = '1'
                  THEN '59'
                  -- 6.8 Prestação outro Município: Não tributável; Utilizar quando o serviço prestado não sofrer tributação  pelo ISS. 
                  WHEN v_indicadorIssqn IN ('2','3','4','5','6','7')
                    AND v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '68'
                  -- 5.8 Prestação no Município: Não tributável; Utilizar quando o serviço prestado não sofrer tributação pelo ISS.
                  WHEN v_indicadorIssqn IN ('2','3','4','5','6','7')
                  THEN '58'
                  -- 6.3 Prestação outro Município: Imposto devido fora de São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado não for devido 
                  -- em São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
                  WHEN v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                    AND v_issRetido = '1'
                  THEN '63'
                  -- 6.4 Prestação outro Município: Imposto devido fora de São Leopoldo, sem obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado não for devido 
                  -- em São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
                  WHEN v_tributadoForaMunicipio = 1
                    AND TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
                  THEN '64'
                  -- 6.1 Prestação outro Município: Imposto devido em São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
--                  WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                    AND v_issRetido = '1'
--                  THEN '61'
                  -- 6.2 Prestação outro Município: Imposto devido em São Leopoldo, sem obrigação de 
                  -- retenção na fonte;
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
--                  WHEN TO_CHAR (v_municipioFatoGerador) <> v_estab_municipio
--                  THEN '62'
                  -- 5.1 Prestação no Município: Imposto devido em São Leopoldo, com obrigação de 
                  -- retenção na fonte; 
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- tomador do serviço. 
                  WHEN v_issRetido = '1'
                  THEN '51'
                  -- 5.2 Prestação no Município: Imposto devido em São Leopoldo, sem obrigação de 
                  -- retenção na fonte;  
                  -- Utilizar quando o ISS do serviço prestado for devido em 
                  -- São Leopoldo e a obrigação do recolhimento for do 
                  -- prestador do serviço. 
                  ELSE '52'
                  -- NÃO TRATADOS:
                  -- 7.8 Prestação no Exterior: Não tributável; Utilizar quando o serviço prestado não sofrer tributação
                END || '</NaturezaOperacao>'
--              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || '<OptanteSimplesNacional>' || v_optanteSimplesNacional || '</OptanteSimplesNacional>'
              || '<IncentivadorCultural>' || v_incentivadorCultural || '</IncentivadorCultural>'
              || '<Status>1</Status>';

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || '<ValorServicos>' || v_valorServicos || '</ValorServicos>'
                  || '<ValorDeducoes>0.00</ValorDeducoes>'
                  || '<ValorPis>' || v_valorRetPis || '</ValorPis>'
                  || '<ValorCofins>' || v_valorRetCofins || '</ValorCofins>'
                  || '<ValorInss>' || v_valorRetInss || '</ValorInss>'
                  || '<ValorIr>' || v_valorRetIrrf || '</ValorIr>'
                  || '<ValorCsll>' || v_valorRetCsll || '</ValorCsll>'
                  || '<IssRetido>' || v_issRetido || '</IssRetido>'
                  || '<ValorIss>' || v_valorIssqn || '</ValorIss>'
                  || '<OutrasRetencoes>' || v_valorOutrasRetencoes || '</OutrasRetencoes>'
                  || '<BaseCalculo>' || v_baseIssqn || '</BaseCalculo>'
                  || '<Aliquota>' || v_aliquotaIssqn || '</Aliquota>'
                  || '<ValorLiquidoNfse>' || REPLACE (TO_CHAR (v_valorLiquidoItem, 'FM9999999999990D00'), ',', '.') || '</ValorLiquidoNfse>'
                  || '<DescontoIncondicionado>' || v_valorDescontoTotal || '</DescontoIncondicionado>'
                  || '<DescontoCondicionado>0.00</DescontoCondicionado>'
                || '</Valores>'
                || '<ItemListaServico>' || REPLACE (v_listaServicos, '.', '') || '</ItemListaServico>'
                || '<CodigoCnae>' || v_cnae || '</CodigoCnae>'
--                || '<CodigoTributacaoMunicipio>' || v_codigoServicoMunicipio || '</CodigoTributacaoMunicipio>'
                || '<Discriminacao>' || v_descricaoServico || '</Discriminacao>'
                || '<CodigoMunicipio>' || v_estab_municipio || '</CodigoMunicipio>'
              || '</Servico>';

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

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

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

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

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

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

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

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

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

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

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

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

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

  RETURN v_xml;
END;

/

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('26/03/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 3' WHERE idVersaoSistema = 2025001001;

COMMIT;

-- FIM BETA 3 - 26/03/2025


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

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

COMMIT;

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_idAtividadePrevOrcam IN NUMBER,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_real_idAtividadeRealPerda    OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_aux_idAtividadeRealOrcament NUMBER;
  v_aux_sequencia               NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
  v_auxNumber                   NUMBER;
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  r_real_idAtividadeRealPerda    := 0;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF p_previsto_realizado = 'R'
    OR p_real_idAtividadeRealOrcament > 0
    OR p_prev_statusAtividadeServico IN ('C','E','I')
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0
      OR p_encProd_idAtividadePrevOrcam > 0
      AND p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
      AND p_encProd_quantidadeFabricada = 0
      AND p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico IN ('C','E')
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico NOT IN ('C','E'))
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_idAtividadePrevOrcam > 0
        AND p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
        AND (p_encProd_quantidadeFabricada > 0
          OR p_encProd_quantidadePerdida > 0)
      THEN
        FOR a IN (
          SELECT
            a.idAtividadePrevOrcamento,
            a.atividadeServico,
            a.dataInicio,
            a.dataTermino,
            COALESCE (realPend.idAtividadeRealOrcamento, 0) idAtividadeRealOrcamento,
            COALESCE (realPend.sequencia, COALESCE (real.sequencia, 0) + 1) sequencia
          FROM MOORCAMENTOXATIVIDADEPREV a
          LEFT JOIN MOORCAMENTOXATIVIDADEREAL realPend
          ON realPend.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
          AND realPend.statusAtividadeServico IN ('A','I','P')
          LEFT JOIN MOORCAMENTOXATIVIDADEREAL real
          ON real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
          WHERE a.idItemOrcamento = p_prev_idItemOrcamento
          AND a.sequencia BETWEEN p_prev_sequencia + 1 AND COALESCE ((
            SELECT MAX (prev.sequencia)
            FROM MOORCAMENTOXATIVIDADEPREV prev
            WHERE prev.idAtividadePrevOrcamento = p_encProd_idAtividadePrevOrcam), 0)
          AND (realPend.idAtividadeRealOrcamento IS NULL
            OR realPend.sequencia = COALESCE ((
              SELECT MAX (realPend2.sequencia)
              FROM MOORCAMENTOXATIVIDADEREAL realPend2
              WHERE realPend2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
              AND realPend2.statusAtividadeServico IN ('A','I','P')), 0))
          AND (real.idAtividadeRealOrcamento IS NULL
            OR real.sequencia = COALESCE ((
              SELECT MAX (real2.sequencia)
              FROM MOORCAMENTOXATIVIDADEREAL real2
              WHERE real2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento), 0)))
        LOOP
          v_aux_idAtividadeRealOrcament := a.idAtividadeRealOrcamento;
          v_aux_sequencia := a.sequencia;
          ADD_ORCAMENTO_ITEM_REAL_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            v_aux_idAtividadeRealOrcament,
            a.idAtividadePrevOrcamento,
            v_aux_sequencia,
            a.atividadeServico,
            p_real_descricao,
            p_real_tecnico,
            p_real_statusAtividadeServico,
            p_real_dataInicio,
            p_real_dataTermino,
            v_real_modeloDocumento,
            v_real_motivoEstoque,
            p_real_quantidade,
            p_real_observacoes,
            v_aux_idAtividadeRealOrcament);
          ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
            p_sys_estabelecimentoAtivo,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            v_cab_estabelecimento,
            v_cab_dataEmissao,
            v_cab_dataEntrega,
            v_item_modeloDocumento,
            a.idAtividadePrevOrcamento,
            a.dataInicio,
            a.dataTermino,
            v_aux_idAtividadeRealOrcament,
            p_real_dataTermino,
            v_real_modeloDocumento,
            v_real_motivoEstoque,
            v_real_proporcao,
            v_real_quantidadeEntrada,
            v_real_zerarSaldo,
            v_bufferIdReservaEstoque,
            v_bufferIdEstoque,
            v_bufferIdReservaEstoque,
            v_bufferIdEstoque);
          ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
            a.idAtividadePrevOrcamento);
          v_atualizarStatusPrevisto := 1;
        END LOOP;
      END IF;
      IF p_encProd_quantidadeFabricada > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          r_real_idAtividadeRealPerda,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealPerda);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealPerda,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        v_atualizarStatusPrevisto := 1;
        IF p_encProd_quantidadeFabricar > 0
          AND p_encProd_idAtividadePrevOrcam > 0
          AND p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
          AND (p_encProd_quantidadeFabricada > 0
            OR p_encProd_quantidadePerdida > 0)
        THEN
          FOR a IN (
            SELECT
              a.idAtividadePrevOrcamento,
              a.atividadeServico,
              a.dataInicio,
              a.dataTermino,
              COALESCE (realPend.idAtividadeRealOrcamento, 0) idAtividadeRealOrcamento,
              COALESCE (realPend.sequencia, COALESCE (real.sequencia, 0) + 1) sequencia
            FROM MOORCAMENTOXATIVIDADEPREV a
            LEFT JOIN MOORCAMENTOXATIVIDADEREAL realPend
            ON realPend.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
            AND realPend.statusAtividadeServico IN ('A','I','P')
            LEFT JOIN MOORCAMENTOXATIVIDADEREAL real
            ON real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
            WHERE a.idItemOrcamento = p_prev_idItemOrcamento
            AND a.sequencia BETWEEN p_prev_sequencia + 1 AND COALESCE ((
              SELECT MAX (prev.sequencia)
              FROM MOORCAMENTOXATIVIDADEPREV prev
              WHERE prev.idAtividadePrevOrcamento = p_encProd_idAtividadePrevOrcam), 0)
            AND (realPend.idAtividadeRealOrcamento IS NULL
              OR realPend.sequencia = COALESCE ((
                SELECT MAX (realPend2.sequencia)
                FROM MOORCAMENTOXATIVIDADEREAL realPend2
                WHERE realPend2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
                AND realPend2.statusAtividadeServico IN ('A','I','P')), 0))
            AND (real.idAtividadeRealOrcamento IS NULL
              OR real.sequencia = COALESCE ((
                SELECT MAX (real2.sequencia)
                FROM MOORCAMENTOXATIVIDADEREAL real2
                WHERE real2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento), 0)))
          LOOP
            v_aux_idAtividadeRealOrcament := a.idAtividadeRealOrcamento;
            v_aux_sequencia := a.sequencia + 1;
            ADD_ORCAMENTO_ITEM_REAL_GRAVA (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              v_aux_idAtividadeRealOrcament,
              a.idAtividadePrevOrcamento,
              v_aux_sequencia,
              a.atividadeServico,
              p_real_descricao,
              p_real_tecnico,
              p_real_statusAtividadeServico,
              p_real_dataInicio,
              p_real_dataTermino,
              v_real_modeloDocumento,
              v_real_motivoEstoque,
              p_real_quantidade,
              p_real_observacoes,
              v_aux_idAtividadeRealOrcament);
            ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
              p_sys_estabelecimentoAtivo,
              p_config_209_filtrarGrupoEcon,
              p_config_354_estabProximoId,
              p_config_362_calcCustoPorGrade,
              v_cab_estabelecimento,
              v_cab_dataEmissao,
              v_cab_dataEntrega,
              v_item_modeloDocumento,
              a.idAtividadePrevOrcamento,
              a.dataInicio,
              a.dataTermino,
              v_aux_idAtividadeRealOrcament,
              p_real_dataTermino,
              v_real_modeloDocumento,
              v_real_motivoEstoque,
              v_real_proporcao,
              v_real_quantidadeEntrada,
              v_real_zerarSaldo,
              v_bufferIdReservaEstoque,
              v_bufferIdEstoque,
              v_bufferIdReservaEstoque,
              v_bufferIdEstoque);
            ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
              a.idAtividadePrevOrcamento);
            v_atualizarStatusPrevisto := 1;
          END LOOP;
        END IF;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        NULL, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        0, -- p_real_modeloDocumento,
        0, -- p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        v_auxNumber);
      v_atualizarStatusPrevisto := 1;
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_idAtividadePrevOrcam > 0
        AND p_encProd_idAtividadePrevOrcam <> r_prev_idAtividadePrevOrcament
        AND (p_encProd_quantidadeFabricada > 0
          OR p_encProd_quantidadePerdida > 0)
      THEN
        FOR a IN (
          SELECT
            a.idAtividadePrevOrcamento,
            a.atividadeServico,
            a.tecnico,
            COALESCE (realPend.idAtividadeRealOrcamento, 0) idAtividadeRealOrcamento,
            COALESCE (realPend.sequencia, COALESCE (real.sequencia, 0) + 1) sequencia
          FROM MOORCAMENTOXATIVIDADEPREV a
          LEFT JOIN MOORCAMENTOXATIVIDADEREAL realPend
          ON realPend.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
          AND realPend.statusAtividadeServico IN ('A','I','P')
          LEFT JOIN MOORCAMENTOXATIVIDADEREAL real
          ON real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
          WHERE a.idItemOrcamento = p_prev_idItemOrcamento
          AND a.sequencia BETWEEN p_prev_sequencia + 1 AND COALESCE ((
            SELECT MAX (prev.sequencia)
            FROM MOORCAMENTOXATIVIDADEPREV prev
            WHERE prev.idAtividadePrevOrcamento = p_encProd_idAtividadePrevOrcam), 0)
          AND (realPend.idAtividadeRealOrcamento IS NULL
            OR realPend.sequencia = COALESCE ((
              SELECT MAX (realPend2.sequencia)
              FROM MOORCAMENTOXATIVIDADEREAL realPend2
              WHERE realPend2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
              AND realPend2.statusAtividadeServico IN ('A','I','P')), 0))
          AND (real.idAtividadeRealOrcamento IS NULL
            OR real.sequencia = COALESCE ((
              SELECT MAX (real2.sequencia)
              FROM MOORCAMENTOXATIVIDADEREAL real2
              WHERE real2.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento), 0)))
        LOOP
          v_aux_idAtividadeRealOrcament := a.idAtividadeRealOrcamento;
          v_aux_sequencia := a.sequencia + 1;
          ADD_ORCAMENTO_ITEM_REAL_GRAVA (
            p_sys_estabelecimentoAtivo,
            p_config_354_estabProximoId,
            v_aux_idAtividadeRealOrcament,
            a.idAtividadePrevOrcamento,
            v_aux_sequencia,
            a.atividadeServico,
            ' ', -- p_real_descricao,
            a.tecnico,
            'P', -- p_real_statusAtividadeServico,
            NULL, -- p_real_dataTermino,
            NULL, -- p_real_dataTermino,
            0, -- p_real_modeloDocumento,
            0, -- p_real_motivoEstoque,
            0, -- p_real_quantidade,
            ' ', -- p_real_observacoes,
            v_aux_idAtividadeRealOrcament);
          ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
            a.idAtividadePrevOrcamento);
          v_atualizarStatusPrevisto := 1;
        END LOOP;
      END IF;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF p_servico_producao = 'S'
    AND (i_prev_faturarAtividade <> p_prev_faturarAtividade
      OR i_prev_precoUnitario <> p_prev_precoUnitario
      OR i_prev_statusAtividadeServico = 'C'
      AND p_prev_statusAtividadeServico <> 'C'
      OR i_prev_statusAtividadeServico <> 'C'
      AND p_prev_statusAtividadeServico = 'C'
      OR p_prev_faturarAtividade = 'R'
      AND (p_previsto_realizado='R'
        AND (i_real_statusAtividadeServico = 'C'
          AND p_real_statusAtividadeServico <> 'C'
          OR i_real_statusAtividadeServico <> 'C'
          AND p_real_statusAtividadeServico = 'C')
        OR i_real_quantidade <> p_real_quantidade)
      OR p_prev_faturarAtividade <> 'R'
      AND i_prev_quantidade <> p_prev_quantidade)
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (432, 'Solicitar quantidade perdida ao encerrar apontamento de produção', 1, 30001, 'L', '1', 'E', 0, 'N', ' ', ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('27/03/2025', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 4' WHERE idVersaoSistema = 2025001001;

COMMIT;

-- FIM BETA 4 - 27/03/2025
