Alterando as tags uCom, qCom, uTrib e qTrib no XML da NF-e via Ponto de Entrada no Protheus

Quem trabalha com TOTVS Protheus sabe que nem todo cenário de negócio segue o “padrão feliz” do ERP.
Conversão de unidades, formas alternativas de venda e exigências específicas de clientes são situações muito mais comuns do que parece — principalmente em ambientes industriais e atacadistas.

Neste artigo, vamos mostrar como alterar as tags uCom, qCom, uTrib e qTrib diretamente no XML da NF-e, antes da transmissão, utilizando um ponto de entrada padrão do Protheus.

O problema: quando o padrão do Protheus não atende

Recentemente surgiu a seguinte dúvida:

“É possível modificar a unidade de medida e a quantidade de um produto no XML da nota antes de transmitir para a SEFAZ?”

A resposta é: sim, é possível.

Esse tipo de necessidade aparece, por exemplo, quando:

  • O cliente compra por caixa, mas o produto está cadastrado em unidade ou milheiro;
  • A empresa não utiliza o fator de conversão padrão do Protheus;
  • A unidade comercial e a unidade tributável precisam ser forçadas no XML, independentemente do cadastro base.

Nesses casos, tentar resolver apenas com parametrização geralmente não é suficiente.

A solução: Ponto de Entrada PE01NFESEFAZ

O Protheus disponibiliza o ponto de entrada PE01NFESEFAZ, que permite interferir diretamente nos dados da NF-e no momento da geração do XML, antes da transmissão.

A grande vantagem aqui é que:

  • Você não altera o pedido, o faturamento ou o estoque;
  • A customização atua somente no XML;
  • O comportamento fica 100% controlado por regra de negócio.

Lógica aplicada na customização

A lógica implementada no exemplo segue este fluxo:

  1. Valida se a nota não é devolução e não envolve fornecedor;
  2. Posiciona no cadastro do cliente (SA1);
  3. Verifica um campo customizado que indica se o cliente prefere comprar por caixa;
  4. Percorre o array de produtos da nota;
  5. Posiciona no cadastro do produto (SB1);
  6. Verifica se existe segunda unidade de medida e fator de conversão;
  7. Realiza o cálculo conforme o tipo de conversão (multiplica ou divide);
  8. Altera diretamente no array:
    • uCom
    • qCom
    • uTrib
    • qTrib
  9. Retorna o array já ajustado para geração do XML.

Exemplo de código no PE01NFESEFAZ

Abaixo está um exemplo funcional, seguindo exatamente essa lógica:

User Function PE01NFESEFAZ()
    Local aArea      := FWGetArea()
    Local aAreaSA1   := SA1->(FWGetArea())
    Local aAreaSB1   := SB1->(FWGetArea())
    Local aDados     := PARAMIXB
    Local aProd      := aDados[01]
    Local nProdAtu   := 0

    // Se não for devolução e nem fornecedor
    If ! SF2->F2_TIPO $ "B;D;"

        // Posiciona no cliente
        DbSelectArea("SA1")
        SA1->(DbSetOrder(1))
        If SA1->(MsSeek(FWxFilial("SA1") + SF2->F2_CLIENTE + SF2->F2_LOJA))

            // Cliente configurado para comprar por caixa
            If SA1->A1_X_UM == "C"

                // Percorre os produtos da nota
                For nProdAtu := 1 To Len(aProd)

                    // Código do produto no XML
                    cXCodProd := aProd[nProdAtu][02]

                    DbSelectArea("SB1")
                    SB1->(DbSetOrder(1))

                    // Produto com segunda unidade configurada
                    If SB1->(MsSeek(FWxFilial("SB1") + cXCodProd)) .And. ;
                       SB1->B1_UM == "MI" .And. ;
                       SB1->B1_SEGUM == "CX"

                        cXUmDipi   := SB1->B1_SEGUM
                        nXConvDip  := SB1->B1_X_QTDCX
                        nXQuantid  := aProd[nProdAtu][09]
                        cXTipoConv := SB1->B1_TIPCONV

                        If nXConvDip != 0

                            cUnTrib := cXUmDipi

                            If cXTipoConv == "M"
                                nQtdTrib := nXConvDip * nXQuantid
                            Else
                                nQtdTrib := nXQuantid / nXConvDip
                            EndIf

                            // Atualiza tags do XML
                            aProd[nProdAtu][08] := cUnTrib   // uCom
                            aProd[nProdAtu][09] := nQtdTrib  // qCom
                            aProd[nProdAtu][11] := cUnTrib   // uTrib
                            aProd[nProdAtu][12] := nQtdTrib  // qTrib
                        EndIf
                    EndIf
                Next
            EndIf
        EndIf
    EndIf

    FWRestArea(aAreaSB1)
    FWRestArea(aAreaSA1)
    FWRestArea(aArea)

Return aDados

Pontos importantes de atenção

Alguns cuidados essenciais ao usar esse tipo de abordagem:

  • Essa customização não altera estoque nem financeiro, apenas o XML;
  • É fundamental validar:
    • Tipo de nota;
    • Cliente;
    • Produto;
    • Conversão;
  • Sempre teste em ambiente de homologação;
  • Tenha atenção às regras fiscais do seu estado, principalmente para unidade tributável.

Existe solução padrão no Protheus?

Sim.
O exemplo acima é didático, para demonstrar como funciona a intervenção direta no XML.

O Protheus possui recurso padrão para segunda unidade de medida no XML, documentado pela TOTVS.
Segue o material oficial de apoio:

👉 https://centraldeatendimento.totvs.com/hc/pt-br/articles/360044212253

Mesmo assim, em cenários mais complexos, o ponto de entrada acaba sendo inevitável.

Conclusão

Alterar uCom, qCom, uTrib e qTrib via PE01NFESEFAZ é uma solução poderosa quando:

  • O padrão do sistema não atende;
  • O negócio exige regras específicas;
  • A empresa precisa manter consistência fiscal sem comprometer processos internos.

Se você enfrenta cenários parecidos no seu ambiente Protheus, esse tipo de ajuste pode evitar retrabalho, rejeições de nota e dores de cabeça com o fiscal.

Se quiser trocar ideia sobre esse ou outros pontos de entrada do Protheus, é só chamar a Geeker Company.

Index

Categorias

Sobre o Autor

Foto do Autor
Fábio Hayama

Apaixonado por gestão, tecnologia e inovação, Fábio Hayama possui mais de 15 anos de experiência no universo do ERP Protheus, estratégia empresarial e automação de processos.

Leia mais sobre o Fábio

Entre em contato conosco

Veja mais artigos relacionados

{{brizy_dc_image_alt entityId=
Como reduzir em até 80% o retrabalho comercial com um Portal B2B integrado ao Protheus
Seu time comercial fecha um pedido. Alguns minutos depois, alguém do administrativo precisa digitar as informações dentro do ERP. Em seguida, outra pessoa confere estoque, preços, condições comerciais e dados do cliente. Quando tudo parece correto, surge uma divergência que exige uma nova conferência. O pedido volta para ajustes, o cliente espera uma resposta e […]
{{brizy_dc_image_alt entityId=
Podcast Gratuito: Como usar IA para acelerar suporte e desenvolvimento
A Inteligência Artificial deixou de ser uma tendência distante e passou a fazer parte da rotina de empresas, consultorias e equipes de tecnologia. O que antes parecia algo complexo e restrito a grandes organizações, hoje está acessível para profissionais que buscam mais produtividade, agilidade e qualidade em suas entregas. Pensando nisso, preparamos um encontro especial […]
{{brizy_dc_image_alt entityId=
5 sinais de que sua empresa precisa de um BPM como o Fluig
Sua empresa está crescendo, mas os processos continuam os mesmos? Toda empresa sonha em crescer. Mais clientes, mais vendas, mais colaboradores, mais oportunidades e mais resultados. O problema é que, em muitos casos, o crescimento acontece mais rápido do que a capacidade da organização de estruturar seus processos internos. O resultado é um cenário que […]
{{brizy_dc_image_alt entityId=
Como impedir a alteração da numeração da Nota Fiscal sem perder a facilidade do Ctrl+C
Em projetos de sustentação e melhorias no Protheus, muitas vezes encontramos situações que parecem pequenas, mas que podem gerar grandes dores de cabeça no dia a dia da operação. Recentemente nos deparamos com um cenário interessante em um cliente. Durante o processo de faturamento, os usuários precisavam consultar a numeração da Nota Fiscal antes da […]