Beruflich Dokumente
Kultur Dokumente
* 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
* 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.
END OF bset_output.
DATA: e_external,
e_linewise.
*--------------------------------------------------------------------
* 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
*----------------------------------------------------------------
* 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.
* 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.
ENDIF.
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.
ENDSELECT.
LOOP AT xbkpf.
CLEAR: xcorrupt,
bseg_xauto_corrupt.
docs_checked = docs_checked + 1.
* 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
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.
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
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.
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
* 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
IF bset_det = 'X'.
WRITE: (15) bset_output-fwste,
(15) bset_output-fwbas,
(3) bset_output-ktosl,
(4) bset_output-kschl.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& 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.
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
*----------------------------------------------------------------------
* 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.
l_txgrp = last_txgrp.
LOOP AT ybset.
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'
l_txgrp = l_txgrp + 1.
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.
zbseg[] = ybseg[].
CLEAR: i_mwskz.
CLEAR: bseg_xauto_corrupt.
CLEAR: l_txjcd.
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.
CLEAR: l_txgrp.
CLEAR: xcorrupt.
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.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
old_mwskz = <bset1>-mwskz.
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