Professional Documents
Culture Documents
RPFIEU SAFT EXT SDPROC Franca
RPFIEU SAFT EXT SDPROC Franca
gv_land_exit = gv_bukrs_land.
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.
"on HOLD added as cursor was getting closed automatically after 2 iterations -
20_F
OPEN CURSOR WITH HOLD cur_vbrk FOR SELECT
vbeln
fkart
fkdat
vbtyp
sfakn
fksto
erdat
erzet
zterm
bukrs
belnr
gjahr
waerk
fktyp
kunrg
kunag
stceg
kurrf
knumv
netwr
zlsch
vkorg
vtweg
ernam
mwsbk
rfbsk
* Selecting country information in case it needs to be appended
stceg_l
land1
fkdat_rl " invoice list 20_F
fkart_rl " invoice list 20_F
FROM vbrk
WHERE bukrs = p_bukrs
AND fkdat GE gv_first_date
AND fkdat LE gv_end_date
AND sfakn = '' . "#EC CI_NOFIELD
DO .
FETCH NEXT CURSOR cur_vbrk
INTO CORRESPONDING FIELDS OF TABLE it_inv_vbrk
PACKAGE SIZE 300.
IF sy-subrc <> 0.
EXIT.
ELSE.
*Country specific extension on header level - 19_f
PERFORM check_country_specific_exten.
ENDLOOP.
ENDIF.
SORT it_inv_vbrk .
IF it_inv_vbrk[] IS NOT INITIAL.
PERFORM update_summary_run.
CLEAR : it_inv_cond_rec[].
OPEN CURSOR cur_konv
FOR SELECT knumv
kposn
mwsk1
FROM konv
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.
EXIT.
ENDIF.
ENDDO.
* find the condition record information that is not residing in the database.
PERFORM map_inv_condn_exists.
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'.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. " GET_CONDITION_REC_INFO
*&---------------------------------------------------------------------*
*& Form GET_DISCOUNT_INFO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_discount_info .
OPEN CURSOR cur_dis
FOR SELECT knumv
kposn
kschl
mwsk1
kwert
FROM konv
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.
EXIT.
ENDIF.
ENDDO.
CLOSE CURSOR cur_dis.
gv_idx_vbrk = sy-tabix.
lv_awkey_vbeln = wa_inv_vbrk-vbeln.
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'.
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--------------------------------------------------*
SORT it_inv_vbrk.
CLEAR: lv_unitprice.
SELECT vbeln
posnr
matnr
fkimg
vrkme
mwskz
werks
netwr
mwsbp
arktx
erdat
aubel
vkbur
FROM vbrp APPENDING CORRESPONDING FIELDS OF TABLE it_vbrp
WHERE vbeln = wa_inv_vbrk-vbeln
AND kowrr = ' '
AND posar <> 'B'
AND (lv_afs_field_string).
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.
gv_invoice_no = gv_invoice_no - 1.
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.
* 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.
IF wa_vbrp-fkimg GT 0.
lv_unitprice = wa_vbrp-netwr / wa_vbrp-fkimg .
lv_unitprice = abs( lv_unitprice ).
MOVE lv_unitprice TO wa_inv_lnes-unitprice.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-unitprice.
wa_inv_lnes-unitprice = abs( wa_inv_lnes-unitprice ).
ENDIF.
*Line Document Description
MOVE wa_vbrp-arktx TO wa_inv_lnes-description_line.
IF wa_vbrp-arktx IS INITIAL .
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'.
CLEAR : gv_appln_msg.
ENDIF.
*Plant information
MOVE wa_vbrp-werks TO wa_inv_lnes-plant.
* perform get_plant_address.
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.
ENDIF.
IF gv_bukrs_land = 'PT'.
IF wa_inv_vbrk-vbtyp = 'O' OR wa_inv_vbrk-vbtyp = 'P'.
READ TABLE gt_doc_flow INTO gs_doc_flow WITH KEY vbtyp_n = 'M'.
IF sy-subrc = 0.
wa_inv_lnes-cred_note_ref = gs_doc_flow-vbeln.
SELECT SINGLE augru_auft FROM vbrp INTO lv_augru WHERE vbeln =
wa_vbrp-vbeln AND posnr = wa_vbrp-posnr.
IF sy-subrc = 0.
SELECT SINGLE bezei FROM tvaut INTO wa_inv_lnes-cred_note_rea WHERE
augru = lv_augru AND spras = 'PT'.
IF sy-subrc <> 0.
SELECT SINGLE bezei FROM tvaut INTO wa_inv_lnes-cred_note_rea
WHERE augru = lv_augru AND spras = 'EN'.
IF sy-subrc <> 0.
SELECT SINGLE bezei FROM tvaut INTO wa_inv_lnes-cred_note_rea
WHERE augru = lv_augru AND spras = sy-langu.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSEIF gv_bukrs_land = 'LU'.
IF wa_inv_vbrk-vbtyp = 'O' OR wa_inv_vbrk-vbtyp = 'P'.
READ TABLE gt_doc_flow INTO gs_doc_flow WITH KEY vbtyp_n = 'M'.
IF sy-subrc = 0.
wa_inv_lnes-cred_note_ref = gs_doc_flow-vbeln.
ENDIF.
READ TABLE gt_doc_flow INTO gs_doc_flow WITH KEY vbtyp_n = 'K'.
IF sy-subrc = 0.
SELECT SINGLE augru FROM vbak INTO lv_augru WHERE vbeln =
gs_doc_flow-docnum.
IF sy-subrc = 0.
SELECT SINGLE bezei FROM tvaut INTO wa_inv_lnes-cred_note_rea WHERE
augru = lv_augru AND spras = gv_langs.
IF sy-subrc <> 0.
SELECT SINGLE bezei FROM tvaut INTO wa_inv_lnes-cred_note_rea
WHERE augru = lv_augru AND spras = 'EN'.
IF sy-subrc <> 0.
SELECT SINGLE bezei FROM tvaut INTO wa_inv_lnes-cred_note_rea
WHERE augru = lv_augru AND spras = sy-langu.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR wa_inv_lnes.
CLEAR wa_vbrp.
IF ls_bcv-tax_line_mat_ind = 'X'.
PERFORM tax_like_material.
ENDIF.
CLEAR it_vbrp[].
CLEAR it_so_data[].
CLEAR wa_so_data.
ELSE.
DELETE it_inv_vbrk WHERE vbeln = wa_inv_vbrk-vbeln.
gv_invoice_no = gv_invoice_no - 1.
* CLEAR : wa_inv_lnes.
ENDIF.
IF lv_doc_tax_new IS NOT INITIAL.
READ TABLE it_inv_vbrk INTO wa_inv_vbrk WITH KEY vbeln = wa_inv_vbrk-vbeln.
IF sy-subrc = 0.
MOVE lv_doc_tax_new TO wa_inv_vbrk-mwsbk.
MODIFY it_inv_vbrk FROM wa_inv_vbrk TRANSPORTING mwsbk.
ENDIF.
ENDIF.
CLEAR : lv_doc_tax_new, 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
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.
*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.
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_bukrs_land, lv_sylangu).
CLEAR : gv_appln_msg.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDTRY.
IF lv_badi_updt_sd_inv IS NOT INITIAL.
TRY.
CALL METHOD cl_badi_query=>number_of_implementations
EXPORTING
badi = lv_badi_updt_sd_inv
RECEIVING
num = lv_no_of_implementation.
CATCH cx_badi_not_implemented.
ENDTRY.
ENDIF.
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.
IF lv_no_of_implementation GT 0.
CLEAR : gv_appln_msg.
ELSE.
PERFORM map_tax_info_inv_lines USING wa_inv_cond_rec-mwsk1.
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 = wa_vbrp-netwr
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amount
cv_inv_credit_amt = wa_inv_lnes-credit_amount
cv_unit_price = wa_inv_lnes-unitprice.
ENDIF.
*User exit invocation ends
wa_inv_lnes-exchangerate = wa_inv_vbrk-kursf.
wa_inv_lnes-currency = wa_inv_vbrk-waerk.
wa_inv_lnes-document_waers = gv_t001_waers.
*User specific enhancments for the adjustment of tax payable and credit amounts
IF gv_usr_exit_impl GT 0.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amount TO lv_inv_line_amt.
WHEN 'S'.
IF wa_inv_vbrk-waerk = gv_t001_waers."4_F
MOVE wa_vbrp-netwr TO wa_inv_lnes-credit_amount.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-credit_amount TO lv_inv_line_amt.
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
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amount
cv_inv_credit_amt = wa_inv_lnes-credit_amount
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.
ENDIF.
*User exit invocation ends
wa_inv_lnes-exchangerate = wa_inv_vbrk-kursf.
wa_inv_lnes-currency = wa_inv_vbrk-waerk.
wa_inv_lnes-document_waers = gv_t001_waers.
IF gv_usr_exit_impl GT 0.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amount TO lv_inv_line_amt.
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
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amount
cv_inv_credit_amt = wa_inv_lnes-credit_amount
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.
ENDIF.
*User exit invocation ends
WHEN OTHERS.
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.
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 wa_vbrp-netwr LT 0.
MOVE wa_vbrp-netwr TO wa_inv_lnes-debit_amount.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-credit_amount.
ENDIF.
IF gv_usr_exit_impl GT 0.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amount TO lv_inv_line_amt.
IF wa_inv_vbrk-waerk = gv_t001_waers."4_F
IF wa_vbrp-netwr LT 0.
MOVE wa_vbrp-netwr TO wa_inv_lnes-debit_amount.
ELSE.
MOVE wa_vbrp-netwr TO wa_inv_lnes-credit_amount.
ENDIF.
IF gv_usr_exit_impl GT 0.
CLEAR : lv_inv_line_amt.
MOVE wa_inv_lnes-debit_amount TO lv_inv_line_amt.
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
iv_inv_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amount
cv_inv_credit_amt = wa_inv_lnes-credit_amount
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.
ENDIF.
*User exit invocation ends
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.
ENDIF.
IF wa_inv_hd-inv_period IS INITIAL.
MOVE wa_inv_vbrk-monat TO wa_inv_hd-inv_period.
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.
IF wa_inv_vbrk-sfakn IS NOT INITIAL.
READ TABLE it_inv_vbrk INTO wa_inv_vbrk_tmp
WITH KEY bukrs = p_bukrs
vbeln = wa_inv_vbrk-sfakn.
.
IF sy-subrc = 0.
CONCATENATE wa_inv_vbrk_tmp-erdat+0(4)'-' wa_inv_vbrk_tmp-erdat+4(2)
'-'wa_inv_vbrk_tmp-erdat+6(2)
'T' wa_inv_vbrk_tmp-erzet+0(2)':'wa_inv_vbrk_tmp-
erzet+2(2)':'wa_inv_vbrk_tmp-erzet+4(2) INTO
ls_invstatdate.
MOVE ls_invstatdate TO wa_inv_hd-inv_status_date.
ELSE.
CLEAR wa_inv_hd-inv_status_date .
SELECT SINGLE erdat erzet ernam
FROM vbrk
INTO (ls_inv_cdate, ls_inv_ctime,ls_inv_cname )
WHERE vbeln = wa_inv_vbrk-vbeln.
IF sy-subrc <> 0..
CLEAR wa_inv_hd-inv_status_date .
ELSE.
CLEAR ls_invstatdate.
CONCATENATE ls_inv_cdate+0(4)'-' ls_inv_cdate+4(2) '-'ls_inv_cdate+6(2)
'T' ls_inv_ctime+0(2)':'ls_inv_ctime+2(2)':'ls_inv_ctime+4(2)
INTO
ls_invstatdate.
CLEAR wa_inv_hd-inv_status_date.
MOVE ls_invstatdate TO wa_inv_hd-inv_status_date.
MOVE ls_inv_cname TO wa_inv_hd-source_id.
ENDIF.
ENDIF.
ELSE.
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-inv_status_date.
ENDIF.
IF wa_inv_vbrk-sfakn IS INITIAL.
MOVE wa_inv_vbrk-ernam TO wa_inv_hd-source_id.
ELSE.
READ TABLE it_inv_vbrk INTO wa_inv_vbrk_cancel WITH KEY vbeln =
wa_inv_vbrk-sfakn.
IF sy-subrc = 0.
MOVE wa_inv_vbrk_cancel-ernam TO wa_inv_hd-inv_stat_user.
ELSE.
CLEAR ls_cancel_source_id .
CLEAR wa_inv_hd-source_id.
SELECT SINGLE ernam FROM vbrk INTO ls_cancel_source_id WHERE vbeln =
wa_inv_vbrk-sfakn.
IF sy-subrc = 0.
MOVE ls_cancel_source_id TO wa_inv_hd-inv_stat_user.
ENDIF.
ENDIF.
ENDIF.
PERFORM set_invoice_status.
CLEAR : lv_xcpdk,lv_stceg,lv_stcd1.
MOVE wa_inv_vbrk-fkart TO wa_inv_hd-inv_doctype.
IF lv_xcpdk EQ 'X'.
IF lv_stceg IS INITIAL AND lv_stcd1 IS INITIAL.
SELECT SINGLE stcd1 INTO lv_stcd1 FROM bsec WHERE bukrs = wa_inv_vbrk-
bukrs
AND belnr = wa_inv_vbrk-belnr AND gjahr = wa_inv_vbrk-
gjahr.
ENDIF.
IF NOT lv_stceg IS INITIAL.
lv_stceg = lv_stceg+2.
CONCATENATE wa_inv_hd-customerid lv_stceg INTO wa_inv_hd-customerid
SEPARATED BY '/'.
ELSEIF NOT lv_stcd1 IS INITIAL.
CONCATENATE wa_inv_hd-customerid lv_stcd1 INTO wa_inv_hd-customerid
SEPARATED BY '/'.
ELSEIF lv_stceg IS INITIAL AND lv_stcd1 IS INITIAL .
CONCATENATE wa_inv_hd-customerid '999999990' INTO wa_inv_hd-customerid
SEPARATED BY '/'.
ENDIF.
wa_inv_hd-onetime_ind = 'X'.
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_hd-customerid.
IF sy-dbcnt > 0.
IF wa_inv_vbrk-stceg_l IS INITIAL.
CONCATENATE wa_inv_hd-customerid '/' wa_inv_vbrk-land1 INTO wa_inv_hd-
customerid.
ELSE.
CONCATENATE wa_inv_hd-customerid '/' wa_inv_vbrk-stceg_l INTO
wa_inv_hd-customerid.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
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..
CLEAR : gv_appln_msg.
ENDIF.
ENDCASE.
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.
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.
"FIRST DISCOUNT
IF wa_zterm_selection-zprz1 IS NOT INITIAL.
"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.
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.
* 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.
wa_inv_hd-settle_amount_1 = ( wa_inv_hd-doc_total_gross *
wa_zterm_selection-zprz1 ) / 100.
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.
wa_inv_hd-settle_amount_2 = ( wa_inv_hd-doc_total_gross *
wa_zterm_selection-zprz2 ) / 100.
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.
ENDIF.
* perform get_customer_address.
*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
ENDLOOP.
*----------------------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.
PERFORM read_rv_likp_archive.
PERFORM map_archived_likp.
ENDIF.
*----------------------22092014--------------------------------------*
SORT it_inv_hd.
ENDIF.
CLEAR : ls_inv_vbrk.
IF wa_inv_vbrk-sfakn IS NOT INITIAL OR wa_inv_vbrk-fksto IS NOT INITIAL.
READ TABLE it_inv_vbrk
INTO ls_inv_vbrk
WITH KEY vbeln = wa_inv_vbrk-sfakn.
IF sy-subrc = 0.
CALL FUNCTION 'DETERMINE_PERIOD'
EXPORTING
date = ls_inv_vbrk-fkdat
* PERIOD_IN = '000'
version = gv_t001_periv
IMPORTING
period = ls_inv_can_period
year = ls_inv_can_year
EXCEPTIONS
period_in_not_valid = 1
period_not_assigned = 2
version_undefined = 3
OTHERS = 4.
ENDIF.
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'. " 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.
ENDIF.
IF gv_usr_exit_impl GT 0.
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.
ENDIF.
ENDFORM. " UPDATE_SAFT_TABLES
*&---------------------------------------------------------------------*
*& Form UPDATE_SUMMARY_RUN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM update_summary_run .
CLEAR : wa_summary_run.
CLEAR : it_summary_run[].
IF gv_invoice_no_arch IS NOT INITIAL.
gv_invoice_no = gv_invoice_no_arch.
ENDIF.
IF gv_invoice_no GT 0.
CLEAR : gv_appln_msg.
ENDIF.
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
*----------------------------------------------------------------------*
FORM set_ship_from .
*Case 1
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
.
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.
CHECK it_inv_dis IS NOT INITIAL.
LOOP AT it_inv_discounts INTO wa_inv_discounts.
READ TABLE it_inv_dis INTO wa_inv_dis WITH KEY kschl = 'SKTO'
kposn = wa_inv_lnes-posnr.
IF sy-subrc = 0.
MOVE wa_inv_dis-kschl TO wa_inv_lnes-kschl.
MOVE wa_inv_dis-kwert TO wa_inv_lnes-discount_amt.
ELSE.
* INVOKE BADI
ENDIF.
ENDLOOP.
ENDFORM. " MAP_DISCOUNT_INFO
*&---------------------------------------------------------------------*
*& Form GET_DOC_TOTALS_SD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_doc_totals_sd .
CLEAR:wa_inv_hd-doc_total_gross,
wa_inv_hd-doc_total_net,
wa_inv_hd-doc_total_tax.
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 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.
PERFORM read_salesorder_from_archives.
ENDIF.
ENDIF.
IF ( wa_inv_lnes-taxamount = '0.00' OR wa_inv_lnes-taxamount IS INITIAL ).
ENDIF.
ENDIF.
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 .
CATCH cx_badi_not_implemented.
ENDTRY.
ENDIF.
wa_inv_lnes-unitofmeasure = 'UN'.
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_currency = wa_inv_vbrk-waerk
iv_inv_status = wa_inv_hd-inv_status
CHANGING
cv_inv_debit_amt = wa_inv_lnes-debit_amount
cv_inv_credit_amt = wa_inv_lnes-credit_amount
cv_unit_price = wa_inv_lnes-unitprice.
ENDIF.
wa_inv_lnes-productdesc = wa_inv_lnes-description_line.
wa_inv_lnes-taxcode = wa_inv_discounts-mwsk1.
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.
APPEND wa_inv_lnes TO it_inv_lnes.
CLEAR wa_inv_lnes.
ENDIF.
ENDLOOP.
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.
ENDIF.