← Início
Oracle Cloud: contornando o limite do nItemPed em transferências internas
A complexidade do sistema fiscal e tributário brasileiro não é novidade e traz desafios importantes para os ERPs, que precisam se adaptar constantemente às particularidades e exigências locais.
Dentro desse contexto, quero compartilhar um cenário técnico que pode surgir em implementações de transferências internas no Oracle Cloud.
Em uma transferência entre unidades, como entre matriz e filiais, pode ser obrigatória a emissão de uma NF-e para acompanhar o material durante o transporte.
O Fiscal Document Generation (FDG) gera o documento fiscal e permite a criação de um extract file com as informações necessárias para que um parceiro fiscal formate o XML do documento e faça a comunicação com a autoridade fiscal. Oracle — Fiscal Document Extract
Depois da autorização, o XML estruturado pode retornar para a organização de destino, ser transformado pelo Collaboration Messaging e capturado pelo Fiscal Document Capture (FDC). Oracle — Internal Transfer of Fiscal Documents
Fluxo resumido:
Transfer Order > Shipment > FDG > Parceiro Fiscal > SEFAZ > XML NF-e > Collaboration Messaging > FDC > ReceiptO problema
Para o FDC relacionar corretamente o documento recebido à transferência, precisamos identificar o shipment e a respectiva linha.
No XML da NF-e, uma possibilidade é utilizar:
<xPed>Shipment Number</xPed>
<nItemPed>Shipment Line Identifier</nItemPed>A limitação está no leiaute da NF-e exigido pela SEFAZ: o nItemPed aceita no máximo 6 dígitos, enquanto o xPed aceita de 1 a 15 caracteres. NF-e — MOC 7.0, Leiaute da NF-e/NFC-e
Quando o identificador da linha no Oracle ultrapassa 6 dígitos, o parceiro fiscal não consegue enviar o valor completo em nItemPed e precisa truncá-lo ou ajustá-lo antes da transmissão para a SEFAZ.
Esse é justamente o ponto crítico: ao truncar o identificador, perde-se o valor original da linha e podem ocorrer colisões entre identificadores diferentes, dificultando a correlação correta do documento no FDC.
Alternativa utilizada
A alternativa foi utilizar o infAdProd para transportar o identificador completo da linha. O campo suporta até 500 caracteres no leiaute da NF-e. NF-e — MOC 7.0, infAdProd
O desenho fica assim:
Shipment Number > xPed
Line Identifier > infAdProdPara transportar o identificador completo, passamos a utilizar a tag infAdProd no XML.
Para shipments do tipo TRANSFER ORDER SHIPMENT, usamos uma lógica no FDG em que o valor destinado ao infAdProd é obtido da tabela ZX_LINES_DET_FACTORS:
CASE
WHEN H.EVENT_CLASS_CODE = 'TRANSFER ORDER SHIPMENT'
THEN TO_CHAR(
(
SELECT NVL(LINK_TO_TRX_LINE_ID, TRX_LINE_ID)
FROM ZX_LINES_DET_FACTORS
WHERE TRX_ID = L.TRX_ID
AND TRX_LINE_ID = L.TRX_LINE_ID
AND APPLICATION_ID = L.APPLICATION_ID
AND ENTITY_CODE = L.ENTITY_CODE
AND EVENT_CLASS_CODE = L.EVENT_CLASS_CODE
)
)
ELSE L1E_1.LEGAL_MESSAGE_TEXT
END AS LEGAL_MESSAGE_TEXTCom isso, a informação do ID da linha passa a viajar no XML por meio da tag infAdProd, preservando o identificador completo.
Ajuste no Collaboration Messaging
Quando o XML autorizado retorna ao Oracle, o Collaboration Messaging transforma a mensagem antes do processamento pelo FDC.
O caminho no Oracle Cloud é:
Tools > Collaboration Messaging > Manage Collaboration Message DefinitionsA definição utilizada para a NF-e de entrada aponta para um XSL responsável pelo mapeamento. A documentação do Collaboration Messaging confirma que a definição de mensagem referencia o arquivo XSL usado na transformação. Oracle — Collaboration Message Definitions
O comportamento padrão é:
<n9:SourceDocumentLine>
<xsl:value-of select="ns3:prod/ns3:nItemPed"/>
</n9:SourceDocumentLine>Para nossa solução, adicionamos ao XSL uma lógica para deixar de buscar o ID em nItemPed e passar a buscá-lo em infAdProd:
<n9:SourceDocumentLine>
<xsl:choose>
<xsl:when test="
(ns3:prod/ns3:CFOP = 6151 or
ns3:prod/ns3:CFOP = 5151 or
ns3:prod/ns3:CFOP = 6557 or
ns3:prod/ns3:CFOP = 5557)
and normalize-space(ns3:infAdProd) != ''">
<xsl:value-of select="ns3:infAdProd"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="ns3:prod/ns3:nItemPed"/>
</xsl:otherwise>
</xsl:choose>
</n9:SourceDocumentLine>A ideia é simples:
XML NF-e > infAdProd > Collaboration Messaging XSL > SourceDocumentLine > FDCAssim, somente os CFOPs tratados passam a usar infAdProd. Para os demais documentos, o comportamento padrão com nItemPed continua sendo utilizado.
Resultado
Com esse desenho, o identificador completo da linha consegue percorrer o processo de emissão e retorno da NF-e sem depender do limite de 6 dígitos do nItemPed.
O fluxo técnico fica:
Shipment > FDG > Parceiro Fiscal > infAdProd > SEFAZ > XML > Collaboration Messaging > SourceDocumentLine > FDC > ReceiptÉ importante lembrar que infAdProd é um campo fiscal da NF-e. Portanto, esse tipo de uso deve ser validado com a área fiscal e com o parceiro responsável pela integração.
Também é recomendável evitar alterações diretas em definições seeded do Collaboration Messaging e manter a customização separada sempre que possível.