SAP TRANSPORTATION MANAGEMENT (TM)

Distribuição de custos por materiais entregues na etapa

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(<lw_key>).
  <lw_key>-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(<lw_comm_root>)
    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 <lw_key>.
  <lw_key>-key = <lw_comm_root>-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(<lw_item>).

    LOOP AT l_t_succ ASSIGNING FIELD-SYMBOL(<lw_succ>) WHERE key = <lw_item>-tor_stage_key.

      CLEAR:
        l_t_key[],
        l_t_stop[].

      APPEND INITIAL LINE TO l_t_key ASSIGNING <lw_key>.
      <lw_key>-key = <lw_succ>-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(<lw_stop>) WHERE key = <lw_succ>-succ_stop_key.

        CLEAR:
          l_t_key[].

        APPEND INITIAL LINE TO l_t_key ASSIGNING <lw_key>.
        <lw_key>-key = <lw_stop>-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(<lw_unload>).

          APPEND INITIAL LINE TO l_t_unload_key ASSIGNING <lw_key>.
          <lw_key>-key = <lw_unload>-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(<lw_distr_item>).

    "verificar se item é descarregado
    READ TABLE l_t_unload_key
      WITH KEY key = <lw_distr_item>-ref_key
      BINARY SEARCH
      TRANSPORTING NO FIELDS.
    CHECK sy-subrc <> 0.

    APPEND INITIAL LINE TO ct_invalid_di_key ASSIGNING <lw_key>.
    <lw_key>-key = <lw_distr_item>-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

Fale com um consultor ASSUMSAP

Vamos conversar sobre o seu projeto!

Agende uma consultoria online