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

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

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

COMMIT;

/

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

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

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

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

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

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

COMMIT;

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

COMMIT;


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

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

COMMIT;

-- FIM BETA 1 - 18/02/2025

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

/

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

/

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

COMMIT;

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

COMMIT;

-- FIM BETA 2 - 24/03/2025

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

/

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

/

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

/

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

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

COMMIT;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  RETURN v_xml;
END;

/

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

COMMIT;

-- FIM BETA 3 - 26/03/2025


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

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

COMMIT;

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

/

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

COMMIT;

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

COMMIT;

-- FIM BETA 4 - 27/03/2025
