FUNCTION zzcrm_xiaoshou_change.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(LS_INPUT) TYPE ZZS_ZCRM007
*" EXPORTING
*" REFERENCE(LS_OUT) TYPE ZZS_ZCRMCX04
*"----------------------------------------------------------------------
DATA:lv_n TYPE i.
DATA:lv_u TYPE i.
DATA: gt_zfpla TYPE TABLE OF fplavb.
DATA: gt_fpla_new TYPE TABLE OF fplavb.
DATA: gt_fpla_old TYPE TABLE OF fplavb.
DATA: gt_zfplt TYPE TABLE OF fpltvb. "OLD
DATA: gt_fplt_old TYPE TABLE OF fpltvb. "OLD
DATA: gt_zfplt1 TYPE TABLE OF fpltvb, "NEEW
gw_zfplt1 TYPE fpltvb.
DATA: lv_fakwr TYPE fpltvb-fakwr.
DATA: lv_ketwr TYPE netwr_ak.
DATA:lv_posnr TYPE vbap-posnr,
lv_netwr TYPE vbap-netwr.
SELECT SINGLE posnr netwr""""
FROM vbap
INTO ( lv_posnr,lv_netwr )
WHERE vbeln = ls_input-vbeln."""""""获取SO行号,一个SO只有一行
SELECT SINGLE netwr,
waerk,
knumv
FROM vbak
INTO @DATA(lv_netpr)
WHERE vbeln = @ls_input-vbeln.
IF lv_netpr IS NOT INITIAL."""""获取mwsi对应净价值
SELECT SINGLE kbetr
FROM prcd_elements
INTO @DATA(lv_kbetr)
WHERE knumv = @lv_netpr-knumv
AND kschl = 'MWSI'.
ENDIF.
SELECT SINGLE fplnr""""""""""""""获取开票计划号
FROM vbkd
INTO @DATA(lv_fplnr)
WHERE vbeln = @ls_input-vbeln
AND posnr = @lv_posnr.
SELECT MAX( fpltr )"""""""""""""""""""""获取开票计划行号
FROM fplt
INTO @DATA(max_fpltr)
WHERE fplnr = @lv_fplnr.
CALL FUNCTION 'BILLING_SCHEDULE_READ' """""获取开票计划行数据
EXPORTING
fplnr = lv_fplnr
TABLES
zfpla = gt_zfpla
zfplt = gt_zfplt.
gt_zfplt1 = gt_zfplt.
CLEAR:lv_ketwr,lv_fakwr.
LOOP AT gt_zfplt INTO DATA(gs_zfplt) WHERE fplnr = lv_fplnr AND fksaf = 'C' ."""获取所有已经开票行的金额汇总值
lv_fakwr = lv_fakwr + gs_zfplt-fakwr."获取所有已经开票行的金额汇总值
ENDLOOP.
IF lv_fakwr + ls_input-kbetr / ( 1 + lv_kbetr / 100 ) <= lv_netwr.
LOOP AT gt_zfplt INTO DATA(gw_zfplt) WHERE fksaf = 'A'.""""""删除原有A行数据
gw_zfplt1-updkz = 'D'.
MODIFY gt_zfplt FROM gw_zfplt .
CLEAR:gw_zfplt .
ENDLOOP.
gw_zfplt1-updkz = 'I'.
gw_zfplt1-fplnr = lv_fplnr.
gw_zfplt1-fareg = '1' .
gw_zfplt1-fpltr = max_fpltr + 1.
gw_zfplt1-waers = lv_netpr-waerk.
gw_zfplt1-fksaf = 'A' .
gw_zfplt1-tetxt = '0003' .
gw_zfplt1-fpttp = '01' .
gw_zfplt1-fpfix = '0' .
gw_zfplt1-afdat = sy-datum.
gw_zfplt1-fkdat = sy-datum.
gw_zfplt1-fakwr = ls_input-kbetr / ( 1 + lv_kbetr / 100 )."""""出具发票/发票计划中指定日期的待出具发票/计算数值
lv_ketwr = gw_zfplt1-fakwr.
gw_zfplt1-fproz = gw_zfplt1-fakwr / lv_netwr * 100."bili
CLEAR:gw_zfplt1-faksp.
APPEND gw_zfplt1 TO gt_zfplt1.
lv_ketwr = lv_netwr - lv_fakwr - lv_ketwr.
IF lv_ketwr GT 0.
gw_zfplt1-updkz = 'I'.
gw_zfplt1-fplnr = lv_fplnr.
gw_zfplt1-fareg = '1' .
gw_zfplt1-fpltr = max_fpltr + 2.
gw_zfplt1-waers = lv_netpr-waerk.
gw_zfplt1-fksaf = 'A' .
gw_zfplt1-tetxt = '0003' .
gw_zfplt1-fpttp = '01' .
gw_zfplt1-fpfix = '0' .
gw_zfplt1-faksp = '02' .
gw_zfplt1-afdat = sy-datum.
gw_zfplt1-fkdat = sy-datum.
gw_zfplt1-fakwr = lv_ketwr."""""出具发票/发票计划中指定日期的待出具发票/计算数值
gw_zfplt1-fproz = gw_zfplt1-fakwr / lv_netwr * 100."bili
APPEND gw_zfplt1 TO gt_zfplt1.
ENDIF.
APPEND LINES OF gt_zfplt TO gt_fplt_old.
APPEND LINES OF gt_zfpla TO gt_fpla_new.
APPEND LINES OF gt_zfpla TO gt_fpla_old.
CALL FUNCTION 'BILLING_SCHEDULE_SAVE'
TABLES
fpla_new = gt_fpla_new
fpla_old = gt_fpla_old
fplt_new = gt_zfplt1
fplt_old = gt_fplt_old.
COMMIT WORK AND WAIT.
IF sy-subrc = 0.
UPDATE vbap SET fksaa = 'B'
WHERE vbeln = ls_input-vbeln
AND posnr = lv_posnr.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ENDIF.
CALL FUNCTION 'SD_SALES_DOCUMENT_READ'
EXPORTING
document_number = ls_input-vbeln
EXCEPTIONS
error_message = 01.
DATA:i_fpla LIKE fpla.
CLEAR:i_fpla.
READ TABLE gt_fpla_new INTO DATA(gw_fpla_new) INDEX 1.
i_fpla = CORRESPONDING #( gw_fpla_new ).
CALL FUNCTION 'SD_SALES_BILLINGPLAN_CHANGE'
EXPORTING
i_vbeln = ls_input-vbeln
i_posnr = lv_posnr
i_fpla = i_fpla
i_create_dates = 'X'.
IF sy-subrc EQ 0.
CALL FUNCTION 'SD_SALES_DOCUMENT_SAVE'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
DO 10 TIMES.
SELECT SINGLE
fakwr
FROM fplt
INTO @DATA(lw_fakwr)
WHERE fplnr = @lv_fplnr
AND fksaf = 'A'
AND fakwr = @lv_ketwr.
IF lw_fakwr IS NOT INITIAL.
EXIT .
ELSE.
WAIT UP TO '0.3' SECONDS.
ENDIF.
ENDDO.
ls_out-e_msgtx = 'S'.
ENDIF.
ELSE.
ls_out-e_msgtx = 'E'.
ENDIF.
ELSE.
ls_out-e_msgtx = 'E'.
ls_out-e_msgty = '当前的累计开票金额大于订单总金额,请检查输入或者变更合同!'.
ENDIF.
ENDFUNCTION.