METHOD if_ex_me_process_po_cust~check.
DATA:redata TYPE mepoheader.
DATA:lt_zmm_oa TYPE STANDARD TABLE OF zmm_oa_001.
DATA:ls_zmm_oa TYPE zmm_oa_001."记录采购的数据ZSRM06
DATA:lt_items TYPE purchase_order_items.
DATA:ls_items TYPE purchase_order_item.
DATA:item_data TYPE mepoitem."明细数据
DATA:flag TYPE int2.
TYPES:BEGIN OF detailtype,"明细数据结构ZSRM06
ebelp TYPE ebelp,
menge TYPE menge_d,
END OF detailtype.
DATA:detailtab TYPE STANDARD TABLE OF detailtype,
detailstu TYPE detailtype.
DATA:ebeln TYPE ebeln.
ebeln = redata-ebeln.
redata = im_header->get_data( )."获取参数
*********************************************************************************
* *当年累计订单金额超1W、用印合同管控
*********************************************************************************
DATA:lt_zmm_oa4 TYPE STANDARD TABLE OF zmm_oa_04,
lt_zmm_oa44 TYPE STANDARD TABLE OF zmm_oa_04.
DATA:ls_zmm_oa4 TYPE zmm_oa_04,
ls_zmm_oa44 TYPE zmm_oa_04.
DATA:date1 TYPE budat,datec TYPE budat,dated TYPE budat.
DATA:p_year(4) TYPE c.
DATA:flag1 TYPE int2.
TYPES:BEGIN OF dy_mo,
ekorg TYPE ekorg, "采购组织
lifnr TYPE elifn, "订单供应商
shkzg TYPE shkzg, "H=采购退货,借贷方式S+H-
dmbtr TYPE wrbtr, "实际收货金额
END OF dy_mo.
DATA:it_ekbe TYPE STANDARD TABLE OF dy_mo ."WITH HEADER LINE. "找到符合条件的收货凭证
DATA:ls_ekbe TYPE dy_mo.
DATA:dmbtrsum TYPE wrbtr. "实际收货金额
DATA:txt1 TYPE char100.
date1 = sy-datum.
p_year = sy-datum+0(4).
CONCATENATE p_year '0101' INTO datec.
CONCATENATE p_year '1231' INTO dated.
dmbtrsum = 0.
IF redata-bsart <> 'UB' AND redata-bsart <> 'HZZ3'."排除固定资产 .
SELECT
ekko~ekorg "采购组织
ekko~lifnr "订单供应商
ekbe~shkzg "H=采购退货102冲销
SUM( ekbe~dmbtr ) AS dmbtr "收货金额
INTO CORRESPONDING FIELDS OF TABLE it_ekbe
FROM ekbe
JOIN ekpo ON ekpo~ebeln = ekbe~ebeln AND ekpo~ebelp = ekbe~ebelp AND ekpo~loekz = ''
JOIN ekko ON ekko~ebeln = ekpo~ebeln
WHERE
ekko~lifnr = redata-lifnr AND ekko~ekorg = redata-ekorg AND ( ekko~bedat BETWEEN datec AND dated ) AND vgabe = '1'
GROUP BY ekko~ekorg ekko~lifnr ekbe~shkzg.
IF it_ekbe[] IS NOT INITIAL.
LOOP AT it_ekbe INTO ls_ekbe.
IF ls_ekbe-shkzg = 'H'.
ls_ekbe-dmbtr = - ls_ekbe-dmbtr.
ENDIF.
dmbtrsum = dmbtrsum + ls_ekbe-dmbtr .
ENDLOOP.
ENDIF.
IF dmbtrsum > 10000.
DATA: yy TYPE c LENGTH 4,
mm TYPE c LENGTH 2,
dd TYPE c LENGTH 2,
lv_date_formatted TYPE c LENGTH 10.
yy = redata-bedat+0(4).
mm = redata-bedat+4(2).
dd = redata-bedat+6(2).
CONCATENATE yy '-' mm '-' dd INTO lv_date_formatted.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zmm_oa44
FROM zmm_oa_04 WHERE lifnr = redata-lifnr
AND ( htyxqz >= lv_date_formatted )
AND zactive = 'X'. "①
IF lt_zmm_oa44[] IS NOT INITIAL.
lt_items = im_header->get_items( ).
LOOP AT lt_items INTO ls_items.
CLEAR:item_data.
flag1 = 0.
item_data = ls_items-item->get_data( ).
LOOP AT lt_zmm_oa44 INTO ls_zmm_oa44.
IF item_data-matnr = ls_zmm_oa44-matnr .
IF redata-bukrs = ls_zmm_oa44-bukrs .
flag1 = 1.
ELSEIF redata-ekorg = ls_zmm_oa44-ekorg .
flag1 = 1.
ENDIF.
ELSEIF ls_zmm_oa44-matnr = '' AND item_data-matkl = ls_zmm_oa44-matkl.
IF redata-bukrs = ls_zmm_oa44-bukrs .
flag1 = 1.
ELSEIF redata-ekorg = ls_zmm_oa44-ekorg .
flag1 = 1.
ENDIF.
ELSEIF ls_zmm_oa44-matnr = '' AND ls_zmm_oa44-matkl = ''.
IF redata-bukrs = ls_zmm_oa44-bukrs .
flag1 = 1.
ELSEIF redata-ekorg = ls_zmm_oa44-ekorg .
flag1 = 1.
ENDIF.
ENDIF.
ENDLOOP.
IF flag1 = 0 .
CLEAR:txt1.
CONCATENATE item_data-ebelp '行没有有效的用印合同,无法下订单,请在SRM确认!' INTO txt1.
MESSAGE txt1 TYPE 'E'.
EXIT.
ENDIF.
ENDLOOP.
ELSE.
MESSAGE '该供应商本年已采购金额大于1万元,没有有效的用印合同,无法下订单,请在SRM确认!' TYPE 'E'.
EXIT.
ENDIF.
ENDIF.
ENDIF.
DATA:txt TYPE char100.
DATA:lt_conditions TYPE mmpur_tkomv.
DATA:ls_conditions TYPE komv.
lt_items = im_header->get_items( ).
LOOP AT lt_items INTO ls_items.
CALL METHOD ls_items-item->get_conditions
IMPORTING
ex_conditions = lt_conditions.
LOOP AT lt_conditions INTO ls_conditions WHERE kschl = 'ZYZ' OR kschl = 'ZOB1' OR kschl = 'RFC1'.
IF ls_conditions-lifnr IS INITIAL.
CONCATENATE ls_conditions-kposn '行的费用类供应商不能为空!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ELSEIF ls_conditions-lifnr = redata-lifnr.
CONCATENATE ls_conditions-kposn '行的费用类供应商和订单供应商不能相同!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ENDIF.
ENDLOOP.
LOOP AT lt_conditions INTO ls_conditions WHERE kschl = 'ZYZ' OR kschl = 'ZOB1'.
IF ls_conditions-waers NE 'RMB'.
CONCATENATE ls_conditions-kposn '费用币种不能为外币,请更正!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ENDIF.
ENDLOOP.
ENDLOOP.
IF sy-tcode = 'ME21N' OR sy-tcode = 'ME22N'.
IF redata-bsart = 'HZZ9'."只有合同委外的需要填写客户号
LOOP AT lt_items INTO ls_items.
CLEAR item_data.
item_data = ls_items-item->get_data( ).
IF item_data-loekz = ''."wu删除标记
IF item_data-kunnr = ''.
IF item_data-zzkunag = ''.
MESSAGE 'HZZ9合同委外采购订单需要输入【客户数据-客户号】,请确认!' TYPE 'E'.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zmm_oa
FROM zmm_oa_001
WHERE ebeln = redata-ebeln
AND active = 'X'.
DATA:date TYPE budat,
time TYPE syuzeit,
guid TYPE guid_32.
LOOP AT lt_zmm_oa INTO ls_zmm_oa."查询最新的采购数据
IF date < ls_zmm_oa-crt_datum.
date = ls_zmm_oa-crt_datum.
guid = ls_zmm_oa-guid.
time = ls_zmm_oa-crt_time.
ELSEIF date = ls_zmm_oa-crt_datum.
IF time < ls_zmm_oa-crt_time.
date = ls_zmm_oa-crt_datum.
guid = ls_zmm_oa-guid.
time = ls_zmm_oa-crt_time.
ENDIF.
ENDIF.
ENDLOOP.
READ TABLE lt_zmm_oa INTO ls_zmm_oa WITH KEY guid = guid.
IF ls_zmm_oa-status = 1."在OA审核中,不可以更改!
MESSAGE '此采购订单已在OA审核中,不可以做更改!' TYPE 'E'.
ELSEIF ls_zmm_oa-status = 0 AND ls_zmm_oa-send = 'X'.
MESSAGE '此采购订单正在发送OA中,请稍后保存数据!' TYPE 'E'.
ENDIF.
IF sy-ucomm = 'MESAVE'."保存时候触发
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zmm_oa
FROM zmm_oa_001
WHERE ebeln = redata-ebeln
AND status > 2
AND oartime NE space.
CLEAR:date,guid,time.
LOOP AT lt_zmm_oa INTO ls_zmm_oa WHERE oartime NE space AND status > 2."查询最新的发送OA的数据
IF date < ls_zmm_oa-crt_datum.
date = ls_zmm_oa-crt_datum.
guid = ls_zmm_oa-guid.
time = ls_zmm_oa-crt_time.
ELSEIF date = ls_zmm_oa-crt_datum.
IF time < ls_zmm_oa-crt_time.
date = ls_zmm_oa-crt_datum.
guid = ls_zmm_oa-guid.
time = ls_zmm_oa-crt_time.
ENDIF.
ENDIF.
ENDLOOP.
IF guid IS NOT INITIAL."上次OA发送的数据比对大小
READ TABLE lt_zmm_oa INTO ls_zmm_oa WITH KEY guid = guid.
IF ls_zmm_oa-detail IS NOT INITIAL.
*{ REPLACE PEFK900539 1
*\ CALL METHOD zui2_json=>deserialize "输入json转换内表
CALL METHOD /ui2/cl_json=>deserialize "输入json转换内表
*} REPLACE
EXPORTING
json = ls_zmm_oa-detail
CHANGING
data = detailtab[].
lt_items = im_header->get_items( ).
LOOP AT lt_items INTO ls_items.
item_data = ls_items-item->get_data( ).
READ TABLE detailtab INTO detailstu WITH KEY ebelp = item_data-ebelp.
IF sy-subrc = 0.
IF item_data-menge > detailstu-menge.
flag = 1.
EXIT.
ENDIF.
ELSE.
flag = 1.
EXIT.
ENDIF.
ENDLOOP.
IF flag NE 0.
DATA:a TYPE char10.
DATA:title TYPE char10 VALUE '问题请求:'.
DATA:question TYPE char100 VALUE '更改的数量已大于OA审核数量,需要重新发起OA,是否保存?'.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = title
text_question = question
IMPORTING
answer = a.
IF sy-subrc = 0.
IF a = '1'.
"DATA:ebeln TYPE ebeln.
"ebeln = redata-ebeln.
EXPORT ebeln FROM ebeln TO MEMORY ID ebeln.
ELSE.
MESSAGE '已取消保存!' TYPE 'E'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF redata-bsart NE 'HZZ3'."排除固定资产
DATA:xmmpa TYPE STANDARD TABLE OF mmpa,
line_mmpa TYPE mmpa.
FIELD-SYMBOLS:<xmmpa> TYPE ANY TABLE .
ASSIGN ('(SAPLEKPA)XMMPA[]') TO <xmmpa>.
MOVE <xmmpa>[] TO xmmpa[].
DATA:wyt3tab TYPE STANDARD TABLE OF wyt3,
line_wyt3 TYPE wyt3.
READ TABLE xmmpa INTO line_mmpa WITH KEY parvw = 'BA'.
* if sy-subrc = 0.
* loop at xmmpa into line_mmpa where parvw = 'BA'.
* read table wyt3tab into line_wyt3 with key parvw = 'BA' lifn2 = line_mmpa-lifn2.
* if sy-subrc ne 0.
* txt = '基地不在供应商主数据范围内!'.
* message txt type 'E'.
* endif.
* endloop.
* if sy-subrc ne 0."没有填写订货地址
* txt = '请在采购订单中维护生产基地!'.
* message txt type 'E'.
* endif.
* endif.
ENDIF.
DATA:lifnrtab TYPE STANDARD TABLE OF zsrm_lifnr_001,lifnrtab2 TYPE STANDARD TABLE OF zsrm_lifnr_001,
line_lifnr TYPE zsrm_lifnr_001.
DATA:imtart TYPE mtart.
DATA:imatkl TYPE matkl.
DATA:iprdha TYPE mara-prdha.
DATA:rmatkl TYPE matkl.
DATA:ivbund TYPE lfa1-vbund.
LOOP AT lt_items INTO ls_items.
CLEAR item_data.
item_data = ls_items-item->get_data( ).
IF item_data-loekz = ''. "删除标记
CLEAR:imtart,imatkl,iprdha,rmatkl,ivbund.
SELECT SINGLE vbund INTO ivbund FROM lfa1 WHERE lifnr = redata-lifnr. "互委如果有值不管控
SELECT SINGLE mtart matkl prdha INTO (imtart,imatkl,iprdha) FROM mara WHERE matnr = item_data-matnr.
IF imtart = 'ROH' OR imtart = 'ROH3' OR imtart = 'VERP'. "暂时设定原物料,物料,包装
rmatkl = imatkl.
ELSEIF imtart = 'FERT' AND ivbund IS INITIAL.
IF imatkl = 'BX011' OR imatkl = 'BX029' OR imatkl = 'BX030' OR imatkl = 'BX031' OR imatkl = 'BX035'.
rmatkl = 'E0050001'.
ELSEIF imatkl = 'BX026' OR imatkl = 'BX034'.
rmatkl = 'E0050002'.
ELSEIF imatkl = 'BX025' OR imatkl = 'BX024'.
rmatkl = 'E0050003'.
ENDIF.
IF rmatkl IS INITIAL.
IF iprdha+0(6) = '500405'. "外单
IF iprdha+0(8) = '50040512' OR iprdha+0(8) = '50040513'.
rmatkl = 'E0020003'.
ELSEIF iprdha+0(8) = '50040514'.
rmatkl = 'E0020004'.
ELSEIF iprdha+0(8) = '50040510' OR iprdha+0(8) = '50040511' OR iprdha+0(8) = '50040521' OR iprdha+0(8) = '50040531'.
rmatkl = 'E0020002'.
ENDIF.
ELSEIF iprdha+0(6) = '500406'.
IF iprdha+0(8) = '50040601' OR iprdha+0(8) = '50040621' OR iprdha+0(8) = '50040631' .
rmatkl = 'E0040002'.
ELSEIF iprdha+0(8) = '50040602' OR iprdha+0(8) = '50040622' OR iprdha+0(8) = '50040632' .
rmatkl = 'E0040003'.
ELSEIF iprdha+0(8) = '50040603' OR iprdha+0(8) = '50040623' OR iprdha+0(8) = '50040633' .
rmatkl = 'E0040005'.
ELSEIF iprdha+0(10) = '5004060404' OR iprdha+0(10) = '5004060405' OR iprdha+0(10) = '5004062404'
OR iprdha+0(10) = '5004062405' OR iprdha+0(10) = '5004063404' OR iprdha+0(10) = '5004063405'.
rmatkl = 'E0040004'.
ELSE.
rmatkl = 'E0040006'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF imtart = 'ROH' OR imtart = 'ROH3' OR imtart = 'VERP' OR ( imtart = 'FERT' AND ivbund IS INITIAL ).
IF redata-lifnr = line_mmpa-lifn2. "生产基地都为空,或者生产基地一样
SELECT * INTO CORRESPONDING FIELDS OF TABLE lifnrtab
FROM zsrm_lifnr_001
WHERE matkl = rmatkl "物料组 "用物料主数据里的物料组
AND lifnr = redata-lifnr "供应商
AND ekorg = redata-ekorg "采购组织
AND ( lifnr1 = '' OR lifnr1 = line_mmpa-lifn2 )
AND matklstatus = 'QUALIFIED' "品类状态----需要合格
AND zactive = 'X'.
ELSE.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lifnrtab
FROM zsrm_lifnr_001
WHERE matkl = rmatkl "物料组 "用物料主数据里的物料组
AND lifnr = redata-lifnr "供应商
AND ekorg = redata-ekorg "采购组织
AND lifnr1 = line_mmpa-lifn2
AND matklstatus = 'QUALIFIED' "品类状态----需要合格
AND zactive = 'X'.
IF lifnrtab[] IS INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lifnrtab
FROM zsrm_lifnr_001
WHERE matkl = rmatkl "物料组 "用物料主数据里的物料组
AND lifnr = redata-lifnr "供应商
AND ekorg = redata-ekorg "采购组织
AND lifnr1status = 'INVALID'
AND matklstatus = 'QUALIFIED' "品类状态----需要合格
AND zactive = 'X'.
ENDIF.
ENDIF.
*========品名================
CLEAR lifnrtab2.
REFRESH lifnrtab2. " 清空内表
lifnrtab2 = lifnrtab. " 复制数据
*========品名================
SORT lifnrtab BY lifnr1 DESCENDING.
DELETE ADJACENT DUPLICATES FROM lifnrtab COMPARING ekorg matkl lifnr.
LOOP AT lifnrtab INTO line_lifnr.
IF ( ( line_lifnr-startdate <= redata-bedat AND line_lifnr-enddate > redata-bedat ) "在之间
OR ( line_lifnr-startdate = '00000000' AND line_lifnr-enddate = '00000000' ) "无生效日期和结束日期
OR ( line_lifnr-startdate <= redata-bedat AND line_lifnr-enddate = '00000000' AND line_lifnr-autoenddate = '00000000' ) "只有生效日期
OR ( line_lifnr-startdate <= redata-bedat AND line_lifnr-enddate = '00000000' AND line_lifnr-autoenddate > redata-bedat ) ) . "只有生效日期和自动截止日期
ELSE.
CONCATENATE item_data-ebelp '行的供应商品类已过期!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ENDIF.
IF ( ( line_lifnr-lifnr1 = line_mmpa-lifn2
* AND line_lifnr-lifnr1status = 'EFFECTIVE'
) OR "生产基地状态----需要合格
( line_lifnr-lifnr1 = '' AND line_lifnr-lifnr1status = '' )
OR redata-lifnr = line_mmpa-lifn2
OR ( line_mmpa-lifn2 = '' AND line_lifnr-lifnr1status = 'INVALID') ) .
ELSEIF ( line_lifnr-lifnr1 = line_mmpa-lifn2 AND line_lifnr-lifnr1status = 'INTRODUCTI' ).
CONCATENATE item_data-ebelp '行的供应商品类对应基地正在引入中!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ELSE.
CONCATENATE item_data-ebelp '行的供应商品类对应基地不合格!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ENDIF.
ENDLOOP.
IF lifnrtab[] IS INITIAL.
CONCATENATE item_data-ebelp '行的供应商品类不合格!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ENDIF.
*========品名================
DATA:iy TYPE i.
IF item_data-idnlf CS ','.
CONCATENATE item_data-ebelp '行的【供应商物料号】内的品名存在多个,请操作,保留一个!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ELSE.
IF lifnrtab2[] IS NOT INITIAL.
iy = 0.
LOOP AT lifnrtab2 INTO line_lifnr.
IF item_data-idnlf = line_lifnr-zidnlf.
iy = iy + 1.
ENDIF.
ENDLOOP.
IF iy = 0.
CONCATENATE item_data-ebelp '行的【供应商物料号】内的品名不存在,请确认!' INTO txt.
MESSAGE txt TYPE 'E'.
EXIT.
ENDIF.
ENDIF.
ENDIF.
*=========品名=============
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD.