CREATE TABLE PACHECKLISTXTAREFAS_2401 AS SELECT * FROM PACHECKLISTXTAREFAS;

ALTER TABLE PACHECKLISTXTAREFAXOPCOES DROP CONSTRAINT PACHECKLISTXTAREFAXOPCOES_FK1;
ALTER TABLE MOORCAMENTOXTAREFAS DROP CONSTRAINT MOORCAMENTOXTAREFAS_FK2;

DROP TABLE PACHECKLISTXTAREFAS;

CREATE TABLE PACHECKLISTS_2401 AS SELECT * FROM PACHECKLISTS;

DROP TABLE PACHECKLISTS;

-- PACHECKLISTS
CREATE TABLE PACHECKLISTS
  (
    checklist     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao     VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACHECKLISTS ADD CONSTRAINT PACHECKLISTS_PK1 PRIMARY KEY (checklist);
CREATE INDEX PACHECKLISTS_K2 ON PACHECKLISTS (descricao);

INSERT INTO PACHECKLISTS (checklist, descricao, ativo, observacoes) VALUES (0, 'SELECIONE', 1, ' ');
INSERT INTO PACHECKLISTS (checklist, descricao, ativo, observacoes) SELECT checklist, descricao, ativo, observacoes FROM PACHECKLISTS_2401 WHERE checklist > 0;

COMMIT;

-- PACHECKLISTXTAREFAS
CREATE TABLE PACHECKLISTXTAREFAS
  (
    idCheckListXTarefas   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    checklist             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia             NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descricao             VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoCampo             CHAR (1) DEFAULT ' ' NOT NULL,
    mascara               VARCHAR (30) DEFAULT ' ' NOT NULL,
    exibirCampo           CHAR (1) DEFAULT ' ' NOT NULL,
    tipoArquivo           NUMERIC (3,0) DEFAULT 0 NOT NULL,
    obrigatorio           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    conteudoSugestao      VARCHAR (256) DEFAULT ' ' NOT NULL,
    tabelaSistema         VARCHAR (30) DEFAULT ' ' NOT NULL,
    observacoes           VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_PK1 PRIMARY KEY (idCheckListXTarefas);
CREATE UNIQUE INDEX PACHECKLISTXTAREFAS_K2 ON PACHECKLISTXTAREFAS (checklist, sequencia);
CREATE INDEX PACHECKLISTXTAREFAS_K3 ON PACHECKLISTXTAREFAS (descricao);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK1 FOREIGN KEY (checklist) REFERENCES PACHECKLISTS (checklist);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK2 FOREIGN KEY (tipoCampo) REFERENCES SITIPOSCAMPO (tipoCampo);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK3 FOREIGN KEY (exibirCampo) REFERENCES SIEXIBIRCAMPO (exibirCampo);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK4 FOREIGN KEY (tipoArquivo) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK5 FOREIGN KEY (tabelaSistema) REFERENCES SITABELASSISTEMA (tabelaSistema);

INSERT INTO PACHECKLISTXTAREFAS (idCheckListXTarefas, checklist, sequencia, descricao, ativo, tipoCampo, mascara, exibirCampo, tipoArquivo, obrigatorio, conteudoSugestao, tabelaSistema, observacoes) VALUES (0, 0, 0, ' ', 1, ' ', ' ', ' ', 0, 0, ' ', ' ', ' ');
INSERT INTO PACHECKLISTXTAREFAS (idCheckListXTarefas, checklist, sequencia, descricao, ativo, tipoCampo, mascara, exibirCampo, tipoArquivo, obrigatorio, conteudoSugestao, tabelaSistema, observacoes) SELECT idCheckListXTarefas, checklist, sequencia, descricao, ativo, tipoCampo, mascara, exibirCampo, tipoArquivo, obrigatorio, conteudoSugestao, tabelaSistema, observacoes FROM PACHECKLISTXTAREFAS_2401 WHERE idCheckListXTarefas > 0;

COMMIT;

ALTER TABLE PACHECKLISTXTAREFAXOPCOES ADD CONSTRAINT PACHECKLISTXTAREFAXOPCOES_FK1 FOREIGN KEY (idCheckListXTarefas) REFERENCES PACHECKLISTXTAREFAS (idCheckListXTarefas);
ALTER TABLE MOORCAMENTOXTAREFAS ADD CONSTRAINT MOORCAMENTOXTAREFAS_FK2 FOREIGN KEY (idCheckListXTarefas) REFERENCES PACHECKLISTXTAREFAS (idCheckListXTarefas);

UPDATE SITABELASSISTEMA SET numeroDigitosCodigo = 14 WHERE tabelaSistema = 'PACHECKLISTS';

COMMIT;

-- PAATIVIDADESERVXCHECKLIST;
CREATE TABLE PAATIVIDADESERVXCHECKLIST
  (
    id               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    atividadeServico NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    checklist        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX PAATIVIDADESERVXCHECKLIST_K2 ON PAATIVIDADESERVXCHECKLIST (atividadeServico, ordenacao, id);
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK1 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK2 FOREIGN KEY (checklist) REFERENCES PACHECKLISTS (checklist);

INSERT INTO PAATIVIDADESERVXCHECKLIST (id, atividadeServico, ordenacao, checklist, ativo, observacoes) VALUES (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 ('PAATIVIDADESERVXCHECKLIST', 'Atividade Serviço x Checklists', 1, 30820, 'PA', 'id', 'N', 14, ' ', 1, ' ', 0, 200005, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqAtividadeServicoXChecklist', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (952, 'Atividade Serviço x Checklists', 1, 2070006382, 20, 'OCU', 0, 401, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqAtividadeServicoXChecklist', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAPROJETOXATIVIDXPRODUTOS
CREATE TABLE PAPROJETOXATIVIDXPRODUTOS
  (
    idProdutoXAtividadeProjeto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    atividadeProjeto           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAPROJETOXATIVIDXPRODUTOS ADD CONSTRAINT PAPROJETOXATIVIDXPRODUTOS_PK1 PRIMARY KEY (idProdutoXAtividadeProjeto);
CREATE INDEX PAPROJETOXATIVIDXPRODUTOS_K2 ON PAPROJETOXATIVIDXPRODUTOS (atividadeProjeto, sequencia);
ALTER TABLE PAPROJETOXATIVIDXPRODUTOS ADD CONSTRAINT PAPROJETOXATIVIDXPRODUTOS_FK1 FOREIGN KEY (atividadeProjeto) REFERENCES PAPROJETOXATIVIDADES (atividadeProjeto);
ALTER TABLE PAPROJETOXATIVIDXPRODUTOS ADD CONSTRAINT PAPROJETOXATIVIDXPRODUTOS_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

INSERT INTO PAPROJETOXATIVIDXPRODUTOS (idProdutoXAtividadeProjeto, atividadeProjeto, sequencia, cancelado, gradeProduto, quantidade, observacoes) VALUES (0, 0, 0, 0, 0, 0, ' ');

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (953, 'Projeto X Atividades X Produtos', 1, 2060009530, 20, 'OCU', 0, 398, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqProjetoXProdutos', ' ', 0, 0, NULL, ' ');

COMMIT;

DROP INDEX TEMPSELECIONADOS_PK1;
DROP INDEX TEMPSELECIONADOS_K2;
DROP INDEX TEMPSELECIONADOS_K3;
CREATE UNIQUE INDEX TEMPSELECIONADOS_PK1 ON TEMPSELECIONADOS (sessaoClient, contadorSessao, ordenacao, id, codigo, id2, codigo2);
CREATE INDEX TEMPSELECIONADOS_K2 ON TEMPSELECIONADOS (sessaoClient, contadorSessao, id, codigo, id2, codigo2);
CREATE INDEX TEMPSELECIONADOS_K3 ON TEMPSELECIONADOS (sessaoClient, contadorSessao, quebra, id, codigo, id2, codigo2);

CREATE TABLE MOCONTRATOS_2401 AS SELECT * FROM MOCONTRATOS;

ALTER TABLE MOCONTRATOXITENS DROP CONSTRAINT MOCONTRATOXITENS_FK1;
ALTER TABLE MOEVENTOS DROP CONSTRAINT MOEVENTOS_FK13;

DROP TABLE MOCONTRATOS;

-- MOCONTRATOS
CREATE TABLE MOCONTRATOS
  (
    idContrato                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloContrato             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEmissao                DATE,
    dataVigenciaInicio         DATE,
    dataVigenciaTermino        DATE,
    dataProximoReajuste        DATE,
    diaFaturamento             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    diaVencimento              NUMERIC (2,0) DEFAULT 0 NOT NULL,
    pessoa                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cobranca                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    faturarClienteOrdemServico NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tabelaPreco                VARCHAR (10) DEFAULT ' ' NOT NULL,
    colaboradorResponsavel     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    vendedor                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    comissionadoB              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    comissionadoC              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contratoTerceiro           VARCHAR (15) DEFAULT ' ' NOT NULL,
    situacaoContrato           CHAR (1) DEFAULT ' ' NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_PK1 PRIMARY KEY (idContrato);
CREATE INDEX MOCONTRATOS_K2 ON MOCONTRATOS (pessoa);
CREATE INDEX MOCONTRATOS_K3 ON MOCONTRATOS (dataEmissao);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK1 FOREIGN KEY (modeloContrato) REFERENCES PAMODELOSCONTRATO (modeloContrato);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK3 FOREIGN KEY (diaFaturamento) REFERENCES SIDIAS (dia);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK4 FOREIGN KEY (diaVencimento) REFERENCES SIDIAS (dia);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK5 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK6 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK7 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK8 FOREIGN KEY (colaboradorResponsavel) REFERENCES CACOLABORADORES (colaborador);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK9 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK10 FOREIGN KEY (comissionadoB) REFERENCES CACOMISSIONADOSB (comissionadoB);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK11 FOREIGN KEY (comissionadoC) REFERENCES CACOMISSIONADOSC (comissionadoC);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK12 FOREIGN KEY (situacaoContrato) REFERENCES SISITUACOESCONTRATO (situacaoContrato);

INSERT INTO MOCONTRATOS (idContrato, modeloContrato, estabelecimento, dataEmissao, dataVigenciaInicio, dataVigenciaTermino, dataProximoReajuste, diaFaturamento, diaVencimento, pessoa, cobranca, faturarClienteOrdemServico, tabelaPreco, colaboradorResponsavel, vendedor, comissionadoB, comissionadoC, contratoTerceiro, situacaoContrato, observacoes) VALUES (0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, ' ', ' ', ' ');
INSERT INTO MOCONTRATOS (idContrato, modeloContrato, estabelecimento, dataEmissao, dataVigenciaInicio, dataVigenciaTermino, dataProximoReajuste, diaFaturamento, diaVencimento, pessoa, cobranca, faturarClienteOrdemServico, tabelaPreco, colaboradorResponsavel, vendedor, comissionadoB, comissionadoC, contratoTerceiro, situacaoContrato, observacoes) SELECT idContrato, modeloContrato, estabelecimento, dataEmissao, dataVigenciaInicio, dataVigenciaTermino, dataProximoReajuste, diaFaturamento, diaVencimento, pessoa, cobranca, faturarClienteOrdemServico, ' ', colaboradorResponsavel, vendedor, comissionadoB, comissionadoC, contratoTerceiro, situacaoContrato, observacoes FROM MOCONTRATOS_2401 WHERE idContrato > 0;

COMMIT;

ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK1 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK13 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);

-- MOCONTRATOXPROJETOS
CREATE TABLE MOCONTRATOXPROJETOS
  (
    id          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idContrato  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    projeto     VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCONTRATOXPROJETOS ADD CONSTRAINT MOCONTRATOXPROJETOS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOCONTRATOXPROJETOS_K2 ON MOCONTRATOXPROJETOS (idContrato, projeto);
CREATE INDEX MOCONTRATOXPROJETOS_K3 ON MOCONTRATOXPROJETOS (idContrato);
CREATE INDEX MOCONTRATOXPROJETOS_K4 ON MOCONTRATOXPROJETOS (projeto);
ALTER TABLE MOCONTRATOXPROJETOS ADD CONSTRAINT MOCONTRATOXPROJETOS_FK1 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);
ALTER TABLE MOCONTRATOXPROJETOS ADD CONSTRAINT MOCONTRATOXPROJETOS_FK2 FOREIGN KEY (projeto) REFERENCES PAPROJETOS (projeto);

INSERT INTO MOCONTRATOXPROJETOS (id, idContrato, projeto, ativo, observacoes) VALUES (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 ('MOCONTRATOXPROJETOS', 'Contrato X Projetos', 1, 50225, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SITIPOSPRECO (tipoPreco, descricao, ativo, validoCusto, observacoes) values ('R', 'Último Preço de Reposição', 1, 1, ' ');

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (165, '54', '54 - TODA LINDA STORE', 204, 1, 54, ' ');

COMMIT;

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        SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAMVAS                    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMVAS b WHERE b.pessoa = p_pessoaPara AND b.idNcm = a.idNcm AND b.produto = a.produto AND b.origemMercadoria = a.origemMercadoria AND b.estabelecimento = a.estabelecimento AND b.ufOrigem = a.ufOrigem));
  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 MOFINANCEIROS               SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOFINANCEIROXCOMISSOES      SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
  UPDATE MOFINANCEIROXBAIXAS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MONEGOCIACOESDIVIDAS        SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCELAMENTOS           SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCXPAGAMENTOS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSPCREGISTROS              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCOBRANCA         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCRM              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPONTUACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSEPARACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXITENS   SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXFISC    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOESTOQUES                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTROCA           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCTROCAXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOBALANCOS                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTRANSFERENCIA   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOCONSERTOS                 SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  UPDATE MORESERVASESTOQUE           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOMOTIVOSBLOQUEIOS          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOLOTESINGRESSO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOEVENTOS                   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  -- Transportadoras
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAREGRASFRETE               SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Cadastros
    UPDATE CAPLACAS                    SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.filtroProduto = a.filtroProduto));
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.filtroProduto = a.filtroProduto AND b.ativo = 1);
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaPara AND b.tabelaPreco = a.tabelaPreco));
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.tabelaPreco = a.tabelaPreco AND b.ativo = 1);
    UPDATE 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 PACARTEIRASFINPERMITIDAS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PACARTEIRASFINPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.carteiraFinanceira = a.carteiraFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAVALIDACOESPESSOA        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAVALIDACOESPESSOA b WHERE b.usuario = p_pessoaPara AND b.campoValidarPessoa = a.campoValidarPessoa AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.localValidarCampoPessoa = a.localValidarCampoPessoa AND b.meioPagamento = a.meioPagamento));
    UPDATE PACONTROLESENTREGA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASENTREGA             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE 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 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 MOHISTORICOCRM              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 MOSEPARACAOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCTRANSFXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOENTREGAXSITUACOES         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOMOTBLOQXLIBERACOES        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOEVENTOS                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnicos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CATECNICOSXCLIENTES       a SET a.tecnico = p_pessoaPara WHERE a.tecnico = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaPara AND b.cliente = a.cliente));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.tecnico = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXATIVIDADEPREV   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
    UPDATE MOORCAMENTOXATIVIDADEREAL   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separadores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOSEPARACOES                SET separador = p_pessoaPara WHERE separador = p_pessoaDe;
  END IF;
  -- Profissionais Registrados
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAESTABELECIMENTOS          SET contador = p_pessoaPara WHERE contador = p_pessoaDe;
    -- Cadastros
    UPDATE CARECEITASLENTESCLIENTE     SET medico = p_pessoaPara WHERE medico = p_pessoaDe;
  END IF;
  -- Credenciadoras Cartões
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.credenciadoraCartao = p_pessoaPara WHERE a.credenciadoraCartao = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred));
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.ativo = 1 WHERE a.credenciadoraCartao = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaDe AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred AND b.ativo = 1);
    -- Movimentações
    UPDATE MOFINANCEIROXCARTAO         SET credenciadoraCartao = p_pessoaPara WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Estabelecimentos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE PAESTABELECIMENTOS          SET pessoaEstabelecimento = p_pessoaPara WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Clientes
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.vendedor = a.vendedor));
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.vendedor = a.vendedor AND b.ativo = 1);
    UPDATE CATECNICOSXCLIENTES       a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.tecnico = a.tecnico));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.tecnico = a.tecnico AND b.ativo = 1);
    UPDATE CARECEITASLENTESCLIENTE     SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.fornecedor = p_pessoaPara WHERE a.fornecedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaPara AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto));
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.ativo = 1 WHERE a.fornecedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaDe AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXRECEITASOCUL    SET laboratorio = p_pessoaPara WHERE laboratorio = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINELCOMPRAXITENS        SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
  END IF;  
END ADD_TROCA_PESSOA;

/

create or replace 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_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;
  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;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_TABELA (
  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_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_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS 
  v_preco NUMBER;
BEGIN
  SELECT COALESCE (MAX (
    CASE
      WHEN a.promocao = 1
      THEN a.precoPromocaoAPrazo
      ELSE a.precoAPrazo
    END *
    CASE
      WHEN a.indexador = ' '
        OR a.cotacao = 0
      THEN 1
      ELSE a.cotacao
    END), 0) preco
  INTO v_preco
  FROM (
    SELECT
      a.precoAPrazo,
      a.promocao,
      a.precoPromocaoAPrazo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= SYSDATE)), 0) cotacao
    FROM (
      SELECT 
        a.precoAPrazo,
        a.promocao,
        a.precoPromocaoAPrazo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores
              + a.filtrarTamanhos
              + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND CASE 
          WHEN p_tabelaPreco <> ' '
            OR p_cab_entradaSaida = ' '
            OR p_modDoc_capituloNaturezaFisc = 9
          THEN 1
          WHEN p_cab_entradaSaida =
            CASE
              WHEN p_cab_devolucaoAnulacaoRetorno = 1
              THEN 'S'
              ELSE 'E'
            END
          THEN tabela.validoParaCompra
          ELSE tabela.validoParaVenda
        END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario =
              p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ANTERIOR (
  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_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_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS 
  v_preco NUMBER;
BEGIN
  SELECT COALESCE (MAX (
    CASE
      WHEN a.promocao = 1
      THEN a.precoPromocaoAPrazo
      ELSE a.precoAPrazo
    END *
    CASE
      WHEN a.indexador = ' '
        OR a.cotacao = 0
      THEN 1
      ELSE a.cotacao
    END),0) preco
  INTO v_preco
  FROM (
    SELECT
      a.precoAPrazo,
      a.promocao,
      a.precoPromocaoAPrazo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= SYSDATE)),0) cotacao
    FROM (
      SELECT 
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoAPrazo
          ELSE precoAnt.precoAPrazoAnterior
        END precoAPrazo,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.promocao
          ELSE precoAnt.promocaoAnterior
        END promocao,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoPromocaoAPrazo
          ELSE precoAnt.precoPromocaoAPrazoAnterior
        END precoPromocaoAPrazo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores
              + a.filtrarTamanhos
              + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela,
            precoAnt.data DESC) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      LEFT JOIN CATABELAPRECOXALTERACOES precoAnt
      ON precoAnt.idPrecoTabela = a.idPrecoTabela
      AND precoAnt.data >= p_cab_dataPrecoFinal
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND CASE 
          WHEN p_tabelaPreco <> ' '
            OR p_cab_entradaSaida = ' '
            OR p_modDoc_capituloNaturezaFisc = 9
          THEN 1
          WHEN p_cab_entradaSaida =
            CASE
              WHEN p_cab_devolucaoAnulacaoRetorno = 1
              THEN 'S'
              ELSE 'E'
            END
          THEN tabela.validoParaCompra
          ELSE tabela.validoParaVenda
        END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario =
              p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  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 NOT(kit.controleEstoque 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,
        0); -- p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO_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 NOT(a.controleEstoque 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,
        0); -- p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(a.controleEstoque 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 NOT(p_prod_controleEstoque 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,
          0); --p_gerandoInventario
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_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_TABELA (
  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_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_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  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
  SELECT
    COALESCE (MAX (a.tabelaPreco), ' ') tabelaPreco,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAVista,
    COALESCE (MAX (a.precoDesconto * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoDesconto,
    COALESCE (MAX (a.precoMinimo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoMinimo,
    COALESCE (MAX (a.precoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAPrazo,
    COALESCE (MAX (a.precoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAVista,
    COALESCE (MAX (a.promocao), 0) promocao,
    COALESCE (MAX (a.precoPromocaoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAPrazo,
    COALESCE (MAX (a.precoPromocaoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAVista,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END), 0) precoIndexadoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END), 0) precoIndexadoAVista
  INTO
    r_tabelaPreco,
    r_precoSugestaoAPrazo,
    r_precoSugestaoAVista,
    r_precoDesconto,
    r_precoMinimo,
    r_precoAPrazo,
    r_precoAVista,
    r_promocao,
    r_precoPromocaoAPrazo,
    r_precoPromocaoAVista,
    r_precoIndexadoAPrazo,
    r_precoIndexadoAVista
  FROM(
    SELECT 
      a.tabelaPreco,
      a.precoAPrazo,
      a.precoAVista,
      a.promocao,
      a.precoPromocaoAVista,
      a.precoPromocaoAPrazo,
      a.precoDesconto,
      a.precoMinimo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= sysdate)),0) cotacao
    FROM (
      SELECT 
        a.tabelaPreco,
        a.precoAPrazo,
        a.precoAVista,
        a.promocao,
        a.precoPromocaoAVista,
        a.precoPromocaoAPrazo,
        a.precoDesconto,
        a.precoMinimo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores + a.filtrarTamanhos + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND
          CASE
            WHEN p_tabelaPreco <> ' '
              OR p_cab_entradaSaida = ' '
              OR p_modDoc_capituloNaturezaFisc = 9
            THEN 1
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN tabela.validoParaCompra
            ELSE tabela.validoParaVenda
          END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario = p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  r_informarPrecoManualmente :=
    CASE
      WHEN r_tabelaPreco <> ' '
        AND r_precoSugestaoAPrazo = 0
      THEN 1
      ELSE 0
    END;
  IF r_tabelaPreco <> ' '
    AND r_precoSugestaoAPrazo = 0
    AND r_precoSugestaoAVista = 0
    AND p_manterPreco = 1
  THEN
    r_precoSugestaoAPrazo := p_precoSugestaoAPrazoOriginal;
    r_precoSugestaoAVista := p_precoSugestaoAVistaOriginal;
  END IF;
END ADD_BUSCA_PRECO_INTERNO_TABELA;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_ANTER (
  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_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_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  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
  SELECT
    COALESCE (MAX (a.tabelaPreco), ' ') tabelaPreco,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAVista,
    COALESCE (MAX (a.precoDesconto * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoDesconto,
    COALESCE (MAX (a.precoMinimo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoMinimo,
    COALESCE (MAX (a.precoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAPrazo,
    COALESCE (MAX (a.precoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAVista,
    COALESCE (MAX (a.promocao), 0) promocao,
    COALESCE (MAX (a.precoPromocaoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAPrazo,
    COALESCE (MAX (a.precoPromocaoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAVista,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END), 0) precoIndexadoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END), 0) precoIndexadoAVista
  INTO
    r_tabelaPreco,
    r_precoSugestaoAPrazo,
    r_precoSugestaoAVista,
    r_precoDesconto,
    r_precoMinimo,
    r_precoAPrazo,
    r_precoAVista,
    r_promocao,
    r_precoPromocaoAPrazo,
    r_precoPromocaoAVista,
    r_precoIndexadoAPrazo,
    r_precoIndexadoAVista
  FROM(
    SELECT 
      a.tabelaPreco,
      a.precoAPrazo,
      a.precoAVista,
      a.promocao,
      a.precoPromocaoAVista,
      a.precoPromocaoAPrazo,
      a.precoDesconto,
      a.precoMinimo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= sysdate)),0) cotacao
    FROM (
      SELECT 
        a.tabelaPreco,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoAPrazo
          ELSE precoAnt.precoAPrazoAnterior
        END precoAPrazo,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoAVista
          ELSE precoAnt.precoAVistaAnterior
        END precoAVista,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.promocao
          ELSE precoAnt.promocaoAnterior
        END promocao,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoPromocaoAPrazo
          ELSE precoAnt.precoPromocaoAPrazoAnterior
        END precoPromocaoAPrazo,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoPromocaoAVista
          ELSE precoAnt.precoPromocaoAVistaAnterior
        END precoPromocaoAVista,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoDesconto
          ELSE precoAnt.precoDescontoAnterior
        END precoDesconto,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoMinimo
          ELSE precoAnt.precoMinimoAnterior
        END precoMinimo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores + a.filtrarTamanhos + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      LEFT JOIN CATABELAPRECOXALTERACOES precoAnt
      ON precoAnt.idPrecoTabela = a.idPrecoTabela
      AND precoAnt.data >= p_cab_dataPrecoFinal
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND
          CASE 
            WHEN p_tabelaPreco <> ' '
              OR p_cab_entradaSaida = ' '
              OR p_modDoc_capituloNaturezaFisc = 9
            THEN 1
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN tabela.validoParaCompra
            ELSE tabela.validoParaVenda
          END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario = p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  r_informarPrecoManualmente :=
    CASE
      WHEN r_tabelaPreco <> ' '
        AND r_precoSugestaoAPrazo = 0
      THEN 1
      ELSE 0
    END;
  IF r_tabelaPreco <> ' '
    AND r_precoSugestaoAPrazo = 0
    AND r_precoSugestaoAVista = 0
    AND p_manterPreco = 1
  THEN
    r_precoSugestaoAPrazo := p_precoSugestaoAPrazoOriginal;
    r_precoSugestaoAVista := p_precoSugestaoAVistaOriginal;
  END IF;
END ADD_BUSCA_PRECO_INTERNO_ANTER;

/

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 NOT(a.controleEstoque 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,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(a.controleEstoque 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 NOT(a.controleEstoque 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,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(a.controleEstoque 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 NOT(p_prod_controleEstoque 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,
            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 NOT(p_prod_controleEstoque 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 NOT (p_modDoc_fatorMultiplicador IN (0,1)) AND (p_manterPreco = 0 OR p_tipoPreco = p_modDoc_tipoPreco AND p_tabelaPreco = p_modDoc_tabelaPreco) THEN
          r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoSugestaoAVista := r_precoSugestaoAVista * p_modDoc_fatorMultiplicador;
          r_precoDesconto       := r_precoDesconto       * p_modDoc_fatorMultiplicador;
          r_precoMinimo         := r_precoMinimo         * p_modDoc_fatorMultiplicador;
          r_precoAPrazo         := r_precoAPrazo         * p_modDoc_fatorMultiplicador;
          r_precoAVista         := r_precoAVista         * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAPrazo := r_precoPromocaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAVista := r_precoPromocaoAVista * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAPrazo := r_precoIndexadoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAVista := r_precoIndexadoAVista * p_modDoc_fatorMultiplicador;
        END IF;
      -- Se não encontrou preço, não mantém o atual e existe regra de preço B
      ELSIF p_manterPreco = 0 AND p_modDoc_tipoPrecoB <> ' ' THEN
        ADD_BUSCA_PRECO (
          p_config_64_casasDecSaidas,
          p_config_65_casasDecEntrada,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_entradaSaida,
          p_cab_devolucaoAnulacaoRetorno,
          p_cab_estabelecimento,
          p_cab_dataPrecoInicial,
          p_cab_dataPrecoFinal,
          p_cab_pessoa,
          p_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 NOT(a.controleEstoque 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,
              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 NOT(a.controleEstoque 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 NOT(CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END 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 NOT (a.fatorMultiplicadorPreco 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 FUNCTION FUNC_ADD_BUSCA_STRING_PRECO (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_grade_produto                IN NUMBER,
  p_grade_cor                    IN NUMBER,
  p_grade_tamanho                IN VARCHAR,
  p_prod_controleEstoque         IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR)
  RETURN CHAR
IS
  v_tipoPreco                  CHAR(1);
  v_tabelaPreco                CHAR(10);
  v_precoSugestaoAPrazo        CHAR(20);
  v_precoSugestaoAVista        CHAR(20);
  v_precoDesconto              CHAR(20);
  v_precoMinimo                CHAR(20);
  v_informarPrecoManualmente   CHAR(1);
  v_precoAPrazo                CHAR(20);
  v_precoAVista                CHAR(20);
  v_promocao                   CHAR(1);
  v_precoPromocaoAPrazo        CHAR(20);
  v_precoPromocaoAVista        CHAR(20);
  v_precoIndexadoAPrazo        CHAR(20);
  v_precoIndexadoAVista        CHAR(20);
BEGIN
  ADD_BUSCA_PRECO (
    p_config_64_casasDecSaidas,
    p_config_64_casasDecSaidas,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_perfilUsuarioLogado,
    p_usuarioLogado,
    'S',
    0,
    p_cab_estabelecimento,
    TO_DATE ('01/01/1900','DD/MM/YYYY'),
    p_cab_dataPrecoFinal,
    p_cab_pessoa,
    ' ',
    1,
    p_tipoPreco,
    p_tabelaPreco,
    1,
    ' ',
    ' ',
    0,
    p_endPessEst_uf,
    p_endPess_uf,
    p_item_vendedor,
    p_item_idFormulaTinta,
    0,
    0,
    0,
    1,
    p_grade_produto,
    p_grade_cor,
    p_grade_tamanho,
    p_prod_controleEstoque,
    '0',
    CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
    0,
    0,
    p_tipoPreco,
    p_tabelaPreco,
    v_tipoPreco,
    v_tabelaPreco,
    v_precoSugestaoAPrazo,
    v_precoSugestaoAVista,
    v_precoDesconto,
    v_precoMinimo,
    v_informarPrecoManualmente,
    v_precoAPrazo,
    v_precoAVista,
    v_promocao,
    v_precoPromocaoAPrazo,
    v_precoPromocaoAVista,
    v_precoIndexadoAPrazo,
    v_precoIndexadoAVista);
  RETURN COALESCE(v_tipoPreco,' ')
    || '|' || v_tabelaPreco
    || '|' || v_precoSugestaoAPrazo
    || '|' || v_precoSugestaoAVista
    || '|' || v_precoDesconto
    || '|' || v_precoMinimo
    || '|' || v_informarPrecoManualmente
    || '|' || v_precoAVista
    || '|' || v_precoAPrazo
    || '|' || v_promocao
    || '|' || v_precoPromocaoAVista
    || '|' || v_precoPromocaoAPrazo;
END;

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_GERA_TEMP_MARGEM (
  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_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  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
  IF p_idItemDocFiscal = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (p_idDocumentoFiscal);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'D'
    AND idCabecalho = p_idDocumentoFiscal;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MODOCFISCALXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemDocFiscal = p_idItemDocFiscal
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'D'
      AND temp.idCabecalho = p_idDocumentoFiscal;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    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),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.idDocumentoFiscal = p_idDocumentoFiscal;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MODOCFISCALXITENS a
    WHERE p_idItemDocFiscal = 0
    AND idDocumentoFiscal = p_idDocumentoFiscal
    OR p_idItemDocFiscal <> 0
    AND idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    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_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      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;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'D'                            orcamentoPredocumentoDocumento,
      p_idDocumentoFiscal            idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      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.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    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,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_DOC_FISC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_PRE_DOC_GERA_TEMP_MARGEM (
  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_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  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
  IF p_idItemPreDocumento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (p_preDocumento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'P'
    AND idCabecalho = p_preDocumento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOPREDOCUMXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemPreDocumento = p_idItemPreDocumento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'P'
      AND temp.idCabecalho = p_preDocumento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    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),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.preDocumento = p_preDocumento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOPREDOCUMXITENS a
    WHERE p_idItemPreDocumento = 0
    AND preDocumento = p_preDocumento
    OR p_idItemPreDocumento <> 0
    AND idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    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_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      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;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'P'                            orcamentoPredocumentoDocumento,
      p_preDocumento                 idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      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.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    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,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_PRE_DOC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_GERA_TEMP_MARGEM (
  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_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  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
  IF p_idItemOrcamento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (p_orcamento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'O'
    AND idCabecalho = p_orcamento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOORCAMENTOXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemOrcamento = p_idItemOrcamento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'O'
      AND temp.idCabecalho = p_orcamento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    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),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.orcamento = p_orcamento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOORCAMENTOXITENS a
    WHERE p_idItemOrcamento = 0
    AND orcamento = p_orcamento
    OR p_idItemOrcamento <> 0
    AND idItemOrcamento = p_idItemOrcamento)
  LOOP
    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_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      0,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      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;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'O'                            orcamentoPredocumentoDocumento,
      p_orcamento                    idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      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.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    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,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_ORCAMENTO_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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_idEnderecoEstoque       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_atualizarObservacoes         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_idEnderecoEstoque            NUMBER;
  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_uniMedConv_casasDecimaisUnid NUMBER;
  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      := a.controleQuantidadeVenda;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            ELSE (
              CASE
                WHEN a.controleQuantidadeVenda = 4 AND a.unidadeMedidaVenda <> ' ' AND a.conversorQuantidadeVenda <> 0 AND a.conversorQuantidadeVenda <> 1
                THEN a.unidadeMedidaVenda
                ELSE a.unidadeMedida
              END
            )
          END;
        v_combo_conversorQuantidade := a.conversorQuantidadeVenda;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
        SELECT COALESCE ( MAX (casasDecimaisUnidadeMedida), 0)
        INTO v_uniMedConv_casasDecimaisUnid
        FROM SIUNIDADESMEDIDA
        WHERE unidadeMedida = v_combo_unidadeMedidaConversao;
      END IF;
      IF v_combo_controleQuantidade NOT BETWEEN 1 AND 4 OR v_combo_controleQuantidade = 4 AND (v_combo_conversorQuantidade = 0 OR v_combo_conversorQuantidade = 1)
      THEN
        v_combo_controleQuantidade := 1;
      END IF;
      IF v_combo_controleQuantidade <> 4 THEN
        v_combo_conversorQuantidade  := 1;
      END IF;
      IF v_combo_controleQuantidade = 1 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      ELSIF 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 / ((a.altura / 100) * (v_combo_largura / 100))),3) END;
        v_combo_quantidadeConvertida := ROUND (v_combo_pecas, v_uniMedConv_casasDecimaisUnid);
      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 / ((a.altura / 100) * (v_combo_largura / 100) * v_combo_comprimento),3) END;
        v_combo_quantidadeConvertida := ROUND (v_combo_pecas, v_uniMedConv_casasDecimaisUnid);
      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),3) END;
        v_combo_quantidadeConvertida := ROUND (v_combo_pecas, v_uniMedConv_casasDecimaisUnid);
      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_perfilUsuarioLogado,
        p_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_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        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_idEnderecoEstoque
        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
      ADD_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 14, p_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
