对于Order来说,如果有定制化的权限控制需求,可以通过实施Badi: CRM_ORDER_AUTH_CHECK 来进行额外的权限控制。
在CRM Order中,权限检查是遵循如下序列sequence来执行的:
- BADI CRM_ORDER_AUTH_CHECK->CRM_ORDER_ALTERN_AUTH_CHECK 该方法可以允许跳过系统标准的权限检查逻辑
- 标准Check - 属于自己的单据, 当前操作用户拥有的Role
- 标准Check - 单据被分配的组织数据与当前用户所属组织相对应
- 标准Check - Territory 地域管理
- 标准Check - Business object type 例如BUS2000115
- 标准Check - Process Type
- 标准Check - 销售区域数据,Division,Channel
- BADI CRM_ORDER_AUTH_CHECK->CRM_ORDER_ADD_AUTH_CHECK
需要说明的是,针对标准Check,执行检查序列的时候,如果有任何一步Check Pass,那么将会跳过余下所有的标准Check。但是,无论检查是否通过,CRM_ORDER_ADD_AUTH_CHECK都会在最后被调用。因此,我们可以将一些客制化的检查逻辑放在此方法中。
案例
业务需求: 如果当前用户不是该单据的特定相关方,那么不允许其对该订单进行任何修改操作。
代码:
METHOD if_ex_crm_order_auth_check~crm_order_add_auth_check.
TYPES: BEGIN OF lty_guid,
guid TYPE crmt_object_guid,
END OF lty_guid.
DATA:lv_guid TYPE bu_partner_guid,
lt_header_guids TYPE crmt_object_guid_tab,
lt_partner TYPE crmt_partner_external_wrkt,
lw_partner TYPE crmt_partner_external_wrk,
lv_flg_edit(1) TYPE c.
CHECK iv_process_type = 'ZA15' AND iv_header_guid IS NOT INITIAL AND ( IV_MODE = 'B' or IV_MODE = 'D' ). '''不允许删除或者修改'''
* 取得当前用户
CALL FUNCTION 'BP_CENTRALPERSON_GET'
EXPORTING
iv_username = sy-uname
IMPORTING
ev_bu_partner_guid = lv_guid
EXCEPTIONS
no_central_person = 1
no_business_partner = 2
no_id = 3
OTHERS = 4.
Check sy-subrc = 0.
SELECT SINGLE partner
INTO @DATA(lv_partner)
FROM but000
WHERE partner_guid = @lv_guid.
lt_header_guids = VALUE #(
( iv_header_guid )
).
CALL FUNCTION 'CRM_ORDER_READ'
EXPORTING
it_header_guid = lt_header_guids
IMPORTING
et_partner = et_partner.
LOOP AT et_partner INTO ls_partner.
IF ls_partner-partner_fct = 'ZSE00008' AND ls_partner-partner_no = lv_partner.
flg_edit = 'X'
EXIT.
ENDIF.
IF flg_edit IS NOT INITIAL.
MESSAGE e043(ZSECCO_CRM). '''提示报错信息'''
RAISE no_authority.
ENDIF.
ENDMETHOD.
补充
对于BP来说,相同的权限控制可以在BADI: BADI_CRM_BP_UIU_AUTHORITY 中实现