Atualmente algumas empresas ao criar o documento de faturamento de frete (DFF) pelo processo standard do SAP TM, gera uma inconsistência no pagamento (MIRO) para o transportador, pois o programa não está preparado para fazer a distribuição de custos olhando para apenas os itens entregues em cada etapa.
No Brasil você terá em um processo de saída, um CT-e para cada origem da mercadoria e destino. A expectativa é distribuir o custo de acordo com cada CT-e. Por exemplo, o valor do CT-e 1 será rateado entre os itens entregues para o cliente 1; o valor do CT-e 2 será rateado entre os itens entregues para o cliente 2 e assim sucessivamente.
O objetivo deste blog é descrever os ajustes a serem realizados para atender a necessidade da adequação da distribuição de custos por etapa.
Veja a seguir:
1 – Preparação
Necessário implementar a BAdI: /SCMTMS/TCD_UPDATE_DI
Método: /SCMTMS/IF_TCD_UPDATE_DI~UNASSIGN_DI
Vamos modificar essa BAdI para eliminar os itens que não fazem parte da etapa que está sendo feita a distribuição de custos.
Para isso será necessário primeiro mapear as etapas que estão na ordem de frete, essa informação pode ser vista no nó STOP_SUCC.
Assim vemos que existem duas etapas e obtemos as chaves responsáveis por elas:
Agora precisamos identificar quais itens fazem parte de cada etapa, essa informação podemos ver no nó STOP.
Podemos usar as chaves encontradas no STOP_SUCC para localizar as linhas corretas:
Dentro dessas chaves temos um nó onde é possível recuperar o código do material e a ordem de venda que fazem parte desta etapa:
Onde o Campo BASE_BTD_ID é a ordem de venda e o campo PRODUCT_ID é o número do material.
Assim que recuperadas essas informações, temos que fazer com que a BAdI elimine todos os itens que não fazem parte dessa etapa com base na ordem de venda e item.
Segue abaixo código implementado na classe: ZCLTM_TCD_UPDATE_DI
Método: UNASSIGN_DI
METHOD /SCMTMS/IF_TCD_UPDATE_DI~UNASSIGN_DI.
* Tabelas locais
DATA:
l_t_key TYPE /bobf/t_frw_key,
l_t_item TYPE /scmtms/t_sfir_item_k,
l_t_succ TYPE /scmtms/t_tor_stop_succ_k,
l_t_stop TYPE /scmtms/t_tor_stop_k,
l_t_unload TYPE /scmtms/t_tor_item_tr_k,
l_t_unload_key TYPE /bobf/t_frw_key.
* Objetos locais
DATA:
l_o_sfir_mgr TYPE REF TO /bobf/if_tra_service_manager,
l_o_tor_mgr TYPE REF TO /bobf/if_tra_service_manager.
"instanciar objetos para leitura
l_o_sfir_mgr = /bobf/cl_tra_serv_mgr_factory=>get_service_manager( iv_bo_key = /scmtms/if_suppfreightinvreq_c=>sc_bo_key ).
l_o_tor_mgr = /bobf/cl_tra_serv_mgr_factory=>get_service_manager( iv_bo_key = /scmtms/if_tor_c=>sc_bo_key ).
APPEND INITIAL LINE TO l_t_key ASSIGNING FIELD-SYMBOL().
-key = is_distr_root-host_key.
l_o_sfir_mgr->retrieve_by_association(
EXPORTING
iv_node_key = /scmtms/if_suppfreightinvreq_c=>sc_node-root
it_key = l_t_key
iv_association = /scmtms/if_suppfreightinvreq_c=>sc_association-root-item
iv_fill_data = abap_true
IMPORTING
et_data = l_t_item
).
READ TABLE it_tcd_comm_root ASSIGNING FIELD-SYMBOL()
WITH KEY ref_key = is_distr_root-host_key.
IF sy-subrc <> 0.
RETURN.
ENDIF.
CLEAR:
l_t_key[].
APPEND INITIAL LINE TO l_t_key ASSIGNING .
-key = -root_key.
l_o_tor_mgr->retrieve_by_association(
EXPORTING
iv_node_key = /scmtms/if_tor_c=>sc_node-root
it_key = l_t_key
iv_association = /scmtms/if_tor_c=>sc_association-root-stop_succ
iv_fill_data = abap_true
IMPORTING
et_data = l_t_succ
).
LOOP AT l_t_item ASSIGNING FIELD-SYMBOL().
LOOP AT l_t_succ ASSIGNING FIELD-SYMBOL() WHERE key = -tor_stage_key.
CLEAR:
l_t_key[],
l_t_stop[].
APPEND INITIAL LINE TO l_t_key ASSIGNING .
-key = -key.
l_o_tor_mgr->retrieve_by_association(
EXPORTING
iv_node_key = /scmtms/if_tor_c=>sc_node-stop_successor
it_key = l_t_key
iv_association = /scmtms/if_tor_c=>sc_association-stop_successor-next_stop
iv_fill_data = abap_true
IMPORTING
et_data = l_t_stop
).
LOOP AT l_t_stop ASSIGNING FIELD-SYMBOL() WHERE key = -succ_stop_key.
CLEAR:
l_t_key[].
APPEND INITIAL LINE TO l_t_key ASSIGNING .
-key = -key.
l_o_tor_mgr->retrieve_by_association(
EXPORTING
iv_node_key = /scmtms/if_tor_c=>sc_node-stop
it_key = l_t_key
iv_association = /scmtms/if_tor_c=>sc_association-stop-item_tr_unloaded_at_stop
iv_fill_data = abap_true
IMPORTING
et_data = l_t_unload
).
LOOP AT l_t_unload ASSIGNING FIELD-SYMBOL().
APPEND INITIAL LINE TO l_t_unload_key ASSIGNING .
-key = -key.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDLOOP.
SORT l_t_unload_key BY key.
"verificar itens relevantes do documento
LOOP AT it_distr_item ASSIGNING FIELD-SYMBOL().
"verificar se item é descarregado
READ TABLE l_t_unload_key
WITH KEY key = -ref_key
BINARY SEARCH
TRANSPORTING NO FIELDS.
CHECK sy-subrc <> 0.
APPEND INITIAL LINE TO ct_invalid_di_key ASSIGNING .
-key = -key.
ENDLOOP.
ENDMETHOD.
Lembre-se que antes disso é necessário realizar as configurações de cálculo de custo e split de faturamento por etapas, que podem ser vistos nesse blog: https://assumtek.com.br/2020/09/24/sap-transportation-management-tm-calculo-de-custo-e-split-de-faturamento-por-etapas-embarcador/
Agradeço a atenção.
Continue nos acompanhando para receber mais blogs como esse!
Ivan Carlos Dani
Consultor SAP TM