A SAP provê a BAdI /SCMTMS/BADI_LOGINT_CHG_TTRQ para fazer modificações na integração dos documentos de MM, SD e LE para o TM.
Neste artigo vou abordar o ponto de ampliação /SCMTMS/BADI_LI_SRCDST_CHG que pode ser utilizada para alterar os locais de origem e destino. Infelizmente não tem a opção nessa interface para alterar o local incoterm. :-(. A vantagem dela digamos seria a simplicidade de implementação.
Ao implementar a BAdI você tem a opção de copiar um código exemplo que tratando pedidos de compra (MM). No meu caso, eu precisava alterar o destino final com base no código do fornecedor definido na remessa como Agente de Frete (Partner Function SP).
Importante.. nesse caso tive que definir a location, visto que o cliente tem o código do cliente, difente do código de fornecedor que é diferente do código do BP. Se os códigos fossem os mesmos bastaria preencher o campo lr_srcdst->des_partner.
Veja abaixo o código implementado.
Eu destaquei em amarelo as alterações que fiz no exemplo da classe.
* o uso do código é por sua conta e risco.
* This is an example implementation of source and destination change.
* In this example the destination shipping point and its address is exchanged by the receiving plant with his address.
* First determining the integration context here MM. Dereferencing the input IR_BTD_DATA pointer and for all
* destination receiving points the shipping point is cleared, the receiving plant from EKPO data is taken, the
* plant address is read from T001W and the destination address is overwritten by the plant address
* ======================================================================================== *
CASE iv_int_context.
WHEN /scmtms/if_li_c=>sc_li_int_context-int_mm.
" Get referenced MM input data
FIELD-SYMBOLS: <mm_data> TYPE /scmtms/cl_li_srcdst_hndlr_mm=>ts_mm_data.
ASSIGN ir_btd_data->* TO <mm_data>.
LOOP AT ct_srcdst REFERENCE INTO DATA(lr_srcdst).
ASSIGN <mm_data>-ekko[ ebeln = lr_srcdst->btd_id ] TO FIELD-SYMBOL(<ekko>).
IF sy-subrc = 0.
ASSIGN <mm_data>-ekpo[ ebeln = lr_srcdst->btd_id
ebelp = CONV #( |{ lr_srcdst->item_id ALPHA = IN }| ) ] TO FIELD-SYMBOL(<ekpo>).
IF sy-subrc = 0.
SELECT SINGLE werks, adrnr FROM t001w INTO @DATA(ls_t001w) WHERE werks = @<ekpo>-werks.
IF sy-subrc = 0.
CLEAR lr_srcdst->des_vstel.
lr_srcdst->des_werks = ls_t001w-werks.
lr_srcdst->des_adrnr = ls_t001w-adrnr.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
WHEN /scmtms/if_li_c=>sc_li_int_context-int_sd.
" Source Destination changes of Sales Documents
WHEN /scmtms/if_li_c=>sc_li_int_context-int_le.
" Source Destination changes of Inbound/Outbound Deliveries
" Get referenced LE input data
FIELD-SYMBOLS: <le_data> TYPE /scmtms/if_li_srcdst=>ts_le_data.
ASSIGN ir_btd_data->* TO <le_data>.
ASSIGN <le_data>-vbpavb TO FIELD-SYMBOL(<lt_vbpavb>).
READ TABLE <lt_vbpavb> INTO DATA(ls_vbpavb) WITH KEY parvw = 'SP'.
LOOP AT ct_srcdst REFERENCE INTO lr_srcdst.
lr_srcdst->des_partner = ''. "ls_vbpavb-lifnr.
lr_srcdst->des_adrnr = ''. "ls_vbpavb-adrnr.
SELECT SINGLE businesspartneruuid INTO @DATA(lv_bp_guid) FROM i_suppliertobusinesspartner WHERE supplier = @ls_vbpavb-lifnr.
SELECT SINGLE * INTO @DATA(ls_loc_data) FROM /sapapo/loc WHERE partner_guid = @lv_bp_guid.
lr_srcdst->des_loc_key = ls_loc_data-loc_uuid.
lr_srcdst->des_loc_id = ls_loc_data-locno.
ENDLOOP.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.