0% found this document useful (0 votes)
4 views50 pages

Invoice Validation Class Overview

The document outlines the class for invoice validations and methods within the Uniport III project, detailing the purpose, revision history, and various class methods for handling invoice data. Key functionalities include validation of invoice headers, processing invoice history, and checks for early closure and ETA purchase orders. The document also includes a list of change requests and their corresponding identifiers, dates, and purposes related to invoice processing.

Uploaded by

user-623220
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views50 pages

Invoice Validation Class Overview

The document outlines the class for invoice validations and methods within the Uniport III project, detailing the purpose, revision history, and various class methods for handling invoice data. Key functionalities include validation of invoice headers, processing invoice history, and checks for early closure and ETA purchase orders. The document also includes a list of change requests and their corresponding identifiers, dates, and purposes related to invoice processing.

Uploaded by

user-623220
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

Class for Invoice Validations and other Methods:

****************************************************************************
* Project : Uniport III *
* Related Application : Invoice *
* Developer : Vinay Sharma *
* Date : 28-03-2022 *
* Transport : U3DK900278 *
* Purpose : Invoice Global class *
****************************************************************************
* Revision History
* 29.03.2023 PP29032023 Uniport3 U3DK906088 Change of RFC Import
Parameters
****************************************************************************
* CR# |Identifier |Date | Transport| Developer | Purpose
*===========================================================================
*DF-1585 |U3DK909501 |
* Delegate for invoice owner becomes invoice owner if BU rejects invoice
*INC2083864|TS21052024 |21.05.2024|U3DK909794|Tajuddeen Shaik|Invoice posted
* is again came in AP queue and able to submit it again. Keeping
* an additional validation so that the posted invoice can not
* submitted again
*INC2088197|TS29052024 |29.05.2024|U3DK909906|Tajuddeen Shaik| The invoice
* creation not possible when the total amount before tax is set
* to zero. Only the tax amount needs to be paid. hence removing
* th validation on header amount before tax
*INC2086578|UC04062024 |04.06.2024|U3DK909944|Umesh Chandra|DE: Invoice
* Coding issue - 9002415472
*INC2086578|UC19062024 |19.06.2024|U3DK910144|Umesh Chandra|DE: Invoice
* Coding issue - 9002415472
*INC2094573|KC20062024 |20.06.2024|U3DK910161|Karthik Chimkod|
* GB: Error should be displayed only when Payment Block is B
*INC2101817|ST27062024 |27.06.2024|U3DK910228|Sachin Tiwari|NL-Supplier
* 340114 - blocked for payment in Uniport, not blocked in SAP
*INC2123216|MS23082024 |23.08.2024|U3DK910721|Mohit Sharma|Post processing Error
* Posting date cannot be a future date.
*INC2140013|GK04092024|04.09.2024|U3DK910836|Gopala Krishna kanugolu| Post
Processing Error
* | The tax amount must not be greater than the tax base.
*INC2142143|SS09092024|09.09.2024|U3DK910871|Sneha Singh|
* | Add duplicate validation for credit note at the time of submission
*INC2142143|SS12092024|12.09.2024|U3DK910918|Sneha Singh|
* | Add duplicate validation for credit note at the time of submission
*INC2124061|MS18092024|18.09.2024|U3DK911018|Mohit Sharma|
* |The invoice is not creating when we are two or more OSB project. Hence
* removing pspid from sort statement.
*INC2145346|SS19092024|12.09.2024|U3DK911025|Sneha Singh|
* | Remove validation Header tax amount must not be greater than Amount
before tax
*INC2149404|NP25092024|25.09.2024|U3DK910961|Nitin Pandey|
* | Post Processing Error Reoccurred - EXCEPTION COMMUNICATION_FAILURE
Error when opening an RFC
*INC2136468|MS25092024|25.09.2024|U3DK910961|Mohit Sharma|
* | Early Closure - email approval issue
*INC2136468|MS30092024|30.09.2024|U3DK911165|Mohit Sharma|
* | Early Closure - email approval issue
*INC2152768|UC02102024|02.10.2024|U3DK911186|Umesh Chandra|
* | Validation for -ve amount for PO line item
*INC2154396|MS08102024|08.10.2024|U3DK911247|Mohit Sharma|
* | In case of early closure,we are allowing to post invoice in current
date.
*INC2152768|UC09102024|09.10.2024|U3DK911257|Umesh Chandra|
* | Validation for -ve amount for PO line item_Credit note
*INC2164151|MS14112024|14.11.2024|U3DK911694|Mohit Sharma|
* | Added validation on the supplier invoice number on internal invoices
in post processing
*DF-2046 |SS18122024|18.12.2024|U3DK912015|Sneha Singh|
* | Added validation when PO owner is deactivated
****************************************************************************
CLASS zunp_cl_invoice DEFINITION
PUBLIC

FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-DATA : zi_u3invoice_ty TYPE TABLE OF zi_u3invoice.

CLASS-METHODS getdata_from_entity
IMPORTING
lt_header TYPE data
lt_items TYPE data OPTIONAL
lt_addr TYPE data OPTIONAL
lt_wht TYPE data OPTIONAL
EXPORTING ls_invhd TYPE zunp_invhd
lt_invit TYPE zunp_invit_tt
lt_invadd TYPE zunp_invadd_tt
lt_invwht TYPE zunp_invwht_tt
lt_messages TYPE z_t_message.

CLASS-METHODS check_early_closure
IMPORTING
iv_ekorg TYPE zunp_ekorg
EXPORTING
ex_live TYPE zunp_char1.

CLASS-METHODS validate_invoice_header IMPORTING is_invhd TYPE zunp_invhd


it_invit TYPE
zunp_invit_tt OPTIONAL
it_invadd TYPE
zunp_invadd_tt OPTIONAL
it_invwht TYPE
zunp_invwht_tt OPTIONAL
is_fipostupd TYPE
zi_u3invoice-fipostupd OPTIONAL
is_emailflag TYPE zunp_char1
OPTIONAL " MS30092024
EXPORTING es_invhd TYPE zunp_invhd
et_invit TYPE zunp_invit
ev_pterm TYPE z_dzterm
et_messages TYPE z_t_message
ev_live TYPE zunp_char1
" MS25092024
ev_budat TYPE budat.
" MS25092024
CLASS-METHODS invoice_history
IMPORTING
is_invhd TYPE zunp_invhd OPTIONAL
it_new_action TYPE zunp_invoice_action_hist_tt OPTIONAL
it_old_action TYPE zunp_invoice_action_hist_tt OPTIONAL
iv_email_hist TYPE zunp_flag OPTIONAL
iv_lastaction TYPE zunp_zcid OPTIONAL
EXPORTING
lt_messages TYPE z_t_message.

CLASS-METHODS invoice_amex_process
IMPORTING
is_invamex TYPE zunp_zamex_up OPTIONAL
iv_lifnr TYPE zunp_lifnr OPTIONAL
EXPORTING
ex_belnr TYPE zunp_re_belnr
et_messages TYPE z_t_message.

CLASS-METHODS eta_po_check
IMPORTING
eta_chk TYPE zunp_char1 OPTIONAL
iv_ebeln TYPE z_ebeln OPTIONAL
EXPORTING
et_messages TYPE z_t_message.

** ASL to AP
CLASS-METHODS asl_to_ap IMPORTING is_invhd TYPE zunp_invhd
it_invit TYPE zunp_invit_tt OPTIONAL
EXPORTING
ev_linflag TYPE zunp_char1
ev_accflg TYPE zunp_char1
ev_aslflg TYPE zunp_char1
ev_blgl_flg TYPE zunp_char1.

PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.

CLASS ZUNP_CL_INVOICE IMPLEMENTATION.

METHOD asl_to_ap.

*DATA(lt_invi) = it_invit .
DATA(lv_line) = lines( it_invit ).
SELECT ar_flag FROM zunp_zekorg WHERE ekorg = @is_invhd-ekorg INTO
@DATA(ar_flag).
ENDSELECT.
IF ar_flag = 'X'.

LOOP AT it_invit INTO DATA(ls_invi1)." WHERE ebeln IS NOT INITIAL.


IF ls_invi1-ebeln IS NOT INITIAL.
DATA(lv_po) = 'X'.
EXIT.
ENDIF.
ENDLOOP.

IF lv_po IS INITIAL.
IF lv_line = 1.
ev_linflag = 'X'.
ENDIF.

SELECT FROM zunp_tvarvc FIELDS name, type,numb,sign, opti, low


WHERE name = 'ZASL_AP'
AND type = 'S' INTO TABLE @DATA(lt_ktokk).

SELECT ktokk FROM zunp_zsupplr_int WHERE lifnr = @is_invhd-lifnr ORDER BY


PRIMARY KEY INTO @DATA(lv_ktokk) UP TO 1 ROWS.
ENDSELECT.

IF lv_ktokk IS NOT INITIAL AND lt_ktokk IS NOT INITIAL.


SORT lt_ktokk BY numb.
READ TABLE lt_ktokk INTO DATA(ls_ktokk) WITH KEY low = lv_ktokk BINARY
SEARCH.
IF sy-subrc = 0.
IF ls_ktokk-low = 'UMV4'.
ev_accflg = 'X'.
ELSE.
ev_accflg = 'Y'.
ENDIF.
ELSE.
CLEAR ev_accflg.
ENDIF.
ENDIF.

LOOP AT it_invit INTO DATA(ls_invi).

IF ls_invi-posid IS INITIAL AND ls_invi-kostl IS INITIAL AND ls_invi-


saknr IS NOT INITIAL.
ev_blgl_flg = 'X'.
SELECT SINGLE asl FROM zunp_zblgl
WHERE bukrs = @ls_invi-bukrs AND
saknr = @ls_invi-saknr INTO @DATA(lv_asl).
IF lv_asl IS NOT INITIAL.
ev_aslflg = 'X'.
ELSE.
CLEAR ev_aslflg .
EXIT.
ENDIF.
ELSE.
CLEAR ev_blgl_flg .
EXIT.
ENDIF.

ENDLOOP.

ENDIF.
ENDIF.
ENDMETHOD.

METHOD check_early_closure.
** check early closure
SELECT SINGLE early_closure FROM zunp_zekorg WHERE ekorg = @iv_ekorg INTO
@DATA(lv_early_closure).
IF lv_early_closure IS NOT INITIAL .
ex_live = 'X'.
ENDIF.
ENDMETHOD.

METHOD eta_po_check.
** ETA PO check
IF eta_chk IS NOT INITIAL.
DATA ls_message TYPE symsg.
DATA lt_message TYPE zunp_bapiret2_t.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '250'.
ls_message-msgty = 'E'.

APPEND ls_message TO et_messages.


ENDIF.

ENDMETHOD.

METHOD getdata_from_entity.

DATA: lcl_table TYPE REF TO cl_abap_tabledescr,


lcl_struc TYPE REF TO cl_abap_structdescr,
it_fields TYPE abap_compdescr_tab,
wa_fields TYPE abap_compdescr,
dref TYPE REF TO data,
lv_fldname TYPE string.
FIELD-SYMBOLS: <itab> TYPE any.
***********Convert header entity into table zunp_invhd header***************
CREATE DATA dref TYPE STANDARD TABLE OF zunp_invhd.
ASSIGN dref->* TO <itab>.
lcl_table ?= cl_abap_typedescr=>describe_by_data( <itab> ).
lcl_struc ?= lcl_table->get_table_line_type( ).
it_fields = lcl_struc->components.
LOOP AT lt_header ASSIGNING FIELD-SYMBOL(<fs_invhd>).
LOOP AT it_fields INTO DATA(ls_component_name).
lv_fldname = ls_component_name-name.
IF lv_fldname EQ 'MANDT' OR lv_fldname EQ 'CLIENT'.
CONTINUE.
ENDIF.
REPLACE ALL OCCURRENCES OF '_' IN lv_fldname WITH ''.
ASSIGN COMPONENT lv_fldname OF STRUCTURE <fs_invhd> TO FIELD-
SYMBOL(<lv_new_value>).
ASSIGN COMPONENT ls_component_name-name OF STRUCTURE ls_invhd TO FIELD-
SYMBOL(<lv_old_value>).
<lv_old_value> = <lv_new_value>.
ENDLOOP.

ENDLOOP.
UNASSIGN <lv_new_value>.
UNASSIGN <lv_old_value>.

***********Convert item entity into table zunp_invit item***************


DATA ls_invitm TYPE zunp_invit.
CREATE DATA dref TYPE STANDARD TABLE OF zunp_invit.
ASSIGN dref->* TO <itab>.
lcl_table ?= cl_abap_typedescr=>describe_by_data( <itab> ).
lcl_struc ?= lcl_table->get_table_line_type( ).
it_fields = lcl_struc->components.
IF lt_items IS NOT INITIAL.
LOOP AT lt_items ASSIGNING FIELD-SYMBOL(<fs_invitm>).
CLEAR ls_invitm.
LOOP AT it_fields INTO ls_component_name.
lv_fldname = ls_component_name-name.
IF lv_fldname EQ 'MANDT' OR lv_fldname EQ 'CLIENT'.
CONTINUE.
ENDIF.
REPLACE ALL OCCURRENCES OF '_' IN lv_fldname WITH ''.
ASSIGN COMPONENT lv_fldname OF STRUCTURE <fs_invitm> TO <lv_new_value>.
ASSIGN COMPONENT ls_component_name-name OF STRUCTURE ls_invitm TO
<lv_old_value>.
<lv_old_value> = <lv_new_value>.
ENDLOOP.
APPEND ls_invitm TO lt_invit.
ENDLOOP.
ENDIF.
***********Convert address entity into table zunp_invadd address***************
DATA ls_invaddr TYPE zunp_invadd.
CREATE DATA dref TYPE STANDARD TABLE OF zunp_invadd.
ASSIGN dref->* TO <itab>.
lcl_table ?= cl_abap_typedescr=>describe_by_data( <itab> ).
lcl_struc ?= lcl_table->get_table_line_type( ).
it_fields = lcl_struc->components.
IF lt_addr IS NOT INITIAL.
LOOP AT lt_addr ASSIGNING FIELD-SYMBOL(<fs_invadd>).
CLEAR ls_invaddr.
LOOP AT it_fields INTO ls_component_name.
lv_fldname = ls_component_name-name.
IF lv_fldname EQ 'MANDT' OR lv_fldname EQ 'CLIENT'.
CONTINUE.
ENDIF.
REPLACE ALL OCCURRENCES OF '_' IN lv_fldname WITH ''.
ASSIGN COMPONENT lv_fldname OF STRUCTURE <fs_invadd> TO <lv_new_value>.
ASSIGN COMPONENT ls_component_name-name OF STRUCTURE ls_invaddr TO
<lv_old_value>.
<lv_old_value> = <lv_new_value>.
ENDLOOP.
APPEND ls_invaddr TO lt_invadd.
ENDLOOP.
ENDIF.

******** Convert WHT entity into table zunp_invwht**************************


DATA ls_invwht TYPE zunp_invwht.
CREATE DATA dref TYPE STANDARD TABLE OF zunp_invwht.
ASSIGN dref->* TO <itab>.
lcl_table ?= cl_abap_typedescr=>describe_by_data( <itab> ).
lcl_struc ?= lcl_table->get_table_line_type( ).
it_fields = lcl_struc->components.
IF lt_wht IS NOT INITIAL.
LOOP AT lt_wht ASSIGNING FIELD-SYMBOL(<fs_invwht>).
CLEAR ls_invwht.
LOOP AT it_fields INTO ls_component_name.
lv_fldname = ls_component_name-name.
IF lv_fldname EQ 'MANDT' OR lv_fldname EQ 'CLIENT'.
CONTINUE.
ENDIF.
REPLACE ALL OCCURRENCES OF '_' IN lv_fldname WITH ''.
ASSIGN COMPONENT lv_fldname OF STRUCTURE <fs_invwht> TO <lv_new_value>.
ASSIGN COMPONENT ls_component_name-name OF STRUCTURE ls_invwht TO
<lv_old_value>.
<lv_old_value> = <lv_new_value>.
ENDLOOP.
APPEND ls_invwht TO lt_invwht.
ENDLOOP.
ENDIF.
ENDMETHOD.

METHOD invoice_amex_process.

DATA: lv_rfc TYPE string,


msg TYPE c LENGTH 255,
lv_text TYPE zunp_string,
lt_text TYPE TABLE OF zunp_string.

TYPES:BEGIN OF ts_podata,
flag TYPE zunp_char1,
po_no TYPE zunp_ebeln,
po_itm TYPE zunp_ebelp,
itm_txt TYPE zunp_txz01,
total_amount TYPE zunp_bp_wert1,
amount TYPE zunp_bp_wert1,
curr TYPE zunp_waers,
bedat TYPE bldat,
deldate TYPE zunp_datbi,
lifnr TYPE zunp_lifnr,
vendor_name TYPE zunp_zlifnrnam,
project TYPE zunp_ps_pspid,
projname TYPE zunp_ps_post1,
wbs_id TYPE zunp_ps_posid,
wbs TYPE zunp_ps_post1,
kostl TYPE zunp_kostl,
ccname TYPE zunp_kltxt,
saknr TYPE zunp_saknr,
glacc TYPE zunp_txt50_skat,
prctr TYPE zunp_prctr,
segment TYPE zunp_fb_segment,
vbund TYPE zunp_rassc,
bewar TYPE zunp_rmvct,
cmc TYPE zunp_char1,
zzlabel TYPE zunp_zlabel,
recoupable TYPE zunp_zrecoupable,
powner TYPE zunp_zuid,
grnuser TYPE zunp_zfullname,
wfkey TYPE zunp_zwfkey,
ihrez TYPE zunp_ihrez,
bukrs TYPE zunp_bukrs,
netpr TYPE zunp_nebtr,
zdsaknr TYPE zunp_zdsaknr,
menge TYPE zunp_znetamnt,
onetamt TYPE zunp_znetamnt,
ekorg TYPE zunp_ekorg,
app_email TYPE zunp_zuid,
po_source TYPE zunp_char2,
po_status TYPE zunp_zumgdesc,
prctr_name TYPE zunp_ltext,
END OF ts_podata,

BEGIN OF ts_po_status,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
status TYPE zunp_zumgdesc,
END OF ts_po_status,

BEGIN OF ts_qtitm,
warers TYPE waers,
banfn TYPE zunp_banfn,
bnfpo TYPE zunp_bnfpo,
bukrs TYPE zunp_bukrs,
statu TYPE zunp_status,
deduct TYPE zunp_char1,
zwbs TYPE zunp_ps_posid,
kostl TYPE zunp_kostl,
waers TYPE waers,
menge TYPE zunp_bamng,
preis TYPE zunp_preis,
meins TYPE zunp_bamei,
peinh TYPE zunp_peinh,
lfdat TYPE zunp_eindt,
splititemno TYPE zunp_bnfpo,
itemtype TYPE zunp_zitype,
serbase TYPE zunp_zserbase,
gswrt TYPE zunp_gswrt,
item_textid TYPE zunp_tdobname,
txz01 TYPE zunp_txz01,
taxcd TYPE zunp_ztaxcd,
taxprg TYPE zunp_taxprg,
zvatamnt TYPE zunp_zvatamnt,
txjcd TYPE zunp_ad_txjcd,
hstprg TYPE zunp_hstprg,
gstprg TYPE zunp_gstprg,
pstprg TYPE zunp_pstprg,
qstprg TYPE zunp_qstprg,
hst TYPE zunp_zhst,
gst TYPE zunp_zgst,
pst TYPE zunp_zpst,
qst TYPE zunp_zqst,
znetamnt TYPE zunp_znetamnt,
org_taxamt TYPE zunp_zvatamnt,
saknr TYPE zunp_saknr,
dsaknr TYPE zunp_zdsaknr,
pernr TYPE zunp_persno,
deletion TYPE zunp_flag,
orgflg TYPE zunp_zorgflg,
maxno TYPE zunp_bnfpo,
payblckd TYPE zunp_zblckd,
coder TYPE zunp_zcid,
bednr TYPE zunp_bednr,
read_only TYPE zunp_char1,
swbs TYPE zunp_ps_posid,
prctr TYPE zunp_prctr,
obdgt TYPE zunp_bp_wert1,
exch_rate TYPE zunp_ukurs_curr,
lcl_rate TYPE zunp_tfact_curr,
frn_rate TYPE zunp_ffact_curr,
app_email TYPE zunp_zuid,
app_usr TYPE zunp_zuid,
app_flg TYPE zunp_zapproval,
bud_del TYPE zunp_flag,
asl_no TYPE zunp_kunnr,
bdate TYPE zunp_dzfbdt,
contno TYPE zunp_zcontno,
ebeln TYPE zunp_ebeln,
ebelp TYPE zunp_ebelp,
grnuser TYPE zunp_zuid,
nyag TYPE zunp_char4,
rsrv TYPE zunp_char1,
reserv TYPE zunp_zresrv,
util TYPE zunp_bp_wert1,
itno TYPE zunp_ebelp,
rsrv_read TYPE zunp_wdy_boolean,
ndeduct_amt TYPE zunp_znondeductamt,
trnst TYPE zunp_bewar,
tradp TYPE zunp_vbund,
read_split TYPE zunp_wdy_boolean,
pqsplit TYPE zunp_wdy_boolean,
bdelete TYPE zunp_flag,
rpreis TYPE zunp_preis,
rsutil TYPE zunp_bp_wert1,
ocoder TYPE zunp_zcid,
sflag TYPE zunp_char1,
suptaxcd TYPE zunp_zsuptaxcd,
staxdesc TYPE zunp_txz01,
staxamt TYPE zunp_gramt,
staxprg TYPE zunp_taxprg,
sall TYPE zunp_char1,
projno TYPE zunp_ps_psphi,
wbs2 TYPE zunp_ps_posid,
wfkey TYPE zunp_zwfkey,
zzwfind TYPE zunp_zwfspind,
acctext TYPE zunp_zacctext,
zuonr TYPE zunp_dzuonr,
zuonr_ref1 TYPE zunp_dzuonr,
zuonr_ref2 TYPE zunp_dzuonr,
zuonr_ref3 TYPE zunp_xref3,
fundag TYPE zunp_zfundagy,
j_1bmatuse TYPE zunp_j_1bmatuse,
j_1bmatorg TYPE zunp_j_1bmatorg,
j_1bnbm TYPE zunp_j_1bnbmco1,
j_1bindust TYPE zunp_j_1bindus3,
dp_invno TYPE zunp_re_belnr,
dp_rebzj TYPE zunp_rebzj,
END OF ts_qtitm,

BEGIN OF ts_qtadd,
itno TYPE zunp_bnfpo,
name TYPE zunp_ad_name1,
contact TYPE zunp_ad_remark1,
street TYPE zunp_ad_street,
housenum TYPE zunp_ad_hsnm1,
street2 TYPE zunp_ad_strspp1,
street3 TYPE zunp_ad_strspp2,
street4 TYPE zunp_ad_strspp3,
street5 TYPE zunp_ad_lctn,
city TYPE zunp_ort01,
region TYPE zunp_regio,
postcode TYPE zunp_ad_pstcd1,
country TYPE zunp_land1,
pobox TYPE zunp_ad_pobx,
po_postcode TYPE zunp_pstl2,
addnum TYPE zunp_adrnr,
landx TYPE zunp_landx50,
taxjurcode TYPE zunp_ad_txjcd,
lifnr TYPE zunp_lifnr,
txjcd_txt TYPE zunp_text60,
END OF ts_qtadd.

DATA: lt_ekorg TYPE TABLE OF if_rap_query_filter=>ty_range_option,


lt_ebeln TYPE TABLE OF if_rap_query_filter=>ty_range_option,
lt_lifnr TYPE TABLE OF if_rap_query_filter=>ty_range_option,
ls_ekorg TYPE if_rap_query_filter=>ty_range_option,
ls_ebeln TYPE if_rap_query_filter=>ty_range_option,
ls_lifnr TYPE if_rap_query_filter=>ty_range_option,
lt_podata TYPE TABLE OF ts_podata,
lt_postatus TYPE TABLE OF ts_po_status,
et_qtitm TYPE TABLE OF ts_qtitm.

DATA: ls_invh TYPE zunp_invhd,


ls_invi TYPE TABLE OF zunp_invit,
lt_invi TYPE TABLE OF zunp_invit,
lt_qtadd TYPE TABLE OF zunp_zreqadd,
ls_qtadd TYPE zunp_zreqadd,
lt_invadd TYPE TABLE OF zunp_invadd,
ls_invadd TYPE zunp_invadd.

ls_ebeln-sign = 'I'.
ls_ebeln-option = 'EQ'.
ls_ebeln-low = is_invamex-ebeln.
APPEND ls_ebeln TO lt_ebeln.

************************************
ls_lifnr-sign = 'I'.
ls_lifnr-option = 'EQ'.
ls_lifnr-low = iv_lifnr.
APPEND ls_lifnr TO lt_lifnr.

************************************
ls_ekorg-sign = 'I'.
ls_ekorg-option = 'EQ'.
ls_ekorg-low = 'US00'.
APPEND ls_ekorg TO lt_ekorg.

********************************
DATA lv_rfc_obj TYPE REF TO if_rfc_dest.
DATA lv_rfc_dest TYPE rfcdest.

*********************Get Invoice no *************************************


DATA : lt_messages TYPE z_t_message,
lv_jo(10) TYPE c,
nr_number TYPE cl_numberrange_runtime=>nr_number,
lv_belnr TYPE zunp_re_belnr.

** get number range


zunp_utility_class=>get_rfcdest( IMPORTING ev_rfc_obj = lv_rfc_obj
ev_rfc_dest = lv_rfc_dest ).
CALL FUNCTION 'ZUNP_GET_NUMBER_FROM_OBJECT'
EXPORTING
iv_nr_range = '01'
iv_object = 'ZUNP_INV'
iv_quantity = '1'
IMPORTING
ev_nr_number = nr_number
et_messages = lt_messages.
zunp_utility_class=>close_rfcdest( io_rfc_dest = lv_rfc_obj ). " Close RFC

IF lt_messages IS NOT INITIAL.


READ TABLE lt_messages INTO DATA(ls_message) WITH KEY msgty = 'E' BINARY
SEARCH.
** return on error message
IF sy-subrc EQ 0.
RETURN.
ENDIF.
ELSE.
lv_jo = |{ nr_number ALPHA = OUT }|.
lv_belnr = |{ lv_jo ALPHA = IN }|.
ex_belnr = lv_belnr.
ENDIF.

************Get PO details***********************************************
IF ls_ebeln-low IS NOT INITIAL.
zunp_utility_class=>get_rfcdest( IMPORTING ev_rfc_obj = lv_rfc_obj
ev_rfc_dest = lv_rfc_dest ).
TRY.
CALL FUNCTION 'ZUNP_GET_OPENPO_DETAILS' DESTINATION lv_rfc_dest
EXPORTING
ir_ekorg = lt_ekorg
ir_ebeln = lt_ebeln
ir_lifnr = lt_lifnr
IMPORTING
et_qtitm = et_qtitm
et_qtadd = lt_qtadd
et_openpodetails = lt_podata "PP29032023
et_po_status = lt_postatus
EXCEPTIONS
system_failure = 1 MESSAGE msg
communication_failure = 2 MESSAGE msg
OTHERS = 3.
CASE sy-subrc.
WHEN 1.
APPEND TEXT-001 && msg TO lt_text.
WHEN 2.
APPEND TEXT-002 && msg TO lt_text.
WHEN 3.
APPEND TEXT-003 TO lt_text.
ENDCASE.
CATCH cx_root INTO DATA(cx_root).
lv_text = cx_root->get_text( ).
APPEND lv_text TO lt_text.
ENDTRY.
zunp_utility_class=>close_rfcdest( io_rfc_dest = lv_rfc_obj ). " Close RFC
ENDIF.

DATA lv_docitem TYPE zunp_invit-buzei.


IF lt_podata IS NOT INITIAL.
" Get Requisition details
SELECT * FROM zunp_zreqitm AS reqitm RIGHT OUTER JOIN zunp_zreqadd AS reqadd
ON reqitm~banfn = reqadd~banfn AND reqitm~bnfpo = reqadd~bnfpo
WHERE ebeln = @is_invamex-ebeln AND ebelp = @is_invamex-ebelp INTO
TABLE @DATA(lt_qtdetails).
ENDIF.

LOOP AT lt_podata INTO DATA(is_pui_i) WHERE po_no = is_invamex-ebeln AND po_itm


= is_invamex-ebelp. "#EC CI_STDSEQ
lv_docitem = lv_docitem + '100'.
" Fill the invoice item details
lt_invi = VALUE #( FOR ls_qtdetails IN lt_qtdetails ( belnr = lv_belnr
buzei =
lv_docitem
ekorg = is_pui_i-
ekorg
bukrs =
ls_qtdetails-reqitm-bukrs
itemtype =
ls_qtdetails-reqitm-itemtype
serbase =
ls_qtdetails-reqitm-serbase
sgtxt =
ls_qtdetails-reqitm-txz01
ebeln = is_pui_i-
po_no
ebelp = is_pui_i-
po_itm
bednr =
ls_qtdetails-reqitm-bednr
menge =
ls_qtdetails-reqitm-menge
netpr =
is_pui_i-total_amount
effwr =
is_pui_i-total_amount
open_poamt =
is_pui_i-amount
projno =
ls_qtdetails-reqitm-projno
prctr = is_pui_i-
prctr
prtxt = is_pui_i-
projname
posid =
ls_qtdetails-reqitm-zwbs
saknr = is_pui_i-
saknr
zgldescr = is_pui_i-
glacc
kostl = is_pui_i-
kostl
zkostl = is_pui_i-
ccname
zwbs1 = is_pui_i-
wbs
wbs2 =
ls_qtdetails-reqitm-wbs2
bdate =
ls_qtdetails-reqitm-bdate
in_preis = is_pui_i-
total_amount
mwskz =
ls_qtdetails-reqitm-taxcd+0(2)
taxprg =
ls_qtdetails-reqitm-taxprg
vatamt =
ls_qtdetails-reqitm-zvatamnt
txjcd =
ls_qtdetails-reqitm-txjcd
shkzg = 'S'
codflg = 'X'
inqty = '1'
itstat = 'NEW'
nebtr =
is_invamex-nebtr
rmwwr =
is_invamex-nebtr
wfkey = is_pui_i-
wfkey
org_taxamt =
ls_qtdetails-reqitm-org_taxamt
orgflg =
ls_qtdetails-reqitm-orgflg
orgln =
ls_qtdetails-reqitm-maxno
orline =
ls_qtdetails-reqitm-splititemno
invowner =
ls_qtdetails-reqitm-app_email
lstatus =
ls_qtdetails-reqitm-lstatus
acctext =
ls_qtdetails-reqitm-acctext
nyag =
ls_qtdetails-reqitm-nyag
asl_no =
ls_qtdetails-reqitm-asl_no
pernr =
ls_qtdetails-reqitm-pernr
tradp =
ls_qtdetails-reqitm-tradp
contno =
ls_qtdetails-reqitm-contno
erfdate =
cl_abap_context_info=>get_system_date( )
erfuser = sy-uname
erftime =
cl_abap_context_info=>get_system_time( )
) ).
LOOP AT lt_qtdetails ASSIGNING FIELD-SYMBOL(<fs_qtdetails>).
MOVE-CORRESPONDING <fs_qtdetails>-reqadd TO ls_invadd.
ls_invadd-belnr = lv_belnr.
ls_invadd-buzei = '00000'.
ls_invadd-ekorg = 'US00'.
APPEND ls_invadd TO lt_invadd.
ls_invadd-belnr = lv_belnr.
ls_invadd-buzei = lv_docitem.
APPEND ls_invadd TO lt_invadd.
CLEAR: ls_invadd.
ENDLOOP.
ENDLOOP.

" Update invoice item and address details


INSERT zunp_invit FROM TABLE @lt_invi.
INSERT zunp_invadd FROM TABLE @lt_invadd.

" Fill Invoice header details


ls_invh-belnr = lv_belnr.
ls_invh-ekorg = 'US00'.
ls_invh-ebeln = 'P'. "'X'.
ls_invh-statu = 'NEW'.
ls_invh-waers = is_pui_i-curr.
ls_invh-budat = cl_abap_context_info=>get_system_date( ).
ls_invh-bldat = is_invamex-bldat.
ls_invh-phio_id = 'IV'.
ls_invh-type = 'IV'.
ls_invh-inv_type = 'ETA'.
ls_invh-ffact = 1.
ls_invh-tfact = 1.
ls_invh-imgcode = ''.
ls_invh-bukrs = is_pui_i-bukrs.
ls_invh-xblnr = is_invamex-xblnr.
ls_invh-lifnr = iv_lifnr.
CONCATENATE '*' is_invamex-chremark INTO ls_invh-item_text.
ls_invh-csc = is_invamex-csc.
ls_invh-bankn = ''.
ls_invh-bankl = ''.
ls_invh-hnet = is_invamex-nebtr.
ls_invh-gswrt = is_invamex-nebtr.

" Update invoice header table


INSERT INTO zunp_invhd VALUES @ls_invh.
CLEAR: ls_invh.

ENDMETHOD.

METHOD invoice_history.

TYPES:
BEGIN OF ty_zunp_action .
INCLUDE TYPE zunp_invoice_action_hist_s.
INCLUDE TYPE if_chdo_object_tools_rel=>ty_icdind.
TYPES END OF ty_zunp_action .
TYPES:
tt_zunp_action TYPE STANDARD TABLE OF ty_zunp_action.
DATA lt_new_header TYPE STANDARD TABLE OF zunp_invhd.
DATA ls_new_header TYPE zunp_invhd.
DATA ls_old_header TYPE zunp_invhd.
DATA upd_txt_header TYPE if_chdo_object_tools_rel=>ty_cdchngindh.
DATA upd_header TYPE if_chdo_object_tools_rel=>ty_cdchngindh.
DATA changenumber TYPE if_chdo_object_tools_rel=>ty_cdchangenr.
DATA : objectid TYPE if_chdo_object_tools_rel=>ty_cdobjectv,
utime_hr TYPE if_chdo_object_tools_rel=>ty_cduzeit,
udate_hr TYPE if_chdo_object_tools_rel=>ty_cddatum,
username_hr TYPE if_chdo_object_tools_rel=>ty_cdusername,
cdoc_upd_object TYPE if_chdo_object_tools_rel=>ty_cdchngindh VALUE 'I'.
DATA : cdchangenumber TYPE if_chdo_object_tools_rel=>ty_cdchangenr.
DATA : lt_txt_header TYPE if_chdo_object_tools_rel=>ty_cdtxt_tab,
ls_txt_header LIKE LINE OF lt_txt_header.
DATA:lt_new_action TYPE tt_zunp_action,
lt_old_action TYPE tt_zunp_action.
DATA lv_btp_id TYPE c LENGTH 12.
DATA lv_obj TYPE zunp_zwi_obj.

IF it_new_action IS NOT INITIAL.


lt_new_action = CORRESPONDING #( it_new_action ).
LOOP AT lt_new_action INTO DATA(ls_action).
ls_action-action = abap_false.
APPEND ls_action TO lt_old_action.
CLEAR ls_action.
ENDLOOP.
ENDIF.
ls_new_header = is_invhd.
** fetch invoice header details
SELECT FROM zunp_invhd "#EC CI_ALL_FIELDS_NEEDED
FIELDS *
WHERE belnr = @ls_new_header-belnr
INTO @ls_old_header.
ENDSELECT.

objectid = ls_new_header-belnr."|{ sy-mandt }| & |{ ls_new_header-belnr }|.


TRY.
username_hr =
cl_abap_context_info=>get_user_technical_name( )."cl_abap_context_info=>get_user_de
scription( ).
utime_hr = cl_abap_context_info=>get_system_time( ).
udate_hr = cl_abap_context_info=>get_system_date( ).
CATCH cx_abap_context_info_error.
"handle exception
ENDTRY.
upd_header = 'U'.
upd_txt_header = 'U'.

ls_txt_header-teilobjid = objectid.
ls_txt_header-textart = 'CHAR'.
ls_txt_header-textspr = 'E'.
ls_txt_header-updkz = 'U'.

APPEND ls_txt_header TO lt_txt_header.


CLEAR:ls_txt_header.
**** check for the communication user
IF username_hr+0(2) = 'CC'.
** check last action
IF iv_lastaction IS NOT INITIAL.
IF iv_lastaction CA '@'.
* TRANSLATE ls_new_header-lastaction TO LOWER CASE.
SELECT SINGLE userid FROM zunp_businessuservh WHERE defaultemailaddress =
@iv_lastaction
INTO @lv_btp_id.
ENDIF.

ELSE.
lv_obj = ls_new_header-belnr.
zunp_cl_zutility=>get_last_approver_id(
EXPORTING
iv_protyp = 'IV' "Process type
iv_obj = lv_obj "Document number
IMPORTING
ev_btpid = lv_btp_id " last action user
).

ENDIF.
IF lv_btp_id IS INITIAL.
lv_btp_id = ls_new_header-aenuser.
ENDIF.
username_hr = lv_btp_id.
ELSE.
username_hr = sy-uname.
ENDIF.
TRY.
** fill invoice history
IF iv_email_hist = abap_true.
zcl_zunp_invoice_chdo=>write(
EXPORTING
objectid = objectid
utime = utime_hr
udate = udate_hr
username = username_hr
object_change_indicator = cdoc_upd_object
planned_or_real_changes = 'R'
icdtxt_zunp_invoice = lt_txt_header
upd_icdtxt_zunp_invoice = upd_txt_header
upd_zunp_invhd = upd_header
xzunp_invoice_action_hist_s = lt_new_action
yzunp_invoice_action_hist_s = lt_old_action
upd_zunp_invoice_action_hist_s = upd_header
IMPORTING
changenumber = changenumber
).
ELSE.
zcl_zunp_invoice_chdo=>write(
EXPORTING
objectid = objectid
utime = utime_hr
udate = udate_hr
username = username_hr
object_change_indicator = cdoc_upd_object
planned_or_real_changes = 'R'
icdtxt_zunp_invoice = lt_txt_header
upd_icdtxt_zunp_invoice = upd_txt_header
o_zunp_invhd = ls_old_header
n_zunp_invhd = ls_new_header
upd_zunp_invhd = upd_header
xzunp_invoice_action_hist_s = lt_new_action
yzunp_invoice_action_hist_s = lt_old_action
upd_zunp_invoice_action_hist_s = upd_header
IMPORTING
changenumber = changenumber
).
ENDIF.
CATCH cx_chdo_write_error.

ENDTRY.

ENDMETHOD.

METHOD validate_invoice_header.
*** * validate header and item fields
TYPES: BEGIN OF ty_bukrs,
sign TYPE c LENGTH 1,
option TYPE c LENGTH 2,
low TYPE zunp_bukrs,
high TYPE zunp_bukrs,
END OF ty_bukrs.

DATA lt_message TYPE zunp_bapiret2_t.


DATA ls_message TYPE symsg.
DATA lv_daydiff TYPE i.
DATA lt_text TYPE string_table.
DATA lt_return TYPE zunp_bapiret2_t.
DATA: lv_ret_msg TYPE string.
DATA msg TYPE c LENGTH 255.
DATA: lv_budat TYPE budat,
lv_poflag TYPE c LENGTH 1,
lv_flag TYPE c LENGTH 1,
lv_ppclsd TYPE c LENGTH 1,
lv_processid TYPE c LENGTH 20 VALUE 'UNIPORT',
ls_header TYPE zunp_invhd,
lv_resultmsg TYPE c LENGTH 255,
lv_itmumkrs TYPE zunp_umkrs,
ls_bukrs TYPE ty_bukrs,
lt_bukrs TYPE TABLE OF ty_bukrs,
lt_codedbukrs TYPE TABLE OF ty_bukrs.

DATA lv_rfc_obj TYPE REF TO if_rfc_dest.


DATA lv_rfc_dest TYPE rfcdest.
DATA lv_pterm TYPE z_dzterm.
CONSTANTS: lc_cc_usr TYPE c LENGTH 2 VALUE 'CC'.
DATA: lv_attempts TYPE i VALUE 3. "INC2130221 #NP24082024
DATA: lt_txt TYPE string_table. "INC2130221 #NP24082024

** DF-1392 Check tax code


* DATA: lv_mwskz TYPE mwskz,
* lv_mwart TYPE zunp_mwart.
* DATA(lv_land1) = it_invit[ 1 ]-bukrs+0(2).
* IF lv_land1 IS INITIAL. "if land1 is blank, take first two char of purchase
org
* lv_land1 = is_invhd-ekorg+0(2).
* ENDIF.
* "Fetch kalsm - Tax Procedure
* IF lv_land1 IS NOT INITIAL.
* SELECT SINGLE kalsm FROM zunp_t005 WHERE land1 = @lv_land1 INTO
@DATA(lv_kalsm).
* ENDIF.
*
* DATA(lt_nitems_tmp) = it_invit.
* DELETE lt_nitems_tmp WHERE Posid = '' AND Kostl = '' AND Saknr = ''. "#EC
CI_STDSEQ
* IF lt_nitems_tmp IS NOT INITIAL.
**** select query
* SELECT FROM zunp_zprgl AS a INNER JOIN zunp_zbudget AS b
* ON b~bukrs = a~bukrs AND b~prart = a~prart
* FIELDS a~prart, a~bukrs, a~saknr, a~mwskz FOR ALL ENTRIES IN
@lt_nitems_tmp
* WHERE a~bukrs = @lt_nitems_tmp-bukrs AND a~saknr = @lt_nitems_tmp-saknr
AND b~wbs = @lt_nitems_tmp-posid INTO TABLE @DATA(lt_zprgl). "#EC
CI_FAE_NO_LINES_OK
*
* SELECT FROM zunp_zccgl FIELDS bukrs, saknr, mwskz FOR ALL ENTRIES IN
@lt_nitems_tmp
* WHERE bukrs = @lt_nitems_tmp-bukrs AND saknr = @lt_nitems_tmp-saknr INTO
TABLE @DATA(lt_zccgl). "#EC CI_FAE_NO_LINES_OK
*
* SELECT FROM zunp_zblgl FIELDS bukrs, saknr, mwskz FOR ALL ENTRIES IN
@lt_nitems_tmp
* WHERE bukrs = @lt_nitems_tmp-bukrs AND saknr = @lt_nitems_tmp-saknr INTO
TABLE @DATA(lt_zblgl). "#EC CI_FAE_NO_LINES_OK
*
* SELECT FROM zunp_taxdetail FIELDS ekorg, mwskz, kalsm, mwart FOR ALL ENTRIES
IN @lt_nitems_tmp
* WHERE ekorg = @is_invhd-ekorg AND mwskz = @lt_nitems_tmp-mwskz AND kalsm =
@lv_kalsm
* INTO TABLE @DATA(lt_taxdetail). "#EC CI_FAE_NO_LINES_OK
* ENDIF.
** end of DF-1392 Check tax code

IF is_invhd-waers IS NOT INITIAL.


** Validate the currency
SELECT SINGLE Waers FROM zunpc_sh_currency WHERE Waers = @is_invhd-waers INTO
@DATA(lv_currency). "i_currencytext
IF lv_currency IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '003'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
** Validate the bucket status
IF is_invhd-buckst IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '519'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
** Bucket status is delete, then error message
IF is_invhd-buckst = 'DELETE'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '520'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-belnr.
APPEND ls_message TO et_messages.
ENDIF.
** For US and CA address must be filled
IF ( is_invhd-ekorg = 'US00' OR is_invhd-ekorg = 'CA00' ) AND it_invadd IS
INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '141'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.

** Start of changes INC2083864


** Additional validation on SAP invoice number
IF is_invhd-invno IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '273'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-belnr.
ls_message-msgv2 = is_invhd-invno.
APPEND ls_message TO et_messages.
ENDIF.
** End of changes INC2083864

** Company code is blank, error message


IF is_invhd-bukrs IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '023'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ELSE.
** Get the tax group details
SELECT SINGLE umkrs FROM zunp_t001 WHERE bukrs = @is_invhd-bukrs INTO
@DATA(lv_umkrs).
ENDIF.
lt_codedbukrs = VALUE #( FOR <ws_item> IN it_invit ( sign = 'I'
option = 'EQ'
low = <ws_item>-bukrs )
).
** Validate the Company code and taxgroup
SELECT bukrs, umkrs FROM zunp_t001 WHERE bukrs IN @lt_codedbukrs INTO TABLE
@DATA(lt_t001).
SORT lt_t001 BY bukrs ASCENDING.
IF is_invhd-waers IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '026'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
** Amount before Tax should not be blank
** start of code comment - INC2088197|TS29052024
* IF is_invhd-hnet IS INITIAL AND is_invhd-type NE 'TX'.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '148'.
* ls_message-msgty = 'E'.
* APPEND ls_message TO et_messages.
* ENDIF.
*** end of code comment - INC2088197|TS29052024
** Gross Amount should not be blank
IF is_invhd-gswrt IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '149'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
*** Start of changes INC2145346 SS19092024
*** SOI by GK04092024 incident INC2140013 04.09.2023
** Validate amount before tax with tax amount at invoice header
* IF is_invhd-htax GT is_invhd-hnet.
* CLEAR ls_message.
* " Header tax amount must not be greater than amount before tax
* APPEND VALUE #( msgid = 'ZUNP_ZMCIV' msgno = '555' msgty = 'E' ) TO
et_messages.
* ENDIF.
*** EOI by GK04092024 incident INC2140013 04.09.2023
*** End of changes INC2145346 SS19092024
*****************For Co-op suppliers only Co-op project type lines are allowed
IF is_invhd-lifnr IS NOT INITIAL.
* SELECT ktokk FROM zunp_zsupplr_int WHERE lifnr = @is_invhd-lifnr ORDER BY
PRIMARY KEY INTO
* @DATA(lv_ktokk) UP TO 1 ROWS.
*
* ENDSELECT.
***check for non VAT supplier
SELECT SINGLE eikto, vatnum, eu_vatnum, ktokk FROM zunp_zsupplr_int
WHERE zvendnum = @is_invhd-lifnr AND purc_org = @is_invhd-ekorg
INTO ( @DATA(lv_eikto), @DATA(lv_vatnum), @DATA(lv_euvatnum),
@DATA(lv_ktokk) ).

* Start of changes INC2101817


SELECT SINGLE zahls FROM zunp_zlfb1
WHERE lifnr = @is_invhd-lifnr AND bukrs = @is_invhd-bukrs
INTO @DATA(lv_zahls).
* End of changes INC2101817

ENDIF.
***check for non VAT supplier
* SELECT vatnum, eu_vatnum FROM zunp_zsupplr_int WHERE lifnr = @is_invhd-lifnr
AND purc_org = @is_invhd-ekorg
* ORDER BY PRIMARY KEY INTO
* ( @DATA(lv_vatnum), @DATA(lv_euvatnum) ) UP TO 1 ROWS.
*
* ENDSELECT.

***********************************************************************
DATA lv_nebtr TYPE z_nebtr.
DATA lv_vatamt TYPE zunp_zvatamnt.
DATA lv_grossamt TYPE z_rmwwr.
**** movement type
IF it_invit IS NOT INITIAL.
SELECT FROM zunp_zfi_acc_tty FIELDS * FOR ALL ENTRIES IN @it_invit
WHERE saknr = @it_invit-saknr INTO TABLE @DATA(lt_tty) . "#EC
CI_ALL_FIELDS_NEEDED
ENDIF.
SORT lt_tty BY saknr trtyp validfrom ASCENDING.
** get required header details
SELECT SINGLE barcde_orgnl, aenuser FROM zunp_invhd WHERE belnr = @is_invhd-
belnr
INTO ( @DATA(lv_barcde_org), @DATA(lv_aenuser) ).

*** time zone add


DATA(lv_uname) = sy-uname.
IF lv_uname+0(2) = lc_cc_usr. "'CC'.
** incase post processing get the last changed by user
* SELECT SINGLE aenuser FROM zunp_invhd WHERE belnr = @is_invhd-belnr INTO
@DATA(lv_aenuser).
DATA(lv_user_date) = zunp_cl_zutility=>get_user_date( iv_buser = CONV
#( lv_aenuser ) ).
ELSE.
lv_user_date = zunp_cl_zutility=>get_user_date( ).
*** time zone end
ENDIF.

* IF is_invhd-fipostupd IS INITIAL. " MS23082024 for INC2123216 "SIT-0383


Final Approver allowed to change date
* * Check early closure
check_early_closure(
EXPORTING
iv_ekorg = is_invhd-ekorg
IMPORTING
ex_live = DATA(lv_live)
).
* ENDIF. " MS23082024 for INC2123216
IF lv_live = 'X'.
IF is_invhd-budat IS NOT INITIAL AND is_invhd-ekorg IS NOT INITIAL AND
is_invhd-bukrs IS NOT INITIAL.
* DATA(lv_rfc_dest) = zunp_utility_class=>get_rfc_destination( ).
zunp_utility_class=>get_rfcdest( IMPORTING ev_rfc_obj = lv_rfc_obj
ev_rfc_dest = lv_rfc_dest ).
ls_header-ekorg = is_invhd-ekorg.
ls_header-bukrs = is_invhd-bukrs.
""""""""Passing correct date of month***********
ls_header-budat = lv_user_date.
* ls_header-budat = cl_abap_context_info=>get_system_date( ).

IF is_invhd-ebeln IS NOT INITIAL.


** For invoice with PO, set the flag
lv_poflag = 'X'.
* CLEAR lt_bukrs.
* LOOP AT it_invit INTO DATA(wa_invit).
* CLEAR ls_bukrs.
* ls_bukrs-sign = 'I'.
* ls_bukrs-option = 'EQ'.
* ls_bukrs-low = wa_invit-bukrs.
* APPEND ls_bukrs TO lt_bukrs.
* ENDLOOP.
ENDIF.
** Get invoice posting date from ECC

DO lv_attempts TIMES. "INC2149404 #NP24092024

TRY.
CALL FUNCTION 'ZUNP_CHK_INVOICE_POST_DATE' DESTINATION lv_rfc_dest
EXPORTING
iv_poflag = lv_poflag
iv_flag = lv_flag
iv_processid = lv_processid
is_header = ls_header
it_bukrs = lt_codedbukrs "lt_bukrs
IMPORTING
ev_budat = lv_budat
ev_msgtext = lv_resultmsg
ev_ppclsd = lv_ppclsd
EXCEPTIONS
system_failure = 1 MESSAGE msg
communication_failure = 2 MESSAGE msg
OTHERS = 3.
CASE sy-subrc.
*Start of INC2149404 #NP24092024
WHEN 0.
CLEAR lt_txt[].
EXIT.
*End of INC2149404 #NP24092024
WHEN 1.
APPEND |EXCEPTION SYSTEM_FAILURE | && msg TO lt_text.
WAIT UP TO 1 SECONDS.
WHEN 2.
APPEND |EXCEPTION COMMUNICATION_FAILURE | && msg TO lt_text.
WAIT UP TO 1 SECONDS.
WHEN 3.
APPEND |EXCEPTION OTHERS| TO lt_text.
WAIT UP TO 1 SECONDS.
ENDCASE.

CATCH cx_root INTO DATA(cx_root).


DATA(lv_text) = cx_root->get_text( ).
APPEND lv_text TO lt_text.

ENDTRY.
ENDDO.
*** Close RFC
zunp_utility_class=>close_rfcdest( io_rfc_dest = lv_rfc_obj ).

ev_budat = lv_budat. " MS25092024


ev_live = lv_live. " MS25092024
*** code start MS30092024
DATA(lv_emailflag) = is_emailflag.

IF lv_live = 'X' AND lv_budat IS NOT INITIAL AND is_invhd-budat < lv_budat
AND lv_emailflag = 'X'.
CLEAR lv_resultmsg.
ENDIF.

*** code start MS30092024


*** code start MS08102024

IF lv_live = 'X' AND lv_budat IS NOT INITIAL AND is_invhd-budat < lv_budat
AND is_FiPostUpd IS NOT INITIAL AND is_invhd-budat = lv_user_date.
CLEAR lv_resultmsg.
ENDIF.

*** code start MS08102024

IF lv_text IS NOT INITIAL.


* IF msg IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_UNIPORT_MSG'."'ZUNP_ZMCIV'.
ls_message-msgno = '100'."'000'.
ls_message-msgty = 'E'.
ls_message-msgv1 = lv_text+0(50)."msg
ls_message-msgv2 = lv_text+50(50).
ls_message-msgv3 = lv_text+100(50).
ls_message-msgv4 = lv_text+150(50).

APPEND ls_message TO et_messages.


ELSE.
** Validate on PO posting date
IF is_invhd-budat > lv_budat AND lv_budat IS NOT INITIAL AND
lv_resultmsg IS NOT INITIAL.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '093'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
IF is_invhd-budat < lv_budat AND lv_budat IS NOT INITIAL AND
lv_resultmsg IS NOT INITIAL.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '000'.
ls_message-msgty = 'E'.
ls_message-msgv1 = lv_resultmsg+0(50).
ls_message-msgv2 = lv_resultmsg+51(100).
ls_message-msgv3 = lv_resultmsg+101(147).
* ls_message-msgv4 = lv_resultmsg+101(147).
APPEND ls_message TO et_messages.
ENDIF.
*** Added for defect DF-422, display error message if period is closed
IF is_invhd-budat = lv_budat AND lv_budat IS NOT INITIAL AND
lv_resultmsg IS NOT INITIAL AND lv_ppclsd = abap_true.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '371'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

* CLEAR: lv_user_date.
*** convert system date to user's date based on the user's time zone.
* lv_user_date = zunp_cl_zutility=>get_user_date( ).
**
** validation on invoice posting date
IF is_invhd-budat > lv_user_date AND lv_resultmsg IS INITIAL AND is_invhd-
budat <> lv_budat.
* IF is_invhd-budat > cl_abap_context_info=>get_system_date( ) AND lv_resultmsg
IS INITIAL AND is_invhd-budat <> lv_budat.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '093'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.

* Start of changes: INC2142143 SS09092024


** This condition should not be checked in postprocessing step / DF-1483 (added
is_FiPostUpd)
IF is_invhd-xblnr IS NOT INITIAL AND is_invhd-lifnr IS NOT INITIAL. "AND
is_FiPostUpd IS INITIAL. "++ is_FiPostUpd removed for INC2164151
** get document date and posting date from invoice header table
*check for already posted invoice with same supplier reference number hence
suppressed the below condition.
SELECT belnr, xblnr, invno, bldat, budat FROM zunp_invhd
WHERE belnr NE @is_invhd-belnr
AND xblnr = @is_invhd-xblnr
AND lifnr = @is_invhd-lifnr
AND statu <> 'DEL' AND statu <> 'REVS' AND statu <>
'POST' "++ Added POST for INC2086578
AND buckst <> 'DELETE' AND buckst <> 'EX-DUP'
INTO TABLE @DATA(lit_invh). "#EC CI_NOFIELD

IF sy-subrc EQ 0.
SORT lit_invh BY bldat DESCENDING.
READ TABLE lit_invh INTO DATA(lwa_invh) INDEX 1.
lv_daydiff = is_invhd-bldat - lwa_invh-bldat.
IF lv_daydiff LT 0.
lv_daydiff = lwa_invh-bldat - is_invhd-bldat.
ENDIF.
IF lv_daydiff LE 365.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
* Start of changes: INC2142143 SS12092024
IF is_invhd-type = 'IV' OR is_invhd-type = 'TX'.
ls_message-msgno = '001'.
ELSEIF is_invhd-type = 'CN'.
ls_message-msgno = '556'.
ENDIF.
* End of changes: INC2142143 SS12092024
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-xblnr.
ls_message-msgv2 = lwa_invh-belnr.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
ENDIF.
* End of changes: INC2142143 SS09092024

**** Start of code ++DF-2046 ++SS18122024


DATA(lv_systdate) = cl_abap_context_info=>get_system_date( ).
IF is_invhd-ebeln = 'P' AND it_invit IS NOT INITIAL.
SELECT validto,DefaultEmailAddress FROM zunpi_businessuser_valid
FOR ALL ENTRIES IN @it_invit
WHERE Userid = @it_invit-owner(12)
INTO TABLE @DATA(lt_validTo).

LOOP AT lt_validTo INTO DATA(ls_validTo).


" Check if the user is valid
IF ls_validTo-ValidTo IS NOT INITIAL AND
ls_validTo-ValidTo < lv_systdate.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '559'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_validto-DefaultEmailAddress.
APPEND ls_message TO et_messages.
ENDIF.
ENDLOOP.
ENDIF.
**** End of code ++DF-2046 ++SS18122024

IF is_invhd-type = 'IV' OR is_invhd-type = 'TX'.


** For Invoice, currency should not be blank
IF is_invhd-waers IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '026'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
***********Check Posting date and eralier clousre************************
IF is_invhd-budat IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '144'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.

* IF is_invhd-fipostupd IS INITIAL. "SIT-0383 Final Approver allowed to


change date
*** Check early closure
* check_early_closure(
* EXPORTING
* iv_ekorg = is_invhd-ekorg
* IMPORTING
* ex_live = DATA(lv_live)
* ).
* ENDIF.
* IF lv_live = 'X'.
* IF is_invhd-budat IS NOT INITIAL AND is_invhd-ekorg IS NOT INITIAL AND
is_invhd-bukrs IS NOT INITIAL.
** DATA(lv_rfc_dest) = zunp_utility_class=>get_rfc_destination( ).
* zunp_utility_class=>get_rfcdest( IMPORTING ev_rfc_obj = lv_rfc_obj
ev_rfc_dest = lv_rfc_dest ).
* ls_header-ekorg = is_invhd-ekorg.
* ls_header-bukrs = is_invhd-bukrs.
* """"""""Passing correct date of month***********
* ls_header-budat = cl_abap_context_info=>get_system_date( ).
* IF is_invhd-ebeln IS NOT INITIAL.
*** For invoice with PO, set the flag
* lv_poflag = 'X'.
* CLEAR lt_bukrs.
* LOOP AT it_invit INTO DATA(wa_invit).
* CLEAR ls_bukrs.
* ls_bukrs-sign = 'I'.
* ls_bukrs-option = 'EQ'.
* ls_bukrs-low = wa_invit-bukrs.
* APPEND ls_bukrs TO lt_bukrs.
* ENDLOOP.
* ENDIF.
*** Get invoice posting date from ECC
* TRY.
* CALL FUNCTION 'ZUNP_CHK_INVOICE_POST_DATE' DESTINATION lv_rfc_dest
* EXPORTING
* iv_poflag = lv_poflag
* iv_flag = lv_flag
* iv_processid = lv_processid
* is_header = ls_header
* it_bukrs = lt_bukrs
* IMPORTING
* ev_budat = lv_budat
* ev_msgtext = lv_resultmsg
* EXCEPTIONS
* system_failure = 1 MESSAGE msg
* communication_failure = 2 MESSAGE msg
* OTHERS = 3.
* CASE sy-subrc.
* WHEN 1.
* APPEND |EXCEPTION SYSTEM_FAILURE | && msg TO lt_text.
* WHEN 2.
* APPEND |EXCEPTION COMMUNICATION_FAILURE | && msg TO lt_text.
* WHEN 3.
* APPEND |EXCEPTION OTHERS| TO lt_text.
* ENDCASE.
*
*
* CATCH cx_root INTO DATA(cx_root).
* DATA(lv_text) = cx_root->get_text( ).
* APPEND lv_text TO lt_text.
*
* ENDTRY.
**** Close RFC
* zunp_utility_class=>close_rfcdest( io_rfc_dest = lv_rfc_obj ).
*
* IF lv_text IS NOT INITIAL.
** IF msg IS NOT INITIAL.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_UNIPORT_MSG'."'ZUNP_ZMCIV'.
* ls_message-msgno = '100'."'000'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = lv_text+0(50)."msg
* ls_message-msgv2 = lv_text+50(50).
* ls_message-msgv3 = lv_text+100(50).
* ls_message-msgv4 = lv_text+150(50).
*
* APPEND ls_message TO et_messages.
* ELSE.
*** Validate on PO posting date
* IF is_invhd-budat > lv_budat AND lv_budat IS NOT INITIAL AND
lv_resultmsg IS NOT INITIAL.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '093'.
* ls_message-msgty = 'E'.
* APPEND ls_message TO et_messages.
* ENDIF.
* IF is_invhd-budat < lv_budat AND lv_budat IS NOT INITIAL AND
lv_resultmsg IS NOT INITIAL.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '000'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = lv_resultmsg+0(50).
* ls_message-msgv2 = lv_resultmsg+51(100).
* ls_message-msgv3 = lv_resultmsg+101(147).
* APPEND ls_message TO et_messages.
* ENDIF.
* ENDIF.
* ENDIF.
* ENDIF.
*** validation on invoice posting date
* IF is_invhd-budat > cl_abap_context_info=>get_system_date( ) AND
lv_resultmsg IS INITIAL AND is_invhd-budat <> lv_budat.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '093'.
* ls_message-msgty = 'E'.
* APPEND ls_message TO et_messages.
* ENDIF.
** invoice reference number should not be blank
IF is_invhd-xblnr IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '024'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
** invoice document date must be filled
IF is_invhd-bldat IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '089'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
IF is_invhd-lifnr IS NOT INITIAL.
** Validate supplier
* SELECT zvendnum, zahls FROM zunp_zsupplr_int WHERE lifnr = @is_invhd-
lifnr ORDER BY PRIMARY KEY INTO @DATA(ls_lfa1) UP TO 1 ROWS. ENDSELECT.

* IF is_invhd-zlspr IS INITIAL AND lv_zahls IS NOT INITIAL AND is_fipostupd


IS INITIAL. "ls_lfa1-zahls
IF lv_zahls = 'B' AND is_fipostupd IS INITIAL. "++INC2094573
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '523'.
ls_message-msgty = 'I'. " Changes E to I' for INC2176975
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
** Document date must not greater than system date
IF is_invhd-bldat > lv_user_date.
* IF is_invhd-bldat > cl_abap_context_info=>get_system_date( ).
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '207'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.

*** This condition should not be checked in postprocessing step / DF-1483 (added
is_FiPostUpd)
* IF is_invhd-xblnr IS NOT INITIAL AND is_invhd-lifnr IS NOT INITIAL AND
is_FiPostUpd IS INITIAL.
*** get document date and posting date from invoice header table
**check for already posted invoice with same supplier reference number hence
suppressed the below condition.
* SELECT belnr, xblnr, invno, bldat, budat FROM zunp_invhd
* WHERE belnr NE @is_invhd-belnr
* AND xblnr = @is_invhd-xblnr
* AND lifnr = @is_invhd-lifnr
* AND statu <> 'DEL' AND statu <> 'REVS' AND statu
<> 'POST' "++ Added POST for INC2086578
* AND buckst <> 'DELETE' AND buckst <> 'EX-DUP'
* INTO TABLE @DATA(lit_invh). "#EC CI_NOFIELD
*
* IF sy-subrc EQ 0.
* SORT lit_invh BY bldat DESCENDING.
* READ TABLE lit_invh INTO DATA(lwa_invh) INDEX 1.
* lv_daydiff = is_invhd-bldat - lwa_invh-bldat.
* IF lv_daydiff LT 0.
* lv_daydiff = lwa_invh-bldat - is_invhd-bldat.
* ENDIF.
* IF lv_daydiff LE 365.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '001'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = is_invhd-xblnr.
* ls_message-msgv2 = lwa_invh-belnr.
* APPEND ls_message TO et_messages.
* ENDIF.
* ENDIF.
* ENDIF.
** display error if red light
**only traffic light need to check hence suppressed the below condition
READ TABLE it_invit INTO DATA(ls_item) WITH KEY lstatus = 'ICON_RED_LIGHT'.
"#EC CI_STDSEQ
IF sy-subrc EQ 0.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '097'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
**** India Localization Validations
IF is_invhd-ekorg = 'IN00'.
IF is_invhd-bupla IS NOT INITIAL AND is_invhd-secco IS NOT INITIAL AND
is_invhd-bukrs IS NOT INITIAL.
*** Business place & and Sec Code & entry are not valid for Company Code &.
SELECT COUNT(*) FROM zunp_seccode WHERE bukrs = @is_invhd-bukrs
AND seccode = @is_invhd-secco AND bplace = @is_invhd-bupla INTO
@DATA(lv_bupla_count) UP TO 1 ROWS.
IF sy-subrc <> 0 .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '455'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-bupla.
ls_message-msgv2 = is_invhd-secco.
ls_message-msgv2 = is_invhd-bukrs.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
" Place of supply & is not valid
IF is_invhd-plc_sup IS NOT INITIAL .
SELECT COUNT(*) FROM zunpi_sh_region WHERE land1 = @is_invhd-ekorg+0(2)
AND bland = @is_invhd-plc_sup
INTO @DATA(lv_plc_count) UP TO 1 ROWS.
IF sy-subrc <> 0 .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '456'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-plc_sup.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
" GST Partner & is not valid
IF is_invhd-gst_part IS NOT INITIAL .
SELECT COUNT(*) FROM zunp_zsupplr_int WHERE lifnr = @is_invhd-gst_part
INTO @DATA(lv_gstpart_cnt) UP TO 1 ROWS.
IF sy-subrc <> 0 .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '457'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-gst_part.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
" Business place is mandatory.
IF is_invhd-bupla IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '451'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
" Section code is mandatory.
IF is_invhd-secco IS INITIAL .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '452'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
" GST Partner is mandatory.
IF is_invhd-gst_part IS INITIAL .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '453'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-gst_part.
APPEND ls_message TO et_messages.
ENDIF.
" Place of supply is mandatory.
IF is_invhd-plc_sup IS INITIAL .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '454'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-gst_part.
APPEND ls_message TO et_messages.
ENDIF.
* "HSN Code Validated
* LOOP AT it_invit INTO DATA(ls_invit).
* IF ls_invit-in_con_code IS INITIAL.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '547'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = is_invhd-ekorg.
* APPEND ls_message TO et_messages.
* ELSEIF ls_invit-in_con_code IS NOT INITIAL.
* SELECT SINGLE steuc FROM zunp_t604f WHERE land1 = 'IN' AND steuc =
@ls_invit-in_con_code
* INTO @DATA(lv_steuc).
* IF sy-subrc IS NOT INITIAL.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '553'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_invit-in_con_code.
* APPEND ls_message TO et_messages.
* ENDIF.
* ENDIF.
* ENDLOOP.

ENDIF.

IF is_invhd-ekorg = 'AR00'.
** Document type is mandatory
IF is_invhd-blart IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '429'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.

** WHT amount should not be greater than invoice amount


LOOP AT it_invwht INTO DATA(ls_wht).
IF ls_wht-wht_baseamt GT is_invhd-gswrt.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '403'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-belnr.
APPEND ls_message TO et_messages.
ENDIF.
ENDLOOP.
ENDIF.
IF is_invhd-ekorg = 'BR00' AND is_invhd-nftype IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '427'.
ls_message-msgty = 'W'.
ls_message-msgv1 = is_invhd-belnr.
APPEND ls_message TO et_messages.
ENDIF.
IF is_invhd-ekorg = 'CL00'.
** Document type is mandatory
IF is_invhd-blart IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '429'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
* "Vat cost is not required WHT supplier
* LOOP AT it_invit INTO ls_item ."WHERE vatcost EQ 'V'.
* CHECK ls_item-vatcost EQ 'V'.
* READ TABLE it_invwht INTO ls_wht INDEX 1.
* IF sy-subrc IS INITIAL.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '446'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_item-buzei.
* APPEND ls_message TO et_messages.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '445'.
* ls_message-msgty = 'E'.
* APPEND ls_message TO et_messages.
* ENDIF.
* ENDLOOP.

ENDIF.

** fetch the deatils based on the invoice lineitem


IF it_invit IS NOT INITIAL.
* fetch and validate the workflow key
SELECT bukrs, wfkey, dateto FROM zunp_zwfwkey FOR ALL ENTRIES IN @it_invit
WHERE bukrs = @it_invit-bukrs AND wfkey = @it_invit-wfkey ORDER BY
PRIMARY KEY
INTO TABLE @DATA(lt_zfwkey).
IF sy-subrc EQ 0.
SORT lt_zfwkey BY bukrs wfkey ASCENDING.
ENDIF.
* validate the project budget if any
IF lv_ktokk = 'UMV7'.
" get WBS details for the project coded on the items
SELECT pspid, bukrs, wbs, prart FROM zunp_zbudget FOR ALL ENTRIES IN
@it_invit
WHERE bukrs = @it_invit-bukrs AND ( wbs = @it_invit-posid AND wbs <>
'' ) ORDER BY PRIMARY KEY
INTO TABLE @DATA(lt_budget).

** code commented start for INC2124061 MS18092024


" IF sy-subrc EQ 0.
" SORT lt_budget BY pspid bukrs wbs ASCENDING.
" ENDIF.
** code commented end for INC2124061 MS18092024
ENDIF.

** Localization logic for validations


CASE is_invhd-ekorg.
WHEN 'IN00'.
* fetch Control code for IN00
SELECT land1, steuc FROM zunp_t604f FOR ALL ENTRIES IN @it_invit
WHERE land1 = @is_invhd-ekorg+0(2) AND steuc = @it_invit-
in_con_code ORDER BY PRIMARY KEY
INTO TABLE @DATA(lt_in_con_code).
IF sy-subrc EQ 0.
SORT lt_in_con_code BY land1 steuc ASCENDING.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDIF.

** display error if tax group not matches


LOOP AT it_invit INTO ls_item.
CLEAR lv_itmumkrs.
READ TABLE lt_t001 INTO DATA(ls_t001) WITH KEY bukrs = ls_item-bukrs BINARY
SEARCH.
IF sy-subrc = 0.
lv_itmumkrs = ls_t001-umkrs.
ENDIF.
* lv_itmumkrs = VALUE #( lt_t001[ bukrs = ls_item-bukrs ]-umkrs OPTIONAL ).
IF lv_itmumkrs <> lv_umkrs AND NOT lv_itmumkrs IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '532'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
CLEAR lv_itmumkrs.
IF ls_item-shkzg = 'H'.
lv_nebtr = lv_nebtr - ls_item-nebtr.
lv_vatamt = lv_vatamt - ls_item-vatamt.
lv_grossamt = lv_grossamt - ls_item-rmwwr.
ELSE.
lv_nebtr = lv_nebtr + ls_item-nebtr.
lv_vatamt = lv_vatamt + ls_item-vatamt.
lv_grossamt = lv_grossamt + ls_item-rmwwr.
ENDIF.

***check for goods/service


IF ls_item-serbase IS INITIAL AND is_invhd-ekorg = 'US00'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '220'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.

IF ls_item-wfkey IS NOT INITIAL.


* fetch and validate the workflow key
* SELECT wfkey, dateto FROM zunp_zwfwkey WHERE wfkey = @ls_item-wfkey
ORDER BY PRIMARY KEY INTO @DATA(ls_zfwkey) UP TO 1 ROWS. ENDSELECT.
READ TABLE lt_zfwkey INTO DATA(ls_zfwkey) WITH KEY bukrs = ls_item-bukrs
wfkey = ls_item-wfkey BINARY SEARCH.
IF sy-subrc EQ 0.
IF ls_zfwkey-dateto < lv_user_date.
* IF ls_zfwkey-dateto < cl_abap_context_info=>get_system_date( ).
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '186'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-wfkey.
APPEND ls_message TO et_messages.
ENDIF.
ELSE.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '186'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-wfkey.
APPEND ls_message TO et_messages.
ENDIF.
* validate the project budget if any
IF lv_ktokk = 'UMV7' AND ls_item-posid IS NOT INITIAL.
* SELECT prart FROM zunp_zbudget WHERE wbs = @ls_item-posid ORDER BY
PRIMARY KEY INTO @DATA(lv_prart) UP TO 1 ROWS. ENDSELECT.
READ TABLE lt_budget INTO DATA(ls_budget) WITH KEY bukrs = ls_item-
bukrs wbs = ls_item-posid. " Remove binary search for INC2124061 MS18092024
* IF lv_prart <> '17' AND ls_item-posid IS NOT INITIAL.
IF ls_budget-prart IS NOT INITIAL. " Added IF/ENDIF condition for
INC2124061 MS18092024
IF ls_budget-prart <> '17' AND ls_item-posid IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '521'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF. " Added IF/ENDIF condition for INC2124061 MS18092024
* IF lv_prart = '17' AND lv_ktokk <> 'UMV7' AND is_invhd-lifnr IS NOT
INITIAL AND ls_item-posid IS NOT INITIAL.
IF ls_budget-prart = '17' AND lv_ktokk <> 'UMV7' AND is_invhd-lifnr IS
NOT INITIAL AND ls_item-posid IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '522'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
ELSE.
* validate profit center and G/L
IF ( ls_item-saknr IS NOT INITIAL AND ls_item-prctr IS NOT INITIAL ) OR
( ( ls_item-saknr IS NOT INITIAL ) AND ( ls_item-kostl IS NOT INITIAL OR ls_item-
posid IS NOT INITIAL ) ) .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '517'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ELSE.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '504'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
** Gross invoice amount can not be negative and blank
IF ls_item-rmwwr <= 0 OR ls_item-rmwwr IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '117'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
* EXIT.
ENDIF.
** display error msh on blank Tax code
IF ls_item-mwskz IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '245'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
* EXIT.
ENDIF.
IF ls_item-itstat = 'OWN' AND ls_item-open_poamt > ls_item-nebtr AND
ls_item-flinv = '' AND ls_item-invowner = sy-uname.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '248'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
* EXIT.
ENDIF.
** check for invoice amount should not be greater than open PO amount
IF ls_item-ebeln IS NOT INITIAL.
IF ls_item-nebtr > ls_item-open_poamt.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '246'.
ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
* EXIT.
ENDIF.
ENDIF.
*** validate movement type
IF ls_item-trnst IS NOT INITIAL.
READ TABLE lt_tty INTO DATA(ls_tty) WITH KEY saknr = ls_item-saknr trtyp
= ls_item-trnst BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '255'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
**** India Localization Validations HSN/SAC code validation
IF ls_item-in_con_code IS INITIAL AND is_invhd-ekorg = 'IN00'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZQUOTE'.
ls_message-msgno = '464'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
IF ls_item-in_con_code IS NOT INITIAL AND is_invhd-ekorg = 'IN00'.
* SELECT steuc FROM zunpi_sh_ctrlcode
* WHERE land1 = @is_invhd-ekorg+0(2) AND steuc = @ls_item-in_con_code
INTO @DATA(lv_in_con_code) UP TO 1 ROWS.
* ENDSELECT.
READ TABLE lt_in_con_code ASSIGNING FIELD-SYMBOL(<ls_in_con_code>)
WITH KEY land1 = is_invhd-ekorg+0(2) steuc = ls_item-in_con_code BINARY
SEARCH.
IF sy-subrc NE 0.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '262'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-in_con_code.
ls_message-msgv2 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
*********** check for non VAT supplier
IF lv_vatnum IS INITIAL AND lv_euvatnum IS INITIAL AND is_invhd-ekorg =
'GB00' AND ls_item-vatamt <> '0.00'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '259'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '258'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-mwskz.
* ls_message-msgv2 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
**** accounting description validation
IF ls_item-acctext IS INITIAL AND is_invhd-ekorg IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '124'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
** incase of vatcost, taxbase amt is filled and if profit center is blank, raise an
error
IF ls_item-nebtr IS INITIAL AND ls_item-taxbaseamt IS NOT INITIAL AND
ls_item-prctr IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZQUOTE'.
ls_message-msgno = '130'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
**********Code added by UC02102024 for INC2152768 starts
IF ls_item-shkzg = 'H' AND ls_item-ebeln IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '557'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
**********Code added by UC02102024 for INC2152768 ends

CASE is_invhd-ekorg.
WHEN 'CL00'.
IF ls_item-vatcost EQ 'V'.
READ TABLE it_invwht INTO ls_wht INDEX 1.
IF sy-subrc IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '446'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '445'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
** DF-1392 Check tax code
* CLEAR: lv_mwskz, lv_mwart.
* IF ls_item-posid IS NOT INITIAL AND ls_item-saknr IS NOT INITIAL AND
ls_item-wfkey IS NOT INITIAL.
** SELECT prart FROM zunp_zbudget WHERE bukrs = @ls_item-bukrs AND wbs =
@ls_item-posid ORDER BY PRIMARY KEY INTO @DATA(lv_prart_tx) UP TO 1 ROWS.
ENDSELECT.
* lv_mwskz = VALUE #( lt_zprgl[ bukrs = ls_item-bukrs saknr = ls_item-
saknr ]-mwskz OPTIONAL ). "#EC CI_STDSEQ
* ELSEIF ls_item-kostl IS NOT INITIAL AND ls_item-saknr IS NOT INITIAL AND
ls_item-wfkey IS NOT INITIAL.
* lv_mwskz = VALUE #( lt_zccgl[ bukrs = ls_item-bukrs saknr = ls_item-
saknr ]-mwskz OPTIONAL ). "#EC CI_STDSEQ
* ELSEIF ls_item-saknr IS NOT INITIAL AND ls_item-prctr IS NOT INITIAL AND
ls_item-wfkey IS NOT INITIAL.
* lv_mwskz = VALUE #( lt_zblgl[ bukrs = ls_item-bukrs saknr = ls_item-
saknr ]-mwskz OPTIONAL ). "#EC CI_STDSEQ
* ENDIF.
* lv_mwart = VALUE #( lt_taxdetail[ ekorg = is_invhd-ekorg mwskz = ls_item-
mwskz kalsm = lv_kalsm ]-mwart OPTIONAL ). "#EC CI_STDSEQ
* CASE lv_mwskz.
* WHEN '+'.
* IF lv_mwart NE 'A'.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '269'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_item-saknr.
* ls_message-msgv2 = ls_item-bukrs.
* ls_message-msgv3 = ls_item-mwskz.
* APPEND ls_message TO et_messages.
* ENDIF.
* WHEN '-'.
* IF lv_mwart NE 'V'.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '270'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_item-saknr.
* ls_message-msgv2 = ls_item-bukrs.
* ls_message-msgv3 = ls_item-mwskz.
* APPEND ls_message TO et_messages.
* ENDIF.
* WHEN ' '.
* IF ls_item-mwskz NE space.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '271'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_item-saknr.
* ls_message-msgv2 = ls_item-bukrs.
* ls_message-msgv3 = ls_item-mwskz.
* APPEND ls_message TO et_messages.
* ENDIF.
* WHEN '+B'.
* WHEN '-B'.
* WHEN '* '.
* WHEN '< '.
* WHEN '> '.
* WHEN OTHERS.
* IF lv_mwskz NE ls_item-mwskz.
* CLEAR ls_message.
* ls_message-msgid = 'ZUNP_ZMCIV'.
* ls_message-msgno = '272'.
* ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_item-saknr.
* ls_message-msgv2 = lv_mwskz.
* ls_message-msgv3 = ls_item-mwskz.
* APPEND ls_message TO et_messages.
* ENDIF.
* ENDCASE.
** end of DF-1392 Check tax code
ENDLOOP.
ELSEIF is_invhd-type = 'CN'.
* for credit note, error msg on blank currency
IF is_invhd-waers IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '026'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
** invoice reference number should not be blank
IF is_invhd-xblnr IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '510'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
** invoice document date must be filled
IF is_invhd-bldat IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '511'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
**** India Localization Validations
IF is_invhd-ekorg = 'IN00'.
IF is_invhd-bupla IS NOT INITIAL AND is_invhd-secco IS NOT INITIAL AND
is_invhd-bukrs IS NOT INITIAL.
*** Business place & and Sec Code & entry are not valid for Company Code &.
SELECT COUNT(*) FROM zunp_seccode WHERE bukrs = @is_invhd-bukrs
AND seccode = @is_invhd-secco AND bplace = @is_invhd-bupla INTO
@DATA(lv_bupla_count1) UP TO 1 ROWS.
IF sy-subrc <> 0 .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '455'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-bupla.
ls_message-msgv2 = is_invhd-secco.
ls_message-msgv2 = is_invhd-bukrs.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
" Place of supply & is not valid
IF is_invhd-plc_sup IS NOT INITIAL .
SELECT COUNT(*) FROM zunpi_sh_region WHERE land1 = @is_invhd-ekorg+0(2)
AND bland = @is_invhd-plc_sup
INTO @DATA(lv_plc_count1) UP TO 1 ROWS.
IF sy-subrc <> 0 .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '456'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-plc_sup.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
" GST Partner & is not valid
IF is_invhd-gst_part IS NOT INITIAL .
SELECT COUNT(*) FROM zunp_zsupplr_int WHERE lifnr = @is_invhd-gst_part
INTO @DATA(lv_gstpart_cnt1) UP TO 1 ROWS.
IF sy-subrc <> 0 .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '457'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-gst_part.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
" Business place is mandatory.
IF is_invhd-bupla IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '451'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
" Section code is mandatory.
IF is_invhd-secco IS INITIAL .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '452'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
" GST Partner is mandatory.
IF is_invhd-gst_part IS INITIAL .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '453'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-gst_part.
APPEND ls_message TO et_messages.
ENDIF.
" Place of supply is mandatory.
IF is_invhd-plc_sup IS INITIAL .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '454'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-gst_part.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
IF is_invhd-ekorg = 'AR00'.
** Document type is mandatory
IF is_invhd-blart IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '429'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.

* ** Invoice reference credit not check AR_09


* since we cant use the primary key combinations hence the below condition is
suppressed.
IF is_invhd-rebzg IS NOT INITIAL AND is_invhd-rebzj IS NOT INITIAL .
SELECT lifnr FROM zunp_invhd WHERE
invno = @is_invhd-rebzg AND
rebzj = @is_invhd-rebzj AND
bukrs = @is_invhd-bukrs ORDER
BY PRIMARY KEY INTO @DATA(lv_old_lifnr) UP TO 1 ROWS. "#EC CI_NOFIELD
ENDSELECT.

IF sy-subrc IS NOT INITIAL.


CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '550'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-rebzg.
APPEND ls_message TO et_messages.
ENDIF.

IF lv_old_lifnr NE is_invhd-lifnr.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '548'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
ENDIF.
IF it_invit IS NOT INITIAL.
* fetch and validate the workflow key
SELECT bukrs, wfkey, dateto FROM zunp_zwfwkey FOR ALL ENTRIES IN @it_invit
WHERE bukrs = @it_invit-bukrs AND wfkey = @it_invit-wfkey ORDER BY
PRIMARY KEY
INTO TABLE @DATA(lt_zfwkey_cn).
IF sy-subrc EQ 0.
SORT lt_zfwkey_cn BY bukrs wfkey ASCENDING.
ENDIF.
ENDIF.
LOOP AT it_invit INTO ls_item.
CLEAR lv_itmumkrs.
READ TABLE lt_t001 INTO ls_t001 WITH KEY bukrs = ls_item-bukrs BINARY
SEARCH.
IF sy-subrc = 0.
lv_itmumkrs = ls_t001-umkrs.
ENDIF.
* lv_itmumkrs = VALUE #( lt_t001[ bukrs = ls_item-bukrs ]-umkrs OPTIONAL ).
***check for intercompany posting
IF lv_itmumkrs <> lv_umkrs AND NOT lv_itmumkrs IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '532'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
** Validate the amounts
CLEAR lv_itmumkrs.
IF ls_item-shkzg = 'S'.
lv_nebtr = lv_nebtr - ls_item-nebtr.
lv_vatamt = lv_vatamt - ls_item-vatamt.
lv_grossamt = lv_grossamt - ls_item-rmwwr.
ELSE.
lv_nebtr = lv_nebtr + ls_item-nebtr.
lv_vatamt = lv_vatamt + ls_item-vatamt.
lv_grossamt = lv_grossamt + ls_item-rmwwr.
ENDIF.

***check for goods/service


IF ls_item-serbase IS INITIAL AND is_invhd-ekorg = 'US00'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '220'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.

IF ls_item-wfkey IS NOT INITIAL.


* fetch and validate the workflow key
* SELECT wfkey, dateto FROM zunp_zwfwkey WHERE wfkey = @ls_item-wfkey
ORDER BY PRIMARY KEY INTO @ls_zfwkey UP TO 1 ROWS. ENDSELECT.
CLEAR ls_zfwkey.
READ TABLE lt_zfwkey_cn INTO ls_zfwkey WITH KEY bukrs = ls_item-bukrs
wfkey = ls_item-wfkey BINARY SEARCH.
IF sy-subrc EQ 0.
** Document date must not greater than system date
IF ls_zfwkey-dateto < lv_user_date.
* IF ls_zfwkey-dateto < cl_abap_context_info=>get_system_date( ).
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '186'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-wfkey.
APPEND ls_message TO et_messages.
ENDIF.
ELSE.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '186'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-wfkey.
APPEND ls_message TO et_messages.
ENDIF.
ELSE.
* validate profit center and G/L
IF ( ls_item-saknr IS NOT INITIAL AND ls_item-prctr IS NOT INITIAL ) OR
( ( ls_item-saknr IS NOT INITIAL ) AND ( ls_item-kostl IS NOT INITIAL OR ls_item-
posid IS NOT INITIAL ) ) .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '517'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ELSE.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '504'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
** Gross invoice amount can not be negative and blank
IF ls_item-nebtr <= 0 OR ls_item-nebtr IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '268'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
** "Gross amount is zero on line item &
IF ls_item-rmwwr <= 0 OR ls_item-rmwwr IS INITIAL .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '117'. "Gross amount is zero on line item &
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
** display error msg on blank Tax code
IF ls_item-mwskz IS INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '247'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
**** validate movement type
IF ls_item-trnst IS NOT INITIAL.
READ TABLE lt_tty INTO ls_tty WITH KEY saknr = ls_item-saknr trtyp =
ls_item-trnst BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '255'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.

** check for creditnote amount should not be greater than open PO


amount/invoice amount
IF ls_item-ebeln IS NOT INITIAL.
IF ls_item-nebtr > ls_item-open_poamt.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '256'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
* EXIT.
ENDIF.
ENDIF.
IF ls_item-refbelnr IS NOT INITIAL.
IF ls_item-nebtr > ls_item-open_poamt.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '257'.
ls_message-msgty = 'E'.
ls_message-msgv1 = |{ ls_item-buzei ALPHA = OUT }|.
APPEND ls_message TO et_messages.
* EXIT.
ENDIF.
ENDIF.
**** India Localization Validations HSN/SAC code validation
IF ls_item-in_con_code IS INITIAL AND is_invhd-ekorg = 'IN00'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZQUOTE'.
ls_message-msgno = '464'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
*********** check for non VAT supplier
IF lv_vatnum IS INITIAL AND lv_euvatnum IS INITIAL AND is_invhd-ekorg =
'GB00' AND ls_item-vatamt <> '0.00'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '259'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '258'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-mwskz.

APPEND ls_message TO et_messages.


ENDIF.
**** accounting description validation
IF ls_item-acctext IS INITIAL AND is_invhd-ekorg IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '124'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.

**********Code added by UC09102024 for INC2152768 starts


IF ls_item-shkzg = 'S' AND ls_item-ebeln IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '557'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
**********Code added by UC09102024 for INC2152768 ends

ENDLOOP.
** Check if AP to ASL ==> Credit note posting not allowed against royalty invoices
zunp_cl_invoice=>asl_to_ap(
EXPORTING
is_invhd = is_invhd
it_invit = it_invit
IMPORTING
ev_linflag = DATA(lv_linflag)
ev_accflg = DATA(lv_accflg)
ev_aslflg = DATA(lv_aslflg)
ev_blgl_flg = DATA(lv_blgl_flg)
).
** if AP to ASL functionality is activated, then error message
IF lv_accflg IS NOT INITIAL AND lv_aslflg IS NOT INITIAL AND lv_blgl_flg IS
NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '448'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
"Localisition for Russia country validation for contract number
IF is_invhd-ekorg = 'RU00' AND is_invhd-intcnum IS NOT INITIAL.
SELECT SINGLE intcnum,lifnr FROM zunp_j_3rfcnt
WHERE bukrs = @is_invhd-bukrs AND intcnum = @is_invhd-intcnum INTO
@DATA(ls_j_3rfcnt).

IF is_invhd-intcnum <> ls_j_3rfcnt-intcnum.


CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '458'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-intcnum.
APPEND ls_message TO et_messages.
ENDIF.
IF is_invhd-lifnr <> ls_j_3rfcnt-lifnr.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '459'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-lifnr.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.

"Validate Supplier

SELECT SINGLE lifnr,loevm, sperr, sperm


FROM zunp_zlfa1 WHERE lifnr = @is_invhd-lifnr INTO @DATA(ls_zlfa1).
IF ls_zlfa1-loevm EQ abap_true OR ls_zlfa1-sperr EQ abap_true OR ls_zlfa1-sperm
EQ abap_true.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '101'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-lifnr.
APPEND ls_message TO et_messages.
ENDIF.

SELECT SINGLE lifnr,bukrs,loevm, sperr


FROM zunp_zlfb1 WHERE lifnr = @is_invhd-lifnr AND
bukrs = @is_invhd-bukrs INTO @DATA(ls_zlfb1).
IF ls_zlfb1-loevm EQ abap_true OR ls_zlfb1-sperr EQ abap_true.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '545'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_zlfb1-lifnr.
ls_message-msgv2 = ls_zlfb1-bukrs.
APPEND ls_message TO et_messages.
ENDIF.

* SELECT SINGLE eikto


* FROM zunp_zsupplr_int WHERE zvendnum = @is_invhd-lifnr AND purc_org =
@is_invhd-ekorg
* INTO @DATA(lv_eikto).
*** AP user can't submit PUI invoice with rush indicator
IF ( ( lv_eikto EQ 'PEI' OR lv_eikto EQ 'PUI' ) AND ( is_invhd-rush_ind NE
'X' ) AND ( is_invhd-barcde+0(2) NE 'PU' ) ).
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '184'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-lifnr.
ls_message-msgv2 = is_invhd-ekorg.
APPEND ls_message TO et_messages.
ENDIF.

IF lv_eikto EQ 'PII'.
SELECT SINGLE pii_grdat FROM zunp_zekorg WHERE ekorg = @is_invhd-ekorg INTO
@DATA(lv_grdat).
DATA(lv_date) = lv_user_date.
* DATA(lv_date) = cl_abap_context_info=>get_system_date( ).
IF lv_grdat < lv_date. "sy-datum.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '184'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-lifnr.
ls_message-msgv2 = is_invhd-ekorg.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.
"SCB Indicataor
IF is_invhd-lzbkz IS NOT INITIAL.
SELECT SINGLE lzbkz FROM zunp_t015l WHERE lzbkz = @is_invhd-lzbkz INTO
@DATA(lv_lzbkz).
IF sy-subrc IS NOT INITIAL AND lv_lzbkz+0(1) EQ is_invhd-ekorg+0(1) .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '546'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-lzbkz.
ENDIF.
ENDIF.
* validate net amounts
IF lv_nebtr NE is_invhd-hnet.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '513'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
* validate tax amount
IF lv_vatamt NE is_invhd-htax.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '514'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
* validate gross amount
IF lv_grossamt NE is_invhd-gswrt.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '035'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ls_item-buzei.
APPEND ls_message TO et_messages.
ENDIF.
*******************Code added for INC2086578
starts************************************
READ TABLE et_messages INTO DATA(es_messages) WITH KEY msgno = '504'.
IF sy-subrc IS INITIAL.
DATA(lv_flag1) = abap_true.
ENDIF.
*******************Code added for INC2086578
ends************************************
* If et_messages is INITIAL. " Added for DF-344, to avoid multiple messages
of the same error
IF et_messages IS INITIAL OR lv_flag1 IS NOT INITIAL. "++INC2086578
zunp_utility_class=>get_rfcdest( IMPORTING ev_rfc_obj = lv_rfc_obj
ev_rfc_dest = lv_rfc_dest ).
** validate invoice from ECC
DO lv_attempts TIMES. "INC2149404 #NP24092024
TRY.
CLEAR ev_pterm.
ev_pterm = is_invhd-zterm. "pass the payment term for Shitauke-hou
supplier
CALL FUNCTION 'ZUNP_INVOICE_VALIDATE' DESTINATION lv_rfc_dest
EXPORTING
is_header = is_invhd
it_items = it_invit
it_adds = it_invadd
iv_apprv = COND #( WHEN is_invhd-statu = 'WFL' THEN
abap_true ELSE abap_false )
IMPORTING
et_error = lt_text
et_return = lt_return
CHANGING
cv_pterm = ev_pterm
EXCEPTIONS
system_failure = 1 MESSAGE msg
communication_failure = 2 MESSAGE msg
OTHERS = 3.
CASE sy-subrc.
*Start of INC2149404 #NP24092024
WHEN 0.
CLEAR lt_txt[].
EXIT.
*End of INC2149404 #NP24092024
WHEN 1.
APPEND |EXCEPTION SYSTEM_FAILURE | && msg TO lt_text.
WAIT UP TO 1 SECONDS.
WHEN 2.
APPEND |EXCEPTION COMMUNICATION_FAILURE | && msg TO lt_text.
WAIT UP TO 1 SECONDS.
WHEN 3.
APPEND |EXCEPTION OTHERS| TO lt_text.
WAIT UP TO 1 SECONDS.
ENDCASE.

CATCH cx_root INTO cx_root.


lv_text = cx_root->get_text( ).
* APPEND lv_text TO lt_text.
ENDTRY.
ENDDO.
*** Close RFC
zunp_utility_class=>close_rfcdest( io_rfc_dest = lv_rfc_obj ).

IF lv_text IS NOT INITIAL.


* IF msg IS NOT INITIAL.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_UNIPORT_MSG'."'ZUNP_ZMCIV'.
ls_message-msgno = '100'."'000'.
ls_message-msgty = 'E'.
ls_message-msgv1 = lv_text+0(50)."msg
ls_message-msgv2 = lv_text+50(50).
ls_message-msgv3 = lv_text+100(50).
ls_message-msgv4 = lv_text+150(50).

APPEND ls_message TO et_messages.


ENDIF.
ENDIF. """End of IF in line 1240

DELETE ADJACENT DUPLICATES FROM lt_text.


* display error messages returned form ECC
LOOP AT lt_text INTO DATA(ls_text).
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '000'.
ls_message-msgty = 'E'.
* ls_message-msgv1 = ls_text. "--INC2086578
*********Code added by UC19062024 for INC2086578 starts**************
lv_ret_msg = ls_text .
CALL FUNCTION 'ZUNP_STRING_SPLIT'
EXPORTING
iv_input_string = lv_ret_msg
iv_max_length = 50
IMPORTING
ev_msgv1 = ls_message-msgv1
ev_msgv2 = ls_message-msgv2
ev_msgv3 = ls_message-msgv3
ev_msgv4 = ls_message-msgv4.
APPEND ls_message TO et_messages.
CLEAR: lv_ret_msg.
*********Code added by UC19062024 for INC2086578 ends**************
ENDLOOP.
* Display error/warning/info messages returned form ECC for AP to ASL process
LOOP AT lt_return INTO DATA(ls_return).
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '000'.
ls_message-msgty = ls_return-type.
* cl_message_helper=>set_msg_vars_for_clike( ls_return-message ).
lv_ret_msg = CONV #( ls_return-message ).
CALL FUNCTION 'ZUNP_STRING_SPLIT'
EXPORTING
iv_input_string = lv_ret_msg
iv_max_length = 50
IMPORTING
ev_msgv1 = ls_message-msgv1
ev_msgv2 = ls_message-msgv2
ev_msgv3 = ls_message-msgv3
ev_msgv4 = ls_message-msgv4.
APPEND ls_message TO et_messages.
CLEAR: ls_return, lv_ret_msg.
ENDLOOP.
*******barcode string length validation**********
DATA(lv_leng) = strlen( is_invhd-barcde ).
SELECT SINGLE ekorg, barchk FROM zunp_zbarchk WHERE ekorg EQ @is_invhd-ekorg
INTO @DATA(lwa_barchk).
IF sy-subrc EQ 0.
* SELECT SINGLE barcde_orgnl FROM zunp_invhd WHERE belnr EQ @is_invhd-belnr
INTO @DATA(lv_barcde_org).
IF lv_leng NE lwa_barchk-barchk AND lv_barcde_org CA 'IV%' AND is_invhd-
inv_type NE 'PEI' AND is_invhd-inv_type NE 'PUI' .
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '082'.
ls_message-msgty = 'E'.
ls_message-msgv1 = lwa_barchk-barchk.
APPEND ls_message TO et_messages.
EXIT.
ENDIF.
ENDIF.

***********Main Vendor's bank account******************************


IF is_invhd-bankn IS NOT INITIAL.
IF is_invhd-lifnr IS NOT INITIAL AND is_invhd-lnrza IS INITIAL.
SELECT zvendnum, bankn FROM zunp_zsupbnk_int
WHERE zvendnum = @is_invhd-lifnr
AND bankn = @is_invhd-bankn
INTO TABLE @DATA(lt_supbnk).
** With smaller tables, the sort/binary search effort is generally not worth
it, hence suppressed with pseudo comment
* READ TABLE lt_supbnk ASSIGNING FIELD-SYMBOL(<ls_supbnk>) WITH KEY bankn =
is_invhd-bankn. "#EC CI_STDSEQ
** error message on validation fail
IF sy-subrc <> 0.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '215'.
ls_message-msgty = 'E'.
ls_message-msgv1 = is_invhd-bankn.
APPEND ls_message TO et_messages.
EXIT.
ENDIF.
ENDIF.
ENDIF.

IF is_invhd-ekorg EQ 'JP00' AND is_invhd-statu EQ 'OWN' AND is_invhd-ebeln NE


abap_false.
IF is_invhd-grdel_dat IS INITIAL OR is_invhd-grdel_dat EQ '00000000'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '551'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
DATA(lv_sysdate) = lv_user_date.
* DATA(lv_sysdate) = cl_abap_context_info=>get_system_date( ).
IF is_invhd-grdel_dat GT lv_sysdate.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '552'.
ls_message-msgty = 'E'.
APPEND ls_message TO et_messages.
ENDIF.
ENDIF.

********Check already posted invoice ***********


IF is_invhd-statu = 'POST'.
CLEAR ls_message.
ls_message-msgid = 'ZUNP_ZMCIV'.
ls_message-msgno = '174'.
ls_message-msgty = 'E'.
ls_message-msgv1 = ''.
ls_message-msgv2 = ''.
ls_message-msgv3 = ''.
APPEND ls_message TO et_messages.
ENDIF.
***********Check ASL and BASE line date **************
zunp_cl_zutility=>check_asl(
EXPORTING
iv_ekorg = is_invhd-ekorg
it_items = it_invit
IMPORTING
et_message = lt_message
).
IF NOT lt_message IS INITIAL.
CLEAR ls_message.
LOOP AT lt_message INTO DATA(ls_messg).
ls_message-msgid = ls_messg-id.

ls_message-msgno = ls_messg-number.
ls_message-msgty = ls_messg-type.
ls_message-msgv1 = ls_messg-message_v1.
APPEND ls_message TO et_messages.
ENDLOOP.
ENDIF.
ENDMETHOD.
ENDCLASS.

You might also like