0% found this document useful (0 votes)
391 views

Code

This document is a modification log for report ZFPXR050, which retrieves downpayments, payments, payment reversals, and vendor details linked to health care purchase orders and reports them. It has undergone multiple updates to fix defects, add new fields to the interface and report, allow longer customer IDs, extract additional document types, and classify vendors. The latest changes remove hard-coded vendor classifications, add conditions to display line items based on vendor type, fetch language from invoices/POs, and exclude line items where one product is N/A.

Uploaded by

topankaj
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
391 views

Code

This document is a modification log for report ZFPXR050, which retrieves downpayments, payments, payment reversals, and vendor details linked to health care purchase orders and reports them. It has undergone multiple updates to fix defects, add new fields to the interface and report, allow longer customer IDs, extract additional document types, and classify vendors. The latest changes remove hard-coded vendor classifications, add conditions to display line items based on vendor type, fetch language from invoices/POs, and exclude line items where one product is N/A.

Uploaded by

topankaj
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 114

REPORT zfpxr050 MESSAGE-ID zr

LINE-SIZE 132
LINE-COUNT 65(3)
NO STANDARD PAGE HEADING.
*----------------------------------------------------------------------*
* Report: ZFPXR050 *
* Author: Peter Janidlo *
* Date: 20100618 *
* Func. Spec: Health Care Professional Reporting *
* Control ID: VC1709 *
* Trans. Code: ZV630 *
* Description: Retrieve and report: 1. downpayments and reversed *
* downpayments linked to health care reportable purchase *
* orders; 2. cleared payments and payment reversals *
* linked to health care reportable purchase orders or *
* reportable web disbursement requests. *
*----------------------------------------------------------------------*
* Process: 1. Retrieve HCP reportable documents in the date range: *
* A. Downpayments and reversed downpayments *
* B. Payments to invoices; calculate percent of payment *
* per invoice *
* C. Payment reversals to invoices; calculate percent of *
* payment per invoice *
* 2. Retrieve vendor details *
* 3. Format and output interface file *
* 4. Format and output ALV report *
*----------------------------------------------------------------------*
* MODIFICATION LOG: *
* CORR. NO DATE PROGRAMMER DESCRIPTION *
* GDVK9A14IQ 20100618 Peter Janidlo R21.0: Original version. *
* GDVK9A15U1 20100920 Peter Janidlo R21.0 Defect 1320: Fixed RC *
* checks for web DRs. New fields *
* PO Reference and Invoice Type. *
* Fixed selection by PO for *
* payments and payment reversals.*
* R21.0 Defect 1340: Modified *
* payments and payment reversals *
* to process individual invoice *
* items. *
* GDVK9A160J 20100929 Peter Janidlo R21.0 Defect 1390: Extracted *
* common process from payment *
* and payment reversals; removed *
* separate web DR subroutine and *
* incorporated web DRs in common *
* process so that EC invoice *
* items are collected instead of *
* web DR container items. *
* GDVK9A162B 20101001 Peter Janidlo R21.0 Defect 1390: Fixed *
* format of negative Spend Amt. *
* GDVK9A162F 20101002 Peter Janidlo R21.0 Defect 1407: Fixed error *
* in payment reversal selection. *
* Fixed retrieval of PO account *
* assignment. Added code to *
* select downpayment reversals. *
* Fixed selection of vendor tax *
* ID. Added security to restrict *
* display of tax ID. Added doc *
* type to Spend ID to make it *
* unique for payments and payment*
* reversals. Added CoCd security.*
* Modified payments to select *
* specific posting keys. *
* GDVK9A17JA 21-Dec-2010 Tirth Pandya CR06101096 - Fixed errors in doc*
* GDVK9A17XL 06-Jan-2011 creater logic.Added cost centre *
* details to ALV. changed logic to*
* get payment reversals' details. *
* Changed the Cost *
* centre and cost element value *
* assignment for invoices. *
* GDVK9A18OC 20110228 Peter Janidlo CR06148157: Fixed fiscal year *
* in Spend IDs of payment *
* reversals and corresponding *
* original payments. Added *
* Payment document number to *
* Spend ID to properly account *
* for invoices paid again after *
* a payment reversal. *
* GDVK9A1O6L 20130107 Peter Janidlo CR06474471: For web DRs or POs *
* with multiple products per *
* item: split invoice item into *
* multiple items, one per prod, *
* with same spend ID and value, *
* but percentage divided equally *
* across individual products, and*
* unique product ID. Added check *
* to find HCO Vendors, which are *
* automatically HC reportable. *
* Fixed vendor address retrieval *
* for PO boxes. Cleared HCO data *
* in interface when SSN = zero. *
* Added ISO currency key to *
* interface. Added PO and web DR *
* Travel Destination (City, *
* Region, Country) to interface. *
* GDVK9A1OKO 20130311 Peter Janidlo CR06474471: Modified ALV to *
* display PO or web DR when *
* selected. *
* GDVK9A1OTN 20130326 Peter Janidlo CR06474471: Fixed tax code. *
* GDVK9A1RV1 20130910 Rajesh Unny Nair CR06556798: for ZV630 the HCO *
* data is corrected *
* GDVK9A1UVK 16-Apr-2014 Dinesh D CR06578545: Please find the *
* changes below. *
************************************************************************
* Changes as per CR06578545: *
*1. Allowed up to 40 characters for the Lilly person id/customer id. *
*2. Lilly person id is changed to customer id on all applications *
* in SAP and on the interface. *
*3. Extracted ZD and ZG document types into the interface and report. *
*4. Added new fields (BELNR, HEALTH_CARE_PROF, HEALTH_CARE_ORG, *
* PATIENT_ORG, VAT Registration number, TRANSACTION ID, MEETING ID)to*
* the interface and report. The data fields newly added on the ZD doc*
* type include transaction id, meeting number, and customer id. ZG *
* doc type will have the same template as ZD but will only be *
* populating customer id field. *
*5. HCO vendor classification and Patient Org vendor classification *
* needs is put on both the interface file and displayed on the *
* report. *
*6. Currency that the payment was made sent to the *
* interface. *
*7. VAT Registration field should is added to the report and also on *
* the interface. *
*8. WEB DR number and Invoice number is added to the interface. *
*----------------------------------------------------------------------*
* GDVK9A1VB4 19-May-2014 Dinesh D CR06578545- Removed the Hard *
* coding for Vendor Classificatio.*
* Added condition to Display *
* line items in the report based *
* on HCP, HCP, Patient org and *
* Clinical trial PO. *
* Changed the code to Fetch the *
* Language for the PO's and Invoic*
* for fetching the text from *
* READ_TEXT function module. *
* Removed the Validatoin logic for*
* Vendor. Line item with mutiple *
* Product and one of the product *
* is N/A then it will not be *
* displayed in the report. *
* GDVK9A1VE5 17-Jun-2014 Dinesh D CR06578545- For the Product as *
* N/A, the column value product is*
* made space. Only one N/A product*
* will be displayed per line item,*
* BELNR will be dispalyed for all *
* document type. *
* If condition added for Clinical *
* grant payments, the data will be*
* selected based on the SAP PO *
* 'Our Reference' and the 'Sales *
* Person fields'. Corrected the *
* column value populated for BELNR*
* and WEB_DR in the interface file*
* GDVK9A1VH5 25-Jun-2014 Dinesh D CR06578545: Please find the *
* changes below. *
************************************************************************
* Changes as per CR06578545: *
*1. If the CLASSIFICATION for HCO and/ or PT Org are populated with a *
* YES on the Vendor Master - ALWAYS pull/send the records/transactions.*
*2. Any document for ZD or ZG - ALWAYS pull/send the records/ *
* transactions. *
*3. Any PO record where the CUSTOMER ID is populated - ALWAYS pull/send*
* the records/transactions. *
*4. POS that have OUR REF and SALES PERSON on the Communication Tab - *
* ALWAYS pull/send the records/transactions. This is for the clinical *
* grants Pos. *
************************************************************************
* GDVK9A1WMS 04-Nov-2014 Sunil V CR06719587:Bug fix in displaying*
* Customer id, Meeting id and *
* Transaction id for ZD/ZG doc. *
* GDVK9A1YUS 16-Sep-2014 Ramireddy G CR06687537: Please find the *
* changes below. *
* Changes as per CR06687537: for CHINA raise the bar report *
* 1. Add two radiobuttons on selection screen, one for US and another *
* China, keep the existing code/processing logic un touched for US *
* radio button and write new logic/code for China radiobutton by *
* reusing the code as much as possible. Differences for China report*
* are listed in below points: *
* 2. Replace "Spend Type" field with new "Meeting ID" field on *
* selection screen for China radiobutton. *
* 3. Limit selection to China-related documents; that is, only select *
* documents linked to meeting IDs(PO header text 'F12'). *
* 4. China radiobutton will only handle invoice types RE &RI *
* 5. China report will not handle "HCO and HCP Reportable" indicators, *
* WebDRs & Sunshine part unlinke US radiobutton. *
* 6. Send output in new file format for China. *
* 7. Create a separate last-run date record in ZLASTRUN for China. *
* *
* STJK962842 10-Sep-2015 Archana CHG0015380: Changes are done below:*
* Mukherjee *
* 1. Added 2 new columns in ALV display - Tax code and Tax rate *
* 2. Modified interface file to display the 2 new added columns *
* 3. Modified report to display Payment lines for the invoices *
* 4. Display tax details: Withholding and VAT taxes for Payments and *
* Invoices *
* 5. In the final output, concatenate the cost element of expense lines*
* to the cost elemnt of tax lines *
* *
* STJK961833 10-Nov-2015 Archana CHG0056997: Changes are done below:*
* Mukherjee *
* 1. Columns like event id, event name should be populated for tax *
* lines from payment documents with details from their corresponding*
* invoice documents. *
* 2. As of now ZV630 is showing vendor line from payment document which*
* should not be required and should be removed. *
* 3. Amount for ZD and ZG documents are coming incorrect, these should *
* be changed to the amount from the expense line of invoice. *
* 4. Addition of earlier deleted K3 document type line items so that *
* all line items for document type K3 and corresponding invoice item*
* taxes should be populated *
* 5. Code changes for restricting entries in the output if PO details *
* are mentioned in an input parameters. So that outpul will be *
* populated only for given PO. *
************************************************************************
*----------------------------------------------------------------------*
* APPLICATION: P2P-A/R *
* LOGICAL DATABASE: None *
* INPUTS: Selection screen, Payment, web DR, and PO data *
* OUTPUTS: ALV Report, Interface file *
* EXTERNAL ROUTINES: READ_TEXT, SWW_WI_CONTAINER_READ *
* CONVERT_DATE (ZREPFUNC), ALV *
* INCLUDES: SLIS, <CNTN01> *
* RETURN CODES: None *
* ABENDS: None *
*----------------------------------------------------------------------*
* Type groups
TYPE-POOLS: slis.
INCLUDE <cntn01>. "#EC INCL_OK
TABLES: bkpf,
ekko,
bseg,
sscrfields. "R21_1407
DATA: g_meetingid TYPE char20. "CR06687537
************************************************************************
* User Selections *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME
TITLE text-b01.
* Start of changes for CR06687537
PARAMETERS: p_us RADIOBUTTON GROUP r2 USER-COMMAND r2,
p_china RADIOBUTTON GROUP r2.
SELECTION-SCREEN SKIP.
* End of changes for CR06687537
PARAMETERS: p_auto AS CHECKBOX USER-COMMAND auto.
SELECT-OPTIONS: s_lifnr FOR ekko-lifnr MODIF ID sel,
s_bukrs FOR bkpf-bukrs MODIF ID sel,
s_cpudt FOR bkpf-cpudt MODIF ID sel,
s_belnr FOR bkpf-belnr MODIF ID sel,
s_ebeln FOR ekko-ebeln MODIF ID sel,
s_kostl FOR bseg-kostl MODIF ID sel,
s_kstar FOR bseg-kstar MODIF ID sel,
s_blart FOR bkpf-blart MODIF ID sel.
SELECT-OPTIONS: s_meet FOR g_meetingid MODIF ID sel. "CR06687537
PARAMETERS: p_rpt RADIOBUTTON GROUP r1,
p_inf RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF BLOCK b1.

************************************************************************
* Data Declarations *
************************************************************************
TYPES: tp_prsid TYPE string. "CR06578545
* Begin R21_1390
* Type: Payments for invoices, Payment Reversals
TYPES: BEGIN OF tp_pfi,
lifnr TYPE bsak-lifnr,
bukrs TYPE bsak-bukrs,
belnr TYPE bsak-belnr,
gjahr TYPE bsak-gjahr,
blart TYPE bsak-blart,
cpudt TYPE bsak-cpudt,
augbl TYPE bsak-augbl,
augdt TYPE bsak-augdt,
cputm TYPE bkpf-cputm, "CR06687537
END OF tp_pfi.
* Type: Payment Usage
TYPES: BEGIN OF tp_ukey,
bukrs TYPE bsak-bukrs,
lifnr TYPE lifnr, " CHG0015380
belnr TYPE bsak-belnr,
gjahr TYPE bsak-gjahr,
buzei TYPE bsak-buzei,
blart TYPE bsak-blart,
shkzg TYPE bsak-shkzg,
wrbtr TYPE bsak-wrbtr,
nebtr TYPE bseg-nebtr,
waers TYPE bkpf-waers,
wwert TYPE bkpf-wwert,
usnam TYPE bkpf-usnam,
xblnr TYPE bkpf-xblnr,
bktxt TYPE bkpf-bktxt,
END OF tp_ukey.
* Table Type: Payment Usage
TYPES: tt_ukey TYPE STANDARD TABLE OF tp_ukey INITIAL SIZE 0.
* End R21_1390
TYPES: BEGIN OF tp_rpt,
lifnr TYPE bsak-lifnr,
hkont TYPE bseg-hkont,
bukrs TYPE bsak-bukrs,
belnr TYPE bsak-belnr,
gjahr TYPE bsak-gjahr,
buzei TYPE bsak-buzei,
* Begin of changes for CHG0015380
buzid TYPE buzid,
ktosl TYPE ktosl,
* End of changes for CHG0015380
blart TYPE bsak-blart,
cpudt TYPE bsak-cpudt,
ebeln TYPE bsak-ebeln,
ebelp TYPE bsak-ebelp,
zekkn TYPE bsak-zekkn,
augbl TYPE bsak-augbl,
augdt TYPE bsak-augdt,
usnam TYPE ekpo-afnam, "CR06101096
kostl TYPE ekkn-kostl,
unsez TYPE ekko-unsez,
verkf TYPE ekko-verkf,
invtp TYPE bsak-blart, "R21_1320
txz01 TYPE c LENGTH 50,
prsid TYPE tp_prsid,
wi_id TYPE zwebdr, "CR06474471
cdm_flag TYPE z_cdmfl, "CR06474471
pymnt TYPE bsak-belnr, "CR06148157
* Vendor details
stcd1 TYPE lfa1-stcd1, "CR06474471
stcd2 TYPE lfa1-stcd2,
stcdx TYPE lfa1-stcd1, "CR06474471
name1 TYPE lfa1-name1,
name2 TYPE lfa1-name2,
street TYPE adrc-street,
str_suppl1 TYPE adrc-str_suppl1,
city1 TYPE adrc-city1,
region TYPE adrc-region,
post_code1 TYPE adrc-post_code1,
country TYPE adrc-country,
* Begin CR06474471
po_box TYPE adrc-po_box,
post_code2 TYPE adrc-post_code2,
prod TYPE c LENGTH 255,
prod_id TYPE ztproduct_name-zzprod_name,
percentage TYPE i,
td_city TYPE addr1_data-city1,
td_region TYPE t005s-bland,
td_country TYPE addr1_data-country,
event_prod_id TYPE c LENGTH 50,
* End CR06474471
wrbtr TYPE p LENGTH 8 DECIMALS 2,
shkzg TYPE bsak-shkzg,
waers TYPE t001-waers,
meetid TYPE c LENGTH 20, "CR06687537
cputm TYPE cputm, "CR06687537
* Begin of changes for CHG0015380
mwskz TYPE mwskz,
qsskz TYPE qsskz,
* Adding 2 new columns for tax code and rate
tax_code TYPE char3,
tax_rate TYPE char16,
* End of changes for CHG0015380
END OF tp_rpt.
* Table Type: Report "R21_1390
TYPES: tt_rpt TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE 0. "R21_1390
TYPES: BEGIN OF tp_inf,
event_id TYPE c LENGTH 43,
event_prod_id TYPE c LENGTH 50, "CR06474471
event_nm TYPE c LENGTH 50,
customer_id TYPE c LENGTH 40, "CR06578545
hco_id TYPE c LENGTH 10,
hco_tax_id TYPE c LENGTH 11,
hco_nm TYPE c LENGTH 35,
hco_alt_nm TYPE c LENGTH 35,
hco_adrs_ln_1 TYPE c LENGTH 60,
hco_adrs_ln_2 TYPE c LENGTH 40,
hco_adrs_city TYPE c LENGTH 40,
hco_adrs_rgn_cd TYPE c LENGTH 3,
hco_adrs_pstl_cd TYPE c LENGTH 10,
hco_adrs_cntry_cd TYPE c LENGTH 3,
spend_id TYPE c LENGTH 50, "R21_1407 "CR06148157
spend_type_cd TYPE c LENGTH 16,
* Begin of changes for CHG0015380
* Increasing the length of the field from 10 to 16
spend_purpose_cd TYPE c LENGTH 16,
* End of changes for CHG0015380
spend_purpose_secondary_cd TYPE c LENGTH 10,
spend_dt_pd TYPE c LENGTH 10,
spend_amt TYPE c LENGTH 25,
currency TYPE c LENGTH 3, "CR06474471
global_id TYPE c LENGTH 12,
event_parent_id TYPE c LENGTH 12,
event_alt_id TYPE c LENGTH 30,
po_info TYPE c LENGTH 16, "R21_1320
invc_type TYPE c LENGTH 4, "R21_1320
* Begin CR06474471
prod_lly_id TYPE c LENGTH 50,
prod_nm TYPE c LENGTH 50,
prod_dtl_prcnt TYPE c LENGTH 6,
spend_travel_details_id TYPE c LENGTH 50,
spend_travel_details_city TYPE c LENGTH 40,
spend_travel_details_rgn_cd TYPE c LENGTH 3,
spend_travel_details_cntry_cd TYPE c LENGTH 3,
* End CR06474471
* Begin of CR06578545
belnr TYPE belnr_d,
wi_id TYPE zwebdr, "CR06474471
atwrt1 TYPE c LENGTH 2,
atwrt2 TYPE c LENGTH 2,
atwrt3 TYPE c LENGTH 2,
stceg TYPE c LENGTH 20,
transaction_id TYPE c LENGTH 20,
meeting_id TYPE c LENGTH 20,
* End of CR06578545
* Begin of changes for CHG0015380
tax_code TYPE char3,
tax_rate TYPE char16,
* End of changes for CHG0015380
* ALV-only fields
wrbtr TYPE p LENGTH 8 DECIMALS 2,
waers TYPE t001-waers,
cdm_flag TYPE z_cdmfl, "CR06474471
* Begin of changes for CHG0015380
bukrs TYPE bukrs,
gjahr TYPE gjahr,
buzei TYPE buzei,
* End of changes for CHG0015380
END OF tp_inf.
* Start of changes for CR06687537
TYPES: BEGIN OF tp_inf_china,
event_id TYPE c LENGTH 43,
event_nm TYPE c LENGTH 50,
event_strt_dt TYPE c LENGTH 16,
event_typ_cd TYPE c LENGTH 50,
event_parent_id TYPE c LENGTH 20,
eventparentcompanycd TYPE c LENGTH 3,
eventparentsrcsyscd TYPE c LENGTH 12,
eventsubtypecd TYPE c LENGTH 25,
eventparentcountry TYPE c LENGTH 20,
eventviacustomertype TYPE c LENGTH 3,
eventcustomerid TYPE c LENGTH 50,
eventcustomereventrole TYPE c LENGTH 6,
hco_id TYPE c LENGTH 10,
hco_nm TYPE c LENGTH 35,
hco_alt_nm TYPE c LENGTH 35,
hco_adrs_ln_1 TYPE c LENGTH 60,
hco_adrs_ln_2 TYPE c LENGTH 40,
hco_adrs_city TYPE c LENGTH 40,
hco_adrs_rgn_cd TYPE c LENGTH 3,
hco_adrs_pstl_cd TYPE c LENGTH 10,
hco_adrs_cntry_cd TYPE c LENGTH 3,
spend_id TYPE c LENGTH 50,
spend_alt_id TYPE c LENGTH 16,
spend_dt_pd TYPE c LENGTH 16,
spend_amt TYPE c LENGTH 25,
currency TYPE c LENGTH 3,
spendtypecd TYPE c LENGTH 7,
spendpurposecd TYPE c LENGTH 25,
spend_cost_center TYPE c LENGTH 10,
spend_cost_element TYPE c LENGTH 10,
spendcostcenterpersent TYPE c LENGTH 5,
companycd TYPE c LENGTH 3,
src_sys_id TYPE c LENGTH 3,
srcsystypecd TYPE c LENGTH 12,
countrycd TYPE c LENGTH 2,
eventcreatedby TYPE c LENGTH 25,
* ALV-only fields
wrbtr TYPE p LENGTH 8 DECIMALS 2,
waers TYPE t001-waers,
END OF tp_inf_china.
* End of changes for CR06687537

* Begin CR06474471
TYPES: BEGIN OF tp_products,
item TYPE i,
product TYPE i,
value TYPE swcont-value,
END OF tp_products.
TYPES: tt_products TYPE STANDARD TABLE OF tp_products
WITH KEY item product
INITIAL SIZE 0.
TYPES: BEGIN OF tp_dest,
item TYPE i,
type TYPE swc_elem,
value TYPE swcont-value,
END OF tp_dest.
TYPES: tt_dest TYPE STANDARD TABLE OF tp_dest
WITH KEY item type
INITIAL SIZE 0.
* End CR06474471
* Begin of CR06578545
TYPES : BEGIN OF ty_ausp,
objek TYPE ausp-objek,
atinn TYPE ausp-atinn,
atwrt TYPE ausp-atwrt,
END OF ty_ausp.
TYPES : BEGIN OF ty_objek,
objek TYPE c LENGTH 50,
END OF ty_objek.
TYPES: BEGIN OF ty_lifnr,
lifnr TYPE lifnr,
END OF ty_lifnr.
DATA : it_lifnr TYPE STANDARD TABLE OF ty_lifnr,
wa_lifnr TYPE ty_lifnr.
DATA : it_ausp TYPE STANDARD TABLE OF ty_ausp,
wk_ausp TYPE ty_ausp,
it_objek TYPE STANDARD TABLE OF ty_objek,
wk_objek TYPE ty_objek.
*Line deleted for CHG0015380
* END OF CR06578545.

DATA: t_rpt TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE 0. "#EC NEEDED
DATA: t_inf TYPE STANDARD TABLE OF tp_inf INITIAL SIZE 0. "#EC NEEDED
DATA: t_inf_china TYPE STANDARD TABLE OF tp_inf_china INITIAL SIZE 0. "#EC NEEDE
D "CR06687537
* Range: Invoice document types
DATA: r_invdt TYPE RANGE OF t003-blart INITIAL SIZE 0. "#EC NEEDED
* Range: Downpayment document types
DATA: r_dpydt TYPE RANGE OF t003-blart INITIAL SIZE 0. "#EC NEEDED
* Range: Payment document types
DATA: r_paydt TYPE RANGE OF t003-blart INITIAL SIZE 0. "#EC NEEDED
* Range: Payment Reversal document types
DATA: r_revdt TYPE RANGE OF t003-blart INITIAL SIZE 0. "#EC NEEDED
* Begin R21_1390
* Range: Web DR workflow tasks
DATA: r_task TYPE RANGE OF swwwihead-wi_rh_task INITIAL SIZE 0.
"#EC NEEDED
* End R21_1390
* Table: ALV field catalog
DATA: t_fieldcat TYPE slis_t_fieldcat_alv. "#EC NEEDED
* Table: ALV events
DATA: t_events TYPE slis_t_event. "#EC NEEDED
* Table: ALV top of page event
DATA: t_listheader TYPE slis_t_listheader. "#EC NEEDED
* Structure: ALV layout
DATA: s_layout TYPE slis_layout_alv. "#EC NEEDED
DATA: gv_repid TYPE sy-repid, "#EC NEEDED " Program name
gv_text1 TYPE char10, "#EC NEEDED " ZLASTRUN param
gv_text2 TYPE char10, "#EC NEEDED " ZLASTRUN param
gv_paramter TYPE zlastrun-paramter, "#EC NEEDED " Lastrun tmstamp
gv_frdat TYPE d, "#EC NEEDED
gv_frtim TYPE t, "#EC NEEDED
gv_todat TYPE d, "#EC NEEDED
gv_totim TYPE t, "#EC NEEDED
gv_noauth TYPE c LENGTH 1, "#EC NEEDED " No authorization
"R21_1407
* Begin of CR06578545
lv_tdname TYPE thead-tdname,
lv1_tdname TYPE c LENGTH 20,
lv2_tdname TYPE thead-tdname.
RANGES: r_non_ec FOR bsak-blart.
* End of CR06578545
CONSTANTS:
c_x TYPE c VALUE 'X', " NEVER CHANGE THIS
c_auto TYPE char10 VALUE 'AUTOMATIC',
c_manual TYPE char10 VALUE 'MANUAL',
c_china TYPE char10 VALUE 'CHINA', "CR06687537
c_onli TYPE syucomm VALUE 'ONLI', "R21_1407
c_prin TYPE syucomm VALUE 'PRIN', "R21_1407
c_save TYPE c VALUE 'A', " Save ALV layout
c_typ_s TYPE c VALUE 'S', " ALV Sub-header
c_blkls TYPE t003-blkls VALUE 'A', " Invoices
c_k1 TYPE blart VALUE 'K1',
c_k2 TYPE blart VALUE 'K2',
c_k3 TYPE blart VALUE 'K3',
c_k4 TYPE blart VALUE 'K4',
c_k5 TYPE blart VALUE 'K5',
c_ab TYPE blart VALUE 'AB',
c_zv TYPE blart VALUE 'ZV',
c_kv TYPE blart VALUE 'KV',
c_zd TYPE blart VALUE 'ZD', " CR06578545
c_zg TYPE blart VALUE 'ZG', " CR06578545
c_re TYPE blart VALUE 'RE', "CR06687537
c_ri TYPE blart VALUE 'RI', "CR06687537
c_tdobject TYPE tdobject VALUE 'EKPO', " PO Item text
c_tdid TYPE tdid VALUE 'F09', " Lilly Person ID
c_tdid_prd TYPE tdid VALUE 'F10', " Product ID "CR06474471
c_tdid_trv TYPE tdid VALUE 'F11', " Trav. Dest "CR06474471
c_credit TYPE shkzg VALUE 'H',
c_umskz_dp TYPE umskz VALUE 'A',
c_umsks_dp TYPE umsks VALUE 'A',
c_bschl_dp TYPE bschl VALUE '29', " Downpayment
c_bl_dpr TYPE blart VALUE 'KA',
c_bschl_py TYPE bschl VALUE '25', " Payment "R21_1407
c_date_fr TYPE d VALUE '00010101',
c_mrate TYPE kurst VALUE 'M',
c_usd TYPE waers VALUE 'USD',
* Begin CR06474471
c_addr_typ TYPE ad_adrtype VALUE '1',
c_us TYPE ad_ctry_fr VALUE 'US',
c_usa TYPE land1 VALUE 'USA',
c_hco TYPE atnam VALUE 'Z_HEALTH_CARE_ORG_COVERED_RECI',
c_mafid TYPE klmaf VALUE 'O',
c_klart TYPE klassenart VALUE '010',
c_y TYPE atwrt VALUE 'Y',
c_na TYPE zprod_desc VALUE 'N/A',
c_nax TYPE zprod_desc VALUE 'NA',
* End CR06474471
* Web DR
c_task1 TYPE sww_task VALUE 'WS91000001',
c_task2 TYPE sww_task VALUE 'WS93000024',
c_task3 TYPE sww_task VALUE 'WS91000102',
c_task4 TYPE sww_task VALUE 'WS91000052',
c_blart_dr TYPE blart VALUE 'EC',
c_wi_type TYPE sww_witype VALUE 'F',
c_elem_crd TYPE swc_elem VALUE 'Z_CRD_NO',
c_elem_cia TYPE swc_elem VALUE 'ZCIA', "CR06474471
c_elem_txt TYPE swc_elem VALUE 'TEXT',
c_elem_prd TYPE swc_elem VALUE 'PRDNAME*', "CR06474471
c_elem_cty TYPE swc_elem VALUE 'CITYLI*', "CR06474471
c_elem_reg TYPE swc_elem VALUE 'REGIONLI*', "CR06474471
c_elem_co TYPE swc_elem VALUE 'COUNTRYLI*', "CR06474471
c_sep1 TYPE c LENGTH 1 VALUE '-',
c_sep2 TYPE c LENGTH 1 VALUE '_',
c_sepp TYPE c LENGTH 1 VALUE ';', "CR06474471
c_opath TYPE c LENGTH 20 VALUE '/transfer/00207/',
c_fprfx TYPE c LENGTH 13 VALUE 'SAP_SPND_DATA',
c_fextn TYPE c LENGTH 4 VALUE '.tsv', "#EC NOTEXT
c_opath_china TYPE c LENGTH 20 VALUE '/transfer/01681/', "CR06687537
c_fprfx_china TYPE c LENGTH 25 VALUE 'LLY_LLY_SAP_CN_SPEND_DATA', "CR06687537
* Begin of changes for CHG0015380
* Increasing length from 41 to 43
c_nf TYPE i VALUE 43, " Num I/F fields
* End of changes for CHG0015380
c_texto TYPE c LENGTH 8 VALUE 'TEXT-O',
* Begin of CR06578545
c_meetid TYPE tdid VALUE '1009',
c_meetid2 TYPE tdid VALUE 'F12',
c_001 TYPE char3 VALUE '001',
c_i TYPE char1 VALUE 'I',
c_eq TYPE char2 VALUE 'EQ',
* End of CR06578545
c_file_sep TYPE c VALUE cl_abap_char_utilities=>horizontal_tab.

* Begin of changes for CHG0015380


* Save clearing docs to separate table
DATA: gt_clr TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE 0,
gt_pfi TYPE STANDARD TABLE OF tp_pfi INITIAL SIZE 0,
gt_rpt_tmp TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE 0,
gs_clr1 TYPE tp_ukey,
gs_clr TYPE tp_rpt.
* End of changes for CHG0015380
************************************************************************
* Events *
************************************************************************
INITIALIZATION.
PERFORM initialization.
AT SELECTION-SCREEN ON s_bukrs. "R21_1407
PERFORM at_sel_bukrs. "R21_1407
AT SELECTION-SCREEN. "R21_1407
PERFORM at_sel_screen. "R21_1407
AT SELECTION-SCREEN OUTPUT.
PERFORM disable_fields.
START-OF-SELECTION.
PERFORM main.
END-OF-SELECTION.
PERFORM end.
* Since PARAMTER is only updated with start time, perform both start and
* end time updates at end of program
PERFORM update_zlastrun USING space gv_paramter.
PERFORM update_zlastrun USING c_x space.

************************************************************************
* Subroutines *
************************************************************************
*&---------------------------------------------------------------------*
*& Form initialization
*&---------------------------------------------------------------------*
* Initialize global variables and screen fields.
*----------------------------------------------------------------------*
FORM initialization.
* Set global variables
gv_repid = sy-repid.
p_auto = space.
p_rpt = c_x.
ENDFORM. " initialization
*&---------------------------------------------------------------------*
*& Form DISABLE_FIELDS
*&---------------------------------------------------------------------*
* Grey-out input fields for automatic selection.
*----------------------------------------------------------------------*
FORM disable_fields.
LOOP AT SCREEN.
IF screen-group1 = 'SEL'.
IF p_auto = c_x.
screen-input = '0'.
MODIFY SCREEN.
* Clear all screen fields
CLEAR: s_lifnr,
s_bukrs,
s_cpudt,
s_belnr,
s_ebeln,
s_kostl,
s_kstar,
s_blart.
REFRESH: s_lifnr,
s_bukrs,
s_cpudt,
s_belnr,
s_ebeln,
s_kostl,
s_kstar,
s_blart.
ELSE.
screen-input = '1'.
MODIFY SCREEN.
* Start of changes for CR06687537
IF p_china = c_x.
IF screen-name CP 'S_BLART*'.
screen-input = '0'.
MODIFY SCREEN.
ENDIF.
ELSE.
IF screen-name CP 'S_MEET*'.
screen-input = '0'.
MODIFY SCREEN.
ENDIF.
ENDIF.
* End of changes for CR06687537
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " DISABLE_FIELDS
*&---------------------------------------------------------------------*
*& Form update_zlastrun
*&---------------------------------------------------------------------*
* Update ZLASTRUN table with program execution details.
*----------------------------------------------------------------------*
* --> P_ENDTIME Start/end indicator
* --> P_PARAMTER Last run timestamp
*----------------------------------------------------------------------*
FORM update_zlastrun USING p_endtime TYPE c
p_paramter TYPE zlastrun-paramter.
CALL FUNCTION 'Z_UPDATE_ZLASTRUN'
EXPORTING
programm = gv_repid
text1 = gv_text1
text2 = gv_text2
flag_for_endtime = p_endtime
flag_for_counter = space " Do NOT overwrite PARAMTER
paramter = p_paramter
EXCEPTIONS
OTHERS = 0.
ENDFORM. " update_zlastrun
*&---------------------------------------------------------------------*
*& Form main
*&---------------------------------------------------------------------*
* This is the main driver of the program.
*----------------------------------------------------------------------*
FORM main.
IF p_auto = c_x.
gv_text1 = c_auto.
* Start of changes for CR06687537
IF p_china = c_x.
gv_text2 = c_china.
ELSE.
* End of changes for CR06687537
gv_text2 = space.
ENDIF. "CR06687537
ELSE.
gv_text1 = c_manual.
gv_text2 = sy-uname.
ENDIF.
PERFORM get_last_rundate.
PERFORM get_docty.
* Start of changes for CR06687537
IF p_china = c_x.
PERFORM get_payments_china.
PERFORM get_reversals_china.
ELSE.
* End of changes for CR06687537
PERFORM get_downpayments.
PERFORM get_dp_reversals. "R21_1407
PERFORM get_payments.
*-- Start of changes for Defect#937
IF it_ausp IS INITIAL.
DATA: it_lifnr_temp TYPE STANDARD TABLE OF ty_lifnr.
SELECT lifnr
FROM lfa1
INTO TABLE it_lifnr_temp
WHERE lifnr IN s_lifnr.
IF sy-subrc EQ 0.
LOOP AT it_lifnr_temp INTO wa_lifnr.
wk_objek-objek = wa_lifnr-lifnr.
COLLECT wk_objek INTO it_objek.
ENDLOOP.
SORT it_objek BY objek.
IF it_objek IS NOT INITIAL.
SELECT objek
atinn
atwrt
FROM ausp
INTO TABLE it_ausp
FOR ALL ENTRIES IN it_objek
WHERE objek = it_objek-objek.
IF sy-subrc EQ 0.
SORT it_ausp BY objek atinn.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
*-- End of changes for Defect#937
PERFORM get_reversals.
ENDIF. "CR06687537
* Begin of changes for CHG0015380
* Added this routine to fetch the clearing docs for
* invoices and tax lines for invoices and clearing docs
* and displaye them in ALV. Also pick relevant details
* to populate the additional 2 columsn for tax code and rate
PERFORM get_taxes.
* End of changes for CHG0015380
PERFORM get_vendor_details.
ENDFORM. " main
*&---------------------------------------------------------------------*
*& Form GET_LAST_RUNDATE
*&---------------------------------------------------------------------*
* For Automatic execution, retrieve end date and time of previous
* run. (For Manual execution, use Entry Date range from selection
* screen.)
*----------------------------------------------------------------------*
FORM get_last_rundate.
DATA: lv_paramter TYPE zlastrun-paramter,
lv_timestamp TYPE tzntimestp.

CHECK gv_text1 = c_auto.


* Retrieve previous end date and time
SELECT SINGLE paramter
INTO lv_paramter
FROM zlastrun
WHERE programm = gv_repid
AND text1 = c_auto
AND text2 = gv_text2. "space. "CR06687537
IF sy-subrc = 0 AND NOT lv_paramter IS INITIAL.
* Extract From date and From time
lv_timestamp = lv_paramter. " Convert type
gv_frdat = lv_timestamp(8).
gv_frtim = lv_timestamp+8(6).
ELSE.
gv_frdat = sy-datum - 1.
CLEAR gv_frtim.
ENDIF.
* Generate To date and To time
GET TIME.
gv_todat = sy-datum.
gv_totim = sy-uzeit.
CLEAR gv_paramter.
IF p_inf = c_x.
* During actual interface execution, create next timestamp with
* current time (to avoid a time gap due to program execution time)
CLEAR lv_timestamp.
lv_timestamp(8) = gv_todat.
lv_timestamp+8(6) = gv_totim.
gv_paramter = lv_timestamp. " Convert type
ELSE.
* For report only - leave last run date and time unchanged
gv_paramter = lv_paramter.
ENDIF.
ENDFORM. " GET_LAST_RUNDATE
*&---------------------------------------------------------------------*
*& Form GET_DOCTY
*&---------------------------------------------------------------------*
* Retrieve FI document types for invoices. Create ranges of
* downpayment, payment, and payment reversal document types.
*----------------------------------------------------------------------*
FORM get_docty.
DATA: s_invdt LIKE LINE OF r_invdt,
s_dpydt LIKE LINE OF r_dpydt,
s_paydt LIKE LINE OF r_paydt,
s_revdt LIKE LINE OF r_revdt,
s_task LIKE LINE OF r_task. "R21_1390
IF p_us = c_x. "CR06687537
* Select Invoice document types
SELECT blart AS low ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE r_invdt
FROM t003
WHERE blkls = c_blkls " Invoices
AND xkoak = c_x. " Vendor "R21_1390
CLEAR s_invdt.
s_invdt-sign = 'I'.
s_invdt-option = 'EQ'.
MODIFY r_invdt FROM s_invdt
TRANSPORTING sign option
WHERE sign IS INITIAL.
* Begin of CR06578545
s_invdt-low = c_zd.
APPEND s_invdt TO r_invdt.
s_invdt-low = c_zg.
APPEND s_invdt TO r_invdt.
* End of CR06578545
SORT r_invdt.
* Start of changes for CR06687537
ELSE.
* Fill invoice types for China report
CLEAR s_invdt.
s_invdt-sign = c_i.
s_invdt-option = c_eq.
s_invdt-low = c_re.
APPEND s_invdt TO r_invdt.
s_invdt-low = c_ri.
APPEND s_invdt TO r_invdt.
ENDIF.
* End of changes for CR06687537
* Create range of Downpayment document types
CLEAR s_dpydt.
s_dpydt-sign = 'I'.
s_dpydt-option = 'EQ'.
s_dpydt-low = c_k1.
APPEND s_dpydt TO r_dpydt.
s_dpydt-low = c_k2.
APPEND s_dpydt TO r_dpydt.
s_dpydt-low = c_k3.
APPEND s_dpydt TO r_dpydt.
s_dpydt-low = c_k4.
APPEND s_dpydt TO r_dpydt.
s_dpydt-low = c_k5.
APPEND s_dpydt TO r_dpydt.
s_dpydt-low = c_zv.
APPEND s_dpydt TO r_dpydt.
* BEGIN OF CR06578545
s_dpydt-low = c_zd.
APPEND s_dpydt TO r_dpydt.
s_dpydt-low = c_zg.
APPEND s_dpydt TO r_dpydt.
* END OF CR06578545
* Create range of Payment document types
CLEAR s_paydt.
s_paydt-sign = 'I'.
s_paydt-option = 'EQ'.
s_paydt-low = c_k1.
APPEND s_paydt TO r_paydt.
s_paydt-low = c_k2.
APPEND s_paydt TO r_paydt.
s_paydt-low = c_k3.
APPEND s_paydt TO r_paydt.
s_paydt-low = c_k4.
APPEND s_paydt TO r_paydt.
s_paydt-low = c_k5.
APPEND s_paydt TO r_paydt.
s_paydt-low = c_ab.
APPEND s_paydt TO r_paydt.
s_paydt-low = c_zv.
APPEND s_paydt TO r_paydt.
*BEGIN OF CR06578545
s_paydt-low = c_zd.
APPEND s_paydt TO r_paydt.
s_paydt-low = c_zg.
APPEND s_paydt TO r_paydt.
*END OF CR06578545
* Create range of Payment Reversal document types
CLEAR s_revdt.
s_revdt-sign = 'I'.
s_revdt-option = 'EQ'.
s_revdt-low = c_kv.
APPEND s_revdt TO r_revdt.
s_revdt-low = c_ab.
APPEND s_revdt TO r_revdt.
s_revdt-low = c_zv.
APPEND s_revdt TO r_revdt.
* Begin of CR06578545
s_revdt-low = c_zd.
APPEND s_revdt TO r_revdt.
s_revdt-low = c_zg.
APPEND s_revdt TO r_revdt.
* End of CR06578545
* Begin R21_1390
* Define web DR tasks (workflows)
s_task-sign = 'I'.
s_task-option = 'EQ'.
s_task-low = c_task1.
APPEND s_task TO r_task.
s_task-low = c_task2.
APPEND s_task TO r_task.
s_task-low = c_task3.
APPEND s_task TO r_task.
s_task-low = c_task4.
APPEND s_task TO r_task.
* End R21_1390
ENDFORM. " GET_DOCTY
*&---------------------------------------------------------------------*
*& Form HCP_REPORTABLE
*&---------------------------------------------------------------------*
* Determine is purchase order is HCP reportable. One of two
* conditions must be met:
* 1. A value exists in the PO item text, "Lilly Person ID"; OR
* 2. Values exist in both the Our Reference and Salesperson PO
* header fields (for clinical grants)
*----------------------------------------------------------------------*
* -->P_EBELN PO number
* -->P_EBELP PO item
* <--P_HCR HCP Reportable
* <--P_PRSID Lilly Person ID
* <--P_VERKF Salesperson
* <--P_UNSEZ Our Reference
*----------------------------------------------------------------------*
FORM hcp_reportable USING p_ebeln TYPE ekko-ebeln
p_ebelp TYPE ekpo-ebelp
CHANGING p_hcr TYPE c
p_prsid TYPE tp_prsid
p_verkf TYPE ekko-verkf
p_unsez TYPE ekko-unsez.
* Type: saved PO data
TYPES: BEGIN OF tp_po,
ebeln TYPE ekko-ebeln,
ebelp TYPE ekpo-ebelp,
hcr TYPE c LENGTH 1,
prsid TYPE tp_prsid,
verkf TYPE ekko-verkf,
unsez TYPE ekko-unsez,
END OF tp_po.
* Type: text object key
TYPES: BEGIN OF tp_stxh,
tdobject TYPE stxh-tdobject,
tdname TYPE stxh-tdname,
tdid TYPE stxh-tdid,
tdspras TYPE stxh-tdspras,
END OF tp_stxh.
* Table: saved PO data
STATICS: t_po TYPE SORTED TABLE OF tp_po
WITH UNIQUE KEY ebeln ebelp
INITIAL SIZE 0.
* Table: PO item text object keys
DATA: t_stxh TYPE STANDARD TABLE OF tp_stxh INITIAL SIZE 0.
* Table: PO item texts
DATA: t_lines TYPE STANDARD TABLE OF tline INITIAL SIZE 0.
DATA: lv_tdname TYPE stxh-tdname,
ls_po TYPE tp_po.
FIELD-SYMBOLS: <po> TYPE tp_po,
<stxh> TYPE tp_stxh,
<lines> TYPE tline.

CLEAR: p_hcr,
p_prsid,
p_verkf,
p_unsez.

* Check saved data first


* Note: binary search automatically applied for SORTED table
READ TABLE t_po ASSIGNING <po>
WITH TABLE KEY ebeln = p_ebeln
ebelp = p_ebelp.
IF sy-subrc = 0.
p_hcr = <po>-hcr.
p_prsid = <po>-prsid.
p_verkf = <po>-verkf.
p_unsez = <po>-unsez.
ELSE.
* Create text object ID as PO document number + PO item number
CONCATENATE p_ebeln
p_ebelp
INTO lv_tdname.
* Retrieve key for PO item text "Lilly Person ID"
* Do not specify language key (could be any language)
* See TTXID and TTXIT for Valid text IDs
SELECT tdobject
tdname
tdid
tdspras
INTO TABLE t_stxh
FROM stxh
WHERE tdobject = c_tdobject " PO Item text
AND tdname = lv_tdname
AND tdid = c_tdid. " Customer id "CR06578545
* Retrieve actual Lilly Person ID text; will contain CDR or blank
LOOP AT t_stxh ASSIGNING <stxh>.
REFRESH t_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = <stxh>-tdid
language = <stxh>-tdspras
name = <stxh>-tdname
object = <stxh>-tdobject
TABLES
lines = t_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 0 AND NOT t_lines[] IS INITIAL.
LOOP AT t_lines ASSIGNING <lines>
WHERE tdline <> space.
p_prsid = <lines>-tdline.
p_hcr = c_x.
EXIT.
ENDLOOP.
EXIT. " EXIT loop
ENDIF.
ENDLOOP.
* Clinical grants will not use Lilly Person ID field; use header-level
* PO fields instead: Our Reference, Salesperson
SELECT SINGLE verkf
unsez
INTO (p_verkf,
p_unsez)
FROM ekko
WHERE ebeln = p_ebeln.
IF sy-subrc = 0
AND NOT p_verkf IS INITIAL
AND NOT p_unsez IS INITIAL.
p_hcr = c_x.
ENDIF.
* Save data for performance
CLEAR ls_po.
ls_po-ebeln = p_ebeln.
ls_po-ebelp = p_ebelp.
ls_po-hcr = p_hcr.
ls_po-prsid = p_prsid.
ls_po-verkf = p_verkf.
ls_po-unsez = p_unsez.
INSERT ls_po INTO TABLE t_po.
ENDIF.
ENDFORM. " HCP_REPORTABLE
*&---------------------------------------------------------------------*
*& Form GET_VENDOR_DETAILS
*&---------------------------------------------------------------------*
* Get name, tax code, and address for vendors.
*----------------------------------------------------------------------*
FORM get_vendor_details.
DATA: lv_adrnr TYPE lfa1-adrnr,
lv_adc TYPE szad_field-addr_dc, "CR06474471
lv_adc_0 TYPE szad_field-addr_dc. "CR06474471
FIELD-SYMBOLS <rpt> TYPE tp_rpt.

LOOP AT t_rpt ASSIGNING <rpt>.


* Get vendor details
CLEAR lv_adrnr. "CR06474471
SELECT SINGLE name1 name2 stcd2 stcd1 adrnr "R21_1407
INTO (<rpt>-name1,
<rpt>-name2,
<rpt>-stcd2,
<rpt>-stcd1, "R21_1407 "CR06474471
lv_adrnr)
FROM lfa1
WHERE lifnr = <rpt>-lifnr.
IF sy-subrc = 0.
* Begin R21_1407, CR06474471
IF <rpt>-stcd2 IS NOT INITIAL.
* Default tax ID is corporate (EIN)
<rpt>-stcdx = <rpt>-stcd2.
ELSE.
* If corporate tax ID is blank, use personal tax ID (SSN)
<rpt>-stcdx = <rpt>-stcd1.
ENDIF.
* End R21_1407, CR06474471
* Get vendor address
SELECT SINGLE street str_suppl1 city1 region post_code1 country
po_box post_code2 "CR06474471
INTO (<rpt>-street,
<rpt>-str_suppl1,
<rpt>-city1,
<rpt>-region,
<rpt>-post_code1,
<rpt>-country,
<rpt>-po_box, "CR06474471
<rpt>-post_code2) "CR06474471
FROM adrc
WHERE addrnumber = lv_adrnr
AND date_from = c_date_fr. "#EC *
* Begin CR06474471
IF NOT <rpt>-po_box IS INITIAL.
* Check if vendor uses PO Box instead of Street address
CALL FUNCTION 'ADDRESS_INTO_PRINTFORM'
EXPORTING
address_type = c_addr_typ
address_number = lv_adrnr
sender_country = c_us
IMPORTING
address_data_carrier = lv_adc " City, Postal Code
address_data_carrier_0 = lv_adc_0. " PO Box or Street
* Verify PO Box postal code
IF NOT <rpt>-post_code2 IS INITIAL AND
lv_adc CS <rpt>-post_code2.
<rpt>-post_code1 = <rpt>-post_code2.
ENDIF.
* Verify PO Box
IF lv_adc_0 CS <rpt>-po_box.
<rpt>-street = lv_adc_0.
ENDIF.
ENDIF.
* End CR06474471
ENDIF.
ENDLOOP.
ENDFORM. " GET_VENDOR_DETAILS
*&---------------------------------------------------------------------*
*& Form END
*&---------------------------------------------------------------------*
* Format processed data. Generate ALV report and interface file.
*----------------------------------------------------------------------*
FORM end.
* Start of changes for CR06687537
IF p_china = c_x.
PERFORM format_interface_china.
IF p_inf = c_x.
PERFORM create_interface_file_china.
ENDIF.
ELSE.
* End of changes for CR06687537
PERFORM format_interface.
IF p_inf = c_x.
PERFORM create_interface_file.
ENDIF.
ENDIF. "CR06687537
PERFORM output_report.
ENDFORM. " END
*&---------------------------------------------------------------------*
*& Form FORMAT_INTERFACE
*&---------------------------------------------------------------------*
* Convert data to interface format.
*----------------------------------------------------------------------*
FORM format_interface.
TYPES : BEGIN OF ty_cabn,
atinn TYPE atinn,
atnam TYPE atnam,
END OF ty_cabn.
* Begin of CR06578545
TYPES : BEGIN OF ty_lfa1,
lifnr TYPE lifnr,
stceg TYPE stceg,
END OF ty_lfa1.
DATA : it_lfa1 TYPE STANDARD TABLE OF ty_lfa1,
wa_lfa1 TYPE ty_lfa1.
DATA : it_cabn TYPE STANDARD TABLE OF ty_cabn,
wa_cabn TYPE ty_cabn.
DATA : lc_prev_ebeln TYPE ebeln,
lc_prev_ebelp TYPE ebelp.
* End of CR06578545
DATA: s_inf TYPE tp_inf.
Data: ls_inf_tmp TYPE tp_inf. "CHG0056997
DATA: lv_pymnt TYPE c LENGTH 10, "CR06148157
lv_isocd TYPE isocd. "CR06474471
* Begin of CR06578545
DATA: lv_text TYPE char50,
lv_text1 TYPE char50,
lv_text_cut_id TYPE char50,
lv_text_meet_id TYPE char50,
lv_text_tran_id TYPE char50.
* End of CR06578545

FIELD-SYMBOLS: <rpt> TYPE tp_rpt,


<inf> TYPE tp_inf.
* Begin of CR06578545
"Internal table to store line item for the PO other than Material EQ N/A
DATA: it_rpt_not_na TYPE STANDARD TABLE OF tp_rpt.
DATA: lt_inf_tmp TYPE STANDARD TABLE OF tp_inf INITIAL SIZE 0. " CHG0015380
CONSTANTS: lc_na TYPE char3 VALUE 'N/A'.
CONSTANTS : c_001 TYPE char3 VALUE '001',
c_hcp TYPE string VALUE 'Z_HEALTH_CARE_PROFESSIONAL',
c_hcr TYPE string VALUE 'Z_HEALTH_CARE_ORG_COVERED_RECI',
c_pat_org TYPE string VALUE 'Z_PATIENT_ORG_VENDOR',
c_y TYPE char1 VALUE 'Y',
lc_wit TYPE ktosl VALUE 'WIT', " CHG0015380
lc_t TYPE buzid VALUE 'T', " CHG0015380
lc_s TYPE buzid VALUE 'S'. " CHG0015380
DATA: ls_inf TYPE tp_inf,
lv_tabix TYPE sy-tabix. " CHG0015380
* Get the internal characterstic value based on Internal Charactersitic Name
SELECT atinn atnam
FROM cabn
INTO TABLE it_cabn
WHERE atnam IN (c_hcp, c_hcr, c_pat_org).
IF sy-subrc EQ 0.
SORT it_cabn BY atnam.
ENDIF.
SORT it_lifnr BY lifnr.
IF it_lifnr IS NOT INITIAL.
* get the VAT Registration Number for the vendors
SELECT
lifnr
stceg
FROM lfa1
INTO TABLE it_lfa1
FOR ALL ENTRIES IN it_lifnr
WHERE lifnr = it_lifnr-lifnr.
IF sy-subrc EQ 0.
SORT it_lfa1 BY lifnr.
ENDIF.
ENDIF.
* End of CR06578545
* To get the PO material line item without N/A.
it_rpt_not_na[] = t_rpt[].
DELETE it_rpt_not_na WHERE prod EQ lc_na.
SORT it_rpt_not_na BY ebeln ebelp.

SORT t_rpt BY bukrs belnr gjahr buzei. " CHG0015380


* Restricting only those lines for which PO
* is mentioned in selection screen parameter
DELETE t_rpt WHERE ebeln NOT IN s_ebeln. " CHG0056997
LOOP AT t_rpt ASSIGNING <rpt>.
* Begin of CR06578545
* N/A is not a valid product and it should not create another line.
* If PO line item is having only 1 product as N/A, then it should show up.
IF <rpt>-prod = lc_na
AND <rpt>-ebeln IS NOT INITIAL AND <rpt>-ebelp IS NOT INITIAL. "CHG0056997
IF lc_prev_ebeln = <rpt>-ebeln AND lc_prev_ebelp = <rpt>-ebelp.
CONTINUE.
ELSE.
CLEAR <rpt>-prod.
READ TABLE it_rpt_not_na WITH KEY ebeln = <rpt>-ebeln
ebelp = <rpt>-ebelp
TRANSPORTING NO FIELDS BINARY SEARCH.
IF sy-subrc EQ 0.
CONTINUE.
ENDIF.
ENDIF.
ENDIF.
* End of CR06578545
CLEAR s_inf.
IF NOT <rpt>-unsez IS INITIAL OR
NOT <rpt>-verkf IS INITIAL.
CONCATENATE <rpt>-unsez c_sep1
<rpt>-verkf
INTO s_inf-event_id.
ENDIF.
s_inf-event_nm = <rpt>-txz01.
* Begin of CR06578545
IF <rpt>-invtp NE c_zg AND
<rpt>-invtp NE c_zd.
* End of CR06578545
s_inf-customer_id = <rpt>-prsid.
ENDIF. "CR06578545
s_inf-belnr = <rpt>-belnr. "CR06578545
*Code Deleted as Per CR06556798
* Begin of CR06556798
*Sending the vendor information
*If tax code 1 (used in the US for SS#) is populated with a valid SS # send (a
ssumes that TC2 isblank (rules))
*If tax code 1 is used (and is 000-00-0000) don t send (Assumes same a ab
ove)
*If Tax cdoe 1 is blank send , if tax code 2 blank
*If Tax code 1 is blank and TC 2 is not, send!
*All fields are sent if the criteria are met
IF <rpt>-stcd1 CN '0- '
OR <rpt>-stcd1 IS INITIAL .
* End of CR06556798
* Vendor
WRITE <rpt>-lifnr " Remove leading zeros
TO s_inf-hco_id.
s_inf-hco_tax_id = <rpt>-stcdx. "CR06474471
s_inf-hco_nm = <rpt>-name1.
s_inf-hco_alt_nm = <rpt>-name2.
* Vendor address
s_inf-hco_adrs_ln_1 = <rpt>-street.
s_inf-hco_adrs_ln_2 = <rpt>-str_suppl1.
s_inf-hco_adrs_city = <rpt>-city1.
s_inf-hco_adrs_rgn_cd = <rpt>-region.
s_inf-hco_adrs_pstl_cd = <rpt>-post_code1.
s_inf-hco_adrs_cntry_cd = <rpt>-country.
ENDIF. "CR06474471
* SPEND_ID is the concatenation of the FI document item info
WRITE <rpt>-belnr " Remove leading zeros
TO s_inf-spend_id.
* Begin CR06148157
* Add payment document (or 0000000000 for downpayments)
IF NOT <rpt>-pymnt IS INITIAL.
WRITE <rpt>-pymnt " Remove leading zeros
TO lv_pymnt.
ELSE.
CLEAR lv_pymnt WITH '0' IN CHARACTER MODE.
ENDIF.
* End CR06148157
CONCATENATE s_inf-spend_id c_sep1
<rpt>-buzei c_sep1
<rpt>-gjahr c_sep1
<rpt>-bukrs c_sep1 "R21_1407
<rpt>-blart c_sep1 "R21_1407 "CR06148157
lv_pymnt "CR06148157
INTO s_inf-spend_id.
* Begin CR06474471
* Create Event Product ID
CONCATENATE s_inf-spend_id
'-'
<rpt>-event_prod_id
INTO s_inf-event_prod_id.
* End CR06474471
s_inf-spend_type_cd = <rpt>-blart.
WRITE <rpt>-hkont " Remove leading zeros
TO s_inf-spend_purpose_cd.
WRITE <rpt>-kostl " Remove leading zeros
TO s_inf-spend_purpose_secondary_cd.
* Format date: YYYY-MM-DD
CONCATENATE <rpt>-cpudt(4) c_sep1
<rpt>-cpudt+4(2) c_sep1
<rpt>-cpudt+6(2)
INTO s_inf-spend_dt_pd.
s_inf-global_id = <rpt>-usnam.
s_inf-event_parent_id = <rpt>-unsez.
s_inf-event_alt_id = <rpt>-verkf.
* Begin R21_1320
IF NOT <rpt>-ebeln IS INITIAL OR "R21_1390
NOT <rpt>-ebelp IS INITIAL. "R21_1390
CONCATENATE <rpt>-ebeln c_sep1
<rpt>-ebelp c_sep1
INTO s_inf-po_info.
ENDIF. "R21_1390
s_inf-invc_type = <rpt>-invtp.
* End R21_1320
* Begin of changes for CHG0015380
s_inf-tax_code = <rpt>-tax_code.
s_inf-tax_rate = <rpt>-tax_rate.
s_inf-bukrs = <rpt>-bukrs.
s_inf-gjahr = <rpt>-gjahr.
s_inf-buzei = <rpt>-buzei.
* End of changes for CHG0015380
* Begin CR06474471
* Product ID, Name, and Percentage
s_inf-prod_lly_id = <rpt>-prod_id.
s_inf-prod_nm = <rpt>-prod.
IF <rpt>-percentage = 0.
CLEAR s_inf-prod_dtl_prcnt.
ELSE.
s_inf-prod_dtl_prcnt = <rpt>-percentage.
CONDENSE s_inf-prod_dtl_prcnt.
ENDIF.
* Travel Destination
s_inf-spend_travel_details_city = <rpt>-td_city.
s_inf-spend_travel_details_rgn_cd = <rpt>-td_region.
s_inf-spend_travel_details_cntry_cd = <rpt>-td_country.
IF <rpt>-td_city IS NOT INITIAL OR
<rpt>-td_region IS NOT INITIAL OR
<rpt>-td_country IS NOT INITIAL.
s_inf-spend_travel_details_id = s_inf-spend_id.
ENDIF.
* End CR06474471
* ALV-only fields
s_inf-wrbtr = <rpt>-wrbtr.
s_inf-waers = <rpt>-waers.
s_inf-wi_id = <rpt>-wi_id. "CR06474471
s_inf-cdm_flag = <rpt>-cdm_flag. "CR06474471
* Code removed as per CR06578545
s_inf-waers = <rpt>-waers. "CR06578545
* Begin CR06474471
* Convert SAP currency key to ISO
CLEAR lv_isocd.
CALL FUNCTION 'CURRENCY_CODE_SAP_TO_ISO'
EXPORTING
sap_code = s_inf-waers
IMPORTING
iso_code = lv_isocd
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
s_inf-currency = lv_isocd.
ELSE.
s_inf-currency = s_inf-waers.
ENDIF.
* End CR06474471
* BEGIN OF CR06578545.
* Populate Vendor Classificaiton Flag. (HCP, HCO, Patient Org)
READ TABLE it_cabn INTO wa_cabn WITH KEY atnam = c_hcp BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE it_ausp INTO wk_ausp
WITH KEY objek = <rpt>-lifnr
atinn = wa_cabn-atinn BINARY SEARCH.
IF sy-subrc = 0.
s_inf-atwrt1 = wk_ausp-atwrt.
ENDIF.
ENDIF.
CLEAR wk_ausp.
CLEAR wa_cabn.
READ TABLE it_cabn INTO wa_cabn WITH KEY atnam = c_hco BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE it_ausp INTO wk_ausp
WITH KEY objek = <rpt>-lifnr
atinn = wa_cabn-atinn BINARY SEARCH.
IF sy-subrc = 0.
s_inf-atwrt2 = wk_ausp-atwrt.
ENDIF.
ENDIF.
CLEAR wk_ausp.
CLEAR wa_cabn.
READ TABLE it_cabn INTO wa_cabn WITH KEY atnam = c_pat_org BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE it_ausp INTO wk_ausp
WITH KEY objek = <rpt>-lifnr
atinn = wa_cabn-atinn BINARY SEARCH.
IF sy-subrc = 0.
s_inf-atwrt3 = wk_ausp-atwrt.
ENDIF.
ENDIF.
CLEAR wk_ausp.
READ TABLE it_lfa1 INTO wa_lfa1 WITH KEY lifnr = <rpt>-lifnr BINARY SEARCH.
IF sy-subrc EQ 0.
s_inf-stceg = wa_lfa1-stceg.
ENDIF.
CONCATENATE <rpt>-bukrs <rpt>-belnr INTO lv1_tdname SEPARATED BY space.
CONCATENATE lv1_tdname <rpt>-gjahr INTO lv_tdname.
IF <rpt>-invtp EQ c_zg OR
<rpt>-invtp EQ c_zd.
CONCATENATE lv1_tdname <rpt>-gjahr c_001 INTO lv_tdname.
PERFORM id1 USING lv_tdname CHANGING lv_text_cut_id
lv_text_meet_id
lv_text_tran_id.
IF lv_text_cut_id IS NOT INITIAL.
SPLIT lv_text_cut_id AT ':' INTO: lv_text1 s_inf-customer_id.
CONDENSE s_inf-customer_id.
ENDIF.
IF lv_text_meet_id IS NOT INITIAL.
SPLIT lv_text_meet_id AT ':' INTO: lv_text1 s_inf-meeting_id.
CONDENSE s_inf-meeting_id.
ENDIF.
IF lv_text_tran_id IS NOT INITIAL.
SPLIT lv_text_tran_id AT ':' INTO lv_text1 s_inf-transaction_id.
CONDENSE s_inf-transaction_id.
ENDIF.
CLEAR: lv_text.
* Line deleted for CHG0015380
ELSE.
PERFORM id USING lv_tdname c_meetid CHANGING s_inf-meeting_id.
IF s_inf-meeting_id IS INITIAL .
CONCATENATE <rpt>-ebeln <rpt>-ebelp INTO lv2_tdname.
PERFORM id USING lv2_tdname c_meetid2 CHANGING s_inf-meeting_id.
ENDIF.
ENDIF.
* Any document for ZD or ZG - ALWAYS pull/send the records/transactions.
IF ( s_inf-invc_type EQ c_zd OR s_inf-invc_type EQ c_zg ).
* Begin of changes for CHG0056997
CLEAR: ls_inf_tmp.
ls_inf_tmp = s_inf.
CLEAR: ls_inf_tmp-event_id,
ls_inf_tmp-event_parent_id,
ls_inf_tmp-event_alt_id.
COLLECT ls_inf_tmp INTO t_inf.
* End of changes for CHG0056997
* For Clinical grant payments, the data will be selected based on the
* SAP PO 'Our Reference' and the 'Sales Person fields'.
ELSEIF ( <rpt>-verkf IS NOT INITIAL AND <rpt>-unsez IS NOT INITIAL ).
COLLECT s_inf INTO t_inf.
* Any PO record where the CUSTOMER ID is populated
* - ALWAYS pull/send the records/transactions
ELSEIF s_inf-customer_id NE space. "CR06578545
* END OF CR06578545.
COLLECT s_inf INTO t_inf.
* Begin of CR06578545
* Transaction that have vendor classification of HCO(atwrt2)
* or Patent org (atwrt3) EQ 'Y'
ELSEIF ( s_inf-atwrt2 EQ c_y OR s_inf-atwrt3 EQ c_y ).
COLLECT s_inf INTO t_inf.
* Begin of changes for CHG0015380
* Adding condition to include Paymemt Docs.
* Doc. type K1, K2, K3and K4 in final o/p
ELSEIF ( s_inf-invc_type EQ c_k1
OR s_inf-invc_type EQ c_k2
* Adding the K3 doc. types also
OR s_inf-invc_type EQ c_k3 " CHG0056997
OR s_inf-invc_type EQ c_k4 ).
COLLECT s_inf INTO t_inf.
* Adding condition to include tax lines and populating the
* relevant fields.
ELSEIF ( <rpt>-verkf IS INITIAL AND <rpt>-unsez IS INITIAL AND ( <rpt>-buzid
= lc_t
OR <rpt>-ktosl = lc_wit OR <rpt>-buzid = lc_
s ) ).
READ TABLE t_inf INTO ls_inf WITH KEY bukrs = <rpt>-bukrs
belnr = <rpt>-belnr
gjahr = <rpt>-gjahr
BINARY SEARCH.
IF sy-subrc EQ 0.
* Include tax line only when an entry for the corresponding
* invoice is there in final table. Also for manually added tax
* lines the PO will always be blank. If PO not blank then don't
* inlcude that line.
IF ( <rpt>-bukrs = ls_inf-bukrs AND <rpt>-belnr = ls_inf-belnr AND
<rpt>-gjahr = ls_inf-gjahr AND <rpt>-ebeln IS INITIAL ).
s_inf-event_id = ls_inf-event_id.
s_inf-event_nm = ls_inf-event_nm.
s_inf-global_id = ls_inf-global_id.
s_inf-event_parent_id = ls_inf-event_parent_id.
s_inf-event_alt_id = ls_inf-event_alt_id.
s_inf-po_info = ls_inf-po_info.
s_inf-customer_id = ls_inf-customer_id.
s_inf-transaction_id = ls_inf-transaction_id.
s_inf-meeting_id = ls_inf-meeting_id.
COLLECT s_inf INTO t_inf.
ENDIF.
ENDIF.
* End of changes for CHG0015380
ENDIF.
lc_prev_ebeln = <rpt>-ebeln.
lc_prev_ebelp = <rpt>-ebelp.
* End of CR06578545
* Begin of CR06719587
CLEAR: lv_text_cut_id,
lv_text_meet_id,
lv_text_tran_id.
* End of CR06719587
ENDLOOP.

* Begin of changes for CHG0015380


SORT t_inf BY bukrs belnr gjahr buzei.
SORT t_rpt BY bukrs gjahr augbl invtp.
lt_inf_tmp[] = t_inf[].
* End of changes for CHG0015380
LOOP AT t_inf ASSIGNING <inf>.
* R21_1390
* Apply currency formatting for interface file
IF <inf>-wrbtr < 0.
WRITE <inf>-wrbtr
TO <inf>-spend_amt CURRENCY <inf>-waers NO-SIGN NO-GROUPING.
SHIFT <inf>-spend_amt LEFT DELETING LEADING space.
* Add sign
CONCATENATE '-'
<inf>-spend_amt
INTO <inf>-spend_amt.
ELSE.
WRITE <inf>-wrbtr
TO <inf>-spend_amt CURRENCY <inf>-waers NO-GROUPING.
SHIFT <inf>-spend_amt LEFT DELETING LEADING space.
ENDIF.
* R21_1390
* Begin of changes for CHG0015380
IF <inf>-wi_id IS NOT INITIAL.
CLEAR: <inf>-event_id,
<inf>-event_parent_id,
<inf>-event_alt_id.
ENDIF.
* Concatenation Logic: concatenating the tax line cost elements
* with their corresponding expense line cost elements
IF <inf>-tax_code IS NOT INITIAL OR <inf>-spend_purpose_secondary_cd IS INIT
IAL.
CLEAR: ls_inf.
* For Payment Documents: read the corresponding ZD/ZG Invoice
* and get the cost element and cost center from there
* Begin of changes for CHG0056997
* Line deleted as part of CHG0056997
* Extending the doc. types to K1, K3,K4 also alongwith K2
CASE <inf>-invc_type.
WHEN c_k2 OR
c_k1 OR c_k3 OR c_k4. " CHG0056997
* End of changes for CHG0015380
LOOP AT t_rpt ASSIGNING <rpt> WHERE bukrs = <inf>-bukrs
AND augbl = <inf>-belnr
AND invtp IN r_invdt.
* Check if the expense line has already moved to the final table
CLEAR ls_inf.
READ TABLE t_inf INTO ls_inf
WITH KEY bukrs = <rpt>-bukrs
belnr = <rpt>-belnr
gjahr = <rpt>-gjahr BINARY SEARCH.
IF sy-subrc EQ 0.
* Begin of changes for CHG0056997
* Get all details from expense line and populate in payment tax line
<inf>-event_id = ls_inf-event_id.
<inf>-event_nm = ls_inf-event_nm.
<inf>-global_id = ls_inf-global_id.
<inf>-event_parent_id = ls_inf-event_parent_id.
<inf>-event_alt_id = ls_inf-event_alt_id.
<inf>-po_info = ls_inf-po_info.
<inf>-customer_id = ls_inf-customer_id.
<inf>-transaction_id = ls_inf-transaction_id.
<inf>-meeting_id = ls_inf-meeting_id.
* End of changes for CHG0056997
* Concatenating the cost element
CONCATENATE <inf>-spend_purpose_cd ls_inf-spend_purpose_cd
INTO <inf>-spend_purpose_cd
SEPARATED BY '-'.
* Populating the cost center for tax lines
<inf>-spend_purpose_secondary_cd = ls_inf-spend_purpose_secondary_
cd.
ELSE. " CHG0056997
* If expense line not found for the tax line
CLEAR <inf>-belnr. " CHG0056997
ENDIF.
EXIT.
ENDLOOP.
WHEN OTHERS.
* For normal invoices:
READ TABLE lt_inf_tmp INTO ls_inf
WITH KEY bukrs = <inf>-bukrs
belnr = <inf>-belnr
gjahr = <inf>-gjahr
BINARY SEARCH.
IF sy-subrc EQ 0.
lv_tabix = sy-tabix.
LOOP AT lt_inf_tmp INTO ls_inf FROM lv_tabix.
IF ls_inf-spend_purpose_secondary_cd IS NOT INITIAL
OR ls_inf-bukrs NE <inf>-bukrs
OR ls_inf-belnr NE <inf>-belnr
OR ls_inf-gjahr NE <inf>-gjahr.
EXIT.
ENDIF.
ENDLOOP.
IF ls_inf-spend_purpose_secondary_cd IS NOT INITIAL
AND ls_inf-belnr EQ <inf>-belnr. " CHG0015380
* Concatenating the cost element
CONCATENATE <inf>-spend_purpose_cd ls_inf-spend_purpose_cd
INTO <inf>-spend_purpose_cd
SEPARATED BY '-'.
* Populating the cost center for tax lines
<inf>-spend_purpose_secondary_cd = ls_inf-spend_purpose_secondary_
cd.
ENDIF.
ENDIF.
ENDCASE.
ENDIF.
* Deleting those documents whose expense line is not
* present in final table
DELETE t_inf WHERE belnr IS INITIAL. " CHG0056997
* End of changes for CHG0015380

ENDLOOP.
ENDFORM. " FORMAT_INTERFACE
*&---------------------------------------------------------------------*
*& Form CREATE_INTERFACE_FILE
*&---------------------------------------------------------------------*
* Format and write interface file to transfer directory.
*----------------------------------------------------------------------*
FORM create_interface_file.
DATA: lv_outfile TYPE c LENGTH 120, " Output file name
lv_line TYPE c LENGTH 2000, " Output file line
lv_line_str TYPE string. "yusuf
DATA: lv_rc TYPE sy-subrc, " Return code
lv_nn TYPE n LENGTH 2, " Text element number
lv_text TYPE c LENGTH 8, " Text element name
lv_l TYPE i, " Length
lv_i TYPE i, " Current field
lv_o TYPE i. " Offset
DATA: s_inf TYPE tp_inf.
FIELD-SYMBOLS: <t1> TYPE any,
<fs> TYPE any.
CONSTANTS : c_000000000000 TYPE char12 VALUE '000000000000'. "CR06578545
lv_rc = 0.
WHILE lv_rc = 0.
* Generate file name
* File name format: SAP_SPND_DATA_YYYYMMDD_HHMISS.tsv
GET TIME.
CONCATENATE c_opath
c_fprfx c_sep2
sy-datlo c_sep2
sy-timlo
c_fextn
INTO lv_outfile.
* Make sure file does not already exist
OPEN DATASET lv_outfile FOR INPUT
IN TEXT MODE
ENCODING DEFAULT.
lv_rc = sy-subrc.
ENDWHILE.
* Open file for output
OPEN DATASET lv_outfile FOR OUTPUT
IN TEXT MODE
ENCODING DEFAULT "UTF-8
WITH WINDOWS LINEFEED.
IF sy-subrc <> 0.
MESSAGE e030 WITH lv_outfile.
ENDIF.
* Add header line containing field names
CLEAR lv_line.
DO c_nf TIMES.
lv_nn = sy-index.
CONCATENATE c_texto lv_nn INTO lv_text. " Get corres. text element
ASSIGN (lv_text) TO <t1>. " Get text
lv_rc = sy-subrc.
IF lv_rc = 0.
IF lv_nn = 1.
lv_line = <t1>.
ELSE.
CONCATENATE lv_line
c_file_sep
<t1>
INTO lv_line.
ENDIF.
ELSE.
* Prevent short dump due to missing texts/unassigned field symbol
IF lv_nn = 1.
ELSE.
CONCATENATE lv_line
c_file_sep
INTO lv_line.
ENDIF.
ENDIF.
ENDDO.
lv_line_str = lv_line. "CHG0015380
TRANSFER lv_line_str TO lv_outfile.
* Add detail lines; remove trailing spaces, separate fields with defined
* separator
LOOP AT t_inf INTO s_inf.
CLEAR: lv_line,
lv_o.
DO c_nf TIMES.
lv_i = sy-index.
ASSIGN COMPONENT lv_i OF STRUCTURE s_inf TO <fs>.
lv_rc = sy-subrc.
CLEAR lv_l.
IF lv_rc = 0.
lv_l = strlen( <fs> ).
ENDIF.
IF lv_rc = 0 AND " Field symbol assigned
lv_l > 0. " Prevent short dump on zero len
lv_line+lv_o(lv_l) = <fs>(lv_l).
* Begin of CR06578545
IF <fs>(lv_l) = c_000000000000.
CLEAR lv_line+lv_o(lv_l).
ENDIF.
* End of CR06578545
lv_o = lv_o + lv_l.
ENDIF.
IF lv_i <> c_nf. " No separator after last field
lv_line+lv_o(1) = c_file_sep.
lv_o = lv_o + 1.
ENDIF.
ENDDO.
lv_line_str = lv_line. " CHG0015380
TRANSFER lv_line_str TO lv_outfile.
ENDLOOP.
* Close dataset
CLOSE DATASET lv_outfile.
ENDFORM. " CREATE_INTERFACE_FILE
*&---------------------------------------------------------------------*
*& Form OUTPUT_REPORT
*&---------------------------------------------------------------------*
* Format and output ALV report. Do not output in background.
*----------------------------------------------------------------------*
FORM output_report.
CHECK sy-batch = space.
PERFORM alv_report_layout.
* Start of changes for CR06687537
IF p_china = c_x.
PERFORM alv_field_catalog_china.
PERFORM alv_report_china.
ELSE.
* End of changes for CR06687537
PERFORM alv_field_catalog.
PERFORM alv_report.
ENDIF. "CR06687537
ENDFORM. " OUTPUT_REPORT
*&---------------------------------------------------------------------*
*& Form alv_field_catalog
*&---------------------------------------------------------------------*
* Create list of fields for ALV report.
*----------------------------------------------------------------------*
FORM alv_field_catalog.
PERFORM add_field
USING: 'EVENT_ID' text-r01 space space,
'EVENT_NM' text-r02 space space,
'CUSTOMER_ID' text-r03 space space, "CR06578545
'HCO_ID' text-r04 space space.
* Begin R21_1407
* Only display tax ID if user has authorization
IF gv_noauth = space.
PERFORM add_field
USING: 'HCO_TAX_ID' text-r05 space space.
ENDIF.
PERFORM add_field
USING: 'HCO_NM' text-r06 space space,
* End R21_1407
'HCO_ALT_NM' text-r07 space space,
'HCO_ADRS_LN_1' text-r08 space space,
'HCO_ADRS_LN_2' text-r09 space space,
'HCO_ADRS_CITY' text-r10 space space,
'HCO_ADRS_RGN_CD' text-r11 space space,
'HCO_ADRS_PSTL_CD' text-r12 space space,
'HCO_ADRS_CNTRY_CD' text-r13 space space,
'SPEND_ID' text-r14 space space,
'SPEND_TYPE_CD' text-r15 space space,
'SPEND_PURPOSE_CD' text-r16 space space,
'SPEND_PURPOSE_SECONDARY_CD' text-r17 space space,
'SPEND_DT_PD' text-r18 space space,
'WRBTR' text-r19 space 'WAERS',
'WAERS' text-r25 space space, "CR06474471
'GLOBAL_ID' text-r20 space space,
'EVENT_PARENT_ID' text-r21 space space,
'EVENT_ALT_ID' text-r22 space space,
'PO_INFO' text-r23 c_x space, "R21_1320
"CR06474471
'BELNR' text-r40 c_x space, "CR06578545
'WI_ID' text-r32 c_x space, "CR06474471
'INVC_TYPE' text-r24 space space, "R21_1320
* Begin CR06474471
'EVENT_PROD_ID' text-r26 space space,
'PROD_NM' text-r27 space space,
'PROD_DTL_PRCNT' text-r28 space space,
'SPEND_TRAVEL_DETAILS_CITY' text-r29 space space,
'SPEND_TRAVEL_DETAILS_RGN_CD' text-r30 space space,
'SPEND_TRAVEL_DETAILS_CNTRY_CD' text-r31 space space,
* End CR06474471
* Begin of CR06578545
'ATWRT1' text-r33 space space,
'ATWRT2' text-r34 space space,
'ATWRT3' text-r35 space space,
'STCEG' text-r36 space space,
'TRANSACTION_ID' text-r38 space space,
'MEETING_ID' text-r39 space space.
* End of CR06578545
* Begin of changes for CHG0015380
* Adding the new fields in the field catalog
PERFORM add_field USING:
'TAX_CODE' text-o42 space space,
'TAX_RATE' text-o43 space space.
* End of changes for CHG0015380
ENDFORM. " alv_field_catalog
*&---------------------------------------------------------------------*
*& Form add_field
*&---------------------------------------------------------------------*
* Create single field catalog entry for main report.
*----------------------------------------------------------------------*
* --> P_FIELD Field name
* --> P_TEXT Column heading
* --> P_HOT Field is hotspot
* --> P_CURR Currency key field
*----------------------------------------------------------------------*
FORM add_field USING p_field TYPE slis_fieldname
p_text TYPE scrtext_l
p_hot TYPE c
p_curr TYPE any.
DATA: s_fieldcat TYPE slis_fieldcat_alv.
CLEAR s_fieldcat.
s_fieldcat-tabname = 'T_INF'. "CR06474471
s_fieldcat-fieldname = p_field.
s_fieldcat-seltext_l = p_text.
s_fieldcat-hotspot = p_hot.
s_fieldcat-cfieldname = p_curr.
APPEND s_fieldcat TO t_fieldcat.
ENDFORM. " add_field
*&---------------------------------------------------------------------*
*& Form alv_report_layout
*&---------------------------------------------------------------------*
* Define ALV layout and event parameters.
*----------------------------------------------------------------------*
FORM alv_report_layout.
DATA: lv_datlo TYPE sy-datlo,
lv_fdate TYPE c LENGTH 11,
lv_ftime TYPE c LENGTH 8.
DATA: s_events TYPE slis_alv_event,
s_listheader TYPE slis_listheader.
* Set layout
CLEAR s_layout.
s_layout-colwidth_optimize = c_x.
s_layout-zebra = c_x.
s_layout-get_selinfos = c_x.
s_layout-confirmation_prompt = space.
s_layout-detail_popup = c_x.
* Create top of page event
CLEAR s_events.
s_events-name = slis_ev_top_of_page.
s_events-form = slis_ev_top_of_page.
APPEND s_events TO t_events.
* Fill top of page
CLEAR s_listheader.
s_listheader-typ = c_typ_s.
s_listheader-key = text-t01.
APPEND s_listheader TO t_listheader.
* Add "subject" lines to top-of-page
* Add report name
CLEAR s_listheader.
s_listheader-typ = c_typ_s.
s_listheader-info = gv_repid.
APPEND s_listheader TO t_listheader.
* Format date and time
lv_datlo = sy-datlo.
PERFORM convert_date IN PROGRAM zrepfunc USING lv_datlo
CHANGING lv_fdate.
CONCATENATE sy-timlo(2) sy-timlo+2(2) sy-timlo+4(2)
INTO lv_ftime SEPARATED BY ':'.
* Add formatted date and time
CLEAR s_listheader.
s_listheader-typ = c_typ_s.
CONCATENATE lv_fdate lv_ftime
INTO s_listheader-info SEPARATED BY space.
APPEND s_listheader TO t_listheader.
ENDFORM. " alv_report_layout
*&---------------------------------------------------------------------*
*& Form alv_report
*&---------------------------------------------------------------------*
* Output ALV report.
*----------------------------------------------------------------------*
FORM alv_report.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = gv_repid
i_callback_user_command = slis_ev_user_command
is_layout = s_layout
it_fieldcat = t_fieldcat
i_save = c_save
it_events = t_events
TABLES
t_outtab = t_inf
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE e038(zpmp) WITH sy-subrc.
ENDIF.
ENDFORM. " alv_report
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
* Generate ALV header.
*----------------------------------------------------------------------*
FORM top_of_page. "#EC CALLED
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = t_listheader
EXCEPTIONS
OTHERS = 0.
ENDFORM. " top_of_page
* Begin R21_1390
*&---------------------------------------------------------------------*
*& Form GET_PAYMENTS
*&---------------------------------------------------------------------*
* Retrieve and process payments for invoices.
*----------------------------------------------------------------------*
FORM get_payments.
DATA: t_pfi TYPE STANDARD TABLE OF tp_pfi INITIAL SIZE 0.
DATA: t_ukey TYPE tt_ukey.
DATA: x_rpt TYPE tt_rpt.
DATA: s_rpt TYPE tp_rpt. "CR06578545
DATA: lv_cputm TYPE bkpf-cputm,
lv_hcr TYPE c LENGTH 1, " Flag: payment is reportable
lv_rc TYPE sy-subrc.
FIELD-SYMBOLS: <pfi> TYPE tp_pfi.

IF p_auto = c_x.
* Get payments for invoices from last run date; only retrieve cleared
* vendor items
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_pfi
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_paydt
AND blart IN s_blart
AND bschl IN (c_bschl_py,c_bschl_dp). "R21_1407

* Make sure document is within start and end times


LOOP AT t_pfi ASSIGNING <pfi>
WHERE cpudt = gv_frdat
OR cpudt = gv_todat.
* Get document entry time
CLEAR lv_cputm.
SELECT SINGLE cputm
INTO lv_cputm
FROM bkpf
WHERE bukrs = <pfi>-bukrs
AND belnr = <pfi>-belnr
AND gjahr = <pfi>-gjahr.
IF sy-subrc <> 0.
DELETE t_pfi.
CONTINUE.
ENDIF.
IF <pfi>-cpudt = gv_frdat AND
lv_cputm <= gv_frtim.
DELETE t_pfi.
CONTINUE.
ENDIF.
IF <pfi>-cpudt = gv_todat AND
lv_cputm > gv_totim.
DELETE t_pfi.
CONTINUE.
ENDIF.
ENDLOOP.
ELSE. " Manual execution
* Get payments for invoices
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_pfi
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_paydt
AND blart IN s_blart
AND bschl IN (c_bschl_py,c_bschl_dp). "R21_1407
ENDIF.
CHECK NOT t_pfi[] IS INITIAL.
* Process payments
LOOP AT t_pfi ASSIGNING <pfi>.
* Get all FI document items associated with the clearing document of
* the payment; this will also select the payment items
* (See Payment Usage function in payment document overview)
REFRESH t_ukey.
SELECT bukrs
lifnr " CHG0015380: added lifnr in
query
belnr
gjahr
buzei
blart
shkzg
wrbtr ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_ukey
FROM bsak
WHERE lifnr = <pfi>-lifnr
AND bukrs = <pfi>-bukrs
AND augdt = <pfi>-augdt
AND augbl = <pfi>-augbl. " Index fields

IF sy-subrc <> 0.
DELETE t_pfi.
CONTINUE.
ENDIF.
* Process documents
PERFORM process_usage TABLES t_ukey
x_rpt
USING <pfi>
space "R21_1407
'0000' "R21_1407
lv_hcr
lv_rc.
IF lv_hcr = space OR lv_rc <> 0 OR x_rpt[] IS INITIAL.
DELETE t_pfi.
CONTINUE.
ENDIF.
APPEND LINES OF x_rpt TO t_rpt.
ENDLOOP.
* Begin of changes for CHG0015380
gt_pfi[] = t_pfi[].
* End of changes for CHG0015380

* BEGIN OF CR06578545.
LOOP AT t_rpt INTO s_rpt.
wk_objek-objek = s_rpt-lifnr.
COLLECT wk_objek INTO it_objek.
ENDLOOP.
SORT it_objek BY objek.
IF it_objek IS NOT INITIAL.
SELECT objek
atinn
atwrt
FROM ausp
INTO TABLE it_ausp
FOR ALL ENTRIES IN it_objek
WHERE objek = it_objek-objek.
IF sy-subrc EQ 0.
SORT it_ausp BY objek atinn.
ENDIF.
ENDIF.
* END OF CR06578545.
ENDFORM. " GET_PAYMENTS
*&---------------------------------------------------------------------*
*& Form GET_REVERSALS
*&---------------------------------------------------------------------*
* Retrieve and process Payment Reversals.
*----------------------------------------------------------------------*
FORM get_reversals.
DATA: t_rev TYPE STANDARD TABLE OF tp_pfi INITIAL SIZE 0.
DATA: t_ukey TYPE tt_ukey.
DATA: x_rpt TYPE tt_rpt.
DATA: lv_cputm TYPE bkpf-cputm,
lv_hcr TYPE c LENGTH 1, " Flag: payment is reportable
lv_rc TYPE sy-subrc.
DATA: lv_stblg TYPE bkpf-stblg,
lv_stjah TYPE bkpf-stjah,
lv_bktxt TYPE bkpf-bktxt.
FIELD-SYMBOLS: <rev> TYPE tp_pfi.

IF p_auto = c_x.
* Get Payment Reversals for invoices from last run date; only retrieve
* cleared vendor items
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_rev
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_revdt
AND blart IN s_blart.
* Make sure document is within start and end times
LOOP AT t_rev ASSIGNING <rev>
WHERE cpudt = gv_frdat
OR cpudt = gv_todat.
* Get document entry time
CLEAR lv_cputm.
SELECT SINGLE cputm
INTO lv_cputm
FROM bkpf
WHERE bukrs = <rev>-bukrs
AND belnr = <rev>-belnr
AND gjahr = <rev>-gjahr.
IF sy-subrc <> 0.
DELETE t_rev.
CONTINUE.
ENDIF.
IF <rev>-cpudt = gv_frdat AND
lv_cputm <= gv_frtim.
DELETE t_rev.
CONTINUE.
ENDIF.
IF <rev>-cpudt = gv_todat AND
lv_cputm > gv_totim.
DELETE t_rev.
CONTINUE.
ENDIF.
ENDLOOP.
ELSE. " Manual execution
* Get Payment Reversals for invoices
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_rev
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_revdt
AND blart IN s_blart.
ENDIF.
CHECK NOT t_rev[] IS INITIAL.
* Process payment reversals
LOOP AT t_rev ASSIGNING <rev>.
* Verify payment reversal: get original payment document (the document
* reversed) and payment run
CLEAR: lv_stblg,
lv_stjah,
lv_bktxt.
SELECT SINGLE stblg stjah bktxt
INTO (lv_stblg,lv_stjah,lv_bktxt)
FROM bkpf
WHERE bukrs = <rev>-bukrs
AND belnr = <rev>-belnr
AND gjahr = <rev>-gjahr.
IF sy-subrc <> 0 OR
lv_stblg IS INITIAL OR
lv_bktxt IS INITIAL.
DELETE t_rev.
CONTINUE.
ENDIF.
* Get original invoices associated with the payment from payment run
REFRESH t_ukey.
SELECT bukrs belnr gjahr buzei
blart
shkzg wrbtr ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_ukey
FROM regup
WHERE laufd = lv_bktxt(8)
AND laufi = lv_bktxt+9(6)
AND xvorl = space
AND lifnr = <rev>-lifnr " Payment doc vendor
AND vblnr = lv_stblg " Payment doc
AND bukrs = <rev>-bukrs. " Payment doc company
IF sy-subrc <> 0.
DELETE t_rev.
CONTINUE.
ENDIF.
* Retrieve payment document items (not in payment run)
SELECT bukrs belnr gjahr buzei
blart
shkzg wrbtr ##too_many_itab_fields
APPENDING CORRESPONDING FIELDS OF TABLE t_ukey
FROM bsak
WHERE bukrs = <rev>-bukrs
AND belnr = <rev>-belnr
AND gjahr = <rev>-gjahr.
* Process documents
PERFORM process_usage TABLES t_ukey
x_rpt
USING <rev>
lv_stblg "R21_1407
lv_stjah
lv_hcr
lv_rc.
* Code removed as per CR06578545
APPEND LINES OF x_rpt TO t_rpt.
ENDLOOP.
SORT t_rpt.
ENDFORM. " GET_REVERSALS
*&---------------------------------------------------------------------*
*& Form PROCESS_USAGE
*&---------------------------------------------------------------------*
* Process invoices in payment usage.
*----------------------------------------------------------------------*
* -->T_UKEY List of Payment Usage documents
* <--X_RPT Reportable items
* -->P_PFI Current payment/reversal item
* -->LV_STBLG Reversal document number "R21_1407
* -->LV_STJAH Reversal document year "R21_1407
* <--LV_HCR Indicator: payment is HCP reportable
* <--LV_RC Return code
*----------------------------------------------------------------------*
FORM process_usage TABLES t_ukey TYPE tt_ukey
x_rpt TYPE tt_rpt
USING p_pfi TYPE tp_pfi
lv_stblg TYPE bkpf-stblg "R21_1407
lv_stjah TYPE bkpf-stjah "R21_1407
lv_hcr TYPE c
lv_rc TYPE sy-subrc.
* Type: Invoice items
TYPES: BEGIN OF tp_items,
bukrs TYPE bseg-bukrs,
belnr TYPE bseg-belnr,
gjahr TYPE bseg-gjahr,
buzei TYPE bseg-buzei,
* Begin of changes for CHG0015380
buzid TYPE buzid,
mwskz TYPE mwskz,
qsskz TYPE qsskz,
* End of changes for CHG0015380
ebeln TYPE bseg-ebeln,
ebelp TYPE bseg-ebelp,
zekkn TYPE bseg-zekkn,
hkont TYPE bseg-hkont,
lifnr TYPE lifnr, " CHG0015380
kostl TYPE bseg-kostl,
shkzg TYPE bseg-shkzg,
wrbtr TYPE bseg-wrbtr,
ktosl TYPE ktosl, " CHG0015380
sgtxt TYPE sgtxt, "CR06578545
END OF tp_items.
DATA: t_inv TYPE STANDARD TABLE OF tp_ukey INITIAL SIZE 0.
DATA: t_items TYPE STANDARD TABLE OF tp_items INITIAL SIZE 0.
* Begin of changes for CHG0015380
DATA: lv_lifnr TYPE lifnr.
FIELD-SYMBOLS: <fs_items> TYPE tp_items.
* End of changes for CHG0015380
* Begin of CR06578545
DATA: t_items1 TYPE STANDARD TABLE OF tp_items,
wa_items1 TYPE tp_items.
* End of CR06578545
DATA: ls_rpt TYPE tp_rpt.
DATA: xv_hcr TYPE c LENGTH 1, " Flag: invoice is reportable
lv_hco TYPE c LENGTH 1. "CR06474471
DATA: lv_prsid TYPE tp_prsid,
lv_verkf TYPE ekko-verkf,
lv_unsez TYPE ekko-unsez,
lv_hkont TYPE ekkn-sakto,
lv_kostl TYPE ekkn-kostl,
lv_wi_id TYPE sww_wiid,
lv_cdm_flag TYPE z_cdmfl. "CR06474471
DATA: lv_invsum TYPE p LENGTH 8 DECIMALS 2,
lv_nebtr TYPE p LENGTH 8 DECIMALS 2,
lv_nebtr_i TYPE p LENGTH 8 DECIMALS 2,
lv_tdate TYPE d.
FIELD-SYMBOLS: <ukey> TYPE tp_ukey,
<inv> TYPE tp_ukey,
<items> TYPE tp_items.

* Begin CR06474471
DATA: lt_products TYPE tt_products,
ls_products TYPE tp_products.
DATA: lt_dest TYPE tt_dest,
ls_dest TYPE tp_dest.
DATA: ls_container TYPE swcont.
DATA: lv_index TYPE sy-tabix,
lv_count TYPE i.
* End CR06474471

REFRESH x_rpt.
CLEAR lv_hcr.
lv_rc = 0.
* Create container
swc_container wi_container.
swc_create_container wi_container.

* Remove downpayment recoupment documents; downpayments are processed


* in the GET_DOWNPAYMENTS subroutine
DELETE t_ukey WHERE blart = c_bl_dpr.
* Invoices (RE, RI, etc.) and Credit memos (KG) will remain; however,
* Credit memos are ignored
* Save invoices to a separate table; find the total sum of the
* invoices
REFRESH t_inv.
CLEAR lv_invsum.

LOOP AT t_ukey ASSIGNING <ukey>


WHERE blart IN r_invdt. " Invoice doc types
* Collect invoice amounts (reverse sign for reporting)
IF <ukey>-shkzg = c_credit.
lv_invsum = lv_invsum + <ukey>-wrbtr.
ELSE.
lv_invsum = lv_invsum - <ukey>-wrbtr.
ENDIF.
* Save invoices to separate table
APPEND <ukey> TO t_inv.
DELETE t_ukey.
ENDLOOP.
IF lv_invsum = 0.
lv_rc = 4.
RETURN. "CR06474471
ENDIF.
* Process payment items
LOOP AT t_ukey ASSIGNING <ukey>
WHERE belnr = p_pfi-belnr
AND gjahr = p_pfi-gjahr.
* Retrieve actual payment amount (in document currency)
CLEAR lv_nebtr.
SELECT SINGLE nebtr
INTO lv_nebtr
FROM bseg
WHERE bukrs = <ukey>-bukrs
AND belnr = <ukey>-belnr
AND gjahr = <ukey>-gjahr
AND buzei = <ukey>-buzei.
IF lv_nebtr = 0.
* Skip payment items with zero actual payment
DELETE t_ukey.
CONTINUE.
ENDIF.
* Apply sign to payment
IF <ukey>-shkzg = c_credit.
lv_nebtr = - lv_nebtr.
ENDIF.
* Get payment document currency, Translation Date
SELECT SINGLE waers wwert
INTO (<ukey>-waers,<ukey>-wwert)
FROM bkpf
WHERE bukrs = <ukey>-bukrs
AND belnr = <ukey>-belnr
AND gjahr = <ukey>-gjahr.
* Begin of changes for CHG0015380
* Moving all payment documents to a sepaarte table gt_clr
MOVE <ukey> TO gs_clr1.
MOVE-CORRESPONDING gs_clr1 TO gs_clr.
CLEAR gs_clr1.
APPEND gs_clr TO gt_clr.
* End of changes for CHG0015380
* Process reportable invoices
LOOP AT t_inv ASSIGNING <inv>
WHERE blart IN r_invdt. " Invoice doc types
REFRESH: lt_products, "CR06474471
lt_dest. "CR06474471
CLEAR: lv_wi_id, "CR06474471
lv_cdm_flag. "CR06474471
* Check if EC invoice is linked to reportable web DR
IF <inv>-blart = c_blart_dr.
* EC invoices are not linked to POs; instead, HCP reportable EC
* invoices will have a web DR workflow container number in the
* Reference Document Number of the invoice header (and the user
* who created the web DR in the invoice header text)
SELECT SINGLE xblnr bktxt
INTO (<inv>-xblnr,<inv>-bktxt)
FROM bkpf
WHERE bukrs = <inv>-bukrs
AND belnr = <inv>-belnr
AND gjahr = <inv>-gjahr.
lv_wi_id = <inv>-xblnr. " Convert type
* See if reference doc is a web DR
SELECT SINGLE wi_id
INTO lv_wi_id
FROM swwwihead
WHERE wi_id = lv_wi_id
AND wi_type = c_wi_type " Workflow (Also Subworkflow)
AND wi_rh_task IN r_task.
IF sy-subrc <> 0.
DELETE t_inv.
CONTINUE.
ELSE.
* Retrieve web DR workflow instance container
CLEAR wi_container.
REFRESH wi_container.
CALL FUNCTION 'SWW_WI_CONTAINER_READ'
EXPORTING
wi_id = lv_wi_id
TABLES
wi_container = wi_container.
* Read Lilly Person ID
CLEAR lv_prsid.
swc_get_element wi_container c_elem_crd lv_prsid. "#EC FB_RC
* Begin CR06474471
* Get CDM Flag
swc_get_element wi_container c_elem_cia lv_cdm_flag. "#EC FB_RC
* See if Vendor is HCO
PERFORM vendor_hco USING p_pfi-lifnr
CHANGING lv_hco.
* Code removed as per CR06578545
* Payment is reportable
lv_hcr = c_x.
* Code removed as per CR06578545
* Retrieve all Products from web DR container
* (per MZWEBDRF01, field format is PRDNAMEdLInn, where d is the
* product number and nn is the line item)
LOOP AT wi_container INTO ls_container
WHERE element CP c_elem_prd.
CLEAR ls_products.
ls_products-item = ls_container-element+10(2).
ls_products-product = ls_container-element+7(1).
ls_products-value = ls_container-value.
APPEND ls_products TO lt_products.
ENDLOOP.
IF sy-subrc = 0.
SORT lt_products BY item product.
ENDIF.
* Retrieve Travel Destination (City, Region, County) from web
* DR container (see conditions for Travel Destination in
* MZWEBDRF01); Note: for non-US, Region is not populated
LOOP AT wi_container INTO ls_container
WHERE element CP c_elem_cty
OR element CP c_elem_reg
OR element CP c_elem_co.
CLEAR ls_dest.
IF ls_container-element CP c_elem_cty.
ls_dest-item = ls_container-element+6(2).
ls_dest-type = c_elem_cty.
ELSEIF ls_container-element CP c_elem_reg.
ls_dest-item = ls_container-element+8(2).
ls_dest-type = c_elem_reg.
ELSE.
ls_dest-item = ls_container-element+9(2).
ls_dest-type = c_elem_co.
ENDIF.
ls_dest-value = ls_container-value.
APPEND ls_dest TO lt_dest.
ENDLOOP.
IF sy-subrc = 0.
SORT lt_dest BY item type.
ENDIF.
* End CR06474471
ENDIF.
ENDIF.
* Get all non-vendor invoice items
REFRESH t_items.
SELECT bukrs belnr gjahr buzei
buzid " CHG0015380
mwskz " CHG0015380
qsskz " CHG0015380
ebeln ebelp zekkn
hkont
lifnr " CHG0015380
kostl
shkzg wrbtr
ktosl " CHG0015380
sgtxt " CR06578545
INTO TABLE t_items
FROM bseg
WHERE bukrs = <inv>-bukrs
AND belnr = <inv>-belnr
AND gjahr = <inv>-gjahr.
* Code removed as per CR06578545
IF sy-subrc <> 0.
DELETE t_inv.
CONTINUE.
ENDIF.
* Begin of CR06578545
t_items1[] = t_items[].
* Begin of changes for CHG0015380
* Populating the vendor
CLEAR wa_items1.
SORT t_items BY buzei.
READ TABLE t_items INTO wa_items1 WITH KEY buzei = c_001
BINARY SEARCH.
IF sy-subrc EQ 0.
lv_lifnr = wa_items1-lifnr.
LOOP AT t_items ASSIGNING <fs_items>.
<fs_items>-lifnr = lv_lifnr.
ENDLOOP.
ENDIF.
* End of changes for CHG0015380
DELETE t_items1 WHERE buzei NE c_001.
DELETE t_items WHERE buzei EQ c_001.
r_non_ec-sign = c_i.
r_non_ec-option = c_eq.
r_non_ec-low = c_blart_dr.
APPEND r_non_ec.
r_non_ec-low = c_zd.
APPEND r_non_ec.
r_non_ec-low = c_zg.
APPEND r_non_ec.
* End of CR06578545
* Code removed as per CHG0015380
IF t_items[] IS INITIAL.
DELETE t_inv.
CONTINUE.
ELSE. "CR06474471
SORT t_items BY bukrs belnr gjahr buzei. "CR06474471
ENDIF.
* Get user who created invoice, document currency
SELECT SINGLE usnam waers
INTO (<inv>-usnam,<inv>-waers)
FROM bkpf
WHERE bukrs = <inv>-bukrs
AND belnr = <inv>-belnr
AND gjahr = <inv>-gjahr.
* Process invoice items
LOOP AT t_items ASSIGNING <items>.
* Begin CR06474471
IF <inv>-blart IN r_non_ec. "CR06578545
* For web DRs, line item counter in container will not match
* BSEG-BUZEI, therefore, match instead by item order
lv_index = sy-tabix.
ELSE.
* There is only one set of values for each PO item, therefore
* the default item '1' is used
lv_index = 1.
ENDIF.
* End CR06474471
CLEAR: lv_hkont,
lv_kostl.
IF <inv>-blart IN r_non_ec. "CR06578545
* For web DRs, retrieve cost element and cost center from inv
lv_hkont = <items>-hkont.
lv_kostl = <items>-kostl.
* Compare cost element and cost center to screen selections
IF NOT lv_kostl IN s_kostl OR
NOT lv_hkont IN s_kstar.
DELETE t_items.
CONTINUE.
ENDIF.
* Begin of CR06578545
IF <inv>-blart = c_zd
OR <inv>-blart = c_zg.
* Payment is reportable if at least one invoice is reportable
lv_hcr = c_x.
ENDIF.
* End of CR06578545
ELSE.
* Retrieve cost element and cost center from invoice
***Begin of CR06101096 KOSTL and other details based on invoicing document
lv_hkont = <items>-hkont. "CR06101096
lv_kostl = <items>-kostl. "CR06101096
***End of CR06101096 KOSTL and other details based on invoicing document
* Compare cost element and cost center to screen selections
IF NOT lv_kostl IN s_kostl OR
NOT lv_hkont IN s_kstar.
DELETE t_items.
CONTINUE.
ENDIF.
* See if Vendor is HCO "CR06474471
PERFORM vendor_hco USING p_pfi-lifnr "CR06474471
CHANGING lv_hco. "CR06474471
* See if PO is HCP reportable
PERFORM hcp_reportable USING <items>-ebeln
<items>-ebelp
CHANGING xv_hcr
lv_prsid
lv_verkf
lv_unsez.
* Code removed as per CR06578545
* Payment is reportable if at least one invoice is reportable
lv_hcr = c_x.
* Code removed as per CR06578545
* Begin CR06474471
* Retrieve Product IDs and Travel Destination from PO
PERFORM po_sunshine TABLES lt_products
lt_dest
USING <items>-ebeln
<items>-ebelp.
* End CR06474471
ENDIF.
CLEAR ls_rpt.
ls_rpt-lifnr = p_pfi-lifnr.
ls_rpt-hkont = lv_hkont.
ls_rpt-bukrs = <items>-bukrs. " Need unique invoice info
ls_rpt-belnr = <items>-belnr.
* Begin CR06148157
* Save payment or payment reversal doc number for Spend ID
ls_rpt-pymnt = p_pfi-belnr.
IF NOT lv_stblg IS INITIAL.
* Use fiscal year of reversal doc
ls_rpt-gjahr = p_pfi-gjahr.
ELSE.
* Use fiscal year of invoice
ls_rpt-gjahr = <items>-gjahr.
ENDIF.
* End CR06148157
ls_rpt-buzei = <items>-buzei.
* Begin of changes for CHG0015380
ls_rpt-buzid = <items>-buzid.
ls_rpt-ktosl = <items>-ktosl.
ls_rpt-lifnr = <items>-lifnr.
ls_rpt-mwskz = <items>-mwskz.
ls_rpt-qsskz = <items>-qsskz.
* End of changes for CHG0015380
ls_rpt-blart = <ukey>-blart. " Want payment doc type here
ls_rpt-cpudt = p_pfi-cpudt.
ls_rpt-ebeln = <items>-ebeln.
ls_rpt-ebelp = <items>-ebelp.
ls_rpt-zekkn = <items>-zekkn.
ls_rpt-augbl = p_pfi-augbl.
ls_rpt-augdt = p_pfi-augdt.
IF <inv>-blart IN r_non_ec. "CR06578545
* For web DRs, get user who created web DR
ls_rpt-usnam = <inv>-bktxt.
ELSE.
* Otherwise, get user from invoice
* Begin of CR06101096
SELECT SINGLE afnam INTO <inv>-usnam
FROM ekpo
WHERE ebeln = <items>-ebeln
AND ebelp = <items>-ebelp.
IF sy-subrc EQ 0.
ls_rpt-usnam = <inv>-usnam.
ENDIF.
* End of CR06101096
ENDIF.
ls_rpt-kostl = lv_kostl.
ls_rpt-unsez = lv_unsez.
ls_rpt-verkf = lv_verkf.
ls_rpt-invtp = <inv>-blart.
IF <inv>-blart IN r_non_ec. "CR06578545
* For web DRs, read Payment Purpose from container
swc_get_element wi_container c_elem_txt ls_rpt-txz01.
IF sy-subrc <> 0.
CLEAR ls_rpt-txz01.
ENDIF.
* Begin of CR06578545
IF <inv>-blart = c_zd
OR <inv>-blart = c_zg.
READ TABLE t_items1 INTO wa_items1 WITH KEY belnr = <inv>-belnr.
IF sy-subrc EQ 0.
ls_rpt-txz01 = wa_items1-sgtxt.
ENDIF.
ENDIF.
* End of CR06578545
ELSE.
* Otherwise, get PO item Short Text
SELECT SINGLE txz01
INTO ls_rpt-txz01
FROM ekpo
WHERE ebeln = <items>-ebeln
AND ebelp = <items>-ebelp.
ENDIF.
ls_rpt-prsid = lv_prsid.
* Begin CR06474471
* Get list of products for item (link to BSEG by BUZEI)
lv_count = 1.
LOOP AT lt_products INTO ls_products WHERE item = lv_index.
IF lv_count = 1.
ls_rpt-prod = ls_products-value.
ELSE.
CONCATENATE ls_rpt-prod ls_products-value
INTO ls_rpt-prod SEPARATED BY c_sepp.
ENDIF.
ADD 1 TO lv_count.
ENDLOOP.
* Also get travel destination information
LOOP AT lt_dest INTO ls_dest WHERE item = lv_index.
IF ls_dest-type = c_elem_cty.
ls_rpt-td_city = ls_dest-value.
ELSEIF ls_dest-type = c_elem_reg.
ls_rpt-td_region = ls_dest-value.
ELSE.
ls_rpt-td_country = ls_dest-value.
ENDIF.
ENDLOOP.
* End CR06474471
* Apply sign to invoice amount
IF <items>-shkzg = c_credit.
ls_rpt-wrbtr = - <items>-wrbtr.
ELSE.
ls_rpt-wrbtr = <items>-wrbtr.
ENDIF.
* Convert payment amount from payment document currency to invoice
* document currency
IF <ukey>-waers <> <inv>-waers.
* Use payment document translation date, otherwise use doc date
CLEAR lv_tdate.
IF NOT <ukey>-wwert IS INITIAL.
lv_tdate = <ukey>-wwert.
ELSE.
lv_tdate = p_pfi-cpudt.
ENDIF.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = lv_tdate
foreign_amount = lv_nebtr
foreign_currency = <ukey>-waers
local_currency = <inv>-waers
type_of_rate = c_mrate
read_tcurr = c_x
IMPORTING
local_amount = lv_nebtr_i
EXCEPTIONS
OTHERS = 0.
ELSE.
lv_nebtr_i = lv_nebtr.
ENDIF.
* Line deleted for CHG0056997 - to populate amount from expense line
ls_rpt-waers = <inv>-waers.
ls_rpt-wi_id = lv_wi_id. "CR06474471
ls_rpt-cdm_flag = lv_cdm_flag. "CR06474471
COLLECT ls_rpt INTO x_rpt.
* Begin R21_1407
* The original payment usage will have been deleted because of the
* payment reversal; however, we still need to report the payment
* therefore, create a complimentary entry for the original payment
* document, but with the opposite amount
IF NOT lv_stblg IS INITIAL.
* Get original payment document type
SELECT SINGLE blart budat "CR06101096
INTO (ls_rpt-blart,ls_rpt-cpudt) "CR06101096
FROM bkpf
WHERE bukrs = p_pfi-bukrs
AND belnr = lv_stblg
AND gjahr = lv_stjah.
* Save original payment doc number "CR06148157
ls_rpt-pymnt = lv_stblg. "CR06148157
ls_rpt-augbl = lv_stblg. "CR06101096
* Use fiscal year of invoice "CR06148157
ls_rpt-gjahr = <items>-gjahr. "CR06148157
ls_rpt-wrbtr = - ls_rpt-wrbtr.
COLLECT ls_rpt INTO x_rpt.
ENDIF.
* End R21_1407
ENDLOOP.
ENDLOOP.
ENDLOOP.
PERFORM split_products TABLES x_rpt. "CR06474471
ENDFORM. " PROCESS_USAGE
* End R21_1390
* Begin R21_1407
*&---------------------------------------------------------------------*
*& Form GET_DOWNPAYMENTS
*&---------------------------------------------------------------------*
* Get initial downpayment FI documents.
*----------------------------------------------------------------------*
FORM get_downpayments.
DATA: t_dp TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE 0.
DATA: lv_cputm TYPE bkpf-cputm.
FIELD-SYMBOLS: <dp> TYPE tp_rpt.

IF p_auto = c_x.
* Get all open downpayments since last run
* An open downpayment has not been fully recouped; it stays open until
* value is recouped via invoices
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_dp
FROM bsik
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp " Down payment
AND belnr IN s_belnr
AND blart IN r_dpydt
AND blart IN s_blart
AND bschl = c_bschl_dp
AND ebeln IN s_ebeln.
* Get all cleared downpayments since last run
* A cleared downpayment has been fully recouped
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
APPENDING CORRESPONDING FIELDS OF TABLE t_dp
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp
AND belnr IN s_belnr
AND blart IN r_dpydt
AND blart IN s_blart
AND bschl = c_bschl_dp
AND ebeln IN s_ebeln.
* Ignore document without POs
DELETE t_dp WHERE ebeln IS INITIAL.
* Make sure document is within start and end times
LOOP AT t_dp ASSIGNING <dp>
WHERE cpudt = gv_frdat
OR cpudt = gv_todat.
* Get document entry time
CLEAR lv_cputm.
SELECT SINGLE cputm
INTO lv_cputm
FROM bkpf
WHERE bukrs = <dp>-bukrs
AND belnr = <dp>-belnr
AND gjahr = <dp>-gjahr.
IF sy-subrc <> 0.
DELETE t_dp.
CONTINUE.
ENDIF.
IF <dp>-cpudt = gv_frdat AND
lv_cputm <= gv_frtim.
DELETE t_dp.
CONTINUE.
ENDIF.
IF <dp>-cpudt = gv_todat AND
lv_cputm > gv_totim.
DELETE t_dp.
CONTINUE.
ENDIF.
ENDLOOP.
ELSE. " Manual execution
* Get all open downpayments in date range
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_dp
FROM bsik
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp
AND belnr IN s_belnr
AND blart IN r_dpydt
AND blart IN s_blart
AND bschl = c_bschl_dp
AND ebeln IN s_ebeln.
* Get all cleared downpayments in date range
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
APPENDING CORRESPONDING FIELDS OF TABLE t_dp
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp
AND belnr IN s_belnr
AND blart IN r_dpydt
AND blart IN s_blart
AND bschl = c_bschl_dp
AND ebeln IN s_ebeln.
* Ignore document without POs
DELETE t_dp WHERE ebeln IS INITIAL.
ENDIF.
CHECK NOT t_dp[] IS INITIAL.
* Process all items
PERFORM process_dp TABLES t_dp
USING space.

APPEND LINES OF t_dp TO t_rpt.


SORT t_rpt.
ENDFORM. " GET_DOWNPAYMENTS
*&---------------------------------------------------------------------*
*& Form GET_DP_REVERSALS
*&---------------------------------------------------------------------*
* Get reversals of initial downpayment FI documents.
*----------------------------------------------------------------------*
FORM get_dp_reversals.
DATA: t_dpr TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE 0.
DATA: lv_cputm TYPE bkpf-cputm.
FIELD-SYMBOLS: <dpr> TYPE tp_rpt.

IF p_auto = c_x.
* Get all open downpayments since last run
* An open downpayment has not been fully recouped; it stays open until
* value is recouped via invoices
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_dpr
FROM bsik
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp
AND belnr IN s_belnr
AND blart IN r_revdt
AND blart IN s_blart
AND ebeln IN s_ebeln.
* Get all cleared downpayments since last run
* A cleared downpayment has been fully recouped
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
APPENDING CORRESPONDING FIELDS OF TABLE t_dpr
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp
AND belnr IN s_belnr
AND blart IN r_revdt
AND blart IN s_blart
AND ebeln IN s_ebeln.
* Ignore document without POs
DELETE t_dpr WHERE ebeln IS INITIAL.
* Make sure document is within start and end times
LOOP AT t_dpr ASSIGNING <dpr>
WHERE cpudt = gv_frdat
OR cpudt = gv_todat.
* Get document entry time
CLEAR lv_cputm.
SELECT SINGLE cputm
INTO lv_cputm
FROM bkpf
WHERE bukrs = <dpr>-bukrs
AND belnr = <dpr>-belnr
AND gjahr = <dpr>-gjahr.
IF sy-subrc <> 0.
DELETE t_dpr.
CONTINUE.
ENDIF.
IF <dpr>-cpudt = gv_frdat AND
lv_cputm <= gv_frtim.
DELETE t_dpr.
CONTINUE.
ENDIF.
IF <dpr>-cpudt = gv_todat AND
lv_cputm > gv_totim.
DELETE t_dpr.
CONTINUE.
ENDIF.
ENDLOOP.
ELSE. " Manual execution
* Get all open downpayments in date range
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_dpr
FROM bsik
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp
AND belnr IN s_belnr
AND blart IN r_revdt
AND blart IN s_blart
AND ebeln IN s_ebeln.
* Get all cleared downpayments in date range
SELECT lifnr
bukrs belnr gjahr buzei blart cpudt
ebeln ebelp zekkn
wrbtr shkzg ##too_many_itab_fields
APPENDING CORRESPONDING FIELDS OF TABLE t_dpr
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umsks = c_umsks_dp
AND umskz = c_umskz_dp
AND belnr IN s_belnr
AND blart IN r_revdt
AND blart IN s_blart
AND ebeln IN s_ebeln.
* Ignore document without POs
DELETE t_dpr WHERE ebeln IS INITIAL.
ENDIF.
CHECK NOT t_dpr[] IS INITIAL.
* Process all items
PERFORM process_dp TABLES t_dpr
USING c_x.

APPEND LINES OF t_dpr TO t_rpt.


SORT t_rpt.
ENDFORM. " GET_DP_REVERSALS
*&---------------------------------------------------------------------*
*& Form PROCESS_DP
*&---------------------------------------------------------------------*
* Process downpayment or downpayment reversal items.
*----------------------------------------------------------------------*
* -->T_DP Table of downpayment or downpayment reversal items
* -->P_REV Indicator: reversals
*----------------------------------------------------------------------*
FORM process_dp TABLES t_dp TYPE tt_rpt
USING p_rev TYPE c.
DATA: lv_stblg TYPE bkpf-stblg,
lv_hco TYPE c LENGTH 1, "CR06474471
lv_hcr TYPE c LENGTH 1. " Flag: transaction is reportable
FIELD-SYMBOLS: <dp> TYPE tp_rpt.

LOOP AT t_dp ASSIGNING <dp>.


IF p_rev = c_x.
* Verify reversal
CLEAR lv_stblg.
SELECT SINGLE stblg
INTO lv_stblg
FROM bkpf
WHERE bukrs = <dp>-bukrs
AND belnr = <dp>-belnr
AND gjahr = <dp>-gjahr.
IF sy-subrc <> 0 OR
lv_stblg IS INITIAL.
DELETE t_dp.
CONTINUE.
ENDIF.
ENDIF.
* Check if Vendor is HCO "CR06474471
PERFORM vendor_hco USING <dp>-lifnr "CR06474471
CHANGING lv_hco. "CR06474471
* Check if PO is HCP reportable
PERFORM hcp_reportable USING <dp>-ebeln
<dp>-ebelp
CHANGING lv_hcr
<dp>-prsid
<dp>-verkf
<dp>-unsez.
* Code removed as per CR06578545
* Retrieve cost element and cost center from PO item account
* assignment
SELECT SINGLE sakto kostl
INTO (<dp>-hkont,<dp>-kostl)
FROM ekkn
WHERE ebeln = <dp>-ebeln
AND ebelp = <dp>-ebelp
AND zekkn = <dp>-zekkn.
IF sy-subrc <> 0.
SELECT SINGLE sakto kostl zekkn
INTO (<dp>-hkont,<dp>-kostl,<dp>-zekkn)
FROM ekkn
WHERE ebeln = <dp>-ebeln
AND ebelp = <dp>-ebelp
AND loekz = space. "#EC *
ENDIF.
* Compare cost element and cost center to screen selections
IF NOT <dp>-kostl IN s_kostl OR
NOT <dp>-hkont IN s_kstar.
DELETE t_dp.
CONTINUE.
ENDIF.
* Get user who created payment, document currency
SELECT SINGLE waers "CR06101096
INTO <dp>-waers "CR06101096
FROM bkpf
WHERE bukrs = <dp>-bukrs
AND belnr = <dp>-belnr
AND gjahr = <dp>-gjahr.
* Get PO item Short Text and requisitioner "CR06101096
SELECT SINGLE afnam txz01 "CR06101096
INTO (<dp>-usnam,<dp>-txz01) "CR06101096
FROM ekpo
WHERE ebeln = <dp>-ebeln
AND ebelp = <dp>-ebelp.
* Apply sign to amount
IF <dp>-shkzg = c_credit.
<dp>-wrbtr = - <dp>-wrbtr.
ENDIF.
ENDLOOP.
ENDFORM. " PROCESS_DP
*&---------------------------------------------------------------------*
*& Form AT_SEL_BUKRS
*&---------------------------------------------------------------------*
* Check display authorization on company code(s) entered.
*----------------------------------------------------------------------*
FORM at_sel_bukrs.
DATA: t_bukrs TYPE STANDARD TABLE OF t001-bukrs INITIAL SIZE 0.
FIELD-SYMBOLS: <bukrs> TYPE t001-bukrs.

CHECK sscrfields-ucomm = c_onli OR sscrfields-ucomm = c_prin.


* Validate company code(s) entered; check user authorization
SELECT bukrs
INTO TABLE t_bukrs
FROM t001
WHERE bukrs IN s_bukrs.
IF sy-subrc = 0.
LOOP AT t_bukrs ASSIGNING <bukrs>.
AUTHORITY-CHECK OBJECT 'ZREPO_COCD'
ID 'ACTVT' FIELD '03'
ID 'BUKRS' FIELD <bukrs>.
IF sy-subrc <> 0.
* No authorization for company code &
MESSAGE e800(fr) WITH <bukrs>.
ENDIF.
ENDLOOP.
ELSE.
* Company code & does not exist
MESSAGE e101(fr) WITH s_bukrs-low.
ENDIF.
ENDFORM. " AT_SEL_BUKRS
*&---------------------------------------------------------------------*
*& Form AT_SEL_SCREEN
*&---------------------------------------------------------------------*
* Check user's authorization to view sensitive vendor data.
*----------------------------------------------------------------------*
FORM at_sel_screen.
CLEAR gv_noauth.
AUTHORITY-CHECK OBJECT 'Z_BANKINFO'
ID 'ZACTVT' FIELD '0'.
IF sy-subrc <> 0.
gv_noauth = c_x.
ENDIF.
ENDFORM. " AT_SEL_SCREEN
*End R21_1407
* Begin CR06474471
*&---------------------------------------------------------------------*
*& Form VENDOR_HCO
*&---------------------------------------------------------------------*
* Check Vendor master data for "Health Care Org Covered Recipt"
* classification.
*----------------------------------------------------------------------*
* -->P_LIFNR Vendor
* <--P_HCO Health Care Organization
*----------------------------------------------------------------------*
FORM vendor_hco USING p_lifnr TYPE bsak-lifnr
CHANGING p_hco TYPE c.
* Type: saved Vendor HCO data
TYPES: BEGIN OF tp_vendor,
lifnr TYPE lifnr,
hco TYPE c LENGTH 1,
END OF tp_vendor.
* Table: saved Vendor HCO data
STATICS: lt_vendor TYPE SORTED TABLE OF tp_vendor
WITH UNIQUE KEY lifnr
INITIAL SIZE 0.
DATA: ls_vendor TYPE tp_vendor.
DATA: lt_ausp TYPE STANDARD TABLE OF ausp INITIAL SIZE 0.
STATICS: lv_atinn TYPE cabn-atinn.
DATA: lv_objek TYPE ausp-objek.

CLEAR p_hco.
* Check saved data first
* Note: binary search automatically applied for SORTED table
READ TABLE lt_vendor INTO ls_vendor
WITH TABLE KEY lifnr = p_lifnr.
IF sy-subrc = 0.
p_hco = ls_vendor-hco.
ELSE.
* Get Vendor HCO characteristic number
IF lv_atinn IS INITIAL.
SELECT SINGLE atinn
INTO lv_atinn
FROM cabn
WHERE atnam = c_hco. "#EC WARNOK
ENDIF.
lv_objek = p_lifnr. " Convert type
* Retrieve HCO characteristic value for Vendor
CALL FUNCTION 'CLFM_SELECT_AUSP'
EXPORTING
mafid = c_mafid
classtype = c_klart
object = lv_objek
feature = lv_atinn " Only retrieve HCO
TABLES
exp_ausp = lt_ausp
EXCEPTIONS
no_values = 1
OTHERS = 2.
IF sy-subrc = 0.
READ TABLE lt_ausp TRANSPORTING NO FIELDS
WITH KEY atwrt = c_y.
IF sy-subrc = 0.
* If Vendor HCO = Yes, then all vendor payments are HCR
p_hco = c_x.
ENDIF.
ENDIF.
* Save data for performance
CLEAR ls_vendor.
ls_vendor-lifnr = p_lifnr.
ls_vendor-hco = p_hco.
INSERT ls_vendor INTO TABLE lt_vendor.
ENDIF.
* Begin of CR06578545
wa_lifnr-lifnr = p_lifnr.
COLLECT wa_lifnr INTO it_lifnr.
* End of CR06578545
ENDFORM. " VENDOR_HCO
*&---------------------------------------------------------------------*
*& Form PO_SUNSHINE
*&---------------------------------------------------------------------*
* Retrieve the PO item texts for Reportable Product and Travel
* Destinate.
*----------------------------------------------------------------------*
* -->LT_PRODUCTS Table of Products
* -->LT_DEST Table of Travel Destination information
* -->P_EBELN PO number
* -->P_EBELP PO item
*----------------------------------------------------------------------*
FORM po_sunshine TABLES lt_products TYPE tt_products
lt_dest TYPE tt_dest
USING p_ebeln TYPE ekko-ebeln
p_ebelp TYPE ekpo-ebelp.
* Type: saved PO data
TYPES: BEGIN OF tp_po,
ebeln TYPE ekko-ebeln,
ebelp TYPE ekpo-ebelp,
products TYPE tt_products,
dest TYPE tt_dest,
END OF tp_po.
* Type: text object key
TYPES: BEGIN OF tp_stxh,
tdobject TYPE stxh-tdobject,
tdname TYPE stxh-tdname,
tdid TYPE stxh-tdid,
tdspras TYPE stxh-tdspras,
END OF tp_stxh.
* Table: saved PO data
STATICS: t_po TYPE SORTED TABLE OF tp_po
WITH UNIQUE KEY ebeln ebelp
INITIAL SIZE 0.
* Table: PO item text object keys
DATA: t_stxh TYPE STANDARD TABLE OF tp_stxh INITIAL SIZE 0.
* Table: PO item texts
DATA: t_lines TYPE STANDARD TABLE OF tline INITIAL SIZE 0.
* Table: Normalized PO text
DATA: lt_nlines TYPE tsfotabl.
DATA: lv_tdname TYPE stxh-tdname,
lv_count TYPE i.
DATA: ls_po TYPE tp_po,
ls_products TYPE tp_products.
FIELD-SYMBOLS: <po> TYPE tp_po,
<stxh> TYPE tp_stxh,
<nlines> TYPE tdline.

REFRESH: lt_products,
lt_dest.
* Check saved data first
* Note: binary search automatically applied for SORTED table
READ TABLE t_po ASSIGNING <po>
WITH TABLE KEY ebeln = p_ebeln
ebelp = p_ebelp.
IF sy-subrc = 0.
lt_products[] = <po>-products[].
lt_dest[] = <po>-dest[].
ELSE.
* Create text object ID as PO document number + PO item number
CONCATENATE p_ebeln
p_ebelp
INTO lv_tdname.
* Retrieve key for PO item text "Reportable Product List"
* Do not specify language key (could be any language)
* See TTXID and TTXIT for Valid text IDs
SELECT tdobject
tdname
tdid
tdspras
INTO TABLE t_stxh
FROM stxh
WHERE tdobject = c_tdobject " PO Item text
AND tdname = lv_tdname
AND tdid = c_tdid_prd. " Reportable Product List
* Retrieve actual Reportable Product List text
LOOP AT t_stxh ASSIGNING <stxh>.
REFRESH t_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = <stxh>-tdid
language = <stxh>-tdspras
name = <stxh>-tdname
object = <stxh>-tdobject
TABLES
lines = t_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 0 AND NOT t_lines[] IS INITIAL.
PERFORM normalize_lines TABLES t_lines
lt_nlines
USING <stxh>-tdspras.
lv_count = 1.
LOOP AT lt_nlines ASSIGNING <nlines>.
CLEAR ls_products.
ls_products-item = 1.
ls_products-product = lv_count.
ls_products-value = <nlines>.
APPEND ls_products TO lt_products.
ADD 1 TO lv_count.
ENDLOOP.
IF sy-subrc = 0.
SORT lt_products BY item product.
ENDIF.
EXIT. " EXIT loop
ENDIF.
ENDLOOP.
REFRESH t_stxh.
* Retrieve key for PO item text "Travel Destination"
SELECT tdobject
tdname
tdid
tdspras
INTO TABLE t_stxh
FROM stxh
WHERE tdobject = c_tdobject " PO Item text
AND tdname = lv_tdname
AND tdid = c_tdid_trv. " Travel Destination
* Retrieve actual Travel Destination text
LOOP AT t_stxh ASSIGNING <stxh>.
REFRESH t_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = <stxh>-tdid
language = <stxh>-tdspras
name = <stxh>-tdname
object = <stxh>-tdobject
TABLES
lines = t_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 0 AND NOT t_lines[] IS INITIAL.
PERFORM normalize_lines TABLES t_lines
lt_nlines
USING <stxh>-tdspras.
PERFORM parse_travel_dest TABLES lt_nlines
lt_dest.
EXIT. " EXIT loop
ENDIF.
ENDLOOP.
* Save data for performance
CLEAR ls_po.
ls_po-ebeln = p_ebeln.
ls_po-ebelp = p_ebelp.
ls_po-products[] = lt_products[].
ls_po-dest[] = lt_dest[].
INSERT ls_po INTO TABLE t_po.
ENDIF.
ENDFORM. " PO_SUNSHINE
*&---------------------------------------------------------------------*
*& Form NORMALIZE_LINES
*&---------------------------------------------------------------------*
* Normalized PO item texts by splitting at carriage returns or
* newlines and by removing empty lines.
*----------------------------------------------------------------------*
* -->LT_LINES Table of PO item texts
* <--LT_NLINES Table of normalized text from PO item
* -->P_LANGU Language of PO item texts in LT_LINES
*----------------------------------------------------------------------*
FORM normalize_lines TABLES lt_lines TYPE tline_t
lt_nlines TYPE tsfotabl
USING p_langu TYPE sy-langu.
DATA: lt_stream TYPE STANDARD TABLE OF tdline INITIAL SIZE 0.
DATA: lv_string TYPE string.
DATA: ls_nlines TYPE tdline.

REFRESH lt_nlines.
* Convert to stream format
CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
EXPORTING
language = p_langu
TABLES
itf_text = lt_lines
text_stream = lt_stream.
* Convert to string
CALL FUNCTION 'CONVERT_TABLE_TO_STRING'
EXPORTING
i_tabline_length = 132
IMPORTING
e_string = lv_string
TABLES
it_table = lt_stream.
* Split string at newline/CR into separate lines
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf
IN lv_string
WITH cl_abap_char_utilities=>newline
IN CHARACTER MODE.
SPLIT lv_string AT cl_abap_char_utilities=>newline
INTO TABLE lt_nlines
IN CHARACTER MODE.
* Remove lines containing only blank characters (spaces, tabs, etc.)
LOOP AT lt_nlines INTO ls_nlines.
* Find first non-blank character
FIND FIRST OCCURRENCE OF REGEX '\S' IN ls_nlines.
IF sy-subrc <> 0.
* If line contains only blank characters, delete it
DELETE lt_nlines.
ENDIF.
ENDLOOP.
ENDFORM. " NORMALIZE_LINES
*&---------------------------------------------------------------------*
*& Form PARSE_TRAVEL_DEST
*&---------------------------------------------------------------------*
* Retrieve Country Code, Region Code, and City from Travel
* Destination text.
*----------------------------------------------------------------------*
* -->LT_NLINES Table of normalized text from PO item
* <--LT_DEST Table with Country, Region, and City
*----------------------------------------------------------------------*
FORM parse_travel_dest TABLES lt_nlines TYPE tsfotabl
lt_dest TYPE tt_dest.
DATA: ls_dest TYPE tp_dest.
DATA: lv_us TYPE c LENGTH 1,
lv_region TYPE c LENGTH 1,
lv_bland TYPE t005s-bland,
lv_bezei TYPE t005u-bezei,
lv_land1 TYPE t005-land1,
lv_intca3 TYPE t005-intca3,
lv_mc_city TYPE adrcityt-mc_city,
lx_mc_city TYPE adrcityt-mc_city,
lv_size TYPE i.
TYPES: BEGIN OF xp_lines,
tdline TYPE tdline, " Original data
fline TYPE tdline, " Normalized data (for searches)
END OF xp_lines.
DATA: xt_lines TYPE STANDARD TABLE OF xp_lines INITIAL SIZE 0,
xs_lines TYPE xp_lines.
FIELD-SYMBOLS: <nlines> TYPE tdline.
* Copy orignal table; create second field with normalized data
LOOP AT lt_nlines ASSIGNING <nlines>.
CLEAR xs_lines.
xs_lines-tdline = <nlines>.
xs_lines-fline = <nlines>.
TRANSLATE xs_lines-fline TO UPPER CASE.
REPLACE ALL OCCURRENCES OF '.' IN xs_lines-fline WITH ''
IN CHARACTER MODE.
CONDENSE xs_lines-fline.
APPEND xs_lines TO xt_lines.
ENDLOOP.
* See if Country is US
LOOP AT xt_lines INTO xs_lines
WHERE fline = c_us
OR fline = c_usa.
CLEAR ls_dest.
ls_dest-item = 1.
ls_dest-type = c_elem_co.
ls_dest-value = c_us.
APPEND ls_dest TO lt_dest.
lv_us = c_x.
DELETE xt_lines.
EXIT.
ENDLOOP.
* For US, find Region
IF lv_us = c_x.
LOOP AT xt_lines INTO xs_lines.
lv_size = numofchar( xs_lines-fline ).
CHECK lv_size = 2.
* Try 2-character state name
lv_bland = xs_lines-fline.
SELECT SINGLE bland
INTO lv_bland
FROM t005s
WHERE land1 = c_us
AND bland = lv_bland.
IF sy-subrc = 0.
CLEAR ls_dest.
ls_dest-item = 1.
ls_dest-type = c_elem_reg.
ls_dest-value = lv_bland.
APPEND ls_dest TO lt_dest.
lv_region = c_x.
DELETE xt_lines.
EXIT.
ENDIF.
ENDLOOP.
* If 2-character state not found, try full state name
IF lv_region IS INITIAL.
LOOP AT xt_lines INTO xs_lines.
lv_bezei = xs_lines-fline.
* Use native SQL for case-insensitive search
EXEC SQL.
select bland
from t005U
into :lv_bland
where land1 = :c_us
and upper(bezei) = :lv_bezei
ENDEXEC.
IF sy-subrc <> 0.
* Try wild card search
lv_size = numofchar( lv_bezei ).
TRANSLATE lv_bezei(lv_size) USING ' %'.
CONCATENATE '%' lv_bezei '%' INTO lv_bezei.
EXEC SQL.
select bland
from t005U
into :lv_bland
where land1 = :c_us
and upper(bezei) like :lv_bezei
ENDEXEC.
ENDIF.
IF sy-subrc = 0.
CLEAR ls_dest.
ls_dest-item = 1.
ls_dest-type = c_elem_reg.
ls_dest-value = lv_bland.
APPEND ls_dest TO lt_dest.
lv_region = c_x.
DELETE xt_lines.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
* Search for foreign country
LOOP AT xt_lines INTO xs_lines.
lv_size = numofchar( xs_lines-fline ).
CHECK lv_size <= 3.
* Try 2-character Country name
lv_land1 = xs_lines-fline.
SELECT SINGLE land1
INTO lv_land1
FROM t005
WHERE land1 = lv_land1.
IF sy-subrc <> 0.
* Try ISO name
lv_intca3 = xs_lines-fline.
SELECT SINGLE land1
INTO lv_land1
FROM t005
WHERE intca3 = lv_intca3. "#EC WARNOK
ENDIF.
IF sy-subrc = 0.
CLEAR ls_dest.
ls_dest-item = 1.
ls_dest-type = c_elem_co.
ls_dest-value = lv_land1.
APPEND ls_dest TO lt_dest.
DELETE xt_lines.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
* Search for City
LOOP AT xt_lines INTO xs_lines.
* code removed as per CR06578545
CLEAR ls_dest.
ls_dest-item = 1.
ls_dest-type = c_elem_cty.
ls_dest-value = xs_lines-tdline.
APPEND ls_dest TO lt_dest.
DELETE xt_lines.
EXIT.
* code removed as per CR06578545
ENDLOOP.
SORT lt_dest BY item type.
ENDFORM. " PARSE_TRAVEL_DEST
*&---------------------------------------------------------------------*
*& Form SPLIT_PRODUCTS
*&---------------------------------------------------------------------*
* For line items with multiple products: split into separate
* report lines and sub-divide percentage across products.
*----------------------------------------------------------------------*
* <->X_RPT Reportable items
*----------------------------------------------------------------------*
FORM split_products TABLES x_rpt TYPE tt_rpt.
TYPES: BEGIN OF tp_prod,
desc TYPE zprod_desc,
END OF tp_prod.
DATA: lt_prod TYPE STANDARD TABLE OF tp_prod INITIAL SIZE 0,
ls_prod TYPE tp_prod.
DATA: y_rpt TYPE tt_rpt,
z_rpt TYPE tt_rpt,
s_rpt TYPE tp_rpt.
DATA: lv_id TYPE i,
lv_desc TYPE zprod_desc,
lv_p TYPE i, " Products count
lv_count TYPE sy-tabix,
lv_sum TYPE tp_rpt-wrbtr.
FIELD-SYMBOLS: <rpt> TYPE tp_rpt.

LOOP AT x_rpt ASSIGNING <rpt> WHERE prod IS NOT INITIAL.


REFRESH: lt_prod,
y_rpt.
CLEAR: lv_p,
lv_count,
lv_sum.
lv_id = 1.
* Retrieve product descriptions
SPLIT <rpt>-prod AT c_sepp INTO TABLE lt_prod IN CHARACTER MODE.
* Retrieve product ID for each product description and find number
* of separate products
* Note: Percentage will be distributed evenly across products;
* therefore, omit N/A and blank entries from product count
LOOP AT lt_prod INTO ls_prod.
* Create one line for each PRDNAME* element
CLEAR s_rpt.
s_rpt = <rpt>.
CLEAR: s_rpt-prod,
s_rpt-prod_id,
s_rpt-percentage,
lv_desc.
* Keep count of PRDNAME* elements for Product ID
s_rpt-event_prod_id = lv_id.
CONDENSE s_rpt-event_prod_id NO-GAPS.
* Find product ID
lv_desc = ls_prod-desc.
TRANSLATE lv_desc TO UPPER CASE.
IF lv_desc = c_na OR lv_desc = c_nax.
* Non-products
s_rpt-prod = c_na.
CLEAR s_rpt-prod_id.
ELSEIF ls_prod-desc IS INITIAL.
* Non-products
CLEAR: s_rpt-prod,
s_rpt-prod_id.
ELSE.
s_rpt-prod = ls_prod-desc.
* Count products
lv_p = lv_p + 1.
* Retrieve product ID by description
SELECT SINGLE zzprod_name
INTO s_rpt-prod_id
FROM ztproduct_name "#EC CI_NOFIELD
WHERE zzprod_desc = ls_prod-desc. "#EC WARNOK
IF sy-subrc <> 0.
CLEAR s_rpt-prod_id.
ENDIF.
ENDIF.
APPEND s_rpt TO y_rpt.
ADD 1 TO lv_id.
ENDLOOP.
IF lv_p = 0.
* Skip percentage processing when all entries are non-product
ELSE.
* Calculate percentage across products
LOOP AT y_rpt INTO s_rpt.
IF s_rpt-prod = c_na OR s_rpt-prod IS INITIAL.
CONTINUE.
ELSE.
lv_count = lv_count + 1.
* Split percentage equally across products
IF lv_p <> 0.
s_rpt-percentage = 100 / lv_p.
ENDIF.
* Collect sum for rounding check
lv_sum = lv_sum + s_rpt-percentage.
* Correct any rounding errors on final entry
IF lv_count = lv_p AND lv_sum <> 100.
s_rpt-percentage = s_rpt-percentage + ( 100 - lv_sum ).
ENDIF.
MODIFY y_rpt FROM s_rpt TRANSPORTING percentage.
ENDIF.
ENDLOOP.
ENDIF.
APPEND LINES OF y_rpt TO z_rpt.
* Remove original line
DELETE x_rpt.
ENDLOOP.
APPEND LINES OF z_rpt TO x_rpt.
* Update all non-product lines with default product ID of 1
CLEAR s_rpt.
s_rpt-event_prod_id = 1.
CONDENSE s_rpt-event_prod_id NO-GAPS.
MODIFY x_rpt FROM s_rpt TRANSPORTING event_prod_id
WHERE event_prod_id IS INITIAL.
ENDFORM. " SPLIT_PRODUCTS
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* Process user command; called by ALV.
*----------------------------------------------------------------------*
* --> R_UCOMM User command
* --> RS_SELFIELD Details of line selected
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield. "#EC CALLED
DATA: ls_inf TYPE tp_inf.
DATA: lv_ebeln TYPE ekpo-ebeln,
lv_ebelp TYPE ekpo-ebelp.
* Begin of CR06578545
DATA: lv_belnr TYPE belnr_d,
lv_l_item TYPE posnr,
lv_gjahr TYPE gjahr,
lv_bukrs TYPE bukrs,
lv_blart TYPE blart.
CONSTANTS: lc_hifn TYPE char1 VALUE '-'.
* End of CR06578545
CASE r_ucomm.
WHEN '&IC1'.
IF rs_selfield-sel_tab_field = 'T_INF-PO_INFO'
OR rs_selfield-sel_tab_field = 'T_INF_CHINA-SPEND_ALT_ID'. "CR06687537
* Call ME23N to display PO
IF NOT rs_selfield-value IS INITIAL.
* Split PO Reference into PO number / PO item
SPLIT rs_selfield-value AT c_sep1
INTO lv_ebeln
lv_ebelp
IN CHARACTER MODE.
SET PARAMETER ID 'BES' FIELD lv_ebeln.
SET PARAMETER ID 'BSP' FIELD lv_ebelp.
CALL TRANSACTION 'ME23N'. "#EC CI_CALLTA.
ENDIF.
ELSEIF rs_selfield-sel_tab_field = 'T_INF-WI_ID'.
* Call program ZMPXR012 to dispaly Web DR
READ TABLE t_inf INTO ls_inf INDEX rs_selfield-tabindex.
IF sy-subrc = 0 AND ls_inf-wi_id IS NOT INITIAL.
SUBMIT zmpxr012 WITH web_dr = ls_inf-wi_id
WITH cdm_flag = ls_inf-cdm_flag
AND RETURN. "#EC CI_SUBMIT
ENDIF.
* Begin of CR06578545
ELSEIF rs_selfield-sel_tab_field = 'T_INF-BELNR'.
READ TABLE t_inf INTO ls_inf INDEX rs_selfield-tabindex.
IF sy-subrc = 0 AND ls_inf-belnr IS NOT INITIAL.
SPLIT ls_inf-spend_id AT lc_hifn INTO lv_belnr lv_l_item lv_gjahr
lv_bukrs lv_blart.
SET PARAMETER ID 'BLN' FIELD ls_inf-belnr.
SET PARAMETER ID 'BUK' FIELD lv_bukrs.
SET PARAMETER ID 'GJR' FIELD lv_gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
* End of CR06578545
ENDCASE.
ENDFORM. " user_command
* End CR06474471
*&---------------------------------------------------------------------*
*& Form ID
*&---------------------------------------------------------------------*
* Get Meeting ID from the PO. *
*----------------------------------------------------------------------*
* -->P_LV_TDNAME text
* -->P_c_cusid text
* <--P_S_INF-meeting_id text
*----------------------------------------------------------------------*
FORM id USING p_lv_tdname
p_c_meeting_id
CHANGING p_s_inf-meeting_id.
* Type: text object key
TYPES: BEGIN OF tp_stxh,
tdobject TYPE stxh-tdobject,
tdname TYPE stxh-tdname,
tdid TYPE stxh-tdid,
tdspras TYPE stxh-tdspras,
END OF tp_stxh.
* Table: PO item text object keys
DATA: t_stxh TYPE STANDARD TABLE OF tp_stxh.
DATA : it_line TYPE STANDARD TABLE OF tline WITH HEADER LINE,
c_object TYPE tdobject.
FIELD-SYMBOLS : <stxh> TYPE tp_stxh.
CONSTANTS : c_client TYPE sy-mandt VALUE 100,
c1_object TYPE thead-tdobject VALUE 'BELEG',
c2_object TYPE tdobject VALUE 'EKPO'.
IF p_c_meeting_id = c_meetid2.
c_object = c2_object.
ELSE.
c_object = c1_object.
ENDIF.
SELECT tdobject
tdname
tdid
tdspras
INTO TABLE t_stxh
FROM stxh
WHERE tdobject = c_object " PO Item text
AND tdname = p_lv_tdname
AND tdid = p_c_meeting_id. "Meeting id
IF sy-subrc EQ 0.
* Retrieve meeting ID
LOOP AT t_stxh ASSIGNING <stxh>.
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = c_client
id = <stxh>-tdid
language = <stxh>-tdspras
name = <stxh>-tdname
object = <stxh>-tdobject
TABLES
lines = it_line
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
ENDIF.
LOOP AT it_line.
IF sy-tabix = 1.
p_s_inf-meeting_id = it_line-tdline.
ENDIF.
ENDLOOP.
ENDFORM. " ID
*&---------------------------------------------------------------------*
*& Form ID1
*&---------------------------------------------------------------------*
* Get Customer ID, Meeting ID, Transaction ID for ZD and ZG doc. *
*----------------------------------------------------------------------*
* -->P_LV_TDNAME text
* <--P_LV_TEXT1 text
* <--P_LV_TEXT2 text
* <--P_LV_TEXT3 text
*----------------------------------------------------------------------*
FORM id1 USING p_lv_tdname
CHANGING p_lv_text1 p_lv_text2 p_lv_text3.
DATA : it_line TYPE STANDARD TABLE OF tline WITH HEADER LINE.
CONSTANTS : c_client TYPE sy-mandt VALUE 100,
c_0001 TYPE tdid VALUE '0001',
c_object TYPE tdobject VALUE 'DOC_ITEM'.
DATA: lv_tabix TYPE n VALUE '1'. "CHG0015380
* Type: text object key
TYPES: BEGIN OF tp_stxh,
tdobject TYPE stxh-tdobject,
tdname TYPE stxh-tdname,
tdid TYPE stxh-tdid,
tdspras TYPE stxh-tdspras,
END OF tp_stxh.
* Table: PO item text object keys
DATA: t_stxh TYPE STANDARD TABLE OF tp_stxh.
FIELD-SYMBOLS : <stxh> TYPE tp_stxh.
SELECT tdobject
tdname
tdid
tdspras
INTO TABLE t_stxh
FROM stxh
WHERE tdobject = c_object " PO Item text
AND tdname = p_lv_tdname
AND tdid = c_0001. " Lilly Person ID
IF sy-subrc EQ 0.
* Retrieve meeting ID
LOOP AT t_stxh ASSIGNING <stxh>.
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = c_client
id = <stxh>-tdid
language = <stxh>-tdspras
name = <stxh>-tdname
object = <stxh>-tdobject
TABLES
lines = it_line
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
ENDIF.
* Customer ID
lv_tabix = lv_tabix + 2.
READ TABLE it_line INDEX lv_tabix .
IF sy-subrc EQ 0.
p_lv_text1 = it_line-tdline.
ENDIF.
* Transaction ID
lv_tabix = lv_tabix + 2.
READ TABLE it_line INDEX lv_tabix .
IF sy-subrc EQ 0.
p_lv_text2 = it_line-tdline.
ENDIF.
* Meeting ID
lv_tabix = lv_tabix + 2.
READ TABLE it_line INDEX lv_tabix .
IF sy-subrc EQ 0.
p_lv_text3 = it_line-tdline.
ENDIF.
ENDFORM. " ID1
* Start of changes for CR06687537
********************************************************************************
****Copied the exiting form GET_PAYMENTS, GET_REVERSALS, PROCESS_USAGE,*********
******HCP_REPORTABLE, FORMAT_INTERFACE & CREATE_INTERFACE_FILE and *************
******removed unwanted codeand made minimal changes required.*******************
********************************************************************************
*&---------------------------------------------------------------------*
*& Form GET_PAYMENTS_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_payments_china .
DATA: t_pfi TYPE STANDARD TABLE OF tp_pfi INITIAL SIZE 0.
DATA: t_ukey TYPE tt_ukey.
DATA: x_rpt TYPE tt_rpt.
DATA: s_rpt TYPE tp_rpt. "CR06578545
DATA: lv_cputm TYPE bkpf-cputm,
lv_hcr TYPE c LENGTH 1, " Flag: payment is reportable
lv_rc TYPE sy-subrc.
* Start of changes for CR06687537
TYPES: BEGIN OF ty_bkpf,
bukrs TYPE bukrs,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
cputm TYPE cputm,
END OF ty_bkpf.
DATA: ls_bkpf TYPE ty_bkpf,
lt_bkpf TYPE STANDARD TABLE OF ty_bkpf.
* End of changes for CR06687537
FIELD-SYMBOLS: <pfi> TYPE tp_pfi.

IF p_auto = c_x.
* Get payments for invoices from last run date; only retrieve cleared
* vendor items
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_pfi
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_paydt
AND bschl IN (c_bschl_py,c_bschl_dp). "R21_1407
* Make sure document is within start and end times
LOOP AT t_pfi ASSIGNING <pfi>
WHERE cpudt = gv_frdat
OR cpudt = gv_todat.
* Get document entry time
CLEAR lv_cputm.
SELECT SINGLE cputm
INTO lv_cputm
FROM bkpf
WHERE bukrs = <pfi>-bukrs
AND belnr = <pfi>-belnr
AND gjahr = <pfi>-gjahr.
IF sy-subrc <> 0.
DELETE t_pfi.
CONTINUE.
ELSE. "CR06687537
<pfi>-cputm = lv_cputm. "CR06687537
ENDIF.
IF <pfi>-cpudt = gv_frdat AND
lv_cputm <= gv_frtim.
DELETE t_pfi.
CONTINUE.
ENDIF.
IF <pfi>-cpudt = gv_todat AND
lv_cputm > gv_totim.
DELETE t_pfi.
CONTINUE.
ENDIF.
ENDLOOP.
ELSE. " Manual execution
* Get payments for invoices
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_pfi
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_paydt
AND bschl IN (c_bschl_py,c_bschl_dp). "R21_1407
ENDIF.
CHECK NOT t_pfi[] IS INITIAL.
* Start of changes for CR06687537
IF p_auto IS INITIAL.
SELECT bukrs belnr gjahr cputm
FROM bkpf
INTO TABLE lt_bkpf
FOR ALL ENTRIES IN t_pfi
WHERE bukrs = t_pfi-bukrs
AND belnr = t_pfi-belnr
AND gjahr = t_pfi-gjahr.
IF sy-subrc = 0.
SORT: lt_bkpf BY bukrs belnr gjahr.
ENDIF.
LOOP AT t_pfi ASSIGNING <pfi>.
READ TABLE lt_bkpf INTO ls_bkpf
WITH KEY bukrs = <pfi>-bukrs
belnr = <pfi>-belnr
gjahr = <pfi>-gjahr BINARY SEARCH.
IF sy-subrc = 0.
<pfi>-cputm = ls_bkpf-cputm.
ENDIF.
ENDLOOP.
ENDIF.
* End of changes for CR06687537
* Process payments
LOOP AT t_pfi ASSIGNING <pfi>.
* Get all FI document items associated with the clearing document of
* the payment; this will also select the payment items
* (See Payment Usage function in payment document overview)
REFRESH t_ukey.
SELECT bukrs belnr gjahr buzei
blart
shkzg wrbtr ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_ukey
FROM bsak
WHERE lifnr = <pfi>-lifnr
AND bukrs = <pfi>-bukrs
AND augdt = <pfi>-augdt
AND augbl = <pfi>-augbl. " Index fields
IF sy-subrc <> 0.
DELETE t_pfi.
CONTINUE.
ENDIF.
* Process documents
PERFORM process_usage_china TABLES t_ukey
x_rpt
USING <pfi>
space "R21_1407
'0000' "R21_1407
lv_hcr
lv_rc.
IF lv_hcr = space OR lv_rc <> 0 OR x_rpt[] IS INITIAL.
DELETE t_pfi.
CONTINUE.
ENDIF.
APPEND LINES OF x_rpt TO t_rpt.

ENDLOOP.
SORT t_rpt.
ENDFORM. " GET_PAYMENTS_CHINA
*&---------------------------------------------------------------------*
*& Form GET_REVERSALS_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_reversals_china .
DATA: t_rev TYPE STANDARD TABLE OF tp_pfi INITIAL SIZE 0.
DATA: t_ukey TYPE tt_ukey.
DATA: x_rpt TYPE tt_rpt.
DATA: lv_cputm TYPE bkpf-cputm,
lv_hcr TYPE c LENGTH 1, " Flag: payment is reportable
lv_rc TYPE sy-subrc.
DATA: lv_stblg TYPE bkpf-stblg,
lv_stjah TYPE bkpf-stjah,
lv_bktxt TYPE bkpf-bktxt.
* Start of changes for CR06687537
TYPES: BEGIN OF ty_bkpf,
bukrs TYPE bukrs,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
cputm TYPE cputm,
END OF ty_bkpf.
DATA: ls_bkpf TYPE ty_bkpf,
lt_bkpf TYPE STANDARD TABLE OF ty_bkpf.
* End of changes for CR06687537
FIELD-SYMBOLS: <rev> TYPE tp_pfi.

IF p_auto = c_x.
* Get Payment Reversals for invoices from last run date; only retrieve
* cleared vendor items
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_rev
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt >= gv_frdat
AND cpudt <= gv_todat
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_revdt.
* Make sure document is within start and end times
LOOP AT t_rev ASSIGNING <rev>
WHERE cpudt = gv_frdat
OR cpudt = gv_todat.
* Get document entry time
CLEAR lv_cputm.
SELECT SINGLE cputm
INTO lv_cputm
FROM bkpf
WHERE bukrs = <rev>-bukrs
AND belnr = <rev>-belnr
AND gjahr = <rev>-gjahr.
IF sy-subrc <> 0.
DELETE t_rev.
CONTINUE.
ELSE. "CR06687537
<rev>-cputm = lv_cputm. "CR06687537
ENDIF.
IF <rev>-cpudt = gv_frdat AND
lv_cputm <= gv_frtim.
DELETE t_rev.
CONTINUE.
ENDIF.
IF <rev>-cpudt = gv_todat AND
lv_cputm > gv_totim.
DELETE t_rev.
CONTINUE.
ENDIF.
ENDLOOP.
ELSE. " Manual execution
* Get Payment Reversals for invoices
SELECT DISTINCT lifnr
bukrs belnr gjahr
blart cpudt
augbl augdt
INTO CORRESPONDING FIELDS OF TABLE t_rev
FROM bsak
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND lifnr IN s_lifnr
AND umskz = space
AND belnr IN s_belnr
AND blart IN r_revdt.
ENDIF.
CHECK NOT t_rev[] IS INITIAL.
* Start of changes for CR06687537
IF p_auto IS INITIAL.
SELECT bukrs belnr gjahr cputm
FROM bkpf
INTO TABLE lt_bkpf
FOR ALL ENTRIES IN t_rev
WHERE bukrs = t_rev-bukrs
AND belnr = t_rev-belnr
AND gjahr = t_rev-gjahr.
IF sy-subrc = 0.
SORT: lt_bkpf BY bukrs belnr gjahr.
ENDIF.
LOOP AT t_rev ASSIGNING <rev>.
READ TABLE lt_bkpf INTO ls_bkpf
WITH KEY bukrs = <rev>-bukrs
belnr = <rev>-belnr
gjahr = <rev>-gjahr BINARY SEARCH.
IF sy-subrc = 0.
<rev>-cputm = ls_bkpf-cputm.
ENDIF.
ENDLOOP.
ENDIF.
* End of changes for CR06687537
* Process payment reversals
LOOP AT t_rev ASSIGNING <rev>.
* Verify payment reversal: get original payment document (the document
* reversed) and payment run
CLEAR: lv_stblg,
lv_stjah,
lv_bktxt.
SELECT SINGLE stblg stjah bktxt
INTO (lv_stblg,lv_stjah,lv_bktxt)
FROM bkpf
WHERE bukrs = <rev>-bukrs
AND belnr = <rev>-belnr
AND gjahr = <rev>-gjahr.
IF sy-subrc <> 0 OR
lv_stblg IS INITIAL OR
lv_bktxt IS INITIAL.
DELETE t_rev.
CONTINUE.
ENDIF.
* Get original invoices associated with the payment from payment run
REFRESH t_ukey.
SELECT bukrs belnr gjahr buzei
blart
shkzg wrbtr ##too_many_itab_fields
INTO CORRESPONDING FIELDS OF TABLE t_ukey
FROM regup
WHERE laufd = lv_bktxt(8)
AND laufi = lv_bktxt+9(6)
AND xvorl = space
AND lifnr = <rev>-lifnr " Payment doc vendor
AND vblnr = lv_stblg " Payment doc
AND bukrs = <rev>-bukrs. " Payment doc company
IF sy-subrc <> 0.
DELETE t_rev.
CONTINUE.
ENDIF.
* Retrieve payment document items (not in payment run)
SELECT bukrs belnr gjahr buzei
blart
shkzg wrbtr ##too_many_itab_fields
APPENDING CORRESPONDING FIELDS OF TABLE t_ukey
FROM bsak
WHERE bukrs = <rev>-bukrs
AND belnr = <rev>-belnr
AND gjahr = <rev>-gjahr.
* Process documents
PERFORM process_usage_china TABLES t_ukey
x_rpt
USING <rev>
lv_stblg "R21_1407
lv_stjah
lv_hcr
lv_rc.
* Code removed as per CR06578545
APPEND LINES OF x_rpt TO t_rpt.
ENDLOOP.
SORT t_rpt.

ENDFORM. " GET_REVERSALS_CHINA


*&---------------------------------------------------------------------*
*& Form PROCESS_USAGE_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_T_UKEY text
* -->P_X_RPT text
* -->P_<PFI> text
* -->P_SPACE text
* -->P_9114 text
* -->P_LV_HCR text
* -->P_LV_RC text
*----------------------------------------------------------------------*
FORM process_usage_china
TABLES t_ukey TYPE tt_ukey
x_rpt TYPE tt_rpt
USING p_pfi TYPE tp_pfi
lv_stblg TYPE bkpf-stblg "R21_1407
lv_stjah TYPE bkpf-stjah "R21_1407
lv_hcr TYPE c
lv_rc TYPE sy-subrc.
* Type: Invoice items
TYPES: BEGIN OF tp_items,
bukrs TYPE bseg-bukrs,
belnr TYPE bseg-belnr,
gjahr TYPE bseg-gjahr,
buzei TYPE bseg-buzei,
ebeln TYPE bseg-ebeln,
ebelp TYPE bseg-ebelp,
zekkn TYPE bseg-zekkn,
hkont TYPE bseg-hkont,
kostl TYPE bseg-kostl,
shkzg TYPE bseg-shkzg,
wrbtr TYPE bseg-wrbtr,
sgtxt TYPE sgtxt, "CR06578545
END OF tp_items.
DATA: t_inv TYPE STANDARD TABLE OF tp_ukey INITIAL SIZE 0.
DATA: t_items TYPE STANDARD TABLE OF tp_items INITIAL SIZE 0.
* Begin of CR06578545
DATA: t_items1 TYPE STANDARD TABLE OF tp_items,
wa_items1 TYPE tp_items.
* End of CR06578545
DATA: ls_rpt TYPE tp_rpt.
DATA: xv_hcr TYPE c LENGTH 1. " Flag: invoice is reportable
DATA: lv_prsid TYPE tp_prsid,
lv_meetid TYPE text20, "CR06687537
lv_menge TYPE bstmg, "CR06687537
lv_verkf TYPE ekko-verkf,
lv_unsez TYPE ekko-unsez,
lv_hkont TYPE ekkn-sakto,
lv_kostl TYPE ekkn-kostl.
DATA: lv_invsum TYPE p LENGTH 8 DECIMALS 2,
lv_nebtr TYPE p LENGTH 8 DECIMALS 2,
lv_nebtr_i TYPE p LENGTH 8 DECIMALS 2,
lv_tdate TYPE d.
FIELD-SYMBOLS: <ukey> TYPE tp_ukey,
<inv> TYPE tp_ukey,
<items> TYPE tp_items.
DATA: lv_index TYPE sy-tabix,
lv_count TYPE i.
* End CR06474471

REFRESH x_rpt.
CLEAR lv_hcr.
lv_rc = 0.
* Invoices (RE, RI, etc.) and Credit memos (KG) will remain; however,
* Credit memos are ignored
* Save invoices to a separate table; find the total sum of the
* invoices
REFRESH t_inv.
CLEAR lv_invsum.

LOOP AT t_ukey ASSIGNING <ukey>


WHERE blart IN r_invdt. " Invoice doc types
* Collect invoice amounts (reverse sign for reporting)
IF <ukey>-shkzg = c_credit.
lv_invsum = lv_invsum + <ukey>-wrbtr.
ELSE.
lv_invsum = lv_invsum - <ukey>-wrbtr.
ENDIF.
* Save invoices to separate table
APPEND <ukey> TO t_inv.
DELETE t_ukey.
ENDLOOP.
IF lv_invsum = 0.
lv_rc = 4.
RETURN. "CR06474471
ENDIF.
* Process payment items
LOOP AT t_ukey ASSIGNING <ukey>
WHERE belnr = p_pfi-belnr
AND gjahr = p_pfi-gjahr.
* Retrieve actual payment amount (in document currency)
CLEAR lv_nebtr.
SELECT SINGLE nebtr
INTO lv_nebtr
FROM bseg
WHERE bukrs = <ukey>-bukrs
AND belnr = <ukey>-belnr
AND gjahr = <ukey>-gjahr
AND buzei = <ukey>-buzei.
IF lv_nebtr = 0.
* Skip payment items with zero actual payment
DELETE t_ukey.
CONTINUE.
ENDIF.
* Apply sign to payment
IF <ukey>-shkzg = c_credit.
lv_nebtr = - lv_nebtr.
ENDIF.
* Get payment document currency, Translation Date
SELECT SINGLE waers wwert
INTO (<ukey>-waers,<ukey>-wwert)
FROM bkpf
WHERE bukrs = <ukey>-bukrs
AND belnr = <ukey>-belnr
AND gjahr = <ukey>-gjahr.

* Process reportable invoices


LOOP AT t_inv ASSIGNING <inv>
WHERE blart IN r_invdt. " Invoice doc types
* Get all non-vendor invoice items
REFRESH t_items.
SELECT bukrs belnr gjahr buzei
ebeln ebelp zekkn
hkont kostl
shkzg wrbtr sgtxt "CR06578545
INTO TABLE t_items
FROM bseg
WHERE bukrs = <inv>-bukrs
AND belnr = <inv>-belnr
AND gjahr = <inv>-gjahr.
* Code removed as per CR06578545
IF sy-subrc <> 0.
DELETE t_inv.
CONTINUE.
ENDIF.
* Begin of CR06578545
t_items1[] = t_items[].
DELETE t_items1 WHERE buzei NE c_001.
DELETE t_items WHERE buzei EQ c_001.
r_non_ec-sign = c_i.
r_non_ec-option = c_eq.
r_non_ec-low = c_blart_dr.
APPEND r_non_ec.
r_non_ec-low = c_zd.
APPEND r_non_ec.
r_non_ec-low = c_zg.
APPEND r_non_ec.
* End of CR06578545
* For non-EC invoices, check PO
IF <inv>-blart NOT IN r_non_ec. "CR06578545
DELETE t_items WHERE ebeln IS INITIAL.
ENDIF. "R21_1407
DELETE t_items WHERE NOT ebeln IN s_ebeln.
IF t_items[] IS INITIAL.
DELETE t_inv.
CONTINUE.
ELSE. "CR06474471
SORT t_items BY bukrs belnr gjahr buzei. "CR06474471
ENDIF.
* Get user who created invoice, document currency
SELECT SINGLE usnam waers
INTO (<inv>-usnam,<inv>-waers)
FROM bkpf
WHERE bukrs = <inv>-bukrs
AND belnr = <inv>-belnr
AND gjahr = <inv>-gjahr.
* Process invoice items
LOOP AT t_items ASSIGNING <items>.
* Begin CR06474471
IF <inv>-blart IN r_non_ec. "CR06578545
* For web DRs, line item counter in container will not match
* BSEG-BUZEI, therefore, match instead by item order
lv_index = sy-tabix.
ELSE.
* There is only one set of values for each PO item, therefore
* the default item '1' is used
lv_index = 1.
ENDIF.
* End CR06474471
CLEAR: lv_hkont,
lv_kostl.
* Retrieve cost element and cost center from invoice
***Begin of CR06101096 KOSTL and other details based on invoicing document
lv_hkont = <items>-hkont. "CR06101096
lv_kostl = <items>-kostl. "CR06101096
***End of CR06101096 KOSTL and other details based on invoicing document

* Compare cost element and cost center to screen selections


IF NOT lv_kostl IN s_kostl OR
NOT lv_hkont IN s_kstar.
DELETE t_items.
CONTINUE.
ENDIF.
* See if PO is HCP reportable
PERFORM hcp_reportable_china USING <items>-ebeln
<items>-ebelp
CHANGING lv_hcr
lv_prsid
lv_verkf
lv_unsez
lv_meetid. "CR06687537
* Start of changes for CR06687537
IF lv_hcr IS INITIAL.
EXIT.
ENDIF.
* End of changes for CR06687537
CLEAR ls_rpt.
ls_rpt-lifnr = p_pfi-lifnr.
ls_rpt-hkont = lv_hkont.
ls_rpt-bukrs = <items>-bukrs. " Need unique invoice info
ls_rpt-belnr = <items>-belnr.
* Begin CR06148157
* Save payment or payment reversal doc number for Spend ID
ls_rpt-pymnt = p_pfi-belnr.
IF NOT lv_stblg IS INITIAL.
* Use fiscal year of reversal doc
ls_rpt-gjahr = p_pfi-gjahr.
ELSE.
* Use fiscal year of invoice
ls_rpt-gjahr = <items>-gjahr.
ENDIF.
* End CR06148157
ls_rpt-buzei = <items>-buzei.
ls_rpt-blart = <ukey>-blart. " Want payment doc type here
ls_rpt-cpudt = p_pfi-cpudt.
ls_rpt-cputm = p_pfi-cputm.
ls_rpt-ebeln = <items>-ebeln.
ls_rpt-ebelp = <items>-ebelp.
ls_rpt-zekkn = <items>-zekkn.
ls_rpt-augbl = p_pfi-augbl.
ls_rpt-augdt = p_pfi-augdt.
IF <inv>-blart IN r_non_ec. "CR06578545
* For web DRs, get user who created web DR
ls_rpt-usnam = <inv>-bktxt.
ELSE.
* Otherwise, get user from invoice
* Begin of CR06101096
SELECT SINGLE afnam INTO <inv>-usnam
FROM ekpo
WHERE ebeln = <items>-ebeln
AND ebelp = <items>-ebelp.
IF sy-subrc = 0.
ls_rpt-usnam = <inv>-usnam.
ENDIF.
* End of CR06101096
ENDIF.
ls_rpt-kostl = lv_kostl.
ls_rpt-unsez = lv_unsez.
ls_rpt-verkf = lv_verkf.
ls_rpt-invtp = <inv>-blart.
IF <inv>-blart IN r_non_ec. "CR06578545
* Begin of CR06578545
IF <inv>-blart = c_zd
OR <inv>-blart = c_zg.
READ TABLE t_items1 INTO wa_items1 WITH KEY belnr = <inv>-belnr.
IF sy-subrc EQ 0.
ls_rpt-txz01 = wa_items1-sgtxt.
ENDIF.
ENDIF.
* End of CR06578545
ELSE.
* Otherwise, get PO item Short Text
SELECT SINGLE txz01
INTO ls_rpt-txz01
FROM ekpo
WHERE ebeln = <items>-ebeln
AND ebelp = <items>-ebelp.
ENDIF.
ls_rpt-prsid = lv_prsid.
ls_rpt-meetid = lv_meetid.
* Apply sign to invoice amount
IF <items>-shkzg = c_credit.
ls_rpt-wrbtr = - <items>-wrbtr.
ELSE.
ls_rpt-wrbtr = <items>-wrbtr.
ENDIF.
* Convert payment amount from payment document currency to invoice
* document currency
IF <ukey>-waers <> <inv>-waers.
* Use payment document translation date, otherwise use doc date
CLEAR lv_tdate.
IF NOT <ukey>-wwert IS INITIAL.
lv_tdate = <ukey>-wwert.
ELSE.
lv_tdate = p_pfi-cpudt.
ENDIF.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = lv_tdate
foreign_amount = lv_nebtr
foreign_currency = <ukey>-waers
local_currency = <inv>-waers
type_of_rate = c_mrate
read_tcurr = c_x
IMPORTING
local_amount = lv_nebtr_i
EXCEPTIONS
OTHERS = 0.
ELSE.
lv_nebtr_i = lv_nebtr.
ENDIF.
* Calculate contribution of payment to each cost element
* Payment amount per cost element = payment amount * Percent
* of payment
* Percent of payment = cost element amount / Sum of all invoice
* amounts
ls_rpt-wrbtr = lv_nebtr_i * ( ls_rpt-wrbtr / lv_invsum ).
ls_rpt-waers = <inv>-waers.
COLLECT ls_rpt INTO x_rpt.
* Begin R21_1407
* The original payment usage will have been deleted because of the
* payment reversal; however, we still need to report the payment
* therefore, create a complimentary entry for the original payment
* document, but with the opposite amount
IF NOT lv_stblg IS INITIAL.
* Get original payment document type
SELECT SINGLE blart budat "CR06101096
INTO (ls_rpt-blart,ls_rpt-cpudt) "CR06101096
FROM bkpf
WHERE bukrs = p_pfi-bukrs
AND belnr = lv_stblg
AND gjahr = lv_stjah.
* Save original payment doc number "CR06148157
ls_rpt-pymnt = lv_stblg. "CR06148157
ls_rpt-augbl = lv_stblg. "CR06101096
* Use fiscal year of invoice "CR06148157
ls_rpt-gjahr = <items>-gjahr. "CR06148157
ls_rpt-wrbtr = - ls_rpt-wrbtr.
COLLECT ls_rpt INTO x_rpt.
ENDIF.
* End R21_1407
ENDLOOP.
* Start of changes for CR06687537
IF lv_hcr IS INITIAL.
EXIT.
ENDIF.
* End of changes for CR06687537
ENDLOOP.
ENDLOOP.
ENDFORM. " PROCESS_USAGE_CHINA
*&---------------------------------------------------------------------*
*& Form HCP_REPORTABLE_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_<ITEMS>_EBELN text
* -->P_<ITEMS>_EBELP text
* <--P_XV_HCR text
* <--P_LV_PRSID text
* <--P_LV_VERKF text
* <--P_LV_UNSEZ text
*----------------------------------------------------------------------*
FORM hcp_reportable_china
USING p_ebeln TYPE ekko-ebeln
p_ebelp TYPE ekpo-ebelp
CHANGING p_hcr TYPE c
p_prsid TYPE tp_prsid
p_verkf TYPE ekko-verkf
p_unsez TYPE ekko-unsez
p_meetid TYPE text20. "CR06687537
* Type: saved PO data
TYPES: BEGIN OF tp_po,
ebeln TYPE ekko-ebeln,
ebelp TYPE ekpo-ebelp,
hcr TYPE c LENGTH 1,
prsid TYPE tp_prsid,
verkf TYPE ekko-verkf,
unsez TYPE ekko-unsez,
meetid TYPE text20, "CR06719587
END OF tp_po.
* Type: text object key
TYPES: BEGIN OF tp_stxh,
tdobject TYPE stxh-tdobject,
tdname TYPE stxh-tdname,
tdid TYPE stxh-tdid,
tdspras TYPE stxh-tdspras,
END OF tp_stxh.
* Table: saved PO data
STATICS: t_po TYPE SORTED TABLE OF tp_po
WITH UNIQUE KEY ebeln ebelp
INITIAL SIZE 0.
* Table: PO item text object keys
DATA: t_stxh TYPE STANDARD TABLE OF tp_stxh INITIAL SIZE 0.
* Table: PO item texts
DATA: t_lines TYPE STANDARD TABLE OF tline INITIAL SIZE 0.
DATA: lv_tdname TYPE stxh-tdname,
ls_po TYPE tp_po.
FIELD-SYMBOLS: <po> TYPE tp_po,
<stxh> TYPE tp_stxh,
<lines> TYPE tline.

CLEAR: p_hcr,
p_prsid,
p_verkf,
p_unsez,
p_meetid. "CR06687537

* Check saved data first


* Note: binary search automatically applied for SORTED table
READ TABLE t_po ASSIGNING <po>
WITH TABLE KEY ebeln = p_ebeln
ebelp = p_ebelp.
IF sy-subrc = 0.
p_hcr = <po>-hcr.
p_prsid = <po>-prsid.
p_verkf = <po>-verkf.
p_unsez = <po>-unsez.
p_meetid = <po>-meetid.
ELSE.
* Create text object ID as PO document number + PO item number
CONCATENATE p_ebeln
p_ebelp
INTO lv_tdname.
* Retrieve key for PO item text "Lilly Person ID"
* Do not specify language key (could be any language)
* See TTXID and TTXIT for Valid text IDs
SELECT tdobject
tdname
tdid
tdspras
INTO TABLE t_stxh
FROM stxh
WHERE tdobject = c_tdobject " PO Item text
AND tdname = lv_tdname
AND tdid = c_tdid. " Customer id "CR06578545
* Retrieve actual Lilly Person ID text; will contain CDR or blank
LOOP AT t_stxh ASSIGNING <stxh>.
REFRESH t_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = <stxh>-tdid
language = <stxh>-tdspras
name = <stxh>-tdname
object = <stxh>-tdobject
TABLES
lines = t_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 0 AND NOT t_lines[] IS INITIAL.
LOOP AT t_lines ASSIGNING <lines>
WHERE tdline <> space.
p_prsid = <lines>-tdline.
EXIT.
ENDLOOP.
EXIT. " EXIT loop
ENDIF.
ENDLOOP.
* Start of changes for CR06687537
* Retrieve key for PO item text "Meetind ID"
* Do not specify language key (could be any language)
* See TTXID and TTXIT for Valid text IDs
CLEAR t_stxh.
SELECT tdobject
tdname
tdid
tdspras
INTO TABLE t_stxh
FROM stxh
WHERE tdobject = c_tdobject " PO Item text
AND tdname = lv_tdname
AND tdid = c_meetid2. " Meeting id "
* Retrieve actual Lilly Person ID text; will contain CDR or blank
LOOP AT t_stxh ASSIGNING <stxh>.
REFRESH t_lines.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = <stxh>-tdid
language = <stxh>-tdspras
name = <stxh>-tdname
object = <stxh>-tdobject
TABLES
lines = t_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 0 AND NOT t_lines[] IS INITIAL.
LOOP AT t_lines ASSIGNING <lines>
WHERE tdline <> space.
p_meetid = <lines>-tdline.
EXIT.
ENDLOOP.
EXIT. " EXIT loop
ENDIF.
ENDLOOP.
* End of changes for CR06687537
* Clinical grants will not use Lilly Person ID field; use header-level
* PO fields instead: Our Reference, Salesperson
SELECT SINGLE verkf
unsez
INTO (p_verkf,
p_unsez)
FROM ekko
WHERE ebeln = p_ebeln.
IF p_prsid IS INITIAL AND p_meetid IS NOT INITIAL.
IF p_meetid IN s_meet.
p_hcr = c_x.
ENDIF.
ENDIF.
* Save data for performance
CLEAR ls_po.
ls_po-ebeln = p_ebeln.
ls_po-ebelp = p_ebelp.
ls_po-hcr = p_hcr.
ls_po-prsid = p_prsid.
ls_po-meetid = p_meetid.
ls_po-verkf = p_verkf.
ls_po-unsez = p_unsez.
INSERT ls_po INTO TABLE t_po.
ENDIF.

ENDFORM. " HCP_REPORTABLE_CHINA


*&---------------------------------------------------------------------*
*& Form FORMAT_INTERFACE_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM format_interface_china .
DATA: ls_inf TYPE tp_inf_china. "CR06687537
DATA: lv_pymnt TYPE c LENGTH 10, "CR06148157
lv_isocd TYPE isocd. "CR06474471

FIELD-SYMBOLS: <rpt> TYPE tp_rpt,


<inf> TYPE tp_inf_china. "CR06687537
* Start of changes for CR06687537
CONSTANTS: lc_lly TYPE c LENGTH 3 VALUE 'LLY',
lc_chief TYPE c LENGTH 12 VALUE 'ChiefMtg',
lc_mtspnd TYPE c LENGTH 12 VALUE 'MEETINGSPEND',
lc_overall_mtg_spnd TYPE c LENGTH 50 VALUE 'Overall Meeting Spend'
,
lc_spendtypcd TYPE c LENGTH 7 VALUE 'Payment',
lc_spendprpcd TYPE c LENGTH 25 VALUE 'Aggregate Meeting Spen
d',
lc_hco TYPE c LENGTH 3 VALUE 'HCO',
lc_payee TYPE c LENGTH 5 VALUE 'Payee',
lc_100per TYPE c LENGTH 5 VALUE '100',
lc_sap TYPE c LENGTH 3 VALUE 'SAP'.
* End of changes for CR06687537

LOOP AT t_rpt ASSIGNING <rpt>.


CLEAR ls_inf.
IF NOT <rpt>-unsez IS INITIAL OR
NOT <rpt>-verkf IS INITIAL.
CONCATENATE <rpt>-unsez c_sep1
<rpt>-verkf
INTO ls_inf-event_id.
ENDIF.
* Start of changes for CR06687537
ls_inf-event_nm = <rpt>-txz01.
ls_inf-event_strt_dt+0(2) = <rpt>-cpudt+6(2).
ls_inf-event_strt_dt+2(2) = <rpt>-cpudt+4(2).
ls_inf-event_strt_dt+4(4) = <rpt>-cpudt+0(4).
ls_inf-event_strt_dt+8(6) = <rpt>-cputm.
ls_inf-event_typ_cd = lc_overall_mtg_spnd. "<rpt>-hkont.
ls_inf-event_parent_id = <rpt>-meetid.
ls_inf-eventparentcompanycd = lc_lly.
ls_inf-eventparentsrcsyscd = lc_chief.
ls_inf-eventsubtypecd = <rpt>-hkont. "c_cost_element.
ls_inf-eventparentcountry = <rpt>-country.
ls_inf-eventviacustomertype = lc_hco.
ls_inf-eventcustomereventrole = lc_payee.
* End of changes for CR06687537
*Code Deleted as Per CR06556798
* Begin of CR06556798
*Sending the vendor information
*If tax code 1 (used in the US for SS#) is populated with a valid SS # send (a
ssumes that TC2 isblank (rules))
*If tax code 1 is used (and is 000-00-0000) don t send (Assumes same a ab
ove)
*If Tax cdoe 1 is blank send , if tax code 2 blank
*If Tax code 1 is blank and TC 2 is not, send!
*All fields are sent if the criteria are met
IF <rpt>-stcd1 CN '0- '
OR <rpt>-stcd1 IS INITIAL .
* End of CR06556798
* Vendor
WRITE <rpt>-lifnr " Remove leading zeros
TO ls_inf-hco_id.
ls_inf-hco_nm = <rpt>-name1.
ls_inf-hco_alt_nm = <rpt>-name2.
* Vendor address
ls_inf-hco_adrs_ln_1 = <rpt>-street.
ls_inf-hco_adrs_ln_2 = <rpt>-str_suppl1.
ls_inf-hco_adrs_city = <rpt>-city1.
ls_inf-hco_adrs_rgn_cd = <rpt>-region.
ls_inf-hco_adrs_pstl_cd = <rpt>-post_code1.
ls_inf-hco_adrs_cntry_cd = <rpt>-country.
ENDIF. "CR06474471
* SPEND_ID is the concatenation of the FI document item info
WRITE <rpt>-belnr " Remove leading zeros
TO ls_inf-spend_id.
* Begin CR06148157
* Add payment document (or 0000000000 for downpayments)
IF NOT <rpt>-pymnt IS INITIAL.
WRITE <rpt>-pymnt " Remove leading zeros
TO lv_pymnt.
ELSE.
CLEAR lv_pymnt WITH '0' IN CHARACTER MODE.
ENDIF.
* End CR06148157
CONCATENATE ls_inf-spend_id c_sep1
<rpt>-buzei c_sep1
<rpt>-gjahr c_sep1
<rpt>-bukrs c_sep1 "R21_1407
<rpt>-blart c_sep1 "R21_1407 "CR06148157
lv_pymnt "CR06148157
INTO ls_inf-spend_id.
CONCATENATE <rpt>-ebeln c_sep1
<rpt>-ebelp
INTO ls_inf-spend_alt_id.

ls_inf-spend_dt_pd = ls_inf-event_strt_dt.
* ALV-only fields
ls_inf-wrbtr = <rpt>-wrbtr.
ls_inf-waers = <rpt>-waers.
* Begin CR06474471
* Convert SAP currency key to ISO
CLEAR lv_isocd.
CALL FUNCTION 'CURRENCY_CODE_SAP_TO_ISO'
EXPORTING
sap_code = ls_inf-waers
IMPORTING
iso_code = lv_isocd
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
ls_inf-currency = lv_isocd.
ELSE.
ls_inf-currency = ls_inf-waers.
ENDIF.
* End CR06474471
* Start of changes for CR06687537
ls_inf-eventcustomerid = ls_inf-spend_id.
ls_inf-spendtypecd = lc_spendtypcd.
ls_inf-spendpurposecd = lc_spendprpcd.
ls_inf-spend_cost_center = <rpt>-kostl.
ls_inf-spend_cost_element = <rpt>-hkont.
ls_inf-spendcostcenterpersent = lc_100per.
ls_inf-companycd = lc_lly.
ls_inf-src_sys_id = lc_sap.
ls_inf-srcsystypecd = lc_mtspnd.
ls_inf-countrycd = <rpt>-country.
ls_inf-eventcreatedby = <rpt>-usnam.
IF ls_inf-event_id IS INITIAL.
CONCATENATE ls_inf-src_sys_id ls_inf-spend_id INTO ls_inf-event_id.
ENDIF.
COLLECT ls_inf INTO t_inf_china.
* End of changes for CR06687537
ENDLOOP.
LOOP AT t_inf_china ASSIGNING <inf>.
* R21_1390
* Apply currency formatting for interface file
IF <inf>-wrbtr < 0.
WRITE <inf>-wrbtr
TO <inf>-spend_amt CURRENCY <inf>-waers NO-SIGN NO-GROUPING.
SHIFT <inf>-spend_amt LEFT DELETING LEADING space.
* Add sign
CONCATENATE '-'
<inf>-spend_amt
INTO <inf>-spend_amt.
ELSE.
WRITE <inf>-wrbtr
TO <inf>-spend_amt CURRENCY <inf>-waers NO-GROUPING.
SHIFT <inf>-spend_amt LEFT DELETING LEADING space.
ENDIF.
* R21_1390
ENDLOOP.
ENDFORM. " FORMAT_INTERFACE_CHINA
*&---------------------------------------------------------------------*
*& Form CREATE_INTERFACE_FILE_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM create_interface_file_china .
DATA: lv_outfile TYPE c LENGTH 120, " Output file name
lv_line TYPE c LENGTH 2000. " Output file line
DATA: lv_rc TYPE sy-subrc, " Return code
lv_nn TYPE n LENGTH 2, " Text element number
lv_text TYPE c LENGTH 8, " Text element name
lv_l TYPE i, " Length
lv_i TYPE i, " Current field
lv_o TYPE i. " Offset
DATA: ls_inf TYPE tp_inf_china.
FIELD-SYMBOLS: <t1> TYPE any,
<fs> TYPE any.
CONSTANTS : lc_000000000000 TYPE char12 VALUE '000000000000'. "CR06578545
lv_rc = 0.
WHILE lv_rc = 0.
* Generate file name
* File name format: SAP_SPND_DATA_YYYYMMDD_HHMISS.tsv
GET TIME.
CONCATENATE c_opath_china
c_fprfx_china c_sep2
sy-datlo c_sep2
sy-timlo
c_fextn
INTO lv_outfile.
* Make sure file does not already exist
OPEN DATASET lv_outfile FOR INPUT
IN TEXT MODE
ENCODING DEFAULT.
lv_rc = sy-subrc.
ENDWHILE.
* Open file for output
OPEN DATASET lv_outfile FOR OUTPUT
IN TEXT MODE
ENCODING DEFAULT "UTF-8
WITH WINDOWS LINEFEED.
IF sy-subrc <> 0.
MESSAGE e030 WITH lv_outfile.
ENDIF.
* Add header line containing field names
CONCATENATE text-f01 c_file_sep
text-f02 c_file_sep
text-f03 c_file_sep
text-f04 c_file_sep
text-f05 c_file_sep
text-f06 c_file_sep
text-f07 c_file_sep
text-f34 c_file_sep
text-f08 c_file_sep
text-f33 c_file_sep
text-f37 c_file_sep
text-f38 c_file_sep
text-f09 c_file_sep
text-f10 c_file_sep
text-f11 c_file_sep
text-f12 c_file_sep
text-f13 c_file_sep
text-f14 c_file_sep
text-f15 c_file_sep
text-f16 c_file_sep
text-f17 c_file_sep
text-f18 c_file_sep
text-f19 c_file_sep
text-f20 c_file_sep
text-f21 c_file_sep
text-f22 c_file_sep
text-f35 c_file_sep
text-f36 c_file_sep
text-f23 c_file_sep
text-f24 c_file_sep
text-f25 c_file_sep
text-f26 c_file_sep
text-f27 c_file_sep
text-f28 c_file_sep
text-f29 c_file_sep
text-f30
INTO lv_line.
lv_l = strlen( lv_line ).
TRANSFER lv_line(lv_l) TO lv_outfile.
* Add detail lines; remove trailing spaces, separate fields with defined
* separator
LOOP AT t_inf_china INTO ls_inf.
CLEAR: lv_line,
lv_o.
DO 36 TIMES. " c_nf
lv_i = sy-index.
ASSIGN COMPONENT lv_i OF STRUCTURE ls_inf TO <fs>.
lv_rc = sy-subrc.
CLEAR lv_l.
IF lv_rc = 0.
lv_l = strlen( <fs> ).
ENDIF.
IF lv_rc = 0 AND " Field symbol assigned
lv_l > 0. " Prevent short dump on zero len
lv_line+lv_o(lv_l) = <fs>(lv_l).
* Begin of CR06578545
IF <fs>(lv_l) = lc_000000000000.
CLEAR lv_line+lv_o(lv_l).
ENDIF.
* End of CR06578545
lv_o = lv_o + lv_l.
ENDIF.
IF lv_i <> c_nf. " No separator after last field
lv_line+lv_o(1) = c_file_sep.
lv_o = lv_o + 1.
ENDIF.
ENDDO.
TRANSFER lv_line(lv_o) TO lv_outfile.
ENDLOOP.
* Close dataset
CLOSE DATASET lv_outfile.
ENDFORM. " CREATE_INTERFACE_FILE_CHINA
*&---------------------------------------------------------------------*
*& Form ALV_FIELD_CATALOG_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alv_field_catalog_china .
PERFORM add_field_china
USING: 'EVENT_ID' text-c01 space space ,
'EVENT_NM' text-c02 space space ,
'EVENT_STRT_DT' text-c03 space space ,
'EVENT_TYP_CD' text-c04 space space ,
'EVENT_PARENT_ID' text-c05 space space ,
'EVENTPARENTCOMPANYCD' text-c06 space space ,
'EVENTPARENTSRCSYSCD' text-c07 space space ,
'EVENTSUBTYPECD' text-c34 space space ,
'EVENTPARENTCOUNTRY' text-c09 space space ,
'EVENTVIACUSTOMERTYPE' text-c33 space space ,
'EVENTCUSTOMERID' text-c37 space space ,
'EVENTCUSTOMEREVENTROLE' text-c38 space space ,
'HCO_ID' text-c11 space space ,
'HCO_NM' text-c12 space space ,
'HCO_ALT_NM' text-c13 space space ,
'HCO_ADRS_LN_1' text-c14 space space ,
'HCO_ADRS_LN_2' text-c15 space space ,
'HCO_ADRS_CITY' text-c16 space space ,
'HCO_ADRS_RGN_CD' text-c17 space space ,
'HCO_ADRS_PSTL_CD' text-c18 space space ,
'HCO_ADRS_CNTRY_CD' text-c19 space space ,
'SPEND_ID' text-c20 space space ,
'SPEND_ALT_ID' text-c21 c_x space ,
'SPEND_DT_PD' text-c22 space space ,
'SPEND_AMT' text-c23 space space ,
'CURRENCY' text-c24 space space ,
'SPENDTYPECD' text-c35 space space ,
'SPENDPURPOSECD' text-c36 space space ,
'SPEND_COST_CENTER' text-c25 space space ,
'SPEND_COST_ELEMENT' text-c26 space space ,
'SPENDCOSTCENTERPERSENT' text-c27 space space ,
'COMPANYCD' text-c28 space space ,
'SRC_SYS_ID' text-c29 space space ,
'SRCSYSTYPECD' text-c30 space space ,
'COUNTRYCD' text-c31 space space ,
'EVENTCREATEDBY' text-c32 space space .
* 'WRBTR' text-r19 space 'WAERS',
ENDFORM. " ALV_FIELD_CATALOG_CHINA
*&---------------------------------------------------------------------*
*& Form ADD_FIELD_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_2300 text
* -->P_TEXT_C01 text
* -->P_SPACE text
* -->P_SPACE text
*----------------------------------------------------------------------*
FORM add_field_china USING p_field TYPE slis_fieldname
p_text TYPE c "scrtext_l
p_hot TYPE c
p_curr TYPE any.
DATA: s_fieldcat TYPE slis_fieldcat_alv.
CLEAR s_fieldcat.
s_fieldcat-tabname = 'T_INF_CHINA'. "CR06474471
s_fieldcat-fieldname = p_field.
s_fieldcat-seltext_l = p_text.
s_fieldcat-hotspot = p_hot.
s_fieldcat-cfieldname = p_curr.
APPEND s_fieldcat TO t_fieldcat.
ENDFORM. " ADD_FIELD_CHINA

*&---------------------------------------------------------------------*
*& Form ALV_REPORT_CHINA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alv_report_china .

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
i_callback_program = gv_repid
i_callback_user_command = slis_ev_user_command
is_layout = s_layout
it_fieldcat = t_fieldcat
i_save = c_save
it_events = t_events
TABLES
t_outtab = t_inf_china
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE e038(zpmp) WITH sy-subrc.
ENDIF.
ENDFORM. " ALV_REPORT_CHINA
*************************************************************************
* End of changes for CR06687537
* Begin of changes for CHG0015380
*&---------------------------------------------------------------------*
*& Form GET_TAXES
*&---------------------------------------------------------------------*
FORM get_taxes .
TYPES: BEGIN OF lty_bkpf,
bukrs TYPE bukrs,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
wwert TYPE wwert_d,
usnam TYPE usnam,
stblg TYPE stblg,
waers TYPE waers,
END OF lty_bkpf,
BEGIN OF lty_items,
bukrs TYPE bukrs,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
buzei TYPE buzei,
shkzg TYPE shkzg,
qsskz TYPE qsskz,
wrbtr TYPE wrbtr,
ktosl TYPE ktosl,
sgtxt TYPE sgtxt,
kostl TYPE kostl,
hkont TYPE hkont,
lifnr TYPE lifnr,
nebtr TYPE nebtr,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
zekkn TYPE dzekkn,
END OF lty_items,
BEGIN OF lty_lifnr,
bukrs TYPE bukrs,
lifnr TYPE lifnr,
gjahr TYPE gjahr,
belnr TYPE belnr_d,
END OF lty_lifnr,
BEGIN OF lty_lfa1,
lifnr TYPE lifnr,
land1 TYPE land1_gp,
END OF lty_lfa1,
BEGIN OF lty_lfbw,
lifnr TYPE lifnr,
bukrs TYPE bukrs,
witht TYPE witht,
wt_withcd TYPE wt_withcd,
END OF lty_lfbw,
BEGIN OF lty_with_item,
bukrs TYPE bukrs,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
buzei TYPE buzei,
witht TYPE witht,
wt_withcd TYPE wt_withcd,
hkont TYPE hkont,
END OF lty_with_item,
BEGIN OF lty_with_item_tmp,
bukrs TYPE bukrs,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
buzei TYPE buzei,
witht TYPE witht,
wt_withcd TYPE wt_withcd,
hkont TYPE hkont,
land1 TYPE land1,
END OF lty_with_item_tmp,
BEGIN OF lty_t059z,
witht TYPE witht,
wt_withcd TYPE wt_withcd,
qsatz TYPE wt_qsatz,
END OF lty_t059z,
BEGIN OF lty_bset,
bukrs TYPE bukrs,
belnr TYPE belnr_d,
gjahr TYPE gjahr,
mwskz TYPE mwskz,
hkont TYPE hkont,
shkzg TYPE shkzg,
hwste TYPE hwste,
lstml TYPE land1_stml,
END OF lty_bset,
BEGIN OF lty_a003,
mwskz TYPE mwskz,
knumh TYPE knumh,
END OF lty_a003,
BEGIN OF lty_konp,
knumh TYPE knumh,
kbetr TYPE kbetr,
END OF lty_konp.
DATA: lt_bkpf TYPE STANDARD TABLE OF lty_bkpf INITIAL SIZE
0,
lt_items TYPE STANDARD TABLE OF lty_items INITIAL SIZE
0,
lt_items_tmp TYPE STANDARD TABLE OF lty_items INITIAL SIZE
0,
lt_with_item TYPE STANDARD TABLE OF lty_with_item INITIAL SIZE
0,
lt_with_item_tmp TYPE STANDARD TABLE OF lty_with_item_tmp INITIAL SIZE
0,
lt_with_item_tmp_1 TYPE STANDARD TABLE OF lty_with_item_tmp INITIAL SIZE
0,
lt_t059z TYPE STANDARD TABLE OF lty_t059z INITIAL SIZE
0,
lt_bset TYPE STANDARD TABLE OF lty_bset INITIAL SIZE
0,
lt_bset_tmp TYPE STANDARD TABLE OF lty_bset INITIAL SIZE
0,
lt_a003 TYPE STANDARD TABLE OF lty_a003 INITIAL SIZE
0,
lt_konp TYPE STANDARD TABLE OF lty_konp INITIAL SIZE
0,
lt_lifnr TYPE STANDARD TABLE OF lty_lifnr INITIAL SIZE
0,
lt_lfa1 TYPE STANDARD TABLE OF lty_lfa1 INITIAL SIZE
0,
lt_lfbw TYPE STANDARD TABLE OF lty_lfbw INITIAL SIZE
0,
lt_rpt_tmp TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE
0,
lt_clr TYPE STANDARD TABLE OF tp_rpt INITIAL SIZE
0,
ls_with_item TYPE lty_with_item,
ls_t059z TYPE lty_t059z,
ls_bkpf TYPE lty_bkpf,
ls_bset TYPE lty_bset,
ls_a003 TYPE lty_a003,
ls_konp TYPE lty_konp,
ls_rpt_tmp TYPE tp_rpt,
ls_lfa1 TYPE lty_lfa1,
ls_items TYPE lty_items.
CONSTANTS:
lc_tx TYPE kappl VALUE 'TX',
lc_k3 TYPE blart VALUE 'K3',
lc_wit TYPE ktosl VALUE 'WIT',
lc_wht TYPE ktosl VALUE 'WHT',
lc_t TYPE buzid VALUE 'T',
lc_v TYPE buzid VALUE 'V', " CHG0056997
lc_vat TYPE ktosl VALUE 'VAT'.
FIELD-SYMBOLS: <fs_rpt> TYPE tp_rpt,
<fs_with_item_tmp> TYPE lty_with_item_tmp,
<fs_pfi> TYPE tp_pfi.

* Line deleted for CHG0056997 to include K3 docs also


* Move the clearing docs and invoices to a
* temporary internal internal table lt_rpt_tmp
* for calculating the withholding taxes for both
APPEND LINES OF gt_clr TO lt_rpt_tmp.
APPEND LINES OF t_rpt TO lt_rpt_tmp.
SORT lt_rpt_tmp BY bukrs belnr gjahr.
DELETE ADJACENT DUPLICATES FROM lt_rpt_tmp
COMPARING bukrs belnr gjahr.
* Get the details for clearing docs from BKPF
IF gt_clr[] IS NOT INITIAL.
SELECT bukrs belnr gjahr wwert
usnam stblg waers
FROM bkpf
INTO TABLE lt_bkpf
FOR ALL ENTRIES IN gt_clr
WHERE bukrs = gt_clr-bukrs
AND belnr = gt_clr-belnr
AND gjahr = gt_clr-gjahr.
IF sy-subrc EQ 0.
SORT lt_bkpf BY bukrs belnr gjahr.
* Get all item details from BSEG
* for Clearing docs
SELECT bukrs belnr gjahr buzei
shkzg qsskz wrbtr ktosl
sgtxt kostl hkont lifnr
nebtr ebeln ebelp zekkn
FROM bseg
INTO TABLE lt_items
FOR ALL ENTRIES IN lt_bkpf
WHERE bukrs = lt_bkpf-bukrs
AND belnr = lt_bkpf-belnr
AND gjahr = lt_bkpf-gjahr
AND kostl IN s_kostl
AND hkont IN s_kstar
AND ebeln IN s_ebeln.
IF sy-subrc EQ 0.
SORT lt_items BY bukrs belnr gjahr buzei.
ENDIF.
ENDIF.
ENDIF.
* Get all the vendors to fetch vendor details
MOVE-CORRESPONDING lt_rpt_tmp TO lt_lifnr.
DELETE ADJACENT DUPLICATES FROM lt_lifnr COMPARING lifnr.
IF lt_lifnr[] IS NOT INITIAL.
* Get the vendor country code
SELECT lifnr land1
FROM lfa1
INTO TABLE lt_lfa1
FOR ALL ENTRIES IN lt_lifnr
WHERE lifnr = lt_lifnr-lifnr.
IF sy-subrc EQ 0.
SORT lt_lfa1 BY lifnr.
* Get the withholding tax type and tax code
SELECT lifnr bukrs witht wt_withcd
FROM lfbw
INTO TABLE lt_lfbw
FOR ALL ENTRIES IN lt_lifnr
WHERE lifnr = lt_lifnr-lifnr
AND bukrs = lt_lifnr-bukrs.
IF sy-subrc EQ 0.
SORT lt_lfbw BY lifnr bukrs witht.
ENDIF.
ENDIF.
ENDIF.
IF lt_rpt_tmp[] IS NOT INITIAL.
* Get the Tax rates for all Payments & Invoices: Withholding
SELECT bukrs belnr gjahr buzei witht wt_withcd hkont
FROM with_item
INTO TABLE lt_with_item
FOR ALL ENTRIES IN lt_rpt_tmp
WHERE bukrs = lt_rpt_tmp-bukrs
AND belnr = lt_rpt_tmp-belnr
AND gjahr = lt_rpt_tmp-gjahr.
IF sy-subrc EQ 0.
SORT: lt_with_item BY bukrs belnr gjahr,
lt_rpt_tmp BY bukrs belnr gjahr.
* Including the vendor country in table lt_with_item_tmp
lt_with_item_tmp[] = lt_with_item[].
* Start populating the vendor details and get the vendor country
LOOP AT lt_with_item_tmp ASSIGNING <fs_with_item_tmp>.
READ TABLE lt_rpt_tmp INTO ls_rpt_tmp WITH KEY bukrs = <fs_with_item_tmp
>-bukrs
belnr = <fs_with_item_tmp
>-belnr
gjahr = <fs_with_item_tmp
>-gjahr
BINARY SEARCH.
IF sy-subrc EQ 0.
READ TABLE lt_lfa1 INTO ls_lfa1 WITH KEY lifnr = ls_rpt_tmp-lifnr
BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_with_item_tmp>-land1 = ls_lfa1-land1.
ENDIF.
ENDIF.
ENDLOOP.
lt_with_item_tmp_1[] = lt_with_item_tmp[].
SORT lt_with_item_tmp_1 BY land1 witht wt_withcd.
DELETE ADJACENT DUPLICATES FROM lt_with_item_tmp_1
COMPARING land1 witht wt_withcd.
* Get the Tax rates for the Tax codes
IF lt_with_item_tmp_1[] IS NOT INITIAL.
SELECT witht wt_withcd qsatz
FROM t059z
INTO TABLE lt_t059z
FOR ALL ENTRIES IN lt_with_item_tmp_1
WHERE land1 = lt_with_item_tmp_1-land1
AND witht = lt_with_item_tmp_1-witht
AND wt_withcd = lt_with_item_tmp_1-wt_withcd.
IF sy-subrc EQ 0.
SORT lt_t059z BY witht wt_withcd.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
* The table for all Invoces: T_RPT
IF t_rpt[] IS NOT INITIAL.
SORT t_rpt BY bukrs belnr gjahr.
CLEAR lt_rpt_tmp[].
lt_rpt_tmp[] = t_rpt[].
DELETE ADJACENT DUPLICATES FROM lt_rpt_tmp
COMPARING bukrs belnr gjahr.
IF lt_rpt_tmp[] IS NOT INITIAL.
* Get the tax codes for invoices
SELECT bukrs belnr gjahr mwskz hkont shkzg hwste lstml
FROM bset
INTO TABLE lt_bset
FOR ALL ENTRIES IN lt_rpt_tmp
WHERE bukrs = lt_rpt_tmp-bukrs
AND belnr = lt_rpt_tmp-belnr
AND gjahr = lt_rpt_tmp-gjahr.
IF sy-subrc EQ 0.
lt_bset_tmp[] = lt_bset[].
SORT lt_bset_tmp BY mwskz.
DELETE ADJACENT DUPLICATES FROM lt_bset_tmp
COMPARING mwskz.
IF lt_bset_tmp[] IS NOT INITIAL.
* Get the corresponding Condition type
SELECT mwskz knumh
FROM a003
INTO TABLE lt_a003
FOR ALL ENTRIES IN lt_bset_tmp
WHERE kappl = lc_tx
AND aland = lt_bset_tmp-lstml
AND mwskz = lt_bset_tmp-mwskz.
IF sy-subrc EQ 0.
SORT lt_a003 BY mwskz.
* LT_A003 will have unique entries so no
* delete adjacent duplicates is done while using
* for all entries in select code
* Get the corresponding tax rates
SELECT knumh kbetr
FROM konp
INTO TABLE lt_konp
FOR ALL ENTRIES IN lt_a003
WHERE knumh = lt_a003-knumh.
IF sy-subrc EQ 0.
SORT lt_konp BY knumh.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
SORT: lt_bset BY bukrs belnr gjahr,
lt_with_item_tmp BY bukrs belnr gjahr hkont,
lt_t059z BY witht wt_withcd.
* Adding Tax codes for Invoices
LOOP AT t_rpt ASSIGNING <fs_rpt> WHERE invtp IN r_invdt.
* Check for Tax line:
IF <fs_rpt>-kostl IS INITIAL AND ( <fs_rpt>-buzid = lc_t OR <fs_rpt>-mwskz
IS NOT INITIAL ).
READ TABLE lt_bset INTO ls_bset WITH KEY bukrs = <fs_rpt>-bukrs
belnr = <fs_rpt>-belnr
gjahr = <fs_rpt>-gjahr
BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_rpt>-tax_code = lc_vat. " VAT
* Get condition type for tax code
READ TABLE lt_a003 INTO ls_a003 WITH KEY mwskz = ls_bset-mwskz
BINARY SEARCH.
IF sy-subrc EQ 0.
READ TABLE lt_konp INTO ls_konp WITH KEY knumh = ls_a003-knumh
BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_rpt>-tax_rate = ls_konp-kbetr / 10.
CONDENSE <fs_rpt>-tax_rate.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
* Check for Withholding tax:
IF <fs_rpt>-kostl IS INITIAL AND ( <fs_rpt>-ktosl = lc_wit OR <fs_rpt>-qss
kz IS NOT INITIAL ).
READ TABLE lt_with_item_tmp ASSIGNING <fs_with_item_tmp>
WITH KEY bukrs = <fs_rpt>-bukrs
belnr = <fs_rpt>-belnr
gjahr = <fs_rpt>-gjahr
hkont = <fs_rpt>-hkont
BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_rpt>-tax_code = lc_wht. " WHT
READ TABLE lt_t059z INTO ls_t059z WITH KEY witht = <fs_with_item_t
mp>-witht
wt_withcd = <fs_with_item_t
mp>-wt_withcd
BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_rpt>-tax_rate = ls_t059z-qsatz.
CONDENSE <fs_rpt>-tax_rate.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
CLEAR: gt_rpt_tmp[].
IF gt_clr[] IS NOT INITIAL.
* Delete all documents with type K3.
DELETE gt_clr WHERE blart = lc_k3.
SORT: gt_pfi BY bukrs belnr gjahr,
gt_clr BY bukrs belnr gjahr,
lt_items BY bukrs belnr gjahr buzei,
lt_with_item BY bukrs gjahr belnr hkont.
* Start populating the clearing docs
LOOP AT gt_clr INTO gs_clr.
* Using loop instead of read as multiple entries possible
* Get details from BSEG
LOOP AT lt_items INTO ls_items WHERE bukrs = gs_clr-bukrs
AND belnr = gs_clr-belnr
AND gjahr = gs_clr-gjahr.
IF ls_items-kostl IS INITIAL AND
( ls_items-ktosl = lc_wit OR ls_items-qsskz IS NOT INITIAL ).
* Apply sign to payment
IF ls_items-shkzg = c_credit.
gs_clr-wrbtr = - ls_items-wrbtr.
ELSE.
gs_clr-wrbtr = ls_items-wrbtr.
ENDIF.
* Apply sign to invoice amount
IF ls_items-shkzg = c_credit.
gs_clr-wrbtr = - ls_items-wrbtr.
ELSE.
gs_clr-wrbtr = ls_items-wrbtr.
ENDIF.
gs_clr-bukrs = ls_items-bukrs.
gs_clr-belnr = ls_items-belnr.
* Begin of chnages for CHG0056990
IF ( ls_items-lifnr IS NOT INITIAL ) OR
( ls_items-buzei EQ gs_clr-buzei ).
gs_clr-buzid = lc_v.
ELSE.
CLEAR gs_clr-buzid.
ENDIF.
* End of chnages for CHG0056990
gs_clr-buzei = ls_items-buzei.
gs_clr-ebeln = ls_items-ebeln.
gs_clr-ebelp = ls_items-ebelp.
gs_clr-zekkn = ls_items-zekkn.
gs_clr-kostl = ls_items-kostl.
gs_clr-ktosl = ls_items-ktosl.
gs_clr-hkont = ls_items-hkont.
* Get header details from BKPF
READ TABLE lt_bkpf INTO ls_bkpf WITH KEY bukrs = gs_clr-bukrs
belnr = gs_clr-belnr
gjahr = gs_clr-gjahr
BINARY SEARCH.
IF sy-subrc EQ 0.
gs_clr-waers = ls_bkpf-waers.
gs_clr-usnam = ls_bkpf-usnam.
ENDIF.
* Get Payment related details
READ TABLE gt_pfi ASSIGNING <fs_pfi> WITH KEY bukrs = gs_clr-bukrs
belnr = gs_clr-belnr
gjahr = gs_clr-gjahr
BINARY SEARCH.
IF sy-subrc EQ 0.
gs_clr-lifnr = <fs_pfi>-lifnr.
gs_clr-augbl = <fs_pfi>-augbl.
gs_clr-augdt = <fs_pfi>-augdt.
gs_clr-pymnt = <fs_pfi>-belnr.
gs_clr-cpudt = <fs_pfi>-cpudt.
gs_clr-gjahr = <fs_pfi>-gjahr.
gs_clr-invtp = <fs_pfi>-blart.
ENDIF.

* Get the withholding tax code details


READ TABLE lt_with_item INTO ls_with_item WITH KEY bukrs = ls_items-bu
krs
belnr = ls_items-be
lnr
gjahr = ls_items-gj
ahr
hkont = ls_items-hk
ont
BINARY SEARCH.
IF sy-subrc EQ 0.
gs_clr-tax_code = lc_wht.
READ TABLE lt_t059z INTO ls_t059z WITH KEY witht = ls_with_item-
witht
wt_withcd = ls_with_item-
wt_withcd
BINARY SEARCH.
IF sy-subrc EQ 0.
gs_clr-tax_rate = ls_t059z-qsatz.
CONDENSE gs_clr-tax_rate.
ENDIF.
ENDIF.
COLLECT gs_clr INTO gt_rpt_tmp.
ENDIF.
ENDLOOP. " lt_items
ENDLOOP. " gt_clr
ENDIF.
* Begin of changes for CHG0056997
* Delete all vendor lines from Payments
DELETE gt_rpt_tmp WHERE buzid = lc_v.
* End of changes for CHG0056997
APPEND LINES OF gt_rpt_tmp TO t_rpt.
SORT t_rpt BY bukrs belnr gjahr.
CLEAR: gt_clr[], lt_rpt_tmp[], gt_rpt_tmp[], gt_pfi[].
ENDFORM.
* End of changes for CHG0015380

You might also like