You are on page 1of 91

**&--------------------------------------------------------------------*

*& Include RPFIEU_SAFT_EXT_SDPROC


*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form RETRIEVE_TAX_DATA
*&---------------------------------------------------------------------*
*Involved process
*----------------
*1. Extract data from customization table
*2. Generate approprate log
*
*1. Extract data from customization table
*-----------------------------------------
*Retreive the tax data that has been maintained in the customisaiton
*table and retain it for further extraction process. IT_TAX_DATA to be
*cleared off contents only after the full SD/FI extraction is over.
*
* Log generation to provide following information
*------------------------------------------------
* 1.No of tax information present
* 2.If no tax information is maintained,appropriate message to be issued
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM retrieve_tax_data .

DATA ls_tax_data LIKE LINE OF it_tax_data. "30_F

SELECT * FROM saft_pt_tax_data


CLIENT SPECIFIED
INTO CORRESPONDING FIELDS OF TABLE it_tax_data
WHERE mandt = sy-mandt .

****32_F begin
LOOP AT it_tax_data INTO ls_tax_data.
FIND '.' IN ls_tax_data-taxpercentage.
IF sy-subrc = 4.
"replace ',' by '.' if exists
REPLACE ALL OCCURRENCES OF ',' IN ls_tax_data-taxpercentage WITH '.'.
IF sy-subrc = 4.
IF ls_tax_data-taxpercentage IS INITIAL.
ls_tax_data-taxpercentage = '0.00'.
ELSE.
"force .00 in tax percentage
CONCATENATE ls_tax_data-taxpercentage '.00'
INTO ls_tax_data-taxpercentage.
ENDIF.
ENDIF.
ENDIF.
"negative lookahead that ensure the next character is not a digit
"if positive it'll insert an additional zero
REPLACE REGEX '(\d+\.\d{1}(?!\d))'
IN ls_tax_data-taxpercentage
WITH '$1$2\0$3'.

MODIFY it_tax_data FROM ls_tax_data


TRANSPORTING taxpercentage.
CLEAR ls_tax_data.
ENDLOOP.
****32_F end

SELECT * FROM saftpt_imat INTO TABLE it_tax_material


WHERE bukrs = p_bukrs
AND product_type <> 'O'. "exclude the others
(e.g. invoice list surcharges)

ENDFORM. " RETRIEVE_TAX_DATA


*&---------------------------------------------------------------------*
*& Form READ_INV_HEADER_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM read_inv_header_info .
DATA :lv_count_inv TYPE i.
DATA : lv_inv_cnt TYPE i.
DATA : lv_inv_idx TYPE sy-tabix.
DATA : lv_index TYPE sy-index. "29_F Deadlock deleting SD

**note 2393681
DATA: lt_vbrk_add_fields TYPE TABLE OF ty_vbrk_add_fields,
ls_vbrk_add_fields TYPE ty_vbrk_add_fields.

DATA: ls_inv_vbrk TYPE st_inv_hd.

DATA: lv_badi_special_docs TYPE REF TO fieusaft_special_docs.


**note 2393681

gv_land_exit = gv_bukrs_land.
TRY.
GET BADI gv_usr_exit_badi
FILTERS
land1 = gv_land_exit.

CATCH cx_badi_not_implemented.
ENDTRY.

**35_F begin
TRY.
GET BADI gv_badi_generic
FILTERS
land = gv_land_exit.

CATCH cx_badi_multiply_implemented.
CATCH cx_badi_not_implemented.
ENDTRY.
**35_F end

CLEAR gv_usr_exit_impl.
IF gv_usr_exit_badi IS NOT INITIAL.
TRY.
CALL METHOD cl_badi_query=>number_of_implementations
EXPORTING
badi = gv_usr_exit_badi
RECEIVING
num = gv_usr_exit_impl.

CATCH cx_badi_not_implemented.
ENDTRY.
ENDIF.

**note 2393681
TRY.
GET BADI lv_badi_special_docs
FILTERS
land = gv_land_exit.

CATCH cx_badi_multiply_implemented.
CATCH cx_badi_not_implemented.
ENDTRY.
**note 2393681
**41_F begin
IF gv_badi_generic IS BOUND.
CALL BADI gv_badi_generic->get_special_docs_config
EXPORTING
iv_bukrs = p_bukrs
IMPORTING
et_fiptc_doc_exc = gt_fiptc_doc_exc.
ENDIF.
**41_F end

* --> Begin of 89_F


* -- Get SD table Conditions
PERFORM get_table_sd_condition CHANGING gv_tabname.
* <-- End of 89_F

"on HOLD added as cursor was getting closed automatically after 2 iterations -
20_F
* --> Begin of 62_F
CALL METHOD clfieu_generic_saft=>get_inv_header_info
EXPORTING
iv_bukrs = p_bukrs
iv_first_date = gv_first_date
iv_end_date = gv_end_date
IMPORTING
ev_cursor = cur_vbrk.
* <-- End of 62_F

DO .
FETCH NEXT CURSOR cur_vbrk
INTO CORRESPONDING FIELDS OF TABLE it_inv_vbrk
PACKAGE SIZE 300.

IF sy-subrc <> 0.
CLOSE CURSOR cur_vbrk. "56_F
EXIT.
ELSE.
lv_index = sy-index. "29_F Deadlock deleting SD

*Country specific extension on header level - 19_f


PERFORM check_country_specific_exten.

IF it_sales_offices[] IS NOT INITIAL.


LOOP AT it_inv_vbrk INTO wa_inv_vbrk.
lv_inv_idx = sy-tabix.
CLEAR : wa_sales_offices.
READ TABLE it_sales_offices INTO wa_sales_offices WITH KEY vkorg =
wa_inv_vbrk-vkorg.
IF sy-subrc <> 0.
DELETE it_inv_vbrk INDEX lv_inv_idx .
ENDIF.
CLEAR : wa_inv_vbrk.

ENDLOOP.
ENDIF.

* --> Begin of 88_F


* "Exclude rebate agreements
* DELETE it_inv_vbrk WHERE fktyp CA 'K'
* OR fktyp EQ 'U'. "Billing Requests 87_F
CALL METHOD clfieu_generic_saft=>exclude_documents_sd_generic
CHANGING
ct_inv_vbrk = it_inv_vbrk.
*<-- End of 88_F

******35_F begin
IF it_inv_vbrk[] IS NOT INITIAL.

* Accounting document information pertaining to the invoice documents


PERFORM get_acc_doc_info.

IF gv_badi_generic IS BOUND.
CALL BADI gv_badi_generic->exclude_documents_sd
EXPORTING
iv_bukrs = p_bukrs
iv_gjahr = p_gjahr
it_fiptc_doc_exc = gt_fiptc_doc_exc "41_F
CHANGING
cv_inv_vbrk = it_inv_vbrk.
ENDIF.
ENDIF.
******35_F end

CLEAR :lv_count_inv.
******note 2285540
LOOP AT it_inv_vbrk INTO wa_inv_vbrk.
IF wa_inv_vbrk-vbtyp = 'U'.
gv_invoice_no_wd = gv_invoice_no_wd + 1.
ELSE.
gv_invoice_no = gv_invoice_no + 1.
ENDIF.
ENDLOOP.
CLEAR : wa_inv_vbrk.
******note 2285540

SORT it_inv_vbrk .
IF it_inv_vbrk[] IS NOT INITIAL.
"Added in scope of 29_F Deadlock deleting SD- begin
"Now we are sure to have records, in first iteration
" the extraction control line can be created.
IF sy-index EQ 1.
PERFORM create_summary_ctrl.
ENDIF.
"Added in scope of 29_F Deadlock deleting SD - end

**Get condition record information


PERFORM get_condition_rec_info.

*get discount information linked


PERFORM get_discount_info.

*Delivery document related information


CLEAR : it_inv_del_cmemo[].

*Select all relevant settlement discount information


SELECT *
FROM t052
INTO TABLE lt_zterm_all
FOR ALL ENTRIES IN it_inv_vbrk
WHERE zterm EQ it_inv_vbrk-zterm.
SORT lt_zterm_all BY zterm ztagg.

*Get reason text for canceled documents


PERFORM get_reversal_reason_sd .

********34_F begin
IF gv_bukrs_land EQ 'PT'.
PERFORM prepare_inv_list_status.
ENDIF.
********34_F end

*Invoice Line item information


PERFORM get_line_item_info.
*note 29_F

*withholding tax information.

* Assign all valid variables to the structure for database updationg


PERFORM assign_data_for_tbl_update.

********note 2393681
IF gv_bukrs_land = 'PT'.
CLEAR lt_vbrk_add_fields.
LOOP AT it_inv_vbrk INTO ls_inv_vbrk.
MOVE-CORRESPONDING ls_inv_vbrk TO ls_vbrk_add_fields.
APPEND ls_vbrk_add_fields TO lt_vbrk_add_fields.
ENDLOOP.

LOOP AT it_inv_vbrk INTO ls_inv_vbrk.


ls_vbrk_add_fields-vbeln = ls_inv_vbrk-vbeln.
ls_vbrk_add_fields-bstnk_vf = ls_inv_vbrk-bstnk_vf.
ls_vbrk_add_fields-xblnr = ls_inv_vbrk-xblnr.
ls_vbrk_add_fields-zuonr = ls_inv_vbrk-zuonr.
APPEND ls_vbrk_add_fields TO lt_vbrk_add_fields.
CLEAR: ls_vbrk_add_fields,
ls_inv_vbrk.
ENDLOOP.
ENDIF.
********33_F begin
IF lv_badi_special_docs IS NOT INITIAL.
CALL BADI lv_badi_special_docs->update_special_docs_sd
EXPORTING
iv_ext_sd_ind = ls_bcv-ext_sd_ind
it_vbrk_add_fields = lt_vbrk_add_fields
CHANGING
ct_inv_hd = it_inv_hd.
ENDIF.
********33_F end
********note 2393681

********30_F
*User exit to update additional fields
PERFORM call_user_badi.
********30_F
PERFORM update_summary_run.

*Update header table


* set UPDATE TASK LOCAL.
PERFORM update_saft_tables.

* CALL FUNCTION 'DB_COMMIT'. "25_F

*Clear internal tables for further data processing


CLEAR it_inv_hd[].
CLEAR it_inv_vbrk[].
CLEAR it_inv_del_cmemo[].
CLEAR it_inv_lnes[].
ENDIF.
CLEAR it_extra_fields[]. " 19_f " signature information is missed out from
2nd iteration
ENDIF.
CLEAR wa_inv_lnes. " 20_f " clearing was missing
FREE gt_inv_list_child. "34_F
ENDDO.
PERFORM update_sd_summary.

**33_F begin
IF lv_stop_pt_extraction IS NOT INITIAL
AND gv_mess_type EQ 'E'. "36_F

PERFORM delete_data_extract.
ENDIF.
**33_F end
* Total number of invoices selected for SAF-T File creation
DESCRIBE TABLE it_inv_vbrk LINES lv_inv_cnt .

ENDFORM. " READ_INV_HEADER_INFO


*&---------------------------------------------------------------------*
*& Form GET_CONDITION_REC_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_condition_rec_info .
* --> Begin of 89_F
* -- Commented (replaced by form GET_TABLE_SD_CONDITION)
* DATA: lv_tabname type string.
*
* lv_tabname = clfieu_generic_saft=>get_table_sd_condition( ). "55_F
* <-- End of 89_F

CLEAR : it_inv_cond_rec[].
OPEN CURSOR cur_konv
FOR SELECT knumv
kposn
mwsk1
* FROM (lv_tabname) "55_F "89_F
FROM (gv_tabname) "89_F
FOR ALL ENTRIES IN it_inv_vbrk
WHERE knumv = it_inv_vbrk-knumv
AND kappl = 'V'
AND koaid = 'D'. " tax information

DO .
FETCH NEXT CURSOR cur_konv
APPENDING CORRESPONDING FIELDS OF TABLE it_inv_cond_rec
PACKAGE SIZE 1000.
IF sy-subrc <> 0.
CLOSE CURSOR cur_konv. "56_F
EXIT.
ENDIF.
ENDDO.

SORT it_inv_cond_rec. "71_F

*-----------------Reading archiving data for the condition records already archived


for live documents*----------*
* READ THE CONDITION RECORDS ARCHIVED WHOSE BILLING DOCUNMENTS ARE STILL LIVE .....
* THE INVOICE NUMBER HAS THE CONDITION RECORD NUMBER .
* WITH THE CONDITION RECORD NUMBER , SEE IF THERE ARE ANY CONDITION RECORDS IN
ARCHIVE ..
*----------------------------------------------------------------------------------
------------------------------*
IF p_sysarc IS NOT INITIAL.

* find the condition record information that is not residing in the database.
PERFORM map_inv_condn_exists.

IF lt_condn_rec_arc[] IS NOT INITIAL.


gv_arc_tbl_read = 'KONV'.
gv_arch_oper = 'D'. "to read archoved data also when main extraction is done
for documents in database.

PERFORM set_selection_criteria USING gv_arch_oper.

PERFORM initiate_arch_read_vbak.
CLEAR gt_ais_read_result[].

gt_ais_read_result[] = gt_ais_read_result_vbak[].
IF gt_ais_read_result[] IS NOT INITIAL.
gv_arch_obj = 'SD_VBAK'.

PERFORM get_archandle USING gv_arch_obj.


CLEAR : ls_arch_handle.

LOOP AT lt_arch_handle INTO ls_arch_handle.


PERFORM read_data_from_handle.

CHECK flg_read_success = 'X'.


LOOP AT gt_arch_obj_data ASSIGNING <fs_arch_obj_data>. " 25092014
PERFORM assign_data_to_inttble .
ENDLOOP. "25092014

ENDLOOP.
ENDIF.
ENDIF.

ENDIF.
ENDFORM. " GET_CONDITION_REC_INFO
*&---------------------------------------------------------------------*
*& Form GET_DISCOUNT_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_discount_info .
* --> Begin of 89_F
* -- Commented (replaced by form GET_TABLE_SD_CONDITION)
* DATA: lv_tabname type tabname.
*
* lv_tabname = clfieu_generic_saft=>get_table_sd_condition( ). "55_F
* <-- End of 89_F

FREE it_inv_discounts. "27_F


OPEN CURSOR cur_dis
FOR SELECT knumv
kposn
kschl
kherk "71_F
kbetr "71_F
mwsk1
kwert
KOAID "38_F
* FROM (lv_tabname) "55_F "89_F
FROM (gv_tabname) "89_F
FOR ALL ENTRIES IN it_inv_vbrk
WHERE knumv = it_inv_vbrk-knumv.
DO .
FETCH NEXT CURSOR cur_dis
APPENDING CORRESPONDING FIELDS OF TABLE it_inv_discounts
PACKAGE SIZE 500.
IF sy-subrc <> 0.
CLOSE CURSOR cur_dis. "56_F
EXIT.
ENDIF.

ENDDO.

SORT it_inv_discounts BY knumv kschl kposn. "Added in scope of Perf_adjusts_29_F


ENDFORM. " GET_DISCOUNT_INFO
*&---------------------------------------------------------------------*
*& Form GET_ACC_DOC_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_acc_doc_info .
DATA : lv_awkey_vbeln TYPE vbrk-vbeln.
DATA : lt_acc_doc TYPE TABLE OF acc_doc. "16_f
DATA : ls_acc_doc LIKE LINE OF lt_acc_doc."16_f
DATA : l_space TYPE boole VALUE ' '."16_f
DATA: lv_bkpf_filter TYPE string. "43_F - 1310

clfieu_generic_saft=>get_inv_bkpf_ref_filter( CHANGING cv_filter = lv_bkpf_filter


). "43_F - 1310

TRY. "43_F
lv_bkpf_filter = cl_abap_dyn_prg=>check_whitelist_str(
val = lv_bkpf_filter
whitelist = clfieu_generic_saft=>gc_whitelist_sql
).
CATCH cx_abap_not_in_whitelist.
ENDTRY.

"clear table for individual discount for list invoice


CLEAR gt_disc_ind. "46_F

LOOP AT it_inv_vbrk INTO wa_inv_vbrk.

CLEAR lt_acc_doc[]. "17_f


CLEAR lv_awkey_vbeln.
CLEAR gv_idx_vbrk.

gv_idx_vbrk = sy-tabix.
lv_awkey_vbeln = wa_inv_vbrk-vbeln.

*** begin of 52_F


CLEAR: wa_inv_vbrk-transid.
CLEAR :lt_acc_doc[].
CALL FUNCTION 'AC_DOCUMENT_RECORD'
EXPORTING
i_awtyp = 'VBRK'
i_awref = lv_awkey_vbeln
i_bukrs = p_bukrs
x_dialog = l_space
TABLES
t_documents = lt_acc_doc
EXCEPTIONS
no_reference = 1
no_document = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

SORT lt_acc_doc ASCENDING BY docnr. "59_F

READ TABLE lt_acc_doc INTO ls_acc_doc WITH KEY awtyp = 'BKPF'


STATUS = 'C'.
if sy-subrc ne 0.
* --> Begin of 65_F
READ TABLE lt_acc_doc INTO ls_acc_doc WITH KEY awtyp = 'BKPF'
status = 'A'.
IF sy-subrc NE 0.
* <-- End of 65_F
READ TABLE lt_acc_doc INTO ls_acc_doc WITH KEY awtyp = 'BKPF' .
ENDIF. "65_F
endif.
if sy-subrc eq 0.

SELECT SINGLE belnr


gjahr
blart
budat
bldat
monat
kursf
FROM bkpf
INTO (wa_inv_vbrk-belnr,
wa_inv_vbrk-gjahr,
wa_inv_vbrk-blart,
wa_inv_vbrk-budat,
wa_inv_vbrk-bldat,
wa_inv_vbrk-monat,
wa_inv_vbrk-kurrf
)
WHERE bukrs = p_bukrs
and belnr = ls_acc_doc-DOCNR
AND gjahr = ls_acc_doc-AC_GJAHR
AND awkey = lv_awkey_vbeln
AND awtyp = 'VBRK'
AND (lv_bkpf_filter). "43_F - 1310
endif.
*** end of 52_F
IF sy-subrc = 0.
PERFORM build_transaction_id.
ELSE.
* check if the corresponding accounting document is in archive
IF p_sysarc IS NOT INITIAL AND wa_inv_vbrk-rfbsk <> 'A'.

gv_awkey = lv_awkey_vbeln.
CLEAR :ls_acc_doc.
CLEAR : lv_belnr ."17_f
CLEAR :lv_gjahr. "17_f
READ TABLE lt_acc_doc INTO ls_acc_doc WITH KEY awtyp = 'BKPF'
STATUS = 'C'. "52_F
if sy-subrc ne 0.
READ TABLE lt_acc_doc INTO ls_acc_doc WITH KEY awtyp = 'BKPF'.

endif.
IF sy-subrc = 0.
MOVE ls_acc_doc-docnr+0(10) TO lv_belnr.
MOVE ls_acc_doc-ac_gjahr TO lv_gjahr .

ENDIF.
* check if the reading from archive is simultaneously selected .
IF lv_belnr IS NOT INITIAL."19_F
PERFORM set_selivno_foracc_fiarch.
ENDIF."19_f
*23092014--------------------------------------------------*
PERFORM map_fi_header_archival.
* PERFORM map_signature_data .
*23092014--------------------------------------------------*

PERFORM read_acc_data_sdlink ."11_f


ENDIF.

IF wa_inv_vbrk-transid IS NOT INITIAL.


gv_appln_msg-msgty = 'W'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '055'.
gv_appln_msg-msgv1 = lv_awkey_vbeln.
gv_appln_msg-probclass = '3'.
CONDENSE gv_appln_msg-msgv1 NO-GAPS. "46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.
CLEAR : gv_appln_msg.
ENDIF.
"48_F begin
IF gv_bukrs_land EQ 'LU'
AND wa_inv_vbrk-transid IS INITIAL.
DELETE TABLE it_inv_vbrk
FROM wa_inv_vbrk.

DELETE it_inv_vbrk
WHERE vbeln EQ wa_inv_vbrk-vbeln.
ENDIF.
"48_F end
ENDIF.
CLEAR : wa_inv_vbrk. "17_f
ENDLOOP.
ENDFORM. " GET_ACC_DOC_INFO
*&---------------------------------------------------------------------*
*& Form GET_LINE_ITEM_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_line_item_info .
DATA : lv_tax_payable TYPE vbrp-mwsbp .
DATA : lv_count_lninv TYPE i.
DATA : lv_augru TYPE vbak-augru.
DATA : lv_record_deleted TYPE char1."24_F
DATA : lv_invlist_temp TYPE char20.
DATA : lv_condrec_inv TYPE vbrk-knumv.
DATA : lv_afs_field_string TYPE string,
lo_struct TYPE REF TO cl_abap_structdescr,
lt_ddfields TYPE ddfields.
DATA : lv_invflg TYPE c.
FIELD-SYMBOLS :<lv_disc_total> TYPE FIEU_DISCAMT.
DATA : lv_no_vbrl TYPE xfeld.
data : lv_posnr type posnr.

SORT it_inv_vbrk.

DATA : lt_inv_list TYPE TABLE OF st_inv_list,


ls_inv_list LIKE LINE OF lt_inv_list.

DATA : lv_disc_tax_in TYPE vbrl-MWSBP_RL.


**note 29_F
DATA: lt_tvaut TYPE HASHED TABLE OF tvaut
WITH UNIQUE KEY spras augru.

FIELD-SYMBOLS: <fs_ls_tvaut> LIKE LINE OF lt_tvaut.


**note 29_F
DATA: lv_biling_plan. "55_F
**37_F being
TRY.
GET BADI gv_badi_generic
FILTERS
land = gv_land_exit.

CATCH cx_badi_multiply_implemented.
CATCH cx_badi_not_implemented.
ENDTRY.
**37_F end

*Code to take care of AFS solution subitems.


*If there is no AFS solution the respective fields won't be available.
*So no fields will be added to the select.
lo_struct ?= cl_abap_typedescr=>describe_by_name( 'VBRP' ).
lt_ddfields = lo_struct->get_ddic_field_list( ).

READ TABLE lt_ddfields WITH KEY fieldname = 'J_3AETENR' TRANSPORTING NO FIELDS.


IF sy-subrc = 0.
lv_afs_field_string = 'j_3aetenr = ''0000'''.
ELSE.
lv_afs_field_string = ''.
ENDIF.

*Added in scope of Perf_adjusts_29_F - begin


SELECT vbeln
posnr
matnr
fkimg
vrkme
mwskz
werks
netwr
mwsbp
arktx
erdat
aubel
vkbur
vgbel "37_F
vgpos "37_F
augru_auft "note 29_F
AUPOS "55_F
fareg "55_F
FROM vbrp INTO CORRESPONDING FIELDS OF TABLE it_vbrp_all
FOR ALL ENTRIES IN it_inv_vbrk WHERE vbeln = it_inv_vbrk-vbeln
AND kowrr = ' '
AND posar <> 'B'
AND (lv_afs_field_string).
*Added in scope of Perf_adjusts_29_F - end

* --> Begin of 61_F(PA)


* -- Check invoices for plants abroad scenario.
IF p_mdule EQ clfieu_generic_saft=>gc_module_p_abroad.
PERFORM check_filter_plants_abroad CHANGING it_vbrp_all[]
it_inv_vbrk[].
ENDIF.
* <-- end of 61_F(PA)

* --> Begin of 68_F


* -- Check and Get data according to the Billing plan DownPayments
PERFORM get_downpayment_biling_plan.

* -- Get Material Descriptions


PERFORM get_maktx_sd.
* <-- End of 68_F

******note 2299395
PERFORM get_sd_history using 'X' it_vbrp_all[]. "Get data histoty if
applicable 40_F
******note 2299395

*****note 29_F
"all fields all need (small table)
SELECT * FROM tvaut
INTO TABLE lt_tvaut
FOR ALL ENTRIES IN it_vbrp_all
WHERE augru = it_vbrp_all-augru_auft
AND spras IN (gv_langs,'EN',sy-langu).
*****note 29_F
*** load downpayment
cl_generic_obj->load_downpayment_sd( ). "55_F

LOOP AT it_inv_vbrk INTO wa_inv_vbrk.


****33_F begin
"lt_exception_docs_fi will only be filled for PT
"This change avoids processing of documents already
"with digital signature errors.
"can be qualified as a performance check
UNASSIGN <fs_exception_docs_sd>.
READ TABLE lt_exception_docs_sd
ASSIGNING <fs_exception_docs_sd>
WITH KEY fkart = wa_inv_vbrk-fkart.
IF <fs_exception_docs_sd> IS NOT ASSIGNED
OR gv_mess_type NE 'E'. "36_F
****33_F end
CLEAR lv_record_deleted. "24_F
CLEAR : lt_inv_list.
MOVE sy-mandt TO wa_inv_lnes-mandt.
MOVE wa_inv_vbrk-bukrs TO wa_inv_lnes-bukrs.
MOVE wa_inv_vbrk-vbeln TO wa_inv_lnes-invoice_no.
MOVE wa_inv_vbrk-fkdat TO wa_inv_lnes-inv_date.
MOVE p_gjahr TO wa_inv_lnes-inv_year.
MOVE wa_inv_vbrk-knumv TO wa_inv_lnes-knumv.
* Invoke further checks for reporting documents like invoice list which will not
have any line item in VBRP_20_F
IF gv_extn_ext_badi IS BOUND.
CALL BADI gv_extn_ext_badi->read_futher_checks
EXPORTING
iv_condn = lv_afs_field_string
CHANGING
ct_inv_data = wa_inv_vbrk
ct_doc_data = it_vbrp
ct_inv_invlist_link = lt_inv_list
iv_no_vbrl = lv_no_vbrl. "Perf_adjusts_29_F

********34_F begin
IF lt_inv_list IS NOT INITIAL.
APPEND LINES OF lt_inv_list
TO gt_inv_list_child.

PERFORM get_sd_history using space it_vbrp[]. "40_F


ENDIF.
********34_F end
ENDIF.

* SELECT vbeln "Comented in scope of Perf_adjusts_29_F


* posnr "Comented in scope of Perf_adjusts_29_F
* matnr "Comented in scope of Perf_adjusts_29_F
* fkimg "Comented in scope of Perf_adjusts_29_F
* vrkme "Comented in scope of Perf_adjusts_29_F
* mwskz "Comented in scope of Perf_adjusts_29_F
* werks "Comented in scope of Perf_adjusts_29_F
* netwr "Comented in scope of Perf_adjusts_29_F
* mwsbp "Comented in scope of Perf_adjusts_29_F
* arktx "Comented in scope of Perf_adjusts_29_F
* erdat "Comented in scope of Perf_adjusts_29_F
* aubel "Comented in scope of Perf_adjusts_29_F
* vkbur "Comented in scope of Perf_adjusts_29_F
* FROM vbrp APPENDING CORRESPONDING FIELDS OF TABLE it_vbrp "Comented in
scope of Perf_adjusts_29_F
* WHERE vbeln = wa_inv_vbrk-vbeln "Comented in
scope of Perf_adjusts_29_F
* AND kowrr = ' ' "Comented in
scope of Perf_adjusts_29_F
* AND posar <> 'B' "Comented in
scope of Perf_adjusts_29_F
* AND (lv_afs_field_string). "Comented in
scope of Perf_adjusts_29_F

* Added in scope of Perf_adjusts_29_F - begin


LOOP AT it_vbrp_all ASSIGNING <fs_ls_vbrp> WHERE vbeln EQ wa_inv_vbrk-vbeln.
APPEND <fs_ls_vbrp> TO it_vbrp.
ENDLOOP.
* Added in scope of Perf_adjusts_29_F - end
IF sy-subrc = 0 OR it_vbrp IS NOT INITIAL. " CONDITION UPDATED SO AS TO
CONTINUE THE PROCESSING , EVEN IN CASE THE LINE ITEMS ARE NOT THERE IN vbrp
LOOP AT it_vbrp INTO wa_vbrp.
MOVE wa_vbrp-aubel TO wa_so_data-vbeln.
APPEND wa_so_data TO it_so_data.
* DELETE INVOICES LINES AND ITS CORRESPONDING HEADER IF THEY ARE NOT BELONGING TO
THE CUSTOMISED SALES OFFICES
IF it_sales_offices[] IS NOT INITIAL.

READ TABLE it_sales_offices INTO wa_sales_offices WITH KEY vkbur =


wa_vbrp-vkbur.

IF sy-subrc <> 0.
DELETE it_vbrp WHERE vbeln = wa_vbrp-vbeln.
IF sy-subrc = 0.
DELETE it_inv_vbrk WHERE vbeln = wa_vbrp-vbeln.
IF sy-subrc = 0.
IF wa_inv_vbrk-vbtyp = 'U'. "note 2285540
gv_invoice_no_wd = gv_invoice_no_wd - 1. "note 2285540
ELSE.
gv_invoice_no = gv_invoice_no - 1.
ENDIF.
lv_record_deleted = 'X'." 24_F
ENDIF.
ENDIF.
CLEAR : wa_vbrp.
CLEAR : wa_sales_offices.
ELSE.
wa_inv_vbrk-vkbur = wa_vbrp-vkbur.
MODIFY it_inv_vbrk FROM wa_inv_vbrk TRANSPORTING vkbur WHERE vbeln =
wa_vbrp-vbeln.
CLEAR : wa_inv_vbrk-vkbur.

ENDIF.
ENDIF.
ENDLOOP.
SORT it_so_data .
DELETE ADJACENT DUPLICATES FROM it_so_data COMPARING ALL FIELDS.
IF it_so_data[] IS NOT INITIAL.
PERFORM identify_sales_order_info.
ENDIF.

* perform get payment mechanism info


* PERFORM get_payment_mechansim. "20_F

* lines items per invoice processed


CLEAR lv_count_lninv.
CLEAR lv_tax_payable.
DESCRIBE TABLE it_vbrp LINES lv_count_lninv.
gv_entries_lnescount = gv_entries_lnescount + lv_count_lninv.
** check downpayment billing plan and load itens of billing plan
PERFORM check_downpayment_biling_plan USING wa_inv_vbrk-vbeln "55_F
CHANGING lv_biling_plan. "55_F
lv_posnr = 1.
LOOP AT it_vbrp INTO wa_vbrp.

clear wa_inv_lnes. "48_F


move wa_inv_vbrk-bukrs to wa_inv_lnes-bukrs. "46_F
move WA_INV_VBRK-VBELN to wa_inv_lnes-INVOICE_NO.
move p_gjahr to wa_inv_lnes-INV_YEAR.
move wa_inv_vbrk-FKDAT to wa_inv_lnes-INV_DATE.
MOVE wa_inv_vbrk-knumv TO wa_inv_lnes-knumv. "50_F

MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-currency.


MOVE wa_vbrp-posnr TO wa_inv_lnes-posnr.
MOVE wa_vbrp-posnr TO wa_inv_lnes-kposn.
MOVE wa_vbrp-aubel TO wa_inv_lnes-org_on.
IF wa_vbrp-aubel IS NOT INITIAL.
CLEAR : wa_so_data.
READ TABLE it_so_data INTO wa_so_data
WITH KEY vbeln = wa_vbrp-aubel .
IF sy-subrc = 0.
MOVE wa_so_data-audat TO wa_inv_lnes-org_date.
* payment terms info missing in the extract as the data was retrieved based on
billing data 17_f
IF p_sysarc IS NOT INITIAL OR p_archvl IS NOT INITIAL.
CLEAR : wa_inv_pay_mech.

READ TABLE it_inv_pay_mech INTO wa_inv_pay_mech


WITH KEY vbeln = wa_so_data-vbeln
posnr = wa_vbrp-posnr. " 18_f
IF sy-subrc = 0.
MOVE wa_inv_pay_mech-text1 TO wa_inv_lnes-paymentterm.
MOVE wa_inv_pay_mech-pay_date TO wa_inv_lnes-paymentdate.
ENDIF.
ENDIF.
* payment terms info missing in the extract as the data was retireved based on
billing data 17_f
ENDIF.
ENDIF.

MOVE wa_vbrp-vbtyp TO wa_inv_lnes-documnttype.

* Tax amount in line item


MOVE wa_vbrp-mwsbp TO wa_inv_lnes-taxamount.
lv_tax_payable = lv_tax_payable + wa_inv_lnes-taxamount.

* Product code and description


PERFORM get_material_info.

* 29_F
* Tax point Date
MOVE wa_inv_vbrk-fkdat TO wa_inv_lnes-taxpointdate.
* 29_F

* quantity & unit of measure - if unit


MOVE wa_vbrp-fkimg TO wa_inv_lnes-quantity.
MOVE wa_vbrp-vrkme TO wa_inv_lnes-unitofmeasure.

* IF wa_inv_lnes-quantity IS INITIAL OR
* wa_inv_lnes-quantity = '0.00'.
* wa_inv_lnes-quantity = '1.00'.
* gv_appln_msg-msgty = 'W'. " Mandatory field missing
* gv_appln_msg-msgid = gc_message_class .
* gv_appln_msg-msgno = '057'.
* gv_appln_msg-msgv3 = wa_vbrp-posnr.
* gv_appln_msg-msgv2 = wa_vbrp-vbeln.
* gv_appln_msg-msgv1 = wa_vbrp-matnr.
* gv_appln_msg-probclass = '3'.
*
* CALL METHOD cl_generic_obj->gen_appl_log
* EXPORTING
* iv_appl_msg = gv_appln_msg
* iv_land = gv_bukrs_land
* iv_display = '-'
* iv_handle = gv_appln_handle.
*
* CLEAR : gv_appln_msg.
* ENDIF.

* Line Document Description


MOVE wa_vbrp-arktx TO wa_inv_lnes-description_line.
IF wa_vbrp-arktx IS INITIAL .
wa_inv_lnes-description_line = text-030. "53_F Omisso
gv_appln_msg-msgty = 'W'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '056'.
gv_appln_msg-msgv2 = wa_vbrp-posnr.
gv_appln_msg-msgv1 = wa_vbrp-vbeln.
gv_appln_msg-probclass = '3'.
CONDENSE: gv_appln_msg-msgv1, gv_appln_msg-msgv2 NO-GAPS. "46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

CLEAR : gv_appln_msg.
ENDIF.
* Plant information
MOVE wa_vbrp-werks TO wa_inv_lnes-plant.
* perform get_plant_address.

* Tax code and settlement amount information


PERFORM map_discount_info.

IF gv_usr_exit_impl GT 0.
CALL BADI gv_usr_exit_badi->identify_discount_amt
EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_posnr = wa_vbrp-posnr
iv_inv_date = wa_inv_vbrk-fkdat
iv_bukrs = wa_inv_vbrk-bukrs
iv_fkart = wa_inv_vbrk-fkart
iv_customer = wa_inv_vbrk-kunag
iv_vkorg = wa_inv_vbrk-vkorg
iv_knumv = wa_inv_vbrk-knumv
CHANGING
cv_kschl = wa_inv_lnes-kschl
cv_discount_amt = wa_inv_lnes-discount_amt.
ENDIF.

* *Tax information
PERFORM get_tax_info.

* Debit/Credit amounts and exchange rate information for invoices posted other
than EUR
PERFORM fill_inv_lne_amounts.
IF wa_vbrp-fareg BETWEEN '4' AND '5'. "55_F begin bill payment
wa_inv_lnes-posnr+0(1) = '9'.
* --> Begin of 76_F
IF wa_inv_vbrk-vbtyp_or = 'N' OR wa_inv_vbrk-vbtyp_or = 'O'. "Credit
Memo or Cancelation
wa_inv_lnes-curr_credit_amt = wa_inv_lnes-currr_debit_amt.
CLEAR wa_inv_lnes-currr_debit_amt.
wa_inv_lnes-credit_amt_ext = wa_inv_lnes-debit_amt_ext.
"totals already calculated, require update.
* --> Begin of 91_F
* (except Cancelled Invoices)
IF wa_inv_hd-inv_status <> 'A' AND
wa_inv_hd-inv_status <> 'F'.
* <-- End of 91_F
gv_total_credit_sd = gv_total_credit_sd + wa_inv_lnes-
credit_amt_ext.
gv_total_debit_sd = gv_total_debit_sd - wa_inv_lnes-
credit_amt_ext.
ENDIF. "91_F
CLEAR wa_inv_lnes-debit_amt_ext.
ELSE.
* <-- End of 76_F
wa_inv_lnes-currr_debit_amt = wa_inv_lnes-curr_credit_amt.
clear wa_inv_lnes-curr_credit_amt.
wa_inv_lnes-debit_amt_ext = wa_inv_lnes-credit_amt_ext.
"totals already calculated, require update.
* --> Begin of 91_F
* (except Cancelled Invoices)
IF wa_inv_hd-inv_status <> 'A' AND
wa_inv_hd-inv_status <> 'F'.
* <-- End of 91_F
gv_total_debit_sd = gv_total_debit_sd + wa_inv_lnes-debit_amt_ext.
gv_total_credit_sd = gv_total_credit_sd - wa_inv_lnes-
debit_amt_ext.
ENDIF. "91_F
CLEAR wa_inv_lnes-credit_amt_ext.
ENDIF. "76_F
ENDIF. "55_F end bill payment
* Get Settlement/Discount related info
PERFORM get_settlement_info.
MOVE gv_uuid TO wa_inv_lnes-ext_uuid.

* ******note 29_F
IF wa_vbrp-augru_auft IS NOT INITIAL.
UNASSIGN <fs_ls_tvaut>.
READ TABLE lt_tvaut
ASSIGNING <fs_ls_tvaut>
WITH TABLE KEY spras = gv_langs
augru = wa_vbrp-augru_auft.
IF sy-subrc <> 0.
READ TABLE lt_tvaut
ASSIGNING <fs_ls_tvaut>
WITH TABLE KEY spras = 'EN'
augru = wa_vbrp-augru_auft.
IF sy-subrc <> 0.
READ TABLE lt_tvaut
ASSIGNING <fs_ls_tvaut>
WITH TABLE KEY spras = sy-langu
augru = wa_vbrp-augru_auft.
ENDIF.
ENDIF.
IF <fs_ls_tvaut> IS ASSIGNED.
READ TABLE lt_canc_sd_docs
INTO ls_canc_sd_docs
WITH KEY vbeln = wa_inv_lnes-invoice_no.
IF sy-subrc = 0.
wa_inv_lnes-cred_note_ref = ls_canc_sd_docs-vbelv.
ENDIF.
wa_inv_lnes-cred_note_rea = <fs_ls_tvaut>-bezei.
ENDIF.
ENDIF.

*********39_F begin
CONCATENATE wa_vbrp-vgbel wa_vbrp-vgpos
INTO wa_inv_lnes-productserialnumber
SEPARATED BY '/'.
*********39_F begin

IF lt_inv_list[] IS NOT INITIAL . "46_F

wa_inv_lnes-posnr = lv_posnr.
APPEND wa_inv_lnes TO it_inv_lnes.

PERFORM discount_info_item TABLES gt_disc_ind USING wa_vbrp. "46_f

PERFORM tax_like_material using wa_vbrp


abap_true
lv_posnr. "46_F
add 1 to lv_posnr.
else.
APPEND wa_inv_lnes TO it_inv_lnes.
*** downpayment
PERFORM downpayment USING wa_inv_vbrk-knumv
wa_vbrp
wa_inv_lnes
lv_biling_plan. "55_f
endif.

ENDLOOP.
* * INVOICE NUMBER LINKED TO THE INVOICE LIST
IF lt_inv_list[] IS NOT INITIAL .
CLEAR : lv_disc_tax_in. "23_F- invoice List tax payable

LOOP AT lt_inv_list INTO ls_inv_list WHERE vbeln = wa_inv_vbrk-vbeln .


IF sy-subrc = 0.

MOVE ls_inv_list-vbeln_vf TO lv_invlist_temp. "21_f


* reduce the tax already paid from tax payable that can be identified from
invoice list
Lv_disc_tax_in = Lv_disc_tax_in + ls_inv_list-MWSBP_RL. "21_f
* gv_inv_list_docamt = gv_inv_list_docamt + ls_inv_list-kwert_rl.

CALL BADI gv_extn_ext_badi->update_signature_info


EXPORTING
iv_module = p_mdule
iv_land1 = gv_bukrs_land
iv_bukrs = p_bukrs
iv_gjahr = wa_inv_hd-inv_year
iv_read_delvry = 'X'
CHANGING
cv_inv_no = lv_invlist_temp
ct_inv_invlist_link = lt_inv_list
ct_sdinv_i = it_inv_lnes
ct_doc_data = it_vbrp. "21_f01

ENDIF.
ENDLOOP.
ENDIF.

CLEAR wa_inv_lnes.
CLEAR wa_vbrp.

IF ls_bcv-tax_line_mat_ind = 'X'.
wa_vbrp-knumv = wa_inv_vbrk-knumv.
PERFORM tax_like_material using wa_vbrp
abap_false
'00000'. "46_F
ENDIF.

CLEAR it_vbrp[].
CLEAR it_so_data[].
CLEAR wa_so_data.
ELSE.
DELETE it_inv_vbrk WHERE vbeln = wa_inv_vbrk-vbeln.
IF wa_inv_vbrk-vbtyp = 'U'. "note 2285540
gv_invoice_no_wd = gv_invoice_no_wd - 1. "note 2285540
ELSE.
gv_invoice_no = gv_invoice_no - 1.
ENDIF.
lv_record_deleted = 'X'." 24_F
* CLEAR : wa_inv_lnes.
ENDIF.

IF lv_record_deleted IS INITIAL. "24_F


IF lv_disc_tax_in is NOT INITIAL . " 21_f
wa_inv_vbrk-mwsbk = wa_inv_vbrk-mwsbk - abs( Lv_disc_tax_in ) .
ENDIF.
MODIFY it_inv_vbrk FROM wa_inv_vbrk TRANSPORTING mwsbk.
ENDIF.

CLEAR : lv_record_deleted. " 24_F


CLEAR : lv_disc_tax_in. " 24_F
CLEAR : wa_inv_vbrk.
CLEAR : it_so_data[]. " 17_f
CLEAR : it_so_data. "17_f
CLEAR : it_inv_pay_mech[]. " 17_f
CLEAR : wa_inv_pay_mech. " 17_f
ENDIF. "33_F
ENDLOOP.
* CLEAR it_inv_vbrk[].
SORT it_inv_lnes BY bukrs invoice_no posnr.
ENDFORM. " GET_LINE_ITEM_INFO
*&---------------------------------------------------------------------*
*& Form GET_MATERIAL_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_material_info .
DATA : lv_sylangu TYPE sy-langu.
data: lv_prodcode type FIEU_MATNR_SB.
SORT it_material BY matnr maktx ASCENDING .

**note 2299395
UNASSIGN <fs_sdinv_matnr>.
READ TABLE gt_sdinv_matnr ASSIGNING <fs_sdinv_matnr>
WITH KEY invoice_no = wa_vbrp-vbeln
productcode = wa_vbrp-matnr.
IF <fs_sdinv_matnr> IS ASSIGNED.
wa_inv_lnes-productcode = <fs_sdinv_matnr>-productcode.
wa_inv_lnes-productid = <fs_sdinv_matnr>-productid.
wa_inv_lnes-productdesc = <fs_sdinv_matnr>-productdesc.
ELSE.

if wa_vbrp-matnr is INITIAL. "49_F begin


CALL METHOD CLFIEU_GENERIC_SAFT=>GET_PRODUCT_CODE
EXPORTING
IV_GJAHR = wa_inv_vbrk-gjahr
IV_VBELN = wa_vbrp-vbeln
IV_POSNR = wa_vbrp-posnr
iv_bukrs = wa_inv_vbrk-bukrs
IV_ORIG = space
IMPORTING
EV_PRODUCTCODE = lv_prodcode
EV_PRODUCTDESC = wa_inv_lnes-productdesc
.
wa_inv_lnes-productcode = lv_prodcode.
IF wa_inv_lnes-productcode is not INITIAL.
MOVE wa_inv_lnes-productdesc TO wa_material-maktx .
APPEND wa_material TO it_material.
CLEAR wa_material.
CLEAR it_material[].
ELSE.
gv_appln_msg-msgty = 'W'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '051'.
gv_appln_msg-msgv1 = wa_vbrp-matnr.
gv_appln_msg-msgv2 = wa_vbrp-vbeln.
CONDENSE: gv_appln_msg-msgv1, gv_appln_msg-msgv2 NO-GAPS.

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

CLEAR : gv_appln_msg.

ENDIF.
else. "49_f end

*Product Code
MOVE wa_vbrp-matnr TO wa_inv_lnes-productcode.

* Product Description
READ TABLE it_material INTO wa_material
WITH KEY matnr = wa_vbrp-matnr
BINARY SEARCH.

IF sy-subrc = 0.
MOVE wa_material-maktx TO wa_inv_lnes-productdesc.
ELSE.
lv_sylangu = sy-langu.
* --> Begin of 68_F
* CLEAR : it_material_tmp[].
* CLEAR : wa_material_tmp.
* SELECT matnr
* maktx
* spras
* FROM makt
* INTO CORRESPONDING FIELDS OF TABLE it_material_tmp
* WHERE matnr = wa_vbrp-matnr
* AND spras IN ('EN','DE', gv_langs, lv_sylangu).
*
* SORT it_material_tmp BY matnr spras ASCENDING.
* Pref 1: Fill with description in extraction language , if available
* IF sy-subrc = 0.
IF NOT it_material_tmp[] IS INITIAL.
* <-- End of 68_F
READ TABLE it_material_tmp INTO wa_material_tmp
WITH KEY matnr = wa_vbrp-matnr
spras = gv_langs
BINARY SEARCH.
IF sy-subrc = 0.
MOVE wa_material_tmp-maktx TO wa_inv_lnes-productdesc.
MOVE wa_material_tmp-maktx TO wa_material-maktx .
APPEND wa_material TO it_material.
CLEAR wa_material.
CLEAR it_material[].
ELSE.

* Pref 2: Fill with description in EN , if available


READ TABLE it_material_tmp INTO wa_material_tmp
WITH KEY matnr = wa_vbrp-matnr
spras = 'EN' BINARY SEARCH.
IF sy-subrc = 0.
MOVE wa_material_tmp-maktx TO wa_inv_lnes-productdesc.
MOVE wa_material_tmp-maktx TO wa_material-maktx .
APPEND wa_material TO it_material.
CLEAR wa_material.
CLEAR it_material[].
ELSE.

*Pref 3: Fill with description in DE , if available


READ TABLE it_material_tmp
INTO wa_material_tmp
WITH KEY matnr = wa_vbrp-matnr
spras = 'DE' BINARY SEARCH.
IF sy-subrc = 0.
MOVE wa_material_tmp-maktx TO wa_inv_lnes-productdesc.
MOVE wa_material_tmp-maktx TO wa_material-maktx .
APPEND wa_material TO it_material.
CLEAR wa_material.
CLEAR it_material[].
ELSE.

*Pref 4: Fill with description in Logon language if not in extraction


language,'EN', 'DE' , if available
IF lv_sylangu <> gv_langs OR "39_F
lv_sylangu <> 'EN' OR
lv_sylangu <> 'DE'.

READ TABLE it_material_tmp


INTO wa_material_tmp
WITH KEY matnr = wa_vbrp-matnr
spras = lv_sylangu BINARY SEARCH.
IF sy-subrc = 0.
MOVE wa_material_tmp-maktx TO wa_inv_lnes-productdesc.
MOVE wa_material_tmp-maktx TO wa_material-maktx .
APPEND wa_material TO it_material.
CLEAR wa_material.
CLEAR it_material[].
ELSE.
gv_appln_msg-msgty = 'W'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '051'.
gv_appln_msg-msgv1 = wa_vbrp-matnr.
gv_appln_msg-msgv2 = wa_vbrp-vbeln.
CONDENSE: gv_appln_msg-msgv1, gv_appln_msg-msgv2 NO-GAPS.
"46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

CLEAR : gv_appln_msg.

ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
endif.
ENDIF.
**note 2299395
ENDFORM. " GET_MATERIAL_INFO
*&---------------------------------------------------------------------*
*& Form GET_TAX_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_tax_info .
DATA : lv_land TYPE string.
DATA : lv_badi_updt_sd_inv TYPE REF TO fieusaft_update_sdinvoices.
* DATA : lt_konv TYPE TABLE OF konv. "75_F
DATA : lt_konv TYPE TABLE OF gty_cond. "75_F
DATA : lt_konv_temp LIKE lt_konv.
FIELD-SYMBOLS <fs_konv> LIKE LINE OF lt_konv.
DATA : lv_lines_konv TYPE i.
DATA : lv_lines_konv_temp TYPE i.
DATA: lt_konv_sum TYPE TABLE OF gty_cond. "83_F
DATA: ls_konv_sum TYPE gty_cond. "83_F

lv_land = gv_bukrs_land.

GET BADI lv_badi_updt_sd_inv


FILTERS
land1 = lv_land.

CLEAR wa_tax_data.
CLEAR wa_inv_cond_rec.
READ TABLE it_inv_vbrk INTO wa_inv_vbrk WITH KEY vbeln = wa_vbrp-vbeln.
CHECK sy-subrc = 0.

PERFORM read_condition "TABLES lt_konv "75_F


using wa_inv_vbrk-knumv
wa_vbrp-posnr. "55_F

APPEND LINES OF gt_cond TO lt_konv. "75_F

loop at IT_TAX_MATERIAL into wa_tax_material. "38_F


delete lt_konv where kschl = wa_tax_material-taxlikemat. "38_F
ENDLOOP. "38_F

* --> Begin of 83_F


* -- Collect the lines by MWSK1
LOOP AT lt_konv INTO ls_konv_sum.
CLEAR ls_konv_sum-kschl.
COLLECT ls_konv_sum INTO lt_konv_sum.
CLEAR ls_konv_sum.
ENDLOOP.

REFRESH lt_konv.
SORT lt_konv_sum DESCENDING BY mwsk1.
APPEND LINES OF lt_konv_sum TO lt_konv.
* <-- End of 83_F

DESCRIBE TABLE lt_konv LINES lv_lines_konv.

IF lv_lines_konv EQ '1'. "Case 1 - Single tax for item


READ TABLE lt_konv ASSIGNING <fs_konv> INDEX 1.
IF sy-subrc EQ '0'.
wa_inv_cond_rec-mwsk1 = <fs_konv>-mwsk1.
ENDIF.
ELSEIF lv_lines_konv GT '1'. "Case 2 - More than one Line
lt_konv_temp = lt_konv.
DELETE lt_konv_temp WHERE kwert IS INITIAL.
DESCRIBE TABLE lt_konv_temp LINES lv_lines_konv_temp.
IF lv_lines_konv_temp EQ '0'. "Case 2.1 - multiple exemptions
READ TABLE lt_konv ASSIGNING <fs_konv> INDEX 1. "choose first
IF sy-subrc EQ '0'.
wa_inv_cond_rec-mwsk1 = <fs_konv>-mwsk1.
ENDIF.
ELSE. "Case 2.2 - at least one tax
READ TABLE lt_konv_temp ASSIGNING <fs_konv> INDEX 1."Assumption, no multiple
tax for one line.
IF sy-subrc EQ '0'.
wa_inv_cond_rec-mwsk1 = <fs_konv>-mwsk1.
ENDIF.
ENDIF.
ELSEIF wa_vbrp-mwskz IS NOT INITIAL." Case 3 - No tax line with vbrp filled
"(THIS IS FILLED WHEN THE INVOICE LIST DATA
IS PROCESSED)
MOVE wa_vbrp-mwskz TO wa_inv_cond_rec-mwsk1.
ELSE. " Case 4 - No tax line, nor vbrp filled
IF wa_inv_lnes-taxcode IS INITIAL. " Set If no tax code is found on KONV
MOVE 'NS' TO wa_inv_lnes-taxcode.
"MOVE '0.00' TO wa_inv_lnes-taxamount. Commented 89_F
MOVE '0.00' TO wa_inv_lnes-taxpercent.
ENDIF.
gv_appln_msg-msgty = 'W'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '052'.
gv_appln_msg-msgv2 = wa_vbrp-posnr.
gv_appln_msg-msgv1 = wa_vbrp-vbeln.
CONDENSE: gv_appln_msg-msgv1, gv_appln_msg-msgv2 NO-GAPS. "46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.
ENDIF.

IF wa_inv_cond_rec-mwsk1 IS NOT INITIAL. "If tax code determined execute


calculations
PERFORM map_tax_info_inv_lines USING wa_inv_cond_rec-mwsk1.
ENDIF.

CLEAR : gv_appln_msg.

* CALL BADI lv_badi_updt_sd_inv->populate_tax_info_ext_taxengn


* EXPORTING
* iv_land1 = gv_bukrs_land
* iv_bukrs = p_bukrs
* iv_vbeln = wa_vbrp-vbeln
* iv_fkdat = wa_inv_vbrk-fkdat
* iv_posnr = wa_vbrp-posnr
* CHANGING
* ev_taxcode = wa_inv_lnes-taxcode
* ev_taxamount = wa_inv_lnes-taxamount
* ev_taxpercent = wa_inv_lnes-taxpercent
* EXCEPTIONS
* OTHERS = 1.
* IF sy-subrc <> 0.
** Implement suitable error handling here
* ENDIF.

ENDFORM. " GET_TAX_INFO


*&---------------------------------------------------------------------*
*& Form FILL_INV_LNE_AMOUNTS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM fill_inv_lne_amounts .

DATA : lv_inv_line_amt TYPE fieu_dec_amount. "21_F


DATA : lv_unitprice TYPE fieu_dec_amount. "21_F
DATA: lv_tax_code TYPE mwskz. "42_F
DATA: lv_no_summary_update TYPE xfeld. "42_F
DATA: lv_vbtyp_or TYPE vbrk-vbtyp. "91_F
DATA: ls_inv_vbrk_list LIKE LINE OF it_inv_vbrk. "91_F

CLEAR : wa_inv_vbrk-kursf.
MOVE wa_inv_vbrk-kurrf TO wa_inv_vbrk-kursf.
PERFORM set_invoice_status."6_f
CLEAR: wa_inv_lnes-curr_credit_amt, wa_inv_lnes-currr_debit_amt,
wa_inv_lnes-debit_amt_ext,wa_inv_lnes-credit_amt_ext.

"42_F - Begin
IF gv_bukrs_land = 'PT'.
lv_tax_code = wa_inv_lnes-taxcode.
IF gv_usr_exit_badi IS NOT INITIAL.
CALL BADI gv_usr_exit_badi->get_non_reveune_based_tax_code
EXPORTING
iv_vbeln = wa_vbrp-vbeln
iv_posnr = wa_vbrp-posnr
CHANGING
cv_tax_code = lv_tax_code.
ENDIF.

lv_no_summary_update =
clfieu_generic_saft=>eval_tax_base_non_revenue( lv_tax_code ).
ENDIF.
"42_F - End
* --> Begin of 91_F
* CASE wa_inv_vbrk-vbtyp_or. "49_f wa_inv_vbrk-vbtyp.

* -- Check if it's Invoice Lists scenario


IF wa_inv_vbrk-vbtyp_or EQ '3' OR
wa_inv_vbrk-vbtyp_or EQ '4'.

* -- In affirmative case, it should be checked the VBTYP of the item/document


* (instead the VBTYP of the own Invoice List)
READ TABLE it_inv_vbrk INTO ls_inv_vbrk_list WITH KEY vbeln = wa_vbrp-vbeln_vf
TRANSPORTING vbtyp.

IF sy-subrc EQ 0 AND
ls_inv_vbrk_list-vbtyp IS NOT INITIAL.
lv_vbtyp_or = ls_inv_vbrk_list-vbtyp.
ELSE.
lv_vbtyp_or = wa_inv_vbrk-vbtyp_or.
ENDIF.

ELSE.
lv_vbtyp_or = wa_inv_vbrk-vbtyp_or.
ENDIF.

CASE lv_vbtyp_or.
* <-- End of 91_F
WHEN 'N' OR 'O' OR 'L' OR 'T' OR 'H' OR '6' OR '4'. "69_F Added Credit Memo
List
IF wa_inv_vbrk-waerk = gv_t001_waers."4_F
IF wa_vbrp-netwr LT 0.
MOVE wa_vbrp-netwr TO wa_inv_lnes-credit_amt_ext. "21_F
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-debit_amt_ext. "21_F
ENDIF.
MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-currency.
MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-document_waers.

"21_F
CLEAR lv_inv_line_amt.
lv_inv_line_amt = wa_vbrp-netwr.
ELSE.
CLEAR lv_inv_line_amt.
IF wa_vbrp-netwr GE 0.
lv_inv_line_amt = wa_vbrp-netwr.
MOVE wa_vbrp-netwr TO wa_inv_lnes-currr_debit_amt.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = wa_inv_vbrk-fkdat
foreign_amount = lv_inv_line_amt "21_F
foreign_currency = wa_inv_vbrk-waerk
local_currency = gv_t001_waers
rate = wa_inv_vbrk-kursf
type_of_rate = 'M'
read_tcurr = ' '
IMPORTING
local_amount = wa_inv_lnes-debit_amt_ext. "21_F
ELSE.
lv_inv_line_amt = wa_vbrp-netwr.
MOVE wa_vbrp-netwr TO wa_inv_lnes-curr_credit_amt.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = wa_inv_vbrk-fkdat
foreign_amount = lv_inv_line_amt "21_F
foreign_currency = wa_inv_vbrk-waerk
local_currency = gv_t001_waers
rate = wa_inv_vbrk-kursf
type_of_rate = 'M'
read_tcurr = ' '
IMPORTING
local_amount = wa_inv_lnes-credit_amt_ext. "21_F
ENDIF.

wa_inv_lnes-exchangerate = wa_inv_vbrk-kursf.
wa_inv_lnes-currency = wa_inv_vbrk-waerk.
wa_inv_lnes-document_waers = gv_t001_waers.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amt_ext TO lv_inv_line_amt. "21_F

ENDIF.

CALL METHOD clfieu_generic_saft=>convert_7to2_decimals


EXPORTING
iv_land = gv_bukrs_land
CHANGING
cv_amount = wa_inv_lnes-credit_amt_ext.

CALL METHOD clfieu_generic_saft=>convert_7to2_decimals


EXPORTING
iv_land = gv_bukrs_land
CHANGING
cv_amount = wa_inv_lnes-debit_amt_ext.

"21_F
IF wa_vbrp-fkimg GT 0.
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL.
lv_unitprice = wa_inv_lnes-credit_amt_ext / wa_vbrp-fkimg .
ELSE.
lv_unitprice = wa_inv_lnes-debit_amt_ext / wa_vbrp-fkimg .
ENDIF.
lv_unitprice = ABS( lv_unitprice ).
MOVE lv_unitprice TO wa_inv_lnes-unitprice_ext.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-unitprice_ext.
wa_inv_lnes-unitprice_ext = ABS( wa_inv_lnes-unitprice_ext ).
ENDIF.

IF gv_usr_exit_impl GT 0.

CALL BADI gv_usr_exit_badi->set_amounts_credit_debit


EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_inv_date = wa_inv_vbrk-fkdat
iv_inv_pos = wa_vbrp-posnr
iv_inv_amt = lv_inv_line_amt "21_F
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amt_ext "21_F
cv_inv_credit_amt = wa_inv_lnes-credit_amt_ext "21_F
cv_curr_debti_amt = wa_inv_lnes-currr_debit_amt "21_F
cv_curr_credit_amt = wa_inv_lnes-curr_credit_amt "21_F
cv_unit_price = wa_inv_lnes-unitprice_ext. "21_F
ENDIF.
*User exit invocation ends

IF lv_no_summary_update = abap_false. "42_F


"21_F
IF wa_inv_hd-inv_status <> 'A' AND wa_inv_hd-inv_status <> 'F'
AND gv_bukrs_land NE 'LU'. "44_F
CASE wa_inv_vbrk-vbtyp. "51_F
WHEN 'U'.
IF NOT wa_inv_lnes-debit_amt_ext IS INITIAL.
gv_total_debit_wd = gv_total_debit_wd + ABS( wa_inv_lnes-
debit_amt_ext ).
ELSEIF NOT wa_inv_lnes-credit_amt_ext IS INITIAL.
gv_total_credit_wd = gv_total_credit_wd + ABS( wa_inv_lnes-
credit_amt_ext ).
ENDIF.
WHEN OTHERS.
IF NOT wa_inv_lnes-debit_amt_ext IS INITIAL.
gv_total_debit_sd = gv_total_debit_sd + ABS( wa_inv_lnes-
debit_amt_ext )."23_F
ELSEIF NOT wa_inv_lnes-credit_amt_ext IS INITIAL.
gv_total_credit_sd = gv_total_credit_sd + ABS( wa_inv_lnes-
credit_amt_ext )."23_F
ENDIF.
ENDCASE.
********30_F begin
ELSEIF gv_bukrs_land = 'LU'.
**********43_F begin
IF NOT wa_inv_lnes-debit_amt_ext IS INITIAL.
IF wa_inv_lnes-debit_amt_ext LT '0'.
"sums a credit in totals
gv_total_credit_sd = gv_total_credit_sd +
+ ABS( wa_inv_lnes-debit_amt_ext ).
ELSE.
"sums a debit in totals
gv_total_debit_sd = gv_total_debit_sd +
+ ABS( wa_inv_lnes-debit_amt_ext ).
ENDIF.

ELSEIF NOT wa_inv_lnes-credit_amt_ext IS INITIAL.


IF wa_inv_lnes-credit_amt_ext LT '0'.
"sums a debit in totals
gv_total_debit_sd = gv_total_debit_sd
+ ABS( wa_inv_lnes-credit_amt_ext ).
ELSE.
"sums a credit in totals
gv_total_credit_sd = gv_total_credit_sd
+ ABS( wa_inv_lnes-credit_amt_ext ).
ENDIF.
ENDIF.
**********43_F end
********30_F end
ENDIF.
ENDIF. "42_F
WHEN 'S'.
CLEAR : lv_inv_line_amt.
IF wa_inv_vbrk-waerk = gv_t001_waers."4_F
MOVE wa_vbrp-netwr TO wa_inv_lnes-credit_amt_ext. "21_F

MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-currency.


MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-document_waers.
CLEAR lv_inv_line_amt.
MOVE wa_inv_lnes-credit_amt_ext TO lv_inv_line_amt.
ELSE.
CLEAR lv_inv_line_amt.
lv_inv_line_amt = wa_vbrp-netwr.
MOVE wa_vbrp-netwr TO wa_inv_lnes-curr_credit_amt.

CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'


EXPORTING
date = wa_inv_vbrk-fkdat
foreign_amount = lv_inv_line_amt
foreign_currency = wa_inv_vbrk-waerk
local_currency = gv_t001_waers
rate = wa_inv_vbrk-kursf
type_of_rate = 'M'
read_tcurr = ' '
IMPORTING
local_amount = wa_inv_lnes-curr_credit_amt.

wa_inv_lnes-exchangerate = wa_inv_vbrk-kursf.
wa_inv_lnes-currency = wa_inv_vbrk-waerk.
wa_inv_lnes-document_waers = gv_t001_waers.
CLEAR lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amt_ext TO lv_inv_line_amt.
ENDIF.

"21_F
IF wa_vbrp-fkimg GT 0.
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL.
lv_unitprice = wa_inv_lnes-credit_amt_ext / wa_vbrp-fkimg .
ELSE.
lv_unitprice = wa_inv_lnes-debit_amt_ext / wa_vbrp-fkimg .
ENDIF.
lv_unitprice = ABS( lv_unitprice ).
MOVE lv_unitprice TO wa_inv_lnes-unitprice_ext.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-unitprice_ext.
wa_inv_lnes-unitprice_ext = ABS( wa_inv_lnes-unitprice_ext ).
ENDIF.

IF gv_usr_exit_impl GT 0.
CALL BADI gv_usr_exit_badi->set_amounts_credit_debit
EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_inv_date = wa_inv_vbrk-fkdat
iv_inv_pos = wa_vbrp-posnr
iv_inv_amt = lv_inv_line_amt "21_F
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING "21_F
cv_inv_debit_amt = wa_inv_lnes-debit_amt_ext
cv_inv_credit_amt = wa_inv_lnes-credit_amt_ext
cv_curr_debti_amt = wa_inv_lnes-currr_debit_amt
cv_curr_credit_amt = wa_inv_lnes-curr_credit_amt
cv_unit_price = wa_inv_lnes-unitprice_ext.
ENDIF.
*User exit invocation ends

IF lv_no_summary_update = abap_false. "42_F

IF wa_inv_hd-inv_status <> 'A' AND wa_inv_hd-inv_status <> 'F'


AND gv_bukrs_land NE 'LU'. "44_F
CASE wa_inv_vbrk-vbtyp. "51_F
WHEN 'U'. "51_F
gv_total_credit_wd = gv_total_credit_wd + ABS( wa_inv_lnes-
credit_amt_ext ). "23_F
WHEN OTHERS.
gv_total_credit_sd = gv_total_credit_sd + ABS( wa_inv_lnes-
credit_amt_ext ). "23_F
ENDCASE.
ELSEIF gv_bukrs_land = 'LU'. "30_F
"43_F begin
IF wa_inv_lnes-credit_amt_ext LT '0'.
gv_total_debit_sd = gv_total_debit_sd + ABS( wa_inv_lnes-credit_amt_ext
).
ELSE.
gv_total_credit_sd = gv_total_credit_sd + ABS( wa_inv_lnes-
credit_amt_ext ). "30_F
ENDIF.
"43_F end
ENDIF.
ENDIF. "42_F
WHEN 'U'.

* in case of document being in non EURO currency

IF wa_inv_vbrk-waerk <> gv_t001_waers." 4_F

IF wa_vbrp-netwr LT 0.
MOVE wa_vbrp-netwr TO wa_inv_lnes-currr_debit_amt.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-curr_credit_amt.
ENDIF.

CLEAR lv_inv_line_amt.
lv_inv_line_amt = wa_vbrp-netwr.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = wa_inv_vbrk-fkdat
foreign_amount = lv_inv_line_amt
foreign_currency = wa_inv_vbrk-waerk
local_currency = gv_t001_waers
rate = wa_inv_vbrk-kursf
type_of_rate = 'M'
read_tcurr = ' '
IMPORTING
local_amount = lv_inv_line_amt.

wa_inv_lnes-exchangerate = wa_inv_vbrk-kursf.
wa_inv_lnes-currency = wa_inv_vbrk-waerk.
wa_inv_lnes-document_waers = gv_t001_waers.
* map amounts as per the requirement
IF lv_inv_line_amt LT 0. "21_F
MOVE lv_inv_line_amt TO wa_inv_lnes-debit_amt_ext. "21_F

ELSE.
MOVE lv_inv_line_amt TO wa_inv_lnes-credit_amt_ext. "21_F

ENDIF.
ELSE.
MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-currency.
MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-document_waers.
IF wa_vbrp-netwr LT 0.
MOVE wa_vbrp-netwr TO wa_inv_lnes-debit_amt_ext. "21_F

ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-credit_amt_ext. "21_F
ENDIF.
ENDIF.
CALL METHOD clfieu_generic_saft=>convert_7to2_decimals
EXPORTING
iv_land = gv_bukrs_land
CHANGING
cv_amount = wa_inv_lnes-debit_amt_ext.
CALL METHOD clfieu_generic_saft=>convert_7to2_decimals
EXPORTING
iv_land = gv_bukrs_land
CHANGING
cv_amount = wa_inv_lnes-credit_amt_ext.

"21_F
IF wa_vbrp-fkimg GT 0.
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL.
lv_unitprice = wa_inv_lnes-credit_amt_ext / wa_vbrp-fkimg .
ELSE.
lv_unitprice = wa_inv_lnes-debit_amt_ext / wa_vbrp-fkimg .
ENDIF.
lv_unitprice = ABS( lv_unitprice ).
MOVE lv_unitprice TO wa_inv_lnes-unitprice_ext.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-unitprice_ext.
wa_inv_lnes-unitprice_ext = ABS( wa_inv_lnes-unitprice_ext ).
ENDIF.

IF gv_usr_exit_impl GT 0.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amt_ext TO lv_inv_line_amt.

CALL BADI gv_usr_exit_badi->set_amounts_credit_debit "21_F


EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_inv_date = wa_inv_vbrk-fkdat
iv_inv_pos = wa_vbrp-posnr
iv_inv_amt = lv_inv_line_amt
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amt_ext
cv_inv_credit_amt = wa_inv_lnes-credit_amt_ext
cv_curr_debti_amt = wa_inv_lnes-currr_debit_amt
cv_curr_credit_amt = wa_inv_lnes-curr_credit_amt
cv_unit_price = wa_inv_lnes-unitprice_ext.
ENDIF.
*User exit invocation ends

"21_F
IF wa_inv_hd-inv_status <> 'A'.
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL OR wa_inv_lnes-credit_amt_ext
<> '0.00'.
wa_inv_lnes-credit_amt_ext = ABS( wa_inv_lnes-credit_amt_ext ).
gv_total_credit_wd = gv_total_credit_wd + wa_inv_lnes-credit_amt_ext.
ELSEIF wa_inv_lnes-debit_amt_ext IS NOT INITIAL OR wa_inv_lnes-
debit_amt_ext <> '0.00'.
wa_inv_lnes-debit_amt_ext = ABS( wa_inv_lnes-debit_amt_ext ).
gv_total_debit_wd = gv_total_debit_wd + wa_inv_lnes-debit_amt_ext.
ENDIF.
ENDIF.

"42_F - Begin
IF lv_no_summary_update = abap_true.
gv_total_credit_sd = gv_total_credit_sd - wa_inv_lnes-credit_amt_ext.
gv_total_debit_sd = gv_total_debit_sd - wa_inv_lnes-debit_amt_ext.
ENDIF.
"42_F - End

WHEN OTHERS.

* in case of document being in non EURO currency

IF wa_inv_vbrk-waerk <> gv_t001_waers." 4_F

IF wa_vbrp-netwr LT 0.
MOVE wa_vbrp-netwr TO wa_inv_lnes-currr_debit_amt.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-curr_credit_amt.
ENDIF.

CLEAR lv_inv_line_amt.
lv_inv_line_amt = wa_vbrp-netwr.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = wa_inv_vbrk-fkdat
foreign_amount = lv_inv_line_amt
foreign_currency = wa_inv_vbrk-waerk
local_currency = gv_t001_waers
rate = wa_inv_vbrk-kursf
type_of_rate = 'M'
read_tcurr = ' '
IMPORTING
local_amount = lv_inv_line_amt.

wa_inv_lnes-exchangerate = wa_inv_vbrk-kursf.
wa_inv_lnes-currency = wa_inv_vbrk-waerk.
wa_inv_lnes-document_waers = gv_t001_waers.
* map amounts as per the requirement
IF lv_inv_line_amt LT 0. "21_F
MOVE lv_inv_line_amt TO wa_inv_lnes-debit_amt_ext. "21_F
ELSE.
MOVE lv_inv_line_amt TO wa_inv_lnes-credit_amt_ext. "21_F
ENDIF.
ELSE.
IF wa_vbrp-netwr LT 0.
MOVE wa_vbrp-netwr TO wa_inv_lnes-debit_amt_ext. "21_F
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-credit_amt_ext. "21_F
ENDIF.
MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-currency.
MOVE wa_inv_vbrk-waerk TO wa_inv_lnes-document_waers.
ENDIF.

CALL METHOD clfieu_generic_saft=>convert_7to2_decimals


EXPORTING
iv_land = gv_bukrs_land
CHANGING
cv_amount = wa_inv_lnes-debit_amt_ext.

CALL METHOD clfieu_generic_saft=>convert_7to2_decimals


EXPORTING
iv_land = gv_bukrs_land
CHANGING
cv_amount = wa_inv_lnes-credit_amt_ext.

"21_F
IF wa_vbrp-fkimg GT 0.
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL.
lv_unitprice = wa_inv_lnes-credit_amt_ext / wa_vbrp-fkimg .
ELSE.
lv_unitprice = wa_inv_lnes-debit_amt_ext / wa_vbrp-fkimg .
ENDIF.
lv_unitprice = ABS( lv_unitprice ).
MOVE lv_unitprice TO wa_inv_lnes-unitprice_ext.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-unitprice_ext.
wa_inv_lnes-unitprice_ext = ABS( wa_inv_lnes-unitprice_ext ).
ENDIF.

IF gv_usr_exit_impl GT 0.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amt_ext TO lv_inv_line_amt.

CALL BADI gv_usr_exit_badi->set_amounts_credit_debit "21_F


EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_inv_date = wa_inv_vbrk-fkdat
iv_inv_pos = wa_vbrp-posnr
iv_inv_amt = lv_inv_line_amt
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amt_ext
cv_inv_credit_amt = wa_inv_lnes-credit_amt_ext
cv_curr_debti_amt = wa_inv_lnes-currr_debit_amt
cv_curr_credit_amt = wa_inv_lnes-curr_credit_amt
cv_unit_price = wa_inv_lnes-unitprice_ext.
ENDIF.
*User exit invocation ends

"21_F
IF wa_inv_hd-inv_status <> 'A' AND wa_inv_hd-inv_status <> 'F'
AND gv_bukrs_land NE 'LU'. "44_F
CASE wa_inv_vbrk-vbtyp. "51_F
WHEN 'U'. "51_F
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL OR wa_inv_lnes-
credit_amt_ext <> '0.00'.
wa_inv_lnes-credit_amt_ext = ABS( wa_inv_lnes-credit_amt_ext ).
gv_total_credit_wd = gv_total_credit_wd + wa_inv_lnes-credit_amt_ext.
ELSEIF wa_inv_lnes-debit_amt_ext IS NOT INITIAL OR wa_inv_lnes-
debit_amt_ext <> '0.00'.
wa_inv_lnes-debit_amt_ext = ABS( wa_inv_lnes-debit_amt_ext ).
gv_total_debit_wd = gv_total_debit_wd + wa_inv_lnes-debit_amt_ext.
ENDIF.
"42_F - Begin
IF lv_no_summary_update = abap_true.
gv_total_credit_wd = gv_total_credit_wd - wa_inv_lnes-credit_amt_ext.
gv_total_debit_wd = gv_total_debit_wd - wa_inv_lnes-debit_amt_ext.
ENDIF.
"42_F - End

WHEN OTHERS.
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL OR wa_inv_lnes-
credit_amt_ext <> '0.00'.
wa_inv_lnes-credit_amt_ext = ABS( wa_inv_lnes-credit_amt_ext ).
gv_total_credit_sd = gv_total_credit_sd + wa_inv_lnes-credit_amt_ext.
ELSEIF wa_inv_lnes-debit_amt_ext IS NOT INITIAL OR wa_inv_lnes-
debit_amt_ext <> '0.00'.
wa_inv_lnes-debit_amt_ext = ABS( wa_inv_lnes-debit_amt_ext ).
gv_total_debit_sd = gv_total_debit_sd + wa_inv_lnes-debit_amt_ext.
ENDIF.
"42_F - Begin
IF lv_no_summary_update = abap_true.
gv_total_credit_sd = gv_total_credit_sd - wa_inv_lnes-credit_amt_ext.
gv_total_debit_sd = gv_total_debit_sd - wa_inv_lnes-debit_amt_ext.
ENDIF.
"42_F - End
ENDCASE.
********30_F begin
ELSEIF gv_bukrs_land = 'LU'.
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL OR wa_inv_lnes-credit_amt_ext
<> '0.00'.
wa_inv_lnes-credit_amt_ext = ABS( wa_inv_lnes-credit_amt_ext ).
gv_total_credit_sd = gv_total_credit_sd + wa_inv_lnes-credit_amt_ext.
ELSEIF wa_inv_lnes-debit_amt_ext IS NOT INITIAL OR wa_inv_lnes-
debit_amt_ext <> '0.00'.
wa_inv_lnes-debit_amt_ext = ABS( wa_inv_lnes-debit_amt_ext ).
gv_total_debit_sd = gv_total_debit_sd + wa_inv_lnes-debit_amt_ext.
ENDIF.
********30_F end
ENDIF.
ENDCASE.
ENDFORM. " FILL_INV_LNE_AMOUNTS
*&---------------------------------------------------------------------*
*& Form GET_SETTLEMENT_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_settlement_info .
DATA : lt_top_text TYPE TABLE OF vtopis.
DATA : wa_top_text LIKE LINE OF lt_top_text .
CLEAR : wa_inv_pay_mech.
DATA : ls_vbkd LIKE LINE OF gt_vbkd.

LOOP AT gt_vbkd INTO ls_vbkd.


wa_inv_pay_mech-vbeln = ls_vbkd-vbeln.
wa_inv_pay_mech-zterm = ls_vbkd-zterm.
APPEND wa_inv_pay_mech TO it_inv_pay_mech .
ENDLOOP.
READ TABLE it_inv_pay_mech INTO wa_inv_pay_mech
WITH KEY vbeln = wa_inv_hd-invoice_no.
* CALL FUNCTION 'SD_PRINT_TERMS_OF_PAYMENT'
* EXPORTING
* bldat = wa_vbrp-erdat
* budat = wa_inv_vbrk-fkdat
* cpudt = wa_vbrp-erdat
* terms_of_payment = wa_inv_vbrk-zterm
* TABLES
* top_text = lt_top_text
* EXCEPTIONS
* terms_of_payment_not_in_t052 = 1
* OTHERS = 2.
* IF sy-subrc <> 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
* ENDIF.
* SELECT SINGLE text1 FROM t052u INTO wa_inv_lnes-setlmnt_agrmnt
* WHERE spras = sy-langu
* AND zterm = wa_inv_vbrk-zterm.
* READ TABLE lt_top_text INTO wa_top_text INDEX 1.
* IF sy-subrc <> 0.
* MOVE wa_top_text-line TO wa_inv_lnes-paymentterm.
* ENDIF.
* IF wa_inv_lnes-paymentterm IS INITIAL.
* gv_appln_msg-msgty = 'W'. " Mandatory field missing
* gv_appln_msg-msgid = gc_message_class .
* gv_appln_msg-msgno = '054'.
* gv_appln_msg-msgv1 = wa_inv_vbrk-zterm.
*
* CALL METHOD cl_generic_obj->gen_appl_log
* EXPORTING
* iv_appl_msg = gv_appln_msg
* iv_land = gv_bukrs_land
* iv_display = '-'
* iv_handle = gv_appln_handle.
*
* CLEAR : gv_appln_msg.
*
* ENDIF.
ENDFORM. " GET_SETTLEMENT_INFO
*&---------------------------------------------------------------------*
*& Form ASSIGN_DATA_FOR_TBL_UPDATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM assign_data_for_tbl_update .
DATA : wa_inv_vbrk_cancel LIKE LINE OF it_inv_vbrk . " to identify the source
idea of the original doc if current inv is a cancellation document
DATA : ls_cancel_source_id LIKE vbrk-ernam.
DATA : wa_inv_vbrk_tmp LIKE LINE OF it_inv_vbrk.
DATA : ls_inv_ctime TYPE vbrk-erzet.
DATA : ls_inv_cdate TYPE vbrk-erdat .
DATA : ls_inv_cname TYPE vbrk-ernam .
DATA : lv_del_mvesdate TYPE likp-lfdat.
DATA :
lv_del_mvestme TYPE likp-lfuhr .
DATA :
lv_del_mveedate TYPE likp-wadat.
DATA :
lv_del_mvedtime TYPE likp-wauhr.
DATA :
lv_stceg TYPE kna1-stceg.
DATA :
lv_stceg_old TYPE kna1-stceg. "50_F
DATA :
lv_stcd1 TYPE kna1-stcd1.
DATA :
lv_xcpdk TYPE kna1-xcpdk.
DATA :
ls_invstatdate TYPE fieud_sdinv_h-inv_status_date.
DATA :
lv_vbeln TYPE vbrk-vbeln.
DATA :
lv_likp_erdat TYPE likp-erdat.
DATA :
wa_zterm_selection TYPE t052,
lt_zterm_texts LIKE TABLE OF ttext.
DATA : lv_doc_date TYPE d.
DATA : lv_zterm TYPE dzterm.
DATA : lv_ttext TYPE ttext.
DATA : lv_sy_lang TYPE spras.
DATA : lv_poper TYPE poper. "23_F/NLL
DATA : lv_glflex_active TYPE boole_d. "25_F
DATA : lcl_message TYPE REF TO cx_static_check. "25_F
DATA: lv_flagm.
data: lv_vbpa3.
**32_F begin
"BS: vbfa; S4: vbfas;
DATA: lt_vbfa TYPE TABLE OF vbfa.
DATA: ls_inv TYPE vbco6.
DATA: lv_vbtyp TYPE vbuk-vbtyp.
DATA: ls_vbfa LIKE LINE OF lt_vbfa.
FIELD-SYMBOLS: <fs_vbfa> LIKE LINE OF lt_vbfa.
**32_F end

**29_F
FIELD-SYMBOLS: <fs_inv_lnes> TYPE fieud_sdinv_i.
**29_F

DATA lv_vbeln_likp TYPE vbeln_vf. "37_F

DATA lv_cred_note_ref TYPE fieud_sdinv_i-cred_note_ref. "43_F - 1264


DATA: lv_eaccode type paval. "54_F
FIELD-SYMBOLS: <line1> TYPE fieud_sdinv_i. "89_F

**37_F begin
MOVE gv_bukrs_land TO gv_land_exit.
TRY .
GET BADI gv_badi_usr_ext_hdl
FILTERS
land1 = gv_land_exit.

CATCH cx_badi_not_implemented .

ENDTRY.
**37_F end
lv_eaccode = clfieu_generic_saft=>get_parameter_t001z( "54_F
iv_bukrs = p_bukrs
iv_party = 'PTMACD' ).
CLEAR: lv_vbeln.
LOOP AT it_inv_vbrk INTO wa_inv_vbrk.
****33_F begin
"lt_exception_docs_fi will only be filled for PT
"This change avoids processing of documents already
"with digital signature errors.
"can be qualified as a performance check
UNASSIGN <fs_exception_docs_sd>.
READ TABLE lt_exception_docs_sd
ASSIGNING <fs_exception_docs_sd>
WITH KEY fkart = wa_inv_vbrk-fkart.
IF <fs_exception_docs_sd> IS NOT ASSIGNED
OR gv_mess_type NE 'E'. "36_F
****33_F end
CLEAR gv_ext_sys_ind_sd. " 20_F " correction of variables not cleared
CLEAR wa_inv_hd. " 20_F " correction of variables not cleared
IF p_archvl = 'X'.
MOVE 'X' TO wa_inv_hd-inv_archive.
ENDIF.
MOVE sy-mandt TO wa_inv_hd-mandt.
MOVE wa_inv_vbrk-bukrs TO wa_inv_hd-bukrs.
MOVE wa_inv_vbrk-fkdat TO wa_inv_hd-inv_date .
MOVE wa_inv_vbrk-vbeln TO wa_inv_hd-invoice_no.
MOVE wa_inv_vbrk-vkbur TO wa_inv_hd-sales_office. "20_f
MOVE wa_inv_vbrk-transid TO wa_inv_hd-transactionid." SEPARATED BY ''.

wa_inv_hd-sb_belnr = wa_inv_vbrk-belnr. "41_F - Selfbilling requires the


accounting doc
IF lv_eaccode IS NOT INITIAL. "54_F
wa_inv_hd-eaccode = lv_eaccode. "56_F
ENDIF.
*---------------------------------*User Exit
invocation*----------------------------*
* Update transaction id for rebate documents
IF gv_usr_exit_impl GT 0.
CALL BADI gv_usr_exit_badi->update_transid_rebate
EXPORTING
iv_bukrs = wa_inv_hd-bukrs
iv_land = gv_bukrs_land
iv_vbeln = wa_inv_vbrk-vbeln
iv_vbtyp = wa_inv_vbrk-vbtyp
iv_fkdat = wa_inv_vbrk-fkdat
CHANGING
cs_transaid = wa_inv_hd-transactionid.
ENDIF.

*******note 2393681
* CLEAR gv_ext_sys_ind_sd.
* IF ls_bcv-ext_sd_ind EQ 'X'.
* CALL BADI gv_usr_exit_badi->identify_ext_invoices_sd
* EXPORTING
* iv_invoice_num = wa_inv_vbrk-vbeln
* iv_inv_date = wa_inv_vbrk-fkdat
* iv_bukrs = wa_inv_vbrk-bukrs
* iv_fkart = wa_inv_vbrk-fkart
* iv_customer = wa_inv_vbrk-kunag
* iv_vkorg = wa_inv_vbrk-vkorg
* CHANGING
* ev_ext_ind = gv_ext_sys_ind_sd.
* ENDIF.
* "Set Source Billing Value as I for External System.
* IF NOT gv_ext_sys_ind_sd IS INITIAL .
* wa_inv_hd-sourcebilling = 'I'.
* ENDIF.
*******note 2393681

*User exit invocation ends


*---------------------------------------"22092014----------------------------------
------------*
IF p_archvl = 'X'. "22092014
* --> Begin of 61_F(PA)
IF p_mdule EQ clfieu_generic_saft=>gc_module_p_abroad.
MOVE 'SP' TO wa_inv_hd-invoice_source.
ELSE.
* <-- End of 61_F(PA)
MOVE 'SA' TO wa_inv_hd-invoice_source. " Invoice is from
SD module .
ENDIF. "61_F(PA)
ELSE.
* --> Begin of 61_F(PA)
IF p_mdule EQ clfieu_generic_saft=>gc_module_p_abroad.
MOVE 'PA' TO wa_inv_hd-invoice_source.
ELSE.
* <-- End of 61_F(PA)
MOVE 'SD' TO wa_inv_hd-invoice_source. " Invoice is from
SD module .
ENDIF. "61_F(PA)
ENDIF.
*---------------------------------------"22092014----------------------------------
------------*
MOVE '0' TO wa_inv_hd-ind_selfbillng.
MOVE wa_inv_vbrk-vkorg TO wa_inv_hd-sales_org.
MOVE wa_inv_vbrk-vtweg TO wa_inv_hd-division.
SELECT SINGLE vkbur
FROM tvkbz
INTO wa_inv_hd-sales_office
WHERE vkorg = wa_inv_hd-sales_office
AND vtweg = wa_inv_hd-division.

* CHECK wa_inv_hd IS NOT INITIAL. " 20_f

* 25_F - begin
TRY.
lv_glflex_active =
clfieu_generic_saft=>check_new_gl(
iv_bukrs = wa_inv_vbrk-bukrs ).
CATCH cx_fieu_saft_check_new_gl
INTO lcl_message.
MESSAGE lcl_message TYPE 'E'.
ENDTRY.
* 25_F - end

IF lv_glflex_active = abap_true. "25_F


CALL FUNCTION 'FAGL_GET_INFO_FROM_LEDGER' "23_F/NLL
EXPORTING
i_budat = wa_inv_vbrk-fkdat
i_rldnr = ls_gen_cv-ledger
i_bukrs = wa_inv_vbrk-bukrs
IMPORTING
e_poper = lv_poper
EXCEPTIONS
no_info_found = 1
error_in_setup = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
wa_inv_hd-inv_period = lv_poper.
ENDIF. "25_F
MOVE p_gjahr TO wa_inv_hd-inv_year.

IF wa_inv_hd-inv_period IS INITIAL.

* 35_F - begin
IF wa_inv_vbrk-monat IS INITIAL.
CLEAR lv_poper.
CALL FUNCTION 'FAGL_GET_INFO_FROM_LEDGER'
EXPORTING
i_budat = wa_inv_vbrk-fkdat
i_bukrs = wa_inv_vbrk-bukrs
IMPORTING
e_poper = lv_poper
EXCEPTIONS
no_info_found = 1
error_in_setup = 2
OTHERS = 3.
IF sy-subrc <> 0 OR lv_poper IS INITIAL.
wa_inv_hd-inv_period = wa_inv_vbrk-fkdat+4(2).
ELSE.
wa_inv_hd-inv_period = lv_poper.
ENDIF.
ELSE.
wa_inv_hd-inv_period = wa_inv_vbrk-monat.
ENDIF.
* 35_F - end
* MOVE wa_inv_vbrk-monat TO wa_inv_hd-inv_period. "35_F

IF wa_inv_hd-inv_period GT 12. " for year end adjustment posting made to


special posting periods.
MOVE '12' TO wa_inv_hd-inv_period.
ENDIF.
ENDIF.
MOVE wa_inv_vbrk-sfakn TO wa_inv_hd-cancel_doc.
CLEAR wa_inv_vbrk_tmp .
*----------------------------------------------------------------------------------
--*
*Invoice Status Date -> invoice date if invoice is not cancelled
* if invoice is cancelled , then invoice status date = invoice date of original
date
*----------------------------------------------------------------------------------
--*
CLEAR : ls_invstatdate.
****note 32_F
PERFORM get_reasoncode. "56_F

PERFORM build_inv_status_date USING wa_inv_vbrk


CHANGING wa_inv_hd-inv_status_date. "54_F

wa_inv_hd-inv_stat_user = wa_inv_vbrk-ernam.
wa_inv_hd-source_id = wa_inv_vbrk-ernam.
****note 32_F
MOVE wa_inv_vbrk-waerk TO wa_inv_hd-currency.
MOVE wa_inv_vbrk-netwr TO wa_inv_hd-doc_total_gross.
MOVE wa_inv_vbrk-kurrf TO wa_inv_hd-exchange_rate.
IF wa_inv_vbrk-waerk = gv_t001_waers AND wa_inv_vbrk-sfakn IS INITIAL ."and
wa_inv_vbrk-fksto IS INITIAL4_F
gv_debit_amount = gv_debit_amount + wa_inv_vbrk-netwr.
ELSEIF
wa_inv_vbrk-waerk = gv_t001_waers AND wa_inv_vbrk-sfakn IS NOT INITIAL ."4_F
gv_credit_amount = gv_credit_amount + wa_inv_vbrk-netwr.
ENDIF.

PERFORM set_invoice_status.

CLEAR : lv_xcpdk,lv_stceg,lv_stcd1.
MOVE wa_inv_vbrk-fkart TO wa_inv_hd-inv_doctype.

MOVE wa_inv_vbrk-vbtyp TO wa_inv_hd-inv_category.

****note 2299395
UNASSIGN <fs_sdinv_kunnr>.
READ TABLE gt_sdinv_kunnr ASSIGNING <fs_sdinv_kunnr>
WITH KEY invoice_no = wa_inv_vbrk-vbeln
customer = wa_inv_vbrk-kunrg.
IF <fs_sdinv_kunnr> IS ASSIGNED.
wa_inv_hd-customerid = <fs_sdinv_kunnr>-customerid.
wa_inv_hd-customer = <fs_sdinv_kunnr>-customer.
"Fills customer address from historic
wa_inv_hd-st_address = <fs_sdinv_kunnr>-st_address.
wa_inv_hd-st_city = <fs_sdinv_kunnr>-st_city.
wa_inv_hd-st_postal = <fs_sdinv_kunnr>-st_postal.
wa_inv_hd-st_country = <fs_sdinv_kunnr>-st_country.
ELSE.
wa_inv_hd-customerid = wa_inv_vbrk-kunrg.
wa_inv_hd-customer = wa_inv_vbrk-kunrg.
ENDIF.
****note 2299395
MOVE wa_inv_vbrk-stceg TO lv_stceg.

"Get stceg for one time customer.


"Rule: VBPA-STCEG w/ partner func 'RG' if not rule1
"Rule1: VBPA3-STCEG partner func 'RG' if not rule2
"Rule2: VBRK-STCEG
IF NOT wa_inv_hd-customerid IS INITIAL.
clear lv_vbpa3.
SELECT SINGLE xcpdk INTO lv_xcpdk FROM kna1 WHERE kunnr = wa_inv_hd-customer.
IF lv_xcpdk EQ 'X'.
lv_stceg_old = lv_stceg.
clear lv_stceg.
IF lv_stceg IS INITIAL.
"OTC vat number comes from partner function RG - payer
SELECT SINGLE stceg FROM vbpa INTO lv_stceg
WHERE vbeln = wa_inv_vbrk-vbeln
AND parvw = 'RG'
AND kunnr = wa_inv_hd-customer.
* if lv_stceg IS INITIAL. "77_F
if lv_stceg+2 IS INITIAL. "77_F
SELECT SINGLE STCD1 FROM vbpa3 INTO lv_stceg
WHERE vbeln = wa_inv_vbrk-vbeln
AND parvw = 'RG'.
* if sy-subrc ne 0 and lv_stceg_old is not INITIAL . "77_F
if sy-subrc ne 0 and lv_stceg_old+2 is not INITIAL . "77_F
lv_stceg = lv_stceg_old.
elseif sy-subrc eq 0 AND lv_stceg is not initial. "71_F
lv_vbpa3 = 'X'.
elseif sy-subrc eq 0 AND lv_stceg is initial. "71_F
lv_stceg = lv_stceg_old. "71_F
endif.
endif.
ENDIF.
* --> Begin of 77_F
* IF NOT lv_stceg IS INITIAL.
* if lv_vbpa3 is INITIAL.
* lv_stceg = lv_stceg+2.
* else.
* lv_stceg = lv_stceg.
* endif.
* CONCATENATE wa_inv_hd-customerid lv_stceg INTO wa_inv_hd-customerid
SEPARATED BY '/'.
* ELSEIF lv_stceg IS INITIAL.
IF lv_stceg+2 IS NOT INITIAL AND lv_vbpa3 IS INITIAL. "STCEG
CONCATENATE wa_inv_hd-customerid lv_stceg+2 INTO wa_inv_hd-customerid
SEPARATED BY '/'.
ELSEIF lv_stceg IS NOT INITIAL AND lv_vbpa3 IS NOT INITIAL. "STCD1
CONCATENATE wa_inv_hd-customerid lv_stceg INTO wa_inv_hd-customerid
SEPARATED BY '/'.
ELSE.
* <-- End if 77_F
CONCATENATE wa_inv_hd-customerid '999999990' INTO wa_inv_hd-customerid
SEPARATED BY '/'.
ENDIF.
wa_inv_hd-onetime_ind = 'X'.
"End - 44_F
ELSE.
* If it isn't a onetime customer, we check if the customer has multiple VAT numbers
and add the country data from the invoice if needed
* Preference is given to the VAT country, destiny country used it the first doesn't
exist
SELECT COUNT( * )
FROM knas
WHERE knas~kunnr = WA_INV_VBRK-KUNRG. "40_F

IF sy-dbcnt > 0.
**********34_F begin
IF gv_extn_ext_badi IS BOUND.
"set land for invoice list OTC
CALL BADI gv_extn_ext_badi->set_otc_land
EXPORTING
is_inv_vbrk = wa_inv_vbrk
it_inv_vbrk = it_inv_vbrk
CHANGING
ct_inv_list_child = gt_inv_list_child
cv_land = wa_inv_vbrk-land1.
ENDIF.
**********34_F end
IF wa_inv_vbrk-stceg_l IS INITIAL.
if wa_inv_vbrk-land1 is INITIAL.
" Begin of 69_F
IF wa_inv_hd-st_country IS INITIAL.
CONCATENATE wa_inv_hd-customerid '/' gv_bukrs_land INTO
wa_inv_hd-customerid.
ELSE.
CONCATENATE wa_inv_hd-customerid '/' wa_inv_hd-st_country INTO
wa_inv_hd-customerid.
ENDIF.
" End of 59_F
else.
CONCATENATE wa_inv_hd-customerid '/' wa_inv_vbrk-land1 INTO
wa_inv_hd-customerid.
endif.
ELSE.
CONCATENATE wa_inv_hd-customerid '/' wa_inv_vbrk-stceg_l INTO
wa_inv_hd-customerid.
ENDIF.
endIF. "45_F
ENDIF.
ENDIF.

CONCATENATE wa_inv_vbrk-erdat+0(4) '-'


wa_inv_vbrk-erdat+4(2) '-'
wa_inv_vbrk-erdat+6(2)
'T'
wa_inv_vbrk-erzet+0(2) ':'
wa_inv_vbrk-erzet+2(2) ':'
wa_inv_vbrk-erzet+4(2)
INTO
wa_inv_hd-sys_entry_date.

****32_F begin
"Process only once per doc
IF lv_vbeln <> wa_inv_vbrk-vbeln.
***********************************************
*the reversed document (VBELV)
*has a reversal document (VBELN) in VBFA
*The VBELN conditions should be fetch from VBRK
*and the VBELV should have been previously selected
*in VBRK fetch (it_inv_vbrk)
**********************************************
FREE lt_vbfa.
CLEAR ls_inv.

"61_F - beg
ls_inv-vbeln = wa_inv_vbrk-vbeln.

CALL FUNCTION 'RV_ORDER_FLOW_INFORMATION'


EXPORTING
comwa = ls_inv
TABLES
vbfa_tab = lt_vbfa
EXCEPTIONS
no_vbfa = 1
no_vbuk_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
"Implement suitable error handling here
ENDIF.
IF p_archvl IS NOT INITIAL AND lt_vbfa IS INITIAL.
"When in archival mode the vbfa data is stored in gt_vbfa
LOOP AT gt_vbfa INTO ls_vbfa
WHERE vbelv EQ wa_inv_vbrk-vbeln.
APPEND ls_vbfa TO lt_vbfa.
ENDLOOP.
ENDIF.

"Process only once per doc


lv_vbeln = wa_inv_vbrk-vbeln.
"61_F - end
ENDIF.

UNASSIGN <fs_vbfa>.

CASE wa_inv_vbrk-vbtyp.
******when is a credit/debit memo, invoice cancelation
WHEN 'O' OR 'P' OR 'N'.
******fills credit/debit note reference
UNASSIGN <fs_vbfa>.

LOOP AT it_inv_lnes ASSIGNING <fs_inv_lnes>


where invoice_no = wa_inv_vbrk-vbeln.

CLEAR: ls_vbfa, lv_flagm.


READ TABLE lt_vbfa into ls_vbfa "45_F
WITH KEY vbeln = wa_inv_vbrk-vbeln
posnn = <fs_inv_lnes>-posnr "45_F
vbtyp_n = wa_inv_vbrk-vbtyp.
if ls_vbfa-vbtyp_v = 'M'.
lv_flagm = 'X'.
ELSE.
DO 10 TIMES.
READ TABLE lt_vbfa into ls_vbfa
WITH KEY vbeln = ls_vbfa-vbelv
posnn = ls_vbfa-posnv
vbtyp_n = ls_vbfa-vbtyp_v.
if ls_vbfa-vbtyp_v = 'M'.
lv_flagm = 'X'.
exit.
ENDIF.
ENDDO.
endif.
if lv_flagm = 'X'. "45_F
<fs_inv_lnes>-cred_note_ref = ls_vbfa-vbelv. "45_F
else. "45_F
<fs_inv_lnes>-cred_note_ref = wa_inv_vbrk-xblnr. "45_F
endif. "45_F
ENDLOOP.

********look for cancelled credit memo/invoice


UNASSIGN <fs_vbfa>.
LOOP AT lt_vbfa
ASSIGNING <fs_vbfa>
WHERE vbtyp_n CA 'NS'.
EXIT.
ENDLOOP.

IF sy-subrc = 0.
PERFORM change_doc_status USING <fs_vbfa>-vbeln
<fs_vbfa>-erdat

<fs_vbfa>-erzet.
ENDIF.

******when is an invoice
WHEN 'M'.
IF wa_inv_vbrk-fksto IS NOT INITIAL.
**********looks for cancelation invoices, credit/debit memo
UNASSIGN <fs_vbfa>.
LOOP AT lt_vbfa
ASSIGNING <fs_vbfa>
WHERE vbtyp_n CA 'NOP'.
EXIT.
ENDLOOP.

IF sy-subrc = 0.
PERFORM change_doc_status USING <fs_vbfa>-vbeln
<fs_vbfa>-erdat
<fs_vbfa>-erzet.
ENDIF.
ENDIF.
ENDCASE.
****32_F end

* archival impact - 20_f


IF lt_vbfa IS INITIAL AND lt_likp_vbrp_link[] IS NOT INITIAL. "32_F
READ TABLE lt_likp_vbrp_link INTO ls_likp_vbrp_link INDEX 1.
* MOVE ls_likp_vbrp_link-vbeln TO <fs_vbfa>-vbelv. "32_F
MOVE ls_likp_vbrp_link-vbeln TO lv_vbeln_likp. "37_F
ENDIF.
****32_F begin
READ TABLE lt_vbfa ASSIGNING <fs_vbfa> WITH KEY vbtyp_n = 'M'
vbtyp_v = 'J'.
IF sy-subrc <> 0.
READ TABLE lt_vbfa ASSIGNING <fs_vbfa> WITH KEY vbtyp_n = 'M'
vbtyp_v = 'T'.
IF sy-subrc <> 0.
READ TABLE lt_vbfa ASSIGNING <fs_vbfa> WITH KEY vbtyp_n = 'J'
vbtyp_v = 'V'.
IF sy-subrc = 0.
<fs_vbfa>-vbelv = <fs_vbfa>-vbeln.
* --> Begin of 88_F
ELSE.
* -- Check Intercompany Invoices
READ TABLE lt_vbfa ASSIGNING <fs_vbfa> WITH KEY vbtyp_n = '5'
vbtyp_v = 'J'.
IF sy-subrc <> 0.
READ TABLE lt_vbfa ASSIGNING <fs_vbfa> WITH KEY vbtyp_n = '5'
vbtyp_v = 'T'.
ENDIF.
* <-- End of 88_F
ENDIF.
ENDIF.
ENDIF.

"37_F
IF lv_vbeln_likp IS NOT INITIAL OR
( <fs_vbfa> IS ASSIGNED
AND <fs_vbfa>-vbelv IS NOT INITIAL )."33_F

IF <fs_vbfa> IS ASSIGNED. "44_F


IF <fs_vbfa>-vbelv IS NOT INITIAL.
MOVE <fs_vbfa>-vbelv TO lv_vbeln_likp.
ENDIF.
ENDIF. "44_F
"37_F

****32_F end
CLEAR :lv_likp_erdat.
"29_F: del_date when there is a delivery doc should come from lfdat
SELECT SINGLE lfdat erdat lfdat lfuhr wadat_ist wauhr
INTO (wa_inv_vbrk-del_date,
lv_likp_erdat,
lv_del_mvesdate,
lv_del_mvestme,
lv_del_mveedate,
lv_del_mvedtime)
* FROM likp WHERE vbeln = <fs_vbfa>-vbelv. "32_F
FROM likp WHERE vbeln = lv_vbeln_likp. "37_F
IF sy-subrc = 0.
********37_F begin
"Define delivery date for insurance companies
"scenario only available in PT
IF ls_bcv-bus_sector EQ 'I'
AND gv_badi_usr_ext_hdl IS BOUND.

CALL BADI gv_badi_usr_ext_hdl->set_delivery_date


EXPORTING
iv_vbeln_likp = lv_vbeln_likp
CHANGING
cv_deliverydate = wa_inv_hd-st_deliverydate.
ENDIF.
********37_F end

*Movement Start Time


IF lv_del_mvesdate IS NOT INITIAL.
CONCATENATE lv_del_mvesdate+0(4) '-'lv_del_mvesdate+4(2)'-'
lv_del_mvesdate+6(2) 'T' INTO wa_inv_vbrk-move_sdate.
IF ( lv_del_mvestme IS NOT INITIAL AND lv_del_mvestme+0(2) <> '00').
CONCATENATE wa_inv_vbrk-move_sdate lv_del_mvestme+0(2) ':' INTO
wa_inv_vbrk-move_sdate .
ELSEIF ( lv_del_mvestme+0(2) = '00' OR lv_del_mvestme IS INITIAL ).
CONCATENATE wa_inv_vbrk-move_sdate '00' ':' INTO wa_inv_vbrk-
move_sdate.
ENDIF.
IF ( lv_del_mvestme+2(2) <> '00' OR lv_del_mvestme IS NOT INITIAL ).
CONCATENATE wa_inv_vbrk-move_sdate lv_del_mvestme+2(2) ':' INTO
wa_inv_vbrk-move_sdate.
ELSEIF ( lv_del_mvestme+2(2) = '00' OR lv_del_mvestme IS INITIAL ).
CONCATENATE wa_inv_vbrk-move_sdate '00' ':' INTO wa_inv_vbrk-
move_sdate.
ENDIF.
IF ( lv_del_mvestme+4(2) <> '00' OR lv_del_mvestme IS NOT INITIAL ).
CONCATENATE wa_inv_vbrk-move_sdate lv_del_mvestme+4(2) INTO
wa_inv_vbrk-move_sdate.
ELSEIF ( lv_del_mvestme+4(2) = '00' OR lv_del_mvestme IS INITIAL ).
CONCATENATE wa_inv_vbrk-move_sdate '00' INTO wa_inv_vbrk-move_sdate.
ENDIF.
ENDIF.
*MovementEndTime and delviery data from signature tables moved to BAdI in 19_f
* FOR READIND SIGNED DELIVERY DOCUMENT FOR PT .
IF wa_inv_hd-st_deliveryid IS INITIAL.
* MOVE <fs_vbfa>-vbelv TO wa_inv_hd-st_deliveryid. "32_F
MOVE lv_vbeln_likp TO wa_inv_hd-st_deliveryid. "37_F
ENDIF.
IF wa_inv_hd-st_deliveryid IS INITIAL.
READ TABLE gt_vbrp INTO gs_vbrp WITH KEY vbeln = wa_inv_vbrk-vbeln.
IF sy-subrc = 0.
MOVE gs_vbrp-vgbel TO wa_inv_hd-st_deliveryid.
ENDIF.
ENDIF.
MOVE wa_inv_vbrk-del_date TO wa_inv_hd-st_deliverydate.
MOVE wa_inv_vbrk-move_sdate TO wa_inv_hd-move_stime.
********29_F
********rewrites taxpointdate if it exists a delivery
UNASSIGN <fs_inv_lnes>.
LOOP AT it_inv_lnes ASSIGNING <fs_inv_lnes>
WHERE invoice_no = wa_inv_vbrk-vbeln.
IF NOT wa_inv_vbrk-del_date IS INITIAL. "74_F
<fs_inv_lnes>-taxpointdate = wa_inv_vbrk-del_date.
ENDIF. "74_F
ENDLOOP.
********29_F
* DELIVERY DOCUMENT ARCHIVED "22092014; DOCUMENT NUMNER AVAILABLE IN VBFA in
database .
ELSE.
********32_F begin
"61_F - beg
IF <fs_vbfa> IS ASSIGNED.
IF <fs_vbfa>-vbelv IS NOT INITIAL.
* MOVE <fs_vbfa>-vbelv TO wa_inv_hd-st_deliveryid.
* MOVE <fs_vbfa>-vbelv TO wa_likp_vbeln-vbeln.
MOVE lv_vbeln_likp TO wa_inv_hd-st_deliveryid. "37_F
MOVE lv_vbeln_likp TO wa_likp_vbeln-vbeln. "37_F
APPEND wa_likp_vbeln TO it_likp_vbeln.
ENDIF.
ENDIF.
"61_F - end
********32_F begin

*23092014------------DELIVERY DOC INFO UNAVAILABLE IN VBFA/LIKP In


database------------
"37_F - REMOVED AS IT NEVER OCCURS
* IF <fs_vbfa>-vbelv IS INITIAL. "32_F
* MOVE wa_inv_vbrk-vbeln TO wa_del_arch-vbeln.
* MOVE wa_inv_vbrk-vkorg TO wa_del_arch-vkorg.
* APPEND wa_del_arch TO it_del_arch.
* ENDIF.
" 37_F END
*23092014------------DELIVERY DOC INFO UNAVAILABLE IN VBFA/LIKP In
database------------
ENDIF.
ENDIF.
CLEAR lv_vbeln_likp. "37_F
IF wa_inv_hd-st_deliveryid IS INITIAL.
IF it_likp_vbeln_det[] IS NOT INITIAL.
READ TABLE it_likp_vbeln_det INTO wa_likp_vbeln_det INDEX 1.
MOVE wa_likp_vbeln_det-vbeln TO wa_inv_hd-st_deliveryid.
* MOVE wa_likp_vbeln_det-fkdat TO wa_inv_hd-st_deliverydate. "37_F
ENDIF.
CLEAR : wa_likp_vbeln_det.

ENDIF.
*Country specific enhancements for Delivery document - 19_f
* ENDIF.
IF wa_inv_hd-st_deliveryid IS INITIAL.
gv_appln_msg-msgty = 'W'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '047'.
gv_appln_msg-msgv1 = wa_inv_hd-invoice_no.
CONDENSE gv_appln_msg-msgv1 NO-GAPS. "46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

CLEAR : gv_appln_msg.
ENDIF.

* --> Begin of 84_F


* -- The Invoice Type is now done in FORM map_additional_data
**Set invoice type
* CASE wa_inv_vbrk-vbtyp.
* WHEN 'M' OR 'N'.
* wa_inv_hd-inv_type = 'FT'.
* WHEN 'O' OR 'S' or '4' . ""4" for the credit memos of the invoice list 21_f
* wa_inv_hd-inv_type = 'NC'.
* WHEN 'P'.
* wa_inv_hd-inv_type = 'ND'.
* WHEN 'U'.
* wa_inv_hd-inv_type = 'PF'."43_F - Default value changed
* WHEN OTHERS.
*
* ENDCASE.
* <-- End of 84_F

"GET DATA from cutomizing table for target invoice type

READ TABLE gt_fieud_sdgen INTO wa_fieud_sdgen WITH KEY


vbtype = wa_inv_vbrk-vbtyp .
IF sy-subrc EQ 0 AND NOT wa_fieud_sdgen-tagt_inv_type IS INITIAL .
wa_inv_hd-inv_type = wa_fieud_sdgen-tagt_inv_type.
ENDIF.

****41_F begin
"Assing internal <WorkType> if applicable
IF gv_badi_generic IS BOUND.
CALL BADI gv_badi_generic->set_wrk_type_internal
EXPORTING
it_fiptc_doc_exc = gt_fiptc_doc_exc
iv_bukrs = wa_inv_hd-bukrs
iv_vbeln = wa_inv_vbrk-vbeln
iv_fkart = wa_inv_vbrk-fkart
CHANGING
cv_inv_type = wa_inv_hd-inv_type.
ENDIF.
****41_F end

IF gv_usr_exit_impl GT 0.
CALL BADI gv_usr_exit_badi->set_invoice_type
EXPORTING
iv_bukrs = wa_inv_hd-bukrs
iv_land = gv_bukrs_land
iv_vbeln = wa_inv_vbrk-vbeln
iv_vbtyp = wa_inv_vbrk-vbtyp
iv_fkart = wa_inv_vbrk-fkart
CHANGING
cv_inv_type = wa_inv_hd-inv_type.
ENDIF.

gv_entries_count = gv_entries_count + 1.

*Set plant information on header


PERFORM set_ship_from.

*Set invoice status - Normal/ anulado


" PERFORM set_invoice_status. " Commented by 20_F " No longer needed

*Get document totals.


PERFORM get_doc_totals_sd.

"EXTRACTION OF DOCUMENT TOTALS SETTLEMENT INFORMATION


CLEAR wa_zterm_selection.
CLEAR lt_zterm_texts.
* CLEAR lt_bill_inv_settl.
CLEAR lv_sy_lang.

IF wa_inv_vbrk-zterm IS NOT INITIAL. "IF A ZTERM EXISTS FOR THE DOC NUMBER
EXECUTES THE CODE BELOW

lv_doc_date = wa_inv_vbrk-fkdat.

LOOP AT lt_zterm_all INTO wa_zterm_selection WHERE zterm = wa_inv_vbrk-zterm.


IF lv_doc_date+6(2) <= wa_zterm_selection-ztagg.
EXIT.
ENDIF.
ENDLOOP.

"FIRST DISCOUNT
* IF wa_zterm_selection-zprz1 IS NOT INITIAL. 31_F
"AJUST DATE
CALL FUNCTION 'FIEU_SAFT_SETTL_CHANGE_DATE'
EXPORTING
iv_original_date = lv_doc_date
iv_months = wa_zterm_selection-zmona
iv_fixed_day = wa_zterm_selection-zfael
IMPORTING
ev_changed_date = lv_doc_date.
"CHANGE TEXT LANG TO COUNTRY SPECIFIC
lv_sy_lang = sy-langu.

* SET LOCALE LANGUAGE gv_langs. "40_F


SET LOCALE LANGUAGE gv_langz. "40_F

"FETCH PAYMENT TERMS TEXTS


CALL FUNCTION 'FI_TEXT_ZTERM'
EXPORTING
i_t052 = wa_zterm_selection
TABLES
t_ztext = lt_zterm_texts.

"CHANGE TEXT BACK TO ORIGINAL


SET LOCALE LANGUAGE lv_sy_lang.

*********31_F begin
* LOOP AT lt_zterm_texts INTO lv_ttext. "REMOVE TEXTS WHICH ARENT USEFUL FOR
SAFT
* IF lv_ttext NA '%'.
* DELETE lt_zterm_texts INDEX sy-tabix.
* ENDIF.
* ENDLOOP.
*********31_F end

"FETCH SETTLEMENT AGREEMENT TEXT


* CLEAR ls_bill_inv_settl-setlmnt_agrmnt.
SELECT SINGLE vtext FROM tvzbt INTO wa_inv_hd-settlmnt_agrmnt
WHERE zterm = wa_zterm_selection-zterm AND spras = gv_langs.
IF sy-subrc <> 0 OR wa_inv_hd-settlmnt_agrmnt IS INITIAL.
SELECT SINGLE vtext FROM tvzbt INTO wa_inv_hd-settlmnt_agrmnt
WHERE zterm = wa_zterm_selection-zterm AND spras = 'EN'.
IF sy-subrc <> 0 OR wa_inv_hd-settlmnt_agrmnt IS INITIAL.
SELECT SINGLE vtext FROM tvzbt INTO wa_inv_hd-settlmnt_agrmnt
WHERE zterm = wa_zterm_selection-zterm AND spras = sy-langu.
ENDIF.
ENDIF.

* CLEAR ls_bill_inv_settl-settle_date.
* CLEAR ls_bill_inv_settl-tot_settle_amount.
* CLEAR ls_bill_inv_settl-paym_terms.
IF wa_zterm_selection-ztag1 IS NOT INITIAL.
wa_inv_hd-settle_date1 = lv_doc_date + wa_zterm_selection-ztag1.
ELSEIF wa_zterm_selection-zstg1 IS NOT INITIAL.
CALL FUNCTION 'FIEU_SAFT_SETTL_CHANGE_DATE'
EXPORTING
iv_original_date = lv_doc_date
iv_months = wa_zterm_selection-zsmn1
iv_fixed_day = wa_zterm_selection-zstg1
IMPORTING
ev_changed_date = wa_inv_hd-settle_date1.
ENDIF.

"Begin of 60_F
IF NOT gv_t001_xskfn IS INITIAL.
wa_inv_hd-settle_amount_1 = ( wa_inv_hd-doc_total_net *
wa_zterm_selection-zprz1 ) / 100.
ELSE.
"End of 60_F
wa_inv_hd-settle_amount_1 = ( wa_inv_hd-doc_total_gross *
wa_zterm_selection-zprz1 ) / 100.
ENDIF. "60_F

READ TABLE lt_zterm_texts INTO wa_inv_hd-paym_terms_1 INDEX 1.


* APPEND ls_bill_inv_settl TO lt_bill_inv_settl.

"SECOND DISCOUNT
IF wa_zterm_selection-zprz2 IS NOT INITIAL.
* CLEAR ls_bill_inv_settl-settle_date.
* CLEAR ls_bill_inv_settl-tot_settle_amount.
* CLEAR ls_bill_inv_settl-paym_terms.
IF wa_zterm_selection-ztag2 IS NOT INITIAL.
wa_inv_hd-settle_date_2 = lv_doc_date + wa_zterm_selection-ztag2.

ELSEIF wa_zterm_selection-zstg2 IS NOT INITIAL.


CALL FUNCTION 'FIEU_SAFT_SETTL_CHANGE_DATE'
EXPORTING
iv_original_date = lv_doc_date
iv_months = wa_zterm_selection-zsmn2
iv_fixed_day = wa_zterm_selection-zstg2
IMPORTING
ev_changed_date = wa_inv_hd-settle_date_2.
ENDIF.

"Begin of 60_F
IF NOT gv_t001_xskfn IS INITIAL.
wa_inv_hd-settle_amount_2 = ( wa_inv_hd-doc_total_net *
wa_zterm_selection-zprz2 ) / 100.
ELSE.
"End of 60_F
wa_inv_hd-settle_amount_2 = ( wa_inv_hd-doc_total_gross *
wa_zterm_selection-zprz2 ) / 100.
ENDIF. "60_F
READ TABLE lt_zterm_texts INTO wa_inv_hd-paym_terms_2 INDEX 2.
* APPEND ls_bill_inv_settl TO lt_bill_inv_settl.
ENDIF.
* ENDIF. 31_F
ENDIF.

* perform get_customer_address.

MOVE gv_uuid TO wa_inv_hd-ext_uuid.


*Country specific extension - additional data
PERFORM map_additional_data.

APPEND wa_inv_hd TO it_inv_hd.

*set source id
CLEAR: wa_inv_hd-source_id, wa_inv_hd-onetime_ind, wa_inv_hd-st_deliveryid,
wa_inv_hd-st_deliverydate, wa_inv_hd-move_etime, wa_inv_hd-move_stime.
CLEAR wa_inv_vbrk_cancel .
CLEAR wa_inv_hd-sourcebilling.
CLEAR : wa_inv_hd-inv_archive.
CLEAR ls_cancel_source_id .
CLEAR wa_inv_hd. " 20_F " Cleaning variables between iterations

ENDIF. "33_F
ENDLOOP.
LOOP AT it_inv_lnes ASSIGNING <line1>."89_F - beg
IF <line1>-taxcode EQ 'NS' AND <line1>-taxpercent EQ '0.00'.
MOVE '0.00' TO <line1>-taxamount.
ENDIF.
ENDLOOP."89_F - end

*----------------------22092014--------------------------------------*
* read delivery document date from archive when delivery document is archived;
* but VBFA is still not archived fully
IF it_likp_vbeln[] IS NOT INITIAL AND p_sysarc IS NOT INITIAL.
gv_arc_tbl_read = 'LIKP'. " 21_F TO SET THE TABLE FROM WHERE THE DATA NEED TO
BE READ
PERFORM read_rv_likp_archive.
PERFORM map_archived_likp.
ENDIF.
*----------------------22092014--------------------------------------*
SORT it_inv_hd.

ENDFORM. " ASSIGN_DATA_FOR_TBL_UPDATE


*&---------------------------------------------------------------------*
*& Form SET_INVOICE_STATUS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_invoice_status .
DATA : ls_inv_vbrk LIKE LINE OF it_inv_vbrk.
DATA : ls_inv_can_period TYPE poper.
DATA : ls_inv_can_year TYPE gjahr.
DATA : lv_glflex_active TYPE boole_d. "25_F
DATA : lcl_message TYPE REF TO cx_static_check. "25_F
IF wa_inv_vbrk-sfakn IS INITIAL AND wa_inv_vbrk-fksto IS INITIAL.
wa_inv_hd-inv_status = 'N'.

ENDIF.
CLEAR : ls_inv_vbrk.
IF wa_inv_vbrk-sfakn IS NOT INITIAL
OR wa_inv_vbrk-fksto IS NOT INITIAL
OR wa_inv_vbrk-rfbsk = 'E'. "note 2285540

READ TABLE it_inv_vbrk


INTO ls_inv_vbrk
WITH KEY vbeln = wa_inv_vbrk-sfakn.
IF sy-subrc = 0.
* 25_F - begin
TRY.
lv_glflex_active =
clfieu_generic_saft=>check_new_gl(
iv_bukrs = wa_inv_vbrk-bukrs ).
CATCH cx_fieu_saft_check_new_gl
INTO lcl_message.
MESSAGE lcl_message TYPE 'E'.
ENDTRY.
* 25_F - end
IF lv_glflex_active = abap_true. "25_F
CALL FUNCTION 'FAGL_GET_INFO_FROM_LEDGER' "23_F/NLL
EXPORTING
i_budat = ls_inv_vbrk-fkdat
i_rldnr = ls_gen_cv-ledger
i_bukrs = ls_inv_vbrk-bukrs
IMPORTING
e_poper = ls_inv_can_period
e_gjahr = ls_inv_can_year
EXCEPTIONS
no_info_found = 1
error_in_setup = 2
OTHERS = 3.
ENDIF. "25_F
ENDIF.
*************************************
*invoice status for non invoice list
*although is calculated for all cases
*for invoice lists will be re-written
*on method get_invoice_status
*************************************
IF ls_inv_can_year = wa_inv_hd-inv_year OR
ls_inv_can_period = wa_inv_hd-inv_period OR
wa_inv_vbrk-fksto EQ 'X' OR
wa_inv_vbrk-rfbsk = 'E'. "note 2285540 Set Status A for Cancelled Document.
wa_inv_hd-inv_status = 'A'.
ELSE.
IF ls_inv_can_year <> wa_inv_hd-inv_year OR
ls_inv_can_period <> wa_inv_hd-inv_period.
wa_inv_hd-inv_status = 'N'.
ENDIF.
ENDIF.
ENDIF.

"calculates invoice status for invoice list and their childs 20_F
IF gv_extn_ext_badi IS BOUND.
CALL BADI gv_extn_ext_badi->get_invoice_status
EXPORTING
iv_land1 = gv_bukrs_land
iv_bukrs = wa_inv_vbrk-bukrs
iv_vbeln = wa_inv_vbrk-vbeln
iv_fkdat = wa_inv_vbrk-fkdat
it_inv_hd = gt_vbrk_inv_list
CHANGING
cv_inv_status = wa_inv_hd-inv_status
ct_inv_data = wa_inv_vbrk.

ENDIF.

IF gv_usr_exit_impl GT 0 AND wa_inv_vbrk-vbtyp <> 'U'. "note 2285540


CALL BADI gv_usr_exit_badi->set_invoice_status_sd
EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_inv_date = wa_inv_vbrk-fkdat
iv_bukrs = wa_inv_vbrk-bukrs
iv_fkart = wa_inv_vbrk-fkart
iv_kunrg = wa_inv_vbrk-kunrg
iv_kunag = wa_inv_vbrk-kunag
iv_vbtyp = wa_inv_vbrk-vbtyp
iv_sfakn = wa_inv_vbrk-sfakn
iv_fksto = wa_inv_vbrk-fksto
CHANGING
cv_inv_status = wa_inv_hd-inv_status.
ENDIF.

ENDFORM. " SET_INVOICE_STATUS


*&---------------------------------------------------------------------*
*& Form UPDATE_SAFT_TABLES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM update_saft_tables .

** 51_F
SORT it_inv_hd .
DELETE ADJACENT DUPLICATES FROM it_inv_hd COMPARING ALL FIELDS .

CALL FUNCTION 'FIEU_SAFT_UPDATE_TABLES' IN UPDATE TASK


EXPORTING
IV_LAND = gv_bukrs_land
IV_UPD_MODULE = 'S'
IT_SDINV_H = it_inv_hd
IT_SDINV_I = it_inv_lnes.

ENDFORM. " UPDATE_SAFT_TABLES


*&---------------------------------------------------------------------*
*& Form UPDATE_SUMMARY_RUN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM update_summary_run .
FIELD-SYMBOLS: <wk_summary> like LINE OF it_summary_run. "51_F
CLEAR : wa_summary_run.
* CLEAR : it_summary_run[]. "51_F
IF gv_invoice_no_arch IS NOT INITIAL.
gv_invoice_no = gv_invoice_no_arch.
gv_invoice_no_wd = gv_invoice_no_arch_wd.
ENDIF.
IF gv_invoice_no GT 0.

PERFORM fill_summary_key
CHANGING wa_summary_run.

MOVE gv_total_debit_sd TO wa_summary_run-total_debit_amt.


MOVE gv_total_credit_sd TO wa_summary_run-total_credit_amt.
MOVE gv_total_debit_sd TO wa_summary_run-total_debit_amt_ext. "37_F
MOVE gv_total_credit_sd TO wa_summary_run-total_credit_amt_ext. "37_F
MOVE gv_t001_waers TO wa_summary_run-currency."4_F

read table it_summary_run ASSIGNING <wk_summary> with key "51_F


BUKRS = wa_summary_run-bukrs
GJAHR = wa_summary_run-gjahr
MONAT = wa_summary_run-monat
FROM_DATE = wa_summary_run-FROM_DATE
TO_DATE = wa_summary_run-TO_DATE
VKBUR = wa_summary_run-VKBUR
INV_CATEGORY = wa_summary_run-INV_CATEGORY
EXT_UUID = wa_summary_run-EXT_UUID .
if sy-subrc ne 0.
APPEND wa_summary_run TO it_summary_run.
else.
MOVE-CORRESPONDING wa_summary_run to <wk_summary>.
MODIFY TABLE it_summary_run FROM <wk_summary> TRANSPORTING total_no_docs
total_debit_amt
total_credit_amt
total_debit_amt_ext
total_credit_amt_ext
currency.
endif. "51_F
gv_appln_msg-msgty = 'I'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '061'.
gv_appln_msg-msgv1 = 'SD'.
gv_appln_msg-msgv2 = wa_summary_run-total_debit_amt_ext.
gv_appln_msg-msgv3 = wa_summary_run-total_credit_amt_ext.
CONDENSE: gv_appln_msg-msgv1, gv_appln_msg-msgv2, gv_appln_msg-msgv3 NO-GAPS.
"46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

CLEAR : gv_appln_msg.
* --> Begin of 77_F
ELSEIF gv_invoice_no EQ 0.

wa_summary_run-total_no_docs = gv_invoice_no.

MODIFY it_summary_run FROM wa_summary_run TRANSPORTING total_no_docs


WHERE inv_category = gv_invoice_source
AND ext_uuid = gv_uuid.
* <-- End of 77_F
ENDIF.
**note 2285540
IF gv_invoice_no_wd GT 0.

MOVE sy-mandt TO wa_summary_run-mandt.


MOVE p_bukrs TO wa_summary_run-bukrs.
MOVE p_gjahr TO wa_summary_run-gjahr.
MOVE s_date-low TO wa_summary_run-from_date.
MOVE s_date-high TO wa_summary_run-to_date.
IF p_archvl IS INITIAL.
MOVE 'WD' TO wa_summary_run-inv_category.
MOVE gv_invoice_no_wd TO wa_summary_run-total_no_docs.
ELSE.
MOVE 'WA' TO wa_summary_run-inv_category.
MOVE gv_invoice_no_arch TO wa_summary_run-total_no_docs.
ENDIF.
MOVE gv_total_debit_wd TO wa_summary_run-total_debit_amt.
MOVE gv_total_credit_wd TO wa_summary_run-total_credit_amt.
MOVE gv_total_debit_wd TO wa_summary_run-total_debit_amt_ext. "37_F
MOVE gv_total_credit_wd TO wa_summary_run-total_credit_amt_ext. "37_F
MOVE gv_t001_waers TO wa_summary_run-currency."4_F
MOVE gv_uuid TO wa_summary_run-ext_uuid.

read table it_summary_run ASSIGNING <wk_summary> with key "51_F


BUKRS = wa_summary_run-bukrs
GJAHR = wa_summary_run-gjahr
MONAT = wa_summary_run-monat
FROM_DATE = wa_summary_run-FROM_DATE
TO_DATE = wa_summary_run-TO_DATE
VKBUR = wa_summary_run-VKBUR
INV_CATEGORY = wa_summary_run-INV_CATEGORY
EXT_UUID = wa_summary_run-EXT_UUID .
if sy-subrc ne 0.
APPEND wa_summary_run TO it_summary_run.
else.
MOVE-CORRESPONDING wa_summary_run to <wk_summary>.
MODIFY TABLE it_summary_run FROM <wk_summary> TRANSPORTING total_no_docs
total_debit_amt
total_credit_amt
total_debit_amt_ext
total_credit_amt_ext
currency.
endif. "51_F

gv_appln_msg-msgty = 'I'. " Mandatory field missing


gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '061'.
gv_appln_msg-msgv1 = 'WD'.
gv_appln_msg-msgv2 = wa_summary_run-total_debit_amt_ext.
gv_appln_msg-msgv3 = wa_summary_run-total_credit_amt_ext.
CONDENSE: gv_appln_msg-msgv1, gv_appln_msg-msgv2, gv_appln_msg-msgv3 NO-GAPS.
"46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

CLEAR : gv_appln_msg.
* --> Begin of 77_F
ELSEIF gv_invoice_no_wd EQ 0.

IF p_archvl IS INITIAL.
MOVE 'WD' TO wa_summary_run-inv_category.
ELSE.
MOVE 'WA' TO wa_summary_run-inv_category.
ENDIF.

wa_summary_run-total_no_docs = gv_invoice_no_wd.

MODIFY it_summary_run FROM wa_summary_run TRANSPORTING total_no_docs


WHERE inv_category = wa_summary_run-inv_category
AND ext_uuid = gv_uuid.
* <-- End of 77_F
ENDIF.
**note 2285540
ENDFORM. " UPDATE_SUMMARY_RUN
" GET_DIGITAL_SIGNATURE
*&---------------------------------------------------------------------*
*& Form SET_SHIP_FROM
*&---------------------------------------------------------------------*
*normal invoices- Case 1
*--------------
* Read and maintain the ship from address of the parties involved in the invoice.
* in case of normal invoice, ship from would be the plant from which the invoices
are
* shipped to the customer and Ship to would be the sold-to-party maintained in the
* billing document

*Cancellation and return of goods - Case 2


*---------------------------------
*in case of return of goods or cancellation of invoices, the ship from would be the
*customer who has sent the good back to the company

*----------------------------------------------------------------------*

FORM set_ship_from .

DATA : lv_werks_addrnr TYPE t001w-adrnr.


* assign the plant of the first line item to the header as ship from plant - in
archived data
CLEAR : gs_vbrp."18_F
READ TABLE gt_vbrp INTO gs_vbrp WITH KEY vbeln = wa_inv_vbrk-vbeln . " 18_f
IF sy-subrc = 0."18_f
MOVE gs_vbrp-werks TO wa_inv_hd-sf_werks . " 18_f
ENDIF."18_f
CLEAR :gs_vbrp."18_f

*Case 1

IF wa_inv_vbrk-sfakn IS INITIAL AND wa_inv_vbrk-fksto IS INITIAL. .


IF wa_inv_hd-sf_werks IS INITIAL.
READ TABLE it_inv_lnes INTO wa_inv_lnes WITH KEY invoice_no = wa_inv_hd-
invoice_no.
IF sy-subrc = 0.
MOVE wa_inv_lnes-plant TO wa_inv_hd-sf_werks .
ENDIF.
ENDIF.
IF wa_inv_hd-sf_werks IS NOT INITIAL.
READ TABLE it_plant_address
INTO wa_plant_address
WITH KEY werks = wa_inv_hd-sf_werks.
IF sy-subrc <> 0.
SELECT SINGLE
stras
pstlz
ort01
land1
adrnr
FROM t001w
INTO (wa_inv_hd-sf_address,
wa_inv_hd-sf_postal,
wa_inv_hd-sf_city,
wa_inv_hd-sf_country,
lv_werks_addrnr )
WHERE werks = wa_inv_hd-sf_werks.
IF wa_inv_hd-sf_address IS NOT INITIAL.
MOVE wa_inv_hd-sf_werks TO wa_plant_address-werks.
MOVE wa_inv_hd-sf_address TO wa_plant_address-stras.
MOVE wa_inv_hd-sf_postal TO wa_plant_address-pstlz.
MOVE wa_inv_hd-sf_city TO wa_plant_address-ort01.
MOVE wa_inv_hd-sf_country TO wa_plant_address-land1.
MOVE lv_werks_addrnr TO wa_plant_address-adrnr.
APPEND wa_plant_address TO it_plant_address.

ENDIF.
ELSE.
MOVE wa_plant_address-werks TO wa_inv_hd-sf_werks .
MOVE wa_plant_address-stras TO wa_inv_hd-sf_address .
MOVE wa_plant_address-pstlz TO wa_inv_hd-sf_postal.
MOVE wa_plant_address-ort01 TO wa_inv_hd-sf_city.
MOVE wa_plant_address-land1 TO wa_inv_hd-sf_country.

ENDIF.
ENDIF.
IF wa_inv_hd-sf_address IS INITIAL OR
wa_inv_hd-sf_postal IS INITIAL OR
wa_inv_hd-sf_city IS INITIAL
.

gv_appln_msg-msgty = 'I'. " Mandatory field missing


gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '048'.
gv_appln_msg-msgv1 = wa_inv_hd-invoice_no.
CONDENSE gv_appln_msg-msgv1 NO-GAPS. "46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

CLEAR : gv_appln_msg.
ENDIF.
ENDIF.
ENDFORM. " SET_SHIP_FROM
*&---------------------------------------------------------------------*
*& Form MAP_DISCOUNT_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM map_discount_info .
CLEAR wa_inv_discounts.
CLEAR: wa_inv_lnes-kschl, wa_inv_lnes-discount_amt. "46_F
"27_F
IF it_inv_discounts IS NOT INITIAL. "Adjusted in scope of Perf_adjusts_29_F
READ TABLE it_inv_discounts
ASSIGNING <fs_wa_inv_discounts> "Adjusted in scope of Perf_adjusts_29_F
WITH KEY knumv = wa_inv_lnes-knumv
kschl = 'SKTO'
kposn = wa_inv_lnes-posnr BINARY SEARCH. "Adjusted in scope of
Perf_adjusts_29_F
IF sy-subrc = 0.
*****28_F
wa_inv_lnes-kschl = <fs_wa_inv_discounts>-kschl. "Adjusted in
scope of Perf_adjusts_29_F
wa_inv_lnes-discount_amt = abs( <fs_wa_inv_discounts>-kwert ). "Adjusted in
scope of Perf_adjusts_29_F
* MOVE wa_inv_discounts-kschl TO wa_inv_lnes-kschl.
* MOVE wa_inv_discounts-kwert TO wa_inv_lnes-discount_amt.
*****28_F
ENDIF.
ENDIF.
"27_F
ENDFORM. " MAP_DISCOUNT_INFO
*&---------------------------------------------------------------------*
*& Form GET_DOC_TOTALS_SD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_doc_totals_sd .

types: begin of ts_surcharge,


prod_code type FIEU_MATNR,
prod_descr type FIEU_MAKT,
amount type fieu_dec_amount,
tax_code type MWSKZ,
tax_percent type KBETR,
tax_amount type MWSTS,
end of ts_surcharge.

types: begin of ts_prod,


kschl type konv-kschl,
end of ts_prod.

data: lt_vbrl type table of vbrl.


data: lt_surcharge type table of ts_surcharge.
data: lt_prods type table of ts_prod.

data: ls_new_inv_lne like line of it_inv_lnes.

data: lv_posnr type vbrp-posnr.


data: lv_total_surcharge type fieu_dec_amount.
data: lv_total_surcharge_tax type fieu_dec_amount.
data: lv_new_row_idx type sy-tabix.
data: lv_prod_descr type FIEU_MAKT.
data: lv_bkpf_belnr type bkpf-belnr.
data: lv_idx_lnes type sy-tabix.

field-symbols: <ls_vbrl> like line of lt_vbrl.


field-symbols: <ls_inv_lnes> like line of it_inv_lnes.
field-symbols: <ls_surcharge> like line of lt_surcharge.
field-symbols: <ls_prod> like line of lt_prods.
DATA: wa_disc_ind TYPE ty_disc. "46_F
FIELD-SYMBOLS: <line> TYPE fieud_sdinv_i. "55_F

CLEAR: wa_inv_hd-doc_total_gross,
wa_inv_hd-doc_total_net,
wa_inv_hd-doc_total_tax.

**34_F begin
DATA lv_inv_discount TYPE fieu_dec_amount.

DATA cl_pro_rata TYPE REF TO cl_saft_pro_rata.


CREATE OBJECT cl_pro_rata.
**34_F end

* --> Begin of 89_F


* -- Commented (replaced by form GET_TABLE_SD_CONDITION)
* DATA: lv_tabname type string.
*
* lv_tabname = clfieu_generic_saft=>get_table_sd_condition( ). "55_F
* <-- End of 89_F

MOVE wa_inv_vbrk-netwr TO wa_inv_hd-doc_total_net.


MOVE wa_inv_vbrk-mwsbk TO wa_inv_hd-doc_total_tax.

IF cl_generic_obj->gt_kschl IS NOT INITIAL. "77_F


* ** begin 55_F downpayment
LOOP AT it_inv_lnes ASSIGNING <line> WHERE bukrs = wa_inv_hd-bukrs
AND invoice_no = wa_inv_hd-invoice_no
AND inv_year = wa_inv_hd-inv_year.
CHECK <line>-posnr+0(1) = '9'.
* --> Begin of 76_F
IF wa_inv_vbrk-vbtyp = 'N' OR wa_inv_vbrk-vbtyp = 'O'. "Credit Memo or
Cancelation
IF <line>-debit_amt_ext IS NOT INITIAL.
wa_inv_hd-doc_total_tax = wa_inv_hd-doc_total_tax + <line>-taxamount.
wa_inv_hd-doc_total_net = wa_inv_hd-doc_total_net + <line>-debit_amt_ext .
ELSE.
wa_inv_hd-doc_total_tax = wa_inv_hd-doc_total_tax - <line>-taxamount.
wa_inv_hd-doc_total_net = wa_inv_hd-doc_total_net - <line>-credit_amt_ext.
ENDIF.
ELSE.
* <-- End of 76_F
IF <line>-credit_amt_ext IS NOT INITIAL.
wa_inv_hd-doc_total_tax = wa_inv_hd-doc_total_tax + <line>-taxamount.
wa_inv_hd-doc_total_net = wa_inv_hd-doc_total_net + <line>-credit_amt_ext .
ELSE.
wa_inv_hd-doc_total_tax = wa_inv_hd-doc_total_tax - <line>-taxamount.
wa_inv_hd-doc_total_net = wa_inv_hd-doc_total_net - <line>-debit_amt_ext.
ENDIF.
ENDIF. "76_F

<line>-posnr+0(1) = '0'.
ENDLOOP.
* ** end of 55_F downpayment
ENDIF. "77_F
perform adjust_total_tax_like_material using wa_inv_hd-doc_total_net "38_F
wa_inv_hd-doc_total_tax. "38_F

IF gv_usr_exit_impl GT 0.
CALL BADI gv_usr_exit_badi->set_net_tax
EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_inv_date = wa_inv_vbrk-fkdat
iv_inv_currency = wa_inv_vbrk-waerk
CHANGING
cv_inv_net_amt = wa_inv_hd-doc_total_net
cv_inv_tax_amt = wa_inv_hd-doc_total_tax.
ENDIF.
* if invoice list- net amount = line item total - discount oninvoice list
IF wa_inv_vbrk-vbtyp = '3' or wa_inv_vbrk-vbtyp = '4'.

"Process the invoice list discounts and surcharges


select * from vbrl into table lt_vbrl where vbeln = wa_inv_vbrk-vbeln
order by vbeln_vf. "The BADI orders by the document number
if sy-subrc is initial.

clear: lv_posnr, lv_total_surcharge, lv_total_surcharge_tax.

loop at lt_vbrl assigning <ls_vbrl>.

wa_inv_hd-doc_total_net = wa_inv_hd-doc_total_net + <ls_vbrl>-kwert_rl.

if <ls_vbrl>-kwert_rl <= 0.
"Compute setlement/discount amount
lv_inv_discount = lv_inv_discount + abs( <ls_vbrl>-kwert_rl ).

else.
"compute surcharges

"add surcharge to total surcharges


add <ls_vbrl>-kwert_rl to lv_total_surcharge.
add <ls_vbrl>-mwsbp_rl to lv_total_surcharge_tax.

"create surcharges tables


" product code will be from pricing condition
* select kschl from (lv_tabname) into table lt_prods "55_F "89_F
select kschl from (gv_tabname) into table lt_prods "89_F
where knumv = wa_inv_vbrk-knumv
and kposn = <ls_vbrl>-posnr
and kreli = abap_true "Invoice list confition
and koaid = 'A'. "Surcharge/discount
if sy-subrc is not initial.
gv_appln_msg-msgty = 'i'. "missing surcharge condition
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '150'.
gv_appln_msg-msgv1 = wa_inv_vbrk-vbeln.
CONDENSE gv_appln_msg-msgv1 NO-GAPS. "46_F

call method cl_generic_obj->gen_appl_log


exporting
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.
clear : gv_appln_msg.

else.

read table lt_prods assigning <ls_prod> index 1.


if sy-subrc is initial.
data: lt_imat type standard table of saftpt_imat-taxlikemat.
select taxlikemat from saftpt_imat into table lt_imat
where bukrs = p_bukrs
and taxlikemat = <ls_prod>-kschl
and product_type = 'O'. "Others (surcharges conditions will be
in

if sy-subrc is not initial.


gv_appln_msg-msgty = 'i'. "condition not in customizing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '151'.
gv_appln_msg-msgv1 = <ls_prod>-kschl.
CONDENSE gv_appln_msg-msgv1 NO-GAPS. "46_F

call method cl_generic_obj->gen_appl_log


exporting
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

clear : gv_appln_msg.
else.

"add surcharge to the surcharges table (by product code, tax code )
).
loop at it_inv_lnes assigning <ls_inv_lnes> from lv_idx_lnes
where invoice_no = wa_inv_vbrk-vbeln
and discount_amt < 0. "surcharges is identified as discount
amount < 0
lv_idx_lnes = sy-tabix + 1.

read table lt_surcharge assigning <ls_surcharge>


with key prod_code = <ls_prod>-kschl
tax_code = <ls_inv_lnes>-taxcode.
if sy-subrc is not initial.
append initial line to lt_surcharge assigning <ls_surcharge>.
<ls_surcharge>-prod_code = <ls_prod>-kschl.
<ls_surcharge>-prod_descr =
clfieu_generic_saft=>get_condition_description(
iv_main_lang = gv_langs
iv_kschl = <ls_prod>-
kschl
).
<ls_surcharge>-tax_code = <ls_inv_lnes>-taxcode.
<ls_surcharge>-tax_percent = <ls_inv_lnes>-taxpercent.
endif.
add <ls_vbrl>-kwert_rl to <ls_surcharge>-amount.
add <ls_vbrl>-mwsbp_rl to <ls_surcharge>-tax_amount.
exit.
endloop.
endif.

endif.

endif.

endif.

endloop.

endif.

if lv_inv_discount > 0.
"pro rata discount amounts by lines
call method cl_pro_rata->rate_discounts_sd
exporting
iv_disc_lcl = lv_inv_discount
iv_vbeln = wa_inv_vbrk-vbeln
changing
ct_inv_lnes = it_inv_lnes.
endif.
"add discount of individual invoice in list invoice
IF gt_disc_ind[] IS NOT INITIAL. "46_f
LOOP AT it_inv_lnes ASSIGNING <ls_inv_lnes> WHERE bukrs = wa_inv_vbrk-
bukrs
AND invoice_no = wa_inv_vbrk-
vbeln.
READ TABLE gt_disc_ind INTO wa_disc_ind WITH KEY
bukrs = <ls_inv_lnes>-bukrs
invoice_no = <ls_inv_lnes>-invoice_no
inv_year = <ls_inv_lnes>-inv_year
posnr = <ls_inv_lnes>-posnr.
IF sy-subrc EQ 0.
ADD wa_disc_ind-kwert TO <ls_inv_lnes>-discount_amt.
ENDIF.
ENDLOOP.
ENDIF.
"Add additional lines for surchagres, if any
if lv_total_surcharge > 0.
"Get the last line of the invoice to identify where to insert the new lines
loop at it_inv_lnes assigning <ls_inv_lnes> where invoice_no = wa_inv_vbrk-
vbeln.
lv_new_row_idx = sy-tabix.
if <ls_inv_lnes>-discount_amt < 0.
clear <ls_inv_lnes>-discount_amt.
endif.
endloop.
if sy-subrc is initial.

clear ls_new_inv_lne.
"Fill new values for surcharge line
ls_new_inv_lne-bukrs = <ls_inv_lnes>-bukrs.
ls_new_inv_lne-posnr = <ls_inv_lnes>-posnr.
ls_new_inv_lne-invoice_no = <ls_inv_lnes>-invoice_no.
ls_new_inv_lne-inv_year = <ls_inv_lnes>-inv_year.
ls_new_inv_lne-inv_date = <ls_inv_lnes>-inv_date.
ls_new_inv_lne-ext_uuid = <ls_inv_lnes>-ext_uuid.
ls_new_inv_lne-document_waers = <ls_inv_lnes>-document_waers.
ls_new_inv_lne-currency = <ls_inv_lnes>-currency.
ls_new_inv_lne-taxpointdate = <ls_inv_lnes>-taxpointdate.

ls_new_inv_lne-quantity = 1.
ls_new_inv_lne-unitofmeasure = 'UN'.

loop at lt_surcharge assigning <ls_surcharge>.


lv_new_row_idx = lv_new_row_idx + 1. "next line
ls_new_inv_lne-posnr = ls_new_inv_lne-posnr + 10.
ls_new_inv_lne-unitprice_ext = <ls_surcharge>-amount.
ls_new_inv_lne-credit_amt_ext = <ls_surcharge>-amount.
ls_new_inv_lne-productcode = <ls_surcharge>-prod_code.
ls_new_inv_lne-productdesc = <ls_surcharge>-prod_descr.
ls_new_inv_lne-description_line = <ls_surcharge>-prod_descr.
"Tax
if <ls_surcharge>-tax_amount is not initial.
ls_new_inv_lne-taxcode = <ls_surcharge>-tax_code.
ls_new_inv_lne-taxpercent = <ls_surcharge>-tax_percent.
ls_new_inv_lne-taxamount = <ls_surcharge>-tax_amount.
endif.
"Insert the new line
insert ls_new_inv_lne into it_inv_lnes index lv_new_row_idx.
endloop.

endif.

endif.

ENDIF.

*conditiona added to adjust as per the country specific adjustments - 19_F


IF wa_inv_hd-doc_total_gross IS INITIAL.
wa_inv_hd-doc_total_gross = wa_inv_hd-doc_total_net + wa_inv_hd-doc_total_tax.
ENDIF.
*conditiona added to adjust as per the country specific adjustments - 19_F
ENDFORM. " GET_DOC_TOTALS_SD
*&---------------------------------------------------------------------*
*& Form UPDATE_SD_SUMMARY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM update_sd_summary .
IF it_summary_run IS NOT INITIAL.
*29_F Deadlock deleting SD - adjust - begin
MODIFY fieud_invsummary FROM TABLE it_summary_run.
COMMIT WORK and WAIT. "51_F
else.
ROLLBACK WORK. "51_F
ENDIF .
FREE it_summary_run.
*29_F Deadlock deleting SD - adjust -end
ENDFORM. " UPDATE_SD_SUMMARY
*&---------------------------------------------------------------------*
*& Form IDENTIFY_SALES_ORDER_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM identify_sales_order_info .
DATA : lt_so_data TYPE TABLE OF st_so_data.

SELECT vbeln audat FROM vbak


INTO CORRESPONDING FIELDS OF TABLE lt_so_data
FOR ALL ENTRIES IN it_so_data
WHERE vbeln = it_so_data-vbeln.
IF sy-subrc = 0.
it_so_data[] = lt_so_data[].
ENDIF.
* Sales order information archived for live invoice documents

" 44_F BEGIN


* IF p_sysarc IS NOT INITIAL OR p_sysarc = 'X'.
* PERFORM identify_salesorder_missing_db.
*
* PERFORM read_salesorder_from_archives.
*
* ENDIF.
IF gv_read_so_arch IS INITIAL AND ( p_sysarc IS NOT INITIAL OR p_sysarc = 'X' ).
PERFORM identify_salesorder_missing_db.

PERFORM read_salesorder_from_archives.
MOVE 'X' TO gv_read_so_arch.

ENDIF.
" 44_F

ENDFORM. " IDENTIFY_SALES_ORDER_INFO


*&---------------------------------------------------------------------*
*& Form MAP_TAX_INFO_INV_LINES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WA_INV_COND_REC_MWSK1 text
* -->P_ENDIF text
*----------------------------------------------------------------------*
FORM map_tax_info_inv_lines USING mwsk1
.
MOVE mwsk1 TO wa_inv_cond_rec-mwsk1.
READ TABLE it_tax_data
INTO wa_tax_data
WITH KEY taxcode = wa_inv_cond_rec-mwsk1..
IF sy-subrc = 0.
*Tax code as per the invoice line item condition record
IF wa_inv_cond_rec-mwsk1 IS NOT INITIAL.
MOVE wa_inv_cond_rec-mwsk1 TO wa_inv_lnes-taxcode.
ENDIF.

MOVE wa_tax_data-taxpercentage TO wa_inv_lnes-taxpercent.


*TaxExemptionReason
IF wa_inv_lnes-taxpercent IS INITIAL OR
wa_inv_lnes-taxpercent = '0.00' OR
wa_inv_lnes-taxpercent = 0.

ENDIF.
IF ( wa_inv_lnes-taxamount = '0.00' OR wa_inv_lnes-taxamount IS INITIAL ).
ENDIF.

ENDIF.

ENDFORM. " MAP_TAX_INFO_INV_LINES


*&---------------------------------------------------------------------*
*& Form GET_BILLING_HISTORY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_billing_history .
DATA: ls_vbfa_archived LIKE LINE OF gt_vbfa.
* CLEAR :it_inv_del_cmemo[].

LOOP AT gt_vbfa INTO ls_vbfa_archived .


IF ls_vbfa_archived = 'J' OR ls_vbfa_archived = 'T' OR ls_vbfa_archived = 'O'.
wa_inv_del_cmemo-vbelv = ls_vbfa_archived-vbelv .
wa_inv_del_cmemo-posnv = ls_vbfa_archived-posnv .
wa_inv_del_cmemo-vbeln = ls_vbfa_archived-vbeln .
wa_inv_del_cmemo-posnn = ls_vbfa_archived-posnn .
wa_inv_del_cmemo-vbtyp_v = ls_vbfa_archived-vbtyp_v .
APPEND wa_inv_del_cmemo TO it_inv_del_cmemo.
CLEAR wa_inv_del_cmemo.
ENDIF.
CLEAR ls_vbfa_archived.
ENDLOOP.

ENDFORM. " GET_BILLING_HISTORY


*&---------------------------------------------------------------------*
*& Form TAX_LIKE_MATERIAL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM tax_like_material using is_vbrp type st_inv_line_items
iv_list type abap_bool
iv_idx type posnr.
DATA: lv_tax_code TYPE MWSKZ. "42_F
DATA: lv_no_summary_update TYPE xfeld. "42_F
FIELD-SYMBOLS <wa_inv_lnes_aux> LIKE LINE OF it_inv_lnes . "23_F
FIELD-SYMBOLS <wa_inv_lnes_last> LIKE LINE OF it_inv_lnes . "46_F
data: lv_vbeln type vbeln.
DATA: ls_vbrp LIKE LINE OF it_vbrp.
data: lv_posnr type posnr.
data: lv_posnr_disc type posnr.
data: lv_vbeln_disc type vbeln.
data: lt_discounts_aux type TABLE OF st_inv_discounts.

CLEAR gv_tax_mat.
case iv_list. "46_F
when abap_true.
lv_vbeln_disc = is_vbrp-vbeln.
lv_vbeln = is_vbrp-vbeln_vf .
lv_posnr_disc = gv_tax_mat = iv_idx.
lv_posnr = is_vbrp-posnr_vf.

LOOP AT it_inv_discounts INTO wa_inv_discounts WHERE knumv = is_vbrp-knumv


and kposn = lv_posnr.
APPEND wa_inv_discounts to lt_discounts_aux.
ENDLOOP.
when OTHERS.
SORT it_vbrp BY vbeln posnr ASCENDING.
DESCRIBE TABLE it_vbrp LINES gv_tax_mat.
READ TABLE it_vbrp
INDEX gv_tax_mat
INTO ls_vbrp
TRANSPORTING vbeln posnr. " 30_F
lv_vbeln_disc = lv_vbeln = ls_vbrp-vbeln.
gv_tax_mat = ls_vbrp-posnr.
LOOP AT it_inv_discounts INTO wa_inv_discounts WHERE knumv = is_vbrp-knumv.
APPEND wa_inv_discounts to lt_discounts_aux.
ENDLOOP.
ENDCASE.
**29_F

**29_F
MOVE gv_bukrs_land TO gv_land_exit.

TRY.
GET BADI gv_usr_exit_badi
FILTERS
land1 = gv_land_exit.

CATCH cx_badi_not_implemented .

ENDTRY.
CLEAR : gv_usr_exit_impl.
IF gv_usr_exit_badi IS NOT INITIAL.
TRY .

CALL METHOD cl_badi_query=>number_of_implementations


EXPORTING
badi = gv_usr_exit_badi
RECEIVING
num = gv_usr_exit_impl.

CATCH cx_badi_not_implemented.

ENDTRY.
ENDIF.

LOOP AT lt_discounts_aux INTO wa_inv_discounts . "46_F

READ TABLE it_tax_material INTO wa_tax_material


WITH KEY taxlikemat = wa_inv_discounts-kschl.
IF sy-subrc = 0.

" Since it_inv_discounts has all discounts for document


" We must not process the discounts of discarded Items
UNASSIGN <wa_inv_lnes_aux>. "29_F
if iv_list = abap_false.
lv_posnr_disc = wa_inv_discounts-kposn.
endif.
READ TABLE it_inv_lnes
ASSIGNING <wa_inv_lnes_aux>
WITH KEY posnr = lv_posnr_disc "wa_inv_discounts-kposn
invoice_no = lv_vbeln_disc. "46_f

IF <wa_inv_lnes_aux> IS ASSIGNED. "29_F

"42_F - Begin
IF gv_bukrs_land = 'PT'.
lv_tax_code = <wa_inv_lnes_aux>-taxcode.
IF gv_usr_exit_badi IS NOT INITIAL.
CALL BADI gv_usr_exit_badi->get_non_reveune_based_tax_code
EXPORTING
iv_vbeln = lv_vbeln "46_F ls_vbrp-vbeln
iv_posnr = <wa_inv_lnes_aux>-posnr
CHANGING
cv_tax_code = lv_tax_code.
ENDIF.

lv_no_summary_update =
clfieu_generic_saft=>eval_tax_base_non_revenue( lv_tax_code ).
ENDIF.
"42_F - End

clear: wa_inv_lnes-org_on, wa_inv_lnes-productid, wa_inv_lnes-


document_waers,
wa_inv_lnes-debit_amount, wa_inv_lnes-credit_amount,
wa_inv_lnes-productserialnumber.

wa_inv_lnes-bukrs = p_bukrs.
wa_inv_lnes-invoice_no = wa_inv_vbrk-vbeln.
wa_inv_lnes-inv_year = p_gjahr.
wa_inv_lnes-inv_date = wa_inv_vbrk-fkdat.
wa_inv_lnes-productcode = wa_inv_discounts-kschl.
wa_inv_lnes-taxlike_mat_ind = 'X'.
wa_inv_lnes-taxpointdate = wa_inv_vbrk-fkdat.
"46_F
READ TABLE it_vbrp_all INTO wa_vbrp WITH KEY vbeln = lv_vbeln "wa_inv_vbrk-
vbeln
posnr = wa_inv_discounts-kposn
"Adjusted in scope of Perf_adjusts_29_F
BINARY SEARCH.
"Adjusted in scope of Perf_adjusts_29_F
IF sy-subrc = 0.
wa_inv_lnes-quantity = wa_vbrp-fkimg.
"29_F
if wa_vbrp-fkimg <> 0. "42_F
wa_inv_lnes-unitprice_ext = abs( wa_inv_discounts-kwert / wa_vbrp-fkimg
).
else.
wa_inv_lnes-unitprice_ext = abs( wa_inv_discounts-kwert ).
endif.
"29_F
ENDIF.

wa_inv_lnes-unitofmeasure = 'UN'.

IF wa_inv_vbrk-vbtyp = 'N' OR wa_inv_vbrk-vbtyp = 'O'.


IF wa_inv_discounts-kwert GE 0.
wa_inv_lnes-debit_amt_ext = wa_inv_discounts-kwert.
ELSE.
wa_inv_lnes-credit_amt_ext = wa_inv_discounts-kwert.
ENDIF.
ELSE.
IF wa_inv_discounts-kwert GE 0.
wa_inv_lnes-credit_amt_ext = wa_inv_discounts-kwert.
ELSE.
wa_inv_lnes-debit_amt_ext = wa_inv_discounts-kwert.
ENDIF.
ENDIF.
* --> Begin of 87_F
* "42_F - Begin
* IF lv_no_summary_update = abap_false . "
* IF wa_inv_hd-inv_status <> 'A'.
* IF wa_inv_vbrk-vbtyp = 'U'.
* IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL.
* ADD wa_inv_lnes-credit_amt_ext TO gv_total_credit_wd.
* ENDIF.
* IF wa_inv_lnes-debit_amt_ext is not initial.
* ADD wa_inv_lnes-debit_amt_ext TO gv_total_debit_wd.
* ENDIF.
* ELSE.
* IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL.
* ADD wa_inv_lnes-credit_amt_ext TO gv_total_credit_sd.
* ENDIF.
* IF wa_inv_lnes-debit_amt_ext is not initial.
* ADD wa_inv_lnes-debit_amt_ext TO gv_total_debit_sd.
* ENDIF.
* ENDIF.
* ENDIF.
* ENDIF.
* "42_F - End
* <-- End of 87_F
wa_inv_lnes-currency = wa_inv_vbrk-waerk.

IF gv_usr_exit_impl GT 0.
CALL BADI gv_usr_exit_badi->set_amounts_credit_debit
EXPORTING
iv_invoice_num = wa_inv_vbrk-vbeln
iv_inv_date = wa_inv_vbrk-fkdat
iv_inv_pos = wa_inv_discounts-kposn "42_F
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amt_ext
cv_inv_credit_amt = wa_inv_lnes-credit_amt_ext
cv_unit_price = wa_inv_lnes-unitprice_ext.
ENDIF.

SELECT SINGLE vtext FROM t685t INTO wa_inv_lnes-description_line "#EC


CI_GENBUFF
WHERE spras = gv_langs
AND kappl = 'V'
AND kschl = wa_inv_discounts-kschl.
IF sy-subrc <> 0.
SELECT SINGLE vtext FROM t685t INTO wa_inv_lnes-description_line "#EC
CI_GENBUFF
WHERE spras = 'EN'
AND kappl = 'V'
AND kschl = wa_inv_discounts-kschl.
IF sy-subrc <> 0.
SELECT SINGLE vtext FROM t685t INTO wa_inv_lnes-description_line "#EC
CI_GENBUFF
WHERE spras = sy-langu
AND kappl = 'V'
AND kschl = wa_inv_discounts-kschl.
ENDIF.
ENDIF.

wa_inv_lnes-productdesc = wa_inv_lnes-description_line.
if wa_tax_material-VAT_RELEVANT = '2'. "37_F
clear wa_inv_lnes-taxcode . "37_F
else. "37_F
* wa_inv_lnes-taxcode = wa_inv_discounts-mwsk1.
wa_inv_lnes-taxcode = <WA_INV_LNES_AUX>-TAXCODE. "38F
endif. "37_F
MOVE gv_uuid TO wa_inv_lnes-ext_uuid.
wa_inv_lnes-knumv = wa_inv_discounts-knumv.
wa_inv_lnes-kposn = wa_inv_discounts-kposn.
wa_inv_lnes-kschl = wa_inv_discounts-kschl.
wa_inv_lnes-kappl = 'V'.
wa_inv_lnes-mandt = sy-mandt.
* wa_inv_discounts-kwert.
* BEGIN 23_F
if wa_inv_discounts-KOAID = 'A'.
IF wa_inv_lnes-debit_amt_ext IS NOT INITIAL
AND <wa_inv_lnes_aux>-debit_amt_ext IS NOT INITIAL.

<wa_inv_lnes_aux>-debit_amt_ext =
<wa_inv_lnes_aux>-debit_amt_ext - wa_inv_lnes-debit_amt_ext. "46_F

ELSEIF wa_inv_lnes-credit_amt_ext IS NOT INITIAL


AND <wa_inv_lnes_aux>-credit_amt_ext IS NOT INITIAL.

<wa_inv_lnes_aux>-credit_amt_ext =
<wa_inv_lnes_aux>-credit_amt_ext - wa_inv_lnes-credit_amt_ext.

ELSEIF wa_inv_lnes-debit_amt_ext IS NOT INITIAL


AND <wa_inv_lnes_aux>-credit_amt_ext IS NOT INITIAL.

<wa_inv_lnes_aux>-credit_amt_ext =
<wa_inv_lnes_aux>-credit_amt_ext - wa_inv_lnes-debit_amt_ext. "46_F

ELSEIF wa_inv_lnes-credit_amt_ext IS NOT INITIAL


AND <wa_inv_lnes_aux>-debit_amt_ext IS NOT INITIAL.

<wa_inv_lnes_aux>-debit_amt_ext =
<wa_inv_lnes_aux>-debit_amt_ext - wa_inv_lnes-credit_amt_ext.

ENDIF.
"29_F
<wa_inv_lnes_aux>-unitprice_ext =
<wa_inv_lnes_aux>-unitprice_ext - wa_inv_lnes-unitprice_ext.

IF <wa_inv_lnes_aux>-unitprice_ext LT 0. "45_F
<wa_inv_lnes_aux>-unitprice_ext = 0. "45_F
ENDIF. "45_F

* END 23_F

endif. "38_F
iv_idx = gv_tax_mat = gv_tax_mat + 1.
wa_inv_lnes-posnr = gv_tax_mat.
APPEND wa_inv_lnes TO it_inv_lnes.

ENDIF."29_F
CLEAR wa_inv_lnes.
ENDIF.
ENDLOOP.

ENDFORM. " TAX_LIKE_MATERIAL


*&---------------------------------------------------------------------*
*& Form RETRIEVE_SALES_OFFICE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM retrieve_sales_office .
DATA : lv_count_so TYPE i. " 12_F

SELECT * FROM fieuc_salesofc


INTO CORRESPONDING FIELDS OF TABLE it_sales_offices
* WHERE bukrs = p_bukrs. "83_F
WHERE bukrs = cl_generic_obj->gv_bukrs. "83_F

SORT it_sales_offices.

CHECK p_extrct EQ abap_true. "83_F

DESCRIBE TABLE it_sales_offices LINES lv_count_so.

IF sy-subrc = 0 .
gv_appln_msg-msgty = 'I'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '094'. "12_F
gv_appln_msg-msgv1 = p_bukrs.
CONDENSE gv_appln_msg-msgv1 NO-GAPS. "46_F

CALL METHOD cl_generic_obj->gen_appl_log


EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

gv_so_cust_exists_flg = 'X'.
gv_appln_msg-msgty = 'I'. " Mandatory field missing
gv_appln_msg-msgid = gc_message_class .
gv_appln_msg-msgno = '095'.
gv_appln_msg-msgv1 = lv_count_so.
CONDENSE gv_appln_msg-msgv1 NO-GAPS. "46_F
CALL METHOD cl_generic_obj->gen_appl_log
EXPORTING
iv_appl_msg = gv_appln_msg
iv_land = gv_bukrs_land
iv_display = '-'
iv_handle = gv_appln_handle.

ENDIF.

ENDFORM. " RETRIEVE_SALES_OFFICE


*&---------------------------------------------------------------------*
*& Form GET_REVERSAL_REASONS_SD note 29_F
*&---------------------------------------------------------------------*
* Only available form 605 up
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_reversal_reason_sd .
** begin of 56_F
DATA: lv_rc type sy-subrc.
DATA: lv_var TYPE string VALUE 'STGRD = IT_INV_VBRK-STGRD AND SPRAS IN ('.
DATA: lt_order type ABAP_SORTORDER_TAB ,
ls_order like LINE OF lt_order.

lv_rc = clfieu_generic_saft=>check_attr_exist( 'VBRK-STGRD' ).


CHECK lv_rc = 0.

CONCATENATE lv_var '''' 'EN' '''' ',SY-LANGU,GV_BUKRS_LAND)' INTO lv_var.


FREE lt_reasoncode_sd.

SELECT spras stgrd txt40


FROM t041ct
INTO CORRESPONDING FIELDS OF TABLE lt_reasoncode_sd
FOR ALL ENTRIES IN it_inv_vbrk
WHERE (lv_var) .

CHECK sy-subrc EQ 0.

ls_order-name = 'STGRD'.
append ls_order to lt_order.
ls_order-name = 'SPRAS'.
append ls_order to lt_order.
*

SORT LT_REASONCODE_SD BY (lt_order).


*** end of 56_F
ENDFORM. "GET_REVERSAL_REASON FOR SD
*&---------------------------------------------------------------------*
*& Form FILL_SUMMARY_KEY
*&---------------------------------------------------------------------*
* 29_F Deadlock deleting SD
*----------------------------------------------------------------------*
* <--P_WA_SUMMARY_RUN text
*----------------------------------------------------------------------*
FORM fill_summary_key CHANGING p_wa_summary_run TYPE fieud_invsummary.

MOVE sy-mandt TO p_wa_summary_run-mandt.


MOVE p_bukrs TO p_wa_summary_run-bukrs.
MOVE p_gjahr TO p_wa_summary_run-gjahr.
MOVE s_date-low TO p_wa_summary_run-from_date.
MOVE s_date-high TO p_wa_summary_run-to_date.
IF p_archvl IS INITIAL.
* MOVE 'SD' TO p_wa_summary_run-inv_category. "61_F(PA)
MOVE gv_invoice_no TO p_wa_summary_run-total_no_docs.
ELSE.
* MOVE 'SA' TO p_wa_summary_run-inv_category. "61_F(PA)
MOVE gv_invoice_no_arch TO p_wa_summary_run-total_no_docs.
ENDIF.
MOVE gv_invoice_source TO p_wa_summary_run-inv_category. "61_F(PA)
MOVE gv_uuid TO p_wa_summary_run-ext_uuid.

ENDFORM. " FILL_SUMMARY_KEY


*&---------------------------------------------------------------------*
*& Form CREATE_SUMMARY_CTRL
*&---------------------------------------------------------------------*
* 29_F Deadlock deleting SD
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM create_summary_ctrl .
DATA ls_summary_run TYPE fieud_invsummary.
*Assumption: it_summry_run is empty.
FREE it_summary_run.

PERFORM fill_summary_key
CHANGING ls_summary_run.

APPEND ls_summary_run TO it_summary_run.

* PERFORM update_sd_summary. "51_F


*
* FREE it_summary_run. "51_F
ENDFORM. " CREATE_SUMMARY_CTRL
*&---------------------------------------------------------------------*
*& Form call_user_badi
*&---------------------------------------------------------------------*
* 30_F
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM call_user_badi.

DATA: lv_flag_taxpoint_date TYPE char1,


lv_flag_afs TYPE char1.
DATA: lt_inv_header_user TYPE TABLE OF fieud_sdinv_h,
lt_inv_lines_user TYPE TABLE OF fieud_sdinv_i.
**30_F
DATA: lv_afs_field_string TYPE string,
lo_struct TYPE REF TO cl_abap_structdescr,
lt_ddfields TYPE ddfields.
**30_F
**45_F
DATA lv_new_val TYPE FIEU_DEC_AMOUNT.
**45_F
FIELD-SYMBOLS: <fs_inv_lnes> TYPE fieud_sdinv_i,
<fs_inv_lnes_user> TYPE fieud_sdinv_i.

IF gv_usr_exit_badi IS NOT INITIAL.

"Temporary tables for the customer


lt_inv_header_user[] = it_inv_hd[].
lt_inv_lines_user[] = it_inv_lnes[].

CALL BADI gv_usr_exit_badi->update_taxpoint_date


EXPORTING
it_inv_header = lt_inv_header_user
CHANGING
cv_inv_lnes = lt_inv_lines_user
cv_flag = lv_flag_taxpoint_date.

****30_F
lo_struct ?= cl_abap_typedescr=>describe_by_name( 'VBRP' ).
lt_ddfields = lo_struct->get_ddic_field_list( ).

READ TABLE lt_ddfields WITH KEY fieldname = 'J_3AETENR' TRANSPORTING NO FIELDS.


IF sy-subrc = 0.
CALL BADI gv_usr_exit_badi->fill_sd_items_afs
EXPORTING
it_inv_header = lt_inv_header_user
CHANGING
cv_inv_lnes = lt_inv_lines_user
cv_flag = lv_flag_afs.
ENDIF.
****30_F
ENDIF.

*If the flag comes w/ an 'X' the values should be updated


IF lv_flag_taxpoint_date IS NOT INITIAL
OR lv_flag_afs IS NOT INITIAL. "30_F
CLEAR wa_inv_lnes.
LOOP AT it_inv_lnes ASSIGNING <fs_inv_lnes>.
READ TABLE lt_inv_lines_user ASSIGNING <fs_inv_lnes_user>
INDEX sy-tabix.
******30_F
IF lv_flag_taxpoint_date IS NOT INITIAL.
<fs_inv_lnes>-taxpointdate = <fs_inv_lnes_user>-taxpointdate.
ENDIF.
IF lv_flag_afs IS NOT INITIAL.
<fs_inv_lnes>-quantity = <fs_inv_lnes_user>-quantity.
<fs_inv_lnes>-unitprice_ext = <fs_inv_lnes_user>-unitprice_ext.
" BEGIN of 45_F
IF <fs_inv_lnes>-credit_amt_ext NE <fs_inv_lnes_user>-credit_amt_ext.
IF <fs_inv_lnes_user>-credit_amt_ext GT 0.
lv_new_val = <fs_inv_lnes_user>-credit_amt_ext - <fs_inv_lnes>-
credit_amt_ext.
<fs_inv_lnes>-credit_amt_ext = <fs_inv_lnes_user>-credit_amt_ext.
ADD lv_new_val TO gv_total_credit_sd.
ENDIF.
ENDIF.
IF <fs_inv_lnes>-debit_amt_ext NE <fs_inv_lnes_user>-debit_amt_ext.
IF <fs_inv_lnes_user>-debit_amt_ext GT 0.
lv_new_val = <fs_inv_lnes_user>-debit_amt_ext - <fs_inv_lnes>-
debit_amt_ext.
<fs_inv_lnes>-debit_amt_ext = <fs_inv_lnes_user>-debit_amt_ext.
ADD lv_new_val TO gv_total_debit_sd.
ENDIF.
ENDIF.
"END of 45_F
<fs_inv_lnes>-taxcode = <fs_inv_lnes_user>-taxcode.
<fs_inv_lnes>-taxamount = <fs_inv_lnes_user>-taxamount.
ENDIF.
******30_F
UNASSIGN <fs_inv_lnes_user>.
ENDLOOP.
ENDIF.

ENDFORM. "update_user_taxpointdate
*&---------------------------------------------------------------------*
*& Form get_sd_history note 2299395
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_sd_history using p_first p_tab. "40_F

DATA: lv_badi_cust_prod TYPE REF TO fieusaft_cust_prod.


DATA: lv_land TYPE string.
DATA: ls_sd_info_h LIKE LINE OF gt_sd_info_h,
ls_sd_info_i LIKE LINE OF gt_sd_info_i.
DATA : lt_vbrp_aux TYPE TABLE OF st_inv_line_items.

DATA: lt_sdinv_kunnr TYPE SORTED TABLE OF ty_sdinv_kunnr "40_F


WITH UNIQUE KEY invoice_no customer, "40_F
lt_sdinv_matnr TYPE SORTED TABLE OF ty_sdinv_matnr "40_F
WITH UNIQUE KEY invoice_no productcode. "40_F
data: ls_sdinv_kunnr type ty_sdinv_kunnr, "40_F
ls_sdinv_matnr type ty_sdinv_matnr . "40_F
DATA : lt_vbrp TYPE SORTED TABLE OF st_inv_line_items WITH NON-UNIQUE KEY vbeln
posnr. "40_F
DATA dref TYPE REF TO data. "40_f
FIELD-SYMBOLS: <ft_tab> type ANY TABLE. "40_F
FIELD-SYMBOLS: <fs> type any. "40_F

CREATE DATA dref TYPE TABLE OF st_inv_line_items. "40_F


ASSIGN dref->* TO <ft_tab>. "40_F
IF <ft_tab> is ASSIGNED. "40_F
<ft_tab> = p_tab. "40_F
lt_vbrp[] = <ft_tab>. "40_F
ENDIF. "40_F

lv_land = gv_bukrs_land.

**note 2393681
TRY.
GET BADI lv_badi_cust_prod
FILTERS
land = lv_land.

CATCH cx_badi_multiply_implemented.
CATCH cx_badi_not_implemented.
ENDTRY.
**note 2393681

CLEAR wa_vbrp.
CLEAR wa_inv_vbrk.

IF lv_badi_cust_prod IS BOUND.
****Prepare tables

LOOP AT lt_vbrp INTO wa_vbrp. "40_F


AT NEW vbeln.
CLEAR wa_inv_vbrk.
READ TABLE it_inv_vbrk
INTO wa_inv_vbrk
WITH KEY vbeln = wa_vbrp-vbeln.

IF sy-subrc = 0.
ls_sd_info_h-vbeln = wa_inv_vbrk-vbeln.
ls_sd_info_h-kunnr = wa_inv_vbrk-kunrg.
INSERT ls_sd_info_h INTO TABLE gt_sd_info_h.
CLEAR ls_sd_info_h.
ELSE.
"40_F
SELECT single vbeln kunrg into (ls_sd_info_h-vbeln, ls_sd_info_h-kunnr )
FROM VBRK "40_F
WHERE VBELN = wa_inv_vbrk-vbeln.
"40_F
IF sy-subrc eq 0.
"40_F
INSERT ls_sd_info_h INTO TABLE gt_sd_info_h.
"40_F
CLEAR ls_sd_info_h.
"40_F
ENDIF.
"40_F
ENDIF.
ENDAT.

ls_sd_info_i-vbeln = wa_vbrp-vbeln.
ls_sd_info_i-matnr = wa_vbrp-matnr.
IF NOT ls_sd_info_i-matnr IS INITIAL. " 66_F
INSERT ls_sd_info_i INTO TABLE gt_sd_info_i.
ENDIF. "66_F
CLEAR ls_sd_info_i.
ENDLOOP.

IF NOT p_first is INITIAL. "40_F


FREE gt_sdinv_kunnr.
FREE gt_sdinv_matnr.
ENDIF. "40_F

CHECK gt_sd_info_h[] IS NOT INITIAL. "79_F

CALL BADI lv_badi_cust_prod->get_sd_history


EXPORTING
it_sd_info_h = gt_sd_info_h
it_sd_info_i = gt_sd_info_i
iv_log_handle = gv_appln_handle
IMPORTING
et_sdinv_kunnr = lt_sdinv_kunnr "40_F
et_sdinv_matnr = lt_sdinv_matnr. "40_F

FREE gt_sd_info_h.
FREE gt_sd_info_i.

IF NOT p_first is INITIAL. "40_F begin


gt_sdinv_kunnr[] = lt_sdinv_kunnr[].
gt_sdinv_matnr[] = lt_sdinv_matnr[].
ELSE.
LOOP at lt_sdinv_kunnr into ls_sdinv_kunnr.
READ TABLE gt_sdinv_kunnr ASSIGNING <fs> WITH KEY invoice_no =
ls_sdinv_kunnr-invoice_no
customer =
ls_sdinv_kunnr-customer.
IF sy-subrc ne 0.
insert ls_sdinv_kunnr into TABLE gt_sdinv_kunnr.
ENDIF.
ENDLOOP.
LOOP at lt_sdinv_matnr into ls_sdinv_matnr.
READ TABLE gt_sdinv_matnr ASSIGNING <fs> WITH KEY invoice_no =
ls_sdinv_matnr-invoice_no
productcode =
ls_sdinv_matnr-productcode.
IF sy-subrc ne 0.
insert ls_sdinv_matnr into TABLE gt_sdinv_matnr.
ENDIF.
ENDLOOP.
ENDIF. "40_F end
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form change_doc_status 32_F
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM change_doc_status USING lv_vbeln TYPE vbeln
lv_erdat TYPE erdat
lv_erzet TYPE erzet.

DATA: ls_aux_vbrk TYPE st_inv_hd.


DATA: lv_ernam TYPE ernam.

READ TABLE it_inv_vbrk


INTO ls_aux_vbrk
WITH KEY vbeln = lv_vbeln.

IF sy-subrc <> 0.
SELECT SINGLE ernam "erzet erdat
FROM vbrk
INTO lv_ernam
WHERE vbeln = lv_vbeln.
ELSE.
lv_ernam = ls_aux_vbrk-ernam.
ENDIF.
CONCATENATE lv_erdat+0(4)
'-'
lv_erdat+4(2)
'-'
lv_erdat+6(2)
'T'
lv_erzet+0(2)
':'
lv_erzet+2(2)
':'
lv_erzet+4(2)
INTO wa_inv_hd-inv_status_date.

wa_inv_hd-inv_stat_user = lv_ernam.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form prepare_inv_list_status 34_F
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM prepare_inv_list_status.

TYPES:
BEGIN OF st_inv_list_canc,
vbtyp TYPE vbrk-vbtyp,
sfakn TYPE vbrk-sfakn,
END OF st_inv_list_canc.

DATA lt_vbrk_aux TYPE TABLE OF st_inv_hd.


DATA ls_inv_list_canc TYPE st_inv_list_canc.
DATA lv_vbeln TYPE vbrk-vbeln.

FIELD-SYMBOLS <fs_vbrk_aux> TYPE st_inv_hd.

READ TABLE it_inv_vbrk


WITH KEY fktyp = 'R'
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
lt_vbrk_aux = it_inv_vbrk.

"delete all invoices except invoice list


DELETE lt_vbrk_aux
WHERE fktyp NE 'R'.
*****35_F begin
****************************************************
*looks for the cancelation invoice list(s)
*which should not be reported
****************************************************
"loops at first inv list create from each chain
* LOOP AT lt_vbrk_aux
* ASSIGNING <fs_vbrk_aux>
* WHERE sfakn IS NOT INITIAL.
*
* lv_vbeln = <fs_vbrk_aux>-sfakn.
*
* DO.
* SELECT SINGLE vbtyp sfakn
* FROM vbrk
* INTO ls_inv_list_canc
* WHERE vbeln = lv_vbeln.
*
* IF sy-subrc = 0.
* IF ls_inv_list_canc-sfakn IS NOT INITIAL.
* "changes vbeln in order to go up in the chain
* lv_vbeln = ls_inv_list_canc-sfakn.
* ELSE.
* "reached master
* "if diferent is a cancelation inv list (not to be reported)
* IF <fs_vbrk_aux>-vbtyp NE ls_inv_list_canc-vbtyp.
* DELETE it_inv_vbrk WHERE vbeln = <fs_vbrk_aux>-vbeln.
* DELETE lt_vbrk_aux WHERE vbeln = <fs_vbrk_aux>-vbeln.
* "update section totals
* gv_invoice_no = gv_invoice_no - 1.
* ENDIF.
* EXIT.
* ENDIF.
* ELSE.
* EXIT.
* ENDIF.
* ENDDO.
* ENDLOOP.
****35_F end

IF lt_vbrk_aux IS NOT INITIAL.


"gets invoice list cancelation chain
SELECT vbeln sfakn
FROM vbrk
INTO CORRESPONDING FIELDS OF TABLE gt_vbrk_inv_list
FOR ALL ENTRIES IN lt_vbrk_aux
WHERE bukrs = lt_vbrk_aux-bukrs
AND fktyp = 'R'
AND sfakn = lt_vbrk_aux-vbeln. "#EC CI_NOFIELD

SORT gt_vbrk_inv_list BY sfakn.


ENDIF.

FREE lt_vbrk_aux.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form adjust_total_tax_like_material 38_F
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM adjust_total_tax_like_material using p_netwr TYPE WERTV9
p_tax type WERTV9.

data: ls_inv_lne like line of it_inv_lnes.


data: lv_KOAID type KOAID.
* data: lv_kwert type KWERT. "75_F
data: lv_kwert TYPE p LENGTH 16 DECIMALS 2. "75_F
* --> Begin of 89_F
* -- Commented (replaced by form GET_TABLE_SD_CONDITION)
* DATA: lv_tabname type string.
*
* lv_tabname = clfieu_generic_saft=>get_table_sd_condition( ). "55_F
* <-- End of 89_F

loop at IT_INV_LNES into ls_inv_lne where bukrs = WA_INV_VBRK-bukrs


and invoice_no = WA_INV_VBRK-vbeln
and taxlike_mat_ind = 'X'.
clear: lv_kwert, lv_KOAID.
* SELECT single KOAID kwert into (lv_KOAID, lv_kwert) FROM (lv_tabname)
"55_F "89_F
SELECT single KOAID kwert into (lv_KOAID, lv_kwert) FROM (gv_tabname)
"89_F
WHERE KNUMV = ls_inv_lne-knumv
AND KPOSN = ls_inv_lne-KPOSN
AND KAPPL = ls_inv_lne-kappl
AND KSCHL = ls_inv_lne-kschl.

if sy-subrc eq 0 and lv_KOAID = 'D'.


add lv_kwert to p_netwr.
subtract lv_kwert from p_tax.
endif.
endloop.
ENDFORM.

FORM discount_info_item TABLES pt_disc USING ps_vbrp LIKE LINE OF it_vbrp .

DATA: wa_disc_ind TYPE ty_disc.


DATA: lv_knumv TYPE knumv.

SELECT SINGLE knumv INTO lv_knumv FROM vbrk


WHERE vbeln = ps_vbrp-vbeln_vf.

IF it_inv_discounts IS NOT INITIAL.


READ TABLE it_inv_discounts
ASSIGNING <fs_wa_inv_discounts>
WITH KEY knumv = lv_knumv
kschl = 'SKTO'
kposn = ps_vbrp-posnr_vf BINARY SEARCH.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING wa_inv_lnes TO wa_disc_ind.
wa_disc_ind-vbeln_vf = ps_vbrp-vbeln_vf.
wa_disc_ind-posnr_vf = ps_vbrp-posnr_vf.
wa_disc_ind-kschl = <fs_wa_inv_discounts>-kschl.
wa_disc_ind-kwert = ABS( <fs_wa_inv_discounts>-kwert ) .
APPEND wa_disc_ind TO pt_disc.
ENDIF.
ENDIF.

ENDFORM. "discount_info_item
*&---------------------------------------------------------------------*
*& Form build_inv_status_date
*&---------------------------------------------------------------------*
*& text 54_F
*&---------------------------------------------------------------------*
*& --> WA_INV_VBRK
*& <-- WA_INV_HD_INV_STATUS_DATE
*&---------------------------------------------------------------------*
FORM build_inv_status_date USING p_vbrk type st_inv_hd
CHANGING p_inv_status_date type FIPT_STATDATE.
DATA ls_comwa type VBCO6.
DATA: lv_tabname TYPE tabname.
STATICS: NEW_TABLE TYPE REF TO DATA,
NEW_LINE TYPE REF TO DATA.
FIELD-SYMBOLS: <L_TABLE> TYPE TABLE,
<LINE> TYPE ANY.
FIELD-SYMBOLS: <erdat> type erdat,
<ERZET> type ERZET.

lv_tabname = clfieu_generic_saft=>get_table_flow_cond( ).
if NEW_TABLE is INITIAL.
CREATE DATA NEW_TABLE TYPE TABLE OF (lv_tabname).
ASSIGN NEW_TABLE->* TO <L_TABLE>.
CREATE DATA NEW_LINE LIKE LINE OF <L_TABLE>.
ENDIF.

IF <l_table> IS NOT ASSIGNED.


ASSIGN new_table->* TO <l_table>.
ENDIF.
ASSIGN NEW_LINE->* TO <LINE>.

IF p_vbrk-FKSTO is not INITIAL.


ls_comwa-VBELN = p_vbrk-vbeln.
CALL FUNCTION 'RV_ORDER_FLOW_INFORMATION'
EXPORTING
comwa = ls_comwa
no_acc_doc = 'X'
tables
vbfa_tab = <L_TABLE>
EXCEPTIONS
NO_VBFA = 1
NO_VBUK_FOUND = 2
OTHERS = 3.

IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
sort <L_TABLE> by ('ERDAT') DESCENDING ('ERZET') DESCENDING.
read TABLE <L_TABLE> into <line> INDEX 1.
if sy-subrc eq 0.

ASSIGN COMPONENT 'ERDAT' OF STRUCTURE <line> to <erdat>.


ASSIGN COMPONENT 'ERZET' OF STRUCTURE <line> to <ERZET>.
CONCATENATE <erdat>+0(4)
'-'
<erdat>+4(2)
'-'
<erdat>+6(2)
'T'
<erzet>+0(2)
':'
<erzet>+2(2)
':'
<erzet>+4(2)
INTO p_inv_status_date.
endif.

ELSE.
CONCATENATE p_vbrk-erdat+0(4)
'-'
p_vbrk-erdat+4(2)
'-'
p_vbrk-erdat+6(2)
'T'
p_vbrk-erzet+0(2)
':'
p_vbrk-erzet+2(2)
':'
p_vbrk-erzet+4(2)
INTO p_inv_status_date.
ENDIF.
if <L_TABLE> is ASSIGNED.
Clear: <L_TABLE>, <LINE>.
endif.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form read_condition
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LT_KONV
*& --> WA_INV_VBRK_KNUMV
*& --> WA_VBRP_POSNR
*&---------------------------------------------------------------------*
FORM read_condition "TABLES pt_konv STRUCTURE konv "75_F
USING p_knumv
p_posnr.
* --> Begin of 89_F
* -- Commented (replaced by form GET_TABLE_SD_CONDITION)
* DATA: lv_tabname type string.
*
* lv_tabname = clfieu_generic_saft=>get_table_sd_condition( ). "55_F
* <-- End of 89_F

REFRESH gt_cond. "75_F

SELECT kschl mwsk1 kwert


* FROM (lv_tabname) "89_F
FROM (gv_tabname) "89_F
* INTO CORRESPONDING FIELDS OF TABLE pt_konv "75_F
INTO TABLE gt_cond "75_F
WHERE knumv = wa_inv_vbrk-knumv
AND kposn = wa_vbrp-posnr
AND kappl = 'V'
AND koaid = 'D'
AND kstat = ' '.

* SORT pt_konv. "71_F "75_F


SORT gt_cond. "75_F

ENDFORM.

*&---------------------------------------------------------------------*
*& Form downpayment
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> WA_VBRP
*&---------------------------------------------------------------------*
FORM downpayment USING p_knumv
p_vbrp LIKE LINE OF it_vbrp
p_line LIKE LINE OF it_inv_lnes
p_biling_plan.

DATA: lt_komv TYPE STANDARD TABLE OF komv,


ls_komv LIKE LINE OF lt_komv. "68_F

* data: lv_string type string.


* lv_string = 'AUBEL = P_VBRP-AUBEL AND AUPOS = P_VBRP-AUPOS '.

IF p_biling_plan IS INITIAL.
CHECK cl_generic_obj->gt_kschl IS NOT INITIAL.
ENDIF.

IF cl_taxable_saft IS NOT INITIAL.


CLEAR cl_taxable_saft->gt_taxable.
cl_taxable_saft->get_taxable_data( ).
ENDIF.

* --> Begin of 68_F


CLEAR wa_inv_discounts.
* --> Get conditions from SD invoice (by item)
LOOP AT it_inv_discounts INTO wa_inv_discounts
WHERE knumv = p_knumv AND
kposn = p_vbrp-posnr.
MOVE-CORRESPONDING wa_inv_discounts TO ls_komv.
APPEND ls_komv TO lt_komv.
CLEAR: ls_komv, wa_inv_discounts.
ENDLOOP.
* --> End of 68_F

CASE p_biling_plan.
WHEN 'X'.

WHEN OTHERS.
PERFORM create_down_payment_line TABLES lt_komv
USING p_vbrp-posnr.
ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form check_downpayment_biling_plan
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> WA_INV_VBRK_VBELN
*& <-- LV_BILING_PLAN
*&---------------------------------------------------------------------*
FORM check_downpayment_biling_plan USING p_vbeln
CHANGING p_biling_plan.
* --> Begin of 68_F
* DATA : lt_vbrp_bill TYPE TABLE OF st_inv_line_items. "55_F
* DATA : ls_vbrp LIKE LINE OF lt_vbrp_bill.
*
* CLEAR: p_biling_plan.
*
* SELECT vbeln
* posnr
* matnr
* fkimg
* vrkme
* mwskz
* werks
* netwr
* mwsbp
* arktx
* erdat
* aubel
* vkbur
* vgbel "37_F
* vgpos "37_F
* augru_auft "note 29_F
* AUPOS "55_F
* fareg "55_F
* FROM vbrp INTO CORRESPONDING FIELDS OF TABLE lt_vbrp_bill
* WHERE vbeln = p_vbeln
* AND fareg BETWEEN '4' AND '5'.
*
* IF sy-subrc EQ 0.
* loop at lt_vbrp_bill into ls_vbrp.
* append ls_vbrp to it_vbrp .
* endloop.
* sort it_vbrp.
* p_biling_plan = 'X'.
* ENDIF.

DATA: ls_vbrp_bill LIKE LINE OF gt_vbrp_bill.

CLEAR: p_biling_plan.

LOOP AT gt_vbrp_bill INTO ls_vbrp_bill


WHERE vbeln = p_vbeln.
APPEND ls_vbrp_bill TO it_vbrp.
CLEAR ls_vbrp_bill.
ENDLOOP.

IF sy-subrc EQ 0.
SORT it_vbrp.
p_biling_plan = 'X'.
ENDIF.
* <-- End of 68_F

ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_down_payment_line
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LT_KOMV
*& --> P_VBRP_POSNR
*&---------------------------------------------------------------------*
FORM create_down_payment_line TABLES pt_komv STRUCTURE komv
USING p_posnr.
DATA: ls_komv TYPE komv,
ls_komv_vat TYPE komv.
DATA : lv_posnr TYPE posnr.
DATA: ls_taxable TYPE saft_pt_tax_data.
* --> Begin of 71_F
DATA lv_credit TYPE abap_bool.

* -- Identify Debit/Credit
IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL.
lv_credit = abap_true.
ELSE.
lv_credit = abap_false.
ENDIF.
* <-- End of 71_F

lv_posnr = p_posnr.
lv_posnr+0(1) = '9'.

LOOP AT pt_komv INTO ls_komv WHERE kposn = p_posnr


AND kschl IN cl_generic_obj->gt_kschl
AND kherk NE 'G'. "71_F
ADD 1 TO lv_posnr.
wa_inv_lnes-posnr = lv_posnr.

wa_inv_lnes-quantity = 1.

READ TABLE pt_komv INTO ls_komv_vat WITH KEY kposn = p_posnr


kschl = 'MWST'.
IF sy-subrc EQ 0.
READ TABLE cl_taxable_saft->gt_taxable INTO ls_taxable
WITH KEY taxcode = ls_komv_vat-mwsk1.
IF sy-subrc EQ 0.

wa_inv_lnes-taxcode = ls_taxable-taxcode.
wa_inv_lnes-taxpercent = ls_taxable-taxpercentage.
* wa_inv_lnes-taxamount = ls_komv-kwert * ls_taxable-taxpercentage /
100."71_F
wa_inv_lnes-taxamount = ls_komv-kbetr * ls_taxable-taxpercentage / 100.
"71_F
* wa_inv_lnes-unitprice_ext = ls_komv-kwert. "71_F
wa_inv_lnes-unitprice_ext = ls_komv-kbetr. "71_F

* IF wa_inv_lnes-credit_amt_ext IS NOT INITIAL. "71_F


IF lv_credit EQ abap_true. "71_F
CLEAR wa_inv_lnes-credit_amt_ext.
* wa_inv_lnes-debit_amt_ext = ls_komv-kwert. "71_F
wa_inv_lnes-debit_amt_ext = ls_komv-kbetr - wa_inv_lnes-taxamount. "71_F
gv_total_debit_sd = gv_total_debit_sd + abs( wa_inv_lnes-debit_amt_ext ).
ELSE.
CLEAR wa_inv_lnes-debit_amt_ext.
* wa_inv_lnes-credit_amt_ext = ls_komv-kwert. "71_F
wa_inv_lnes-credit_amt_ext = ls_komv-kbetr - wa_inv_lnes-taxamount."71_F
gv_total_credit_sd = gv_total_credit_sd + abs( wa_inv_lnes-credit_amt_ext
).
ENDIF.

ENDIF.
ENDIF.
APPEND wa_inv_lnes TO it_inv_lnes.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_reasoncode
*&---------------------------------------------------------------------*
*& text "56_F
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_reasoncode . "56_F
DATA: lv_rc type sy-subrc.
FIELD-SYMBOLS: <f1> TYPE any.

lv_rc = clfieu_generic_saft=>check_attr_exist( 'VBRK-STGRD' ).


CHECK lv_rc = 0.

ASSIGN COMPONENT 'STGRD' OF STRUCTURE wa_inv_vbrk TO <f1>.


IF <f1> IS ASSIGNED.
IF <f1> IS NOT INITIAL.

CLEAR ls_reasoncode_sd.

READ TABLE lt_reasoncode_sd


INTO ls_reasoncode_sd
WITH KEY stgrd = <f1>
spras = gv_bukrs_land.

IF sy-subrc <> 0.
READ TABLE lt_reasoncode_sd
INTO ls_reasoncode_sd
WITH KEY stgrd = <f1>
spras = 'EN'.

IF sy-subrc <> 0.
READ TABLE lt_reasoncode_sd
INTO ls_reasoncode_sd
WITH KEY stgrd = <f1>
spras = sy-langu.
ENDIF.
ENDIF.
"only needs a reason if canceled
wa_inv_hd-inv_stat_reason = ls_reasoncode_sd-txt40.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_FILTER_PLANTS_ABROAD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--C_VBRP text
*----------------------------------------------------------------------*
FORM check_filter_plants_abroad CHANGING ct_vbrp ct_vbrk.
DATA: lo_class TYPE REF TO cl_oo_class,
lt_interfaces TYPE seo_relkeys,
ls_interfaces TYPE seorelkey,
lo_object TYPE REF TO object,
lv_method TYPE string,
lv_classname TYPE seoclsname.

DATA: ptab TYPE abap_parmbind_tab,


ptab_line TYPE abap_parmbind,
etab TYPE abap_excpbind_tab,
etab_line TYPE abap_excpbind.

DATA: exc_ref TYPE REF TO cx_sy_dyn_call_error,


exc_ref_2 TYPE REF TO cx_class_not_existent,
exc_text TYPE string.

DATA: lv_update TYPE abap_bool. "71_F

DATA: lr_werks TYPE fieu_t_plant_range.


DATA: lt_vbrp TYPE SORTED TABLE OF st_inv_line_items WITH NON-UNIQUE KEY vbeln
posnr.
DATA: lt_vbrk TYPE TABLE OF st_inv_hd.
DATA: ls_vbrk LIKE LINE OF lt_vbrk.
DATA: dref_p TYPE REF TO data.
DATA: dref_k TYPE REF TO data.
FIELD-SYMBOLS: <ft_vbrp> type ANY TABLE.
FIELD-SYMBOLS: <ft_vbrk> type ANY TABLE.

* --> create dynamic internal tables


CREATE DATA dref_p TYPE TABLE OF st_inv_line_items.
ASSIGN dref_p->* TO <ft_vbrp>.

IF <ft_vbrp> is ASSIGNED.
<ft_vbrp> = ct_vbrp.
lt_vbrp[] = <ft_vbrp>.
ENDIF.

CREATE DATA dref_k TYPE TABLE OF st_inv_hd.


ASSIGN dref_k->* TO <ft_vbrk>.

IF <ft_vbrk> is ASSIGNED.
<ft_vbrk> = ct_vbrk.
lt_vbrk[] = <ft_vbrk>.
ENDIF.

* --> Dynamic calling of method to get Plants for PT


lv_classname = 'CLFIPT_SAFT_SD_PA'.

ptab_line-name = 'IV_BUKRS'.
ptab_line-kind = cl_abap_objectdescr=>exporting.
GET REFERENCE OF p_bukrs INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.

ptab_line-name = 'ET_WERKS_R'.
ptab_line-kind = cl_abap_objectdescr=>importing.
GET REFERENCE OF lr_werks INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.
* --> Check the class for existence
TRY.
CREATE OBJECT lo_class
EXPORTING
clsname = lv_classname
with_inherited_components = seox_true
with_interface_components = seox_true.
CATCH cx_class_not_existent INTO exc_ref_2.
ENDTRY.

IF lo_class IS NOT INITIAL.

CREATE OBJECT lo_object TYPE (lv_classname).

IF lo_object IS NOT INITIAL.

lv_method = 'GET_PLANTS_PT'.

TRY.
CALL METHOD lo_object->(lv_method)
PARAMETER-TABLE
ptab.
CATCH cx_sy_dyn_call_error INTO exc_ref.
ENDTRY.

* --> Check if plants are relevant for PT ('Plants Abroad' scenario)


* If at least one is not relevant, the invoice should be excluded,
* otherwise, the invoice should be included
IF sy-subrc EQ 0.

LOOP AT lt_vbrk INTO ls_vbrk.

CLEAR lv_update. "71_F


IF NOT lr_werks[] IS INITIAL. "71_F

LOOP AT lt_vbrp TRANSPORTING NO FIELDS


WHERE vbeln = ls_vbrk-vbeln AND
NOT werks IN lr_werks[].
EXIT.
ENDLOOP.

IF sy-subrc EQ 0.
lv_update = abap_true. "71_F
ENDIF.

ENDIF.

IF lv_update EQ abap_true "71_F


OR ls_vbrk-landtx NE 'PT' "71_F
OR lr_werks[] IS INITIAL. "71_F

DELETE lt_vbrp WHERE vbeln = ls_vbrk-vbeln.


DELETE lt_vbrk WHERE vbeln = ls_vbrk-vbeln.

IF sy-subrc EQ 0.
* -- Update the counting of docs
IF ls_vbrk-vbtyp = 'U'.
gv_invoice_no_wd = gv_invoice_no_wd - 1.
ELSE.
gv_invoice_no = gv_invoice_no - 1.
ENDIF.

ENDIF.

ENDIF.

CLEAR ls_vbrk-vbeln.

ENDLOOP.

* -- Header
<ft_vbrk> = lt_vbrk[].
ct_vbrk = <ft_vbrk>.

* -- Items
<ft_vbrp> = lt_vbrp[].
ct_vbrp = <ft_vbrp>.

ENDIF.

CLEAR lv_method.

ENDIF.

ENDIF.

ENDFORM. " CHECK_FILTER_PLANTS_ABROAD


*&---------------------------------------------------------------------*
*& Form GET_DOWNPAYMENT_BILING_PLAN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_DOWNPAYMENT_BILING_PLAN .

IF NOT it_inv_vbrk[] IS INITIAL.

SELECT vbeln
posnr
matnr
fkimg
vrkme
mwskz
werks
netwr
mwsbp
arktx
erdat
aubel
vkbur
vgbel
vgpos
augru_auft
aupos
fareg
FROM vbrp INTO CORRESPONDING FIELDS OF TABLE gt_vbrp_bill
FOR ALL ENTRIES IN it_inv_vbrk
WHERE vbeln = it_inv_vbrk-vbeln
AND fareg BETWEEN '4' AND '5'.

ENDIF.

ENDFORM. " DOWNPAYMENT_BILING_PLAN


*&---------------------------------------------------------------------*
*& Form GET_MAKTX_SD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_MAKTX_SD .

DATA lv_sylangu TYPE sy-langu.

CLEAR: it_material_tmp[].

IF it_vbrp_all[] IS NOT INITIAL.

lv_sylangu = sy-langu.

SELECT matnr maktx


spras FROM makt
INTO TABLE it_material_tmp
FOR ALL ENTRIES IN it_vbrp_all
WHERE matnr = it_vbrp_all-matnr
AND spras IN ('EN','DE', gv_langs, lv_sylangu).

ENDIF.

IF gt_vbrp_bill[] IS NOT INITIAL.

lv_sylangu = sy-langu.

SELECT matnr maktx


spras FROM makt
APPENDING TABLE it_material_tmp
FOR ALL ENTRIES IN gt_vbrp_bill
WHERE matnr = gt_vbrp_bill-matnr
AND spras IN ('EN','DE', gv_langs, lv_sylangu).

ENDIF.

SORT it_material_tmp BY matnr spras ASCENDING.

ENDFORM. " GET_MAKTX_SD


*&---------------------------------------------------------------------*
*& Form get_table_sd_condition
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- P_TABNAME
*&---------------------------------------------------------------------*
FORM get_table_sd_condition CHANGING p_tabname.
p_tabname = clfieu_generic_saft=>get_table_sd_condition( ).

TRY.
p_tabname = cl_abap_dyn_prg=>check_whitelist_str(
val = p_tabname
whitelist = clfieu_generic_saft=>gc_whitelist_sql
).
CATCH cx_abap_not_in_whitelist.
ENDTRY.

ENDFORM.

You might also like