@EndUserText.label : 'Custom Charge'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zt_ds_charge {
key client : abap.clnt not null;
key guid : /bobf/conf_key not null;
gr_cntxt : include zs_charge_cntxt;
gr_data : include zs_charge_data;
gr_admin : include zs_charge_admin;
}
@EndUserText.label : 'Charge Context'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
define structure zs_charge_cntxt {
company_code : bukrs;
debt_set_number : dcm_debt_set_number_kk;
partner_id : bu_partner;
transaction_guid : crmt_object_guid;
transaction_id : crmt_object_id;
}
@EndUserText.label : 'Charge Data'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
define structure zs_charge_data {
@Semantics.amount.currencyCode : 'zt_ds_charge.charge_curr'
charge_amount : betrw_kk;
charge_curr : blwae_kk;
charge_type : char3;
charge_reason_code : char3;
charge_date : dats;
charge_document : opbel_kk;
reverse_document : opbel_kk;
reverse_date : dats;
reverse_reason : char3;
status_code : char3;
}
@EndUserText.label : 'Admin fields for charge'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
define structure zs_charge_admin {
created_on : timestampl;
created_by : syuname;
changed_on : timestampl;
changed_by : syuname;
}
Diagram 3
define root view entity ZR_DS_CHARGE_ROOT
as select from ZI_DS_CHARGE
{
key Guid,
CompanyCode,
DebtSetNumber,
PartnerId,
TransactionGuid,
TransactionId,
ChargeAmount,
ChargeCurr,
ChargeType,
ChargeReasonCode,
ChargeDocument,
ChargeDate,
ReverseDocument,
ReverseDate,
ReverseReason,
StatusCode,
CreatedOn,
CreatedBy,
ChangedOn,
ChangedBy
}
Diagram 6
implementation unmanaged in class zbp_r_ds_charge_root unique;
define behavior for ZR_DS_CHARGE_ROOT alias DcmCharge
late numbering in place
etag master ChangedOn
{
create;
update;
action reverseCHRG parameter zrk_ds_charge_reverse_action result [1] $self;
mapping for ZT_DS_CHARGE control zs_ds_charge_control
{
Guid = guid;
CompanyCode = company_code;
DebtSetNumber = debt_set_number;
PartnerId = partner_id;
TransactionGuid = transaction_guid;
TransactionId = transaction_id;
ChargeAmount = charge_amount;
ChargeCurr = charge_curr;
ChargeType = charge_type;
ChargeReasonCode = charge_reason_code;
ChargeDocument = charge_document;
ChargeDate = charge_date;
ReverseDocument = reverse_document;
ReverseDate = reverse_date;
ReverseReason = reverse_reason;
StatusCode = status_code;
CreatedOn = created_on;
CreatedBy = created_by;
ChangedOn = changed_on;
ChangedBy = changed_by;
}
//Define fields that can only be set internally
field ( readonly ) guid, createdby, createdon, changedby, changedon;
}
@EndUserText.label: 'Reverse Charge action'
define abstract entity zrk_ds_charge_reverse_action
// with parameters parameter_name : parameter_type
{
reverseReason : char3;
}
@EndUserText.label : 'Control structure for Unamanged RAP'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
define structure zs_ds_charge_control {
guid : xsdboolean;
company_code : xsdboolean;
debt_set_number : xsdboolean;
partner_id : xsdboolean;
transaction_guid : xsdboolean;
transaction_id : xsdboolean;
charge_amount : xsdboolean;
charge_curr : xsdboolean;
charge_type : xsdboolean;
charge_reason_code : xsdboolean;
charge_document : xsdboolean;
charge_date : xsdboolean;
restart_document : xsdboolean;
reverse_date : xsdboolean;
reverse_reason : xsdboolean;
status_code : xsdboolean;
created_on : xsdboolean;
created_by : xsdboolean;
changed_on : xsdboolean;
changed_by : xsdboolean;
}
Diagram 7
CLASS zbp_r_ds_charge_root DEFINITION PUBLIC ABSTRACT FINAL FOR BEHAVIOR OF zr_ds_charge_root.
ENDCLASS.
CLASS zbp_r_ds_charge_root IMPLEMENTATION.
ENDCLASS.
CLASS lhc_DcmCharge DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS create FOR MODIFY
IMPORTING entities FOR CREATE DcmCharge.
METHODS update FOR MODIFY
IMPORTING entities FOR UPDATE DcmCharge.
METHODS read FOR READ
IMPORTING keys FOR READ DcmCharge RESULT result.
METHODS reverse_charge FOR MODIFY
IMPORTING entities FOR ACTION DcmCharge~reverseChrg
RESULT et_return.
ENDCLASS.
CLASS lhc_DcmCharge IMPLEMENTATION.
METHOD create.
DATA lo_bo_ds_charge TYPE REF TO zif_bo_ds_charge.
lo_bo_ds_charge = zcl_bo_ds_charge=>get_factory( ).
lo_bo_ds_charge->create( EXPORTING it_entities = entities
CHANGING ct_mapped = mapped-dcmcharge
ct_failed = failed-dcmcharge
ct_reported = reported-dcmcharge ).
ENDMETHOD.
METHOD update.
ENDMETHOD.
METHOD read.
DATA lo_bo_ds_charge TYPE REF TO zif_bo_ds_charge.
lo_bo_ds_charge = zcl_bo_ds_charge=>get_factory( ).
lo_bo_ds_charge->read( EXPORTING it_keys = keys
CHANGING ct_result = result
ct_failed = failed-dcmcharge ).
ENDMETHOD.
METHOD reverse_charge.
DATA lo_bo_ds_charge TYPE REF TO zif_bo_ds_charge.
lo_bo_ds_charge = zcl_bo_ds_charge=>get_factory( ).
lo_bo_ds_charge->reverse_charge( EXPORTING it_entities = entities
CHANGING ct_mapped = mapped-dcmcharge
ct_failed = failed-dcmcharge
ct_reported = reported-dcmcharge ).
ENDMETHOD.
ENDCLASS.
Diagram 8
CLASS lsc_ZR_DS_CHARGE_ROOT DEFINITION INHERITING FROM cl_abap_behavior_saver.
PROTECTED SECTION.
METHODS check_before_save REDEFINITION.
METHODS finalize REDEFINITION.
METHODS save REDEFINITION.
METHODS adjust_numbers REDEFINITION.
ENDCLASS.
CLASS lsc_ZR_DS_CHARGE_ROOT IMPLEMENTATION.
METHOD check_before_save.
ENDMETHOD.
METHOD finalize.
ENDMETHOD.
METHOD save.
DATA lo_bo_ds_charge TYPE REF TO zif_bo_ds_charge.
lo_bo_ds_charge = zcl_bo_ds_charge=>get_factory( ).
lo_bo_ds_charge->save( ).
ENDMETHOD.
METHOD adjust_numbers.
ENDMETHOD.
ENDCLASS.
Diagram 8
Method | Delegate To |
read | zif_ds_charge_dao~read |
create | zif_ds_charge~create(simulation_mode) |
reverse_charge | zif_ds_charge_reverse~create(simulation_mode) |
save | zif_ds_charge~create; zif_ds_charge_reverse~create |
TYPES: BEGIN OF ty_s_chrg_buffer,
debt_set_number TYPE dcm_debt_set_number_kk,
entity_data TYpe zt_ds_charge,
END OF ty_s_chrg_buffer.
TYPES:
ty_t_chrg_buffer TYPE TABLE OF ty_s_chrg_buffer.
Diagram 10
TYPES:
ty_t_ent_keys TYPE TABLE FOR READ IMPORT zr_ds_charge_root .
TYPES:
ty_t_ent_upd TYPE TABLE FOR UPDATE zr_ds_charge_root.
TYPES:
ty_t_ent_add TYPE TABLE FOR CREATE zr_ds_charge_root .
TYPES:
ty_t_chrg_map TYPE TABLE FOR MAPPED zr_ds_charge_root .
TYPES:
ty_t_chrg_mapped TYPE TABLE FOR MAPPED LATE zr_ds_charge_root .
TYPES:
ty_t_chrg_failed TYPE TABLE FOR FAILED zr_ds_charge_root .
TYPES:
ty_t_chrg_reported TYPE TABLE FOR REPORTED zr_ds_charge_root .
TYPES:
ty_t_chrg_read_result TYPE TABLE FOR READ RESULT zr_ds_charge_root .
TYPES:
ty_t_reverse_charge TYPE TABLE FOR ACTION IMPORT zr_ds_charge_root~reversechrg .
Diagram 11
METHODS create
IMPORTING
!it_entities TYPE ty_t_ent_add
CHANGING
!ct_mapped TYPE ty_t_chrg_map
!ct_failed TYPE ty_t_chrg_failed
!ct_reported TYPE ty_t_chrg_reported .
METHODS read
IMPORTING
!it_keys TYPE ty_t_ent_keys
CHANGING
!ct_failed TYPE ty_t_chrg_failed
!ct_result TYPE ty_t_chrg_read_result.
METHODS update .
METHODS check_before_save .
METHODS save .
METHODS reverse_charge
IMPORTING
!it_entities TYPE ty_t_reverse_charge
CHANGING
!ct_mapped TYPE ty_t_chrg_map
!ct_failed TYPE ty_t_chrg_failed
Diagram 12
Method | Purpose |
get_factory | create an instance of the factory class |
add_message | convert a message of type bapiret2 to a rap message |
create | delegate processing to micro service zcl_ds_charge and build buffer |
read | delegate processing to micro service zcl_ds_charge_dao |
reverse_charge | delegate processing to micro service zcl_ds_charge_reverse and build buffer |
save | delegate processing to zcl_ds_charge or zcl_ds_charge_reverse depending on buffer. |
METHOD get_factory.
IF factory IS INITIAL.
factory = NEW zcl_bo_ds_charge( ).
ENDIF.
rr_instance = factory.
ENDMETHOD.
DATA mo_bapi_message_convert TYPE REF TO if_rap_plmi_bapi_msg_convert .
DATA mo_sy_message_convert TYPE REF TO if_rap_plmi_sy_msg_convert .
cl_rap_plmi_msg_convert=>get_mapper(
IMPORTING
eo_mapper_symsg = mo_sy_message_convert
eo_mapper_bapi = mo_bapi_message_convert ).
Diagram 13
METHODS add_message
IMPORTING
!iv_cid TYPE string OPTIONAL
!iv_set_failed TYPE abap_bool DEFAULT abap_true
!is_bapiret TYPE bapiret2 OPTIONAL
CHANGING
!ct_failed TYPE zif_bo_ds_charge=>ty_t_chrg_failed
!ct_reported TYPE zif_bo_ds_charge=>ty_t_chrg_reported .
METHOD add_message.
DATA(ls_message) = CORRESPONDING symsg( sy ).
APPEND INITIAL LINE TO ct_reported ASSIGNING FIELD-SYMBOL(<ls_reported>).
<ls_reported>-%cid = iv_cid.
<ls_reported>-%msg = COND #(
WHEN is_bapiret IS INITIAL
THEN mo_sy_message_convert->map_symsg_to_behv_message( ls_message )
ELSE mo_bapi_message_convert->map_bapi_to_behv_message( is_bapiret ) ).
IF iv_set_failed = abap_true.
APPEND INITIAL LINE TO ct_failed ASSIGNING FIELD-SYMBOL(<ls_failed>).
<ls_failed>-%cid = iv_cid.
ENDIF.
ENDMETHOD.
Diagram 14
METHOD zif_bo_ds_charge~create.
DATA lt_message TYPE bapiret2_tab.
DATA ls_chrg_buffer TYPE zif_bo_ds_charge~ty_s_chrg_buffer.
REFRESH me->mt_chrg_buffer.
LOOP AT it_entities ASSIGNING FIELD-SYMBOL( <fs_chrg> ).
CLEAR ls_chrg_buffer.
DATA(ls_chrg) = <fs_chrg>-%data.
lt_message = me->mo_ds_charge->create( iv_debt_set_number = ls_chrg-debtsetnumber
iv_reason = CONV #( ls_chrg-chargereasoncode )
iv_charge_type = ls_chrg-chargetype
iv_simulation = abap_true ).
READ TABLE lt_message WITH KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
me->add_message( EXPORTING iv_cid = <fs_chrg>-%cid
is_bapiret = lt_message[ 1 ]
CHANGING ct_failed = ct_failed
ct_reported = ct_reported ).
ELSE.
APPEND VALUE #( %cid = <fs_chrg>-%cid ) TO ct_mapped.
ls_chrg_buffer-debt_set_number = ls_chrg-debtsetnumber.
ls_chrg_buffer-entity_data = CORRESPONDING #( <fs_chrg> MAPPING FROM ENTITY USING CONTROL ).
APPEND ls_chrg_buffer TO me->mt_chrg_buffer.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD zif_bo_ds_charge~read.
LOOP AT it_keys INTO DATA(key).
DATA(ls_chrg) = mo_ds_charge_dao->get_chrg_by_guid( key-guid ).
IF ls_chrg IS NOT INITIAL.
INSERT CORRESPONDING #( ls_chrg MAPPING TO ENTITY )
INTO TABLE ct_result.
ELSE.
APPEND VALUE #( guid = key-guid
%fail-cause = if_abap_behv=>cause-not_found )
TO ct_failed.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD zif_bo_ds_charge~reverse_charge.
DATA lt_message TYPE bapiret2_tab.
DATA ls_reverse_chrg_buffer TYPE zif_bo_ds_charge~ty_s_reverse_chrg_buffer.
DATA lv_guid TYPE /bobf/conf_key.
REFRESH me->mt_reverse_chrg_buffer.
LOOP AT it_entities ASSIGNING FIELD-SYMBOL(<fs_chrg>).
CLEAR ls_reverse_chrg_buffer.
lv_guid = <fs_chrg>-guid.
DATA(ls_chrg) = me->mo_ds_charge_dao->>get_chrg_by_guid( lv_guid ).
DATA(lv_reverse_reason) = <fs_chrg>-%param-reversereason.
lt_message = me->mo_ds_charge_reverse->create( iv_debt_set_number = ls_chrg-debt_set_number
iv_reverse_reason = CONV #( lv_reverse_reason )
iv_simulation = abap_true ).
READ TABLE lt_message WITH KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
APPEND VALUE #( %tky = <fs_chrg>-%tky )
TO ct_failed.
APPEND VALUE #( %tky = <fs_chrg>-%tky
%msg = mo_bapi_message_convert->map_bapi_to_behv_message( lt_message[ 1 ] ) )
TO ct_reported.
ELSE.
APPEND VALUE #( %tky = <fs_chrg>-%tky
guid = <fs_chrg>-guid )
TO ct_mapped.
ls_reverse_chrg_buffer-debt_set_number = ls_chrg-debt_set_number.
ls_reverse_chrg_buffer-entity_data = CORRESPONDING #( ls_chrg ).
ls_reverse_chrg_buffer-entity_data-reverse_reason = lv_reverse_reason.
APPEND ls_reverse_chrg_buffer TO me->mt_reverse_chrg_buffer.
ENDIF.
ENDLOOP.
LOOP AT me->mt_chrg_buffer ASSIGNING FIELD-SYMBOL(<fs_chrg_buffer>).
DATA(ls_chrg) = <fs_chrg_buffer>-entity_data.
me->mo_ds_charge->create( iv_debt_set_number = ls_chrg-debtsetnumber
iv_reason = CONV #( ls_chrg-chargereasoncode )
iv_charge_type = ls_chrg-chargetype
iv_simulation = abap_false ).
me->mo_ds_charge->save( ).
ENDLOOP.
Diagram 15
LOOP AT me->mt_reverse_chrg_buffer ASSIGNING FIELD-SYMBOL(<fs_reverse_chrg_buffer>).
DATA(ls_chrg) = <fs_reverse_chrg_buffer>-entity_data.
me->mo_ds_charge_reverse->create( iv_debt_set_number = ls_chrg-debt_set_number
iv_reverse_reason = CONV #( ls_chrg-reverse_reason )
iv_simulation = abap_false ).
me->mo_ds_charge_reverse->save( ).
ENDLOOP.
Diagram 16
DATA lt_bo_charge TYPE TABLE FOR CREATE zr_ds_charge_root.
lt_bo_charge = VALUE #(
( %cid = cl_system_uuid=>create_uuid_c32_static( ).
DebtSetNumber = iv_debt_set_number
ChargeType = iv_charge_type
ChargeReasonCode = iv_charge_reason
CompanyCode = iv_company_code
)
).
MODIFY ENTITIES OF zr_ds_charge_root
ENTITY dcmcharge
CREATE FROM lt_bo_charge
REPORTED DATA(lt_reported)
FAILED DATA(lt_failed)
MAPPED DATA(lt_mapped).
" When: I commit the changes
COMMIT ENTITIES RESPONSE OF zr_ds_charge_root
REPORTED DATA(lt_reported_save)
FAILED DATA(lt_failed_save).
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
4 | |
3 | |
3 | |
3 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 |