Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 64

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

** Interfaces
**-------------------------------------------------------------------*
INTERFACE lif_data.

TYPES: BEGIN OF ty_invoice,


vbeln TYPE vbrk-vbeln,
fkart TYPE vbrk-fkart,
fktyp TYPE vbrk-fktyp,
waerk TYPE vbrk-waerk,
vkorg TYPE vbrk-vkorg,
vtweg TYPE vbrk-vtweg,
knumv TYPE vbrk-knumv,
fkdat TYPE vbrk-fkdat,
bukrs TYPE vbrk-bukrs,
netwr TYPE vbrk-netwr,
ernam TYPE vbrk-ernam,
erdat TYPE vbrk-erdat,
sfakn TYPE vbrk-sfakn,
spart TYPE vbrk-spart,
mwsbk TYPE vbrk-mwsbk,
bupla TYPE vbrk-bupla,
xblnr TYPE vbrk-xblnr,
fk_source_sys TYPE vbrk-fk_source_sys,
posnr TYPE vbrp-posnr,
fkimg TYPE vbrp-fkimg,
vrkme TYPE vbrp-vrkme,
meins TYPE vbrp-meins,
amt TYPE vbrp-netwr,
vbelv TYPE vbrp-vbelv,
posnv TYPE vbrp-posnv,
vgbel TYPE vbrp-vgbel,
vgpos TYPE vbrp-vgpos,
vgtyp TYPE vbrp-vgtyp,
aubel TYPE vbrp-aubel,
aupos TYPE vbrp-aupos,
matnr TYPE vbrp-matnr,
arktx TYPE vbrp-arktx,
charg TYPE vbrp-charg,
pstyv TYPE vbrp-pstyv,
prodh TYPE vbrp-prodh,
werks TYPE vbrp-werks,
lgort TYPE vbrp-lgort,
prctr TYPE vbrp-prctr,
cmpre TYPE vbrp-cmpre,
price TYPE vbrp-mwsbp,
adrnr TYPE tvko-adrnr,
endat TYPE fpla-endat,
bedat TYPE fpla-bedat,
lgobe TYPE t001l-lgobe,
END OF ty_invoice,

BEGIN OF ty_vttk,
vbeln TYPE vttp-vbeln,
tpnum TYPE vttp-tpnum,
tknum TYPE vttk-tknum,
erdat TYPE vttk-erdat,
route TYPE vttk-route,
distz TYPE vttk-distz,
/bev1/rpmowa TYPE vttk-/bev1/rpmowa,
END OF ty_vttk,

BEGIN OF ty_cus_plnt,
kunnr TYPE kunnr,
name1 TYPE name1_gp,
adrnr TYPE adrnr,
END OF ty_cus_plnt,

BEGIN OF ty_invoice_dlc,
vbeln TYPE vbrk-vbeln,
fkart TYPE vbrk-fkart,
fktyp TYPE vbrk-fktyp,
waerk TYPE vbrk-waerk,
vkorg TYPE vbrk-vkorg,
vtweg TYPE vbrk-vtweg,
knumv TYPE vbrk-knumv,
fkdat TYPE vbrk-fkdat,
bukrs TYPE vbrk-bukrs,
netwr TYPE vbrk-netwr,
ernam TYPE vbrk-ernam,
erdat TYPE vbrk-erdat,
sfakn TYPE vbrk-sfakn,
spart TYPE vbrk-spart,
mwsbk TYPE vbrk-mwsbk,
bupla TYPE vbrk-bupla,
fk_source_sys TYPE vbrk-fk_source_sys,
posnr TYPE vbrp-posnr,
fkimg TYPE vbrp-fkimg,
vrkme TYPE vbrp-vrkme,
meins TYPE vbrp-meins,
amt TYPE vbrp-netwr,
vbelv TYPE vbrp-vbelv,
posnv TYPE vbrp-posnv,
vgbel TYPE vbrp-vgbel,
vgpos TYPE vbrp-vgpos,
vgtyp TYPE vbrp-vgtyp,
aubel TYPE vbrp-aubel,
aupos TYPE vbrp-aupos,
matnr TYPE vbrp-matnr,
arktx TYPE vbrp-arktx,
charg TYPE vbrp-charg,
pstyv TYPE vbrp-pstyv,
prodh TYPE vbrp-prodh,
werks TYPE vbrp-werks,
lgort TYPE vbrp-lgort,
prctr TYPE vbrp-prctr,
cmpre TYPE vbrp-cmpre,
price TYPE vbrp-mwsbp,
adrnr TYPE tvko-adrnr,
endat TYPE fpla-endat,
bedat TYPE fpla-bedat,
lgobe TYPE t001l-lgobe,
gstcode TYPE zeydigi_currcd-gstcode,
END OF ty_invoice_dlc,

BEGIN OF ty_j_1bbranch,
bukrs TYPE j_1bbranch-bukrs, " company code
branch TYPE j_1bbranch-branch, " business place
gstin TYPE j_1bbranch-gstin, " supplier gstn
adrnr TYPE j_1bbranch-adrnr,
END OF ty_j_1bbranch,

BEGIN OF ty_bupla,
bupla TYPE vbrk-bupla, " business place
END OF ty_bupla,

BEGIN OF ty_matnr,
matnr TYPE mara-matnr, " materila number
END OF ty_matnr,

BEGIN OF ty_marc,
matnr TYPE marc-matnr, " materila number
werks TYPE marc-werks, " plant
steuc TYPE marc-steuc, " control code
END OF ty_marc,

BEGIN OF ty_lfa1,
lifnr TYPE lifnr,
land1 TYPE land1,
name1 TYPE name1_gp,
name2 TYPE name2_gp,
stcd3 TYPE stcd3,
adrnr TYPE adrnr,
END OF ty_lfa1,

BEGIN OF ty_t001,
bukrs TYPE bukrs,
adrnr TYPE adrnr,
butxt TYPE butxt,
END OF ty_t001,

BEGIN OF ty_bkpf,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
blart TYPE bkpf-blart,
bldat TYPE bkpf-bldat,
budat TYPE bkpf-budat,
cpudt TYPE bkpf-cpudt,
usnam TYPE bkpf-usnam,
tcode TYPE bkpf-tcode,
xblnr TYPE bkpf-xblnr,
stblg TYPE bkpf-stblg,
stjah TYPE bkpf-stjah,
waers TYPE bkpf-waers,
kursf TYPE bkpf-kursf,
awtyp TYPE bkpf-awtyp,
awkey TYPE bkpf-awkey,
hwaer TYPE bkpf-hwaer,
xreversal TYPE bkpf-xreversal,
gstcode TYPE zeydigi_currcd-gstcode,
END OF ty_bkpf,

BEGIN OF ty_prcd_elements,
knumv TYPE prcd_elements-knumv, " doc condition num
kposn TYPE prcd_elements-kposn, " item num
kappl TYPE prcd_elements-kappl, " application value
kschl TYPE prcd_elements-kschl, " condition type
kawrt TYPE prcd_elements-kawrt, " condtion base value
kbetr TYPE prcd_elements-kbetr, " tax rate
kvsl1 TYPE prcd_elements-kvsl1, " tax rate
kwert TYPE prcd_elements-kwert, "
konts TYPE t030k-konts, " GL code
END OF ty_prcd_elements,

BEGIN OF ty_knumv,
knumv TYPE knumv, " doc condition number
kposn TYPE kposn, " itm num
END OF ty_knumv,

BEGIN OF ty_vbeln,
vbeln TYPE vbpa-vbeln, " Document number
posnr TYPE vbpa-posnr, " item number
END OF ty_vbeln,

BEGIN OF ty_cr_fi,
belnr TYPE bkpf-belnr,
END OF ty_cr_fi,

BEGIN OF ty_plant,
werks TYPE vbrp-werks,
END OF ty_plant,

BEGIN OF ty_kunnr,
kunnr TYPE kna1-kunnr,
END OF ty_kunnr,

BEGIN OF ty_steuc,
steuc TYPE marc-steuc,
END OF ty_steuc,

BEGIN OF ty_plant_map,
werks TYPE werks_d,
domestic_plant TYPE zeydigi_plantmap-domestic_plant,
sez_plant TYPE zeydigi_plantmap-sez_plant,
kunnr TYPE kunnr_wk,
land1 TYPE t001w-land1,
regio TYPE t001w-regio,
adrnr TYPE t001w-adrnr,
j_1bbranch TYPE t001w-j_1bbranch,
END OF ty_plant_map,

BEGIN OF ty_vbpa,
vbeln TYPE vbpa-vbeln,
lifnr TYPE vbpa-lifnr,
parvw TYPE vbpa-parvw,
kunnr TYPE vbpa-kunnr,
END OF ty_vbpa,

BEGIN OF ty_bseg,
bukrs TYPE bseg-bukrs,
belnr TYPE bseg-belnr,
gjahr TYPE bseg-gjahr,
buzei TYPE bseg-buzei,
buzid TYPE bseg-buzid,
augdt TYPE bseg-augdt,
augbl TYPE bseg-augbl,
bschl TYPE bseg-bschl,
koart TYPE bseg-koart,
umskz TYPE bseg-umskz,
shkzg TYPE bseg-shkzg,
mwskz TYPE bseg-mwskz,
dmbtr TYPE bseg-dmbtr,
wrbtr TYPE bseg-wrbtr,
fwbas TYPE bseg-fwbas,
txgrp TYPE bseg-txgrp,
zuonr TYPE bseg-zuonr,
vbeln TYPE bseg-vbeln,
xanet TYPE bseg-xanet,
hkont TYPE bseg-hkont,
kunnr TYPE bseg-kunnr,
lifnr TYPE bseg-lifnr,
zterm TYPE bseg-zterm,
zlsch TYPE bseg-zlsch,
hbkid TYPE bseg-hbkid,
nebtr TYPE bseg-nebtr,
matnr TYPE bseg-matnr,
werks TYPE bseg-werks,
menge TYPE bseg-menge,
meins TYPE bseg-meins,
prctr TYPE bseg-prctr,
bupla TYPE bseg-bupla,
taxps TYPE bseg-taxps,
gst_part TYPE bseg-gst_part,
plc_sup TYPE bseg-plc_sup,
hsn_sac TYPE bseg-hsn_sac,
ktosl TYPE bseg-ktosl,
steuc TYPE marc-steuc,
mat TYPE mara-matnr,
prdha TYPE mara-prdha,
maktx TYPE makt-maktx,
sales_type TYPE zeydigi_hsncode-sales_type,
meins1 TYPE zeydigi_unit-meins1,
vtext TYPE tvzbt-vtext,
creditdays TYPE zeydigi_payterms-creditdays,
gstcode TYPE zeydigi_modepay-gstcode,
zfbdt TYPE bseg-zfbdt,
zbd1t TYPE bseg-zbd1t,
zbd2t TYPE bseg-zbd2t,
zbd3t TYPE bseg-zbd3t,
END OF ty_bseg,

BEGIN OF ty_bset,
bukrs TYPE bset-bukrs,
belnr TYPE bset-belnr,
gjahr TYPE bset-gjahr,
buzei TYPE bset-buzei,
mwskz TYPE bset-mwskz,
hkont TYPE bset-hkont,
txgrp TYPE bset-txgrp,
hwbas TYPE bset-hwbas,
fwbas TYPE bset-fwbas,
hwste TYPE bset-hwste,
fwste TYPE bset-fwste,
kschl TYPE bset-kschl,
kbetr TYPE bset-kbetr,
bupla TYPE bset-bupla,
taxps TYPE bset-taxps,
END OF ty_bset,

BEGIN OF ty_vbak,
vbeln TYPE vbak-vbeln,
auart TYPE vbak-auart,
augru TYPE vbak-augru,
gwldt TYPE vbak-gwldt,
zuonr TYPE vbak-zuonr,
vgbel TYPE vbak-vgbel,
posnr TYPE vbkd-posnr,
zterm TYPE vbkd-zterm,
zlsch TYPE vbkd-zlsch,
bstkd TYPE vbkd-bstkd,
bstdk TYPE vbkd-bstdk,
vsart TYPE vbkd-vsart,
bezei TYPE tvaut-bezei,
vbtyp TYPE tvak-vbtyp,
END OF ty_vbak,

BEGIN OF ty_ekpo,
ebeln TYPE ekpo-ebeln,
ebelp TYPE ekpo-ebelp,
pstyp TYPE ekpo-pstyp,
END OF ty_ekpo,

BEGIN OF ty_fpla,
bedat TYPE fpla-bedat,
endat TYPE fpla-endat,
vbeln TYPE fpla-vbeln,
END OF ty_fpla,

BEGIN OF ty_eway_logrt,
vbeln TYPE likp-vbeln, " delivery number
bolnr TYPE likp-bolnr, " bill of lading
bldat TYPE likp-bldat, " bill of lading
vsart TYPE likp-vsart,
route TYPE likp-route,
lifnr TYPE vbpa-lifnr,
name1 TYPE lfa1-name1,
stcd3 TYPE lfa1-stcd3,
distz TYPE tvro-distz,
END OF ty_eway_logrt,

BEGIN OF ty_vbak_wrnty,
vbeln TYPE vbak-vbeln,
gwldt TYPE vbak-gwldt,
END OF ty_vbak_wrnty,

BEGIN OF ty_vbkd,
vbeln TYPE vbkd-vbeln,
posnr TYPE vbkd-posnr,
zterm TYPE vbkd-zterm,
zlsch TYPE vbkd-zlsch,
bstkd TYPE vbkd-bstkd,
bstdk TYPE vbkd-bstdk,
vsart TYPE vbkd-vsart,
END OF ty_vbkd,

BEGIN OF ty_prodh,
prodh TYPE vbrp-prodh,
END OF ty_prodh,

BEGIN OF ty_t179t,
prodh TYPE t179t-prodh,
vtext TYPE t179t-vtext,
END OF ty_t179t,

BEGIN OF ty_zgstnunit,
meins TYPE zeydigi_unit-meins,
meins1 TYPE zeydigi_unit-meins1,
END OF ty_zgstnunit,

BEGIN OF ty_unit,
meins TYPE bseg-meins,
END OF ty_unit,

BEGIN OF ty_storage,
werks TYPE t001l-werks,
lgort TYPE t001l-lgort,
lgobe TYPE t001l-lgobe,
END OF ty_storage,

BEGIN OF ty_rcpt_fi,
kunnr TYPE kna1-kunnr,
land1 TYPE kna1-land1,
name1 TYPE kna1-name1,
name2 TYPE kna1-name2,
ort01 TYPE kna1-ort01,
regio TYPE kna1-regio,
stras TYPE kna1-stras,
adrnr TYPE kna1-adrnr,
stcd1 TYPE kna1-stcd1,
stcd3 TYPE kna1-stcd3,
END OF ty_rcpt_fi,

BEGIN OF ty_mara_fi,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
meins TYPE mara-meins,
prdha TYPE mara-prdha,
spras TYPE makt-spras,
maktx TYPE makt-maktx,
END OF ty_mara_fi,

BEGIN OF ty_mcha,
matnr TYPE mcha-matnr,
werks TYPE mcha-werks,
charg TYPE mcha-charg,
vfdat TYPE mcha-vfdat,
herkl TYPE mcha-herkl,
END OF ty_mcha,

BEGIN OF ty_stblg,
stblg TYPE bkpf-stblg,
stjah TYPE bkpf-stjah,
END OF ty_stblg,

BEGIN OF ty_plant_fi,
werks TYPE t001w-werks,
j_1bbranch TYPE t001w-j_1bbranch,
END OF ty_plant_fi,

BEGIN OF ty_tvko,
vkorg TYPE tvko-vkorg,
adrnr TYPE tvko-adrnr,
END OF ty_tvko,

BEGIN OF ty_tvak,
auart TYPE tvak-auart,
vbtyp TYPE tvak-vbtyp,
END OF ty_tvak,

BEGIN OF ty_t012,
bukrs TYPE t012-bukrs,
hbkid TYPE t012-hbkid,
bankl TYPE t012-bankl,
bankn TYPE t012k-bankn,
END OF ty_t012,

BEGIN OF ty_tvzbt,
spras TYPE tvzbt-spras,
zterm TYPE tvzbt-zterm,
vtext TYPE tvzbt-vtext,
END OF ty_tvzbt,

BEGIN OF ty_adrc,
addrnumber TYPE adrc-addrnumber,
name1 TYPE adrc-name1,
name2 TYPE adrc-name2,
city1 TYPE adrc-city1,
city2 TYPE adrc-city2,
street TYPE adrc-street,
house_num1 TYPE adrc-house_num1,
house_num2 TYPE adrc-house_num2,
house_num3 TYPE adrc-house_num3,
post_code1 TYPE adrc-post_code1,
post_code2 TYPE adrc-post_code2,
post_code3 TYPE adrc-post_code3,
str_suppl1 TYPE adrc-str_suppl1,
str_suppl2 TYPE adrc-str_suppl2,
str_suppl3 TYPE adrc-str_suppl3,
location TYPE adrc-location,
building TYPE adrc-building,
floor TYPE adrc-floor,
country TYPE adrc-country,
region TYPE adrc-region,
tel_number TYPE adrc-tel_number,
flagcomm6 TYPE adrc-flagcomm6,
smtp_addr TYPE adr6-smtp_addr,
END OF ty_adrc,

BEGIN OF ty_lgort,
lgort TYPE t001l-lgort,
END OF ty_lgort.

ENDINTERFACE.

CLASS lcl_data DEFINITION FINAL.


PUBLIC SECTION.
INTERFACES: lif_data.
METHODS: m_get_bkpf_data,
m_get_bseg_data,
m_get_bset_data,
m_get_invoice_details,
m_get_sales_org_addr,
m_get_adrc_details,
m_get_vbpa_details,
m_get_recipient_details_fi,
m_get_supplier_details,
m_get_supplier_gstn,
m_get_hsn_code,
m_get_eway_bill_and_strloc,
m_get_tax_info,
m_get_supply_type_details,
m_get_order_reason,
m_get_description,
m_get_material_details,
m_get_plant_details,
m_supply_type_determination
IMPORTING ls_cust TYPE zeydigi_customer
ls_data TYPE lif_data~ty_invoice
lv_type TYPE zeydigi_hsncode-sales_type
im_land TYPE kna1-land1
RETURNING VALUE(lv_supplytype) TYPE zeydigi_oward_i-supplytype,

m_supply_type_determination_fi
IMPORTING ls_cust TYPE zeydigi_customer
ls_data TYPE lif_data~ty_bseg
lv_type TYPE zeydigi_hsncode-sales_type
ls_tax TYPE lif_data=>ty_bset
im_land TYPE kna1-land1
ls_doc TYPE lif_data=>ty_bkpf
RETURNING VALUE(lv_supplytype) TYPE zeydigi_oward_i-supplytype,

m_fill_final_table,
m_export_final_tab EXPORTING etab1 TYPE STANDARD TABLE
etab2 TYPE STANDARD TABLE,
m_fill_excel_data,
m_export_excel_tab EXPORTING etab1 TYPE STANDARD TABLE,
m_free_local_tab.

PRIVATE SECTION.
DATA:
gr_adrnr TYPE RANGE OF adrc-addrnumber,
gr_adrnr_mat TYPE RANGE OF adrc-addrnumber,
gr_charg TYPE RANGE OF vbrp-charg,
gt_bank TYPE STANDARD TABLE OF lif_data=>ty_t012,
gr_hbkid TYPE RANGE OF bseg-hbkid,
gr_land TYPE RANGE OF bseg-landl,
gt_tvko TYPE STANDARD TABLE OF lif_data=>ty_tvko,
gt_tvzbt TYPE STANDARD TABLE OF lif_data=>ty_tvzbt,
gt_paymentterms TYPE STANDARD TABLE OF zeydigi_payterms,
gt_bkpf TYPE SORTED TABLE OF lif_data=>ty_bkpf
WITH UNIQUE KEY bukrs belnr gjahr,
gt_vttk TYPE STANDARD TABLE OF lif_data=>ty_vttk,
gt_currcode TYPE STANDARD TABLE OF zeydigi_currcd,
gt_countrycode TYPE STANDARD TABLE OF zeydigicountrycd,
gt_modepayment TYPE STANDARD TABLE OF zeydigi_modepay,
gt_lfa1 TYPE STANDARD TABLE OF lif_data=>ty_lfa1,
gt_bset TYPE STANDARD TABLE OF lif_data=>ty_bset,
gt_bseg TYPE STANDARD TABLE OF lif_data=>ty_bseg,
gt_bseg_customer TYPE STANDARD TABLE OF lif_data=>ty_bseg,
gt_bseg_tax TYPE STANDARD TABLE OF lif_data=>ty_bseg,
gt_invoice TYPE STANDARD TABLE OF lif_data~ty_invoice,
gt_rcpt_fi TYPE STANDARD TABLE OF lif_data=>ty_rcpt_fi,
gt_gstn TYPE SORTED TABLE OF lif_data~ty_j_1bbranch
WITH UNIQUE KEY bukrs branch,
gt_hsncd TYPE SORTED TABLE OF lif_data=>ty_marc
WITH UNIQUE KEY matnr werks,
gt_statecode TYPE STANDARD TABLE OF zeydigi_statecd,
gt_eway TYPE SORTED TABLE OF lif_data=>ty_eway_logrt
WITH UNIQUE KEY vbeln,
gt_cond_typ TYPE STANDARD TABLE OF zeydigi_condtype,
gt_adrc TYPE STANDARD TABLE OF lif_data=>ty_adrc,
gt_adrc1 TYPE STANDARD TABLE OF lif_data=>ty_adrc,
gt_adrc_mat TYPE STANDARD TABLE OF lif_data=>ty_adrc,
gt_bukrs TYPE STANDARD TABLE OF lif_data=>ty_t001,
gt_tax TYPE STANDARD TABLE OF lif_data=>ty_prcd_elements,
gt_hcode TYPE STANDARD TABLE OF zeydigi_hsncode,
gt_customer TYPE SORTED TABLE OF zeydigi_customer
WITH UNIQUE KEY customer,
gt_plant TYPE STANDARD TABLE OF lif_data=>ty_plant_map,
gt_customer_of_plnt TYPE TABLE OF lif_data=>ty_cus_plnt,
gt_doc_typ TYPE STANDARD TABLE OF zeydigi_docmap,
gt_header TYPE STANDARD TABLE OF zeydigi_oward_h,
gt_item TYPE STANDARD TABLE OF zeydigi_oward_i,
gt_vbak TYPE STANDARD TABLE OF lif_data=>ty_vbak,
gt_prodh TYPE STANDARD TABLE OF lif_data=>ty_t179t,
gt_mcha TYPE STANDARD TABLE OF lif_data=>ty_mcha,
gt_excel TYPE zeydigi_239ff_tt,
gt_units TYPE HASHED TABLE OF lif_data=>ty_zgstnunit
WITH UNIQUE KEY meins,
gt_matd_fi TYPE HASHED TABLE OF lif_data=>ty_mara_fi
WITH UNIQUE KEY matnr,
gt_plant_bupla TYPE STANDARD TABLE OF lif_data=>ty_plant_fi,
gt_vbpa TYPE STANDARD TABLE OF lif_data=>ty_vbpa,
lt_bkpf TYPE STANDARD TABLE OF lif_data=>ty_bkpf,
lt_kunnr TYPE HASHED TABLE OF lif_data=>ty_kunnr
WITH UNIQUE KEY kunnr,
lt_matnr TYPE HASHED TABLE OF lif_data=>ty_matnr
WITH UNIQUE KEY matnr,
lt_vbeln TYPE HASHED TABLE OF lif_data=>ty_vbeln
WITH UNIQUE KEY vbeln,
lt_bupla TYPE HASHED TABLE OF lif_data~ty_bupla
WITH UNIQUE KEY bupla,
lt_vgbel TYPE HASHED TABLE OF lif_data=>ty_vbeln
WITH UNIQUE KEY vbeln posnr,
lt_knumv TYPE HASHED TABLE OF lif_data=>ty_knumv
WITH UNIQUE KEY knumv kposn,
lt_plant TYPE HASHED TABLE OF lif_data=>ty_plant
WITH UNIQUE KEY werks,
lt_hsncd TYPE HASHED TABLE OF lif_data=>ty_steuc
WITH UNIQUE KEY steuc,
lt_aubel TYPE HASHED TABLE OF lif_data=>ty_vbeln
WITH UNIQUE KEY vbeln,
lt_crdr TYPE HASHED TABLE OF lif_data=>ty_vbeln
WITH UNIQUE KEY vbeln,
lt_cr_fi TYPE STANDARD TABLE OF lif_data=>ty_cr_fi,
lt_prodh TYPE HASHED TABLE OF lif_data=>ty_prodh
WITH UNIQUE KEY prodh,
lt_stblg TYPE HASHED TABLE OF lif_data=>ty_stblg
WITH UNIQUE KEY stblg stjah,
gt_bkpf_can TYPE SORTED TABLE OF lif_data=>ty_bkpf
WITH UNIQUE KEY bukrs belnr gjahr,
gt_bkpf_ori TYPE SORTED TABLE OF lif_data=>ty_bkpf
WITH UNIQUE KEY bukrs belnr gjahr.

CONSTANTS: lc_equals(2) TYPE c VALUE 'EQ',


lc_include TYPE c VALUE 'I',
lc_error TYPE c VALUE 'E',
lc_vbrk TYPE bkpf-awtyp VALUE 'VBRK',
lc_re TYPE vbpa-parvw VALUE 'RE',
lc_we TYPE vbpa-parvw VALUE 'WE',
lc_rg TYPE vbpa-parvw VALUE 'RG',
lc_ag TYPE vbpa-parvw VALUE 'AG',
lc_sp TYPE vbpa-parvw VALUE 'SP', "forwarding agent
lc_kappl TYPE kappl VALUE 'V',
lc_out TYPE zeydigi_docmap-extractor_type VALUE 'O',
lc_in TYPE zeydigi_docmap-extractor_type VALUE 'I',
lc_country TYPE kna1-land1 VALUE 'IN',
lc_x(1) TYPE c VALUE 'X',
lc_yes(1) TYPE c VALUE 'Y',
lc_no(1) TYPE c VALUE 'N',
lc_cgst TYPE zeydigi_condtype-gst_type VALUE 'CGST',
lc_igst TYPE zeydigi_condtype-gst_type VALUE 'IGST',
lc_sgst TYPE zeydigi_condtype-gst_type VALUE 'SGST',
lc_adcr TYPE zeydigi_condtype-gst_type VALUE 'ADCR',
lc_spcr TYPE zeydigi_condtype-gst_type VALUE 'SPCR',
lc_stcs TYPE zeydigi_condtype-gst_type VALUE 'STCS',
lc_jtcs TYPE zeydigi_condtype-gst_type VALUE 'JTCS',
lc_cust TYPE bseg-koart VALUE 'D',
lc_rmtax TYPE bseg-buzid VALUE 'T',
lc_vf01 TYPE bkpf-tcode VALUE 'VF01',
lc_vf02 TYPE bkpf-tcode VALUE 'VF02',
lc_vf04 TYPE bkpf-tcode VALUE 'VF04',
lc_vf11 TYPE bkpf-tcode VALUE 'VF11',
lc_fb70 TYPE bkpf-tcode VALUE 'FB70',
lc_fb75 TYPE bkpf-tcode VALUE 'FB75',
lc_fb08 TYPE bkpf-tcode VALUE 'FB08',
lc_jcos TYPE kschl VALUE 'JCOS',
lc_pr00 TYPE kschl VALUE 'PR00'.

ENDCLASS.

*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_data
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
CLASS lcl_data IMPLEMENTATION.

METHOD m_get_bkpf_data.

DATA: ls_vbeln TYPE lif_data=>ty_vbeln,


lr_tcode TYPE RANGE OF bkpf-tcode,
ls_cr_fi TYPE lif_data=>ty_cr_fi,
ls_belnr TYPE selopt,
lr_blart TYPE RANGE OF blart,
ls_stblg TYPE lif_data=>ty_stblg.

FIELD-SYMBOLS: <lfs_bkpf> TYPE lif_data=>ty_bkpf,


<lfs_bkpf_can> TYPE lif_data=>ty_bkpf.

* Get the accounting header details for the below tcodes and date
lr_tcode = VALUE #( sign = lc_include option = lc_equals ( low = lc_vf01 )
"VF01
( low = lc_vf02 )
"VF02
( low = lc_vf04 )
"VF04
( low = lc_vf11 )
"VF11
( low = lc_fb70 )
"FB70
( low = lc_fb75 )
"FB75
( low = lc_fb08 )
( low = 'FB01' )
( low = 'FBR2' ) ).
"FB08

* check whether bte approach needs to be skipped.


IF pa_check IS INITIAL.
SELECT * FROM zeydigi_bte_tab "#EC CI_NOFIELD
INTO TABLE gt_zgst_fi_doc
WHERE flag EQ abap_false.
IF sy-subrc EQ 0.
LOOP AT gt_zgst_fi_doc INTO DATA(ls_fi_doc).
ls_belnr = VALUE #( sign = lc_include option = lc_equals low = ls_fi_doc-
belnr ).
APPEND ls_belnr TO so_belnr.
CLEAR: ls_belnr, ls_fi_doc.
ENDLOOP.
IF so_belnr[] IS NOT INITIAL.
DATA(lv_proceed) = abap_true.
ENDIF.
ENDIF.
ELSE.
lv_proceed = abap_true.
ENDIF.

* SELECT * FROM zeydigi_docmap INTO TABLE @DATA(lt_doc_map) WHERE extractor_type


= 'O'.
* IF sy-subrc = 0.
* lr_blart = VALUE #( FOR ls_type IN lt_doc_map ( sign = 'I' option = 'EQ' low
= ls_type-blart ) ).
* ENDIF.
*Passsing Company code, document number, Day On Which Accounting Document Was
Entered, tcode
IF lv_proceed EQ abap_true.
*Passsing Company code, document number, Day On Which Accounting Document Was
Entered, tcode
SELECT a~bukrs a~belnr a~gjahr a~blart a~bldat a~budat a~cpudt a~usnam
a~tcode
a~xblnr a~stblg a~stjah a~waers a~kursf a~awtyp a~awkey a~hwaer
a~xreversal
b~gstcode
FROM bkpf AS a
LEFT OUTER JOIN zeydigi_currcd AS b ON a~waers = b~sapcode
INTO TABLE gt_bkpf
WHERE bukrs = pa_bukrs
AND belnr IN so_belnr[]
AND budat IN so_date
AND tcode IN lr_tcode.
IF sy-subrc IS NOT INITIAL.
MESSAGE s002 DISPLAY LIKE lc_error. "No data exits for the given criteria.
LEAVE LIST-PROCESSING.
ELSE.
LOOP AT gt_bkpf ASSIGNING <lfs_bkpf>.
* Get invoice details
IF <lfs_bkpf>-awtyp = lc_vbrk. "VBRK AWTYP-->Reference Procedure
ls_vbeln-vbeln = <lfs_bkpf>-awkey+0(10). "AWKEY-->Object Key
INSERT ls_vbeln INTO TABLE lt_vbeln.
ELSE.
* FI document type
IF <lfs_bkpf>-xblnr IS NOT INITIAL. "XBLNR-->Reference Document
Number
ls_stblg-stblg = <lfs_bkpf>-xblnr. "STBLG-->Reverse Document
Number
ls_stblg-stblg = |{ ls_stblg-stblg ALPHA = IN }|.

ls_stblg-stjah = <lfs_bkpf>-gjahr. "STJAH-->Reverse Document


Fiscal year
INSERT ls_stblg INTO TABLE lt_stblg.

ls_cr_fi-belnr = <lfs_bkpf>-belnr. "BELNR-->Accounting Document


Number
COLLECT ls_cr_fi INTO lt_cr_fi.

CLEAR: ls_cr_fi, ls_stblg.


ENDIF.
ENDIF.

* Get cancelled document


IF <lfs_bkpf>-xreversal = '2'. "XREVERSAL-->Specifies whether
doc. is reversal doc(2). or reversed doc(1).
ls_stblg-stblg = <lfs_bkpf>-stblg. "STBLG-->Reverse Document
Number
ls_stblg-stjah = <lfs_bkpf>-stjah. "STJAH-->Reverse Document
Fiscal year
INSERT ls_stblg INTO TABLE lt_stblg.
CLEAR ls_stblg.
ENDIF.
ENDLOOP.
ENDIF.
* Get cancelled document details (Reversal Document details)
IF lt_stblg IS NOT INITIAL.
*Passing company code, reversed document in accounting docu number, reverse
document fiscal year in fiscal year
SELECT a~bukrs a~belnr a~gjahr a~blart a~bldat a~budat a~cpudt a~usnam
a~tcode
a~xblnr a~stblg a~stjah a~waers a~kursf a~awtyp a~awkey a~hwaer
a~xreversal
FROM bkpf AS a
INTO TABLE gt_bkpf_can
FOR ALL ENTRIES IN lt_stblg
WHERE a~bukrs EQ pa_bukrs
AND a~belnr EQ lt_stblg-stblg
AND a~gjahr EQ lt_stblg-stjah
ORDER BY PRIMARY KEY.
IF sy-subrc IS NOT INITIAL.
CLEAR gt_bkpf_can.
ELSE.
gt_bkpf_ori[] = gt_bkpf_can[].
LOOP AT gt_bkpf_can ASSIGNING <lfs_bkpf_can>.
IF <lfs_bkpf_can>-awtyp EQ lc_vbrk AND "VBRK "AWTYP-->Reference
Procedure
<lfs_bkpf_can>-xreversal IS NOT INITIAL. "XREVERSAL-->Specifies
whether doc. is reversal doc. or reversed doc.
ls_vbeln-vbeln = <lfs_bkpf_can>-awkey+0(10)."AWKEY-->Reference Key
INSERT ls_vbeln INTO TABLE lt_vbeln.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.

*Get Country Code


SELECT * FROM zeydigicountrycd
INTO TABLE gt_countrycode
WHERE sapcode IN gr_land
ORDER BY PRIMARY KEY.
IF sy-subrc IS NOT INITIAL.
CLEAR gt_countrycode.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_bseg_data.
DATA: ls_matnr TYPE lif_data=>ty_matnr,
ls_bup LIKE LINE OF lt_bupla,
ls_hbkid LIKE LINE OF gr_hbkid,
ls_kunnr TYPE lif_data=>ty_kunnr,
ls_prodh LIKE LINE OF lt_prodh,
ls_pln TYPE lif_data=>ty_plant.

FIELD-SYMBOLS: <lfs_bseg> TYPE lif_data=>ty_bseg,


<lfs_bseg_cust> TYPE lif_data=>ty_bseg.

* Get the accounting line item details for the corresponding header details
IF gt_bkpf[] IS NOT INITIAL.
lt_bkpf = gt_bkpf[].
*Delete the adjacent duplicates from the table entries of BKPF by comparing company
code, accounting document number and fiscal year
DELETE ADJACENT DUPLICATES FROM lt_bkpf COMPARING bukrs belnr gjahr.

*Passing company code, accounting document number and fiscal year


SELECT a~bukrs, a~belnr, a~gjahr, a~buzei, a~buzid,
a~augdt, a~augbl, a~bschl, a~koart, a~umskz,
a~shkzg, a~mwskz, a~dmbtr, a~wrbtr, a~fwbas, a~txgrp,
a~zuonr, a~vbeln, a~xanet, a~hkont, a~kunnr, a~lifnr,
a~zterm, a~zlsch, a~hbkid, a~nebtr, a~matnr,
a~werks, a~menge, a~meins, a~prctr, a~bupla,
a~taxps, a~gst_part, a~plc_sup, a~hsn_sac, a~ktosl, b~steuc, c~matnr
AS mat, c~prdha, d~maktx, e~sales_type, f~meins1,
g~vtext, h~creditdays, i~gstcode, a~zfbdt, a~zbd1t, a~zbd2t, a~zbd3t
FROM bseg AS a
LEFT OUTER JOIN marc AS b ON a~matnr EQ b~matnr AND a~werks EQ b~werks
LEFT OUTER JOIN mara AS c ON a~matnr EQ c~matnr
LEFT OUTER JOIN makt AS d ON c~matnr EQ d~matnr AND d~spras = @sy-
langu
LEFT OUTER JOIN zeydigi_hsncode AS e ON b~steuc EQ e~hsn_code
LEFT OUTER JOIN zeydigi_unit AS f ON a~meins EQ f~meins
LEFT OUTER JOIN tvzbt AS g ON a~zterm EQ g~zterm AND g~spras EQ @sy-
langu
LEFT OUTER JOIN zeydigi_payterms AS h ON a~zterm EQ h~sapcode
LEFT OUTER JOIN zeydigi_modepay AS i ON a~zlsch EQ i~sapcode
INTO TABLE @gt_bseg
FOR ALL ENTRIES IN @lt_bkpf
WHERE bukrs = @lt_bkpf-bukrs
AND belnr = @lt_bkpf-belnr
AND gjahr = @lt_bkpf-gjahr.
IF sy-subrc IS INITIAL.

SORT gt_bseg BY bukrs belnr gjahr buzei.

gt_bseg_tax = gt_bseg_customer = gt_bseg.

*KOART-->Account Type not equal to 'D' (Customers)


DELETE gt_bseg_customer WHERE koart NE lc_cust.

DATA(lt_vendor) = gt_bseg_customer.
DELETE lt_vendor WHERE koart NE 'K'.
DATA: r_adrnr TYPE RANGE OF adrc-addrnumber.
IF lt_vendor IS NOT INITIAL.
SELECT lifnr land1 name1 name2 stcd3 adrnr FROM lfa1 APPENDING TABLE
gt_lfa1
FOR ALL ENTRIES IN lt_vendor
WHERE lifnr = lt_vendor-lifnr.
r_adrnr = VALUE #( FOR ls_add IN gt_lfa1 ( sign = 'I' option = 'EQ' low =
ls_add-adrnr ) ).
APPEND LINES OF r_adrnr TO gr_adrnr_mat.
ENDIF.

*BUZID-->Identification of the Line Item


*MENGE-->Quantity
DELETE gt_bseg WHERE koart EQ lc_cust OR "delete customer line 'D'
buzid EQ lc_rmtax OR "delete tax line 'T'
( menge IS INITIAL AND hsn_sac+0(2) NE '99' ). "delete
where qty is initial

DELETE gt_bseg_tax WHERE koart EQ lc_cust OR buzid IS INITIAL.


LOOP AT gt_bseg ASSIGNING <lfs_bseg>.
AT NEW belnr.
READ TABLE gt_bseg_customer ASSIGNING <lfs_bseg_cust>
WITH KEY bukrs = <lfs_bseg>-bukrs "Company
Code
belnr = <lfs_bseg>-belnr
"Accounting Document Number
gjahr = <lfs_bseg>-gjahr "Fiscal
Year
BINARY SEARCH.
IF sy-subrc IS INITIAL.
** collect customer
ls_kunnr-kunnr = <lfs_bseg_cust>-kunnr. "KUNNR-->Customer Number
INSERT ls_kunnr INTO TABLE lt_kunnr.

* branch IFSC code


ls_hbkid-sign = lc_include.
ls_hbkid-option = lc_equals.
ls_hbkid-low = <lfs_bseg_cust>-hbkid. "HBKID-->Short Key for a
House Bank
COLLECT ls_hbkid INTO gr_hbkid.

ENDIF.
ENDAT.

* Collect material numer


ls_matnr-matnr = <lfs_bseg>-matnr. "MATNR-->Material Number
INSERT ls_matnr INTO TABLE lt_matnr.

* Collect business place


ls_bup-bupla = <lfs_bseg>-bupla. "BUPLA-->Business Place
INSERT ls_bup INTO TABLE lt_bupla.

** collect plants
ls_pln-werks = <lfs_bseg>-werks. "WERKS-->Plant
INSERT ls_pln INTO TABLE lt_plant.

ls_prodh-prodh = <lfs_bseg>-prdha. "PRDHA-->Product Hierarchy


INSERT ls_prodh INTO TABLE lt_prodh.

ENDLOOP.

ENDIF.
ENDIF.

* Bank details
IF gr_hbkid IS NOT INITIAL.
*T012k-->House Bank Accounts T012-->House Banks
*BANKL-->Bank Keys BANKN-->Bank Account Number
SELECT t012~bukrs
t012~hbkid
t012~bankl
t012k~bankn
FROM t012
INNER JOIN t012k ON t012~bukrs EQ t012k~bukrs "#EC CI_BUFFJOIN "BUKRS--
>Company Code
AND t012~hbkid EQ t012k~hbkid "HBKID-->Short key for a
House Bank
INTO TABLE gt_bank
WHERE t012~bukrs EQ pa_bukrs
AND t012~hbkid IN gr_hbkid
AND t012~spras EQ sy-langu.
IF sy-subrc IS INITIAL.
SORT gt_bank BY bukrs hbkid.
ENDIF.
ENDIF.

SORT gt_bseg_tax BY bukrs belnr gjahr buzid.

ENDMETHOD.

METHOD m_get_bset_data.

*Delete the entries where account type is VBRK


DELETE lt_bkpf WHERE awtyp EQ lc_vbrk.

IF lt_bkpf[] IS NOT INITIAL.


*Get the tax details for the corresponding header details
*BSET-->Tax Data Document Segment
SELECT bukrs belnr gjahr buzei mwskz hkont txgrp
hwbas fwbas hwste fwste kschl kbetr bupla taxps
FROM bset
INTO TABLE gt_bset
FOR ALL ENTRIES IN lt_bkpf
WHERE bukrs = lt_bkpf-bukrs "BURKS-->Company Code
AND belnr = lt_bkpf-belnr "BELNR-->Accounting Document Number
AND gjahr = lt_bkpf-gjahr "GJAHR-->Fiscal Year
ORDER BY PRIMARY KEY.
IF sy-subrc IS INITIAL.
SORT gt_bset BY bukrs belnr gjahr mwskz txgrp taxps.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_invoice_details.
DATA:
ls_vgb LIKE LINE OF lt_vgbel,
ls_aubel LIKE LINE OF lt_aubel,
ls_charg LIKE LINE OF gr_charg,
ls_knv LIKE LINE OF lt_knumv,
lrs_adrnr LIKE LINE OF gr_adrnr,
ls_prodh LIKE LINE OF lt_prodh.

FIELD-SYMBOLS: <lfs_data> TYPE lif_data=>ty_invoice.

* Get the invoice details


*VBRK-->Billing Document: Header Data VBRP-->Billing Document: Item Data
IF lt_vbeln[] IS NOT INITIAL.

SELECT a~vbeln a~fkart a~fktyp a~waerk a~vkorg a~vtweg a~knumv a~fkdat


a~bukrs a~netwr
a~ernam a~erdat a~sfakn a~spart a~mwsbk a~bupla a~xblnr a~fk_source_sys
b~posnr b~fkimg
b~vrkme b~meins b~netwr AS amt b~vbelv b~posnv b~vgbel b~vgpos b~vgtyp
b~aubel
b~aupos b~matnr b~arktx b~charg b~pstyv b~prodh b~werks b~lgort b~prctr
b~cmpre
b~mwsbp AS price c~adrnr d~endat d~bedat e~lgobe
FROM vbrk AS a
INNER JOIN vbrp AS b ON a~vbeln EQ b~vbeln
INNER JOIN tvko AS c ON a~vkorg EQ c~vkorg
LEFT OUTER JOIN fpla AS d ON a~vbeln EQ d~vbeln
LEFT OUTER JOIN t001l AS e ON b~lgort EQ e~lgort AND b~werks EQ e~werks
INTO TABLE gt_invoice
FOR ALL ENTRIES IN lt_vbeln
WHERE a~vbeln EQ lt_vbeln-vbeln "VBELN-->Billing Document
AND a~bukrs EQ pa_bukrs. "BUKRS-->Company Code

IF sy-subrc IS INITIAL.
*Sort the below table by billing document number and material number
SORT gt_invoice BY vbeln matnr posnr.

LOOP AT gt_invoice ASSIGNING <lfs_data>.


*Batch
ls_charg-sign = lc_include.
ls_charg-option = lc_equals.
ls_charg-low = <lfs_data>-charg. "CHARG-->Batch Number
COLLECT ls_charg INTO gr_charg.

* Document Number of the Reference Document


ls_vgb-vbeln = <lfs_data>-vgbel. "VGBEL-->Document Number of the
Reference Document
ls_vgb-posnr = <lfs_data>-vgpos. "VGPOS-->Item Number of the
Reference Item
INSERT ls_vgb INTO TABLE lt_vgbel.

* collect condition record number


ls_knv-knumv = <lfs_data>-knumv. "KNUMV-->Number of the document
condition
ls_knv-kposn = <lfs_data>-posnr. "POSNR-->Billing Item
INSERT ls_knv INTO TABLE lt_knumv.

* Collect sales ord number


ls_aubel-vbeln = <lfs_data>-aubel. "AUBEL-->Sales Document
INSERT ls_aubel INTO TABLE lt_aubel.

* Collect product hierarchy


ls_prodh-prodh = <lfs_data>-prodh. "PRODH-->Product Hierarchy
INSERT ls_prodh INTO TABLE lt_prodh.

lrs_adrnr-option = lc_equals.
lrs_adrnr-sign = lc_include.
lrs_adrnr-low = <lfs_data>-adrnr. "ADRNR-->Address Number
COLLECT lrs_adrnr INTO gr_adrnr.

CLEAR: ls_aubel, ls_vgb, ls_knv.


ENDLOOP.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_sales_org_addr.

ENDMETHOD.
METHOD m_get_vbpa_details.

DATA: lr_parvw TYPE RANGE OF vbpa-parvw,


ls_kunnr LIKE LINE OF lt_kunnr.

FIELD-SYMBOLS: <lfs_vbpa> TYPE lif_data=>ty_vbpa.

IF lt_vbeln[] IS NOT INITIAL.

lr_parvw = VALUE #( sign = lc_include option = lc_equals ( low = lc_re ) "RE


( low = lc_we ) "WE
( low = lc_ag ) "AG
( low = lc_sp ) "SP
( low = 'CR' )
( low = lc_rg ) ).
"RG
* Get ship to part and sold to party details
*VBPA-->Sales Document: Partner
SELECT vbeln, lifnr, parvw, kunnr
FROM vbpa
INTO TABLE @gt_vbpa
FOR ALL ENTRIES IN @lt_vbeln
WHERE vbeln EQ @lt_vbeln-vbeln "VBELN-->Sales and Distribution Document
Number
AND parvw IN @lr_parvw[]. "PARVW-->Partner Function
IF sy-subrc IS INITIAL.
SORT gt_vbpa BY vbeln parvw.
LOOP AT gt_vbpa ASSIGNING <lfs_vbpa>.
ls_kunnr-kunnr = <lfs_vbpa>-kunnr. "KUNNR-->Customer Number
INSERT ls_kunnr INTO TABLE lt_kunnr.
ENDLOOP.
ENDIF.
ENDIF.

ENDMETHOD.
METHOD m_get_supplier_details.

*T001-->Company Codes
SELECT bukrs adrnr butxt
FROM t001
INTO TABLE gt_bukrs
WHERE bukrs EQ pa_bukrs "BUKRS-->Company Code
AND spras EQ sy-langu
ORDER BY PRIMARY KEY.

READ TABLE gt_bukrs INTO DATA(ls_bukrs) INDEX 1.


IF sy-subrc EQ 0.
*ADRC-->Addresses (Business Address Services)
SELECT addrnumber name1 name2 city1 city2 post_code1 str_suppl1 street
str_suppl2 location building floor country region tel_number flagcomm6
FROM adrc
INTO TABLE gt_adrc1
WHERE addrnumber EQ ls_bukrs-adrnr. "ADDRNUMBER-->Address Number
IF sy-subrc EQ 0.
SORT gt_adrc1 BY addrnumber.
ENDIF.
ENDIF.

IF gr_adrnr_mat IS NOT INITIAL.


*ADRC-->Addresses (Business Address Services)
SELECT addrnumber name1 name2 city1 city2 street house_num1 house_num2
house_num3 post_code1 post_code2
post_code3 str_suppl1 str_suppl2 str_suppl3 location building floor
country region tel_number flagcomm6
FROM adrc
INTO TABLE gt_adrc_mat
WHERE addrnumber IN gr_adrnr_mat. "ADDRNUMBER-->Address Number
IF sy-subrc EQ 0.
SORT gt_adrc_mat BY addrnumber.
ENDIF.
ENDIF.

ENDMETHOD.
METHOD m_get_recipient_details_fi.

DATA: lrs_adrnr LIKE LINE OF gr_adrnr.

FIELD-SYMBOLS: <lfs_rcpt> TYPE lif_data=>ty_rcpt_fi.

*KNA1-->General Data in Customer Master


IF lt_kunnr[] IS NOT INITIAL.
SELECT kna1~kunnr, kna1~land1, kna1~name1, kna1~name2, kna1~ort01,
kna1~regio, kna1~stras, kna1~adrnr, kna1~stcd1, kna1~stcd3
FROM kna1
INTO TABLE @gt_rcpt_fi
FOR ALL ENTRIES IN @lt_kunnr
WHERE kunnr = @lt_kunnr-kunnr. "KUNNR-->Customer Number
IF sy-subrc IS INITIAL.
SORT gt_rcpt_fi BY kunnr.
LOOP AT gt_rcpt_fi ASSIGNING <lfs_rcpt>.
lrs_adrnr-option = lc_equals.
lrs_adrnr-sign = lc_include.
lrs_adrnr-low = <lfs_rcpt>-adrnr.
COLLECT lrs_adrnr INTO gr_adrnr.
ENDLOOP.
ENDIF.
ENDIF.

ENDMETHOD.
METHOD m_get_adrc_details.

*Fetch Address details


SELECT a~addrnumber a~name1 a~name2 a~city1 a~city2 a~street a~house_num1
a~roomnumber a~post_code1 a~str_suppl1
a~str_suppl2 a~str_suppl3 a~location a~building a~floor a~country
a~region a~tel_number a~flagcomm6 b~smtp_addr
FROM adrc AS a
LEFT OUTER JOIN adr6 AS b ON a~addrnumber = b~addrnumber
INTO TABLE gt_adrc
WHERE a~addrnumber IN gr_adrnr. "Addrnumber-->Address Number
IF sy-subrc IS NOT INITIAL.
CLEAR gt_adrc.
ELSE.
SORT gt_adrc BY addrnumber.
ENDIF.

*Get POS details


*ZGSTNSTATECODE-->State code mapping with GSTN
SELECT * FROM zeydigi_statecd
INTO TABLE gt_statecode
ORDER BY PRIMARY KEY.

ENDMETHOD.

METHOD m_get_supplier_gstn.
*Get the supplier gstn based on the business place
*J_1BBRANCH-->Business Place
IF lt_bupla[] IS NOT INITIAL.
SELECT bukrs
branch
gstin
adrnr
FROM j_1bbranch
INTO TABLE gt_gstn
FOR ALL ENTRIES IN lt_bupla
WHERE bukrs EQ pa_bukrs "BUKRS-->Company Code
AND branch EQ lt_bupla-bupla "BRANCH-->Business Place
ORDER BY PRIMARY KEY.
IF sy-subrc IS NOT INITIAL.
CLEAR gt_gstn[].
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_hsn_code.

ENDMETHOD.

METHOD m_get_eway_bill_and_strloc.

* Get the eway bill number and storage location description


*LIKP-->SD Document: Delivery Header Data
*BOLNR-->Bill of Lading BLDAT-->Document date in document
IF lt_vgbel[] IS NOT INITIAL.
SELECT a~vbeln a~bolnr a~bldat a~vsart a~route
b~lifnr c~name1 c~stcd3 d~distz
FROM likp AS a
INNER JOIN vbpa AS b ON a~vbeln = b~vbeln
LEFT OUTER JOIN lfa1 AS c ON b~lifnr = c~lifnr
LEFT OUTER JOIN tvro AS d ON a~route = d~route
INTO TABLE gt_eway
FOR ALL ENTRIES IN lt_vgbel
WHERE a~vbeln EQ lt_vgbel-vbeln "VBELN-->Delivery
AND b~parvw = 'SP'
AND b~posnr = '000000'.
IF sy-subrc IS NOT INITIAL.
CLEAR gt_eway.
ENDIF.
ENDIF.

* get shipment details


IF lt_vgbel[] IS NOT INITIAL.
*VTTK-->Shipment Header; VTTP-->Shipment Item
SELECT vttp~vbeln vttp~tpnum vttk~tknum vttk~erdat
vttk~route vttk~distz vttk~/bev1/rpmowa
FROM vttk
INNER JOIN vttp ON vttp~tknum EQ vttk~tknum "TKNUM-->Shipment Number
INTO TABLE gt_vttk
FOR ALL ENTRIES IN lt_vgbel
WHERE vbeln = lt_vgbel-vbeln. "VBELN-->Delivery Number
IF sy-subrc IS INITIAL.
SORT gt_vttk BY vbeln.
ENDIF.
ENDIF.

ENDMETHOD.
METHOD m_get_tax_info.

DATA: lr_kschl TYPE RANGE OF kschl,


lrs_kschl LIKE LINE OF lr_kschl.

FIELD-SYMBOLS: <lfs_cond> TYPE zeydigi_condtype.

* Get the condition type from the custom table


*ZGSTN_COND_TYPE-->Condition type mapping
SELECT * FROM zeydigi_condtype
INTO TABLE gt_cond_typ
WHERE extractor_type = lc_out "O"
AND kschl IN lr_kschl "KSCHL-->Condition Type
ORDER BY PRIMARY KEY.
IF sy-subrc IS INITIAL.
LOOP AT gt_cond_typ ASSIGNING <lfs_cond>.
lrs_kschl-sign = lc_include.
lrs_kschl-option = lc_equals.
lrs_kschl-low = <lfs_cond>-kschl. "KSCHL-->Condition Type
APPEND lrs_kschl TO lr_kschl.
ENDLOOP.
lrs_kschl-sign = lc_include.
lrs_kschl-option = lc_equals.
lrs_kschl-low = lc_jcos. "'JCOS
APPEND lrs_kschl TO lr_kschl.
lrs_kschl-low = lc_pr00. "'PR00'
APPEND lrs_kschl TO lr_kschl.
ENDIF.

*get the tax and gl account per line item


*prcd_elements-->Conditions(Transaction Data)
*T030K-->Tax Accounts Determination
IF lt_knumv[] IS NOT INITIAL.
SELECT prcd_elements~knumv
prcd_elements~kposn
prcd_elements~kappl
prcd_elements~kschl "#EC_CI_NOORDER
prcd_elements~kawrt
prcd_elements~kbetr
prcd_elements~kvsl1
prcd_elements~kwert
t030k~konts
FROM prcd_elements
LEFT JOIN t030k ON prcd_elements~kvsl1 EQ t030k~ktosl AND "#EC CI_BUFFJOIN
"KTOSL-->Transaction Key
prcd_elements~mwsk1 EQ t030k~mwskz "MWSKZ-->Tax on
sales/Purchase code
INTO TABLE gt_tax
FOR ALL ENTRIES IN lt_knumv
WHERE knumv EQ lt_knumv-knumv "KNUMV-->Number of document condition
AND kposn EQ lt_knumv-kposn "KPOSN-->Condition item number
AND kappl EQ lc_kappl "KAPPL-->Application 'V'
AND kschl IN lr_kschl[]. "KSCHL-->Condition Type
IF sy-subrc IS INITIAL.
SORT gt_tax BY knumv kposn kappl kschl.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_supply_type_details.

DATA: ls_bup LIKE LINE OF lt_bupla,


lrs_adrnr LIKE LINE OF gr_adrnr.

FIELD-SYMBOLS: <lfs_plant> TYPE lif_data=>ty_plant_map.

* Get the sales type, recipient type, reverse charge, auto populate from cust table
IF lt_kunnr[] IS NOT INITIAL.
*ZGSTN_CUSTOMER-->Customer mapping table
SELECT * FROM zeydigi_customer
INTO TABLE gt_customer
FOR ALL ENTRIES IN lt_kunnr
WHERE customer EQ lt_kunnr-kunnr "KUNNR-->Customer Number
ORDER BY PRIMARY KEY.
IF sy-subrc IS NOT INITIAL.
CLEAR gt_customer[].
ENDIF.
ENDIF.

* Get plant details


IF lt_plant[] IS NOT INITIAL.
*ZGSTN_PLANT_MAP-->Plant mapping
SELECT zeydigi_plantmap~werks zeydigi_plantmap~domestic_plant
zeydigi_plantmap~sez_plant
t001w~kunnr t001w~land1 t001w~regio t001w~adrnr t001w~j_1bbranch
FROM zeydigi_plantmap
INNER JOIN t001w "#EC CI_BUFFJOIN
ON zeydigi_plantmap~werks EQ t001w~werks
INTO TABLE gt_plant
FOR ALL ENTRIES IN lt_plant
WHERE zeydigi_plantmap~werks = lt_plant-werks. "WERKS-->Plant

IF sy-subrc IS INITIAL.
SORT gt_plant[] BY werks j_1bbranch. "J_1BBRANCH-->Business Place

LOOP AT gt_plant ASSIGNING <lfs_plant>.


* Collect address
lrs_adrnr-option = lc_equals.
lrs_adrnr-sign = lc_include.
lrs_adrnr-low = <lfs_plant>-adrnr. "ADRNR-->Address Number
COLLECT lrs_adrnr INTO gr_adrnr.
* Collect business place
ls_bup-bupla = <lfs_plant>-j_1bbranch. "J_1BBRANCH-->Business Place
INSERT ls_bup INTO TABLE lt_bupla.
ENDLOOP.

DATA(lt_kunnr) = gt_plant.
DELETE lt_kunnr WHERE kunnr IS INITIAL.
SORT lt_kunnr BY kunnr.
DELETE ADJACENT DUPLICATES FROM lt_kunnr COMPARING kunnr.
IF lt_kunnr IS NOT INITIAL.
SELECT kunnr, name1, adrnr FROM kna1
FOR ALL ENTRIES IN @lt_kunnr
WHERE kunnr = @lt_kunnr-kunnr
INTO TABLE @gt_customer_of_plnt.
IF sy-subrc = 0.
SORT gt_customer_of_plnt BY kunnr.
LOOP AT gt_customer_of_plnt ASSIGNING FIELD-SYMBOL(<fs_cus_of_plnt>).
* Collect address
lrs_adrnr-option = lc_equals.
lrs_adrnr-sign = lc_include.
lrs_adrnr-low = <fs_cus_of_plnt>-adrnr. "ADRNR-->Address Number
COLLECT lrs_adrnr INTO gr_adrnr.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

* GET gst document types from custom table


*ZEY_DOC_MAP-->Document Mapping
SELECT * FROM zeydigi_docmap
INTO TABLE gt_doc_typ
WHERE extractor_type = lc_out "O"
ORDER BY PRIMARY KEY.
IF sy-subrc IS NOT INITIAL.
CLEAR gt_doc_typ[].
ENDIF.

ENDMETHOD.

METHOD m_get_order_reason.

DATA: ls_crdr LIKE LINE OF lt_crdr.

FIELD-SYMBOLS: <lfs_vbak> TYPE lif_data=>ty_vbak.

* Get the order reason for the CR/DR scenario


*VBAK-->Sales Document: Header Data TVAUT-->Sales Documents: Order Reasons: Texts
IF lt_aubel IS NOT INITIAL.
SELECT a~vbeln, a~auart, a~augru, a~gwldt, a~zuonr, a~vgbel, b~posnr,
b~zterm, b~zlsch,
b~bstkd, b~bstdk, b~vsart, c~bezei, d~vbtyp
FROM vbak AS a
INNER JOIN vbkd AS b ON a~vbeln EQ b~vbeln AND b~posnr = '000000'
LEFT OUTER JOIN tvaut AS c ON a~augru EQ c~augru AND c~spras = @sy-langu
"#EC CI_BUFFJOIN "AUGRU-->Order Reason (reason for the business transaction)
LEFT OUTER JOIN tvak AS d ON a~auart EQ d~auart
INTO TABLE @gt_vbak
FOR ALL ENTRIES IN @lt_aubel
WHERE a~vbeln EQ @lt_aubel-vbeln. "VBELN-->Sales Document
IF sy-subrc IS INITIAL.
SORT gt_vbak BY vbeln.

LOOP AT gt_vbak ASSIGNING <lfs_vbak>.


ls_crdr-vbeln = <lfs_vbak>-zuonr. "ZUONR-->Assignment Number
INSERT ls_crdr INTO TABLE lt_crdr.
ENDLOOP.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_description.

*Get the product hierarchy description


*T179T-->Materials: Product hierarchies: Texts
IF lt_prodh IS NOT INITIAL.
SELECT prodh
vtext
FROM t179t
INTO TABLE gt_prodh
FOR ALL ENTRIES IN lt_prodh
WHERE spras = sy-langu
AND prodh = lt_prodh-prodh. "PRODH-->Product Hierarchy
IF sy-subrc IS INITIAL.
SORT gt_prodh[] BY prodh.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_material_details.

IF lt_matnr[] IS NOT INITIAL.


*MCHA-->Batches
SELECT matnr werks charg vfdat herkl
FROM mcha
INTO TABLE gt_mcha
FOR ALL ENTRIES IN lt_matnr
WHERE matnr = lt_matnr-matnr "MATNR-->Material Number
AND charg IN gr_charg "CHARG-->Batch Number
ORDER BY PRIMARY KEY.
IF sy-subrc IS NOT INITIAL.
CLEAR: gt_mcha.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_get_plant_details.

DATA: ls_plant TYPE lif_data=>ty_plant.


FIELD-SYMBOLS: <lfs_plant_fi> TYPE lif_data=>ty_plant_fi.

*T001W-->Plants/Branches
IF lt_bupla[] IS NOT INITIAL.
SELECT werks
j_1bbranch
FROM t001w
INTO TABLE gt_plant_bupla
FOR ALL ENTRIES IN lt_bupla
WHERE j_1bbranch EQ lt_bupla-bupla. "J_1BBRANCH-->Business Place
IF sy-subrc IS INITIAL.
SORT gt_plant_bupla BY j_1bbranch.
LOOP AT gt_plant_bupla ASSIGNING <lfs_plant_fi>.
ls_plant-werks = <lfs_plant_fi>-werks. "WERKS-->Plant
INSERT ls_plant INTO TABLE lt_plant.
ENDLOOP.
ENDIF.
ENDIF.

ENDMETHOD.

METHOD m_supply_type_determination.
CONSTANTS: lc_sezwt TYPE zeydigi_oward_i-supplytype VALUE 'SEZWOP',
lc_sezwdt TYPE zeydigi_oward_i-supplytype VALUE 'SEDWOP',
lc_sezt TYPE zeydigi_oward_i-supplytype VALUE 'SEZWP',
lc_sezdt TYPE zeydigi_oward_i-supplytype VALUE 'SEDWP',
lc_dxp TYPE zeydigi_oward_i-supplytype VALUE 'DXP',
lc_dta TYPE zeydigi_oward_i-supplytype VALUE 'DTA',
lc_nil TYPE zeydigi_oward_i-supplytype VALUE 'NIL',
lc_tax TYPE zeydigi_oward_i-supplytype VALUE 'TAX',
lc_expwt TYPE zeydigi_oward_i-supplytype VALUE 'EXPWT',
lc_expt TYPE zeydigi_oward_i-supplytype VALUE 'EXPT',
lc_can TYPE zeydigi_oward_i-supplytype VALUE 'CAN',
lc_ext TYPE zeydigi_oward_i-supplytype VALUE 'EXT',
lc_hnon TYPE zeydigi_hsncode-sales_type VALUE 'NON',
lc_csez TYPE zeydigi_customer-sales_type VALUE 'S',
lc_csedz TYPE zeydigi_customer-sales_type VALUE 'SD',
lc_cdom TYPE zeydigi_customer-sales_type VALUE 'D',
lc_jo TYPE kschl VALUE 'JO'.

FIELD-SYMBOLS: <lfs_plant> TYPE lif_data=>ty_plant_map,


<lfs_hsn_cd> TYPE lif_data=>ty_marc,
<lfs_hcode> TYPE zeydigi_hsncode,
<lfs_tax_cd> TYPE lif_data=>ty_prcd_elements.

READ TABLE gt_plant ASSIGNING <lfs_plant>


WITH KEY werks = ls_data-werks
BINARY SEARCH.
IF sy-subrc IS INITIAL.
IF <lfs_plant>-land1 EQ im_land. " domestic sales
IF ls_data-price = 0 AND
ls_cust-sales_type = lc_csez.
lv_supplytype = lc_sezwt.
ELSEIF ls_cust-sales_type = lc_csez.
lv_supplytype = lc_sezt.
ELSEIF ls_data-price = 0 AND
ls_cust-sales_type = lc_csedz.
lv_supplytype = lc_sezwdt.
ELSEIF ls_cust-sales_type = lc_csedz.
lv_supplytype = lc_sezdt.
ELSEIF ls_cust-sales_type = lc_cdom.
lv_supplytype = lc_dxp.
ENDIF.

IF <lfs_plant>-sez_plant EQ abap_true "SEZ sales


AND ( ls_cust-sales_type <> lc_csez AND ls_cust-sales_type <> 'SD' ).
lv_supplytype = lc_dta.
ENDIF.
IF lv_type IS NOT INITIAL AND lv_supplytype IS INITIAL.
lv_supplytype = lv_type.
READ TABLE gt_tax ASSIGNING <lfs_tax_cd>
WITH KEY knumv = ls_data-knumv
kposn = ls_data-posnr
kappl = lc_kappl
BINARY SEARCH.
IF sy-subrc IS INITIAL AND ls_data-price = 0
AND lv_type = lc_hnon
AND <lfs_tax_cd>-kschl CA lc_jo.
lv_supplytype = lc_hnon. "SCH3
ENDIF.
ELSE.
READ TABLE gt_tax ASSIGNING <lfs_tax_cd>
WITH KEY knumv = ls_data-knumv
kposn = ls_data-posnr
kappl = lc_kappl
BINARY SEARCH.
IF sy-subrc IS INITIAL.
IF ls_data-price = 0 AND
<lfs_tax_cd>-kschl CA lc_jo.
lv_supplytype = lc_nil.
ELSEIF ls_data-price = 0 AND ##BOOL_OK
<lfs_tax_cd>-kschl NA lc_jo.
lv_supplytype = lc_ext.
ELSEIF ls_data-price > 0.
lv_supplytype = lc_tax.

ENDIF.
ENDIF.
ENDIF.
ELSE. " export
IF ls_data-price = 0.
lv_supplytype = lc_expwt.
ELSE.
lv_supplytype = lc_expt.
ENDIF.
ENDIF.
ENDIF.
lv_supplytype = COND #( WHEN ls_data-sfakn IS NOT INITIAL
THEN lc_can "|CAN|
ELSE lv_supplytype ).

ENDMETHOD.

METHOD m_supply_type_determination_fi.
CONSTANTS: lc_sezwt TYPE zeydigi_oward_i-supplytype VALUE 'SEZWOP',
lc_sezwdt TYPE zeydigi_oward_i-supplytype VALUE 'SEDWOP',
lc_sezt TYPE zeydigi_oward_i-supplytype VALUE 'SEZWP',
lc_sezdt TYPE zeydigi_oward_i-supplytype VALUE 'SEDWP',
lc_dxp TYPE zeydigi_oward_i-supplytype VALUE 'DXP',
lc_dta TYPE zeydigi_oward_i-supplytype VALUE 'DTA',
lc_nil TYPE zeydigi_oward_i-supplytype VALUE 'NIL',
lc_tax TYPE zeydigi_oward_i-supplytype VALUE 'TAX',
lc_expwt TYPE zeydigi_oward_i-supplytype VALUE 'EXPWT',
lc_expt TYPE zeydigi_oward_i-supplytype VALUE 'EXPT',
lc_can TYPE zeydigi_oward_i-supplytype VALUE 'CAN',
lc_ext TYPE zeydigi_oward_i-supplytype VALUE 'EXT',
lc_hnon TYPE zeydigi_hsncode-sales_type VALUE 'NON',
lc_csez TYPE zeydigi_customer-sales_type VALUE 'S',
lc_csedz TYPE zeydigi_customer-sales_type VALUE 'SD',
lc_cdom TYPE zeydigi_customer-sales_type VALUE 'D',
lc_jo TYPE kschl VALUE 'JO',
lc_canl TYPE bkpf-xreversal VALUE '2'.

DATA: lv_werks TYPE bseg-werks,


lv_hsn TYPE marc-steuc.

FIELD-SYMBOLS:
<lfs_plant> TYPE lif_data=>ty_plant_map,
<lfs_hsn_cd> TYPE lif_data=>ty_marc,
<lfs_hcode> TYPE zeydigi_hsncode.

lv_werks = ls_data-werks.

IF lv_werks IS INITIAL.
lv_werks = ls_data-bupla.
ENDIF.

IF ls_data-hsn_sac IS NOT INITIAL.


lv_hsn = ls_data-hsn_sac.
ENDIF.

READ TABLE gt_plant ASSIGNING <lfs_plant> WITH KEY werks = lv_werks


BINARY SEARCH.
IF sy-subrc IS INITIAL.
IF <lfs_plant>-land1 EQ im_land. " domestic sales
IF ls_tax-fwste = 0 AND
ls_cust-sales_type = lc_csez. "'S'.
lv_supplytype = lc_sezwt. "'SEZWT'
ELSEIF ls_cust-sales_type = lc_csez. "'S'.
lv_supplytype = lc_sezt. "'SEZT'
ELSEIF ls_tax-fwste = 0 AND
ls_cust-sales_type = lc_csedz.
lv_supplytype = lc_sezwdt.
ELSEIF ls_cust-sales_type = lc_csedz.
lv_supplytype = lc_sezdt.
ELSEIF ls_cust-sales_type = lc_cdom. "'D'.
lv_supplytype = lc_dxp. "'DXP'
ELSEIF <lfs_plant>-sez_plant EQ abap_true "SEZ sales
AND ( ls_cust-sales_type <> lc_csez AND ls_cust-sales_type <> 'SD' ).
"'S'.
lv_supplytype = lc_dta. "'DTA'

* Get material hsn details


ELSE.
IF lv_type IS NOT INITIAL AND lv_supplytype IS INITIAL.
lv_supplytype = lv_type.
IF sy-subrc IS INITIAL AND ls_tax-fwste = 0
AND lv_type = lc_hnon
AND ls_tax-kschl CA lc_jo. "'JO'.
lv_supplytype = 'SCH3'. "lc_non. "'NON'.
ENDIF.
ELSE.
IF ls_tax-fwste = 0 AND
ls_tax-kschl CA lc_jo. "'JO'.
lv_supplytype = lc_nil. "'NIL'.
ELSEIF ls_tax-fwste = 0 AND ##BOOL_OK
ls_tax-kschl NA lc_jo.
lv_supplytype = lc_ext.
ELSEIF ls_tax-fwste > 0.
lv_supplytype = lc_tax. "'TAX'.
ENDIF.
ENDIF.
ENDIF.
ELSE. " export
IF ls_tax-fwste = 0.
lv_supplytype = lc_expwt. "'EXPWT'.
ELSE.
lv_supplytype = lc_expt. "'EXPT'.
ENDIF.
ENDIF.
ENDIF.
lv_supplytype = COND #( WHEN ls_doc-xreversal EQ lc_canl "'S1'
THEN lc_can "|CAN|
ELSE lv_supplytype ).

ENDMETHOD.

METHOD m_fill_final_table.

TYPES:BEGIN OF ty_sup,
belnr TYPE belnr,
supplytype TYPE char10,
END OF ty_sup.

DATA:lt_sup TYPE TABLE OF ty_sup,


lr_kvsl1 TYPE RANGE OF kvsl1,
ls_sup TYPE ty_sup.

DATA:
ls_header TYPE zeydigi_oward_h,
ls_item TYPE zeydigi_oward_i,
ls_cust_bseg TYPE zeydigi_customer,
ls_cust TYPE zeydigi_customer,
lv_shipto TYPE adrc-region,
lv_bseg_land1 TYPE kna1-land1,
lv_index TYPE sy-tabix,
lv_indx TYPE sy-tabix,
ls_faede TYPE faede,
ls_out_faede TYPE faede,
lv_credit TYPE tfmatage,
lv_sec7_flag TYPE zeydigi_customer-eligible_sec7,
lv_date TYPE vbrk-erdat VALUE '20170701',
lr_supply TYPE RANGE OF zeydigi_oward_i-supplytype,
lv_bill_to TYPE kna1-kunnr,
lv_ship_to TYPE kna1-kunnr,
lv_object_name TYPE thead-tdname,
lv_string TYPE string,
lv_shipto_ctry TYPE kna1-land1,
lv_plant_ctry TYPE kna1-land1,
lv_name TYPE t001-butxt,
lv_invasamt TYPE zeydigi_oward_h-invoiceassessableamount,
lv_invassamt TYPE zeydigi_oward_h-invoiceassessableamount,
lv_tax_total TYPE zeydigi_oward_h-invoiceassessableamount,
lv_inv_igst TYPE zeydigi_oward_h-invoiceigstamount,
lv_inv_cgst TYPE zeydigi_oward_h-invoicecgstamount,
lv_inv_sgst TYPE zeydigi_oward_h-invoicesgstamount,
lv_inv_adv TYPE zeydigi_oward_h-invoicecessadvaloremamount,
lv_inv_spc TYPE zeydigi_oward_h-invoicecessspecificamount,
lv_inv_stc TYPE zeydigi_oward_h-invoicestatecessspecificamount.

FIELD-SYMBOLS: <lfs_bseg> TYPE lif_data=>ty_bseg,


<lfs_bseg_cust> TYPE lif_data=>ty_bseg,
<lfs_mode> TYPE zeydigi_modepay,
<lfs_bank> TYPE lif_data=>ty_t012,
<lfs_payment> TYPE zeydigi_payterms,
<lfs_tvzbt> TYPE lif_data=>ty_tvzbt,
<lfs_bkpf> TYPE lif_data=>ty_bkpf,
<lfs_bset> TYPE lif_data=>ty_bset,
<lfs_country> TYPE zeydigicountrycd,
<lfs_currc> TYPE zeydigi_currcd,
<lfs_gstn> TYPE lif_data~ty_j_1bbranch,
<lfs_plant> TYPE lif_data=>ty_plant_map,
<lfs_invoice> TYPE lif_data=>ty_invoice,
<lfs_prodh> TYPE lif_data=>ty_t179t,
<lfs_matd_fi> TYPE lif_data=>ty_mara_fi,
<lfs_mcha> TYPE lif_data=>ty_mcha,
<lfs_can> TYPE lif_data=>ty_invoice,
<lfs_unit> TYPE lif_data=>ty_zgstnunit,
<lfs_vbak> TYPE lif_data=>ty_vbak,
<lfs_tvak> TYPE lif_data=>ty_tvak,
<lfs_gst_doc> TYPE zeydigi_docmap,
<lfs_hsn> TYPE lif_data=>ty_marc,
<lfs_adrc> TYPE lif_data=>ty_adrc,
<lfs_stcode> TYPE zeydigi_statecd,
<lfs_cust> TYPE zeydigi_customer,
<lfs_vbpa> TYPE lif_data=>ty_vbpa,
<lfs_rcpt> TYPE lif_data=>ty_rcpt_fi,
<lfs_vttk> TYPE lif_data=>ty_vttk,
<lfs_tax_code> TYPE lif_data=>ty_prcd_elements,
<lfs_tax> TYPE lif_data=>ty_prcd_elements,
<lfs_rcpt_fi> TYPE lif_data=>ty_rcpt_fi.

lr_supply = VALUE #( sign = lc_include option = lc_equals ( low = 'EXT' )


( low = 'SCH3' )
( low = 'NIL' ) ).

*VBRK-->Billing Document: Header Data


*FKART-->Billing Type; FKDAT-->Billing Date for Billing Index and Printout; NETWR--
>Net Value in Document Currency
*ERDAT-->Date on Which Record Was Created; MWSBK-->Tax amount in document currency
IF lt_crdr IS NOT INITIAL.
SELECT vbeln,
fkart,
fkdat,
netwr,
erdat,
mwsbk
FROM vbrk
INTO TABLE @DATA(lt_ordat)
FOR ALL ENTRIES IN @lt_crdr
WHERE vbeln = @lt_crdr-vbeln "VBELN-->Billing Document
ORDER BY PRIMARY KEY.
IF sy-subrc IS NOT INITIAL.
CLEAR lt_ordat[].
ENDIF.
ENDIF.

IF gt_invoice IS NOT INITIAL.


SELECT a~adrnr, a~vkorg, b~region FROM tvko AS a INNER JOIN adrc AS b "#EC
CI_BUFFJOIN
ON a~adrnr = b~addrnumber
FOR ALL ENTRIES IN @gt_invoice
WHERE a~vkorg = @gt_invoice-vkorg
INTO TABLE @DATA(lt_tvko).
ENDIF.

*Fetch Address details


SELECT a~addrnumber, a~name1, a~name2, a~city1, a~city2, a~street,
a~house_num1, a~house_num2, a~house_num3, a~roomnumber,
a~post_code1, a~post_code2, a~post_code3, a~str_suppl1, a~str_suppl2,
a~str_suppl3, a~location, a~building, a~floor,
a~country, a~region, a~tel_number, a~flagcomm6, b~smtp_addr
FROM adrc AS a
LEFT OUTER JOIN adr6 AS b ON a~addrnumber = b~addrnumber
INTO TABLE @DATA(lt_adrc)
FOR ALL ENTRIES IN @gt_gstn
WHERE a~addrnumber EQ @gt_gstn-adrnr. "Addrnumber-->Address Number
IF sy-subrc IS NOT INITIAL.
CLEAR lt_adrc.
ELSE.
SORT lt_adrc BY addrnumber.
ENDIF.

IF gt_bkpf IS NOT INITIAL.


SELECT vbelv, vbeln FROM vbfa INTO TABLE @DATA(lt_vbfa) FOR ALL ENTRIES IN
@gt_bkpf "#EC CI_NOFIRST
WHERE vbeln = @gt_bkpf-awkey+0(10) AND vbtyp_v = 'J'.
ENDIF.

LOOP AT gt_bseg ASSIGNING <lfs_bseg>.


CLEAR ls_item.
AT NEW belnr.
READ TABLE gt_bkpf ASSIGNING <lfs_bkpf> WITH TABLE KEY bukrs = <lfs_bseg>-
bukrs "Company Code
belnr = <lfs_bseg>-
belnr "Accounting Document Number
gjahr = <lfs_bseg>-
gjahr."Fiscal Year
IF sy-subrc IS INITIAL.
ls_header-userid = <lfs_bkpf>-usnam. "USNAM-->User Name
ls_header-companycode = <lfs_bkpf>-bukrs. "BUKRS-->Company Code
ls_header-fiscalyear = <lfs_bseg>-gjahr. "GJAHR-->Fiscal Year
ls_header-accvoucherno = <lfs_bkpf>-belnr. "BELNR-->Accounting Document
Number
ls_header-accvoucherdt = <lfs_bkpf>-bldat. "BLDAT-->Document Date in
Document
ls_header-exchangerate = <lfs_bkpf>-kursf. "KURSF-->Exchange Rate "i
mohan
ls_header-returnperiod = <lfs_bkpf>-budat+4(2) && <lfs_bkpf>-budat+0(4).
"BUDAT-->Posting Date in the Document
ls_header-glpostingdate = <lfs_bkpf>-budat. "BUDAT-->Posting Date in the
Document
ENDIF.
* bank
READ TABLE gt_bseg_customer ASSIGNING <lfs_bseg_cust> WITH KEY bukrs =
<lfs_bseg>-bukrs "Company Code
belnr =
<lfs_bseg>-belnr "Accounting Document Number
gjahr =
<lfs_bseg>-gjahr "Fiscal Year
BINARY
SEARCH.
IF sy-subrc IS INITIAL.
ls_header-paymentinstruction = <lfs_bseg_cust>-zuonr. "ZUONR-->Assignment
Number
ls_header-invoicevaluefc = <lfs_bseg_cust>-wrbtr. "WRBTR-->Amount in
Document Currency
* Transaction type
IF <lfs_bseg_cust>-koart EQ 'D'.
ls_header-transactiontype = lc_out.
ELSEIF <lfs_bseg_cust>-koart EQ 'K'.
ls_header-transactiontype = lc_in.
ENDIF.

READ TABLE gt_bank ASSIGNING <lfs_bank> WITH KEY bukrs = <lfs_bseg>-bukrs


"BUKRS-->Company Code
hbkid = <lfs_bseg_cust>-
hbkid "HBKID-->Short Key for a House Bank
BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-accountdetail = <lfs_bank>-bankn. "BANKN-->Bank Account
Number
ls_header-branchorifsccode = <lfs_bank>-bankl. "BANKL-->Bank Keys
ENDIF.

*Payment Due dt
ls_faede-koart = <lfs_bseg_cust>-koart.
ls_faede-zfbdt = <lfs_bseg_cust>-zfbdt.
ls_faede-zbd3t = <lfs_bseg_cust>-zbd3t.
ls_faede-zbd1t = <lfs_bseg_cust>-zbd1t.
ls_faede-zbd2t = <lfs_bseg_cust>-zbd2t.

CALL FUNCTION 'DETERMINE_DUE_DATE'


EXPORTING
i_faede = ls_faede
i_gl_faede = space
IMPORTING
e_faede = ls_out_faede
EXCEPTIONS
account_type_not_supported = 1
OTHERS = 2.
IF sy-subrc = 0.
ls_header-paymentduedate = ls_out_faede-netdt.
ENDIF.

*credit days logic


CLEAR lv_credit.
CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
EXPORTING
i_date_from = <lfs_bseg_cust>-zfbdt
i_date_to = ls_header-paymentduedate
IMPORTING
e_days = lv_credit.

ls_header-creditdays = lv_credit. "Creditdays-->Credit days

ls_header-modeofpayment = <lfs_bseg_cust>-gstcode. "GSTCODE-->GST code

* round off
READ TABLE gt_bseg_tax ASSIGNING FIELD-SYMBOL(<lfs_bseg_tax>) WITH KEY
bukrs = <lfs_bseg>-bukrs belnr = <lfs_bseg>-belnr

gjahr = <lfs_bseg>-gjahr buzid = 'R' BINARY SEARCH.


IF sy-subrc IS INITIAL.
ls_header-roundoff = <lfs_bseg_tax>-wrbtr.
ENDIF.
ls_header-paymentterms = <lfs_bseg_cust>-vtext.
ELSE.
CONTINUE.
ENDIF.

* payee name
READ TABLE gt_bukrs TRANSPORTING butxt INTO DATA(ls_butxt) WITH KEY bukrs =
<lfs_bseg>-bukrs.
IF sy-subrc = 0.
ls_header-payeename = ls_butxt-butxt.
ENDIF.

*Supplier Address Details


READ TABLE gt_bkpf INTO DATA(ls_bk) WITH KEY bukrs = <lfs_bseg>-bukrs belnr
= <lfs_bseg>-belnr gjahr = <lfs_bseg>-gjahr BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE gt_gstn INTO DATA(ls_gst) WITH KEY bukrs = ls_bk-bukrs branch
= <lfs_bseg>-bupla.
IF sy-subrc = 0.
ls_header-suppliergstin = ls_gst-gstin.
READ TABLE lt_adrc ASSIGNING FIELD-SYMBOL(<lfs_adrc2>) WITH KEY
addrnumber = ls_gst-adrnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-suppliertradename = <lfs_adrc2>-name2.
ls_header-supplierlegalname = <lfs_adrc2>-name1.
ls_header-supplierlocation = <lfs_adrc2>-city1.
ls_header-supplierpincode = <lfs_adrc2>-post_code1.
DATA(lv_supp_reg) = <lfs_adrc2>-post_code1.
ls_header-supplierphone = <lfs_adrc2>-tel_number.
ls_header-supplieremail = <lfs_adrc2>-smtp_addr.

DATA(lv_supplier) = <lfs_adrc2>-building && <lfs_adrc2>-roomnumber


&& <lfs_adrc2>-floor && <lfs_adrc2>-street &&
<lfs_adrc2>-house_num1 && <lfs_adrc2>-house_num2
&& <lfs_adrc2>-house_num3 &&
<lfs_adrc2>-str_suppl1 && <lfs_adrc2>-str_suppl2
&& <lfs_adrc2>-str_suppl3 &&
<lfs_adrc2>-post_code1 && <lfs_adrc2>-post_code2
&& <lfs_adrc2>-post_code3.

DATA(lv_supp_len) = strlen( lv_supplier ).


IF lv_supp_len GT 80.
ls_header-supplieraddress1 = <lfs_adrc2>-building && <lfs_adrc2>-
roomnumber && <lfs_adrc2>-floor && <lfs_adrc2>-street &&
<lfs_adrc2>-house_num1 && <lfs_adrc>-
house_num2 && <lfs_adrc2>-house_num3.

ls_header-supplieraddress2 = <lfs_adrc2>-str_suppl1 && <lfs_adrc2>-


str_suppl2 && <lfs_adrc2>-str_suppl3 &&
<lfs_adrc2>-post_code1 && <lfs_adrc2>-
post_code2 && <lfs_adrc2>-post_code3.

IF ls_header-supplieraddress1 IS INITIAL.
ls_header-supplieraddress1 = ls_header-supplieraddress2.
CLEAR ls_header-supplieraddress2.
ENDIF.
ELSE.
ls_header-supplieraddress1 = <lfs_adrc2>-building && <lfs_adrc2>-
roomnumber && <lfs_adrc2>-floor && <lfs_adrc2>-street &&
<lfs_adrc2>-house_num1 && <lfs_adrc2>-
house_num2 && <lfs_adrc2>-house_num3 &&
<lfs_adrc2>-str_suppl1 && <lfs_adrc2>-
str_suppl2 && <lfs_adrc2>-str_suppl3 &&
<lfs_adrc2>-post_code1 && <lfs_adrc2>-
post_code2 && <lfs_adrc2>-post_code3.
ENDIF.

READ TABLE gt_statecode ASSIGNING FIELD-SYMBOL(<lfs_stcode2>) WITH


KEY regio = <lfs_adrc2>-region BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_adrc2>-country EQ lc_country.
ls_header-supplierstatecode = <lfs_stcode2>-gstcode.
ELSE.
ls_header-supplierstatecode = '96'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

* Taxscheme
ls_header-taxscheme = 'GST'.

* dispatcher details
READ TABLE gt_plant ASSIGNING <lfs_plant> WITH KEY werks = <lfs_bseg>-werks
BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_gstn ASSIGNING <lfs_gstn> WITH TABLE KEY bukrs = pa_bukrs
branch = <lfs_plant>-j_1bbranch.
IF sy-subrc IS INITIAL.
ls_header-dispatchergstin = <lfs_gstn>-gstin.
ENDIF.
READ TABLE gt_customer_of_plnt ASSIGNING FIELD-SYMBOL(<fs_cus_of_plant>)
WITH KEY kunnr = <lfs_plant>-kunnr BINARY SEARCH.
IF sy-subrc = 0.
ls_header-dispatchertradename = <fs_cus_of_plant>-name1.

READ TABLE gt_adrc ASSIGNING <lfs_adrc> WITH KEY addrnumber =


<lfs_plant>-adrnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
DATA(lv_dis_add) = <lfs_adrc>-region.
lv_plant_ctry = <lfs_adrc>-country.
ls_header-dispatchertradename = <lfs_adrc>-name1 && <lfs_adrc>-name2.

IF <lfs_adrc>-city1 IS NOT INITIAL.


ls_header-dispatcherlocation = <lfs_adrc>-city1.
ELSEIF <lfs_adrc>-city2 IS NOT INITIAL.
ls_header-dispatcherlocation = <lfs_adrc>-city2.
ELSEIF <lfs_adrc>-str_suppl2 IS NOT INITIAL.
ls_header-dispatcherlocation = <lfs_adrc>-str_suppl2.
ELSEIF <lfs_adrc>-str_suppl3 IS NOT INITIAL.
ls_header-dispatcherlocation = <lfs_adrc>-str_suppl3.
ENDIF.

ls_header-dispatcherpincode = <lfs_adrc>-post_code1.

DATA(lv_dispatch) = <lfs_adrc>-building && <lfs_adrc>-floor &&


<lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-house_num3 &&
<lfs_adrc>-str_suppl1 && <lfs_adrc>-str_suppl2 &&
<lfs_adrc>-str_suppl3 && <lfs_adrc>-post_code1 &&
<lfs_adrc>-post_code2 && <lfs_adrc>-post_code3.

DATA(lv_dis_len) = strlen( lv_dispatch ).


IF lv_dis_len GT 80.
ls_header-dispatcheraddress1 = <lfs_adrc>-building && <lfs_adrc>-
floor && <lfs_adrc>-street &&
<lfs_adrc>-house_num1 && <lfs_adrc>-
house_num2 && <lfs_adrc>-house_num3.

ls_header-dispatcheraddress2 = <lfs_adrc>-str_suppl1 && <lfs_adrc>-


str_suppl2 && <lfs_adrc>-str_suppl3 &&
<lfs_adrc>-post_code1 && <lfs_adrc>-
post_code2 && <lfs_adrc>-post_code3.

IF ls_header-dispatcheraddress1 IS INITIAL.
ls_header-dispatcheraddress1 = ls_header-dispatcheraddress2.
CLEAR ls_header-dispatcheraddress2.
ENDIF.
ELSE.
ls_header-dispatcheraddress1 = <lfs_adrc>-building && <lfs_adrc>-
floor && <lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-
house_num3 && <lfs_adrc>-str_suppl1 && <lfs_adrc>-str_suppl2 &&
<lfs_adrc>-str_suppl3 && <lfs_adrc>-
post_code1 && <lfs_adrc>-post_code2 && <lfs_adrc>-post_code3.
ENDIF.

lv_plant_ctry = <lfs_adrc>-country.
READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =
<lfs_adrc>-region BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_adrc>-country EQ lc_country.
ls_header-dispatcherstatecode = <lfs_stcode>-gstcode.
ELSEIF ls_header-dispatcherstatecode IS INITIAL .
<lfs_adrc>-region = |{ <lfs_adrc>-region ALPHA = OUT }|.
READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =
<lfs_adrc>-region BINARY SEARCH.
IF sy-subrc = 0.
ls_header-dispatcherstatecode = <lfs_stcode>-gstcode.
ENDIF.
ELSE.
ls_header-dispatcherstatecode = '96'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

READ TABLE gt_bseg_customer ASSIGNING <lfs_bseg_cust> WITH KEY bukrs =


<lfs_bseg>-bukrs belnr = <lfs_bseg>-belnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-invoicevalue = <lfs_bseg_cust>-wrbtr.
ENDIF.
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
IF <lfs_bkpf>-awtyp EQ lc_vbrk.
* invoice details
READ TABLE gt_invoice ASSIGNING <lfs_invoice> WITH KEY vbeln =
<lfs_bkpf>-awkey+0(10) BINARY SEARCH.
IF sy-subrc IS INITIAL.
DATA(lv_fkart) = <lfs_invoice>-fkart.
ls_header-documentnumber = <lfs_invoice>-vbeln.
ls_header-sourceidentifier = syst-sysid.
ls_header-salesorganisation = <lfs_invoice>-vkorg.
ls_header-distributionchannel = <lfs_invoice>-vtweg.
ls_header-division = <lfs_invoice>-spart.
ls_header-documentdate = <lfs_invoice>-fkdat.
ls_header-invoiceperiodstartdate = <lfs_invoice>-bedat.
ls_header-invoiceperiodenddate = <lfs_invoice>-endat.

* Document type
READ TABLE gt_doc_typ ASSIGNING <lfs_gst_doc> WITH KEY fkart =
<lfs_invoice>-fkart BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-documenttype = <lfs_gst_doc>-doc_type_gst.
ENDIF.

* recipient details
READ TABLE gt_vbpa ASSIGNING <lfs_vbpa> WITH KEY vbeln =
<lfs_invoice>-vbeln parvw = lc_we BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_rcpt_fi ASSIGNING <lfs_rcpt> WITH KEY kunnr =
<lfs_vbpa>-kunnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-shiptogstin = <lfs_rcpt>-stcd3.
lv_ship_to = <lfs_rcpt>-kunnr.
lv_shipto_ctry = <lfs_rcpt>-land1.

READ TABLE gt_adrc ASSIGNING <lfs_adrc> WITH KEY addrnumber =


<lfs_rcpt>-adrnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
lv_shipto = <lfs_adrc>-region.
ls_header-shiptolegalname = <lfs_adrc>-name1 && <lfs_adrc>-name2.
ls_header-shiptopincode = <lfs_adrc>-post_code1.

IF <lfs_adrc>-city1 IS NOT INITIAL.


ls_header-shiptolocation = <lfs_adrc>-city1.
ELSEIF <lfs_adrc>-city2 IS NOT INITIAL.
ls_header-shiptolocation = <lfs_adrc>-city2.
ELSEIF <lfs_adrc>-str_suppl2 IS NOT INITIAL.
ls_header-shiptolocation = <lfs_adrc>-str_suppl2.
ELSEIF <lfs_adrc>-str_suppl3 IS NOT INITIAL.
ls_header-shiptolocation = <lfs_adrc>-str_suppl3.
ENDIF.
DATA(lv_ship) = <lfs_adrc>-building && <lfs_adrc>-floor &&
<lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-house_num3 &&
<lfs_adrc>-str_suppl1 && <lfs_adrc>-str_suppl2 &&
<lfs_adrc>-str_suppl3 && <lfs_adrc>-post_code1 &&
<lfs_adrc>-post_code2 && <lfs_adrc>-post_code3.

DATA(lv_ship_len) = strlen( lv_ship ).


IF lv_ship_len GT 80.
ls_header-shiptoaddress1 = <lfs_adrc>-building && <lfs_adrc>-
floor && <lfs_adrc>-street &&
<lfs_adrc>-house_num1 && <lfs_adrc>-
house_num2 && <lfs_adrc>-house_num3.

ls_header-shiptoaddress2 = <lfs_adrc>-str_suppl1 && <lfs_adrc>-


str_suppl2 && <lfs_adrc>-str_suppl3 &&
<lfs_adrc>-post_code1 && <lfs_adrc>-
post_code2 && <lfs_adrc>-post_code3.

IF ls_header-shiptoaddress1 IS INITIAL.
ls_header-shiptoaddress1 = ls_header-shiptoaddress2.
CLEAR ls_header-shiptoaddress2.
ENDIF.
ELSE.
ls_header-shiptoaddress1 = <lfs_adrc>-building && <lfs_adrc>-
floor && <lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-
house_num3 && <lfs_adrc>-str_suppl1 && <lfs_adrc>-str_suppl2 && <lfs_adrc>-
str_suppl3 &&
<lfs_adrc>-post_code1 && <lfs_adrc>-
post_code2 && <lfs_adrc>-post_code3.
ENDIF.

READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =


<lfs_adrc>-region BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_rcpt>-land1 EQ lc_country.
ls_header-shiptostatecode = <lfs_stcode>-gstcode.
ELSE.
ls_header-shiptostatecode = '96'.
ENDIF.
ENDIF.

READ TABLE gt_vbpa ASSIGNING FIELD-SYMBOL(<lfs_vbpa1>) WITH KEY


vbeln = <lfs_invoice>-vbeln parvw = lc_re BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_rcpt_fi ASSIGNING FIELD-SYMBOL(<lfs_rcpt1>) WITH
KEY kunnr = <lfs_vbpa1>-kunnr BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE gt_adrc ASSIGNING FIELD-SYMBOL(<lfs_adrc1>) WITH KEY
addrnumber = <lfs_rcpt1>-adrnr BINARY SEARCH.
IF sy-subrc = 0.
DATA(lv_bill) = <lfs_adrc1>-region.
ENDIF.
ENDIF.
ENDIF.
* Pos
READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =
lv_bill BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-billingpos = <lfs_stcode>-gstcode.
ENDIF.
ENDIF.
ENDIF.

READ TABLE lt_vbfa INTO DATA(ls_vbfa) WITH KEY vbeln = <lfs_bkpf>-


awkey+0(10).
IF sy-subrc = 0.
READ TABLE gt_eway INTO DATA(ls_detail) WITH KEY vbeln = ls_vbfa-
vbelv.
IF sy-subrc = 0.
ls_header-transportername = ls_detail-name1.
ls_header-transporterid = ls_detail-stcd3.
ENDIF.
ENDIF.

* Customer details
READ TABLE gt_vbpa ASSIGNING <lfs_vbpa> WITH KEY vbeln = <lfs_invoice>-
vbeln parvw = lc_ag BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_rcpt_fi ASSIGNING <lfs_rcpt> WITH KEY kunnr =
<lfs_vbpa>-kunnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-customergstin = <lfs_rcpt>-stcd3.
ls_header-customercode = <lfs_rcpt>-kunnr.
ls_header-customerlegalname = <lfs_rcpt>-name1 && <lfs_rcpt>-
name2.
ls_header-customertradename = ls_header-customerlegalname.
ls_header-customerpanoraadhaar = ls_header-customergstin+2(10).

READ TABLE gt_adrc ASSIGNING <lfs_adrc> WITH KEY addrnumber =


<lfs_rcpt>-adrnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
IF <lfs_adrc>-city1 IS NOT INITIAL.
ls_header-customerlocation = <lfs_adrc>-city1.
ELSEIF <lfs_adrc>-city2 IS NOT INITIAL.
ls_header-customerlocation = <lfs_adrc>-city2.
ELSEIF <lfs_adrc>-str_suppl2 IS NOT INITIAL.
ls_header-customerlocation = <lfs_adrc>-str_suppl2.
ELSEIF <lfs_adrc>-str_suppl3 IS NOT INITIAL.
ls_header-customerlocation = <lfs_adrc>-str_suppl3.
ENDIF.

ls_header-customerpincode = <lfs_adrc>-post_code1.
ls_header-customerphone = <lfs_adrc>-tel_number.
ls_header-customeremail = <lfs_adrc>-smtp_addr.

DATA(lv_cust) = <lfs_adrc>-building && <lfs_adrc>-floor &&


<lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-house_num3 &&
<lfs_adrc>-str_suppl1 && <lfs_adrc>-str_suppl2 &&
<lfs_adrc>-str_suppl3 && <lfs_adrc>-post_code1 &&
<lfs_adrc>-post_code2 && <lfs_adrc>-post_code3.

CONDENSE lv_cust.
DATA(lv_cus_len) = strlen( lv_cust ).
IF lv_cus_len GT 80.
ls_header-customeraddress1 = <lfs_adrc>-building &&
<lfs_adrc>-floor && <lfs_adrc>-street &&
<lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-house_num3.

ls_header-customeraddress2 = <lfs_adrc>-str_suppl1 &&


<lfs_adrc>-str_suppl2 && <lfs_adrc>-str_suppl3 &&
<lfs_adrc>-post_code1 &&
<lfs_adrc>-post_code2 && <lfs_adrc>-post_code3.

IF ls_header-customeraddress1 IS INITIAL.
ls_header-customeraddress1 = ls_header-customeraddress2.
CLEAR ls_header-customeraddress2.
ENDIF.
ELSE.
ls_header-customeraddress1 = <lfs_adrc>-building &&
<lfs_adrc>-floor && <lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 &&
<lfs_adrc>-house_num3 && <lfs_adrc>-str_suppl1 && <lfs_adrc>-str_suppl2 &&
<lfs_adrc>-str_suppl3 &&
<lfs_adrc>-post_code1 && <lfs_adrc>-post_code2 && <lfs_adrc>-post_code3.
ENDIF.

READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =


<lfs_adrc>-region BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_rcpt>-land1 EQ lc_country.
ls_header-customerstatecode = <lfs_stcode>-gstcode.
ELSE.
ls_header-customerstatecode = '96'.
ENDIF.
ls_header-billingpos = ls_header-customerstatecode.
ENDIF.

* Recipient type and reverse charge


READ TABLE gt_customer ASSIGNING <lfs_cust> WITH TABLE KEY customer
= <lfs_rcpt>-kunnr.
IF sy-subrc IS NOT INITIAL.
ls_header-revchargeflag = lc_no.
ls_header-claimrefundflag = lc_no.
ls_header-autopoprefund = lc_no.
ELSE.
ls_header-revchargeflag = SWITCH #( <lfs_cust>-reverse_charge
WHEN lc_x THEN lc_yes
ELSE lc_no ).
ls_header-claimrefundflag = SWITCH #( <lfs_cust>-claim_refund
WHEN lc_x THEN lc_yes
ELSE lc_no ).
ls_header-autopoprefund = SWITCH #( <lfs_cust>-auto_populate
WHEN lc_x THEN lc_yes
ELSE lc_no ).
lv_sec7_flag = <lfs_cust>-eligible_sec7.
ENDIF.
ENDIF.

*Section 7
ls_header-sec7igstflag = lc_no.
READ TABLE gt_plant ASSIGNING <lfs_plant> WITH KEY werks =
<lfs_invoice>-werks BINARY SEARCH.
IF sy-subrc IS INITIAL AND lv_sec7_flag EQ abap_true
AND ( <lfs_plant>-land1 EQ lc_country ) AND ( lv_shipto EQ
<lfs_plant>-regio ). " ls_header-shiptostate
READ TABLE gt_tax ASSIGNING FIELD-SYMBOL(<lfs_tax_cd>) WITH KEY
knumv = <lfs_invoice>-knumv

kposn = <lfs_invoice>-posnr

kappl = lc_kappl BINARY SEARCH.


IF sy-subrc IS INITIAL.
READ TABLE gt_cond_typ ASSIGNING FIELD-SYMBOL(<lfs_type>) WITH
KEY kschl = <lfs_tax_cd>-kschl BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_type>-gst_type EQ lc_igst.
ls_header-sec7igstflag = lc_yes.
ENDIF.
ENDIF.
ENDIF.

* State applying cess


IF ls_header-shiptostatecode EQ '32' AND <lfs_plant> IS ASSIGNED AND
<lfs_plant>-regio EQ '11'.
ls_header-stateapplyingcess = ls_header-shiptostatecode.
ELSE.
ls_header-stateapplyingcess = space.
ENDIF.
ENDIF.

* bill to state
READ TABLE gt_vbpa ASSIGNING <lfs_vbpa> WITH KEY vbeln =
<lfs_invoice>-vbeln parvw = lc_re BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_rcpt_fi ASSIGNING <lfs_rcpt> WITH KEY kunnr =
<lfs_vbpa>-kunnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
lv_bill_to = <lfs_rcpt>-kunnr.
ENDIF.
ENDIF.

* sales order number


ls_header-salesordernumber = <lfs_invoice>-aubel.

READ TABLE gt_eway INTO DATA(ls_eway) WITH KEY vbeln = <lfs_invoice>-


vgbel.
IF sy-subrc = 0.
DATA(lv_mode) = ls_eway-vsart.
ls_header-transportdocno = ls_eway-bolnr.
ENDIF.
* PO
READ TABLE gt_vbak ASSIGNING FIELD-SYMBOL(<lfs_vba>) WITH KEY vbeln =
<lfs_invoice>-aubel BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-customerporeferencenumber = <lfs_vba>-bstkd.
ls_item-customerporeferencedate = <lfs_vba>-bstdk.
IF lv_mode IS INITIAL.
lv_mode = <lfs_vba>-vsart.
ENDIF.
ENDIF.

IF lv_mode IS NOT INITIAL.


CASE lv_mode.
WHEN '01'.
ls_header-transportmode = 'ROAD'.
WHEN '02'.
ls_header-transportmode = 'AIR'.
WHEN '03'.
ls_header-transportmode = 'RAIL'.
WHEN '04'.
ls_header-transportmode = 'SHIP'.
WHEN '05'.
ls_header-transportmode = 'GOODS IN TRANSIT'.
ENDCASE.
ENDIF.

READ TABLE gt_vbak TRANSPORTING NO FIELDS WITH KEY vbeln =


<lfs_invoice>-aubel auart = 'ZEXB'.
IF sy-subrc = 0.
ls_header-subsupplytype = 'EXB'.
ENDIF.

* CR/DR scenario
READ TABLE gt_vbak ASSIGNING <lfs_vbak> WITH KEY vbeln = <lfs_invoice>-
aubel BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE lt_ordat ASSIGNING FIELD-SYMBOL(<lfs_ordat>) WITH KEY
vbeln = <lfs_vbak>-zuonr+0(10) BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-documentreferencenumber = <lfs_bkpf>-xblnr.
ls_item-preceedinginvoiceno = <lfs_vbak>-zuonr+0(10).
ls_item-preceedinginvoicedt = <lfs_ordat>-fkdat.
* pre-GST
IF <lfs_ordat>-fkdat IS INITIAL.
ls_header-crdrpregst = lc_no.
ELSE.
ls_header-crdrpregst = COND #( WHEN <lfs_ordat>-fkdat LT lv_date
THEN lc_yes
ELSE lc_no ).
ENDIF.
ENDIF.
ENDIF.

IF ls_item-documentreferencenumber IS INITIAL.
READ TABLE gt_bkpf INTO DATA(ls_bkpf) WITH KEY bukrs = <lfs_invoice>-
bukrs belnr = <lfs_invoice>-vbeln BINARY SEARCH.
IF sy-subrc = 0.
ls_item-documentreferencenumber = ls_bkpf-xblnr.
ENDIF.
ENDIF.

IF <lfs_invoice>-sfakn IS NOT INITIAL.


READ TABLE gt_invoice ASSIGNING <lfs_can> WITH KEY vbeln =
<lfs_invoice>-sfakn BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-documentreferencenumber = <lfs_bkpf>-xblnr.
ls_item-preceedinginvoiceno = <lfs_invoice>-sfakn.
ls_item-preceedinginvoicedt = <lfs_can>-fkdat.
ENDIF.
ENDIF.

* eway bill
READ TABLE gt_eway ASSIGNING FIELD-SYMBOL(<lfs_eway>) WITH TABLE KEY
vbeln = <lfs_invoice>-vgbel.
IF sy-subrc IS INITIAL.
ls_header-transportdocno = <lfs_eway>-bolnr.
ENDIF.

lv_object_name = <lfs_invoice>-vgbel.

IF lv_object_name IS NOT INITIAL.


* Vehical type
lcl_helper=>m_read_text(
EXPORTING
id = 'ZVET'
name = lv_object_name
object = 'VBBK'
IMPORTING
ex_data = lv_string ).

ls_header-vehicletype = lv_string.

CLEAR lv_string.
* Vehical num
lcl_helper=>m_read_text(
EXPORTING
id = 'ZVEN'
name = lv_object_name
object = 'VBBK'
IMPORTING
ex_data = lv_string ).

ls_header-vehicleno = lv_string.

CLEAR lv_string.
*Distance
lcl_helper=>m_read_text(
EXPORTING
id = 'ZDIS'
name = lv_object_name
object = 'VBBK'
IMPORTING
ex_data = lv_string ).

ls_header-distance = lv_string.

CLEAR lv_string.
* Transport date
lcl_helper=>m_read_text(
EXPORTING
id = 'ZTRN'
name = lv_object_name
object = 'VBBK'
IMPORTING
ex_data = lv_string ).

DATA: lv_date1 TYPE dats.

CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'


EXPORTING
date_external = lv_string
IMPORTING
date_internal = lv_date1
EXCEPTIONS
date_external_is_invalid = 1
OTHERS = 2.
IF sy-subrc = 0.
ls_header-transportdocdate = lv_date1.
ENDIF.
CLEAR lv_string.
ENDIF.

* distance
IF ls_header-distance IS INITIAL.
READ TABLE gt_vttk ASSIGNING <lfs_vttk> WITH KEY vbeln =
<lfs_invoice>-vgbel BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-distance = <lfs_vttk>-distz.
ELSE.
READ TABLE gt_eway INTO DATA(ls_route) WITH KEY vbeln =
<lfs_invoice>-vgbel.
IF sy-subrc = 0.
ls_header-distance = ls_route-distz.
ENDIF.
ENDIF.
ENDIF.
** Cancellation scenario
IF <lfs_invoice>-sfakn IS NOT INITIAL.
READ TABLE gt_invoice ASSIGNING <lfs_can> WITH KEY vbeln =
<lfs_invoice>-sfakn BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_doc_typ ASSIGNING <lfs_gst_doc> WITH KEY fkart =
<lfs_can>-fkart BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-documenttype = <lfs_gst_doc>-doc_type_gst.
ENDIF.
ENDIF.
ENDIF.
* TCS flag
ls_header-tcsflaggst = lc_no.
ls_header-ecomtransactionid = lc_no.
READ TABLE gt_vbpa ASSIGNING <lfs_vbpa> WITH KEY vbeln =
<lfs_invoice>-vbeln parvw = lc_rg BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_rcpt_fi ASSIGNING <lfs_rcpt> WITH KEY kunnr =
<lfs_vbpa>-kunnr BINARY SEARCH.
IF sy-subrc IS INITIAL AND lv_bill_to NE <lfs_rcpt>-kunnr.

ls_header-ecomgstin = <lfs_rcpt>-stcd1.
ls_header-ecomtransactionid = lc_yes.

READ TABLE gt_tax ASSIGNING <lfs_tax_code> WITH KEY knumv =


<lfs_invoice>-knumv BINARY SEARCH.
IF sy-subrc IS INITIAL.
lv_index = sy-tabix.
LOOP AT gt_tax ASSIGNING <lfs_tax_cd> FROM lv_index.
IF <lfs_tax_code>-knumv NE <lfs_tax_cd>-knumv.
EXIT.
ENDIF.
READ TABLE gt_cond_typ ASSIGNING <lfs_type> WITH KEY kschl =
<lfs_tax_cd>-kschl BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_type>-gst_type EQ lc_jtcs.
ls_header-tcsflaggst = lc_yes.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

ELSE.
*Direct FI Posting
ls_header-documentnumber = <lfs_bkpf>-belnr.
ls_header-documentdate = <lfs_bkpf>-budat.
* Document type
READ TABLE gt_doc_typ ASSIGNING <lfs_gst_doc> WITH KEY blart =
<lfs_bkpf>-blart.
IF sy-subrc IS INITIAL.
ls_header-documenttype = <lfs_gst_doc>-doc_type_gst.
ENDIF.
* Recipient type and reverse charge
READ TABLE gt_bseg_customer ASSIGNING <lfs_bseg_cust> WITH KEY bukrs =
<lfs_bseg>-bukrs belnr = <lfs_bseg>-belnr
gjahr =
<lfs_bseg>-gjahr BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_customer ASSIGNING <lfs_cust> WITH TABLE KEY customer =
<lfs_bseg_cust>-kunnr.
IF sy-subrc IS NOT INITIAL.
ls_header-revchargeflag = lc_no.
ls_header-claimrefundflag = lc_no.
ls_header-autopoprefund = lc_no.
ELSE.
ls_cust_bseg = <lfs_cust>.
ls_header-revchargeflag = SWITCH #( <lfs_cust>-reverse_charge
WHEN lc_x THEN lc_yes
ELSE lc_no ).
ls_header-claimrefundflag = SWITCH #( <lfs_cust>-claim_refund
WHEN lc_x THEN lc_yes
ELSE lc_no ).
ls_header-autopoprefund = SWITCH #( <lfs_cust>-auto_populate
WHEN lc_x THEN lc_yes
ELSE lc_no ).
lv_sec7_flag = <lfs_cust>-eligible_sec7.
ENDIF.

* customer and ship to details


ls_header-customercode = <lfs_bseg_cust>-kunnr.
READ TABLE gt_rcpt_fi ASSIGNING <lfs_rcpt_fi> WITH KEY kunnr =
<lfs_bseg_cust>-kunnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
lv_bseg_land1 = <lfs_rcpt_fi>-land1.
lv_shipto_ctry = <lfs_rcpt_fi>-land1.
ls_header-shiptogstin = <lfs_rcpt_fi>-stcd3.
ls_header-shiptotradename = <lfs_rcpt_fi>-name1 && <lfs_rcpt_fi>-
name2.

READ TABLE gt_adrc ASSIGNING <lfs_adrc> WITH KEY addrnumber =


<lfs_rcpt_fi>-adrnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
lv_shipto = <lfs_adrc>-region.
ls_header-shiptopincode = <lfs_adrc>-post_code1.
ls_header-shiptolegalname = <lfs_adrc>-name1 && <lfs_adrc>-name2.

IF <lfs_adrc>-city1 IS NOT INITIAL.


ls_header-shiptolocation = <lfs_adrc>-city1.
ELSEIF <lfs_adrc>-city2 IS NOT INITIAL.
ls_header-shiptolocation = <lfs_adrc>-city2.
ELSEIF <lfs_adrc>-str_suppl2 IS NOT INITIAL.
ls_header-shiptolocation = <lfs_adrc>-str_suppl2.
ELSEIF <lfs_adrc>-str_suppl3 IS NOT INITIAL.
ls_header-shiptolocation = <lfs_adrc>-str_suppl3.
ENDIF.

lv_ship = <lfs_adrc>-building && <lfs_adrc>-floor &&


<lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-house_num3 &&
<lfs_adrc>-str_suppl1 && <lfs_adrc>-str_suppl2 &&
<lfs_adrc>-str_suppl3 && <lfs_adrc>-post_code1 &&
<lfs_adrc>-post_code2 && <lfs_adrc>-post_code3.

lv_ship_len = strlen( lv_ship ).

IF lv_ship_len GT 80.
ls_header-shiptoaddress1 = <lfs_adrc>-building && <lfs_adrc>-
floor && <lfs_adrc>-street &&
<lfs_adrc>-house_num1 && <lfs_adrc>-
house_num2 && <lfs_adrc>-house_num3.

ls_header-shiptoaddress2 = <lfs_adrc>-str_suppl1 && <lfs_adrc>-


str_suppl2 && <lfs_adrc>-str_suppl3 &&
<lfs_adrc>-post_code1 && <lfs_adrc>-
post_code2 && <lfs_adrc>-post_code3.

IF ls_header-shiptoaddress1 IS INITIAL.
ls_header-shiptoaddress1 = ls_header-shiptoaddress2.
CLEAR ls_header-shiptoaddress2.
ENDIF.
ELSE.
ls_header-shiptoaddress1 = <lfs_adrc>-building && <lfs_adrc>-
floor && <lfs_adrc>-street && <lfs_adrc>-house_num1 &&
<lfs_adrc>-house_num2 && <lfs_adrc>-
str_suppl1 && <lfs_adrc>-str_suppl2 && <lfs_adrc>-str_suppl3 &&
<lfs_adrc>-post_code1 && <lfs_adrc>-
post_code2 && <lfs_adrc>-post_code3.
ENDIF.

READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =


<lfs_adrc>-region BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_rcpt_fi>-land1 EQ lc_country.
ls_header-shiptostatecode = <lfs_stcode>-gstcode.
ELSEIF ls_header-shiptostatecode IS INITIAL.
<lfs_adrc>-region = |{ <lfs_adrc>-region ALPHA = OUT }|.
READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =
<lfs_adrc>-region BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_rcpt_fi>-land1 EQ lc_country.
ls_header-shiptostatecode = <lfs_stcode>-gstcode.
ENDIF.
ELSE.
ls_header-shiptostatecode = '96'.
ENDIF.

ls_header-customerlegalname = ls_header-shiptolegalname.
ls_header-customertradename = ls_header-shiptotradename.
IF ls_header-customertradename IS INITIAL.
ls_header-customertradename = ls_header-customerlegalname.
ENDIF.
ls_header-customeraddress1 = ls_header-shiptoaddress1.
ls_header-customeraddress2 = ls_header-shiptoaddress2.
ls_header-customergstin = ls_header-shiptogstin.
ls_header-customerlocation = ls_header-shiptolocation.
ls_header-customerpincode = ls_header-shiptopincode.
ls_header-customerstatecode = ls_header-shiptostatecode.
ENDIF.
ENDIF.

IF <lfs_bseg>-werks IS INITIAL.
ls_header-dispatchergstin = ls_header-suppliergstin.
ls_header-dispatcheraddress1 = ls_header-supplieraddress1.
ls_header-dispatcheraddress2 = ls_header-supplieraddress2.
ls_header-dispatcherlocation = ls_header-supplierlocation.
ls_header-dispatcherpincode = ls_header-supplierpincode.
ls_header-dispatcherstatecode = ls_header-supplierstatecode.
ls_header-dispatchertradename = ls_header-suppliertradename.
ENDIF.

* Section 7
ls_header-sec7igstflag = lc_no.
READ TABLE gt_plant ASSIGNING <lfs_plant> WITH KEY werks = <lfs_bseg>-
werks BINARY SEARCH.
IF sy-subrc IS INITIAL AND lv_sec7_flag EQ abap_true AND ( <lfs_plant>-
land1 EQ lc_country )
AND ( lv_shipto EQ <lfs_plant>-regio ).
READ TABLE gt_bset ASSIGNING <lfs_bset> WITH KEY bukrs = <lfs_bseg>-
bukrs belnr = <lfs_bseg>-belnr
gjahr = <lfs_bseg>-
gjahr BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_cond_typ ASSIGNING <lfs_type> WITH KEY kschl =
<lfs_bset>-kschl BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_type>-gst_type EQ lc_igst.
ls_header-sec7igstflag = lc_yes.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

* State applying cess


IF ls_header-shiptostatecode EQ '32' AND <lfs_plant> IS ASSIGNED AND
<lfs_plant>-regio EQ '11'.
ls_header-stateapplyingcess = ls_header-shiptostatecode.
ELSE.
ls_header-stateapplyingcess = space.
ENDIF.

READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =


<lfs_bseg_cust>-plc_sup BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-billingpos = <lfs_stcode>-gstcode.
ELSEIF ls_header-billingpos IS INITIAL.
<lfs_bseg_cust>-plc_sup = |{ <lfs_bseg_cust>-plc_sup ALPHA = OUT }|.
READ TABLE gt_statecode ASSIGNING <lfs_stcode> WITH KEY regio =
<lfs_bseg_cust>-plc_sup BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-billingpos = <lfs_stcode>-gstcode.
ENDIF.
ENDIF.

* pre-GST
IF <lfs_bkpf>-xblnr IS NOT INITIAL.
READ TABLE gt_bkpf_ori ASSIGNING FIELD-SYMBOL(<lfs_bkpf_ori>) WITH KEY
bukrs = pa_bukrs belnr = <lfs_bkpf>-xblnr+0(10)
BINARY
SEARCH.
IF sy-subrc IS INITIAL.
IF <lfs_bkpf_ori>-bldat IS INITIAL.
ls_header-crdrpregst = lc_no.
ELSE.
ls_header-crdrpregst = COND #( WHEN <lfs_bkpf_ori>-bldat LT lv_date
THEN lc_yes
ELSE lc_no ).
ENDIF.
ENDIF.
ENDIF.
ls_header-tcsflaggst = lc_no.
ls_header-ecomtransactionid = lc_no.
ENDAT.

* Item details.
ls_item-productcode = <lfs_bseg>-matnr.
ls_item-plantcode = <lfs_bseg>-werks.
ls_header-profitcentre1 = <lfs_bseg>-prctr.

IF <lfs_bseg>-koart EQ 'S' AND <lfs_bseg>-buzid EQ ' '.


ls_item-glassessablevalue = <lfs_bseg>-hkont.
ENDIF.

IF <lfs_bseg>-ktosl EQ 'JOI'.
ls_header-gligst = <lfs_bseg>-hkont.
ELSEIF <lfs_bseg>-ktosl EQ 'JOC'.
ls_header-glcgst = <lfs_bseg>-hkont.
ELSEIF <lfs_bseg>-ktosl EQ 'JOS'.
ls_header-glsgst = <lfs_bseg>-hkont.
ELSEIF <lfs_bseg>-ktosl EQ 'JCA'.
ls_header-gladvaloremcess = <lfs_bseg>-hkont.
ELSEIF <lfs_bseg>-ktosl EQ 'JCS'.
ls_header-glspecificcess = <lfs_bseg>-hkont.
ELSEIF <lfs_bseg>-ktosl EQ 'JCK'.
ls_header-glstatecessspecific = <lfs_bseg>-hkont.
ENDIF.

ls_item-quantity = <lfs_bseg>-menge.
ls_item-accvoucherno = <lfs_bkpf>-belnr.
ls_item-uqc = <lfs_bseg>-meins1.
ls_item-hsn = <lfs_bseg>-steuc.
IF <lfs_bkpf>-awtyp EQ lc_vbrk.
* taxable value, invoice value
READ TABLE gt_invoice ASSIGNING <lfs_invoice> WITH KEY vbeln = <lfs_bkpf>-
awkey+0(10) matnr = <lfs_bseg>-matnr.
IF sy-subrc IS INITIAL.
ls_item-linenumber = <lfs_invoice>-posnr.
ls_header-linenumber = <lfs_invoice>-posnr.
ls_item-productserialnumber = <lfs_invoice>-posnr.
ls_item-totalitemamount = <lfs_invoice>-amt.
ls_item-itemassessableamt = <lfs_invoice>-amt.
ls_item-product_desc = <lfs_invoice>-arktx.
ls_item-productname = <lfs_invoice>-matnr.
ls_item-batchname = <lfs_invoice>-charg.

* CR/DR scenario and warranty date


READ TABLE gt_vbak ASSIGNING <lfs_vbak> WITH KEY vbeln = <lfs_invoice>-
aubel BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-warrantydate = <lfs_vbak>-gwldt.
READ TABLE lt_ordat ASSIGNING <lfs_ordat> WITH KEY vbeln = <lfs_vbak>-
zuonr+0(10) BINARY SEARCH.
IF sy-subrc IS INITIAL.
IF ls_header-documenttype EQ 'CR' OR ls_header-documenttype EQ 'DR' .
ls_item-reasonforcreditdebitnote = <lfs_vbak>-bezei.
ENDIF.
ENDIF.
* sub suppltype
IF ls_header-documenttype EQ 'CR' AND <lfs_vbak>-vbtyp = 'H'.
ls_header-subsupplytype = 'SR'.
ENDIF.
ENDIF.
* free qty
IF <lfs_invoice>-pstyv EQ 'TANN'.
ls_item-freequantity = <lfs_invoice>-fkimg.
ENDIF.
* catergory of product
READ TABLE gt_prodh ASSIGNING <lfs_prodh> WITH KEY prodh = <lfs_invoice>-
prodh BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-categoryofproduct = <lfs_prodh>-vtext.
ENDIF.
* storage location
ls_header-location = <lfs_invoice>-lgobe.
* Batch expiry date
READ TABLE gt_mcha ASSIGNING <lfs_mcha> WITH KEY matnr = <lfs_invoice>-
matnr werks = <lfs_invoice>-werks
charg = <lfs_invoice>-
charg BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-batchexpirydate = <lfs_mcha>-vfdat.
ls_item-origincountry = <lfs_mcha>-herkl.
ENDIF.
* Supplier type
READ TABLE gt_vbpa ASSIGNING <lfs_vbpa> WITH KEY vbeln = <lfs_invoice>-
vbeln parvw = lc_we BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_rcpt_fi ASSIGNING <lfs_rcpt> WITH KEY kunnr = <lfs_vbpa>-
kunnr BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE gt_customer ASSIGNING <lfs_cust> WITH TABLE KEY customer =
<lfs_rcpt>-kunnr.
IF sy-subrc IS NOT INITIAL.
* Supply type determination
ls_item-supplytype = m_supply_type_determination(
EXPORTING
ls_cust = ls_cust
ls_data = <lfs_invoice>
lv_type = <lfs_bseg>-sales_type
im_land = <lfs_rcpt>-land1 ).
ELSE.
* Supply type determination
ls_item-supplytype = m_supply_type_determination(
EXPORTING
ls_cust = <lfs_cust>
ls_data = <lfs_invoice>
lv_type = <lfs_bseg>-sales_type
im_land = <lfs_rcpt>-land1 ).
ENDIF.
ENDIF.
ENDIF.
* IGST, CGST, SGST...
READ TABLE gt_tax TRANSPORTING NO FIELDS WITH KEY knumv = <lfs_invoice>-
knumv kposn = <lfs_invoice>-posnr
kappl = lc_kappl BINARY
SEARCH.
IF sy-subrc IS INITIAL.
lv_indx = sy-tabix.
LOOP AT gt_tax ASSIGNING <lfs_tax> FROM lv_indx.
IF <lfs_tax>-knumv <> <lfs_invoice>-knumv OR <lfs_tax>-kposn <>
<lfs_invoice>-posnr.
EXIT.
ENDIF.

IF <lfs_invoice>-price > <lfs_invoice>-amt.


ls_item-itemassessableamt = <lfs_tax>-kawrt.
ENDIF.
* unit price
IF <lfs_tax>-kschl EQ 'PR00'.
ls_item-unitprice = <lfs_tax>-kbetr.
ls_item-itemamount = ls_item-unitprice * ls_item-quantity.
ENDIF.

READ TABLE gt_cond_typ ASSIGNING <lfs_type> WITH KEY kschl =


<lfs_tax>-kschl BINARY SEARCH.
IF sy-subrc IS INITIAL AND <lfs_tax>-kbetr IS NOT INITIAL.
IF <lfs_type>-gst_type = 'PR00'.
ls_item-unitprice = <lfs_tax>-kbetr.
ls_item-itemamount = ls_item-unitprice * ls_item-quantity.
ENDIF.

IF <lfs_type>-gst_type = lc_cgst.
ls_item-cgstrate = <lfs_tax>-kbetr ."/ 10.
ls_item-cgstamount = <lfs_tax>-kwert.
lv_inv_cgst = lv_inv_cgst + ls_item-cgstamount.
lv_tax_total = lv_tax_total + ls_item-cgstamount.
ls_header-glcgst = <lfs_tax>-konts.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
cgstamount.
IF <lfs_bseg>-koart = 'D' AND ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_igst.
ls_item-igstrate = <lfs_tax>-kbetr." / 10.
ls_item-igstamount = <lfs_tax>-kwert.
lv_inv_igst = lv_inv_igst + ls_item-igstamount.
lv_tax_total = lv_tax_total + ls_item-igstamount.
ls_header-gligst = <lfs_tax>-konts.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
igstamount.
IF <lfs_bseg>-koart = 'D' AND ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_sgst.
ls_item-sgstrate = <lfs_tax>-kbetr." / 10.
ls_item-sgstamount = <lfs_tax>-kwert.
lv_inv_sgst = lv_inv_sgst + ls_item-sgstamount.
lv_tax_total = lv_tax_total + ls_item-sgstamount.
ls_header-glsgst = <lfs_tax>-konts.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
sgstamount.
IF <lfs_bseg>-koart = 'D' OR ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_adcr.
ls_item-cessadvaloremrate = <lfs_tax>-kbetr." / 10.
ls_item-cessadvaloremamt = <lfs_tax>-kwert.
lv_inv_adv = lv_inv_adv + ls_item-
cessadvaloremamt.
lv_tax_total = lv_tax_total + ls_item-
cessadvaloremamt.
ls_header-gladvaloremcess = <lfs_tax>-konts.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
cessadvaloremamt.
IF <lfs_bseg>-koart = 'D' OR ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_spcr.
ls_item-cessspecificrate = <lfs_tax>-kbetr." / 10.
ls_item-cessspecificamt = <lfs_tax>-kwert.
lv_inv_spc = lv_inv_spc + ls_item-
cessspecificamt.
lv_tax_total = lv_tax_total + ls_item-
cessspecificamt.
ls_header-glspecificcess = <lfs_tax>-konts.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
cessspecificamt.
IF <lfs_bseg>-koart = 'D' OR ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_stcs.
ls_item-statecessrate = <lfs_tax>-kbetr ."/ 10.
ls_item-statecessamount = <lfs_tax>-kwert.
lv_inv_stc = lv_inv_stc + ls_item-
statecessamount.
lv_tax_total = lv_tax_total + ls_item-
statecessamount.
ls_header-glstatecessspecific = <lfs_tax>-konts.
ls_item-totalitemamount = ls_item-totalitemamount +
ls_item-statecessamount.
IF <lfs_bseg>-koart = 'D' OR ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = 'DISC'.
ls_item-itemdiscount = ls_item-itemdiscount + <lfs_tax>-kwert.
DATA: lv_dis TYPE char20.
lv_dis = ls_item-itemdiscount.
REPLACE ALL OCCURRENCES OF '-' IN lv_dis WITH space.
CONDENSE lv_dis.
ls_item-itemdiscount = lv_dis.
ENDIF.

IF <lfs_type>-gst_type = 'OTHC'.
ls_item-itemothercharges = ls_item-itemothercharges + <lfs_tax>-
kwert.
ENDIF.

ENDIF.
ENDLOOP.
ENDIF.
CLEAR <lfs_invoice>-matnr.
ENDIF.
ELSE.
ls_item-linenumber = <lfs_bseg>-txgrp.
* HSN
IF <lfs_bseg>-hsn_sac IS NOT INITIAL.
ls_item-hsn = <lfs_bseg>-hsn_sac.
ENDIF.

* Material number and description


READ TABLE gt_matd_fi ASSIGNING <lfs_matd_fi> WITH TABLE KEY matnr =
<lfs_bseg>-matnr.
IF sy-subrc IS INITIAL.
ls_item-product_desc = <lfs_matd_fi>-maktx.
ls_item-productname = <lfs_matd_fi>-maktx.
READ TABLE gt_prodh ASSIGNING <lfs_prodh> WITH KEY prodh = <lfs_matd_fi>-
prdha BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-categoryofproduct = <lfs_prodh>-vtext.
ENDIF.
ENDIF.

*invoice amount
lv_invasamt = lv_invasamt + <lfs_bseg>-wrbtr.

* supply type
READ TABLE gt_bset ASSIGNING <lfs_bset>
WITH KEY bukrs = <lfs_bkpf>-bukrs
belnr = <lfs_bkpf>-belnr
gjahr = <lfs_bkpf>-gjahr
mwskz = <lfs_bseg>-mwskz
txgrp = <lfs_bseg>-txgrp
taxps = <lfs_bseg>-taxps
BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-supplytype = m_supply_type_determination_fi(
ls_cust = ls_cust_bseg
ls_data = <lfs_bseg>
lv_type = <lfs_bseg>-sales_type
ls_tax = <lfs_bset>
im_land = lv_bseg_land1
ls_doc = <lfs_bkpf> ).
ENDIF.

ls_item-itemassessableamt = <lfs_bseg>-dmbtr.
ls_item-itemamount = <lfs_bseg>-dmbtr.
ls_item-unitprice = ls_item-itemamount / ls_item-quantity.

* IGST, CGST, SGST...


READ TABLE gt_bset TRANSPORTING NO FIELDS WITH KEY bukrs = <lfs_bkpf>-bukrs
belnr = <lfs_bkpf>-belnr
gjahr = <lfs_bkpf>-gjahr
mwskz = <lfs_bseg>-mwskz
txgrp = <lfs_bseg>-txgrp
taxps = <lfs_bseg>-taxps BINARY SEARCH.
IF sy-subrc IS INITIAL.
lv_index = sy-tabix.
LOOP AT gt_bset ASSIGNING <lfs_bset> FROM lv_index.
IF <lfs_bseg>-bukrs NE <lfs_bset>-bukrs OR <lfs_bseg>-belnr NE
<lfs_bset>-belnr OR
<lfs_bseg>-gjahr NE <lfs_bset>-gjahr OR <lfs_bseg>-mwskz NE
<lfs_bset>-mwskz OR
<lfs_bseg>-txgrp NE <lfs_bset>-txgrp OR <lfs_bseg>-taxps NE
<lfs_bset>-taxps.
EXIT.
ENDIF.

READ TABLE gt_cond_typ ASSIGNING <lfs_type> WITH KEY kschl =


<lfs_bset>-kschl BINARY SEARCH.
IF sy-subrc IS INITIAL.
IF <lfs_type>-gst_type = lc_cgst. "CGST
ls_item-cgstrate = <lfs_bset>-kbetr." / 10.
ls_item-cgstamount = <lfs_bset>-fwste.
lv_inv_cgst = lv_inv_cgst + ls_item-cgstamount.
lv_tax_total = lv_tax_total + ls_item-cgstamount.
ls_item-itemassessableamt = <lfs_bset>-fwbas.
ls_header-glcgst = <lfs_bset>-hkont.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
cgstamount.
IF <lfs_bseg>-koart = 'D' AND ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_igst. "IGST


ls_item-igstrate = <lfs_bset>-kbetr." / 10.
ls_item-igstamount = <lfs_bset>-fwste.
lv_inv_igst = lv_inv_igst + ls_item-igstamount.
lv_tax_total = lv_tax_total + ls_item-igstamount.
ls_item-itemassessableamt = <lfs_bset>-fwbas.
ls_header-gligst = <lfs_bset>-hkont.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
igstamount.
IF <lfs_bseg>-koart = 'D' AND ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_sgst. "SGST


ls_item-sgstrate = <lfs_bset>-kbetr." / 10.
ls_item-sgstamount = <lfs_bset>-fwste.
lv_inv_sgst = lv_inv_sgst + ls_item-sgstamount.
lv_tax_total = lv_tax_total + ls_item-sgstamount.
ls_item-itemassessableamt = <lfs_bset>-fwbas.
ls_header-glsgst = <lfs_bset>-hkont.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
sgstamount.
IF <lfs_bseg>-koart = 'D' AND ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_adcr. "Advalorem cess


ls_item-cessadvaloremrate = <lfs_bset>-kbetr." / 10.
ls_item-cessadvaloremamt = <lfs_bset>-fwste.
lv_inv_adv = lv_inv_adv + ls_item-cessadvaloremamt.
lv_tax_total = lv_tax_total + ls_item-
cessadvaloremamt.
ls_item-itemassessableamt = <lfs_bset>-fwbas.
ls_header-gladvaloremcess = <lfs_bset>-hkont.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
cessadvaloremamt.
IF <lfs_bseg>-koart = 'D' AND ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_spcr. "Specific cess


ls_item-cessspecificrate = <lfs_bset>-kbetr." / 10.
ls_item-cessspecificamt = <lfs_bset>-fwste.
lv_inv_spc = lv_inv_spc + ls_item-cessspecificamt.
lv_tax_total = lv_tax_total + ls_item-cessspecificamt.
ls_item-itemassessableamt = <lfs_bset>-fwbas.
ls_header-glspecificcess = <lfs_bset>-hkont.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
cessspecificamt.
IF <lfs_bseg>-koart = 'D' AND ( <lfs_bseg>-umskz = 'F' OR
<lfs_bseg>-umskz = 'A' OR <lfs_bseg>-umskz = 'T' ).
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.

IF <lfs_type>-gst_type = lc_stcs. "State cess


ls_item-statecessrate = <lfs_bset>-kbetr ."/ 10.
ls_item-statecessamount = <lfs_bset>-fwste.
lv_inv_stc = lv_inv_stc + ls_item-
statecessamount.
lv_tax_total = lv_tax_total + ls_item-
statecessamount.
ls_item-itemassessableamt = <lfs_bset>-fwbas.
ls_header-glstatecessspecific = <lfs_bset>-hkont.
ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
statecessamount.

IF <lfs_type>-gst_type = 'DISC'. " Discount


ls_item-itemdiscount = <lfs_bset>-fwste.
ENDIF.
IF <lfs_bseg>-koart = 'D'.
IF <lfs_bseg>-umskz = 'F' OR <lfs_bseg>-umskz = 'A' OR
<lfs_bseg>-umskz = 'T'.
ls_item-paidamount = <lfs_bseg>-fwbas.
ENDIF.
ENDIF.
ENDIF.
IF <lfs_bset>-kbetr IS INITIAL.
CLEAR: ls_header-glstatecessspecific, ls_header-glspecificcess,
ls_header-gladvaloremcess,
ls_header-glsgst, ls_header-gligst,ls_header-glcgst.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.

* Total item amount


ls_item-totalitemamount = ls_item-totalitemamount + ls_item-
itemassessableamt.
ENDIF.

IF <lfs_invoice> IS ASSIGNED.
READ TABLE gt_vbak ASSIGNING <lfs_vbak> WITH KEY vbeln = <lfs_invoice>-
aubel BINARY SEARCH.
IF sy-subrc IS INITIAL.
READ TABLE lt_ordat ASSIGNING FIELD-SYMBOL(<lfs_ordat1>) WITH KEY vbeln =
<lfs_vbak>-zuonr+0(10) BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-documentreferencenumber = <lfs_bkpf>-xblnr.
ls_item-preceedinginvoiceno = <lfs_vbak>-zuonr+0(10).
ls_item-preceedinginvoicedt = <lfs_ordat1>-fkdat.
ENDIF.
ENDIF.
IF ls_item-documentreferencenumber IS INITIAL.
READ TABLE gt_bkpf INTO DATA(ls_bkpf1) WITH KEY bukrs = <lfs_invoice>-
bukrs belnr = <lfs_invoice>-vbeln BINARY SEARCH.
IF sy-subrc = 0.
ls_item-documentreferencenumber = ls_bkpf1-xblnr.
ENDIF.
ENDIF.

IF <lfs_invoice>-sfakn IS NOT INITIAL.


READ TABLE gt_invoice ASSIGNING <lfs_can> WITH KEY vbeln = <lfs_invoice>-
sfakn BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-documentreferencenumber = <lfs_bkpf>-xblnr.
ls_item-preceedinginvoiceno = <lfs_invoice>-sfakn.
ls_item-preceedinginvoicedt = <lfs_can>-fkdat.
ENDIF.
ENDIF.

READ TABLE gt_vbak ASSIGNING <lfs_vba> WITH KEY vbeln = <lfs_invoice>-aubel


BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_item-customerporeferencenumber = <lfs_vba>-bstkd.
ls_item-customerporeferencedate = <lfs_vba>-bstdk.
ENDIF.
ENDIF.

* isservice
IF ls_item-hsn+0(2) EQ '99'.
ls_item-isservice = lc_yes.
ELSE.
ls_item-isservice = lc_no.
ENDIF.

IF lv_fkart EQ 'F2' AND ( ls_item-supplytype EQ 'NIL' OR ls_item-supplytype


EQ 'NON' OR ls_item-supplytype EQ 'SCH3' OR
ls_item-supplytype EQ 'EXT' ) .
ls_header-documenttype = 'BOS'.
ls_item-documenttype = 'BOS'.
ELSEIF lv_fkart EQ 'F2' OR lv_fkart EQ 'S1'.
ls_item-documenttype = 'INV'.
ENDIF.

IF lv_fkart EQ 'G2'.
ls_item-documenttype = 'CR'.
ELSEIF lv_fkart EQ 'L2'.
ls_item-documenttype ='DR'.
ENDIF.
IF ls_item-documenttype IS INITIAL .
ls_item-documenttype ='OTH'.
ENDIF.

DATA(lv_number) = ls_item-preceedinginvoiceno.
DATA(lv_date2) = ls_item-preceedinginvoicedt.
DATA(lv_suptype) = ls_item-supplytype.

IF <lfs_bkpf>-awtyp = 'VBRK'.
IF ls_item-supplytype EQ 'CAN' AND <lfs_invoice> IS ASSIGNED.
ls_item-preceedinginvoiceno = <lfs_invoice>-vbeln.
ls_item-preceedinginvoicedt = <lfs_invoice>-erdat.
ls_header-documentnumber = lv_number.
ls_header-documentdate = <lfs_invoice>-fkdat.
ENDIF.
ELSE." Direct Posting
IF ls_item-supplytype EQ 'CAN' AND <lfs_bkpf>-stblg IS NOT INITIAL.
ls_header-documentnumber = <lfs_bkpf>-stblg.
ls_header-documentdate = <lfs_bkpf>-budat.
ENDIF.
ENDIF.

********Section 7 flag**************
IF ls_item-supplytype IN lr_supply.
ls_header-sec7igstflag = lc_no.
ENDIF.

* Sub supply type


IF ls_item-supplytype = 'SEZWOP' OR ls_item-supplytype = 'SEDWP' OR
ls_item-supplytype = 'SEZWP' OR ls_item-supplytype = 'SEDWOP' .
ls_header-subsupplytype = 'TAX'.
ELSEIF lv_tax_total IS NOT INITIAL.
ls_header-subsupplytype = 'TAX'.
ELSEIF ls_item-supplytype = 'EXPT' OR ls_item-supplytype = 'EXPWT'.
ls_header-subsupplytype = 'EXP'.
ELSE.
ls_header-subsupplytype = 'OTH'.
ENDIF.

DATA: lv_spell TYPE maxbt.

lv_spell = ls_header-invoicevalue.

IF <lfs_bkpf> IS ASSIGNED.
CALL FUNCTION 'HR_IN_CHG_INR_WRDS'
EXPORTING
amt_in_num = lv_spell
IMPORTING
amt_in_words = ls_header-totalinvoicevalue
EXCEPTIONS
data_type_mismatch = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.

lv_invassamt = lv_invassamt + ls_item-itemassessableamt.

IF ls_header-invoicevaluefc IS NOT INITIAL.


ls_header-invoicevalue = ls_header-invoicevaluefc.
ENDIF.

ls_item-balanceamount = ls_header-invoicevalue - ls_item-paidamount.

IF ls_item-supplytype EQ 'CAN'.
READ TABLE gt_item INTO DATA(ls_itm) WITH KEY accvoucherno = ls_header-
documentnumber.
IF sy-subrc = 0.
IF ls_itm-supplytype EQ 'EXPT' OR ls_itm-supplytype EQ 'EXPWT'.
DATA(lv_can) = abap_true.
ENDIF.
ENDIF.
ENDIF.

IF ls_item-supplytype EQ 'EXPT' OR ls_item-supplytype EQ 'EXPWT'.


IF ls_header-shiptopincode IS INITIAL.
ls_header-shiptopincode = '999999'.
ENDIF.
IF ls_header-shiptostatecode IS INITIAL.
ls_header-shiptostatecode = '96'.
ENDIF.
IF ls_header-portcode IS INITIAL.
ls_header-portcode = ' '.
ENDIF.
ENDIF.

IF ls_item-supplytype EQ 'EXPT' OR ls_item-supplytype EQ 'EXPWT' OR lv_can EQ


abap_true.
ls_header-billingpos = ' '.
ls_header-customerpincode = '999999'.
ls_header-customerstatecode = '96'.
ls_item-balanceamount = ls_item-balanceamount * ls_header-
exchangerate.
ls_item-paidamount = ls_item-paidamount * ls_header-
exchangerate.
ls_item-totalitemamount = ls_item-totalitemamount * ls_header-
exchangerate.
ls_item-itemassessableamt = ls_item-itemassessableamt * ls_header-
exchangerate.
ls_item-cessadvaloremamt = ls_item-cessadvaloremamt * ls_header-
exchangerate.
ls_item-cessspecificamt = ls_item-cessspecificamt * ls_header-
exchangerate.
ls_item-cgstamount = ls_item-cgstamount * ls_header-
exchangerate.
ls_item-igstamount = ls_item-igstamount * ls_header-
exchangerate.
ls_item-itemamount = ls_item-itemamount * ls_header-
exchangerate.
ls_item-unitprice = ls_item-unitprice * ls_header-
exchangerate.
ls_item-pretaxamount = ls_item-pretaxamount * ls_header-
exchangerate.
ls_header-invoicevalue = ls_header-invoicevalue * ls_header-
exchangerate.
ls_item-sgstamount = ls_item-sgstamount * ls_header-
exchangerate.
ls_item-statecessamount = ls_item-statecessamount * ls_header-
exchangerate.
ls_item-itemothercharges = ls_item-itemothercharges * ls_header-
exchangerate.
ls_item-itemdiscount = ls_item-itemdiscount * ls_header-
exchangerate.
ls_header-invoiceothercharges = ls_header-invoiceothercharges * ls_header-
exchangerate.
ENDIF.

IF ls_item-supplytype EQ 'EXPT' OR ls_item-supplytype EQ 'EXPWT'.


ls_header-invoiceassessableamount = ls_header-invoiceassessableamount *
ls_header-exchangerate.
ENDIF.

DATA(lv_invoice) = ls_header-invoicevalue.
DATA(lv_supplytype) = ls_item-supplytype.

IF ls_item-supplytype NE 'SEZWP' AND ls_item-supplytype NE 'DXP' AND


ls_item-supplytype NE 'SEDWP' AND
ls_item-supplytype NE 'SEZWOP' AND ls_item-supplytype NE 'SEDWOP'.
ls_header-claimrefundflag = 'N'.
ENDIF.

IF ( ls_header-transportdocdate IS INITIAL OR ls_header-transportdocno IS


INITIAL OR
ls_header-transportername IS INITIAL OR ls_header-transportmode IS INITIAL
OR ls_header-vehicletype IS INITIAL
OR ls_header-vehicleno IS INITIAL ).
CLEAR: ls_header-transportdocdate, ls_header-transportdocno, ls_header-
transportername,
ls_header-transportmode, ls_header-vehicletype, ls_header-vehicleno.
ENDIF.

SHIFT ls_header-documentnumber LEFT DELETING LEADING '0'.

ls_header-steinvoice = 1.
ls_header-stewb = 1.
ls_header-stcompliance = 2.
APPEND ls_header TO gt_header.
CLEAR: ls_header-invoiceassessableamount.

ls_sup-belnr = ls_item-accvoucherno.
ls_sup-supplytype = ls_item-supplytype.
APPEND ls_sup TO lt_sup.
CLEAR:ls_sup.

SORT lt_sup BY belnr supplytype.

ls_item-fiscalyear = ls_header-fiscalyear.
ls_item-companycode = ls_header-companycode.
ls_item-accvoucherno = ls_header-accvoucherno.
ls_item-documenttype = ls_header-documenttype.
ls_item-suppliergstin = ls_header-suppliergstin.

IF ls_item-quantity IS INITIAL AND ls_item-itemamount IS INITIAL.


CLEAR ls_item.
ELSE.
APPEND ls_item TO gt_item.
ENDIF.

CLEAR: ls_item, lv_shipto, lv_index, lv_sec7_flag, lv_indx.

AT END OF belnr.

DATA:lc_supplytype TYPE char10,


lw_supplytype TYPE char10,
lr_type TYPE RANGE OF zeydigi_oward_i-supplytype,
ls_type LIKE LINE OF lr_type.

ls_type-sign = lc_include.
ls_type-option = lc_equals.
ls_type-low = 'NON'.
COLLECT ls_type INTO lr_type.

ls_type-sign = lc_include.
ls_type-option = lc_equals.
ls_type-low = 'NIL'.
COLLECT ls_type INTO lr_type.

ls_type-sign = lc_include.
ls_type-option = lc_equals.
ls_type-low = 'EXT'.
COLLECT ls_type INTO lr_type.

LOOP AT lt_sup INTO ls_sup.

IF ls_sup-supplytype EQ 'TAX' OR ls_sup-supplytype EQ 'NON' OR


ls_sup-supplytype EQ 'EXT' OR ls_sup-supplytype EQ 'NIL' .
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'TAX' AND supplytype NE
'NON' AND
supplytype NE 'EXT' AND supplytype NE
'NIL' ."AND sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'TAX'.
ENDIF.
ELSEIF ls_sup-supplytype = 'SEZWP' OR ls_sup-supplytype = 'SEZWOP'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'SEZWP' AND supplytype
NE 'SEZWOP'." AND sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'SEZWP'.
ENDIF.
ELSEIF ls_sup-supplytype = 'SEDWP' OR ls_sup-supplytype = 'SEDWOP'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'SEDWP' AND supplytype
NE 'SEDWOP'." AND sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'SEDWP'.
ENDIF.
ELSEIF ls_sup-supplytype = 'EXPT' OR ls_sup-supplytype = 'EXPWT'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'EXPT' AND supplytype NE
'EXPWT' ."AND sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'EXPT'.
ENDIF.
ELSEIF ls_sup-supplytype = 'DXP'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'DXP'." AND sy-index NE
1.
IF sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDIF.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'DXP'.
ENDIF.
ELSEIF ls_sup-supplytype = 'NSY'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'NSY'." AND
IF sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDIF.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'NSY'.
ENDIF.
ELSEIF ls_sup-supplytype = 'CAN'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'CAN'."
IF sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDIF.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'CAN'.
ENDIF.
ELSEIF ls_sup-supplytype = 'SCH3'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'SCH3'. "AND
IF sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDIF.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'SCH3'.
ENDIF.
ELSEIF ls_sup-supplytype = 'DTA'.
LOOP AT lt_sup INTO ls_sup WHERE supplytype NE 'DTA' ."AND
IF sy-index NE 1.
ls_header-extrerror = TEXT-001.
EXIT.
ENDIF.
ENDLOOP.
IF sy-subrc = 4.
ls_header-derivedsupp = 'DTA'.
ENDIF.
ENDIF.

IF lw_supplytype IS INITIAL.
lw_supplytype = ls_sup-supplytype.
ELSEIF lw_supplytype = ls_sup-supplytype.
ls_header-derivedsupp = ls_sup-supplytype.
ENDIF.

IF sy-tabix = 1.
lc_supplytype = ls_sup-supplytype.
ELSEIF ls_sup-supplytype IN lr_type.
ls_header-derivedsupp = lc_supplytype.
ENDIF.
ENDLOOP.

CLEAR lt_sup.
IF <lfs_bkpf>-awtyp NE lc_vbrk.
ls_header-invoiceassessableamount = lv_invasamt.
ENDIF.

ls_header-invoiceassessableamount = lv_invassamt.
ls_header-invoiceigstamount = lv_inv_igst.
ls_header-invoicesgstamount = lv_inv_sgst.
ls_header-invoicecgstamount = lv_inv_cgst.
ls_header-invoicecessadvaloremamount = lv_inv_adv.
ls_header-invoicecessspecificamount = lv_inv_spc.
ls_header-invoicestatecessspecificamount = lv_inv_stc.

IF lv_supplytype EQ 'EXPT' OR lv_supplytype EQ 'EXPWT'.


ls_header-invoiceassessableamount = ls_header-
invoiceassessableamount * ls_header-exchangerate.
ls_header-invoicecessadvaloremamount = ls_header-
invoicecessadvaloremamount * ls_header-exchangerate.
ls_header-invoicecessspecificamount = ls_header-
invoicecessspecificamount * ls_header-exchangerate.
ls_header-invoicecgstamount = ls_header-invoicecgstamount *
ls_header-exchangerate.
ls_header-invoiceigstamount = ls_header-invoiceigstamount *
ls_header-exchangerate.
ls_header-invoicesgstamount = ls_header-invoicesgstamount *
ls_header-exchangerate.
ls_header-invoicestatecessadvaloremamt = ls_header-
invoicestatecessadvaloremamt * ls_header-exchangerate.
ls_header-invoicestatecessspecificamount = ls_header-
invoicestatecessspecificamount * ls_header-exchangerate.
ENDIF.

lv_spell = lv_invoice.

IF <lfs_bkpf> IS ASSIGNED.
CALL FUNCTION 'HR_IN_CHG_INR_WRDS'
EXPORTING
amt_in_num = lv_spell
IMPORTING
amt_in_words = ls_header-totalinvoicevalue
EXCEPTIONS
data_type_mismatch = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.

IF lv_plant_ctry NE lv_shipto_ctry.
READ TABLE gt_countrycode ASSIGNING <lfs_country> WITH KEY sapcode =
lv_shipto_ctry BINARY SEARCH.
IF sy-subrc IS INITIAL.
ls_header-countrycode = <lfs_country>-gstcode.
ENDIF.
ELSE .
CLEAR ls_header-invoicevaluefc.
ENDIF.

ls_header-currencycode = <lfs_bkpf>-gstcode.

IF lv_ship_to EQ lv_bill_to AND lv_supp_reg EQ lv_dis_add.


ls_header-doccategory = 'REG'.
ELSEIF lv_ship_to EQ lv_bill_to AND lv_supp_reg NE lv_dis_add.
ls_header-doccategory = 'DIS'.
ELSEIF lv_ship_to NE lv_bill_to AND lv_supp_reg EQ lv_dis_add.
ls_header-doccategory = 'SHP'.
ELSEIF lv_ship_to NE lv_bill_to AND lv_supp_reg NE lv_dis_add.
ls_header-doccategory = 'CMB'.
ENDIF.

IF ls_header-documenttype EQ 'BOS'.
READ TABLE gt_header INTO DATA(ls_head) WITH KEY documentnumber =
ls_header-documentnumber.
IF sy-subrc = 0 AND ls_head-documenttype EQ 'INV'.
ls_header-documenttype = 'INV'.
ENDIF.
ELSEIF ls_header-documenttype EQ 'INV'.
READ TABLE gt_header ASSIGNING FIELD-SYMBOL(<ls_head>) WITH KEY
documentnumber = ls_header-documentnumber.
IF sy-subrc = 0 AND <ls_head>-documenttype EQ 'BOS'.
<ls_head>-documenttype = 'INV'.
ENDIF.
ENDIF.

IF ls_header-subsupplytype EQ 'OTH'.
READ TABLE gt_header INTO ls_head WITH KEY documentnumber = ls_header-
documentnumber.
IF sy-subrc = 0 AND ls_head-subsupplytype EQ 'TAX'.
ls_header-subsupplytype = 'TAX'.
ENDIF.
ELSEIF ls_header-subsupplytype EQ 'TAX'.
READ TABLE gt_header ASSIGNING <ls_head> WITH KEY documentnumber =
ls_header-documentnumber.
IF sy-subrc = 0 AND <ls_head>-subsupplytype EQ 'OTH'.
<ls_head>-subsupplytype = 'TAX'.
ENDIF.
ENDIF.

MODIFY gt_header FROM ls_header TRANSPORTING documenttype doccategory


derivedsupp extrerror invoiceigstamount
invoicesgstamount invoicecgstamount invoiceassessableamount
invoicecessadvaloremamount invoicecessspecificamount
invoicestatecessspecificamount totalinvoicevalue countrycode currencycode
tdsflaggst
WHERE documentnumber = ls_header-documentnumber.

gs_zgst_fi_doc-flag = abap_true.
MODIFY gt_zgst_fi_doc FROM gs_zgst_fi_doc TRANSPORTING flag WHERE belnr EQ
ls_header-accvoucherno.

CLEAR:lv_invasamt, lv_tax_total, lv_inv_igst, lv_inv_sgst, lv_invassamt,


lv_inv_cgst, lv_inv_adv,
lv_inv_spc, lv_inv_stc, ls_header, ls_cust_bseg, lv_bseg_land1, lv_bill_to,
lv_plant_ctry,
lv_shipto_ctry, lv_object_name, lv_ship_to, lv_invoice, ls_header.
ENDAT.

CLEAR: lv_can.

ENDLOOP.

IF rb_updt EQ abap_true.
MODIFY zeydigi_bte_tab FROM TABLE gt_zgst_fi_doc.
ENDIF.

ENDMETHOD.

METHOD m_export_final_tab.

SORT: gt_header BY documentnumber accvoucherno,


gt_item BY accvoucherno linenumber.

etab1[] = gt_header[].
etab2[] = gt_item[].

ENDMETHOD.

METHOD m_fill_excel_data.

FIELD-SYMBOLS: <lfs_item> TYPE zeydigi_oward_i,


<lfs_header> TYPE zeydigi_oward_h.

SORT: gt_item BY accvoucherno linenumber,


gt_header BY accvoucherno linenumber.

DATA: ls_excel TYPE zeydigi_239ff.

LOOP AT gt_item INTO DATA(ls_item).

TRY.
DATA(wa_final) = gt_header[ accvoucherno = ls_item-accvoucherno
linenumber = ls_item-linenumber ].

MOVE-CORRESPONDING ls_item TO ls_excel.


MOVE-CORRESPONDING wa_final TO ls_excel.

SHIFT ls_excel-accvoucherno LEFT DELETING LEADING '0'.


SHIFT ls_excel-documentnumber LEFT DELETING LEADING '0'.
SHIFT ls_excel-ewbnumber LEFT DELETING LEADING '0'.
SHIFT ls_excel-customercode LEFT DELETING LEADING '0'.
SHIFT ls_excel-hsn LEFT DELETING LEADING '0'.

APPEND ls_excel TO gt_excel.

CATCH cx_sy_itab_line_not_found.
CLEAR: wa_final.
ENDTRY.

CLEAR ls_excel.
ENDLOOP.

*Filter for selection screen date.


* DELETE gt_excel WHERE documentdate NOT IN so_date[].
ENDMETHOD.

METHOD m_export_excel_tab.

SORT gt_excel BY documentnumber linenumber.


etab1[] = gt_excel[].

ENDMETHOD.

METHOD m_free_local_tab.

*Clear all the local tables


FREE: lt_bkpf[], lt_kunnr[], lt_matnr[], lt_vbeln[], lt_bupla[], lt_vgbel[],
lt_knumv[], lt_plant[],
lt_hsncd[], lt_aubel[], lt_prodh[] .

ENDMETHOD.

ENDCLASS. "lcl_data

You might also like