    SELECT
      cabOrc.tipoDocumento,
      cabOrc.entradaSaida,
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END estabelecimento,
      doc.dataEmissao,
      itemOrc.dataEntrega,
      itemOrc.idItemOrcamento,
      itemOrc.modeloDocumento,
      itemDoc.gradeProduto,
      itemDoc.personalizacao,
      itemDoc.idFormulaTinta,
      itemDoc.idLoteEstoque,
      itemDoc.localEstoque,
      itemDoc.pessoaParticipante,
      ( itemDoc.quantidade
        - itemDoc.quantidadeDevolvidaRetornada
        - COALESCE ((
            SELECT SUM (entr.quantidade *
              CASE
                WHEN itemDoc.quantidadeConvertida = 0
                THEN 1
                ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
              END)
            FROM MOENTREGAS entr
            WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
            AND entr.situacaoEntrega IN (5,6)),0)) quantidadeSaldo,
      itemDoc.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
    FROM MOORCAMENTOXITENS itemOrc
    JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
    ON docXOrc.idItemOrcamento = itemOrc.idItemOrcamento
    JOIN MOPREDOCUMXITENS itemDoc
    ON itemDoc.idItemPreDocumento = docXOrc.idItemPreDocumento
    JOIN MOPREDOCUMENTOS doc
    ON doc.preDocumento = itemDoc.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = itemDoc.localEstoque 
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento =
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END    
    AND estXLoc.localEstoque = itemDoc.localEstoque
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND itemOrc.quantidadeSaldo = 0
    AND itemOrc.controleEntrega > 0
    AND cabOrc.tipoDocumento <> 202
    AND etapOrc.situacaoOrcamento BETWEEN 64 AND 89
    AND contrEntr.reservaEstoque = 1
    AND docXOrc.quantidade > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 0
    AND doc.entradaSaida = 'S'
    AND doc.devolucaoAnulacaoRetorno = 0
    AND doc.statusPreDocumento <> 'C'
    AND ( itemDoc.quantidade
      - itemDoc.quantidadeDevolvidaRetornada
      - COALESCE ((
          SELECT SUM (entr.quantidade *
            CASE
              WHEN itemDoc.quantidadeConvertida = 0
              THEN 1
              ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
            END)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
          AND entr.situacaoEntrega IN (5,6)),0)) > 0
    UNION ALL
    SELECT
      cabOrc.tipoDocumento,
      cabOrc.entradaSaida,
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END estabelecimento,
      doc.dataEmissao,
      doc.dataEntradaSaida dataEntrega,
      itemOrc.idItemOrcamento,
      itemOrc.modeloDocumento,
      itemDoc.gradeProduto,
      itemDoc.personalizacao,
      itemDoc.idFormulaTinta,
      itemDoc.idLoteEstoque,
      itemDoc.localEstoque,
      itemDoc.pessoaParticipante,
      ( itemDoc.quantidade
        - itemDoc.quantidadeDevolvidaRetornada
        - COALESCE ((
            SELECT SUM (entr.quantidade *
              CASE
                WHEN itemDoc.quantidadeConvertida = 0
                THEN 1
                ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
              END)
            FROM MOENTREGAS entr
            WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
            AND entr.situacaoEntrega IN (5,6)),0)) quantidadeSaldo,
      itemDoc.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) solicitaEnderecoEstoque
    FROM MOORCAMENTOXITENS itemOrc
    JOIN MODOCFISCALXORCAMENTOITEM docXOrc
    ON docXOrc.idItemOrcamento = itemOrc.idItemOrcamento
    JOIN MODOCFISCALXITENS itemDoc
    ON itemDoc.idItemDocFiscal = docXOrc.idItemDocFiscal
    JOIN MODOCUMENTOSFISCAIS doc
    ON doc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemDoc.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PACONTROLESENTREGA contrEntr
    ON contrEntr.controleEntrega = itemOrc.controleEntrega
    JOIN MOORCAMENTOS cabOrc
    ON cabOrc.orcamento = itemOrc.orcamento
    JOIN PAETAPASORCAMENTO etapOrc
    ON etapOrc.etapaOrcamento = cabOrc.etapaOrcamento
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = itemDoc.localEstoque 
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento =
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END
    AND estXLoc.localEstoque = itemDoc.localEstoque
    WHERE itemOrc.idItemOrcamento = p_item_idItemOrcamento
    AND itemOrc.cancelado = 0
    AND itemOrc.movimentaEstoque = 1
    AND itemOrc.quantidadeSaldo = 0
    AND itemOrc.controleEntrega > 0
    AND cabOrc.tipoDocumento <> 202
    AND etapOrc.situacaoOrcamento BETWEEN 64 AND 89
    AND contrEntr.reservaEstoque = 1
    AND docXOrc.quantidade > 0
    AND itemDoc.cancelado = 0
    AND itemDoc.movimentaEstoque = 0
    AND doc.entradaSaida = 'S'
    AND doc.devolucaoAnulacaoRetorno = 0
    AND doc.situacaoDocumentoFiscal <= 23
    AND ( itemDoc.quantidade
      - itemDoc.quantidadeDevolvidaRetornada
      - COALESCE ((
          SELECT SUM (entr.quantidade *
            CASE
              WHEN itemDoc.quantidadeConvertida = 0
              THEN 1
              ELSE itemDoc.quantidade / itemDoc.quantidadeConvertida
            END)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = itemOrc.idItemOrcamento
          AND entr.situacaoEntrega IN (5,6)),0)) > 0)
  LOOP
    IF a.tipoDocumento = 202 THEN
      ADD_ORCAMENTO_ITEM_RES_AT_PREV (
        p_estabelecimentoAtivo,
        a.estabelecimento,
        a.dataEmissao,
        a.dataEntrega,
        a.idItemOrcamento,
        a.localEstoque,
        a.pessoaParticipante,
        a.indicadorPropriedadePosseItem,
        r_bufferIdReservaEstoque,
        r_bufferIdReservaEstoque);
      ADD_ORCAMENTO_ITEM_EST_AT_PREV (
        p_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.estabelecimento,
        a.idItemOrcamento,
        a.localEstoque,
        a.pessoaParticipante,
        a.indicadorPropriedadePosseItem,
        r_bufferIdEstoque,
        r_bufferIdEstoque);
    ELSE
      v_quantidadeEnderecoEstoque := 0;
      v_quantidadeNumerosSerie    := 0;
      IF a.solicitaEnderecoEstoque = 1
        AND a.controleEstoque IN (1,3,4,5,6,11,12)
      THEN
        ADD_ORCAMENTO_ITEM_RES_ENDEREC (
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          a.entradaSaida,
          a.estabelecimento,
          a.dataEmissao,
          a.dataEntrega,
          a.idItemOrcamento,
          a.modeloDocumento,
          a.gradeProduto,
          a.personalizacao,
          a.idFormulaTinta,
          a.idLoteEstoque,
          a.localEstoque,
          a.pessoaParticipante,
          a.quantidadeSaldo,
          a.observacoes,
          a.controlaNumeroSerie,
          a.controleEstoque,
          a.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque,
          v_quantidadeEnderecoEstoque);
      END IF;
      IF a.quantidadeSaldo > v_quantidadeEnderecoEstoque THEN
        IF a.controleEstoque = 12 AND a.idFormulaTinta > 0 THEN
          ADD_RESERVA_ESTOQUE_FORM_TINTA (
            r_bufferIdReservaEstoque, 
            p_estabelecimentoAtivo, 
            a.modeloDocumento,
            a.entradaSaida,
            a.estabelecimento,
            a.dataEmissao,
            a.dataEntrega,
            a.idItemOrcamento,
            0, -- p_idFichaProdutoPrevOrcamento
            0, -- p_idItemDocTransferencia
            a.idFormulaTinta,
            a.localEstoque,
            a.pessoaParticipante,
            0, -- p_item_idEnderecoEstoque
            a.quantidadeSaldo - v_quantidadeEnderecoEstoque,
            a.observacoes,
            a.indicadorPropriedadePosseItem,
            r_bufferIdReservaEstoque);
        ELSIF a.controleEstoque IN (3,4) THEN
          ADD_ORCAMENTO_ITEM_RES_KIT (
            r_bufferIdReservaEstoque,
            p_estabelecimentoAtivo,
            a.entradaSaida,
            a.estabelecimento,
            a.dataEmissao,
            a.dataEntrega,
            a.idItemOrcamento,
            a.modeloDocumento,
            a.gradeProduto,
            a.localEstoque,
            a.pessoaParticipante,
            0, -- p_item_idEnderecoEstoque
            a.quantidadeSaldo - v_quantidadeEnderecoEstoque,
            a.observacoes,
            0, -- p_end_idEnderecoEstoqueOrcam
            a.indicadorPropriedadePosseItem,
            r_bufferIdReservaEstoque);
        ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
          v_quantidadeNumerosSerie := 0;
          IF a.controlaNumeroSerie > 0 THEN
            ADD_ORCAMENTO_ITEM_RES_N_SERIE (
              r_bufferIdReservaEstoque, 
              p_estabelecimentoAtivo, 
              a.entradaSaida,
              a.estabelecimento,
              a.dataEmissao,
              a.dataEntrega,
              a.idItemOrcamento,
              a.modeloDocumento,
              a.gradeProduto,
              a.personalizacao,
              a.idLoteEstoque,
              a.localEstoque,
              a.pessoaParticipante,
              0, -- p_item_idEnderecoEstoque
              a.observacoes,
              0, -- p_end_idEnderecoEstoqueOrcam
              a.indicadorPropriedadePosseItem,
              r_bufferIdReservaEstoque,
              v_quantidadeNumerosSerie);
          END IF;
          IF a.quantidadeSaldo - v_quantidadeEnderecoEstoque > v_quantidadeNumerosSerie THEN
            ADD_RESERVA_ESTOQUE_GRAVA (
              0,
              r_bufferIdReservaEstoque, 
              p_estabelecimentoAtivo, 
              a.estabelecimento,
              a.dataEntrega, -- p_data
              a.gradeProduto,
              a.modeloDocumento,
              a.entradaSaida,
              a.indicadorPropriedadePosseItem,
              a.pessoaParticipante,
              a.localEstoque,
              a.personalizacao,
              a.idLoteEstoque,
              0, -- p_idEnderecoEstoque
              0, -- p_idNumeroSerie
              a.quantidadeSaldo - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
              a.observacoes,
              a.idItemOrcamento,
              0, -- p_idFichaProdutoPrevOrcamento
              0, -- p_idItemDocTransferencia
              v_idReservaEstoque,
              r_bufferIdReservaEstoque);
          END IF;
        END IF;
        ADD_ORCAMENTO_ITEM_RES_COMP (
          r_bufferIdReservaEstoque,
          p_estabelecimentoAtivo,
          a.entradaSaida,
          a.estabelecimento,
          a.dataEmissao,
          a.dataEntrega,
          a.idItemOrcamento,
          a.modeloDocumento,
          a.localEstoque,
          a.pessoaParticipante,
          0, -- p_item_idEnderecoEstoque
          a.quantidadeSaldo - v_quantidadeEnderecoEstoque,
          0, -- p_end_idEnderecoEstoqueOrcam
          a.indicadorPropriedadePosseItem,
          r_bufferIdReservaEstoque);
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_RES_ITEM;

/

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

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_N_SERIE (
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_entradaSaida                 IN CHAR,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemSeparacao         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_endEst_idEnderecoEstoqueSep  IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MOSEPARACAOXNUMEROSSERIE
    WHERE idItemSeparacao = p_item_idItemSeparacao
    AND idEnderecoEstoqueSeparacao = p_endEst_idEnderecoEstoqueSep
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_ESTOQUE_INSERE (
      r_bufferIdEstoque, 
      p_estabelecimentoAtivo, 
      p_cab_estabelecimento,
      CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
      p_item_gradeProduto,
      p_cab_modeloDocumento,
      104,
      0, -- p_cab_atualizaCustoMedio,
      0, -- p_cab_atualizaUltimaCompra,
      p_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_idEnderecoEstoque,
      a.idNumeroSerie,
      1, -- p_item_quantidade,
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2),
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2),
      p_item_observacoes,
      0, -- p_idFichaProdutoRealOrcamento
      0, -- p_idItemPreDocumento
      0, -- p_idItemDocFiscal
      p_item_idItemSeparacao,
      0, -- p_divergenciaBalanco
      0, -- p_idItemDocTransferencia
      r_bufferIdEstoque);
  END LOOP;
END ADD_SEPARACAO_ITEM_EST_N_SERIE;

/
create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_KIT (
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_entradaSaida                 IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemSeparacao         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_endEst_idEnderecoEstoqueSep  IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF a.controleEstoque IN (3,4) THEN
      ADD_SEPARACAO_ITEM_EST_KIT (
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemSeparacao,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueSep,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_SEPARACAO_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_entradaSaida,
          p_cab_modeloDocumento,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemSeparacao,
          a.gradeProdutoFilho,
          0, -- p_item_idFormulaTinta
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          p_item_localEstoque,
          p_item_pessoaParticipante,
          0, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV
          p_item_observacoes,
          p_endEst_idEnderecoEstoqueSep,
          p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          a.gradeProdutoFilho,
          p_cab_modeloDocumento,
          104, -- p_cab_operacaoInternaEstoque
          0, -- p_cab_atualizaCustoMedio
          0, -- p_cab_atualizaUltimaCompra
          p_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento
          0, -- p_idItemDocFiscal
          p_item_idItemSeparacao,
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque);
      END IF;    
    END IF;
  END LOOP;
END ADD_SEPARACAO_ITEM_EST_KIT;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_ENDEREC (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_entradaSaida                 IN CHAR,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemSeparacao         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoqueSeparacao,
      quantidade 
    FROM MOSEPARACAOXENDERECOESTOQ
    WHERE idItemSeparacao = p_item_idItemSeparacao
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        104, -- p_cab_operacaoInternaEstoque
        0, -- p_cab_atualizaCustoMedio,
        0, -- p_cab_atualizaUltimaCompra,
        p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        0, -- p_modDoc_geraTransferencia,
        0, -- p_modDoc_geraOperacaoEmTransit,
        0, -- p_modDoc_transitoLocalEstoque,
        ' ', -- p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        p_item_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_SEPARACAO_ITEM_EST_KIT (
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemSeparacao,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoqueSeparacao,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN  
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_SEPARACAO_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_entradaSaida,
          p_cab_modeloDocumento,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemSeparacao,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          a.idEnderecoEstoqueSeparacao,
          a.idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          104, -- p_cab_operacaoInternaEstoque
          0, -- p_cab_atualizaCustoMedio,
          0, -- p_cab_atualizaUltimaCompra,
          p_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          a.idEnderecoEstoque,
          0, -- p_idNumeroSerie,
          a.quantidade - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          p_item_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);    
      END IF;
    END IF;
  END LOOP;
END ADD_SEPARACAO_ITEM_EST_ENDEREC;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_GRAVA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemSeparacao         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoqueSaida       IN NUMBER,
  p_item_pessoaParticipanteSaida IN NUMBER,
  p_item_localEstoqueEntrada     IN NUMBER,
  p_item_pessoaParticipanteEntra IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_locEst_indicProprPosseSaida  IN CHAR,
  p_estXLoc_solicitaEnderSaida   IN NUMBER,
  p_locEst_indicProprPosseEntrad IN CHAR,
  p_estXLoc_solicitaEnderEntrada IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie := 0;
  IF p_estXLoc_solicitaEnderSaida = 1 AND p_prod_controleEstoque IN (1,3,4,5,6,11,12) THEN
    ADD_SEPARACAO_ITEM_EST_ENDEREC (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      'S', -- p_entradaSaida,
      p_cab_modeloDocumento,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemSeparacao,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_localEstoqueSaida,
      p_item_pessoaParticipanteSaida,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_locEst_indicProprPosseSaida,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        104, -- p_cab_operacaoInternaEstoque
        0, -- p_cab_atualizaCustoMedio,
        0, -- p_cab_atualizaUltimaCompra,
        'S', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        0, -- p_modDoc_geraTransferencia,
        0, -- p_modDoc_geraOperacaoEmTransit,
        0, -- p_modDoc_transitoLocalEstoque,
        ' ', -- p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseSaida,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        p_item_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_SEPARACAO_ITEM_EST_KIT(
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemSeparacao,
        p_item_gradeProduto,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueSep,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN  
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_SEPARACAO_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          'S', -- p_entradaSaida,
          p_cab_modeloDocumento,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemSeparacao,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoqueSaida,
          p_item_pessoaParticipanteSaida,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          0, -- p_endEst_idEnderecoEstoqueSep,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          104, -- p_cab_operacaoInternaEstoque
          0, -- p_cab_atualizaCustoMedio,
          0, -- p_cab_atualizaUltimaCompra,
          'S', -- p_entradaSaida,
          p_locEst_indicProprPosseSaida,
          p_item_pessoaParticipanteSaida,
          p_item_localEstoqueSaida,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          0, -- p_idEnderecoEstoque,
          0, -- p_idNumeroSerie,
          p_item_quantidade - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          p_item_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);    
      END IF;
    END IF;
  END IF;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie := 0;
  IF p_estXLoc_solicitaEnderEntrada = 1 AND p_prod_controleEstoque IN (1,3,4,5,6,11,12) THEN
    ADD_SEPARACAO_ITEM_EST_ENDEREC (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      'E', -- p_entradaSaida,
      p_cab_modeloDocumento,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemSeparacao,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_localEstoqueEntrada,
      p_item_pessoaParticipanteEntra,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_locEst_indicProprPosseEntrad,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        104, -- p_cab_operacaoInternaEstoque
        0, -- p_cab_atualizaCustoMedio,
        0, -- p_cab_atualizaUltimaCompra,
        'E', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        0, -- p_modDoc_geraTransferencia,
        0, -- p_modDoc_geraOperacaoEmTransit,
        0, -- p_modDoc_transitoLocalEstoque,
        ' ', -- p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoqueEntrada,
        p_item_pessoaParticipanteEntra,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseEntrad,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        p_item_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_SEPARACAO_ITEM_EST_KIT (
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'E', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemSeparacao,
        p_item_gradeProduto,
        p_item_localEstoqueEntrada,
        p_item_pessoaParticipanteEntra,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueSep,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseEntrad,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN  
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_SEPARACAO_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          'E', -- p_entradaSaida,
          p_cab_modeloDocumento,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemSeparacao,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoqueEntrada,
          p_item_pessoaParticipanteEntra,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          0, -- p_endEst_idEnderecoEstoqueSep,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseEntrad,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          104, -- p_cab_operacaoInternaEstoque
          0, -- p_cab_atualizaCustoMedio,
          0, -- p_cab_atualizaUltimaCompra,
          'E', -- p_entradaSaida,
          p_locEst_indicProprPosseEntrad,
          p_item_pessoaParticipanteEntra,
          p_item_localEstoqueEntrada,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          0, -- p_idEnderecoEstoque,
          0, -- p_idNumeroSerie,
          p_item_quantidade - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          p_item_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);    
      END IF;
    END IF;
  END IF;
END ADD_SEPARACAO_ITEM_EST_GRAVA;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_ATUALIZ (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemSeparacao              IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  ADD_ESTOQUE_SEPARACAO_EXCLUI (
    p_idItemSeparacao,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEstS.indicadorPropriedadePosseItem locEst_indicProprPosseSaida,
      COALESCE (estXLocS.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderSaida,
      locEstE.indicadorPropriedadePosseItem locEst_indicProprPosseEntrada,
      COALESCE (estXLocE.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderEntrada
    FROM MOSEPARACAOXITENS item
    JOIN MOSEPARACOES cab
    ON cab.separacao = item.separacao
    JOIN PAETAPASSEPARACAO etap
    ON etap.etapaSeparacao = cab.etapaSeparacao
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstS
    ON locEstS.localEstoque = item.localEstoqueSaida
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocS
    ON estXLocS.estabelecimento = cab.estabelecimento
    AND estXLocS.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstE
    ON locEstE.localEstoque = item.localEstoqueEntrada
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocE
    ON estXLocE.estabelecimento = cab.estabelecimento
    AND estXLocE.localEstoque = item.localEstoqueEntrada
    WHERE item.idItemSeparacao = p_idItemSeparacao
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND etap.situacaoSeparacao = 'F')
  LOOP
    ADD_SEPARACAO_ITEM_EST_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemSeparacao,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoqueSaida,
      a.pessoaParticipanteSaida,
      a.localEstoqueEntrada,
      a.pessoaParticipanteEntrada,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseSaida,
      a.estXLoc_solicitaEnderSaida,
      a.locEst_indicProprPosseEntrada,
      a.estXLoc_solicitaEnderEntrada,
      v_bufferIdEstoque);
  END LOOP;
END ADD_SEPARACAO_ITEM_EST_ATUALIZ;

/

create or replace PROCEDURE ADD_SEPARACAO_CAB_EST_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_separacao                    IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT idItemSeparacao
    FROM MOSEPARACAOXITENS
    WHERE separacao = p_separacao)
  LOOP
    ADD_ESTOQUE_SEPARACAO_EXCLUI (
      a.idItemSeparacao,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.modeloDocumento,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemSeparacao,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoqueSaida,
      item.pessoaParticipanteSaida,
      item.localEstoqueEntrada,
      item.pessoaParticipanteEntrada,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEstS.indicadorPropriedadePosseItem locEst_indicProprPosseSaida,
      COALESCE (estXLocS.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderSaida,
      locEstE.indicadorPropriedadePosseItem locEst_indicProprPosseEntrada,
      COALESCE (estXLocE.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderEntrada
    FROM MOSEPARACAOXITENS item
    JOIN MOSEPARACOES cab
    ON cab.separacao = item.separacao
    JOIN PAETAPASSEPARACAO etap
    ON etap.etapaSeparacao = cab.etapaSeparacao
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEstS
    ON locEstS.localEstoque = item.localEstoqueSaida
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocS
    ON estXLocS.estabelecimento = cab.estabelecimento
    AND estXLocS.localEstoque = item.localEstoqueSaida
    JOIN PALOCAISESTOQUE locEstE
    ON locEstE.localEstoque = item.localEstoqueEntrada
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLocE
    ON estXLocE.estabelecimento = cab.estabelecimento
    AND estXLocE.localEstoque = item.localEstoqueEntrada
    WHERE item.separacao = p_separacao
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND etap.situacaoSeparacao = 'F')
  LOOP
    ADD_SEPARACAO_ITEM_EST_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemSeparacao,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoqueSaida,
      a.pessoaParticipanteSaida,
      a.localEstoqueEntrada,
      a.pessoaParticipanteEntrada,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseSaida,
      a.estXLoc_solicitaEnderSaida,
      a.locEst_indicProprPosseEntrada,
      a.estXLoc_solicitaEnderEntrada,
      v_bufferIdEstoque);
  END LOOP;
END ADD_SEPARACAO_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_N_SERIE (
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_endEst_idEnderecoEstoquePreD IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
BEGIN
  r_bufferIdEstoque        := p_bufferIdEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idEnderecoEstoquePreDocumento = p_endEst_idEnderecoEstoquePreD
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_ESTOQUE_INSERE (
      r_bufferIdEstoque, 
      p_estabelecimentoAtivo, 
      p_cab_estabelecimento,
      CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
      p_item_gradeProduto,
      p_item_modeloDocumento,
      101,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_idEnderecoEstoque,
      a.idNumeroSerie,
      1,
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2),
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2),
      p_item_observacoes,
      0, -- p_idFichaProdutoRealOrcamento
      p_item_idItemPreDocumento,
      0, -- p_idItemDocFiscal
      0, -- p_item_idItemSeparacao
      0, -- p_divergenciaBalanco
      0, -- p_idItemDocTransferencia
      r_bufferIdEstoque);    
    IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
      ADD_ESTOQUE_INSERE (
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_docTransf_estabelecSaida,
        CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
        p_item_gradeProduto,
        p_item_modeloDocumento,
        900,
        0,
        0,
        CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
        p_locEstTransito_indicProprPos,
        p_item_pessoaParticipante,
        p_modDoc_transitoLocalEstoque,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_idEnderecoEstoque,
        a.idNumeroSerie,
        1,
        p_item_precoCustoOperacao,
        ROUND (p_item_precoCustoOperacao, 2),
        p_item_precoCMV,
        ROUND (p_item_precoCMV, 2),
        p_item_observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        p_item_idItemPreDocumento,
        0, -- p_idItemDocFiscal
        0, -- p_item_idItemSeparacao
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EST_N_SERIE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_KIT (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_endEst_idEnderecoEstoquePreD IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)), 0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND ((COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          gradProdFilho.cor,
          gradProdFilho.tamanho,
          p_locEst_indicProprPosseItem,
          0)), 0)), 2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          a.produto,
          a.cor,
          a.tamanho,
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit, 2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND ((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal, 2);
      v_precoCustoKit := ROUND (v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_modeloDocumento,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_PRE_DOC_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemPreDocumento,
          p_item_modeloDocumento,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          p_item_localEstoque,
          p_item_pessoaParticipante,
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          p_endEst_idEnderecoEstoquePreD,
          p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;    
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          a.gradeProdutoFilho,
          p_item_modeloDocumento,
          101, --p_cab_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          p_item_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          0, -- p_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE (
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
            CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
            a.gradeProdutoFilho,
            p_item_modeloDocumento,
            900,
            0,
            0,
            CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            p_idEnderecoEstoque,
            0, -- p_idNumeroSerie
            a.quantidade - v_quantidadeNumerosSerie,
            v_precoCustoKit, -- p_precoCustoOperacao
            CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            p_item_observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            p_item_idItemPreDocumento,
            0, -- p_idItemDocFiscal,
            0, -- p_idItemSeparacao,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque);
        END IF;    
      END IF;    
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EST_KIT;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_COMP (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_endEst_idEnderecoEstoquePreD IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2)
IS  
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      comp.gradeProdutoEstoque gradeProduto,
      a.observacoes,
      prod.controleEstoque,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM MOPREDOCUMXCOMPOSICOESPR a 
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = a.composicaoPreco
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = comp.gradeProdutoEstoque
    JOIN CAPRODUTOS prod
    ON prod.produto = gradprod.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prod.unidadeMedida
    WHERE a.idItemPreDocumento = p_item_idItemPreDocumento
    AND a.selecionado = 1
    AND comp.gradeProdutoEstoque > 0
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_modeloDocumento,
        a.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        0,
        a.observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      ADD_ESTOQUE_INSERE (
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
        a.gradeProduto,
        p_item_modeloDocumento,
        101, --p_cab_operacaoInternaEstoque
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao
        0, -- p_totalCustoOperacao
        0, -- p_precoCMV
        0, -- p_valorCMV
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        p_item_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        0, -- p_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_docTransf_estabelecSaida,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          a.gradeProduto,
          p_item_modeloDocumento,
          900,
          0,
          0,
          CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          a.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          p_item_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          0, -- p_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);
      END IF;    
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EST_COMP;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_ENDERECO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_valorAcrescimoExtempTot IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoquePreDocumento,
      CASE
        WHEN p_item_quantidade = 0
          OR p_item_quantidadeExtemporanea = 0
          OR p_item_quantidade + p_item_quantidadeExtemporanea = 0
        THEN quantidade
        ELSE ROUND(quantidade * (p_item_quantidade + p_item_quantidadeExtemporanea) / p_item_quantidade, TO_NUMBER (p_uniMed_casasDecimaisUnidadeM))
      END quantidade
    FROM MOPREDOCUMXENDERECOESTOQ
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_item_modeloDocumento,
        101,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idFichaProdutoRealOrcamento
        p_item_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        0, -- p_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_modeloDocumento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
        p_item_observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        a.idEnderecoEstoquePreDocumento,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_PRE_DOC_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemPreDocumento,
          p_item_modeloDocumento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          p_item_precoCMV,
          p_item_observacoes,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          a.idEnderecoEstoquePreDocumento,
          a.idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, -- p_data
          p_item_gradeProduto,
          p_item_modeloDocumento,
          101, --p_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          a.idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidadeExtemporanea), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          p_item_idItemPreDocumento,
          0, -- p_idItemDocFiscal
          0, -- p_idItemSeparacao
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE (
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, -- p_data
            p_item_gradeProduto,
            p_item_modeloDocumento,
            900, --p_operacaoInternaEstoque
            0, --p_atualizaCustoMedio
            0, --p_atualizaUltimaCompra
            CASE
              WHEN p_cab_entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, --p_entradaSaida
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            a.idEnderecoEstoque,
            0, -- p_idNumeroSerie
            a.quantidade - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            p_item_idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_idItemSeparacao
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
    ADD_PRE_DOC_ITEM_EST_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque, 
      p_estabelecimentoAtivo, 
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemPreDocumento,
      p_item_modeloDocumento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      a.quantidade,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      a.idEnderecoEstoquePreDocumento,
      a.idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque);
  END LOOP;
END ADD_PRE_DOC_ITEM_EST_ENDERECO;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_GRAVA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_valorAcrescimoExtempTot IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_estXLoc_solicitaEnderecoEst  IN NUMBER,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderecoEst = 1 AND p_prod_controleEstoque IN (1,3,4,5,6,11,12) THEN
    ADD_PRE_DOC_ITEM_EST_ENDERECO (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemPreDocumento,
      p_item_modeloDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_quantidadeExtemporanea,
      p_item_valorAcrescimoExtempTot,
      p_item_observacoes,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_uniMed_casasDecimaisUnidadeM,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade + p_item_quantidadeExtemporanea > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo,
        p_item_modeloDocumento,
        101,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idFichaProdutoRealOrcamento
        p_item_idItemPreDocumento,
        0, -- p_idItemDocFiscal
        0, -- p_idItemSeparacao
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_modeloDocumento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque) / p_item_quantidade), 2) END,
        p_item_observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        0, -- p_idEnderecoEstoquePreDocumento,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_PRE_DOC_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemPreDocumento,
          p_item_modeloDocumento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          p_item_precoCMV,
          p_item_observacoes,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          0, -- p_idEnderecoEstoquePreDocumento,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_item_modeloDocumento,
          101,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          0, -- p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          p_item_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          0, -- p_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE (
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
            CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
            p_item_gradeProduto,
            p_item_modeloDocumento,
            900,
            0,
            0,
            CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            0, -- p_idEnderecoEstoque,
            0, -- p_idNumeroSerie
            p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            p_item_idItemPreDocumento,
            0, -- p_idItemDocFiscal,
            0, -- p_idItemSeparacao,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
    ADD_PRE_DOC_ITEM_EST_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque, 
      p_estabelecimentoAtivo, 
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemPreDocumento,
      p_item_modeloDocumento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      0, -- p_idEnderecoEstoquePreDocumento,
      0, -- p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque);
  END IF;
END ADD_PRE_DOC_ITEM_EST_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  ADD_ESTOQUE_PRE_DOC_EXCLUI (
    p_idItemPreDocumento,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  FOR a IN (
    SELECT
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada, 0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida, 0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc
    ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade + item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemPreDocumento,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_EST_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT idItemPreDocumento
    FROM MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento)
  LOOP
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      a.idItemPreDocumento,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc
    ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemPreDocumento,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_INSERE (
  p_bufferIdProdutoFilho   IN VARCHAR2,
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemPreDocumento     IN NUMBER,
  p_gradeProduto           IN NUMBER,
  p_personalizacao         IN NUMBER,
  p_idLoteEstoque          IN NUMBER,
  p_idEnderecoEstoque      IN NUMBER,
  p_idNumeroSerie          IN NUMBER,
  p_quantidade             IN NUMBER,
  p_precoCustoOperacao     IN NUMBER,
  p_totalCustoOperacao     IN NUMBER,
  p_precoCMV               IN NUMBER,
  p_valorCMV               IN NUMBER,
  p_observacoes            IN VARCHAR2,
  r_bufferIdProdutoFilho   OUT VARCHAR2)
IS
  v_id NUMBER (14,0);
BEGIN
  IF p_bufferIdProdutoFilho IS NOT NULL AND LENGTH(RTRIM(p_bufferIdProdutoFilho)) >= 14 THEN
    v_id                   := TO_NUMBER(SUBSTR(p_bufferIdProdutoFilho, 1, 14));
    r_bufferIdProdutoFilho := RTRIM(SUBSTR(p_bufferIdProdutoFilho, 16, 32000));
  ELSE
    v_id                   := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXPRODUTOFILHO', 'id', 14, p_estabelecimentoAtivo, NULL);
    r_bufferIdProdutoFilho := '';
  END IF;
  INSERT INTO MOPREDOCUMXPRODUTOFILHO (
    id,
    idItemPreDocumento,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idEnderecoEstoque,
    idNumeroSerie,
    quantidade,
    precoCustoOperacao,
    totalCustoOperacao,
    precoCMV,
    valorCMV,
    observacoes)
  VALUES (
    v_id,
    p_idItemPreDocumento,
    p_gradeProduto,
    p_personalizacao,
    p_idLoteEstoque,
    p_idEnderecoEstoque,
    p_idNumeroSerie,
    p_quantidade,
    p_precoCustoOperacao,
    p_totalCustoOperacao,
    p_precoCMV,
    p_valorCMV,
    p_observacoes);
END ADD_PRE_DOC_ITEM_FIL_INSERE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_N_SERIE (
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_endEst_idEnderecoEstoquePreD IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  r_bufferIdProdutoFilho         OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
BEGIN
  r_bufferIdProdutoFilho   := p_bufferIdProdutoFilho;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idEnderecoEstoquePreDocumento = p_endEst_idEnderecoEstoquePreD
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_PRE_DOC_ITEM_FIL_INSERE (
      r_bufferIdProdutoFilho, 
      p_estabelecimentoAtivo,
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_idEnderecoEstoque,
      a.idNumeroSerie,
      1,
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2),
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2),
      p_item_observacoes,
      r_bufferIdProdutoFilho);    
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_N_SERIE;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_KIT (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_endEst_idEnderecoEstoquePreD IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)), 0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND ((COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)), 0)), 2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        a.gradeProdutoFilho,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_PRE_DOC_ITEM_FIL_N_SERIE (
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemPreDocumento,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          p_endEst_idEnderecoEstoquePreD,
          p_idEnderecoEstoque,
          r_bufferIdProdutoFilho,
          v_quantidadeNumerosSerie);
      END IF;    
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_PRE_DOC_ITEM_FIL_INSERE (
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemPreDocumento,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          r_bufferIdProdutoFilho);
      END IF;    
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_KIT;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_COMP (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_endEst_idEnderecoEstoquePreD IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      comp.gradeProdutoEstoque gradeProduto,
      a.observacoes,
      prod.controleEstoque,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM MOPREDOCUMXCOMPOSICOESPR a 
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = a.composicaoPreco
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = comp.gradeProdutoEstoque
    JOIN CAPRODUTOS prod
    ON prod.produto = gradprod.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prod.unidadeMedida
    WHERE a.idItemPreDocumento = p_item_idItemPreDocumento
    AND a.selecionado = 1
    AND comp.gradeProdutoEstoque > 0
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        a.gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        0, -- p_item_valorCustoOperacao
        a.observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_PRE_DOC_ITEM_FIL_INSERE (
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_item_idItemPreDocumento,
        a.gradeProduto,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao
        0, -- p_totalCustoOperacao
        0, -- p_precoCMV
        0, -- p_valorCMV
        a.observacoes,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_COMP;

/

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

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_ENDERECO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_prod_controleEstoque         IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdProdutoFilho         OUT VARCHAR2,
  r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoquePreDocumento,
      quantidade
    FROM MOPREDOCUMXENDERECOESTOQ
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_PRE_DOC_ITEM_FIL_FORM_TIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoquePreDocumento,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END, -- p_totalCustoOperacao
        p_item_observacoes,
        a.idEnderecoEstoquePreDocumento,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      ADD_PRE_DOC_ITEM_FIL_INSERE (
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        a.idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        p_item_precoCustoOperacao,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END, -- p_totalCustoOperacao
        p_item_precoCMV,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END, -- p_valorCMV
        p_item_observacoes,
        r_bufferIdProdutoFilho);
    END IF;
    ADD_PRE_DOC_ITEM_FIL_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemPreDocumento,
      p_item_pessoaParticipante,
      a.quantidade,
      a.idEnderecoEstoquePreDocumento,
      a.idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      r_bufferIdProdutoFilho);
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_ENDERECO;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_GRAVA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_estXLoc_solicitaEnderecoEst  IN NUMBER,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderecoEst = 1 THEN
    ADD_PRE_DOC_ITEM_FIL_ENDERECO (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      r_bufferIdProdutoFilho,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_PRE_DOC_ITEM_FIL_FORM_TIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoquePreD,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN p_item_valorCustoOperacao WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeEnderecoEstoque) / p_item_quantidade), 2) END,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoquePreD
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    END IF;
    ADD_PRE_DOC_ITEM_FIL_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemPreDocumento,
      p_item_pessoaParticipante,
      p_item_quantidade - v_quantidadeEnderecoEstoque,
      0, -- p_endEst_idEnderecoEstoquePreD
      0, -- p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      r_bufferIdProdutoFilho);
  END IF;
END ADD_PRE_DOC_ITEM_FIL_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT id
    FROM MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_idItemPreDocumento
    ORDER BY id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderecoEst
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_FIL_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemPreDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_FIL_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT a.id
    FROM MOPREDOCUMXPRODUTOFILHO a
    JOIN MOPREDOCUMXITENS b
    ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    ORDER BY a.id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderecoEst
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_FIL_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemPreDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_PRE_DOC_CAB_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_N_SERIE (
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_endEst_idEnderecoEstoqueDocF IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
BEGIN
  r_bufferIdEstoque        := p_bufferIdEstoque;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idEnderecoEstoqueDocFiscal = p_endEst_idEnderecoEstoqueDocF
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_ESTOQUE_INSERE (
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      p_cab_estabelecimento,
      CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
      p_item_gradeProduto,
      p_item_modeloDocumento,
      100,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_locEst_indicProprPosseItem,
      p_item_pessoaParticipante,
      p_item_localEstoque,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_idEnderecoEstoque,
      a.idNumeroSerie,
      1,
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2),
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2),
      p_item_observacoes,
      0, -- p_idFichaProdutoRealOrcamento
      0, -- p_idItemPreDocumento
      p_item_idItemDocFiscal,
      0, -- p_idItemSeparacao
      0, -- p_divergenciaBalanco
      0, -- p_idItemDocTransferencia
      r_bufferIdEstoque);    
    IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
      ADD_ESTOQUE_INSERE (
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_docTransf_estabelecSaida,
        CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
        p_item_gradeProduto,
        p_item_modeloDocumento,
        900,
        0,
        0,
        CASE WHEN p_cab_entradaSaida = 'S' THEN 'E' ELSE 'S' END,
        p_locEstTransito_indicProprPos,
        p_item_pessoaParticipante,
        p_modDoc_transitoLocalEstoque,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_idEnderecoEstoque,
        a.idNumeroSerie,
        1,
        p_item_precoCustoOperacao,
        ROUND (p_item_precoCustoOperacao, 2),
        p_item_precoCMV,
        ROUND (p_item_precoCMV, 2),
        p_item_observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        p_item_idItemDocFiscal,
        0, -- p_idItemSeparacao
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_N_SERIE;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_KIT (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_endEst_idEnderecoEstoqueDocF IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)), 0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND ((COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)), 0)), 2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit, 2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_modeloDocumento,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemDocFiscal,
          p_item_modeloDocumento,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          p_endEst_idEnderecoEstoqueDocF,
          p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;    
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          a.gradeProdutoFilho,
          p_item_modeloDocumento,
          100, --p_cab_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento
          p_item_idItemDocFiscal,
          0, -- p_idItemSeparacao
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE (
            r_bufferIdEstoque,
            p_estabelecimentoAtivo,
            p_docTransf_estabelecSaida,
            CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
            a.gradeProdutoFilho,
            p_item_modeloDocumento,
            900,
            0,
            0,
            CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            p_idEnderecoEstoque,
            0, -- p_idNumeroSerie
            a.quantidade - v_quantidadeNumerosSerie,
            v_precoCustoKit, -- p_precoCustoOperacao
            CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            p_item_observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            p_item_idItemDocFiscal,
            0, -- p_idItemSeparacao
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque);
        END IF;    
      END IF;    
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_KIT;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_COMP (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_endEst_idEnderecoEstoquePreD IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2)
IS  
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      comp.gradeProdutoEstoque gradeProduto,
      a.observacoes,
      prod.controleEstoque,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM MODOCFISCALXCOMPOSICOESPR a
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = a.composicaoPreco
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = comp.gradeProdutoEstoque
    JOIN CAPRODUTOS prod
    ON prod.produto = gradprod.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prod.unidadeMedida
    WHERE a.idItemDocFiscal = p_item_idItemDocFiscal
    AND a.selecionado = 1
    AND comp.gradeProdutoEstoque > 0
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_modeloDocumento,
        a.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        0,
        a.observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      ADD_ESTOQUE_INSERE (
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
        a.gradeProduto,
        p_item_modeloDocumento,
        101, --p_cab_operacaoInternaEstoque
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao
        0, -- p_totalCustoOperacao
        0, -- p_precoCMV
        0, -- p_valorCMV
        a.observacoes,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_item_idItemPreDocumento,
        p_item_idItemDocFiscal,
        0, -- p_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_docTransf_estabelecSaida,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          a.gradeProduto,
          p_item_modeloDocumento,
          900,
          0,
          0,
          CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          a.observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_item_idItemPreDocumento,
          p_item_idItemDocFiscal,
          0, -- p_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);
      END IF;    
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_COMP;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_ENDERECO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_valorAcrescimoExtempTot IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2,
  r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdEstoque           := p_bufferIdEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoqueDocFiscal,
      CASE
        WHEN p_item_quantidade = 0
          OR p_item_quantidadeExtemporanea = 0
          OR p_item_quantidade + p_item_quantidadeExtemporanea = 0
        THEN quantidade
        ELSE ROUND(quantidade * (p_item_quantidade + p_item_quantidadeExtemporanea) / p_item_quantidade, TO_NUMBER(p_uniMed_casasDecimaisUnidadeM))
      END quantidade
    FROM MODOCFISCALXENDERECOESTOQ
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_item_modeloDocumento,
        100, --p_operacaoInternaEstoque
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        p_item_idItemDocFiscal,
        0, -- p_idItemSeparacao
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_modeloDocumento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
        p_item_observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        a.idEnderecoEstoqueDocFiscal,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemDocFiscal,
          p_item_modeloDocumento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          p_item_precoCMV,
          p_item_observacoes,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          a.idEnderecoEstoqueDocFiscal,
          a.idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, -- p_data
          p_item_gradeProduto,
          p_item_modeloDocumento,
          100, --p_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          a.idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidadeExtemporanea), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento
          p_item_idItemDocFiscal,
          0, -- p_idItemSeparacao
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE (
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
            CASE
              WHEN p_cab_dataEntradaSaida IS NULL
                OR p_cab_dataEntradaSaida < p_cab_dataEmissao
              THEN p_cab_dataEmissao
              ELSE p_cab_dataEntradaSaida
            END, -- p_data
            p_item_gradeProduto,
            p_item_modeloDocumento,
            900, -- p_operacaoInternaEstoque
            0, -- p_atualizaCustoMedio
            0, -- p_atualizaUltimaCompra
            CASE
              WHEN p_cab_entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, -- p_entradaSaida
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            a.idEnderecoEstoque,
            0, -- p_idNumeroSerie
            a.quantidade - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            p_item_idItemDocFiscal,
            0, -- p_idItemSeparacao
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
    ADD_DOC_FISC_ITEM_EST_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque, 
      p_estabelecimentoAtivo, 
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemDocFiscal,
      p_item_modeloDocumento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      a.quantidade,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      a.idEnderecoEstoqueDocFiscal,
      a.idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_ENDERECO;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_GRAVA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_atualizaUltimaCompra     IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_valorAcrescimoExtempTot IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_modDoc_geraTransferencia     IN NUMBER,
  p_modDoc_geraOperacaoEmTransit IN NUMBER,
  p_modDoc_transitoLocalEstoque  IN NUMBER,
  p_locEstTransito_indicProprPos IN CHAR,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_estXLoc_solicitaEnderecoEst  IN NUMBER,
  p_docTransf_estabelecEntrada   IN NUMBER,
  p_docTransf_estabelecSaida     IN NUMBER,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderecoEst = 1 AND p_prod_controleEstoque IN (1,3,4,5,6,11,12) THEN
    ADD_DOC_FISC_ITEM_EST_ENDERECO (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemDocFiscal,
      p_item_modeloDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_quantidadeExtemporanea,
      p_item_valorAcrescimoExtempTot,
      p_item_observacoes,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_uniMed_casasDecimaisUnidadeM,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade + p_item_quantidadeExtemporanea > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_item_modeloDocumento,
        100,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idFichaProdutoRealOrcamento
        0, -- p_idItemPreDocumento
        p_item_idItemDocFiscal,
        0, -- p_idItemSeparacao
        0, -- p_divergenciaBalanco
        0, -- p_idItemDocTransferencia
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_EST_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_modeloDocumento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque) / p_item_quantidade), 2) END,
        p_item_observacoes,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        0, -- p_idEnderecoEstoqueDocFiscal,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_EST_N_SERIE (
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemDocFiscal,
          p_item_modeloDocumento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao, 7)
          END,
          p_item_precoCMV,
          p_item_observacoes,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          0, -- p_idEnderecoEstoqueDocFiscal,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE (
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_item_modeloDocumento,
          100,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          0, -- p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idFichaProdutoRealOrcamento
          0, -- p_idItemPreDocumento
          p_item_idItemDocFiscal,
          0, -- p_idItemSeparacao
          0, -- p_divergenciaBalanco
          0, -- p_idItemDocTransferencia
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE (
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
            CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
            p_item_gradeProduto,
            p_item_modeloDocumento,
            900,
            0,
            0,
            CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            0, -- p_idEnderecoEstoque,
            0, -- p_idNumeroSerie
            p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_observacoes,
            0, -- p_idFichaProdutoRealOrcamento
            0, -- p_idItemPreDocumento
            p_item_idItemDocFiscal,
            0, -- p_idItemSeparacao
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
    ADD_DOC_FISC_ITEM_EST_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo, 
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemDocFiscal,
      p_item_modeloDocumento,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      0, -- p_idEnderecoEstoqueDocFiscal,
      0, -- p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque);
  END IF;
END ADD_DOC_FISC_ITEM_EST_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  ADD_ESTOQUE_DOC_FISC_EXCLUI (
    p_idItemDocFiscal,
    v_bufferIdEstoque,
    v_bufferIdEstoque);
  FOR a IN (
    SELECT
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada, 0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida, 0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc
    ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal
    AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemDocFiscal,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_EST_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT idItemDocFiscal
    FROM MODOCFISCALXITENS
    WHERE idDocumentoFiscal = p_idDocumentoFiscal)
  LOOP
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      a.idItemDocFiscal,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
  END LOOP;
  FOR a IN (
    SELECT 
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.modeloDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = item.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito
    ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc
    ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal
    AND transfXDoc.entradaSaidaOriginal IN('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf
    ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
    ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemDocFiscal,
      a.modeloDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_INSERE (
  p_bufferIdProdutoFilho IN VARCHAR2,
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemDocFiscal      IN NUMBER,
  p_gradeProduto         IN NUMBER,
  p_personalizacao       IN NUMBER,
  p_idLoteEstoque        IN NUMBER,
  p_idEnderecoEstoque    IN NUMBER,
  p_idNumeroSerie        IN NUMBER,
  p_quantidade           IN NUMBER,
  p_precoCustoOperacao   IN NUMBER,
  p_totalCustoOperacao   IN NUMBER,
  p_precoCMV             IN NUMBER,
  p_valorCMV             IN NUMBER,
  p_observacoes          IN VARCHAR2,
  r_bufferIdProdutoFilho OUT VARCHAR2)
IS
  v_id NUMBER (14,0);
BEGIN
  IF p_bufferIdProdutoFilho IS NOT NULL AND LENGTH(RTRIM(p_bufferIdProdutoFilho)) >= 14 THEN
    v_id := TO_NUMBER(SUBSTR(p_bufferIdProdutoFilho, 1, 14));
    r_bufferIdProdutoFilho := RTRIM(SUBSTR(p_bufferIdProdutoFilho, 16, 32000));
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXPRODUTOFILHO', 'id', 14, p_estabelecimentoAtivo, NULL);
    r_bufferIdProdutoFilho := '';
  END IF;
  INSERT INTO MODOCFISCALXPRODUTOFILHO (
    id,
    idItemDocFiscal,
    gradeProduto,
    personalizacao,
    idLoteEstoque,
    idEnderecoEstoque,
    idNumeroSerie,
    quantidade,
    precoCustoOperacao,
    totalCustoOperacao,
    precoCMV,
    valorCMV,
    observacoes)
  VALUES (
    v_id,
    p_idItemDocFiscal,
    p_gradeProduto,
    p_personalizacao,
    p_idLoteEstoque,
    p_idEnderecoEstoque,
    p_idNumeroSerie,
    p_quantidade,
    p_precoCustoOperacao,
    p_totalCustoOperacao,
    p_precoCMV,
    p_valorCMV,
    p_observacoes);
END ADD_DOC_FISC_ITEM_FIL_INSERE;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_N_SERIE (
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_endEst_idEnderecoEstoqueDocF IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  r_bufferIdProdutoFilho         OUT VARCHAR2,
  r_quantidadeNumerosSerie       OUT NUMBER)
IS
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  r_quantidadeNumerosSerie := 0;
  FOR a IN (
    SELECT idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idEnderecoEstoqueDocFiscal = p_endEst_idEnderecoEstoqueDocF
    AND gradeProduto = p_item_gradeProduto)
  LOOP
    r_quantidadeNumerosSerie := r_quantidadeNumerosSerie + 1;
    ADD_DOC_FISC_ITEM_FIL_INSERE (
      r_bufferIdProdutoFilho, 
      p_estabelecimentoAtivo,
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_idEnderecoEstoque,
      a.idNumeroSerie,
      1,
      p_item_precoCustoOperacao,
      ROUND (p_item_precoCustoOperacao, 2),
      p_item_precoCMV,
      ROUND (p_item_precoCMV, 2),
      p_item_observacoes,
      r_bufferIdProdutoFilho);    
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_N_SERIE;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_KIT (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_endEst_idEnderecoEstoqueDocF IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE (SUM (ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)), 0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)), 0)), 2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit, 2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade, 7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        a.gradeProdutoFilho,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,6,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_FIL_N_SERIE (
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemDocFiscal,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          p_endEst_idEnderecoEstoqueDocF,
          p_idEnderecoEstoque,
          r_bufferIdProdutoFilho,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_DOC_FISC_ITEM_FIL_INSERE (
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemDocFiscal,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          r_bufferIdProdutoFilho);
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_KIT;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_COMP (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_endEst_idEnderecoEstoqueDocF IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      comp.gradeProdutoEstoque gradeProduto,
      a.observacoes,
      prod.controleEstoque,
      ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM MODOCFISCALXCOMPOSICOESPR a 
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = a.composicaoPreco
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = comp.gradeProdutoEstoque
    JOIN CAPRODUTOS prod
    ON prod.produto = gradprod.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prod.unidadeMedida
    WHERE a.idItemDocFiscal = p_item_idItemDocFiscal
    AND a.selecionado = 1
    AND comp.gradeProdutoEstoque > 0
    AND ROUND (p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        a.gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        0, -- p_item_valorCustoOperacao
        a.observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN (1,5,6,11,12) THEN
      ADD_DOC_FISC_ITEM_FIL_INSERE (
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_item_idItemDocFiscal,
        a.gradeProduto,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao
        0, -- p_totalCustoOperacao
        0, -- p_precoCMV
        0, -- p_valorCMV
        a.observacoes,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_COMP;

/

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

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_ENDERECO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_prod_controleEstoque         IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdProdutoFilho         OUT VARCHAR2,
  r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoqueDocFiscal,
      quantidade
    FROM MODOCFISCALXENDERECOESTOQ
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_DOC_FISC_ITEM_FIL_FORM_TIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoqueDocFiscal,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
        p_item_observacoes,
        a.idEnderecoEstoqueDocFiscal,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (1,5,6,11,12) THEN
      ADD_DOC_FISC_ITEM_FIL_INSERE (
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        a.idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        p_item_precoCustoOperacao,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END, -- p_totalCustoOperacao
        p_item_precoCMV,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END, -- p_valorCMV
        p_item_observacoes,
        r_bufferIdProdutoFilho);
    END IF;
    ADD_DOC_FISC_ITEM_FIL_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemDocFiscal,
      p_item_pessoaParticipante,
      a.quantidade,
      a.idEnderecoEstoqueDocFiscal,
      a.idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      r_bufferIdProdutoFilho);
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_ENDERECO;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_GRAVA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_bufferIdProdutoFilho         IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_precoCustoOperacao      IN NUMBER,
  p_item_valorCustoOperacao      IN NUMBER,
  p_item_precoCMV                IN NUMBER,
  p_item_valorCMV                IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  p_estXLoc_solicitaEnderecoEst  IN NUMBER,
  r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderecoEst = 1 THEN
    ADD_DOC_FISC_ITEM_FIL_ENDERECO (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      r_bufferIdProdutoFilho,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_DOC_FISC_ITEM_FIL_FORM_TIN (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueDocF,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN p_item_valorCustoOperacao WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeEnderecoEstoque) / p_item_quantidade), 2) END,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueDocF
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    END IF;
    ADD_DOC_FISC_ITEM_FIL_COMP (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemDocFiscal,
      p_item_pessoaParticipante,
      p_item_quantidade - v_quantidadeEnderecoEstoque,
      0, -- p_endEst_idEnderecoEstoqueDocF
      0, -- p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      r_bufferIdProdutoFilho);
  END IF;
END ADD_DOC_FISC_ITEM_FIL_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT id
    FROM MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_idItemDocFiscal
    ORDER BY id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque, 0) estXLoc_solicitaEnderecoEst
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_FIL_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_FIL_ATUALIZA (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT a.id
    FROM MODOCFISCALXPRODUTOFILHO a
    JOIN MODOCFISCALXITENS b
    ON b.idItemDocFiscal = a.idItemDocFiscal
    WHERE b.idDocumentoFiscal = p_idDocumentoFiscal
    ORDER BY a.id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab
    ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_FIL_GRAVA (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_DOC_FISC_CAB_FIL_ATUALIZA;

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_GRAVA (
  p_estabelecimentoAtivo     IN NUMBER,
  p_idAtividadePrevOrcamento IN NUMBER,
  p_idItemOrcamento          IN NUMBER,
  p_sequencia                IN NUMBER,
  p_atividadeServico         IN NUMBER,
  p_descricao                IN VARCHAR2,
  p_tecnico                  IN NUMBER,
  p_faturarAtividade         IN CHAR,
  p_checklist                IN NUMBER,
  p_tipoApontamento          IN CHAR,
  p_etapaAtividade           IN NUMBER,
  p_statusAtividadeServico   IN CHAR,
  p_dataInicio               IN DATE,
  p_dataTermino              IN DATE,
  p_quantidade               IN NUMBER,
  p_precoUnitario            IN NUMBER,
  p_observacoes              IN VARCHAR2,
  p_gravarTarefas            IN NUMBER,
  p_gravarAtividadeRealizada IN NUMBER,
  p_idAtividadeRealOrcamento IN NUMBER,
  p_atReal_dataInicio        IN DATE,
  p_atReal_dataTermino       IN DATE,
  p_atReal_quantidade        IN NUMBER,
  /* Retornos */
  r_idAtividadePrevOrcamento OUT NUMBER,
  r_idAtividadeRealOrcamento OUT NUMBER)
IS
BEGIN
  r_idAtividadePrevOrcamento := p_idAtividadePrevOrcamento;
  IF r_idAtividadePrevOrcamento = 0 THEN
    r_idAtividadePrevOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXATIVIDADEPREV', 'idAtividadePrevOrcamento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  r_idAtividadeRealOrcamento := p_idAtividadeRealOrcamento;
  MERGE INTO MOORCAMENTOXATIVIDADEPREV a USING (
    SELECT
      r_idAtividadePrevOrcamento idAtividadePrevOrcamento,
      p_idItemOrcamento          idItemOrcamento,
      p_sequencia                sequencia,
      p_atividadeServico         atividadeServico,
      p_descricao                descricao,
      p_tecnico                  tecnico,
      p_faturarAtividade         faturarAtividade,
      p_checklist                checklist,
      p_tipoApontamento          tipoApontamento,
      p_etapaAtividade           etapaAtividade,
      p_statusAtividadeServico   statusAtividadeServico,
      p_dataInicio               dataInicio,
      p_dataTermino              dataTermino,
      p_quantidade               quantidade,
      p_precoUnitario            precoUnitario,
      p_observacoes              observacoes
    FROM DUAL) b
  ON (a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemOrcamento        = b.idItemOrcamento,
    a.sequencia              = b.sequencia,
    a.atividadeServico       = b.atividadeServico,
    a.descricao              = b.descricao,
    a.tecnico                = b.tecnico,
    a.faturarAtividade       = b.faturarAtividade,
    a.checklist              = b.checklist,
    a.tipoApontamento        = b.tipoApontamento,
    a.etapaAtividade         = b.etapaAtividade,
    a.statusAtividadeServico = b.statusAtividadeServico,
    a.dataInicio             = b.dataInicio,
    a.dataTermino            = b.dataTermino,
    a.quantidade             = b.quantidade,
    a.precoUnitario          = b.precoUnitario,
    a.observacoes            = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idAtividadePrevOrcamento,
    idItemOrcamento,
    sequencia,
    atividadeServico,
    descricao,
    tecnico,
    faturarAtividade,
    checklist,
    tipoApontamento,
    etapaAtividade,
    statusAtividadeServico,
    dataInicio,
    dataTermino,
    quantidade,
    precoUnitario,
    observacoes)
  VALUES (
    b.idAtividadePrevOrcamento,
    b.idItemOrcamento,
    b.sequencia,
    b.atividadeServico,
    b.descricao,
    b.tecnico,
    b.faturarAtividade,
    b.checklist,
    b.tipoApontamento,
    b.etapaAtividade,
    b.statusAtividadeServico,
    b.dataInicio,
    b.dataTermino,
    b.quantidade,
    b.precoUnitario,
    b.observacoes);
  IF p_gravarTarefas = 1 THEN
    ADD_ORCAMENTO_ITEM_TAREF_INSER (
      p_estabelecimentoAtivo,
      r_idAtividadePrevOrcamento,
      p_checklist);
  END IF;
  IF p_gravarAtividadeRealizada = 1 THEN
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_estabelecimentoAtivo,
      p_idAtividadeRealOrcamento,
      r_idAtividadePrevOrcamento,
      1,
      p_atividadeServico,
      p_descricao,
      p_tecnico,
      p_statusAtividadeServico,
      p_atReal_dataInicio,
      p_atReal_dataTermino,
      p_atReal_quantidade,
      p_observacoes,
      /* Retornos */
      r_idAtividadeRealOrcamento);
  END IF;
  IF NOT (p_statusAtividadeServico IN ('A','I','P')) THEN
    UPDATE MOORCAMENTOXATIVIDADEPREV prev
    SET prev.tecnico = CASE WHEN prev.tecnico = 0 THEN p_tecnico ELSE prev.tecnico END,
      prev.statusAtividadeServico = 'P',
      prev.dataInicio = CASE WHEN prev.dataInicio IS NULL THEN SYSDATE ELSE prev.dataInicio END,
      prev.dataTermino = CASE WHEN prev.dataTermino IS NULL THEN SYSDATE ELSE prev.dataTermino END
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico = 'A'
    AND prev.sequencia =
      ( SELECT MIN (prev2.sequencia)
        FROM MOORCAMENTOXATIVIDADEPREV prev2
        WHERE prev2.idItemOrcamento = prev.idItemOrcamento
        AND prev2.statusAtividadeServico IN ('A','I','P'));
  END IF;
  UPDATE MOORCAMENTOXITENS a
  SET a.statusAtividadeServico =
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN
        CASE
          WHEN
            EXISTS (
              SELECT 1
              FROM MOORCAMENTOXATIVIDADEPREV prev
              WHERE prev.idItemOrcamento = a.idItemOrcamento
              AND prev.statusAtividadeServico = 'E')
          THEN 'I'
          ELSE 'P'
        END
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END
  WHERE a.idItemOrcamento = p_idItemOrcamento
  AND a.statusAtividadeServico <>
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN
        CASE
          WHEN
            EXISTS (
              SELECT 1
              FROM MOORCAMENTOXATIVIDADEPREV prev
              WHERE prev.idItemOrcamento = a.idItemOrcamento
              AND prev.statusAtividadeServico = 'E')
          THEN 'I'
          ELSE 'P'
        END
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END;
END ADD_ORCAMENTO_ITEM_PREV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_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_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- C = Painel de Compras, 'F' Fatura Contrato, L = Lista Evento, O = Orçamento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_mensagemAviso                IN VARCHAR,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_orcamento               IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_ambiente                IN NUMBER,
  p_item_ambienteObservacoes     IN VARCHAR2,
  p_item_vinculoItemDocumento    IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_statusAtividadeServico  IN CHAR,
  p_item_controleEntrega         IN NUMBER,
  p_item_dataEntrega             IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_atividadeProjeto        IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       IN CHAR,
  p_item_reducaoBaseICMS         IN NUMBER,
  p_item_aliquotaICMS            IN NUMBER,
  p_item_diferimentoICMS         IN NUMBER,
  p_item_motivoDesoneracaoICMS   IN CHAR,
  p_item_idBeneficio             IN NUMBER,
  p_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_idAtividadesPrevistasSelec   IN VARCHAR2,
  p_nivel                        IN NUMBER,
  p_buffer_idItemOrcamento       IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_idItemOrcamento       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_finalidadeNota           CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_controleEntrega          NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_contrEntr_habilitaFrete  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeSaldo         NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorFreteGeral         NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_contrEntr_habilitaFrete      NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_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_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemOrcamento       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_ativ_criouPendenteIniciado   NUMBER;
  v_ativ_idAtividadePrevOrcamen  NUMBER;
  v_ativ_sequencia               NUMBER;
  v_ativ_tecnico                 NUMBER;
  v_ativ_checklist               NUMBER;
  v_ativ_gradeProdutoXFichaAtiv  NUMBER;
  v_ativ_idAtividadeRealOrcament NUMBER;
  v_ativ_idFichaProdutoPrevOrcam NUMBER;
  v_ativ_ordenacaoFichaProdutoPr NUMBER;
  v_ativ_atualizaCustoMedio      NUMBER;
  v_ativ_atualizaUltimaCompra    NUMBER;
  v_ativ_selecionaAtividadePrev  NUMBER;
  v_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          NUMBER;
  v_ativ_geraFinanceiro          NUMBER;
  v_valorFreteRegra              NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := p_mensagemAviso;
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemOrcamento := p_item_idItemOrcamento;
  r_buffer_idItemOrcamento := p_buffer_idItemOrcamento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.transportadora,
    cab.enderecoTransportadora,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_finalidadeNota,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_transportadora,
    v_cab_enderecoTransportadora,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.orcamento = p_item_orcamento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_controleEntrega          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_contrEntr_habilitaFrete  := 0;
  v_item_quantidadeSaldo         := p_item_quantidade;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorFreteGeral         := p_item_valorFreteGeral;
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  v_contrEntr_habilitaFrete      := 0;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOORCAMENTOXPROMOCOES
    WHERE orcamento = p_item_orcamento;
  END IF;
  IF p_item_idItemOrcamento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeSaldo,
        a.controleEntrega,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        prod.tipoProduto,
        b.habilitaFrete
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA b
      ON b.controleEntrega = a.controleEntrega
      WHERE a.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_controleEntrega := a.controleEntrega;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_contrEntr_habilitaFrete := 0;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_contrEntr_habilitaFrete := a.habilitaFrete;
      IF p_buscarAliquotas_CalcularImp = 'T' THEN
        IF p_buscarGeraFinanceiroEstoque = 1 THEN
          v_item_movimentaEstoque        := a.movimentaEstoque;
          v_item_geraFinanceiro          := a.geraFinanceiro;
        END IF;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF a.cancelado = 0 THEN
        v_item_quantidadeSaldo := v_item_quantidadeSaldo + a.quantidadeSaldo - a.quantidade;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> v_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    v_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = 'E'
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        v_cab_entradaSaida,
        0, -- v_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_ORCAMENTO_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_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_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, 
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND (a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_mensagemAviso,
        r_calcularImpostos,
        0, -- p_item_idItemOrcamento
        p_item_orcamento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_ambiente,
        p_item_ambienteObservacoes,
        999, -- p_item_vinculoItemDocumento
        0, -- p_item_atividadeServico
        'A', -- p_item_statusAtividadeServico
        p_item_controleEntrega,
        p_item_dataEntrega,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idEnderecoEstoque
        0, -- p_item_idNumeroSerie
        p_item_atividadeProjeto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(v_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- v_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        ' ', -- p_idAtividadesPrevistasSelec
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_idItemOrcamento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemOrcamento)) >= 14
      LOOP
        v_ajuste_idItemOrcamento := TO_NUMBER(SUBSTR(r_buffer_idItemOrcamento,1,14));
        r_buffer_idItemOrcamento := RTRIM(SUBSTR(r_buffer_idItemOrcamento,16,32000));
