Olá Pessoal,
A SAP liberou hoje a nota "2112507 - Additional Data x Mapping BAdI Enablement" que permite a utilização de ambas as BAdI's da NF-e simultaneamente.
Esta flexibilização foi desenvolvida para facilitar a transição da BAdI de mapeamento clássica (CL_NFE_PRINT) para a BAdI de persistência (J_1BNF_ADD_DATA).
A decisão de qual BAdI será executada para um determinado documento será feita com base na implementação e utilização de ambas as BAdI's em tempo de execução dos programas.
Por exemplo, se a BAdI J_1BNF_ADD_DATA está ativa e as estruturas de exportação foram modificadas na execução do código implementado em um método (ADD_DATA por exemplo), então o sistema irá assumir que esta BAdI foi utilizada e não executará os métodos equivalentes da BAdI CL_NFE_PRINT ( FILL_HEADER e FILL_ITEM ).
Se nenhuma ativação foi encontrada e/ou nenhuma mudança ocorreu, então a BAdI CL_NFE_PRINT será chamada.
Abaixo criei um exemplo para mostrar que agora é possível implementar o método ADD_DATA da BAdI J_1BNF_ADD_DATA, verificar o NF type e baseado nisso você pode decidir se um determinado NF type utilizará a BAdI nova ou a antiga. No meu exemplo estou usando NF Type, porém nos cenários de vocês podem ser utilizados outros parâmetros.
-Exemplo utilizando o método ADD_DATA e um cenário a partir da fatura de SD via VF01:
Ao salvar a fatura o programa irá passar pela BAdI nova:
Na minha implementação do método (uma simplificação apenas para exemplo) eu adicionei um check por NF Type, desta maneira a BAdI só irá fazer a alteração do ID_DEST para as notas fiscais com NF type NE.
Após a execução do método ADD_DATA, da BAdI J_1BNF_ADD_DATA, há um método standard que verifica se houve alteração entre os parâmetros antes e depois do método ADD_DATA.
Nos casos em que houve alteração o programa preenche o campo IND_BADI_CTRL com o X.
Essa informação é persistida na tabela J_1BNFDOC para o documento que foi criado.
No meu exemplo a numeração e envio foram feitos manualmente na J1BNFE:
Neste momento o programa irá realizar o mapeamento dos dados da NFe para as estruturas que serão passadas via RFC para a mensageria.
Notem que o programa irá verificar se o campo IND_BADI_CTRL está preenchido na tabela J_1BNFDOC.
Neste momento se este campo estiver preenchido o programa irá limpar o parâmetro obj_ref.
O parâmetro obj_ref será verificado antes da execução dos métodos FILL_HEADER e FILL_ITEM da CL_NFE_PRINT. Se ele estiver vazio então o programa não entrará na execução desses métodos.
att,
Renan Correa