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=
POUI vs ADVPL: qual escolher no Protheus sem travar seu projeto?
Se você trabalha com Protheus há algum tempo, provavelmente já passou por isso: surge uma demanda nova, alguém comenta sobre POUI, outro fala que resolve com ADVPL, e pronto… começa aquele debate que parece mais opinião do que decisão técnica. E é exatamente aqui que muitas empresas começam a errar. Não porque escolheram POUI ou […]
{{brizy_dc_image_alt entityId=
Primeiros Passos no POUI: participe do workshop ao vivo com a Rayanne
Se você sente que está perdendo tempo tentando entender como usar o POUI da melhor forma… relaxa, você não está sozinho. A real é que muita gente até sabe que o POUI pode ajudar — mas trava logo no começo. E é exatamente por isso que a gente criou esse workshop. No dia 07 de […]
{{brizy_dc_image_alt entityId=
Como estruturar pedidos de venda automáticos no Protheus (e parar de perder tempo com processos manuais)
Se você trabalha com o Protheus no dia a dia, provavelmente já viveu essa cena: o time comercial fecha uma venda, alguém precisa parar o que está fazendo para lançar o pedido, conferir informações, ajustar detalhe, corrigir erro… e quando percebe, já perdeu um tempo enorme em algo que deveria ser simples. Agora multiplica isso […]
{{brizy_dc_image_alt entityId=
Como corrigir a rejeição 1155 no Protheus (sem travar seu faturamento)
Se você trabalha com faturamento no Protheus, sabe como é: está tudo certo, pedido pronto, nota gerada… e quando vai transmitir, toma uma rejeição do nada. E não é qualquer rejeição.É aquela que trava tudo: “1155 – Data de previsão de entrega anterior ao permitido” E aí começa a correria. Neste artigo, vou te mostrar […]