No artigo de hoje, vamos demonstrar em como alterar tags de quantidade e unidade de medida do XML da nota via ponto de entrada.
Recentemente nos perguntaram, se seria possível modificar a unidade de medida e a quantidade de um produto numa nota, na geração do XML antes da transmissão.
Acontece que pode ser que a empresa tenha algum cenário que não use o padrão do sistema em fator de conversão e unidades de medida.
Para tratar isso então, podemos usar o ponto de entrada PE01NFESEFAZ e dentro dele editar o array com a informação dos produtos.
A lógica vai ser a seguinte:
- Vai validar se não é uma nota que usa fornecedor ou é devolução
- Nisso vai ver um campo customizado no cadastro do cliente, se ele prefere comprar por caixa do que pela unidade padrão do produto
- Ai será feito um laço de repetição no array de produtos
- Vai posicionar no produto
- Pegar as informações dessa unidade de medida que é por caixa (sem usar os campos padrões)
- Vai alterar as posições de unidade de medida e quantidade no array de produtos
- Por fim vai retornar o array com as novas informações que irão para o XML
Abaixo segue o exemplo do fonte conforme lógica acima:
User Function PE01NFESEFAZ()
Local aArea := FWGetArea()
Local aAreaSA1 := SA1->(FWGetArea())
Local aAreaSB1 := SB1->(FWGetArea())
Local aDados := PARAMIXB
Local cMsgAux := ""
Local cTipoRedes := ""
Local cQrySC5 := ""
Local aProd := aDados[01]
Local nProdAtu := 0
//Se não for devolução e nem usa 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))
//Somente se o cliente for por caixa, irá converter
If SA1->A1_X_UM == "C"
//Percorre os produtos
For nProdAtu := 1 To Len(aProd)
//Pega o código do produto na tag
cXCodProd := aProd[nProdAtu][02]
//Abre a tabela de produtos
DbSelectArea("SB1")
SB1->(DbSetOrder(1))
//Se conseguiu posicionar no produto e a unidade for Milheiro e a segunda for Caixa
If SB1->(MsSeek(FWxFilial("SB1") + cXCodProd)) .And. SB1->B1_UM == "MI" .And. SB1->B1_SEGUM == "CX"
//Pega a unidade de conversão, o valor de conversão, a quantidade vendida e o tipo de conversão
cXUmDipi := SB1->B1_SEGUM //B5_UMDIPI
nXConvDip := SB1->B1_X_QTDCX //B5_CONVDIP
nXQuantid := aProd[nProdAtu][09]
cXTipoConv := SB1->B1_TIPCONV
//Se tiver valor de conversão
If nXConvDip != 0
//Altera a unidade para a convertida
cUnTrib := cXUmDipi
//Faz a conversão se for multiplicação / divisão
If cXTipoConv == "M"
nQtdTrib := nXConvDip * nXQuantid
Else
nQtdTrib := nXQuantid / nXConvDip
EndIf
//Altera as posições do produto antes de gerar o 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
Obs.: O processo acima é para demonstrar uma customização, mas tem no padrão do sistema, segue link de apoio do TDN: https://centraldeatendimento.totvs.com/hc/pt-br/articles/360044212253-Cross-Segmentos-Backoffice-Protheus-Doc-Eletr%C3%B4nicos-Como-gerar-Segunda-unidade-de-medida-no-XML
Bom pessoal, por hoje é só.
Abraços e até a próxima.