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=
3 coisas que já automatizamos com IA + Protheus na prática
Empresas passam anos investindo em ERP, implantando processos, organizando áreas e treinando equipes. Mesmo assim, em muitos casos, a operação continua dependendo de planilhas paralelas, validações manuais, retrabalho e pessoas apagando incêndio o dia inteiro. E é justamente aí que entra um ponto que muita empresa ainda não percebeu: a inteligência artificial não veio para […]
{{brizy_dc_image_alt entityId=
Guia de Sobrevivência Para Quem Está Começando no Protheus
Entrar no universo do ERP da TOTVS pode parecer simples olhando de fora. Afinal, o mercado fala o tempo todo sobre oportunidades, falta de profissionais e crescimento da área. Mas quem já tentou começar no ecossistema Protheus sabe que a realidade é um pouco diferente. No começo, surgem várias dúvidas ao mesmo tempo. “Por onde […]
{{brizy_dc_image_alt entityId=
n8n, IA e Protheus: dá para automatizar muita coisa sem projetos gigantes
O problema nunca foi o Protheus. Foi a forma como muita empresa tentou automatizar Durante muitos anos, falar sobre automação dentro do ERP significava praticamente a mesma coisa: projeto longo, documentação infinível, customizações enormes, integração complicada, custo alto e meses esperando alguma entrega começar a gerar valor. Muita empresa ficou traumatizada com esse modelo. E […]
{{brizy_dc_image_alt entityId=
Adicionar validação na exclusão do documento de saída no Protheus
Se tem uma coisa que pode virar dor de cabeça rápida dentro do Protheus, é exclusão indevida de documento de saída. E não estamos falando só de erro operacional… estamos falando de impacto fiscal, retrabalho e, em alguns casos, até problema com auditoria. Recentemente, em um cliente, surgiu exatamente esse cenário:como impedir que qualquer usuário […]