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=
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 […]
{{brizy_dc_image_alt entityId=
Big Techs em Guerra: como Apple, Google, TOTVS, Amazon e Microsoft estão redesenhando o mercado de tecnologia
Se você olhar as principais movimentações recentes do mercado de tecnologia, pode até parecer que são notícias isoladas. Uma empresa mudando produção, outra lançando estratégia de produto, outra investindo em logística. Mas quando você conecta os pontos, fica muito claro que existe um padrão por trás disso tudo. Gigantes como Apple, Google, Amazon, Microsoft e […]
{{brizy_dc_image_alt entityId=
Atualizar automaticamente datas na NFe SEFAZ no Protheus (sem retrabalho)
Se você usa o Protheus no dia a dia, já sabe como funciona. Você abre a tela da NFe SEFAZ…E lá vai você ajustar data manualmente de novo. Pode parecer detalhe, mas isso acontece todos os dias.E quando soma no tempo da operação, vira retrabalho puro. Foi exatamente esse cenário que vimos em um cliente. […]