Sie sind auf Seite 1von 18

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

*& Report ZF_CREATE_TXGRP_IN_BSET


*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
*
* Original im EB5/000
*
*&---------------------------------------------------------------------*
*& Report ZF_CREATE_TXGRP_IN_BSET
*& Tax Group TXGRP in table BSET is corrected
* Report is attached to note 647424,
* please keep attachment up to date.
*------------------------------T---------------------------------------
************************************************************************
* Last change:
* 2016-03-18: Parameter LINEWISE: force tax calculation line-by-line,
* makes sense only in IN ?
* and for glvor = RMRP (MIRO, MRKO) ??
* see FM CALCULATE_TAX_DOCUMENT
* 2013-06-10: not line-by-line -> clear bset-taxps in all items
* 2012-04-11: correct update flag
* 2012-03-30: switch for offset in BSET-TXGRP
* 2012-03-28: add taxps
* 2012-01-23: coloring of output list
* July 25, 2006 set_xauto. Note 967354
* June 26, 2006 set_xauto. Note 959712
* October 21, 2005: compressed manual tax line items in
* BSEG and/or BSET
* October 12, 2005:
* Redesign: applicable now also for company code without linewise tax
* calculation (see tr. OBCO) and MIRO documents with manual tax line
* items (see note 887711)

* March 4,2004
* August 6, 2003
************************************************************************
* Select-Options
* p_belnr FI document number
* p_bukrs company code
* p_gjahr business year
* p_budat posting date
* p_blart document type
* p_awtyp reference procudure i.e. VBRK for SD billing documents
*
* Parameters:
* testrun ON = no databbase changes
* bset_det ON = List All Bset line items
* bseg_det ON = List All Bseg line items
* onlycorr ON = List only wrong documents
* linewise ON = force line-by-line tax calculation
*-----------------------------------------------------------------------
*-----------------------------------------------------------------------
* Check in testrun whether the changes would be ok !!
*-----------------------------------------------------------------------
REPORT zf_create_txgrp_in_bset MESSAGE-ID ff LINE-SIZE 140.
TABLES: bkpf, bseg, bset.
TABLES: ttypv,
dd02l. "2016-03-18

DATA: xbkpf LIKE bkpf OCCURS 10 WITH HEADER LINE,


ybkpf LIKE bkpf OCCURS 10 WITH HEADER LINE,
xbseg LIKE bseg OCCURS 10 WITH HEADER LINE,
ybseg LIKE bseg OCCURS 10 WITH HEADER LINE,
xbset LIKE bset OCCURS 10 WITH HEADER LINE,
ybset LIKE bset OCCURS 10 WITH HEADER LINE.

* output structure
DATA: BEGIN OF xoutput OCCURS 0,
bukrs LIKE bkpf-bukrs,
belnr LIKE bkpf-belnr,
gjahr LIKE bkpf-gjahr,
text(20) TYPE c,
corrupt TYPE c,
updated TYPE c,
END OF xoutput.

* Bset for output


DATA: BEGIN OF bset_output OCCURS 0,
xcorrupt TYPE c,
status(3) VALUE ' ', "'OLD' or 'NEW',
bukrs LIKE bset-bukrs,
belnr LIKE bset-belnr,
gjahr LIKE bset-gjahr,
buzei LIKE bset-buzei,
txgrp LIKE bset-txgrp,
taxps LIKE bset-taxps, "2012-03-28
txjlv LIKE bset-txjlv,
shkzg LIKE bset-shkzg,
mwskz LIKE bset-mwskz,
txjcd LIKE bset-txjcd,
fwste LIKE bset-fwste,
fwbas LIKE bset-fwbas,
ktosl LIKE bset-ktosl,
kschl LIKE bset-kschl,

END OF bset_output.

* Bseg for output


DATA: BEGIN OF bseg_output OCCURS 0,
xcorrupt TYPE c,
status(7) TYPE c, " 'OLD' or 'NEW',
bukrs LIKE bseg-bukrs,
belnr LIKE bseg-belnr,
gjahr LIKE bseg-gjahr,
buzei LIKE bseg-buzei,
txgrp LIKE bseg-txgrp,
shkzg LIKE bseg-shkzg,
mwskz LIKE bseg-mwskz,
txjcd LIKE bseg-txjcd,
wrbtr LIKE bseg-wrbtr,
fwbas LIKE bseg-fwbas,
ktosl LIKE bseg-ktosl,
mwart LIKE bseg-mwart,
bschl LIKE bseg-bschl,
koart LIKE bseg-koart,
buzid LIKE bseg-buzid,
END OF bseg_output.

DATA: BEGIN OF doc_key,


bukrs LIKE bseg-bukrs,
belnr LIKE bseg-belnr,
gjahr LIKE bseg-gjahr,
END OF doc_key.

DATA: BEGIN OF tb OCCURS 0,


buzei LIKE bseg-buzei,
txgrp LIKE bseg-txgrp,
END OF tb.
DATA: old_txgrp LIKE bset-txgrp.
DATA: old_bukrs LIKE bkpf-bukrs.
DATA: old_awtyp LIKE ttypv-awtyp.

DATA: e_external,
e_linewise.

DATA: ls_t001 TYPE t001,


ls_t005 TYPE t005.
* counter
DATA: exist_bset_count TYPE i,
calc_bset_count TYPE i,
docs_checked TYPE i,
docs_corrupt TYPE i,
xcorrupt TYPE c,
bseg_xauto_corrupt,
icommit TYPE i.

DATA: save_linewise, "2016-03-18


e_jurcode_active, "2016-03-18
l_t001 TYPE t001. "2014-03-18

DATA: workarea TYPE string, "2016-03-18


tabname TYPE string. "2016-03-18

FIELD-SYMBOLS: <struc> TYPE ANY. "2016-03-18

*--------------------------------------------------------------------
* bset-txgrp can start with 002 ?? "2012-03-30
DATA: p_offset_allowed VALUE ' '. "2012-03-30
*--------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME.
* only 1 company code and business year allowed
PARAMETERS: "2016-03-18
p_bukrs LIKE bkpf-bukrs MEMORY ID buk "2016-03-18
OBLIGATORY, "2016-03-18

p_gjahr LIKE bkpf-gjahr MEMORY ID gjr "2016-03-18


OBLIGATORY. "2016-03-18

SELECT-OPTIONS: p_belnr FOR bkpf-belnr,


* p_bukrs FOR bkpf-bukrs MEMORY ID buk, "2016-03-18
* p_gjahr FOR bkpf-gjahr MEMORY ID gjr, "2016-03-18
p_budat FOR bkpf-budat,
p_blart FOR bkpf-blart,
p_awtyp FOR bkpf-awtyp. "DEFAULT 'RMRP'.
SELECTION-SCREEN END OF BLOCK 001.
PARAMETERS : testrun AS CHECKBOX DEFAULT 'X',
bset_det AS CHECKBOX,
onlycorr AS CHECKBOX DEFAULT 'X'.
PARAMETERS: linewise AS CHECKBOX DEFAULT ' '. "2016-03-18
save_linewise = linewise. "2016-03-18

*----------------------------------------------------------------
* select documents
SELECT * FROM bkpf WHERE bukrs = p_bukrs "2016-03-18
AND belnr IN p_belnr
AND gjahr = p_gjahr "2016-03-18
AND budat IN p_budat
AND blart IN p_blart
AND awtyp IN p_awtyp
*"/ only posted, no statistical doc (no down paym. req)
AND bstat = space.

* no documents originally posted in FI


* CHECK bkpf-awtyp NE 'BKPF'.

* only for company codes with external system or tax line by line
IF old_bukrs NE bkpf-bukrs.
old_bukrs = bkpf-bukrs.
CALL FUNCTION 'CHECK_JURISDICTION_ACTIVE'
EXPORTING
i_bukrs = bkpf-bukrs
IMPORTING
e_isactive = e_jurcode_active "2016-03-18
e_external = e_external
e_xtxit = e_linewise.
* obsolete October 12,2005
* IF e_external IS INITIAL
* OR e_linewise IS INITIAL.
* WRITE: / 'Actual comp code: ', xbkpf-bukrs.
* WRITE: /
* 'Select only Comp.Codes with line-by-line tax calculation. STOP'.
* STOP.
* ENDIF.

SELECT SINGLE * FROM t001 INTO l_t001


WHERE bukrs = p_bukrs.

ENDIF.

IF NOT e_linewise IS INITIAL


OR NOT linewise IS INITIAL. "2016-03-18
* because of compression according to note 571928 and 643273
IF old_awtyp NE bkpf-awtyp.
old_awtyp = bkpf-awtyp.
SELECT * FROM ttypv WHERE awtyp = bkpf-awtyp.
WRITE: / 'Actual document number: ', bkpf-bukrs,
bkpf-belnr,
bkpf-gjahr.
WRITE: / 'Actual Reference Procedure of the document: ',
bkpf-awtyp.
WRITE: /
'Select only Reference Procedures without compression. STOP'.

WRITE: / 'See notes 571928, 643273, 36353 and related ones'.

STOP.

ENDSELECT.

** begin of 2016-03-18
* SELECT * FROM dd02l WHERE tabname = 'TTYPVX'.
* ENDSELECT.
* IF sy-subrc IS INITIAL.
* tabname = 'TTYPVX'.
* ASSIGN workarea TO <struc> CASTING TYPE (tabname).
* SELECT * FROM (tabname) INTO workarea
* WHERE awtyp EQ bkpf-awtyp
* AND ( bukrs EQ bkpf-bukrs
* OR bukrs EQ space )
* AND ( blart EQ bkpf-blart
* OR blart EQ space )
* .
* WRITE: / 'Actual document number: ', bkpf-bukrs,
* bkpf-belnr,
* bkpf-gjahr.
* WRITE: / 'Actual Reference Procedure of the document: ',
* bkpf-awtyp.
* WRITE: /
* 'Select only Reference Procedures without compression. STOP'.
*
* WRITE: / 'See notes 1779136, 1916751, 643273, 36353 and related ones'.
*
* STOP.
*
* ENDSELECT.
* ENDIF.
** end of 2016-03-18
ENDIF.
ENDIF.

MOVE-CORRESPONDING bkpf TO xbkpf.

if ls_t001-bukrs <> xbkpf-bukrs.


call function 'FI_COMPANY_CODE_DATA'
exporting
i_bukrs = xbkpf-bukrs
importing
e_t001 = ls_t001.
call function 'FI_COUNTRY_DATA'
exporting
i_land1 = ls_t001-land1
importing
e_t005 = ls_t005.
endif.

IF ls_t005-intca <> 'IN' AND


ls_t005-intca <> 'BR'.
old_bukrs = xbkpf-bukrs.
old_awtyp = xbkpf-awtyp.
APPEND xbkpf.
ENDIF.

ENDSELECT.

LOOP AT xbkpf.

CLEAR: xcorrupt,
bseg_xauto_corrupt.
docs_checked = docs_checked + 1.

REFRESH: ybkpf, ybseg, xbseg, xbset, ybset.


CLEAR: ybkpf, ybseg, xbseg, xbset, ybset.
CLEAR: xoutput.

MOVE-CORRESPONDING xbkpf TO ybkpf.


APPEND ybkpf.

SELECT * FROM bseg INTO TABLE xbseg


WHERE bukrs = xbkpf-bukrs
AND belnr = xbkpf-belnr
AND gjahr = xbkpf-gjahr
ORDER BY PRIMARY KEY.

SELECT * FROM bset INTO TABLE xbset


WHERE bukrs = xbkpf-bukrs
AND belnr = xbkpf-belnr
AND gjahr = xbkpf-gjahr
ORDER BY PRIMARY KEY.

* begin of 2016-03-18
IF l_t001-land1 = 'IN'.
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = 'J_1I4_CALCULATE_TAX_DOCUMENT'
EXCEPTIONS
function_not_exist = 1
OTHERS = 2.
IF sy-subrc IS INITIAL.
CALL FUNCTION 'J_1I4_CALCULATE_TAX_DOCUMENT' " see note 1872988
EXPORTING
t_bkpf = xbkpf
TABLES
t_bseg = xbseg "see note 2056080
CHANGING
c_flg_xtxit = e_linewise.
ENDIF.
ENDIF.
* end of 2016-03-18

SORT xbset BY bukrs belnr gjahr buzei.

ybseg[] = xbseg[]. "26.06.2006


ybset[] = xbset[].
*+++++++++++++++++++++++++++++++++++++++++++++
* repair txgrp in table BSET: output in table ybseg
PERFORM set_txgrp_in_bset.
**********************************************
xoutput-corrupt = xcorrupt.
IF bseg_xauto_corrupt = 'X'.
xoutput-corrupt = 'X'.
ENDIF.
MOVE-CORRESPONDING ybkpf TO xoutput.

* store some old bset data for output list


LOOP AT xbset.
MOVE-CORRESPONDING xbset TO bset_output.
bset_output-status = 'OLD'.
APPEND bset_output.
ENDLOOP.

* store some new bset data for output list


LOOP AT ybset.
MOVE-CORRESPONDING ybset TO bset_output.
bset_output-status = 'NEW'.
APPEND bset_output.
ENDLOOP.

IF testrun IS INITIAL.
IF xcorrupt = 'X'.
* insert new TXGRP in BSET
LOOP AT ybset.
UPDATE bset SET txgrp = ybset-txgrp
taxps = ybset-taxps "2012-03-28
WHERE bukrs = ybset-bukrs
AND belnr = ybset-belnr
AND gjahr = ybset-gjahr
AND buzei = ybset-buzei.
ENDLOOP.
ENDIF.
IF bseg_xauto_corrupt = 'X'.
* insert new XAUTO in BSEG
LOOP AT xbseg WHERE NOT mwskz IS INITIAL
AND NOT mwart IS INITIAL
AND xauto IS INITIAL.
LOOP AT ybseg WHERE buzei = xbseg-buzei
AND NOT xauto IS INITIAL.
UPDATE bseg SET xauto = ybseg-xauto
WHERE bukrs = ybseg-bukrs
AND belnr = ybseg-belnr
AND gjahr = ybseg-gjahr
AND buzei = ybseg-buzei.
ENDLOOP.
ENDLOOP.
ENDIF.
IF xcorrupt = 'X' "2012-04-11
OR bseg_xauto_corrupt = 'X'. "2012-04-11
xoutput-updated = 'X'.
icommit = icommit + 1.
ENDIF. "2012-04-11
ENDIF.

APPEND xoutput.

IF xcorrupt = 'X'
OR bseg_xauto_corrupt = 'X'. "2012-04-11
docs_corrupt = docs_corrupt + 1.
ENDIF.
IF icommit GT 500.
COMMIT WORK.
CLEAR icommit.
ENDIF.

ENDLOOP. "xbkpf
COMMIT WORK.

PERFORM write_output_documents.

**********************************************************************
* form write_output_documents
**********************************************************************
FORM write_output_documents.

DATA: old_belnr LIKE bseg-belnr.

SORT xoutput BY bukrs belnr gjahr.


SORT bset_output BY bukrs belnr gjahr status DESCENDING buzei.
SORT bseg_output BY bukrs belnr gjahr status DESCENDING buzei.

FORMAT COLOR COL_HEADING.


WRITE: / 'BUKRS BELNR GJAHR corrupt updated '.
ULINE.
FORMAT COLOR OFF.

LOOP AT xoutput.
WRITE: /(6) xoutput-bukrs,
(12) xoutput-belnr,
(6) xoutput-gjahr,
(8) xoutput-corrupt,
(8) xoutput-updated,
(20) xoutput-text.
ENDLOOP.

NEW-LINE. ULINE.
FORMAT COLOR COL_TOTAL.
WRITE: / 'Documents checked:', docs_checked.
WRITE: / 'Documents corrupt:', docs_corrupt.
FORMAT COLOR OFF.

NEW-PAGE.
FORMAT COLOR COL_GROUP.
WRITE: 'Checked documents: Please compare old and new TXGRP in BSET'.
FORMAT COLOR COL_HEADING.
WRITE: / 'STA CompC Doc.No Year POS TXG TAXPS S TC JurCode'. "2012-03-
28

FORMAT COLOR COL_NORMAL.


CLEAR: old_belnr.
CLEAR doc_key.

LOOP AT xoutput.
IF onlycorr = 'X'.
CHECK xoutput-corrupt ='X'.
ENDIF.
MOVE-CORRESPONDING xoutput TO doc_key.

ULINE.
IF xoutput-corrupt ='X'.
FORMAT COLOR COL_NEGATIVE.
WRITE: / 'Tax Group TXGRP in table BSET seems to be wrong'.
WRITE: '- Please check'.
FORMAT COLOR COL_NORMAL.
ENDIF.

* write bset
PERFORM write_output_bset USING doc_key-bukrs
doc_key-belnr
doc_key-gjahr.

ENDLOOP.

ENDFORM. "write_output_documents
*&---------------------------------------------------------------------*
*& Form write_output_bset
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_DOC_KEY text
*----------------------------------------------------------------------*
FORM write_output_bset USING p_bukrs
p_belnr
p_gjahr.

DATA: old_txgrp LIKE bset-txgrp,


old_taxps LIKE bset-taxps. "2012-03-28
CLEAR old_txgrp.

LOOP AT bset_output
WHERE bukrs = p_bukrs
AND belnr = p_belnr
AND gjahr = p_gjahr.

IF bset_det IS INITIAL.
* only first occurence of each txgrp
CHECK bset_output-txgrp NE old_txgrp
OR bset_output-taxps NE old_taxps. "2012-03-28
old_txgrp = bset_output-txgrp.
old_taxps = bset_output-taxps. "2012-03-28
ENDIF.
* write bset

FORMAT COLOR COL_TOTAL.


WRITE: /(7) bset_output-status.
FORMAT COLOR COL_NORMAL.

WRITE: (5) bset_output-bukrs,


(10) bset_output-belnr,
(6) bset_output-gjahr,
(3) bset_output-buzei.

* begin of 2012-01-23
IF bset_output-status = 'NEW'.
FORMAT COLOR COL_POSITIVE.
ELSE.
FORMAT COLOR COL_NEGATIVE.
ENDIF.
* end of 2012-01-13

WRITE: (3) bset_output-txgrp.


WRITE: (6) bset_output-taxps. "2012-03-28
FORMAT COLOR COL_NORMAL.

WRITE: (1) bset_output-shkzg,


(2) bset_output-mwskz,
(11) bset_output-txjcd,
(3) bset_output-txjlv.

IF bset_det = 'X'.
WRITE: (15) bset_output-fwste,
(15) bset_output-fwbas,
(3) bset_output-ktosl,
(4) bset_output-kschl.
ENDIF.

ENDLOOP.

ENDFORM. " write_output_bset

*&---------------------------------------------------------------------*
*& Form set_txgrp_in_bset
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_txgrp_in_bset.
DATA: l_txgrp TYPE txgrp,
v_mwskz TYPE mwskz,
v_kschl TYPE kschl,
v_txjdp TYPE txjcd.
DATA: last_txgrp TYPE txgrp.

DATA: BEGIN OF modlines OCCURS 0,


buzei_bset LIKE bset-buzei,
buzei_bseg LIKE bseg-buzei,
txgrp LIKE bset-txgrp,
END OF modlines.
DATA: l_manual_tax_lines_in_bseg TYPE i,
l_manual_tax_lines_in_bset TYPE i,
i_loop TYPE i.
DATA: l_bset_compressed,
l_bseg_compressed,
d_manual.

CLEAR: l_txgrp,
v_mwskz,
v_kschl.
CLEAR: xcorrupt,
bseg_xauto_corrupt. "26.6.2006
CALL FUNCTION 'CHECK_JURISDICTION_ACTIVE'
EXPORTING
i_bukrs = xbkpf-bukrs
IMPORTING
e_external = e_external
e_xtxit = e_linewise.

IF e_linewise IS INITIAL
AND linewise IS INITIAL. "2016-03-18

* check bseg-xauto in tax line items "26.6.2006


PERFORM set_xauto. "26.6.2006

*----------------------------------------------------------------------
* here no linewise tax calculation
*----------------------------------------------------------------------
* check first whether manual tax line items
* have been compressed in BSET and/or BSEG
* count manual tax line items in BSEG
* see U6B/800 doc 5100003578/001/2205 but which is corrected now
CLEAR: l_manual_tax_lines_in_bseg,
l_manual_tax_lines_in_bset.
LOOP AT ybseg WHERE NOT mwskz IS INITIAL
AND NOT mwart IS INITIAL
AND xauto IS INITIAL.
ADD 1 TO l_manual_tax_lines_in_bseg.
ENDLOOP.
IF l_manual_tax_lines_in_bseg GT 0.
* manual tax line items in bset can have txjlv = D;
* but this is probably not always the case, such as SD;
* but it is the case for FI and MM
LOOP AT ybset WHERE txjlv = 'D'.
d_manual = 'X'.
ADD 1 TO l_manual_tax_lines_in_bset.
ENDLOOP.
ENDIF.

IF l_manual_tax_lines_in_bseg GT 0
AND l_manual_tax_lines_in_bset GT 0.
IF l_manual_tax_lines_in_bseg GT l_manual_tax_lines_in_bset.
l_bset_compressed = 'X'.
ELSEIF l_manual_tax_lines_in_bseg LT l_manual_tax_lines_in_bset.
l_bseg_compressed = 'X'.
ENDIF.
ENDIF.

LOOP AT ybset.
IF d_manual = 'X'. "manual tax line item have txjlv = D
CHECK ybset-txjlv = 'D'.
ENDIF.
* manual tax line item come first in bset.
CLEAR i_loop.
LOOP AT ybseg WHERE mwskz = ybset-mwskz
AND txjcd = ybset-txjdp
AND ktosl = ybset-ktosl
AND shkzg = ybset-shkzg
AND NOT mwart IS INITIAL
AND xauto IS INITIAL.
READ TABLE modlines WITH KEY buzei_bseg = ybseg-buzei.
IF l_bseg_compressed IS INITIAL.
CHECK sy-subrc NE 0. "each bseg only one time
ELSE.
IF sy-subrc IS INITIAL.
* bseg more than one time as bseg is compressed
* but the same taxgrp in bset
ADD 1 TO i_loop.
ENDIF.
ENDIF.
ADD 1 TO i_loop.

IF l_bset_compressed IS INITIAL
AND l_bseg_compressed IS INITIAL
OR i_loop = 1.
ADD 1 TO l_txgrp.
ENDIF.
IF l_txgrp NE ybset-txgrp.
ybset-txgrp = l_txgrp.
xcorrupt = 'X'.
MODIFY ybset.
ENDIF.
* store lines already processed
modlines-buzei_bset = ybset-buzei.
modlines-buzei_bseg = ybseg-buzei.
modlines-txgrp = ybset-txgrp.
APPEND modlines.
IF l_bset_compressed IS INITIAL.
EXIT. "only once
ENDIF.
ENDLOOP.
ENDLOOP.

* store last txgrp in modlines


CLEAR last_txgrp.
LOOP AT modlines.
last_txgrp = modlines-txgrp.
ENDLOOP.

l_txgrp = last_txgrp.

LOOP AT ybset.

* begin of change 2013-06-10


* taxps must be initial anyway
IF NOT ybset-taxps IS INITIAL.
CLEAR ybset-taxps.
xcorrupt = 'X'.
MODIFY ybset TRANSPORTING taxps.
ENDIF.
* end of change 2013-06-10

READ TABLE modlines WITH KEY buzei_bset = ybset-buzei.


CHECK sy-subrc NE 0.

IF ybset-mwskz NE v_mwskz
OR ybset-txjdp NE v_txjdp.
l_txgrp = l_txgrp + 1.
ENDIF.
* replace txgrp
IF ybset-txgrp NE l_txgrp.
xcorrupt = 'X'.
ybset-txgrp = l_txgrp.
MODIFY ybset TRANSPORTING txgrp.
ENDIF.

v_mwskz = ybset-mwskz.
v_kschl = ybset-kschl.
v_txjdp = ybset-txjdp.

ENDLOOP.

ELSE.
*----------------------------------------------------------------------
* here linewise tax calculation
*----------------------------------------------------------------------
IF NOT e_jurcode_active IS INITIAL. "2016-03-18

LOOP AT ybset.
* Allow offset in txgrp in table bset
* this means txgrp need not start with '001'

* first entry in bset: store mwskz and kschl


IF ybset-txjlv = 1
AND v_mwskz IS INITIAL
AND v_kschl IS INITIAL.
v_mwskz = ybset-mwskz.
v_kschl = ybset-kschl.

l_txgrp = l_txgrp + 1.

IF NOT p_offset_allowed IS INITIAL. "2012-03-30


* Allow offset in txgrp in table bset March 4,2004
* this means txgrp need not start with '001' March 4,2004
IF ybset-txgrp NE '001' "March 4,2004
AND ybset-txgrp NE '000'. "March 4,2004
l_txgrp = ybset-txgrp. "March 4,2004
ENDIF. "March 4,2004
ENDIF. "2012-03-30

* same mwskz and same kschl


ELSEIF ybset-txjlv = 1
AND ybset-mwskz = v_mwskz
AND ybset-kschl = v_kschl.

l_txgrp = l_txgrp + 1.

* different mwskz
ELSEIF ybset-txjlv = 1
AND ybset-mwskz NE v_mwskz.

v_mwskz = ybset-mwskz.
v_kschl = ybset-kschl.

l_txgrp = l_txgrp + 1.

ENDIF.
* replace txgrp
IF ybset-txgrp NE l_txgrp
OR ybset-taxps NE l_txgrp. "2012-03-28
xcorrupt = 'X'.
ybset-txgrp = l_txgrp.
ybset-taxps = l_txgrp. "2012-03-28
MODIFY ybset.
ENDIF.
ENDLOOP.

* begin of 2016-03-18
ELSE.
* here linewise is active
* but without jurisdiction code and levels
PERFORM set_txgrp_linewise_no_jurcod.

ENDIF.
* end of 2016-03-18

ENDIF.

ENDFORM. " set_txgrp_in_bset


*&---------------------------------------------------------------------*
*& Form set_xauto
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_xauto.
* new 26.6.2006
* check whether xauto = space is correct in bseg tax line items
DATA: zbseg LIKE bseg OCCURS 0 WITH HEADER LINE.
DATA: l_set_xauto.
DATA: i_mwskz TYPE i.
DATA: gl_found.
DATA: l_txjcd TYPE txjcd.

zbseg[] = ybseg[].

CLEAR: i_mwskz.
CLEAR: bseg_xauto_corrupt.
CLEAR: l_txjcd.

* xauto = space means manual tax line item


* is xauto correct ?
*------------------------------------------------------------------
* read bset-txjdp
LOOP AT ybseg WHERE NOT mwskz IS INITIAL
AND NOT mwart IS INITIAL
AND xauto IS INITIAL.
CLEAR i_mwskz.
CLEAR l_set_xauto.
LOOP AT ybset WHERE mwskz = ybseg-mwskz
AND txjdp = ybseg-txjcd.
IF ybseg-ktosl NE space
AND ybset-ktosl NE ybseg-ktosl.
* tax code has more then one condition
* which means tax line in bseg cannot be manual
l_set_xauto = 'X'.
EXIT.
ENDIF.

i_mwskz = i_mwskz + 1.

ENDLOOP.

IF l_set_xauto = 'X'.
bseg_xauto_corrupt = 'X'.
ybseg-xauto = 'X'.
MODIFY ybseg.
CONTINUE. "July 25, 2006
ENDIF.

CLEAR gl_found.
IF i_mwskz = 1.
* only one item in bset: check whether expense line in bseg
LOOP AT zbseg WHERE mwskz = ybseg-mwskz
AND txjcd = ybseg-txjcd
AND mwart IS INITIAL.
CHECK zbseg-koart NE 'K' AND zbseg-koart NE 'D'
* intercompany clearing accounts as vendor/customer
OR zbseg-koart CA 'DK' AND zbseg-ktosl = 'BUV'.
gl_found = 'X'.
EXIT.
ENDLOOP.
IF gl_found = 'X'.
* there is an expense line: tax line must be automatic
bseg_xauto_corrupt = 'X'.
ybseg-xauto = 'X'.
MODIFY ybseg.
CONTINUE. "July 25, 2006
ENDIF.
ENDIF.
*-------------------------------------------------------------------
* read bset-txjcd
CLEAR: l_txjcd.
CLEAR: i_mwskz.
CLEAR: l_set_xauto.
LOOP AT ybset WHERE mwskz = ybseg-mwskz
AND txjcd = ybseg-txjcd.
IF ybseg-ktosl NE space
AND ybset-ktosl NE ybseg-ktosl.
* tax code has more then one condition
* which means tax line in bseg cannot be manual
l_set_xauto = 'X'.
EXIT.
ENDIF.

i_mwskz = i_mwskz + 1.
l_txjcd = ybset-txjdp. "Store txjdp

ENDLOOP.

IF l_set_xauto = 'X'.
bseg_xauto_corrupt = 'X'.
ybseg-xauto = 'X'.
MODIFY ybseg.
CONTINUE. "July 25, 2006
ENDIF.

CLEAR gl_found.
IF i_mwskz = 1.
* only one item in bset: check whether expense line in bseg
LOOP AT zbseg WHERE mwskz = ybseg-mwskz
AND txjcd = l_txjcd "/read with txjdp
AND mwart IS INITIAL.
CHECK zbseg-koart NE 'K' AND zbseg-koart NE 'D'
* intercompany clearing accounts as vendor/customer
OR zbseg-koart CA 'DK' AND zbseg-ktosl = 'BUV'.
gl_found = 'X'.
EXIT.
ENDLOOP.
IF gl_found = 'X'.
* there is an expense line: tax line must be automatic
bseg_xauto_corrupt = 'X'.
ybseg-xauto = 'X'.
MODIFY ybseg.
CONTINUE. "July 25, 2006
ENDIF.
ENDIF.

ENDLOOP.

ENDFORM. " set_xauto


*&---------------------------------------------------------------------*
*& Form SET_TXGRP_LINEWISE_NO_JURCOD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_txgrp_linewise_no_jurcod .
* new with 2016-03-18
DATA: l_txgrp TYPE txgrp,
l_wrbtr TYPE bseg-wrbtr.

CLEAR: l_txgrp.
CLEAR: xcorrupt.

FIELD-SYMBOLS: <bset1> TYPE bset,


<bset2> TYPE bset.

DATA: lt_mwdat LIKE rtax1u15 OCCURS 10 WITH HEADER LINE.

DATA: old_mwskz TYPE mwskz.


DATA: kschl_first TYPE kschl,
kschl_last TYPE kschl.

DATA: last_tabix TYPE i,


start TYPE i.

* it is assumed that BSET is correctly sorted


* this means in the same order as BSEG
* and for each tax code according to the order in FTXP

LOOP AT ybset ASSIGNING <bset1>


WHERE mwskz NE old_mwskz.
* look for different tax codes

IF <bset1>-mwskz NE old_mwskz.
* call CALCULATE_TAX_FROM_NET_AMOUNT to get active conditions
* depends on date and data in bseg item ????
MOVE <bset1>-fwbas TO l_wrbtr.

CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'


EXPORTING
i_bukrs = l_t001-bukrs
i_mwskz = <bset1>-mwskz
i_txjcd = <bset1>-txjdp
i_waers = xbkpf-waers
i_wrbtr = l_wrbtr
i_prsdt = xbkpf-budat
TABLES
t_mwdat = lt_mwdat
EXCEPTIONS
OTHERS = 13.

IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

old_mwskz = <bset1>-mwskz.

* store 1st and last kschl


CLEAR: kschl_first.
LOOP AT lt_mwdat.
IF kschl_first IS INITIAL.
kschl_first = lt_mwdat-kschl.
ENDIF.
kschl_last = lt_mwdat-kschl. "may not be used
ENDLOOP.

ENDIF.

*-----------------------------------------------------------
start = last_tabix + 1.
LOOP AT ybset ASSIGNING <bset2> FROM start.
* anyway avoid multiple-processing of the same entry
CHECK sy-tabix GT last_tabix.

IF <bset2>-mwskz NE <bset1>-mwskz.
* stop when mwskz changes and return to outer loop
EXIT.
ENDIF.
* only store now index
last_tabix = sy-tabix.

IF <bset2>-kschl = kschl_first.
* next group = 1st kschl of the tax code -> next txgrp
l_txgrp = l_txgrp + 1.
ENDIF.
* REPLACE txgrp
IF <bset2>-txgrp NE l_txgrp
OR <bset2>-taxps NE l_txgrp.
xcorrupt = 'X'.
<bset2>-txgrp = l_txgrp.
<bset2>-taxps = l_txgrp.
ENDIF.
ENDLOOP. "bset2
*------------------------------------------------------------

ENDLOOP. "bset1

ENDFORM. " SET_TXGRP_LINEWISE_NO_JURCOD

Das könnte Ihnen auch gefallen