Alterar as tags uCom, qCom, uTrib e qTrib via ponto de entrada

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:

  1. Vai validar se não é uma nota que usa fornecedor ou é devolução
  2. Nisso vai ver um campo customizado no cadastro do cliente, se ele prefere comprar por caixa do que pela unidade padrão do produto
  3. Ai será feito um laço de repetição no array de produtos
  4. Vai posicionar no produto
  5. Pegar as informações dessa unidade de medida que é por caixa (sem usar os campos padrões)
  6. Vai alterar as posições de unidade de medida e quantidade no array de produtos
  7. 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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação