Вы находитесь на странице: 1из 6

TYPES: BEGIN OF ty_invoice_group,

inv_group TYPE /soin/de_inv_group,


valid_from TYPE /soin/de_valid_from,
valid_to TYPE /soin/de_valid_to,
ref_value TYPE /soin/de_ref_value,
END OF ty_invoice_group.

DATA: lt_invgp_detail TYPE TABLE OF ty_invoice_group,


lt_so_ref_value TYPE /soin/t_sales_order_ref_value,
lt_vkorg_range TYPE /soin/t_vkorg_range,
lt_lips_doc_ref TYPE /soin/t_lips_doc_ref,
lt_delivery_type TYPE /soin/t_delivery_type,
lt_fvkdfi TYPE /soin/t_vkdfif,
lt_lland_range TYPE /soin/t_lland_range,
lt_fkart_range TYPE /soin/t_fkart_range,
lt_sortkri_range TYPE /soin/t_sortkri_range,
lt_sales_doc_range TYPE /soin/t_vbeln_range,
lt_doc_ref_value TYPE /soin/t_doc_ref_value,
lt_workload LIKE et_workload,

ls_vkorg_range TYPE /soin/s_vkorg_range,


ls_vbeln_range TYPE /soin/s_vbeln_range,
ls_vbco7 TYPE vbco7,
ls_rv60a TYPE rv60a,

lv_vbeln TYPE vbeln,


lv_auart TYPE auart,
lv_lfart TYPE lfart,
lv_fkart_inv TYPE /soin/de_billing_type_invoice,
lv_fkart_deb TYPE /soin/de_billing_type_debit,
lv_fkart_cred TYPE /soin/de_billing_type_credit,
lv_dummy TYPE dummy.

* Declaration field symbols


FIELD-SYMBOLS: <fs_lt_fvkdfi> LIKE LINE OF lt_fvkdfi,
<fs_lt_so_ref_value> LIKE LINE OF lt_so_ref_value,
<fs_lt_doc_ref_value> LIKE LINE OF lt_doc_ref_value,
<fs_lt_workload> LIKE LINE OF lt_workload.

* Initialize returnparameter
CLEAR: et_workload.

CHECK it_inv_group_range IS NOT INITIAL.

** Reading the invoice group details


SELECT a~inv_group a~valid_from a~valid_to b~ref_value
FROM /soin/m_invgp AS a
INNER JOIN /soin/m_invgp_r AS b
ON a~inv_group = b~inv_group
INTO TABLE lt_invgp_detail
WHERE a~inv_group IN it_inv_group_range.
IF sy-subrc <> 0.
MESSAGE e004 WITH '/SOIN/M_INVGP_R' INTO lv_dummy.
RAISE EXCEPTION TYPE /soin/cx_error.
ENDIF.

** Creating range for sales org


IF iv_sales_org IS NOT INITIAL.
ls_vkorg_range-sign = 'I'.
ls_vkorg_range-option = 'EQ'.
ls_vkorg_range-low = iv_sales_org.
APPEND ls_vkorg_range TO lt_vkorg_range.
ENDIF.

** Reading sales documents for invoice group


SELECT a~vbeln a~auart a~/soin/ref_value
INTO TABLE lt_so_ref_value
FROM vbak as a
INNER JOIN vbuk as b
ON a~vbeln = b~vbeln
FOR ALL ENTRIES IN lt_invgp_detail
WHERE a~/soin/ref_value = lt_invgp_detail-ref_value
AND a~vkorg IN lt_vkorg_range
AND b~gbstk <> 'C'.
IF NOT sy-subrc IS INITIAL.
RETURN.
ENDIF.

** When the referenced document is a delivery


** DATA(lt_vbeln) = VALUE /soin/t_vbeln( FOR ls_ IN lt_so_ref_value WHERE
** ( vbtyp EQ
/soin/cl_constants=>gc_vbtyp_delivery
** OR vbtyp EQ
/soin/cl_constants=>gc_vbtyp_delivery_return )
** ( vbeln = ls_fvkdfi-vbeln ) ).

* Get the items of the delivery


SELECT vbeln posnr vgbel vgpos
INTO TABLE lt_lips_doc_ref
FROM lips
FOR ALL ENTRIES IN lt_so_ref_value
WHERE vgbel EQ lt_so_ref_value-vbeln.
IF sy-subrc IS INITIAL.
* sorting table
SORT lt_lips_doc_ref BY vbeln posnr.
*Deleting Adjacent Number
DELETE ADJACENT DUPLICATES FROM lt_lips_doc_ref COMPARING vbeln.

* Get the types of the delivery


SELECT vbeln lfart
INTO TABLE lt_delivery_type
FROM likp
FOR ALL ENTRIES IN lt_lips_doc_ref
WHERE vbeln EQ lt_lips_doc_ref-vbeln.
IF NOT sy-subrc IS INITIAL.
* sorting table
SORT lt_delivery_type BY vbeln.
ENDIF.
ENDIF.

* Fill VBCO7 structure


ls_vbco7-mandt = sy-mandt.
ls_vbco7-allea = abap_true.
ls_vbco7-allel = abap_true.

* Fill the billing From and To date


ls_vbco7-fkdat = iv_billing_date_from.
ls_vbco7-fkdat_bis = iv_billing_date.
* Fill structure RV60A
ls_rv60a-fkdat = iv_billing_date.

IF it_sales_doc_range[] IS NOT INITIAL.


APPEND LINES OF it_sales_doc_range TO lt_sales_doc_range.
ENDIF.

** Creating range for sales document


LOOP AT lt_so_ref_value INTO DATA(ls_so_ref_value).
** Checking delivery document is exist for sales Doc.
READ TABLE lt_lips_doc_ref TRANSPORTING NO FIELDS WITH KEY vgbel =
ls_so_ref_value-vbeln.
IF sy-subrc <> 0.
ls_vbeln_range-sign = 'I'.
ls_vbeln_range-option = 'EQ'.
ls_vbeln_range-low = ls_so_ref_value-vbeln.
APPEND ls_vbeln_range TO lt_sales_doc_range.
ENDIF.
ENDLOOP.

** Creating range for delivery document


LOOP AT lt_lips_doc_ref INTO DATA(ls_lips_doc_ref).
ls_vbeln_range-sign = 'I'.
ls_vbeln_range-option = 'EQ'.
ls_vbeln_range-low = ls_lips_doc_ref-vbeln.
APPEND ls_vbeln_range TO lt_sales_doc_range.
ENDLOOP.

IF lt_sales_doc_range[] IS NOT INITIAL.


SORT lt_sales_doc_range BY low high.
DELETE ADJACENT DUPLICATES FROM lt_sales_doc_range COMPARING low high.
ENDIF.

* Select from billing index


CALL FUNCTION 'RV_READ_INVOICE_INDEX'
EXPORTING
comwa = ls_vbco7
no_billing_block = ls_vbco7-no_faksk
default_billing_type = ls_rv60a-fkart
TABLES
lvkdfi = lt_fvkdfi
s_kunnr = it_soldto_party_range
s_vbeln = lt_sales_doc_range
s_lland = lt_lland_range
s_fkart = lt_fkart_range
s_sortkri = lt_sortkri_range
s_vtweg = it_dist_chanl_range
s_spart = it_division_range.

SORT lt_so_ref_value BY vbeln.


* Preparing Document Reference value list
LOOP AT lt_fvkdfi ASSIGNING <fs_lt_fvkdfi>.
APPEND INITIAL LINE TO lt_doc_ref_value ASSIGNING <fs_lt_doc_ref_value>.

* When planned billing date is in the past


* -> set date for validity of package to actual date
IF <fs_lt_fvkdfi>-fkdat GE sy-datum.
<fs_lt_doc_ref_value>-valid_date = <fs_lt_fvkdfi>-fkdat.
ELSE.
<fs_lt_doc_ref_value>-valid_date = sy-datum.
ENDIF.

* When the referenced document is a delivery


* -> Read the delivery number and type
* -> Determine the related sales order
* Else
* -> Set the sales order header
IF <fs_lt_fvkdfi>-vbtyp EQ /soin/cl_constants=>gc_vbtyp_delivery
OR <fs_lt_fvkdfi>-vbtyp EQ /soin/cl_constants=>gc_vbtyp_delivery_return. "
Note - 2291596 to process Delivery Return Orders

<fs_lt_doc_ref_value>-vbeln_vl = <fs_lt_fvkdfi>-vbeln.

READ TABLE lt_delivery_type ASSIGNING FIELD-SYMBOL(<fs_lt_delivery_type>)


WITH KEY vbeln = <fs_lt_fvkdfi>-vbeln BINARY
SEARCH.
IF sy-subrc IS INITIAL.
<fs_lt_doc_ref_value>-lfart = <fs_lt_delivery_type>-lfart.
ENDIF.

READ TABLE lt_lips_doc_ref ASSIGNING FIELD-SYMBOL(<fs_lt_lips_doc_ref>)


WITH KEY vbeln = <fs_lt_fvkdfi>-vbeln BINARY
SEARCH.
IF sy-subrc IS INITIAL.
<fs_lt_doc_ref_value>-vbeln_va = <fs_lt_lips_doc_ref>-vgbel.
ENDIF.

ELSE.
<fs_lt_doc_ref_value>-vbeln_va = <fs_lt_fvkdfi>-vbeln.
ENDIF.

<fs_lt_doc_ref_value>-fkdat = <fs_lt_fvkdfi>-fkdat.
<fs_lt_doc_ref_value>-fkart = <fs_lt_fvkdfi>-fkart.

READ TABLE lt_so_ref_value ASSIGNING <fs_lt_so_ref_value>


WITH KEY vbeln = <fs_lt_doc_ref_value>-vbeln_va
BINARY SEARCH.
IF sy-subrc IS INITIAL.
<fs_lt_doc_ref_value>-ref_value = <fs_lt_so_ref_value>-ref_value.
<fs_lt_doc_ref_value>-auart = <fs_lt_so_ref_value>-auart.
* Determine the invoice group for the reference value
READ TABLE lt_invgp_detail INTO DATA(ls_invgp_detail) WITH KEY ref_value =
<fs_lt_doc_ref_value>-ref_value.
IF sy-subrc = 0
AND ls_invgp_detail-valid_from <= <fs_lt_doc_ref_value>-valid_date
AND ls_invgp_detail-valid_to >= <fs_lt_doc_ref_value>-valid_date.
<fs_lt_doc_ref_value>-inv_group = ls_invgp_detail-inv_group.
ELSE.
CONTINUE.
ENDIF.
ENDIF.
ENDLOOP.

** Deleting documents without invoice group


DELETE lt_doc_ref_value WHERE inv_group = space.
* Sort the list by vbeln
SORT lt_doc_ref_value BY vbeln_va vbeln_vl.

* Get the define billing types from general settings


lv_fkart_inv = /soin/cl_gen_set_access=>get_billing_type_invoice( ).
lv_fkart_deb = /soin/cl_gen_set_access=>get_billing_type_debit( ).
lv_fkart_cred = /soin/cl_gen_set_access=>get_billing_type_credit( ).

* Filter Invoice group


SORT lt_fvkdfi BY vbeln fkdat fkart.
LOOP AT lt_doc_ref_value ASSIGNING <fs_lt_doc_ref_value>
WHERE inv_group IN it_inv_group_range.

IF <fs_lt_doc_ref_value>-vbeln_vl IS NOT INITIAL.


lv_vbeln = <fs_lt_doc_ref_value>-vbeln_vl.
ELSE.
lv_vbeln = <fs_lt_doc_ref_value>-vbeln_va.
ENDIF.
READ TABLE lt_fvkdfi ASSIGNING <fs_lt_fvkdfi>
WITH KEY vbeln = lv_vbeln
fkdat = <fs_lt_doc_ref_value>-fkdat
fkart = <fs_lt_doc_ref_value>-fkart
BINARY SEARCH.
IF sy-subrc IS INITIAL.
APPEND INITIAL LINE TO lt_workload ASSIGNING <fs_lt_workload>.
MOVE-CORRESPONDING <fs_lt_fvkdfi> TO <fs_lt_workload>.

* When no Billing type is given


* -> Determine Billing type to be used based on general settings and
* Copy control
IF iv_billing_type IS INITIAL.
IF <fs_lt_fvkdfi>-vbtyp EQ /soin/cl_constants=>gc_vbtyp_delivery
OR <fs_lt_fvkdfi>-vbtyp EQ /soin/cl_constants=>gc_vbtyp_delivery_return.
" Note - 2291596 to process Delivery Return Orders
CLEAR: lv_auart.
lv_lfart = <fs_lt_doc_ref_value>-lfart.
ELSE.
CLEAR: lv_lfart.
lv_auart = <fs_lt_doc_ref_value>-auart.
ENDIF.

* Billing type invoice


IF NOT lv_fkart_inv IS INITIAL.
IF /soin/cl_tvcpf_access=>is_existing( iv_fkarn = lv_fkart_inv
iv_auarv = lv_auart
iv_lfarv = lv_lfart
iv_fkarv = space
iv_pstyv = space ) EQ
abap_true.
<fs_lt_workload>-fkart = lv_fkart_inv.
CONTINUE.
ENDIF.
ENDIF.

* Billing type debit


IF NOT lv_fkart_deb IS INITIAL.
IF /soin/cl_tvcpf_access=>is_existing( iv_fkarn = lv_fkart_deb
iv_auarv = lv_auart
iv_lfarv = lv_lfart
iv_fkarv = space
iv_pstyv = space ) EQ
abap_true.
<fs_lt_workload>-fkart = lv_fkart_deb.
CONTINUE.
ENDIF.
ENDIF.

* Billing type credit


IF NOT lv_fkart_cred IS INITIAL.
IF /soin/cl_tvcpf_access=>is_existing( iv_fkarn = lv_fkart_cred
iv_auarv = lv_auart
iv_lfarv = lv_lfart
iv_fkarv = space
iv_pstyv = space ) EQ
abap_true.
<fs_lt_workload>-fkart = lv_fkart_cred.
CONTINUE.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.

* When no workload found


* -> raise a message
IF lt_workload IS INITIAL.
MESSAGE e416 INTO lv_dummy.
RAISE EXCEPTION TYPE /soin/cx_error.
ENDIF.

* Sort the workload to optimize billing


SORT lt_workload BY kunnr vkorg v_fkart v_fkdat sortkri fkdat fkart vbeln.

* Handover returnparameter
et_workload = lt_workload.

ENDMETHOD.

Вам также может понравиться