Files
ABAP-Indexing/wiki/programs/ZFIR0140.md
T

3059 lines
148 KiB
Markdown

---
type: abap-program
title: "ZFIR0140 — [FI] 매출 세금계산서 발행"
description: "매출채권(BSID/BSAD)과 매출 전표(BKPF/BSEG/BSET), SD 청구(VBRK)를 논리DB(GET BSID/BKPF/BSEG)로 읽어 매출 세금계산서 발행 대상을 선별하는 프로그램이다. 합산계산서(COLLECTIVE)와 개별계산서(INDIVIDUAL) 방식을 지원하고, 세금 데이터와 고객 주소를 붙여 ALV 로 보여준 뒤 실제 출력·전송은 ZFIR0141 에 위임한다. 전자세금계산서 전환(2006) 이후 ZDTI_* 상태 테이블로 발행 상태를 관리한다."
resource: "abap://ZFIR0140"
tags: ["세금계산서", "전자세금계산서", "매출", "부가세", "채권관리", "FI", "세액", "공급가액", "차대구분", "순액", "부호반전", "고객수집", "세금라인", "임시전표", "매출전표", "전표헤더", "회사코드", "전표유형", "자동세금계산", "세금코드"]
generated: { by: "abap-indexing/z-ai/glm-5.2:free", at: "2026-09-20T15:36:22+00:00" }
status: stable
x-package:
x-changed-on:
x-tables-read: ["BKPF", "BSAD", "BSEC", "BSEG", "BSET", "J_1BBRANCH", "KNA1", "RBKP", "T001", "T003", "T074U", "VBKPF", "VBRK", "VBSEGD", "VBSEGS", "ZDTI_SAPP", "ZDTI_STATUS"]
x-tables-write: ["AUSGLOP_ITAB", "GT_AUSGLOP", "GT_KUNDE", "SEL_AUSGLOP_ITAB"]
x-calls: ["DYNP_VALUES_UPDATE", "FB03", "FI_PERIOD_DETERMINE", "HELP_VALUES_GET_WITH_TABLE_EXT", "KR_USER_EXIT_ROUNDOFF", "KR_USER_EXIT_TAX_CODE", "NUMBER_GET_NEXT", "REUSE_ALV_COMMENTARY_WRITE", "REUSE_ALV_EVENTS_GET", "REUSE_ALV_FIELDCATALOG_MERGE", "REUSE_ALV_HIERSEQ_LIST_DISPLAY", "REUSE_ALV_VARIANT_DEFAULT_GET", "REUSE_ALV_VARIANT_EXISTENCE", "REUSE_ALV_VARIANT_F4", "ZFIR0141", "Z_SB_TAX_CAL"]
x-code-hash: "ef875a229ba3c4a355668341b70f07c0fcb07bce602483bc6f97c13e45519f94"
x-unit-count: 47
x-chunk-count: 51
x-declaration-count: 127
---
## 업무 목적
매출채권(BSID/BSAD)과 매출 전표(BKPF/BSEG/BSET), SD 청구(VBRK)를 논리DB(GET BSID/BKPF/BSEG)로 읽어 매출 세금계산서 발행 대상을 선별하는 프로그램이다. 합산계산서(COLLECTIVE)와 개별계산서(INDIVIDUAL) 방식을 지원하고, 세금 데이터와 고객 주소를 붙여 ALV 로 보여준 뒤 실제 출력·전송은 ZFIR0141 에 위임한다. 전자세금계산서 전환(2006) 이후 ZDTI_* 상태 테이블로 발행 상태를 관리한다.
## 주 흐름
1. ALV 변형을 초기화하고 선택화면을 준비한다 (VARIANT_INIT → F4_FOR_VARIANT)
2. 회사코드와 전표유형 입력값을 검증한다 (CHECK_BUKRS → CHECK_DOC_TYPE)
3. 논리DB 로 매출채권(GET BSID)·전표헤더(GET BKPF)·아이템(GET BSEG)을 순차 읽는다
4. 세금코드 유효성을 확인하고 아이템 선택을 정리한다 (CHECK_MWSKZ → CLEAR_ITEM_SELECTION)
5. 전자세금계산서 발행 상태를 확인한다 (DTI_CHECK)
6. 세금 데이터와 고객 주소를 보강한다 (GET_TAX_DATA → GET_CUSTOMER_ADDRESS)
7. 합산/개별 계산서 방식으로 발행 번호를 부여한다 (COLLECTIVE_INVOICES / INDIVIDUAL_INVOICES → GET_TAX_INVOICE_NUMBER)
8. ALV 레이아웃을 구성해 출력하고 사용자 액션을 처리한다 (BUILD_UP_ALV_LAYOUT → USER_COMMAND, 400줄)
9. 실제 세금계산서 출력·전송은 ZFIR0141 을 호출한다
## 핵심 내부테이블
- `AUSGLOP_ITAB` — 세금계산서 발행 대상 미결/반제 항목 (채움: GET BSID, GET BKPF / 소비: CLEAR_ITEM_SELECTION, GET_TAX_DATA)
- `GT_KUNDE` — 고객 주소·사업자정보 (채움: GET_CUSTOMER_ADDRESS / 소비: BUILD_UP_ALV_LAYOUT)
## 테이블 / 외부 호출
- read: BKPF, BSAD, BSEC, BSEG, BSET, J_1BBRANCH, KNA1, RBKP, T001, T003, T074U, VBKPF, VBRK, VBSEGD, VBSEGS, ZDTI_SAPP, ZDTI_STATUS
- write: AUSGLOP_ITAB, GT_AUSGLOP, GT_KUNDE, SEL_AUSGLOP_ITAB
- 외부 호출: DYNP_VALUES_UPDATE, FB03, FI_PERIOD_DETERMINE, HELP_VALUES_GET_WITH_TABLE_EXT, KR_USER_EXIT_ROUNDOFF, KR_USER_EXIT_TAX_CODE, NUMBER_GET_NEXT, REUSE_ALV_COMMENTARY_WRITE, REUSE_ALV_EVENTS_GET, REUSE_ALV_FIELDCATALOG_MERGE, REUSE_ALV_HIERSEQ_LIST_DISPLAY, REUSE_ALV_VARIANT_DEFAULT_GET, REUSE_ALV_VARIANT_EXISTENCE, REUSE_ALV_VARIANT_F4, ZFIR0141, Z_SB_TAX_CAL
## 로직 조각 (51건 / unit 26개)
LLM 이 코드에서 골라낸 업무 로직 단위다. **조각마다 소스 원문과 자연어 설명을 함께 싣는다** — 설명이 코드와 맞는지 바로 대조할 수 있어야 하기 때문이다.
테이블·호출은 LLM 이 쓴 값이 아니라 파서가 조각 범위에서 다시 뽑은 사실이다. 순서는 실행 순서다.
### EVENT INITIALIZATION — `ZFIR0140` L167-L218 (52줄)
*INITIALIZATION 에서 계층 ALV 의 헤더/아이템 테이블명과 키정보(KUNNR/BELNR)를 정의하고 REUSE_ALV_VARIANT_DEFAULT_GET 으로 기본 변형을 P_VARI 에 제안한다.*
> 이 unit 의 조각 1개가 28/52줄(54%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [other] 계층 ALV 의 헤더(GT_KUNDE)-아이템(GT_AUSGLOP) 테이블명과 연결 키(KUNNR, BELNR)를 GS_KEYINFO 에 정의하고 변형 저장 옵션(G_SAVE='A')을 둔 뒤 REUSE_ALV_VARIANT_DEFAULT_GET 으로 사용자 기본 ALV 변형을 P_VARI 에 제안한다.
```abap
189| G_REPID = SY-REPID.
190| G_TABNAME_HEADER = 'GT_KUNDE'.
191| G_TABNAME_ITEM = 'GT_AUSGLOP'.
192|
193| * define keyinfo
194| CLEAR GS_KEYINFO.
195| GS_KEYINFO-HEADER01 = 'KUNNR'.
196| GS_KEYINFO-ITEM01 = 'KUNNR'.
197|
198| GS_KEYINFO-HEADER02 = SPACE.
199| GS_KEYINFO-ITEM02 = 'BELNR'.
200|
201| * set Options: save variants userspecific or general
202| G_SAVE = 'A'.
203| PERFORM VARIANT_INIT.
204|
205| * get default variant
206| GX_VARIANT = G_VARIANT.
207| CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
208| EXPORTING
209| I_SAVE = G_SAVE
210| CHANGING
211| CS_VARIANT = GX_VARIANT
212| EXCEPTIONS
213| NOT_FOUND = 2.
214| IF SY-SUBRC = 0.
215| P_VARI = GX_VARIANT-VARIANT.
216| ENDIF.
```
- **EN**: Define the hierarchical ALV header/item table names and key linkage (KUNNR, BELNR) in GS_KEYINFO, set the variant save mode, and propose the user's default ALV layout variant via REUSE_ALV_VARIANT_DEFAULT_GET.
- 호출(파서): VARIANT_INIT, REUSE_ALV_VARIANT_DEFAULT_GET
- SAP 객체: REUSE_ALV_VARIANT_DEFAULT_GET
- 업무 키워드: 계층 ALV 키정보, 고객-전표 연결, ALV 기본 변형, 초기화
- English: Hierarchical ALV, Key Info, ALV Variant, REUSE_ALV_VARIANT_DEFAULT_GET
- 정의부(복사 시 함께 필요): [`G_REPID`](#decl-zfir0140top-276-g_repid), [`G_TABNAME_HEADER`](#decl-zfir0140-133-g_tabname_header), [`G_TABNAME_ITEM`](#decl-zfir0140-134-g_tabname_item), [`GS_KEYINFO`](#decl-zfir0140top-248-gs_keyinfo), [`G_SAVE`](#decl-zfir0140-132-g_save), [`GX_VARIANT`](#decl-zfir0140-137-gx_variant), [`G_VARIANT`](#decl-zfir0140-138-g_variant), [`P_VARI`](#decl-zfir0140-115-p_vari)
- 위치: `abap://ZFIR0140/ZFIR0140#L189-L216` · confidence 0.7 · `ZFIR0140#ZFIR0140#EVENT#INITIALIZATION#C1`
### FORM CHECK_BUKRS — `ZFIR0140` L1661-L1667 (7줄)
*회사코드(DD_BUKRS-LOW)가 비어 있으면 오류 메시지 E501 을 내는 필수 입력 검증 FORM 이다.*
> 이 unit 의 조각 1개가 3/7줄(43%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 선택화면의 회사코드가 입력되지 않았으면 오류 메시지 E501 로 실행을 막는다.
```abap
1663| IF DD_BUKRS-LOW IS INITIAL.
1664| MESSAGE E501.
1665| ENDIF.
```
- **EN**: Raise error message E501 when no company code has been entered on the selection screen.
- 업무 키워드: 회사코드, 필수 입력 검증, 오류 메시지
- English: Company Code, Mandatory Check, Error Message
- 선언을 못 찾은 이름: DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L1663-L1665` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#CHECK_BUKRS#C1`
### EVENT AT SELECTION-SCREEN ON SBLART — `ZFIR0140` L239-L316 (78줄)
*전표유형 입력 시 유효성을 검증하고 세금코드·전표유형·사업장·회사코드 선택값을 KR_USER_EXIT_TAX_CODE 에 넘긴 뒤 SD/FI 선택 조건 입력 여부로 SD_SELECTION/FI_SELECTION 플래그를 결정한다.*
> 이 unit 의 조각 2개가 59/78줄(76%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] 전표유형(T003) 검증 후 세금코드·전표유형·사업장·회사코드 선택옵션을 작업 테이블로 옮겨 한국 세금계산서 User-Exit KR_USER_EXIT_TAX_CODE 로 사용자·상태별 세금코드 보정을 수행한다.
```abap
240| PERFORM CHECK_DOC_TYPE.
241|
242| LOOP AT SMWSKZ.
243| MOVE-CORRESPONDING SMWSKZ TO TAX_CODE.
244| ENDLOOP.
245|
246| LOOP AT PBLART.
247| MOVE-CORRESPONDING PBLART TO BLART.
248| ENDLOOP.
249|
250| LOOP AT SBUPLA.
251| MOVE-CORRESPONDING SBUPLA TO BUPLA.
252| ENDLOOP.
253|
254| LOOP AT DD_BUKRS.
255| MOVE-CORRESPONDING DD_BUKRS TO BUKRS.
256| ENDLOOP.
257|
258| CALL FUNCTION 'KR_USER_EXIT_TAX_CODE'
259| EXPORTING
260| YUSNAM = SY-UNAME
261| YSTA1 = STA1
262| TABLES
263| YTAXCODE = TAX_CODE
264| YPBLART = BLART
265| YBUPLA = BUPLA
266| YBUKRS = BUKRS.
```
- **EN**: Validate the document type, copy the tax code, document type, business place and company code select-options into work tables and call the Korean user exit KR_USER_EXIT_TAX_CODE to adjust tax codes by user and status.
- 호출(파서): CHECK_DOC_TYPE, KR_USER_EXIT_TAX_CODE
- SAP 객체: KR_USER_EXIT_TAX_CODE, T003
- 업무 키워드: 전표유형 검증, 세금코드, User-Exit, 사업장, 선택옵션
- English: Document Type, Tax Code, User Exit, Business Place
- 정의부(복사 시 함께 필요): [`SMWSKZ`](#decl-zfir0140-47-smwskz), [`CODE`](#decl-zfir0140top-281-code), [`TAX_CODE`](#decl-zfir0140top-288-tax_code), [`PBLART`](#decl-zfir0140-49-pblart), [`BLART`](#decl-zfir0140top-289-blart), [`SBUPLA`](#decl-zfir0140-46-sbupla), [`BUPLA`](#decl-zfir0140top-290-bupla), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`STA1`](#decl-zfir0140-88-sta1)
- 선언을 못 찾은 이름: DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L240-L266` · confidence 0.85 · `ZFIR0140#ZFIR0140#EVENT#AT_SELECTION-SCREEN_ON_SBLART#C1`
#### [control_flow] 청구번호(SVBELN)·청구유형(SFKART)·청구일(SFKDAT) 조건이 입력되면 SD_SELECTION 을, 회계전표번호(SBELNR)·전표일(SBDAT) 조건이 입력되면 FI_SELECTION 을 설정해 이후 선별 방식(SD/FI)을 결정한다.
```abap
271| CLEAR SD_SELECTION.
272| CLEAR FI_SELECTION.
273|
274| DESCRIBE TABLE SVBELN LINES LINE_COUNT_SD. "billing document
275| IF LINE_COUNT_SD > 0. "selection internal
276| SD_SELECTION = 'X'. "table not empty
277| ENDIF.
278|
279| DESCRIBE TABLE SFKART LINES LINE_COUNT_SD. "billing document type
280| IF LINE_COUNT_SD > 0. "selection internal
281| SD_SELECTION = 'X'. "table not empty
282| ENDIF.
283|
284| DESCRIBE TABLE SFKDAT LINES
285| LINE_COUNT_SD. "billing date selection
286| IF LINE_COUNT_SD > 0. "internal table not
287| SD_SELECTION = 'X'. "empty
288| ENDIF.
289|
290| * set fi_selection flag if fi-document or accounting document
291| * date selection cases not empty.
292|
293| DESCRIBE TABLE SBELNR LINES
294| LINE_COUNT_FI. "accounting document
295| IF LINE_COUNT_FI > 0. "selection internal
296| FI_SELECTION = 'X'. "table not empty
297| ENDIF.
298|
299| DESCRIBE TABLE SBDAT LINES LINE_COUNT_FI. "accounting document date
300| IF LINE_COUNT_FI > 0. "selection internal
301| FI_SELECTION = 'X'. "table not empty
302| ENDIF.
```
- **EN**: Set SD_SELECTION when billing document, billing type or billing date selections are filled, and FI_SELECTION when accounting document number or document date selections are filled, to steer the later item selection.
- 업무 키워드: SD 선택조건, FI 선택조건, 청구전표, 회계전표, 선별 방식
- English: Billing Document, Accounting Document, Selection Flag, Select-Option
- 정의부(복사 시 함께 필요): [`SD_SELECTION`](#decl-zfir0140top-45-sd_selection), [`FI_SELECTION`](#decl-zfir0140top-47-fi_selection), [`SVBELN`](#decl-zfir0140-64-svbeln), [`LINE_COUNT_SD`](#decl-zfir0140top-41-line_count_sd), [`SFKART`](#decl-zfir0140-65-sfkart), [`SFKDAT`](#decl-zfir0140-66-sfkdat), [`SBELNR`](#decl-zfir0140-57-sbelnr), [`LINE_COUNT_FI`](#decl-zfir0140top-42-line_count_fi), [`SBDAT`](#decl-zfir0140-58-sbdat)
- 위치: `abap://ZFIR0140/ZFIR0140#L271-L302` · confidence 0.85 · `ZFIR0140#ZFIR0140#EVENT#AT_SELECTION-SCREEN_ON_SBLART#C2`
### FORM CHECK_DOC_TYPE — `ZFIR0140` L2123-L2130 (8줄)
*세금계산서 전표유형(SBLART)이 T003 에 존재하고 번호범위(NUMKR)가 지정되어 있는지 검증해 없으면 E098 오류를 낸다.*
> 이 unit 의 조각 1개가 4/8줄(50%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 입력된 전표유형이 T003 에 없거나 번호범위(NUMKR)가 비어 있으면 세금계산서 채번이 불가능하므로 오류 메시지 E098 을 낸다.
```abap
2125| SELECT SINGLE * FROM T003 WHERE BLART = SBLART.
2126| IF SY-SUBRC NE 0 OR T003-NUMKR = ' ' .
2127| MESSAGE E098.
2128| ENDIF.
```
- **EN**: Check that the entered document type exists in T003 with a number range (NUMKR) assigned, since it is used for tax invoice numbering; otherwise raise E098.
- 테이블(파서): read [T003](/tables/T003.md) / write -
- SAP 객체: T003
- 업무 키워드: 전표유형 검증, 번호범위, 세금계산서 채번, 오류 메시지
- English: Document Type, T003, Number Range, Validation
- 정의부(복사 시 함께 필요): [`T003`](#decl-zfir0140top-23-t003), [`CODE`](#decl-zfir0140top-281-code), [`BLART`](#decl-zfir0140top-289-blart), [`SBLART`](#decl-zfir0140-74-sblart)
- 위치: `abap://ZFIR0140/ZFIR0140#L2125-L2128` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#CHECK_DOC_TYPE#C1`
### EVENT START-OF-SELECTION — `ZFIR0140` L317-L327 (11줄)
*START-OF-SELECTION 에서 회사코드의 현지통화(T001-WAERS)를 CURR 에 읽어 이후 논리DB 처리에 사용한다.*
> 이 unit 의 조각 1개가 1/11줄(9%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 회사코드(T001)의 현지통화 WAERS 를 CURR 에 읽어 발행 항목의 통화 기본값으로 사용한다.
```abap
326| SELECT SINGLE WAERS FROM T001 INTO CURR WHERE BUKRS = BSID-BUKRS.
```
- **EN**: Read the company code local currency (T001-WAERS) into CURR as the default currency for candidate items.
- 테이블(파서): read [T001](/tables/T001.md) / write -
- SAP 객체: T001
- 업무 키워드: 현지통화, 회사코드, 통화 기본값
- English: Local Currency, Company Code, T001
- 정의부(복사 시 함께 필요): [`T001`](#decl-zfir0140top-14-t001), [`CURR`](#decl-zfir0140top-226-curr), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`BSID`](#decl-zfir0140top-9-bsid)
- 위치: `abap://ZFIR0140/ZFIR0140#L326-L326` · confidence 0.75 · `ZFIR0140#ZFIR0140#EVENT#START-OF-SELECTION#C1`
### EVENT GET BSID — `ZFIR0140` L328-L353 (26줄)
*논리DB GET BSID 이벤트에서 사업영역·세금코드·미반제 조건을 통과한 미결 매출채권 항목의 키 필드를 발행 후보 AUSGLOP_ITAB 에 채운다.*
> 이 unit 의 조각 1개가 21/26줄(81%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 미결 매출채권(BSID) 중 사업영역·전표일·사업장 선택조건에 맞고 세금코드가 있으며 아직 반제되지 않은(AUGBL 없음) 항목만 회사코드·고객·전표번호·일자·사업장·특별G/L·계정을 AUSGLOP_ITAB 에 옮긴다.
```abap
330| CHECK BSID-GSBER IN SBAREA.
331| CHECK BSID-MWSKZ NE ' ' .
332| CHECK SBDAT.
333| CHECK SBUPLA. "check selection parameters
334| CHECK BSID-AUGBL IS INITIAL.
335| CLEAR AUSGLOP_ITAB.
336| * SELECT SINGLE * FROM t001 WHERE bukrs = bsid-bukrs.
337| * MOVE t001-waers TO ausglop_itab-hwaer.
338| MOVE CURR TO AUSGLOP_ITAB-WAERS.
339| MOVE BSID-WAERS TO AUSGLOP_ITAB-WAERS.
340| MOVE BSID-BUKRS TO AUSGLOP_ITAB-BUKRS.
341| MOVE BSID-KUNNR TO AUSGLOP_ITAB-KUNNR.
342| MOVE BSID-GJAHR TO AUSGLOP_ITAB-GJAHR.
343| MOVE BSID-GSBER TO AUSGLOP_ITAB-GSBER.
344| MOVE BSID-BELNR TO AUSGLOP_ITAB-BELNR.
345| MOVE BSID-BUDAT TO AUSGLOP_ITAB-BUDAT.
346| MOVE BSID-BLDAT TO AUSGLOP_ITAB-BLDAT.
347| MOVE BSID-BUZEI TO AUSGLOP_ITAB-BUZEI.
348| MOVE BSID-BUPLA TO AUSGLOP_ITAB-BUPLA.
349| MOVE BSID-UMSKZ TO AUSGLOP_ITAB-UMSKZ.
350| MOVE BSID-HKONT TO AUSGLOP_ITAB-HKONT.
```
- **EN**: Accept open customer items (BSID) matching business area, document date and business place selections, with a tax code and no clearing document, and copy company code, customer, document, dates, business place, special G/L indicator and G/L account into AUSGLOP_ITAB.
- SAP 객체: BSID
- 업무 키워드: 미결 매출채권, 미반제 항목, 사업영역, 세금코드, 사업장
- English: Open Customer Items, BSID, Business Area, Tax Code, Business Place
- 정의부(복사 시 함께 필요): [`BSID`](#decl-zfir0140top-9-bsid), [`SBAREA`](#decl-zfir0140-45-sbarea), [`SBDAT`](#decl-zfir0140-58-sbdat), [`SBUPLA`](#decl-zfir0140-46-sbupla), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`CURR`](#decl-zfir0140top-226-curr)
- 위치: `abap://ZFIR0140/ZFIR0140#L330-L350` · confidence 0.9 · `ZFIR0140#ZFIR0140#EVENT#GET_BSID#C1`
### EVENT GET BKPF — `ZFIR0140` L354-L471 (118줄)
*논리DB GET BKPF 이벤트에서 전표 헤더를 검증(헤더텍스트·역분개·비망·전표유형·FB05 제외)하고 SD 청구(VBRK)·MM 송장(RBKP) 참조 정보를 보강해 발행 후보 항목을 준비한다.*
> 이 unit 의 조각 2개가 44/118줄(37%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 헤더텍스트(BKTXT)가 있거나 역분개(STBLG)·비망전표(BSTAT)·선택 전표유형 범위 밖·FB05 반제전표인 BKPF 는 건너뛰고 참조유형(AWTYP)·참조키(AWKEY)·전표유형을 AUSGLOP_ITAB 에 옮긴다.
```abap
357| CHECK BKPF-BKTXT = ' ' .
358| *doc not reversed...
359| CHECK BKPF-STBLG = ' '.
360| *doc not a noted item...
361| CHECK BKPF-BSTAT = ' '.
362| * doc in the given range of document type
363| CHECK BKPF-BLART IN PBLART.
364|
365| CHECK BKPF-TCODE <> 'FB05'. "check document not a FB05-clearing doc.
366| MOVE BKPF-AWTYP TO AUSGLOP_ITAB-AWTYP.
367| MOVE BKPF-AWKEY TO AUSGLOP_ITAB-AWKEY.
368| MOVE BKPF-BLART TO AUSGLOP_ITAB-BLART.
```
- **EN**: Skip BKPF headers with header text, reversals (STBLG), noted items (BSTAT), document types outside PBLART or FB05 clearing documents, then copy reference type, reference key and document type into AUSGLOP_ITAB.
- SAP 객체: BKPF, FB05
- 업무 키워드: 전표 헤더 검증, 역분개 제외, 비망 전표 제외, 전표유형, 반제 전표 제외
- English: Document Header, Reversal, Noted Item, Document Type, FB05
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0140top-17-bkpf), [`PBLART`](#decl-zfir0140-49-pblart), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab)
- 위치: `abap://ZFIR0140/ZFIR0140#L357-L368` · confidence 0.9 · `ZFIR0140#ZFIR0140#EVENT#GET_BKPF#C1`
#### [validation] SD 청구 유래(AWTYP='VBRK') 전표는 VBRK 를 읽어 취소(FKSTO/SFAKN) 건을 제외하고 청구번호·청구유형·청구일을 저장하며, MM 송장(RMRP)은 RBKP 취소 여부를 확인하고, SD 전용 선택이면 청구번호·청구유형·청구일 조건을 추가 검증한다.
```abap
369| IF BKPF-AWTYP = 'VBRK'.
370| *
371| * SELECT SINGLE * FROM vbrk WHERE bukrs = ausglop_itab-bukrs
372| * AND vbeln = ausglop_itab-awkey.
373| SELECT SINGLE * FROM VBRK WHERE VBELN = AUSGLOP_ITAB-AWKEY
374| AND BUKRS = AUSGLOP_ITAB-BUKRS.
375| IF SY-SUBRC = 0.
376| CHECK VBRK-FKSTO IS INITIAL.
377| CHECK VBRK-SFAKN IS INITIAL.
378| MOVE VBRK-VBELN TO AUSGLOP_ITAB-VBELN.
379| MOVE VBRK-FKART TO AUSGLOP_ITAB-FKART.
380| MOVE VBRK-FKDAT TO AUSGLOP_ITAB-FKDAT.
381| MOVE VBRK-FKTYP TO AUSGLOP_ITAB-FKTYP.
382| ENDIF.
383| ENDIF.
384|
385| IF BKPF-AWTYP = 'RMRP'.
386|
387| SELECT SINGLE STBLG FROM RBKP INTO STBLG WHERE
388| BELNR = AUSGLOP_ITAB-AWKEY
389| AND GJAHR = BKPF-GJAHR.
390| CHECK STBLG IS INITIAL.
391| CLEAR STBLG.
392|
393| ENDIF.
394|
395| IF SD_SELECTION = 'X' AND FI_SELECTION NE 'X'.
396| CHECK BKPF-AWTYP = 'VBRK'.
397| CHECK BKPF-AWKEY IN SVBELN.
398| CHECK VBRK-FKART IN SFKART. "check sd selection parameters
399| CHECK VBRK-FKDAT IN SFKDAT. "check sd selection parameters
400| ENDIF.
```
- **EN**: For SD billing references read VBRK, exclude cancelled billing documents (FKSTO/SFAKN) and keep billing number, type and date; for MM invoice references check RBKP for reversal; for SD-only selection apply billing number, type and date filters.
- 테이블(파서): read [VBRK](/tables/VBRK.md), [RBKP](/tables/RBKP.md) / write -
- SAP 객체: VBRK, RBKP
- 업무 키워드: SD 청구전표, 청구 취소 검증, MM 송장 취소, 청구유형, SD 선택조건
- English: Billing Document, VBRK, Cancellation, RBKP, Billing Type
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0140top-17-bkpf), [`VBRK`](#decl-zfir0140top-12-vbrk), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`STBLG`](#decl-zfir0140top-295-stblg), [`SD_SELECTION`](#decl-zfir0140top-45-sd_selection), [`FI_SELECTION`](#decl-zfir0140top-47-fi_selection), [`SVBELN`](#decl-zfir0140-64-svbeln), [`SFKART`](#decl-zfir0140-65-sfkart), [`SFKDAT`](#decl-zfir0140-66-sfkdat)
- 위치: `abap://ZFIR0140/ZFIR0140#L369-L400` · confidence 0.9 · `ZFIR0140#ZFIR0140#EVENT#GET_BKPF#C2`
### EVENT GET BSEG — `ZFIR0140` L472-L484 (13줄)
*논리DB GET BSEG 이벤트에서 고객 라인(KOART='D')의 세금코드가 선택범위에 있을 때 지급조건·기산일·금액을 채워 발행 후보 AUSGLOP_ITAB 에 추가한다.*
> 이 unit 의 조각 1개가 11/13줄(85%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] BSEG 라인 중 고객 계정유형(KOART='D')이고 세금코드(MWSKZ)가 SMWSKZ 범위에 있는 라인만 지급조건(ZTERM)·기산일(ZFBDT)·전표통화금액(WRBTR)·현지통화금액(DMBTR)을 채워 AUSGLOP_ITAB 에 APPEND 한다.
```abap
473| CHECK BSEG-KOART = 'D'.
474| MOVE BSEG-KOART TO AUSGLOP_ITAB-KOART.
475| CHECK BSEG-MWSKZ IN SMWSKZ.
476| MOVE BSEG-MWSKZ TO AUSGLOP_ITAB-MWSKZ.
477| MOVE BSEG-ZTERM TO AUSGLOP_ITAB-ZTERM.
478| MOVE BSEG-ZFBDT TO AUSGLOP_ITAB-ZFBDT.
479| MOVE BSEG-WRBTR TO AUSGLOP_ITAB-WRBTR.
480| MOVE BSEG-DMBTR TO AUSGLOP_ITAB-DMBTR.
481| * 추가
482| * MOVE bseg-sgtxt TO ausglop_itab-sgtxt.
483| APPEND AUSGLOP_ITAB.
```
- **EN**: Accept only customer line items (KOART='D') whose tax code is within SMWSKZ, copy payment terms, baseline date, document and local currency amounts, and append the row to AUSGLOP_ITAB.
- SAP 객체: BSEG
- 업무 키워드: 고객 라인, 계정유형, 세금코드 필터, 지급조건, 현지통화금액
- English: Customer Line Item, Account Type, Tax Code, Payment Terms, Local Currency Amount
- 정의부(복사 시 함께 필요): [`BSEG`](#decl-zfir0140top-8-bseg), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`SMWSKZ`](#decl-zfir0140-47-smwskz)
- 위치: `abap://ZFIR0140/ZFIR0140#L473-L483` · confidence 0.9 · `ZFIR0140#ZFIR0140#EVENT#GET_BSEG#C1`
### EVENT END-OF-SELECTION — `ZFIR0140` L485-L538 (54줄)
*END-OF-SELECTION 에서 반제 항목 선별, 전자세금계산서 발행 여부 확인, 세금·고객주소 보강, 한국 반올림 User-Exit 호출 후 계층 ALV 를 출력하는 메인 흐름을 수행한다.*
> 이 unit 의 조각 2개가 39/54줄(72%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 반제 매출채권(BSAD) 항목을 추가 선별(CLEAR_ITEM_SELECTION)하고 ZDTI 상태로 기발행 건을 제외(DTI_CHECK)한 뒤 세금 데이터(GET_TAX_DATA)와 고객 주소·CPD 정보(GET_CUSTOMER_ADDRESS)를 보강하고 고객·전표·라인 순으로 정렬한다.
```abap
488| PERFORM CLEAR_ITEM_SELECTION.
489|
490| ** 임시전표로 매출 발행하는 업체에서는 주석처리 풀고 사용하면 됨.
491| ** 임시전표 가져오는 로직 추가 - 2006.08.30
492| * PERFORM PARK_DOCUMENT_SELECTION.
493|
494| * 기본적으로는 BKPF-BKTXT에 값이 있으면 매출 세금계산서 발행 프로그램에
495| * 리스트에 보여지지 않는다.
496| * 허브업체별로 BKPF-BKTXT값을 사용하지 않을 경우 아래의 Perform에서
497| * 체크하여 준다.
498|
499| * 세금계산서 발행여부 체크 - 금호 2006.08.30
500| PERFORM DTI_CHECK.
501|
502| * bif용 - 주석처리 2006.08.14.------------------------------*
503| ** 매출부가세의 텍스트를 가져온다.
504| * PERFORM GET_SALES_TAX_SGTXT.
505|
506| * getting bset data ( tax related data )
507| REFRESH GT_KUNDE.
508|
509| CLEAR AUSGLOP_ITAB.
510| *Add tax data to internal table...
511| PERFORM GET_TAX_DATA.
512|
513| *Get customer address and CPD data...
514| PERFORM GET_CUSTOMER_ADDRESS.
515|
516| SORT AUSGLOP_ITAB BY KUNNR BELNR BUZEI.
```
- **EN**: Add cleared AR items, remove documents already issued as electronic tax invoices, enrich with tax data and customer address / one-time customer data, then sort AUSGLOP_ITAB by customer, document and line.
- 호출(파서): CLEAR_ITEM_SELECTION, DTI_CHECK, GET_TAX_DATA, GET_CUSTOMER_ADDRESS
- SAP 객체: BSAD, ZDTI_SAPP, BSET
- 업무 키워드: 반제 항목 선별, 기발행 제외, 세금 데이터 보강, 고객 주소, 발행 대상 정렬
- English: Cleared Items, Electronic Tax Invoice, Tax Data, Customer Address
- 정의부(복사 시 함께 필요): [`KNA1`](#decl-zfir0140top-15-kna1), [`GT_KUNDE`](#decl-zfir0140top-269-gt_kunde), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab)
- 위치: `abap://ZFIR0140/ZFIR0140#L488-L516` · confidence 0.85 · `ZFIR0140#ZFIR0140#EVENT#END-OF-SELECTION#C1`
#### [fm_call] 한국 세금계산서 User-Exit KR_USER_EXIT_ROUNDOFF 로 발행 대상 금액을 합산옵션(SN1OP)·상태(STA1)에 따라 반올림 처리한 뒤 BUILD_UP_ALV_LAYOUT 으로 계층 ALV 를 표시한다.
```abap
518| CALL FUNCTION 'KR_USER_EXIT_ROUNDOFF'
519| EXPORTING
520| YSN1OP = SN1OP
521| YSTA1 = STA1
522| YPROG_NAME = SY-CPROG
523| TABLES
524| YAUSGLOP_ITAB = AUSGLOP_ITAB.
525|
526| * build up ALV layout
527| PERFORM BUILD_UP_ALV_LAYOUT.
```
- **EN**: Call the Korean tax invoice user exit KR_USER_EXIT_ROUNDOFF to round the candidate amounts according to the aggregate option and status, then display the hierarchical ALV via BUILD_UP_ALV_LAYOUT.
- 호출(파서): KR_USER_EXIT_ROUNDOFF, BUILD_UP_ALV_LAYOUT
- SAP 객체: KR_USER_EXIT_ROUNDOFF, REUSE_ALV_HIERSEQ_LIST_DISPLAY
- 업무 키워드: 금액 반올림, User-Exit, 세금계산서 금액, ALV 출력
- English: Round-off, User Exit, Tax Invoice Amount, ALV
- 정의부(복사 시 함께 필요): [`SN1OP`](#decl-zfir0140-81-sn1op), [`STA1`](#decl-zfir0140-88-sta1), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab)
- 위치: `abap://ZFIR0140/ZFIR0140#L518-L527` · confidence 0.85 · `ZFIR0140#ZFIR0140#EVENT#END-OF-SELECTION#C2`
### FORM CLEAR_ITEM_SELECTION — `ZFIR0140` L2299-L2389 (91줄)
*반제된 매출채권(BSAD)을 선택조건으로 읽어 역분개·비망·FB05 반제 전표를 제외하고 SD 청구(VBRK)·MM 송장(RBKP) 취소 여부와 세금코드를 확인해 세금계산서 발행 후보(AUSGLOP_ITAB)를 만든다.*
> 이 unit 의 조각 4개가 83/91줄(91%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 회사코드·일자·전표번호·사업장·고객·사업영역·전표유형·세금코드 조건으로 반제 매출채권(BSAD)을 읽어 세금코드가 있고 자기반제가 아닌 건만 AUSGLOP_ITAB 기본 필드에 옮긴다.
```abap
2301| SELECT * FROM BSAD WHERE BUKRS = DD_BUKRS-LOW
2302| AND BLDAT IN SBDAT
2303| AND BUDAT IN SBUDAT
2304| AND BUDAT IN SFKDAT
2305| AND BELNR IN SBELNR
2306| AND BUPLA IN SBUPLA
2307| AND KUNNR IN DD_KUNNR
2308| AND GSBER IN SBAREA
2309| AND BLART IN PBLART
2310| AND MWSKZ IN SMWSKZ.
2311| CHECK BSAD-MWSKZ NE ' '.
2312| CHECK BSAD-AUGBL NE BSAD-BELNR.
2313| CLEAR AUSGLOP_ITAB.
2314| MOVE CURR TO AUSGLOP_ITAB-WAERS.
2315| MOVE BSAD-WAERS TO AUSGLOP_ITAB-WAERS.
2316| MOVE BSAD-BUKRS TO AUSGLOP_ITAB-BUKRS.
2317| MOVE BSAD-KUNNR TO AUSGLOP_ITAB-KUNNR.
2318| MOVE BSAD-GJAHR TO AUSGLOP_ITAB-GJAHR.
2319| MOVE BSAD-GSBER TO AUSGLOP_ITAB-GSBER.
2320| MOVE BSAD-BELNR TO AUSGLOP_ITAB-BELNR.
2321| MOVE BSAD-BUDAT TO AUSGLOP_ITAB-BUDAT.
2322| MOVE BSAD-BLDAT TO AUSGLOP_ITAB-BLDAT.
2323| MOVE BSAD-BUZEI TO AUSGLOP_ITAB-BUZEI.
2324| MOVE BSAD-BUPLA TO AUSGLOP_ITAB-BUPLA.
2325| MOVE BSAD-UMSKZ TO AUSGLOP_ITAB-UMSKZ.
2326| MOVE BSAD-HKONT TO AUSGLOP_ITAB-HKONT.
```
- **EN**: Read cleared customer items from BSAD by company code, dates, document, business place, customer, business area, document type and tax code; keep only items with a tax code that are not self-cleared and copy key fields into AUSGLOP_ITAB.
- 테이블(파서): read [BSAD](/tables/BSAD.md) / write -
- SAP 객체: BSAD
- 업무 키워드: 반제 매출채권, 고객 반제 항목, 세금코드, 사업장, 자기반제 제외
- English: Cleared Customer Items, BSAD, Tax Code, Business Place, Clearing Document
- 정의부(복사 시 함께 필요): [`BSAD`](#decl-zfir0140top-18-bsad), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`SBDAT`](#decl-zfir0140-58-sbdat), [`SBUDAT`](#decl-zfir0140-48-sbudat), [`SFKDAT`](#decl-zfir0140-66-sfkdat), [`SBELNR`](#decl-zfir0140-57-sbelnr), [`BUPLA`](#decl-zfir0140top-290-bupla), [`SBUPLA`](#decl-zfir0140-46-sbupla), [`SBAREA`](#decl-zfir0140-45-sbarea), [`BLART`](#decl-zfir0140top-289-blart), [`PBLART`](#decl-zfir0140-49-pblart) 외 3건
- 선언을 못 찾은 이름: DD_BUKRS, DD_KUNNR (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L2301-L2326` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#CLEAR_ITEM_SELECTION#C1`
#### [validation] 전표 헤더(BKPF)를 읽어 헤더텍스트가 있거나 역분개(STBLG)·비망전표(BSTAT)·FB05 반제전표인 건을 제외하고 참조유형(AWTYP)·참조키(AWKEY)·전표유형을 저장한다.
```abap
2328| SELECT SINGLE * FROM BKPF WHERE BUKRS = AUSGLOP_ITAB-BUKRS AND
2329| BELNR = AUSGLOP_ITAB-BELNR AND
2330| GJAHR = AUSGLOP_ITAB-GJAHR.
2331|
2332| CHECK BKPF-BKTXT = ' ' .
2333| * CHECK BKPF-BKTXT(2) <> '80'. "= ' ' . "bif용 2006.08.14
2334| *doc not reversed...
2335| CHECK BKPF-STBLG = ' '.
2336| *doc not a noted item...
2337| CHECK BKPF-BSTAT = ' '.
2338|
2339| CHECK BKPF-TCODE <> 'FB05'. "check document not a FB05-clearing doc.
2340| MOVE BKPF-AWTYP TO AUSGLOP_ITAB-AWTYP.
2341| MOVE BKPF-AWKEY TO AUSGLOP_ITAB-AWKEY.
2342| MOVE BKPF-BLART TO AUSGLOP_ITAB-BLART.
```
- **EN**: Read the document header BKPF and exclude documents with header text, reversed documents (STBLG), noted items (BSTAT) and FB05 clearing documents; keep reference type, reference key and document type.
- 테이블(파서): read [BKPF](/tables/BKPF.md) / write -
- SAP 객체: BKPF, FB05
- 업무 키워드: 전표 헤더, 역분개 제외, 비망 전표 제외, 반제 전표 제외, 참조 키
- English: Document Header, Reversal, Noted Item, FB05, Reference Key
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0140top-17-bkpf), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab)
- 위치: `abap://ZFIR0140/ZFIR0140#L2328-L2342` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#CLEAR_ITEM_SELECTION#C2`
#### [validation] SD 청구 유래 전표는 VBRK 로 취소(FKSTO/SFAKN)·청구유형(SFKART)을 검증해 청구 정보를 옮기고, MM 송장(RMRP) 유래 전표는 RBKP 취소전표(STBLG) 유무를 확인하며, SD 전용 선택이면 청구번호·청구유형·청구일 조건을 추가 검사한다.
```abap
2343| IF BKPF-AWTYP = 'VBRK'.
2344|
2345| SELECT SINGLE * FROM VBRK WHERE VBELN = AUSGLOP_ITAB-AWKEY
2346| AND BUKRS = AUSGLOP_ITAB-BUKRS. "bif
2347| IF SY-SUBRC = 0.
2348| CHECK VBRK-FKSTO IS INITIAL.
2349| CHECK VBRK-SFAKN IS INITIAL.
2350| CHECK VBRK-FKART IN SFKART.
2351| MOVE VBRK-VBELN TO AUSGLOP_ITAB-VBELN.
2352| MOVE VBRK-FKART TO AUSGLOP_ITAB-FKART.
2353| MOVE VBRK-FKDAT TO AUSGLOP_ITAB-FKDAT.
2354| MOVE VBRK-FKTYP TO AUSGLOP_ITAB-FKTYP.
2355| ENDIF.
2356| ENDIF.
2357|
2358| IF BKPF-AWTYP = 'RMRP'.
2359| SELECT SINGLE STBLG FROM RBKP INTO STBLG
2360| WHERE BELNR = AUSGLOP_ITAB-AWKEY
2361| AND GJAHR = BKPF-GJAHR.
2362| CHECK STBLG IS INITIAL.
2363| CLEAR STBLG.
2364| ENDIF.
2365|
2366| IF SD_SELECTION = 'X' AND FI_SELECTION NE 'X'.
2367| CHECK BKPF-AWTYP = 'VBRK'.
2368| CHECK BKPF-AWKEY IN SVBELN.
2369| CHECK VBRK-FKART IN SFKART. "check sd selection parameters
2370| CHECK VBRK-FKDAT IN SFKDAT. "check sd selection parameters
2371| ENDIF.
```
- **EN**: For SD billing documents validate VBRK (not cancelled via FKSTO/SFAKN, billing type in SFKART) and copy billing data; for MM invoices check RBKP for a reversal (STBLG); for SD-only selection apply billing number, type and date filters.
- 테이블(파서): read [VBRK](/tables/VBRK.md), [RBKP](/tables/RBKP.md) / write -
- SAP 객체: VBRK, RBKP
- 업무 키워드: SD 청구전표, 청구 취소 검증, MM 송장 취소, 청구유형, 청구일
- English: Billing Document, VBRK, Cancellation, RBKP, Billing Type
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0140top-17-bkpf), [`VBRK`](#decl-zfir0140top-12-vbrk), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`SFKART`](#decl-zfir0140-65-sfkart), [`STBLG`](#decl-zfir0140top-295-stblg), [`SD_SELECTION`](#decl-zfir0140top-45-sd_selection), [`FI_SELECTION`](#decl-zfir0140top-47-fi_selection), [`SVBELN`](#decl-zfir0140-64-svbeln), [`SFKDAT`](#decl-zfir0140-66-sfkdat)
- 위치: `abap://ZFIR0140/ZFIR0140#L2343-L2371` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#CLEAR_ITEM_SELECTION#C3`
#### [sql_select] 전표의 고객 라인(BSEG KOART='D')을 읽어 세금코드가 선택범위(SMWSKZ)에 있는 건만 지급조건·기산일·금액을 채워 발행 후보 AUSGLOP_ITAB 에 추가한다.
```abap
2374| SELECT SINGLE * FROM BSEG WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2375| AND BELNR = AUSGLOP_ITAB-BELNR
2376| AND GJAHR = AUSGLOP_ITAB-GJAHR
2377| AND KOART = 'D'.
2378| MOVE BSEG-KOART TO AUSGLOP_ITAB-KOART.
2379| CHECK BSEG-MWSKZ IN SMWSKZ.
2380| MOVE BSEG-MWSKZ TO AUSGLOP_ITAB-MWSKZ.
2381| MOVE BSEG-ZTERM TO AUSGLOP_ITAB-ZTERM.
2382| MOVE BSEG-ZFBDT TO AUSGLOP_ITAB-ZFBDT.
2383| MOVE BSEG-WRBTR TO AUSGLOP_ITAB-WRBTR.
2384| MOVE BSEG-DMBTR TO AUSGLOP_ITAB-DMBTR.
2385| APPEND AUSGLOP_ITAB.
2386| ENDSELECT.
```
- **EN**: Read the customer line (KOART='D') from BSEG, keep only lines whose tax code is in SMWSKZ, and append payment terms, baseline date and amounts to AUSGLOP_ITAB.
- 테이블(파서): read [BSEG](/tables/BSEG.md) / write -
- SAP 객체: BSEG
- 업무 키워드: 고객 라인, 세금코드 필터, 지급조건, 발행 후보 적재
- English: Customer Line Item, BSEG, Tax Code, Payment Terms
- 정의부(복사 시 함께 필요): [`BSEG`](#decl-zfir0140top-8-bseg), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`SMWSKZ`](#decl-zfir0140-47-smwskz)
- 위치: `abap://ZFIR0140/ZFIR0140#L2374-L2386` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#CLEAR_ITEM_SELECTION#C4`
### FORM DTI_CHECK — `ZFIR0140` L2576-L2628 (53줄)
*전자세금계산서 상태 테이블(ZDTI_SAPP/ZDTI_STATUS)을 조회해 이미 발행(취소·거부 상태 제외)된 전표를 발행 대상(AUSGLOP_ITAB)에서 제거한다.*
> 이 unit 의 조각 2개가 48/53줄(91%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [other] 재발행이 가능한 전자세금계산서 상태 코드(DC 공급받는자 취소승인, NC 거부, RJ 발행요청취소, RF 발행거부, CC 발행취소, VC 공급자 취소승인, IR 역발행거부)를 RANGE_CANCEL 범위로 구성한다.
```abap
2578| CLEAR : RANGE_CANCEL, RANGE_CANCEL[].
2579| RANGE_CANCEL-SIGN = 'I'.
2580| RANGE_CANCEL-OPTION = 'EQ'.
2581| RANGE_CANCEL-LOW = 'DC'. "공받자발행취소요청승인
2582| APPEND RANGE_CANCEL.
2583|
2584| CLEAR : RANGE_CANCEL-LOW.
2585| RANGE_CANCEL-LOW = 'NC'. "거부 ok
2586| APPEND RANGE_CANCEL.
2587|
2588| CLEAR : RANGE_CANCEL-LOW.
2589| RANGE_CANCEL-LOW = 'RJ'. "발행요청취소
2590| APPEND RANGE_CANCEL.
2591|
2592| CLEAR : RANGE_CANCEL-LOW.
2593| RANGE_CANCEL-LOW = 'RF'. "발행거부
2594| APPEND RANGE_CANCEL.
2595|
2596| CLEAR : RANGE_CANCEL-LOW.
2597| RANGE_CANCEL-LOW = 'CC'. "발행취소 ok
2598| APPEND RANGE_CANCEL.
2599|
2600| CLEAR : RANGE_CANCEL-LOW.
2601| RANGE_CANCEL-LOW = 'VC'. "공급자발행취소요청승인
2602| APPEND RANGE_CANCEL.
2603|
2604| CLEAR : RANGE_CANCEL-LOW.
2605| RANGE_CANCEL-LOW = 'IR'. "역발행거부.
2606| APPEND RANGE_CANCEL.
```
- **EN**: Build the RANGE_CANCEL range of electronic tax invoice status codes (DC, NC, RJ, RF, CC, VC, IR) that represent cancelled or rejected issues and therefore allow re-issuing.
- SAP 객체: ZDTI_STATUS
- 업무 키워드: 전자세금계산서 상태, 발행취소, 발행거부, 역발행, 재발행 가능 상태
- English: Electronic Tax Invoice, Status Code, Cancellation, Rejection
- 정의부(복사 시 함께 필요): [`RANGE_CANCEL`](#decl-zfir0140top-183-range_cancel)
- 위치: `abap://ZFIR0140/ZFIR0140#L2578-L2606` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#DTI_CHECK#C1`
#### [sql_select] 각 발행 후보 전표에 대해 ZDTI_SAPP 와 ZDTI_STATUS 를 조인 조회해 취소/거부가 아닌 유효한 전자세금계산서 발행 이력이 있으면 중복 발행을 막기 위해 AUSGLOP_ITAB 에서 삭제한다.
```abap
2608| LOOP AT AUSGLOP_ITAB.
2609| SELECT P~BUKRS P~ZETNO P~ZARAP P~BELNR P~GJAHR P~REBELNR
2610| P~REGJAHR P~EBELN P~EBELP P~MBLNR P~MJAHR P~VBELN
2611| S~ZSTAT
2612| INTO CORRESPONDING FIELDS OF TABLE ITABSAPP
2613| FROM ZDTI_SAPP AS P JOIN ZDTI_STATUS AS S
2614| ON P~BUKRS = S~BUKRS
2615| AND P~ZETNO = S~ZETNO
2616| AND P~ZARAP = S~ZARAP
2617| WHERE P~BUKRS = AUSGLOP_ITAB-BUKRS
2618| AND P~GJAHR = AUSGLOP_ITAB-GJAHR
2619| AND P~BELNR = AUSGLOP_ITAB-BELNR
2620| AND S~ZSTAT NOT IN RANGE_CANCEL.
2621|
2622| IF SY-SUBRC = 0.
2623| DELETE AUSGLOP_ITAB.
2624| CLEAR AUSGLOP_ITAB.
2625| ENDIF.
2626| ENDLOOP.
```
- **EN**: For each candidate document join ZDTI_SAPP with ZDTI_STATUS; if a valid (not cancelled/rejected) electronic tax invoice already exists, delete the document from AUSGLOP_ITAB to prevent duplicate issuing.
- 테이블(파서): read [ZDTI_SAPP](/tables/ZDTI_SAPP.md), [ZDTI_STATUS](/tables/ZDTI_STATUS.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: ZDTI_SAPP, ZDTI_STATUS
- 업무 키워드: 전자세금계산서 발행 이력, 중복 발행 방지, 발행 상태 확인, 발행 대상 제외
- English: Electronic Tax Invoice, Issued Status, Duplicate Check, ZDTI_SAPP
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`ITABSAPP`](#decl-zfir0140top-184-itabsapp), [`ZDTI_SAPP`](#decl-zfir0140top-27-zdti_sapp), [`ZDTI_STATUS`](#decl-zfir0140top-28-zdti_status), [`RANGE_CANCEL`](#decl-zfir0140top-183-range_cancel)
- 위치: `abap://ZFIR0140/ZFIR0140#L2608-L2626` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#DTI_CHECK#C2`
### FORM GET_TAX_DATA — `ZFIR0140` L1876-L2054 (179줄)
*세금계산서 발행 대상 항목에 BSET 세금 데이터를 합산하고 부호를 맞춘 뒤 고객 목록을 만든다.*
> 이 unit 의 조각 1개가 49/179줄(27%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 발행 대상 항목마다 해당 전표의 세금 라인(BSET)을 모두 읽어 공급가액(HWBAS/FWBAS)과 세액(HWSTE/FWSTE)을 합산한다. 한 전표 안에 차·대변 세금 라인이 섞여 있으면(첫 라인의 차대구분과 다른 라인) 빼서 순액을 만들고, 차변(S) 세금 라인만 있는 경우에는 금액 부호를 반전한다. 마지막으로 고객이 바뀌는 지점에서 고객번호를 중복 없이 수집해 이후 주소 조회 대상으로 삼는다.
```abap
1880| LOOP AT AUSGLOP_ITAB.
1881| CLEAR: SIGN,CLEAR.
1882|
1883| SELECT * FROM BSET WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1884| AND BELNR = AUSGLOP_ITAB-BELNR
1885| AND GJAHR = AUSGLOP_ITAB-GJAHR.
1886|
1887| IF SIGN = ' '.
1888| SIGN = BSET-SHKZG.
1889| ENDIF.
1890| IF SIGN <> ' ' AND SIGN <> BSET-SHKZG .
1891| AUSGLOP_ITAB-HWSTE = AUSGLOP_ITAB-HWSTE - BSET-HWSTE.
1892| AUSGLOP_ITAB-HWBAS = AUSGLOP_ITAB-HWBAS - BSET-HWBAS.
1893| AUSGLOP_ITAB-FWSTE = AUSGLOP_ITAB-FWSTE - BSET-FWSTE.
1894| AUSGLOP_ITAB-FWBAS = AUSGLOP_ITAB-FWBAS - BSET-FWBAS.
1895|
1896|
1897| CLEAR = 'X'.
1898| ELSE.
1899| ADD BSET-HWSTE TO AUSGLOP_ITAB-HWSTE.
1900| ADD BSET-HWBAS TO AUSGLOP_ITAB-HWBAS.
1901| ADD BSET-FWBAS TO AUSGLOP_ITAB-FWBAS.
1902| ADD BSET-FWSTE TO AUSGLOP_ITAB-FWSTE.
1903|
1904| ENDIF.
1905|
1906| * ADD bset-hwbas TO ausglop_itab-hwbas.
1907| * ADD bset-hwste TO ausglop_itab-hwste.
1908| * ADD bset-fwbas TO ausglop_itab-fwbas.
1909| * ADD bset-fwste TO ausglop_itab-fwste.
1910| * IF bset-shkzg = 'S'.
1911| IF BSET-SHKZG = 'S' AND CLEAR = ' '.
1912| AUSGLOP_ITAB-WRBTR = -1 * ( AUSGLOP_ITAB-WRBTR ).
1913| AUSGLOP_ITAB-DMBTR = -1 * ( AUSGLOP_ITAB-DMBTR ).
1914| ENDIF.
1915| * MOVE bset-shkzg to ausglop_itab-shkzg.
1916| IF AUSGLOP_ITAB-SHKZG = ' ' .
1917| MOVE BSET-SHKZG TO AUSGLOP_ITAB-SHKZG.
1918| ENDIF.
1919| MODIFY AUSGLOP_ITAB.
1920| ENDSELECT.
1921| AT NEW KUNNR.
1922| READ TABLE CUSTOMER_TAB WITH KEY KUNNR = AUSGLOP_ITAB-KUNNR.
1923| IF SY-SUBRC <> 0.
1924| MOVE AUSGLOP_ITAB-KUNNR TO CUSTOMER_TAB-KUNNR.
1925| APPEND CUSTOMER_TAB.
1926| ENDIF.
1927| ENDAT.
1928| ENDLOOP.
```
- **EN**: Aggregates tax base and tax amounts from BSET per issuing item, netting mixed debit/credit tax lines, flipping signs for debit-only cases, and collecting distinct customers for later address lookup.
- 테이블(파서): read [BSET](/tables/BSET.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSET, HWBAS, HWSTE, FWBAS, FWSTE, SHKZG, KUNNR
- 업무 키워드: 세금계산서, 세액, 공급가액, 부가세, 차대구분, 순액, 부호반전, 고객수집, 세금라인
- English: tax invoice, tax amount, tax base, VAT, debit credit, net amount, sign reversal, BSET
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`CLEAR`](#decl-zfir0140-1878-clear), [`SIGN`](#decl-zfir0140-1878-sign), [`BSET`](#decl-zfir0140top-13-bset), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`CUSTOMER_TAB`](#decl-zfir0140top-217-customer_tab)
- 위치: `abap://ZFIR0140/ZFIR0140#L1880-L1928` · confidence 0.8 · `ZFIR0140#ZFIR0140#FORM#GET_TAX_DATA#C1`
### FORM GET_CUSTOMER_ADDRESS — `ZFIR0140` L2063-L2114 (52줄)
*고객 마스터(KNA1)에서 사업자번호와 주소를 읽어 고객 헤더(GT_KUNDE)와 발행 항목에 보강하고, 일회성(CPD) 고객은 전표의 BSEC 주소 데이터를 사용하며 종사업장번호(J_1BBRANCH)를 붙인다.*
> 이 unit 의 조각 3개가 42/52줄(81%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 회사코드의 사업장 K000 에 대한 종사업장번호(STATE_INSC)를 J_1BBRANCH 에서 읽어 공급자 종사업장 정보로 사용한다.
```abap
2068| SELECT SINGLE STATE_INSC INTO L_STATE_INSC
2069| FROM J_1BBRANCH
2070| WHERE BUKRS = DD_BUKRS-LOW
2071| AND BRANCH = 'K000'.
```
- **EN**: Read the branch (sub-business place) number STATE_INSC for business place K000 of the company code from J_1BBRANCH.
- 테이블(파서): read [J_1BBRANCH](/tables/J_1BBRANCH.md) / write -
- SAP 객체: J_1BBRANCH
- 업무 키워드: 종사업장번호, 사업장, 공급자 정보
- English: Business Place, Branch, J_1BBRANCH
- 정의부(복사 시 함께 필요): [`L_STATE_INSC`](#decl-zfir0140-2066-l_state_insc), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs)
- 선언을 못 찾은 이름: J_1BBRANCH, DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L2068-L2071` · confidence 0.8 · `ZFIR0140#ZFIR0140#FORM#GET_CUSTOMER_ADDRESS#C1`
#### [sql_select] 발행 대상 고객마다 KNA1 을 읽어 고객 헤더 GT_KUNDE 를 만들고, 일반 고객은 사업자등록번호(STCD1)·주민번호(STCD2)를 AUSGLOP_ITAB 에 반영하며 일회성 고객(XCPDK)은 CPD 플래그를 표시한다.
```abap
2073| LOOP AT CUSTOMER_TAB.
2074| SELECT SINGLE * FROM KNA1 WHERE KUNNR = CUSTOMER_TAB-KUNNR.
2075|
2076| IF SY-SUBRC = 0.
2077| MOVE-CORRESPONDING KNA1 TO GT_KUNDE.
2078| GT_KUNDE-STATE_INSC = L_STATE_INSC.
2079|
2080| APPEND GT_KUNDE.
2081| IF KNA1-XCPDK NE 'X'.
2082| MOVE KNA1-STCD1 TO CUSTOMER_TAB-STCD1.
2083| MOVE KNA1-STCD2 TO CUSTOMER_TAB-STCD2.
2084|
2085| AUSGLOP_ITAB-STCD1 = CUSTOMER_TAB-STCD1.
2086| AUSGLOP_ITAB-STCD2 = CUSTOMER_TAB-STCD2.
2087| MODIFY AUSGLOP_ITAB TRANSPORTING STCD1 STCD2 WHERE
2088| KUNNR = CUSTOMER_TAB-KUNNR.
2089| ELSE.
2090| *one time customers.
2091| AUSGLOP_ITAB-XCPDK = 'X'.
2092| MODIFY AUSGLOP_ITAB TRANSPORTING XCPDK WHERE
2093| KUNNR = CUSTOMER_TAB-KUNNR.
2094| ENDIF.
2095| ENDIF.
2096|
2097| ENDLOOP.
```
- **EN**: For each customer read KNA1 to build the customer header GT_KUNDE; copy tax numbers STCD1/STCD2 to the items for regular customers and flag one-time (CPD) customers with XCPDK.
- 테이블(파서): read [KNA1](/tables/KNA1.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: KNA1
- 업무 키워드: 고객 마스터, 사업자등록번호, 주민등록번호, 일회성 고객, 고객 헤더
- English: Customer Master, KNA1, Tax Number, One-time Customer, CPD
- 정의부(복사 시 함께 필요): [`CUSTOMER_TAB`](#decl-zfir0140top-217-customer_tab), [`KNA1`](#decl-zfir0140top-15-kna1), [`GT_KUNDE`](#decl-zfir0140top-269-gt_kunde), [`L_STATE_INSC`](#decl-zfir0140-2066-l_state_insc), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab)
- 위치: `abap://ZFIR0140/ZFIR0140#L2073-L2097` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#GET_CUSTOMER_ADDRESS#C2`
#### [sql_select] 일회성 고객 전표는 BSEC 에서 전표별 CPD 주소 데이터(상호·도시·사업자번호·주민번호)를 읽어 발행 항목에 채운다.
```abap
2099| LOOP AT AUSGLOP_ITAB WHERE XCPDK = 'X'.
2100| * getting bsec data for CPD-Customers
2101| SELECT * FROM BSEC WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2102| AND BELNR = AUSGLOP_ITAB-BELNR
2103| AND GJAHR = AUSGLOP_ITAB-GJAHR
2104| AND XCPDK = 'X'.
2105| MOVE BSEC-NAME1 TO AUSGLOP_ITAB-NAME1.
2106| MOVE BSEC-ORT01 TO AUSGLOP_ITAB-ORT01.
2107| MOVE BSEC-STCD1 TO AUSGLOP_ITAB-STCD1.
2108| MOVE BSEC-STCD2 TO AUSGLOP_ITAB-STCD2.
2109| MODIFY AUSGLOP_ITAB.
2110| ENDSELECT.
2111| ENDLOOP.
```
- **EN**: For one-time customer documents read the CPD address data (name, city, tax numbers) from BSEC per document and store it in the items.
- 테이블(파서): read [BSEC](/tables/BSEC.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSEC
- 업무 키워드: 일회성 고객, CPD 주소, 사업자번호, 전표별 고객정보
- English: One-time Customer, BSEC, CPD Data, Tax Number
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`BSEC`](#decl-zfir0140top-10-bsec), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs)
- 위치: `abap://ZFIR0140/ZFIR0140#L2099-L2111` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#GET_CUSTOMER_ADDRESS#C3`
### FORM BUILD_UP_ALV_LAYOUT — `ZFIR0140` L2399-L2445 (47줄)
*필드카탈로그·이벤트·헤더·특수그룹을 구성하고 SELECTION 으로 대상을 확정한 뒤 REUSE_ALV_HIERSEQ_LIST_DISPLAY 로 고객(GT_KUNDE)-전표(GT_AUSGLOP) 계층 ALV 를 출력한다.*
> 이 unit 의 조각 1개가 42/47줄(89%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] ALV 구성요소(필드카탈로그·이벤트·TOP_OF_PAGE·특수그룹)를 준비하고 SELECTION 으로 FI/SD 항목을 확정한 후 REUSE_ALV_HIERSEQ_LIST_DISPLAY 를 호출해 고객 헤더-전표 아이템 계층 목록을 PF-STATUS·USER_COMMAND 콜백과 함께 표시한다.
```abap
2402| PERFORM E01_FIELDCAT_INIT USING GT_FIELDCAT[].
2403| PERFORM E03_EVENTTAB_BUILD USING GT_EVENTS[].
2404| PERFORM E04_COMMENT_BUILD USING GT_LIST_TOP_OF_PAGE[].
2405| PERFORM E07_SP_GROUP_BUILD USING GT_SP_GROUP[].
2406|
2407| * selection of the fi and sd-items
2408| PERFORM SELECTION.
2409|
2410| * build up ALV layout (part 2)
2411| PERFORM E05_LAYOUT_BUILD USING GS_LAYOUT. "wg. Parameters
2412|
2413| * Call ABAP/4 List Viewer
2414| CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
2415| EXPORTING
2416| I_CALLBACK_PROGRAM = G_REPID
2417| I_CALLBACK_PF_STATUS_SET = G_STATUS
2418| I_CALLBACK_USER_COMMAND = G_USER_COMMAND
2419| IS_LAYOUT = GS_LAYOUT
2420| IT_FIELDCAT = GT_FIELDCAT[]
2421| * IT_EXCLUDING =
2422| IT_SPECIAL_GROUPS = GT_SP_GROUP[]
2423| * IT_SORT =
2424| * IT_FILTER =
2425| * IS_SEL_HIDE =
2426| * I_SCREEN_START_COLUMN = 0
2427| * I_SCREEN_START_LINE = 0
2428| * I_SCREEN_END_COLUMN = 0
2429| * I_SCREEN_END_LINE = 0
2430| * i_default = g_default
2431| I_SAVE = G_SAVE
2432| IS_VARIANT = G_VARIANT
2433| IT_EVENTS = GT_EVENTS[]
2434| * IT_EVENT_EXIT =
2435| I_TABNAME_HEADER = G_TABNAME_HEADER
2436| I_TABNAME_ITEM = G_TABNAME_ITEM
2437| IS_KEYINFO = GS_KEYINFO
2438| * IS_PRINT =
2439| * IMPORTING
2440| * E_EXIT_CAUSED_BY_CALLER =
2441| TABLES
2442| T_OUTTAB_HEADER = GT_KUNDE
2443| T_OUTTAB_ITEM = GT_AUSGLOP.
```
- **EN**: Prepare the ALV field catalog, events, header and special groups, run SELECTION to finalise FI/SD items, and call REUSE_ALV_HIERSEQ_LIST_DISPLAY to show the customer header / document item hierarchical list with PF-status and user-command callbacks.
- 호출(파서): E01_FIELDCAT_INIT, E03_EVENTTAB_BUILD, E04_COMMENT_BUILD, E07_SP_GROUP_BUILD, SELECTION, E05_LAYOUT_BUILD, REUSE_ALV_HIERSEQ_LIST_DISPLAY
- SAP 객체: REUSE_ALV_HIERSEQ_LIST_DISPLAY
- 업무 키워드: 계층 ALV, 세금계산서 발행 목록, 고객 헤더, 전표 아이템, 사용자 명령
- English: Hierarchical ALV, REUSE_ALV_HIERSEQ_LIST_DISPLAY, Callback, Field Catalog
- 정의부(복사 시 함께 필요): [`GT_FIELDCAT`](#decl-zfir0140top-246-gt_fieldcat), [`GT_EVENTS`](#decl-zfir0140top-250-gt_events), [`GT_LIST_TOP_OF_PAGE`](#decl-zfir0140top-277-gt_list_top_of_page), [`GT_SP_GROUP`](#decl-zfir0140top-249-gt_sp_group), [`GS_LAYOUT`](#decl-zfir0140top-247-gs_layout), [`G_REPID`](#decl-zfir0140top-276-g_repid), [`G_STATUS`](#decl-zfir0140top-278-g_status), [`G_USER_COMMAND`](#decl-zfir0140top-251-g_user_command), [`G_SAVE`](#decl-zfir0140-132-g_save), [`G_VARIANT`](#decl-zfir0140-138-g_variant), [`G_TABNAME_HEADER`](#decl-zfir0140-133-g_tabname_header), [`G_TABNAME_ITEM`](#decl-zfir0140-134-g_tabname_item) 외 5건
- 위치: `abap://ZFIR0140/ZFIR0140#L2402-L2443` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#BUILD_UP_ALV_LAYOUT#C1`
### FORM E04_COMMENT_BUILD — `ZFIR0140` L1012-L1049 (38줄)
*ALV TOP-OF-PAGE 헤더에 발행 방식(합산/개별), 회사코드, 세금계산서 작성일자를 표시하는 리스트 헤더를 구성한다.*
> 이 unit 의 조각 1개가 29/38줄(76%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] 옵션 S11OP 에 따라 발행 방식 텍스트를, 그리고 회사코드(DD_BUKRS)와 세금계산서 작성일(SBLDAT)을 ALV 리스트 헤더(SLIS_LISTHEADER)로 만든다.
```abap
1016| IF S11OP = 'X'.
1017| CLEAR LS_LINE.
1018| LS_LINE-TYP = 'S'.
1019| LS_LINE-KEY = TEXT-104.
1020| LS_LINE-INFO = TEXT-103.
1021| APPEND LS_LINE TO E04_LT_TOP_OF_PAGE.
1022| ELSE.
1023| CLEAR LS_LINE.
1024| LS_LINE-TYP = 'S'.
1025| LS_LINE-KEY = TEXT-104.
1026| LS_LINE-INFO = TEXT-102.
1027| APPEND LS_LINE TO E04_LT_TOP_OF_PAGE.
1028|
1029| ENDIF.
1030|
1031| * Listheader: show company code
1032| CLEAR LS_LINE.
1033| LS_LINE-TYP = 'S'.
1034| LS_LINE-KEY = TEXT-001.
1035| LS_LINE-INFO = DD_BUKRS-LOW.
1036| APPEND LS_LINE TO E04_LT_TOP_OF_PAGE.
1037|
1038| * head-info: show acc doc date
1039| WRITE SBLDAT TO BLDATE. " YYYY.MM.DD.
1040| CLEAR LS_LINE.
1041| LS_LINE-TYP = 'S'.
1042| LS_LINE-KEY = TEXT-101.
1043| LS_LINE-INFO = BLDATE.
1044| APPEND LS_LINE TO E04_LT_TOP_OF_PAGE.
```
- **EN**: Build ALV list header lines showing the issue mode text (by S11OP), the company code and the tax invoice date SBLDAT.
- SAP 객체: REUSE_ALV_COMMENTARY_WRITE
- 업무 키워드: 리스트 헤더, 회사코드, 세금계산서 작성일, 발행 방식
- English: List Header, TOP_OF_PAGE, Company Code, Tax Invoice Date
- 정의부(복사 시 함께 필요): [`S11OP`](#decl-zfir0140-82-s11op), [`LS_LINE`](#decl-zfir0140-1013-ls_line), [`SBLDAT`](#decl-zfir0140-72-sbldat), [`BLDATE`](#decl-zfir0140top-37-bldate)
- 선언을 못 찾은 이름: DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L1016-L1044` · confidence 0.75 · `ZFIR0140#ZFIR0140#FORM#E04_COMMENT_BUILD#C1`
### FORM SELECTION — `ZFIR0140` L1098-L1135 (38줄)
*발행 후보(AUSGLOP_ITAB)에서 차변 부호를 조정하고 선수금 요청(T074U 비망항목)을 제외하며 FI/SD 선택 옵션에 따라 ALV 아이템(GT_AUSGLOP)과 고객 헤더(GT_KUNDE)를 확정한다.*
> 이 unit 의 조각 2개가 32/38줄(84%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 차변(SHKZG='S') 건은 공급가액·세액의 부호를 반전하고, T074U 로 특별G/L 지시자가 비망항목(MERKP, 선수금 요청)인 건을 제외하며, FI 전용 선택이면 SD 청구(AWTYP='VBRK') 유래 전표를 빼고 GT_AUSGLOP 에 적재한다.
```abap
1102| LOOP AT AUSGLOP_ITAB.
1103| IF AUSGLOP_ITAB-SHKZG = 'S'.
1104| AUSGLOP_ITAB-HWBAS = -1 * AUSGLOP_ITAB-HWBAS.
1105| AUSGLOP_ITAB-HWSTE = -1 * AUSGLOP_ITAB-HWSTE.
1106| ENDIF.
1107|
1108| * check document not down payment request
1109|
1110| SELECT SINGLE * FROM T074U WHERE KOART = AUSGLOP_ITAB-KOART
1111| AND UMSKZ = AUSGLOP_ITAB-UMSKZ.
1112| CHECK T074U-MERKP = ' '.
1113|
1114| * if fi_selection flag is set display only acounting documents
1115|
1116| IF FI_SELECTION = 'X' AND SD_SELECTION NE 'X'.
1117| CHECK AUSGLOP_ITAB-AWTYP <> 'VBRK'.
1118| MOVE-CORRESPONDING AUSGLOP_ITAB TO GT_AUSGLOP.
1119| APPEND GT_AUSGLOP.
1120| ELSE.
1121| MOVE-CORRESPONDING AUSGLOP_ITAB TO GT_AUSGLOP.
1122| APPEND GT_AUSGLOP.
1123| ENDIF.
1124|
1125| ENDLOOP.
```
- **EN**: Negate tax base and tax amount for debit items, exclude noted-item special G/L transactions (down payment requests) via T074U-MERKP, and, for FI-only selection, skip SD billing documents (AWTYP='VBRK') before appending to GT_AUSGLOP.
- 테이블(파서): read [T074U](/tables/T074U.md) / write -
- SAP 객체: T074U
- 업무 키워드: 차대 구분, 선수금 요청 제외, 특별 G/L, 비망 항목, FI/SD 선택
- English: Debit/Credit Indicator, Noted Item, Special G/L, Down Payment Request, T074U
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`T074U`](#decl-zfir0140top-22-t074u), [`FI_SELECTION`](#decl-zfir0140top-47-fi_selection), [`SD_SELECTION`](#decl-zfir0140top-45-sd_selection), [`GT_AUSGLOP`](#decl-zfir0140top-259-gt_ausglop)
- 위치: `abap://ZFIR0140/ZFIR0140#L1102-L1125` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#SELECTION#C1`
#### [aggregation] 아이템이 하나도 남지 않은 고객은 헤더 테이블(GT_KUNDE)에서 삭제하고 아이템을 고객·전표·라인 순으로 정렬한 뒤 E02_DATA_ADD 로 표시 속성을 보강한다.
```abap
1127| LOOP AT GT_KUNDE.
1128| READ TABLE GT_AUSGLOP WITH KEY KUNNR = GT_KUNDE-KUNNR.
1129| IF SY-SUBRC NE 0.
1130| DELETE GT_KUNDE.
1131| ENDIF.
1132| ENDLOOP.
1133| SORT GT_AUSGLOP BY KUNNR BELNR BUZEI.
1134| PERFORM E02_DATA_ADD TABLES GT_AUSGLOP GT_KUNDE.
```
- **EN**: Delete customer header rows without remaining items, sort items by customer/document/line and call E02_DATA_ADD to prepare display attributes.
- 테이블(파서): read - / write [GT_KUNDE](/tables/GT_KUNDE.md)
- 호출(파서): E02_DATA_ADD
- 업무 키워드: 고객 헤더 정리, 정렬, 계층 ALV
- English: Customer Header, Hierarchical ALV, Sort
- 정의부(복사 시 함께 필요): [`KNA1`](#decl-zfir0140top-15-kna1), [`GT_KUNDE`](#decl-zfir0140top-269-gt_kunde), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`GT_AUSGLOP`](#decl-zfir0140top-259-gt_ausglop)
- 위치: `abap://ZFIR0140/ZFIR0140#L1127-L1134` · confidence 0.8 · `ZFIR0140#ZFIR0140#FORM#SELECTION#C2`
### FORM E02_DATA_ADD — `ZFIR0140` L942-L980 (39줄)
*ALV 출력 전 아이템(GT_AUSGLOP)의 체크박스를 초기화하고 선수금(특별G/L) 건의 공급가액·세액을 양수로 바꾸며 고객 헤더(GT_KUNDE)의 신호등 값을 설정한다.*
> 이 unit 의 조각 2개가 34/39줄(87%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 각 발행 항목의 체크박스를 지우고 특별G/L지시자(UMSKZ)가 있는 선수금 건은 음수인 공급가액(HWBAS)·세액(HWSTE)을 양수로 변환해 리스트에 양수로 표시한다.
```abap
945| LOOP AT E02_LT_AUSGLOP.
946| E02_LT_AUSGLOP-BOX = ' '.
947|
948| * if the invoice is a down payment write positive values of base amount
949| * and tax amount in the list.
950|
951| IF E02_LT_AUSGLOP-UMSKZ <> ' '.
952| IF E02_LT_AUSGLOP-HWBAS < 0.
953| E02_LT_AUSGLOP-HWBAS = -1 * ( E02_LT_AUSGLOP-HWBAS ).
954| ENDIF.
955| IF E02_LT_AUSGLOP-HWSTE < 0.
956| E02_LT_AUSGLOP-HWSTE = -1 * ( E02_LT_AUSGLOP-HWSTE ).
957| ENDIF.
958| ENDIF.
959|
960| E02_LT_AUSGLOP-WERT = SY-TABIX MOD 5.
961|
962|
963|
964| MODIFY E02_LT_AUSGLOP.
965| ENDLOOP.
```
- **EN**: Reset the checkbox of each item and, for down-payment items with a special G/L indicator (UMSKZ), convert negative tax base (HWBAS) and tax amount (HWSTE) to positive values for display.
- 업무 키워드: 선수금, 특별 G/L 지시자, 공급가액, 세액, 부호 변환
- English: Down Payment, Special G/L Indicator, Tax Base Amount, Tax Amount
- 위치: `abap://ZFIR0140/ZFIR0140#L945-L965` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#E02_DATA_ADD#C1`
#### [output] 고객 헤더 라인(GT_KUNDE)의 체크박스를 초기화하고 ALV 신호등(LIGHTS) 값을 설정한다.
```abap
967| LOOP AT E02_LT_KUNDE.
968| IF SY-TABIX > 0.
969| E02_LT_KUNDE-BOX = ' '.
970| E02_LT_KUNDE-LIGHTS = '3'.
971| ELSE.
972| IF SY-TABIX = 1.
973| E02_LT_KUNDE-LIGHTS = '2'.
974| ELSE.
975| E02_LT_KUNDE-LIGHTS = '1'.
976| ENDIF.
977| ENDIF.
978| MODIFY E02_LT_KUNDE.
979| ENDLOOP.
```
- **EN**: Initialise the checkbox and set the ALV traffic-light value (LIGHTS) for each customer header line.
- 테이블(파서): read - / write [E02_LT_KUNDE](/tables/E02_LT_KUNDE.md)
- 업무 키워드: 고객 헤더, 신호등, 체크박스 초기화
- English: Customer Header, Traffic Light, ALV
- 위치: `abap://ZFIR0140/ZFIR0140#L967-L979` · confidence 0.7 · `ZFIR0140#ZFIR0140#FORM#E02_DATA_ADD#C2`
### FORM USER_COMMAND — `ZFIR0140` L1158-L1557 (400줄)
*ALV 사용자 명령 처리 FORM 의 시작부(1/3 창)로 로컬 변수 선언과 시뮬레이션 플래그 초기화만 있다.*
> 이 unit 의 조각 11개가 322/400줄(80%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] 커서 위치의 전표(GT_AUSGLOP)에 대해 파라미터 ID BLN/BUK/GJR 를 설정하고 선택된 건이면 FB03 으로 회계전표를 조회하며 미선택 건이면 오류 메시지 E204 를 낸다.
```abap
1168| WHEN 'WAHL'.
1169| READ TABLE GT_AUSGLOP INDEX RS_SELFIELD-TABINDEX. "cursorposit.
1170| SET PARAMETER ID 'BLN' FIELD GT_AUSGLOP-BELNR.
1171| SET PARAMETER ID 'BUK' FIELD GT_AUSGLOP-BUKRS.
1172| SET PARAMETER ID 'GJR' FIELD GT_AUSGLOP-GJAHR.
1173| IF GT_AUSGLOP-BELNR <> SPACE AND
1174| ( GT_AUSGLOP-BOX = 'X' OR GT_AUSGLOP-BOX = '1' ).
1175| CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
1176| ENDIF.
1177| IF GT_AUSGLOP-BELNR <> SPACE AND
1178| GT_AUSGLOP-BOX = ' '.
1179| MESSAGE E204.
1180| ENDIF.
1181| CLEAR R_UCOMM.
```
- **EN**: On WAHL set parameter IDs BLN/BUK/GJR for the cursor row and call transaction FB03 to display the FI document if the row is selected; otherwise raise message E204.
- 호출(파서): FB03
- SAP 객체: FB03
- 업무 키워드: 전표 조회, 회계전표, 파라미터 ID, 선택 검증
- English: Display Document, FB03, SET PARAMETER ID
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`GT_AUSGLOP`](#decl-zfir0140top-259-gt_ausglop)
- 위치: `abap://ZFIR0140/ZFIR0140#L1168-L1181` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C1`
#### [aggregation] POST 시 고객 단위(GT_KUNDE)로 체크된 선택을 해당 고객의 모든 전표(GT_AUSGLOP)에 전파하고, 체크된 전표를 발행일(SBLDAT)·사업자번호(STCD2 우선, 없으면 STCD1)와 함께 SEL_AUSGLOP_ITAB 에 모아 회사코드·고객·전표번호 기준 중복을 제거한다.
```abap
1193| CLEAR GT_KUNDE.
1194| LOOP AT GT_KUNDE.
1195| IF GT_KUNDE-BOX = 'X'.
1196| CLEAR GT_AUSGLOP.
1197| LOOP AT GT_AUSGLOP WHERE KUNNR = GT_KUNDE-KUNNR.
1198| GT_AUSGLOP-BOX = 'X'.
1199| MODIFY GT_AUSGLOP.
1200| ENDLOOP.
1201| ENDIF.
1202| ENDLOOP.
1203|
1204| * Check flags at document level and fill sel_ausglop_itab with selected
1205| * items.
1206| REFRESH SEL_AUSGLOP_ITAB.
1207| CLEAR SAVE_BELNR.
1208| CLEAR SAVE_AWTYP.
1209| CLEAR GT_AUSGLOP.
1210| LOOP AT GT_AUSGLOP.
1211| IF GT_AUSGLOP-BOX = 'X'.
1212| SAVE_BELNR = GT_AUSGLOP-BELNR.
1213| * LOOP AT gt_ausglop WHERE belnr = save_belnr.
1214| MOVE-CORRESPONDING GT_AUSGLOP TO SEL_AUSGLOP_ITAB.
1215| SEL_AUSGLOP_ITAB-AUGDT = SBLDAT.
1216| IF GT_AUSGLOP-STCD2 <> ' '.
1217| MOVE GT_AUSGLOP-STCD2 TO SEL_AUSGLOP_ITAB-STCD.
1218| APPEND SEL_AUSGLOP_ITAB.
1219| ELSE.
1220| MOVE GT_AUSGLOP-STCD1 TO SEL_AUSGLOP_ITAB-STCD.
1221| APPEND SEL_AUSGLOP_ITAB.
1222| ENDIF.
1223| * ENDLOOP.
1224| ENDIF.
1225| ENDLOOP.
1226|
1227| DELETE ADJACENT DUPLICATES FROM SEL_AUSGLOP_ITAB COMPARING BUKRS
1228| KUNNR BELNR.
```
- **EN**: Propagate customer-level checkbox selection to all documents of that customer, collect the selected documents into SEL_AUSGLOP_ITAB with issue date and tax registration number (STCD2 preferred over STCD1), and remove duplicates by company code, customer and document.
- 테이블(파서): read - / write [GT_AUSGLOP](/tables/GT_AUSGLOP.md)
- 업무 키워드: 발행 대상 선택, 고객별 선택 전파, 사업자등록번호, 중복 제거, 세금계산서 작성일
- English: Selected Items, Tax Number, Customer Selection, Tax Invoice Date
- 정의부(복사 시 함께 필요): [`KNA1`](#decl-zfir0140top-15-kna1), [`GT_KUNDE`](#decl-zfir0140top-269-gt_kunde), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`GT_AUSGLOP`](#decl-zfir0140top-259-gt_ausglop), [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`SAVE_BELNR`](#decl-zfir0140top-51-save_belnr), [`SAVE_AWTYP`](#decl-zfir0140top-52-save_awtyp), [`SBLDAT`](#decl-zfir0140-72-sbldat), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs)
- 위치: `abap://ZFIR0140/ZFIR0140#L1193-L1228` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C2`
#### [control_flow] 회계연도를 결정(GET_TAXINVOICE_YEAR)하고 전표유형(T003, SBLART)이 유효하면 합산 옵션(SN1OP)에 따라 COLLECTIVE_INVOICES 또는 INDIVIDUAL_INVOICES 로 세금계산서 번호를 채번한다.
```abap
1236| PERFORM GET_TAXINVOICE_YEAR.
1237|
1238| SELECT SINGLE * FROM T003 WHERE BLART = SBLART.
1239| IF SY-SUBRC = 0.
1240| IF SN1OP = 'X'. "aggregate invoices option
1241|
1242| PERFORM COLLECTIVE_INVOICES.
1243| ELSE.
1244| PERFORM INDIVIDUAL_INVOICES.
1245| ENDIF.
1246| ENDIF.
```
- **EN**: Determine the fiscal year, verify the document type in T003 and assign tax invoice numbers either collectively or individually depending on the aggregate option SN1OP.
- 테이블(파서): read [T003](/tables/T003.md) / write -
- 호출(파서): GET_TAXINVOICE_YEAR, COLLECTIVE_INVOICES, INDIVIDUAL_INVOICES
- SAP 객체: T003
- 업무 키워드: 세금계산서 번호 채번, 합산/개별 발행, 전표유형 검증, 회계연도
- English: Tax Invoice Number, Collective Invoice, Document Type, T003
- 정의부(복사 시 함께 필요): [`T003`](#decl-zfir0140top-23-t003), [`CODE`](#decl-zfir0140top-281-code), [`BLART`](#decl-zfir0140top-289-blart), [`SBLART`](#decl-zfir0140-74-sblart), [`SN1OP`](#decl-zfir0140-81-sn1op)
- 위치: `abap://ZFIR0140/ZFIR0140#L1236-L1246` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C3`
#### [calculation] 채번된 세금계산서 번호(AUGBL)의 최소·최대값과 회사코드·회계연도를 구해 출력 프로그램 ZFIR0141 의 선택화면 파라미터(SAUGBL BT, SBUKRS, SGJAHR)용 SELTAB 을 구성한다.
```abap
1248| CLEAR SEL_AUSGLOP_ITAB.
1249| REFRESH CLEARING_ITAB1.
1250| CLEAR CLEARING_DATA-SBUKRS.
1251| CLEAR CLEARING_DATA-SGJAHR.
1252| CLEAR CLEARING_DATA-LOW.
1253| CLEAR CLEARING_DATA-HIGH.
1254| LINE_COUNT = 0.
1255| LOOP AT SEL_AUSGLOP_ITAB.
1256| MOVE-CORRESPONDING SEL_AUSGLOP_ITAB TO CLEARING_ITAB1.
1257| APPEND CLEARING_ITAB1.
1258| ENDLOOP.
1259| SORT CLEARING_ITAB1 BY AUGBL.
1260| DESCRIBE TABLE CLEARING_ITAB1 LINES LINE_COUNT2.
1261|
1262| * filling the fields used to fill the internal table seltab, which
1263| * will be transmitted to the selection-screen of the print report.
1264| LOOP AT CLEARING_ITAB1.
1265| IF SY-TABIX = 1.
1266| MOVE CLEARING_ITAB1-AUGBL TO CLEARING_DATA-LOW.
1267| ENDIF.
1268| IF SY-TABIX = LINE_COUNT2.
1269| MOVE CLEARING_ITAB1-AUGBL TO CLEARING_DATA-HIGH.
1270| ENDIF.
1271| ENDLOOP.
1272| LOOP AT SEL_AUSGLOP_ITAB.
1273| MOVE SEL_AUSGLOP_ITAB-BUKRS TO CLEARING_DATA-SBUKRS.
1274| MOVE SEL_AUSGLOP_ITAB-GJAHR TO CLEARING_DATA-SGJAHR.
1275| ENDLOOP.
1276|
1277| * filling the internal table seltab to be transmitted to the
1278| * print programm.
1279|
1280| * Pass in the sel_augslop_itab with tax inv no and date duly filled in.
1281| SELTAB-SELNAME = 'SAUGBL'.
1282| SELTAB-KIND = 'S'.
1283| SELTAB-SIGN = 'I'.
1284| SELTAB-OPTION = 'BT'.
1285| SELTAB-LOW = CLEARING_DATA-LOW.
1286| SELTAB-HIGH = CLEARING_DATA-HIGH.
1287| APPEND SELTAB.
1288|
1289| SELTAB-SELNAME = 'SBUKRS'.
1290| SELTAB-OPTION = 'EQ'.
1291| SELTAB-LOW = CLEARING_DATA-SBUKRS.
1292| SELTAB-HIGH = CLEARING_DATA-SBUKRS.
1293| APPEND SELTAB.
1294|
1295| SELTAB-SELNAME = 'SGJAHR'.
1296| SELTAB-LOW = CLEARING_DATA-SGJAHR.
1297| SELTAB-HIGH = CLEARING_DATA-SGJAHR.
1298| APPEND SELTAB.
```
- **EN**: Derive the lowest and highest assigned tax invoice number plus company code and fiscal year, and build the SELTAB selection table (SAUGBL range, SBUKRS, SGJAHR) for the print program ZFIR0141.
- SAP 객체: ZFIR0141
- 업무 키워드: 세금계산서 번호 범위, 선택 테이블, 출력 프로그램 파라미터
- English: Selection Table, RSPARAMS, Tax Invoice Number Range
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`CLEARING_ITAB1`](#decl-zfir0140top-203-clearing_itab1), [`CLEARING_DATA`](#decl-zfir0140top-58-clearing_data), [`LINE_COUNT`](#decl-zfir0140top-44-line_count), [`LINE_COUNT2`](#decl-zfir0140top-43-line_count2), [`SELTAB`](#decl-zfir0140top-211-seltab)
- 위치: `abap://ZFIR0140/ZFIR0140#L1248-L1298` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C4`
#### [interface] 발행 대상이 있으면 SEL_AUSGLOP_ITAB·호출 프로그램명·합산옵션·작성일자를 ABAP 메모리(ID TI/KRPROG/SN1OP/SBLDAT)로 넘기고 ZFIR0141 을 SUBMIT AND RETURN 하여 세금계산서 출력·전자전송을 수행한다.
```abap
1305| IF LINE_COUNT2 > 0.
1306| PROG_NAME = SY-CPROG.
1307| EXPORT SEL_AUSGLOP_ITAB[] TO MEMORY ID 'TI'.
1308| EXPORT PROG_NAME TO MEMORY ID 'KRPROG'.
1309| * Smartbill 추가 2006.07.19
1310| EXPORT SN1OP TO MEMORY ID 'SN1OP'.
1311| EXPORT SBLDAT TO MEMORY ID 'SBLDAT'.
1312|
1313|
1314| SUBMIT ZFIR0141
1315| WITH SELECTION-TABLE SELTAB
1316| WITH STA1 EQ STA1
1317| WITH STA2 EQ STA2
1318| WITH LIST EQ LIST
1319| WITH FULLLIST EQ FULLLIST
1320| WITH SAP EQ SAP
1321| WITH RECEIPT EQ RECEIPT
1322| WITH BILLING EQ BILLING
1323|
1324| * WITH sbldat EQ sbldat
1325| AND RETURN.
1326| ENDIF.
```
- **EN**: Export the selected items, calling program name, aggregate option and issue date to ABAP memory and SUBMIT ZFIR0141 with the selection table to print/transmit the tax invoices, returning afterwards.
- 호출(파서): ZFIR0141
- SAP 객체: ZFIR0141
- 업무 키워드: 세금계산서 출력, 전자세금계산서 전송, 프로그램 호출, ABAP 메모리
- English: SUBMIT, EXPORT TO MEMORY, Electronic Tax Invoice, Print Program
- 정의부(복사 시 함께 필요): [`LINE_COUNT2`](#decl-zfir0140top-43-line_count2), [`PROG_NAME`](#decl-zfir0140top-227-prog_name), [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`SN1OP`](#decl-zfir0140-81-sn1op), [`SBLDAT`](#decl-zfir0140-72-sbldat), [`SELTAB`](#decl-zfir0140top-211-seltab), [`STA1`](#decl-zfir0140-88-sta1), [`STA2`](#decl-zfir0140-89-sta2), [`LIST`](#decl-zfir0140-96-list), [`FULLLIST`](#decl-zfir0140-95-fulllist), [`SAP`](#decl-zfir0140-94-sap), [`RECEIPT`](#decl-zfir0140-99-receipt) 외 1건
- 위치: `abap://ZFIR0140/ZFIR0140#L1305-L1326` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C5`
#### [output] ZFIR0141 이 메모리 ID TI 로 돌려준 전송 결과(RESULT='Y')를 읽어 정상 전송된 전표는 체크박스를 비활성(BOX='1')하고 세금계산서 번호를 표시·색상 강조하며 ALV 를 갱신한다.
```abap
1334| IMPORT SEL_AUSGLOP_ITAB[] FROM MEMORY ID 'TI'.
1335| FREE MEMORY ID 'TI'.
1336|
1337| * setting inactive the checkboxes of FB05-cleared documents
1338| LOOP AT SEL_AUSGLOP_ITAB.
1339| LOOP AT GT_AUSGLOP WHERE BELNR = SEL_AUSGLOP_ITAB-BELNR.
1340| IF SEL_AUSGLOP_ITAB-RESULT EQ 'Y'.
1341| GT_AUSGLOP-BOX = '1'.
1342| MOVE SEL_AUSGLOP_ITAB-AUGBL TO GT_AUSGLOP-AUGBL.
1343| * defining field-color
1344|
1345| * Field AUGBL defined
1346| WA_COLORF-FIELDNAME = 'AUGBL'.
1347| WA_COLORF-COLOR-COL = '5'.
1348| WA_COLORF-COLOR-INT = '1'.
1349| WA_COLORF-COLOR-INV = '0'.
1350| WA_COLORF-NOKEYCOL = 'X'.
1351| APPEND WA_COLORF TO INT_COLORF.
1352|
1353| GT_AUSGLOP-COLORF = INT_COLORF.
1354| GT_AUSGLOP-SIM = ' '.
1355| MODIFY GT_AUSGLOP.
1356| ELSE.
1357| ** defining field-color
1358| *
1359| ** Field AUGBL defined
1360| * WA_COLORF-FIELDNAME = 'AUGBL'.
1361| * WA_COLORF-COLOR-COL = '3'.
1362| * WA_COLORF-COLOR-INT = '1'.
1363| * WA_COLORF-COLOR-INV = '0'.
1364| * WA_COLORF-NOKEYCOL = 'X'.
1365| * APPEND WA_COLORF TO INT_COLORF.
1366| *
1367| * GT_AUSGLOP-COLORF = INT_COLORF.
1368| GT_AUSGLOP-SIM = ' '.
1369| MODIFY GT_AUSGLOP.
1370| ENDIF.
1371|
1372| ENDLOOP.
1373| RS_SELFIELD-REFRESH = 'X'.
1374| IF SY-SUBRC <> 0.
1375| ERR_DEB = SEL_AUSGLOP_ITAB-KUNNR.
1376| ENDIF.
1377| ENDLOOP.
```
- **EN**: Import the transmission result returned by ZFIR0141; for successfully issued documents (RESULT='Y') disable the checkbox, store the tax invoice number with a colored AUGBL cell and refresh the ALV.
- 테이블(파서): read - / write [GT_AUSGLOP](/tables/GT_AUSGLOP.md)
- SAP 객체: ZFIR0141
- 업무 키워드: 전송 결과 반영, 발행 완료 표시, 세금계산서 번호, ALV 갱신
- English: Transmission Result, ALV Refresh, Cell Color, Tax Invoice Number
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`GT_AUSGLOP`](#decl-zfir0140top-259-gt_ausglop), [`WA_COLORF`](#decl-zfir0140top-255-wa_colorf), [`INT_COLORF`](#decl-zfir0140top-257-int_colorf), [`ERR_DEB`](#decl-zfir0140top-56-err_deb)
- 위치: `abap://ZFIR0140/ZFIR0140#L1334-L1377` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C6`
#### [aggregation] SIM(시뮬레이션) 시 시뮬레이션 플래그를 켜고 POST 와 동일하게 고객 단위 선택을 전표에 전파해 체크된 전표를 SEL_AUSGLOP_ITAB 에 모아 중복 제거한다.
```abap
1395| WHEN 'SIM'.
1396| SIM = 'X'.
1397| CLEAR GT_KUNDE.
1398|
1399| LOOP AT GT_KUNDE.
1400| IF GT_KUNDE-BOX = 'X'.
1401| CLEAR GT_AUSGLOP.
1402| LOOP AT GT_AUSGLOP WHERE KUNNR = GT_KUNDE-KUNNR.
1403| GT_AUSGLOP-BOX = 'X'.
1404| MODIFY GT_AUSGLOP.
1405| ENDLOOP.
1406| ENDIF.
1407| ENDLOOP.
1408|
1409| * Check flags at document level and fill sel_ausglop_itab with selected
1410| * items.
1411| REFRESH SEL_AUSGLOP_ITAB.
1412| CLEAR SAVE_BELNR.
1413| CLEAR SAVE_AWTYP.
1414| CLEAR GT_AUSGLOP.
1415| LOOP AT GT_AUSGLOP.
1416| IF GT_AUSGLOP-BOX = 'X'.
1417| SAVE_BELNR = GT_AUSGLOP-BELNR.
1418| * LOOP AT gt_ausglop WHERE belnr = save_belnr.
1419| MOVE-CORRESPONDING GT_AUSGLOP TO SEL_AUSGLOP_ITAB.
1420| SEL_AUSGLOP_ITAB-AUGDT = SBLDAT.
1421| IF GT_AUSGLOP-STCD2 <> ' '.
1422| MOVE GT_AUSGLOP-STCD2 TO SEL_AUSGLOP_ITAB-STCD.
1423| APPEND SEL_AUSGLOP_ITAB.
1424| ELSE.
1425| MOVE GT_AUSGLOP-STCD1 TO SEL_AUSGLOP_ITAB-STCD.
1426| APPEND SEL_AUSGLOP_ITAB.
1427| ENDIF.
1428| * ENDLOOP.
1429| ENDIF.
1430| ENDLOOP.
1431|
1432| DELETE ADJACENT DUPLICATES FROM SEL_AUSGLOP_ITAB COMPARING BUKRS
1433| KUNNR BELNR.
```
- **EN**: In simulation mode set SIM='X', propagate customer-level selection to documents and collect the checked documents into SEL_AUSGLOP_ITAB without duplicates, same as POST.
- 테이블(파서): read - / write [GT_AUSGLOP](/tables/GT_AUSGLOP.md)
- 업무 키워드: 시뮬레이션, 발행 대상 선택, 고객별 선택 전파, 사업자등록번호
- English: Simulation, Selected Items, Tax Number
- 정의부(복사 시 함께 필요): [`SIM`](#decl-zfir0140top-65-sim), [`KNA1`](#decl-zfir0140top-15-kna1), [`GT_KUNDE`](#decl-zfir0140top-269-gt_kunde), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`GT_AUSGLOP`](#decl-zfir0140top-259-gt_ausglop), [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`SAVE_BELNR`](#decl-zfir0140top-51-save_belnr), [`SAVE_AWTYP`](#decl-zfir0140top-52-save_awtyp), [`SBLDAT`](#decl-zfir0140-72-sbldat), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs)
- 위치: `abap://ZFIR0140/ZFIR0140#L1395-L1433` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C7`
#### [control_flow] 시뮬레이션에서도 전표유형(T003)을 확인한 뒤 합산 옵션(SN1OP)에 따라 COLLECTIVE_INVOICES / INDIVIDUAL_INVOICES 로 가상 세금계산서 번호를 부여한다.
```abap
1438| SELECT SINGLE * FROM T003 WHERE BLART = SBLART.
1439| IF SY-SUBRC = 0.
1440| IF SN1OP = 'X'. "aggregate invoices option
1441|
1442| PERFORM COLLECTIVE_INVOICES.
1443| ELSE.
1444| PERFORM INDIVIDUAL_INVOICES.
1445| ENDIF.
1446| ENDIF.
```
- **EN**: Verify the document type in T003 and assign simulated tax invoice numbers collectively or individually according to SN1OP.
- 테이블(파서): read [T003](/tables/T003.md) / write -
- 호출(파서): COLLECTIVE_INVOICES, INDIVIDUAL_INVOICES
- SAP 객체: T003
- 업무 키워드: 시뮬레이션 채번, 전표유형, 합산/개별
- English: Simulation, Document Type, T003
- 정의부(복사 시 함께 필요): [`T003`](#decl-zfir0140top-23-t003), [`CODE`](#decl-zfir0140top-281-code), [`BLART`](#decl-zfir0140top-289-blart), [`SBLART`](#decl-zfir0140-74-sblart), [`SN1OP`](#decl-zfir0140-81-sn1op)
- 위치: `abap://ZFIR0140/ZFIR0140#L1438-L1446` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C8`
#### [calculation] 시뮬레이션 번호(AUGBL)의 범위와 회사코드·연도로 ZFIR0141 선택화면용 SELTAB(SAUGBL, SBUKRS, SGJAHR)을 구성한다.
```abap
1448| CLEAR SEL_AUSGLOP_ITAB.
1449| REFRESH CLEARING_ITAB1.
1450| CLEAR CLEARING_DATA-SBUKRS.
1451| CLEAR CLEARING_DATA-SGJAHR.
1452| CLEAR CLEARING_DATA-LOW.
1453| CLEAR CLEARING_DATA-HIGH.
1454| LINE_COUNT = 0.
1455| LOOP AT SEL_AUSGLOP_ITAB.
1456| MOVE-CORRESPONDING SEL_AUSGLOP_ITAB TO CLEARING_ITAB1.
1457| APPEND CLEARING_ITAB1.
1458| ENDLOOP.
1459| SORT CLEARING_ITAB1 BY AUGBL.
1460| DESCRIBE TABLE CLEARING_ITAB1 LINES LINE_COUNT2.
1461|
1462| * filling the fields used to fill the internal table seltab, which
1463| * will be transmitted to the selection-screen of the print report.
1464| LOOP AT CLEARING_ITAB1.
1465| IF SY-TABIX = 1.
1466| MOVE CLEARING_ITAB1-AUGBL TO CLEARING_DATA-LOW.
1467| ENDIF.
1468| IF SY-TABIX = LINE_COUNT2.
1469| MOVE CLEARING_ITAB1-AUGBL TO CLEARING_DATA-HIGH.
1470| ENDIF.
1471| ENDLOOP.
1472| LOOP AT SEL_AUSGLOP_ITAB.
1473| MOVE SEL_AUSGLOP_ITAB-BUKRS TO CLEARING_DATA-SBUKRS.
1474| MOVE SEL_AUSGLOP_ITAB-GJAHR TO CLEARING_DATA-SGJAHR.
1475| ENDLOOP.
1476|
1477| * filling the internal table seltab to be transmitted to the
1478| * print programm.
1479|
1480| * Pass in the sel_augslop_itab with tax inv no and date duly filled in.
1481| SELTAB-SELNAME = 'SAUGBL'.
1482| SELTAB-KIND = 'S'.
1483| SELTAB-SIGN = 'I'.
1484| SELTAB-OPTION = 'BT'.
1485| SELTAB-LOW = CLEARING_DATA-LOW.
1486| SELTAB-HIGH = CLEARING_DATA-HIGH.
1487| APPEND SELTAB.
1488|
1489| SELTAB-SELNAME = 'SBUKRS'.
1490| SELTAB-OPTION = 'EQ'.
1491| SELTAB-LOW = CLEARING_DATA-SBUKRS.
1492| SELTAB-HIGH = CLEARING_DATA-SBUKRS.
1493| APPEND SELTAB.
1494|
1495| SELTAB-SELNAME = 'SGJAHR'.
1496| SELTAB-LOW = CLEARING_DATA-SGJAHR.
1497| SELTAB-HIGH = CLEARING_DATA-SGJAHR.
1498| APPEND SELTAB.
```
- **EN**: Build the SELTAB selection table (SAUGBL range, SBUKRS, SGJAHR) from the simulated invoice numbers for the print program.
- SAP 객체: ZFIR0141
- 업무 키워드: 선택 테이블, 번호 범위, 시뮬레이션
- English: Selection Table, Simulation, Tax Invoice Number Range
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`CLEARING_ITAB1`](#decl-zfir0140top-203-clearing_itab1), [`CLEARING_DATA`](#decl-zfir0140top-58-clearing_data), [`LINE_COUNT`](#decl-zfir0140top-44-line_count), [`LINE_COUNT2`](#decl-zfir0140top-43-line_count2), [`SELTAB`](#decl-zfir0140top-211-seltab)
- 위치: `abap://ZFIR0140/ZFIR0140#L1448-L1498` · confidence 0.8 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C9`
#### [interface] 시뮬레이션 대상을 메모리(TI/KRPROG/KRSIM/SN1OP/SBLDAT)로 넘기고 ZFIR0141 을 SUBMIT AND RETURN 하여 세금계산서를 시뮬레이션 출력(미리보기)한다.
```abap
1504| IF LINE_COUNT2 > 0.
1505| PROG_NAME = SY-CPROG.
1506| EXPORT SEL_AUSGLOP_ITAB[] TO MEMORY ID 'TI'.
1507| EXPORT PROG_NAME TO MEMORY ID 'KRPROG'.
1508| **Simulate
1509| EXPORT SIM TO MEMORY ID 'KRSIM'.
1510| * Smartbill 추가 2006.07.19
1511| EXPORT SN1OP TO MEMORY ID 'SN1OP'.
1512| EXPORT SBLDAT TO MEMORY ID 'SBLDAT'.
1513| SUBMIT ZFIR0141
1514| WITH SELECTION-TABLE SELTAB
1515| WITH STA1 EQ STA1
1516| WITH STA2 EQ STA2
1517| WITH LIST EQ LIST
1518| WITH FULLLIST EQ FULLLIST
1519| WITH SAP EQ SAP
1520| WITH RECEIPT EQ RECEIPT
1521| WITH BILLING EQ BILLING
1522| * WITH sbldat EQ sbldat
1523| AND RETURN.
1524| ENDIF.
```
- **EN**: Export the simulated items and the KRSIM simulation flag to ABAP memory and SUBMIT ZFIR0141 to preview the tax invoices without actual issuance.
- 호출(파서): ZFIR0141
- SAP 객체: ZFIR0141
- 업무 키워드: 시뮬레이션 출력, 미리보기, 프로그램 호출, ABAP 메모리
- English: SUBMIT, Simulation, EXPORT TO MEMORY
- 정의부(복사 시 함께 필요): [`LINE_COUNT2`](#decl-zfir0140top-43-line_count2), [`PROG_NAME`](#decl-zfir0140top-227-prog_name), [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`SIM`](#decl-zfir0140top-65-sim), [`SN1OP`](#decl-zfir0140-81-sn1op), [`SBLDAT`](#decl-zfir0140-72-sbldat), [`SELTAB`](#decl-zfir0140top-211-seltab), [`STA1`](#decl-zfir0140-88-sta1), [`STA2`](#decl-zfir0140-89-sta2), [`LIST`](#decl-zfir0140-96-list), [`FULLLIST`](#decl-zfir0140-95-fulllist), [`SAP`](#decl-zfir0140-94-sap) 외 2건
- 위치: `abap://ZFIR0140/ZFIR0140#L1504-L1524` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C10`
#### [output] 시뮬레이션된 세금계산서 번호를 GT_AUSGLOP-AUGBL 에 표시하고 SIM 플래그와 셀 색상을 설정한 뒤 ALV 를 갱신한다.
```abap
1528| LOOP AT SEL_AUSGLOP_ITAB.
1529|
1530| LOOP AT GT_AUSGLOP WHERE BELNR = SEL_AUSGLOP_ITAB-BELNR.
1531| MOVE SEL_AUSGLOP_ITAB-AUGBL TO GT_AUSGLOP-AUGBL.
1532|
1533| * defining field-color
1534|
1535| * Field AUGBL defined
1536| WA_COLORF-FIELDNAME = 'AUGBL'.
1537| WA_COLORF-COLOR-COL = '5'.
1538| WA_COLORF-COLOR-INT = '1'.
1539| WA_COLORF-COLOR-INV = '0'.
1540| WA_COLORF-NOKEYCOL = 'X'.
1541| APPEND WA_COLORF TO INT_COLORF.
1542|
1543| GT_AUSGLOP-COLORF = INT_COLORF.
1544| GT_AUSGLOP-SIM = 'X'.
1545| MODIFY GT_AUSGLOP.
1546| ENDLOOP.
1547| RS_SELFIELD-REFRESH = 'X'.
1548| IF SY-SUBRC <> 0.
1549| ERR_DEB = SEL_AUSGLOP_ITAB-KUNNR.
1550| ENDIF.
1551| ENDLOOP.
```
- **EN**: Show the simulated tax invoice number in GT_AUSGLOP with a colored AUGBL cell and SIM flag, then refresh the ALV.
- 테이블(파서): read - / write [GT_AUSGLOP](/tables/GT_AUSGLOP.md)
- 업무 키워드: 시뮬레이션 결과 표시, ALV 갱신, 셀 색상
- English: Simulation Result, ALV Refresh, Cell Color
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`GT_AUSGLOP`](#decl-zfir0140top-259-gt_ausglop), [`WA_COLORF`](#decl-zfir0140top-255-wa_colorf), [`INT_COLORF`](#decl-zfir0140top-257-int_colorf), [`ERR_DEB`](#decl-zfir0140top-56-err_deb)
- 위치: `abap://ZFIR0140/ZFIR0140#L1528-L1551` · confidence 0.8 · `ZFIR0140#ZFIR0140#FORM#USER_COMMAND#C11`
### FORM GET_TAXINVOICE_YEAR — `ZFIR0140` L1676-L1708 (33줄)
*선택 항목의 전기일(BUDAT)과 회사코드로 FI_PERIOD_DETERMINE 을 호출해 세금계산서 채번에 쓸 회계연도(YEAR)를 구한다.*
> 이 unit 의 조각 1개가 26/33줄(79%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] 전기일·회사코드로 FI_PERIOD_DETERMINE 을 호출해 회계연도(E_GJAHR)를 YEAR 에 받아 세금계산서 번호범위 채번 연도로 사용한다.
```abap
1680| CALL FUNCTION 'FI_PERIOD_DETERMINE'
1681| EXPORTING
1682| I_BUDAT = SEL_AUSGLOP_ITAB-BUDAT
1683| I_BUKRS = DD_BUKRS-LOW
1684| * I_PERIV = ' '
1685| * I_GJAHR = 0000
1686| * I_MONAT = 00
1687| * X_XMO16 = ' '
1688| IMPORTING
1689| E_GJAHR = YEAR.
1690| * E_MONAT =
1691| * E_POPER =
1692| * EXCEPTIONS
1693| * FISCAL_YEAR = 1
1694| * PERIOD = 2
1695| * PERIOD_VERSION = 3
1696| * POSTING_PERIOD = 4
1697| * SPECIAL_PERIOD = 5
1698| * VERSION = 6
1699| * POSTING_DATE = 7
1700| * OTHERS = 8
1701| .
1702| IF SY-SUBRC <> 0.
1703| * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
1704| * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
1705| ENDIF.
```
- **EN**: Determine the fiscal year from posting date and company code via FI_PERIOD_DETERMINE; the year is used as TOYEAR for tax invoice number assignment.
- 호출(파서): FI_PERIOD_DETERMINE
- SAP 객체: FI_PERIOD_DETERMINE
- 업무 키워드: 회계연도, 전기일, 기간 결정, 채번 연도
- English: Fiscal Year, Posting Date, Period Determination
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`YEAR`](#decl-zfir0140top-224-year)
- 선언을 못 찾은 이름: DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L1680-L1705` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#GET_TAXINVOICE_YEAR#C1`
### FORM COLLECTIVE_INVOICES — `ZFIR0140` L1757-L1812 (56줄)
*합산 세금계산서 방식으로 고객(KUNNR)·사업장(BUPLA) 단위(CPD 고객은 전표 단위)로 세금계산서 번호를 채번해 선택 항목(SEL_AUSGLOP_ITAB-AUGBL)에 부여한다.*
> 이 unit 의 조각 3개가 43/56줄(77%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [aggregation] 선택된 발행 항목에서 일반 고객은 고객번호·사업장(KUNNR, BUPLA) 기준으로 중복 제거하여 합산 단위(CUST_TAB)를 만들고, 일회성(CPD, XCPDK='X') 고객은 전표별로 개별 단위로 추가한다.
```abap
1763| LOOP AT SEL_AUSGLOP_ITAB WHERE XCPDK = ' '.
1764| MOVE-CORRESPONDING SEL_AUSGLOP_ITAB TO CUST_TAB.
1765| APPEND CUST_TAB.
1766| ENDLOOP.
1767|
1768| SORT CUST_TAB BY KUNNR BUPLA.
1769| DELETE ADJACENT DUPLICATES FROM CUST_TAB COMPARING KUNNR BUPLA.
1770|
1771| LOOP AT SEL_AUSGLOP_ITAB WHERE XCPDK = 'X'.
1772| MOVE-CORRESPONDING SEL_AUSGLOP_ITAB TO CUST_TAB.
1773| APPEND CUST_TAB.
1774| ENDLOOP.
```
- **EN**: Build the collective invoice grouping table CUST_TAB: one entry per customer/business place (KUNNR, BUPLA) for regular customers and one per document for one-time (CPD) customers.
- 업무 키워드: 합산 세금계산서, 고객별 그룹핑, 사업장, 일회성 고객, 중복 제거
- English: Collective Tax Invoice, One-time Customer, Business Place, Customer Grouping
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`CUST_TAB`](#decl-zfir0140top-215-cust_tab), [`CODE`](#decl-zfir0140top-281-code), [`BUPLA`](#decl-zfir0140top-290-bupla)
- 위치: `abap://ZFIR0140/ZFIR0140#L1763-L1774` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#COLLECTIVE_INVOICES#C1`
#### [fm_call] 합산 단위(CUST_TAB)마다 시뮬레이션이면 순번을, 실제 발행이면 GET_TAX_INVOICE_NUMBER(NUMBER_GET_NEXT, RF_BELEG)로 세금계산서 번호를 채번해 AUGBL 에 저장한다.
```abap
1777| IF SIM = 'X'.
1778| NUMBER = 0.
1779| ENDIF.
1780| *End of simulate
1781|
1782| LOOP AT CUST_TAB.
1783| *Simulate
1784| IF SIM = 'X'.
1785| NUMBER = NUMBER + 1.
1786| ELSE.
1787| PERFORM GET_TAX_INVOICE_NUMBER.
1788| ENDIF.
1789| *End of simulate
1790|
1791| CUST_TAB-AUGBL = NUMBER.
1792| MODIFY CUST_TAB TRANSPORTING AUGBL.
1793| ENDLOOP.
```
- **EN**: For each grouping entry assign a tax invoice number: a running counter in simulation mode, otherwise a real number from GET_TAX_INVOICE_NUMBER (NUMBER_GET_NEXT on RF_BELEG).
- 호출(파서): GET_TAX_INVOICE_NUMBER
- SAP 객체: NUMBER_GET_NEXT, RF_BELEG
- 업무 키워드: 세금계산서 번호, 채번, 번호범위, 시뮬레이션
- English: Tax Invoice Number, Number Range, Simulation, NUMBER_GET_NEXT
- 정의부(복사 시 함께 필요): [`SIM`](#decl-zfir0140top-65-sim), [`NUMBER`](#decl-zfir0140top-225-number), [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`CUST_TAB`](#decl-zfir0140top-215-cust_tab)
- 위치: `abap://ZFIR0140/ZFIR0140#L1777-L1793` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#COLLECTIVE_INVOICES#C2`
#### [other] 채번된 세금계산서 번호(AUGBL)를 CPD 고객은 해당 전표 한 건에, 일반 고객은 같은 고객·사업장의 모든 선택 항목(SEL_AUSGLOP_ITAB)에 되돌려 반영한다.
```abap
1795| LOOP AT CUST_TAB.
1796| IF CUST_TAB-XCPDK = 'X'.
1797| READ TABLE SEL_AUSGLOP_ITAB WITH KEY KUNNR = CUST_TAB-KUNNR BELNR =
1798| CUST_TAB-BELNR.
1799| SEL_AUSGLOP_ITAB-AUGBL = CUST_TAB-AUGBL.
1800| MODIFY SEL_AUSGLOP_ITAB INDEX SY-TABIX TRANSPORTING AUGBL.
1801| ELSE.
1802|
1803| SEL_AUSGLOP_ITAB-AUGBL = CUST_TAB-AUGBL.
1804|
1805| MODIFY SEL_AUSGLOP_ITAB TRANSPORTING AUGBL WHERE
1806| KUNNR = CUST_TAB-KUNNR AND BUPLA = CUST_TAB-BUPLA.
1807| ENDIF.
1808| ENDLOOP.
```
- **EN**: Write the assigned tax invoice number back to SEL_AUSGLOP_ITAB: to the single document for CPD customers, or to all items of the same customer and business place otherwise.
- 테이블(파서): read - / write [SEL_AUSGLOP_ITAB](/tables/SEL_AUSGLOP_ITAB.md)
- 업무 키워드: 세금계산서 번호 반영, 합산 단위, 일회성 고객
- English: Tax Invoice Number, Collective Invoice, One-time Customer
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`CUST_TAB`](#decl-zfir0140top-215-cust_tab), [`CODE`](#decl-zfir0140top-281-code), [`BUPLA`](#decl-zfir0140top-290-bupla)
- 위치: `abap://ZFIR0140/ZFIR0140#L1795-L1808` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#COLLECTIVE_INVOICES#C3`
### FORM GET_TAX_INVOICE_NUMBER — `ZFIR0140` L1717-L1748 (32줄)
*전표유형 번호범위(T003-NUMKR)와 회사코드·회계연도로 NUMBER_GET_NEXT(RF_BELEG)를 호출해 세금계산서 번호(NUMBER)를 채번한다.*
> 이 unit 의 조각 1개가 25/32줄(78%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] FI 전표 번호범위 객체 RF_BELEG 에서 전표유형의 번호범위(T003-NUMKR)·회사코드·연도로 다음 번호를 받아 세금계산서 번호로 사용한다(예외 처리는 주석 처리됨).
```abap
1721| CALL FUNCTION 'NUMBER_GET_NEXT'
1722| EXPORTING
1723| NR_RANGE_NR = T003-NUMKR
1724| OBJECT = 'RF_BELEG'
1725| * QUANTITY = '1'
1726| SUBOBJECT = DD_BUKRS-LOW
1727| TOYEAR = YEAR
1728| * IGNORE_BUFFER = ' '
1729| IMPORTING
1730| NUMBER = NUMBER.
1731| * QUANTITY =
1732| * RETURNCODE =
1733| * EXCEPTIONS
1734| * INTERVAL_NOT_FOUND = 1
1735| * NUMBER_RANGE_NOT_INTERN = 2
1736| * OBJECT_NOT_FOUND = 3
1737| * QUANTITY_IS_0 = 4
1738| * QUANTITY_IS_NOT_1 = 5
1739| * INTERVAL_OVERFLOW = 6
1740| * OTHERS = 7
1741| .
1742| IF SY-SUBRC <> 0.
1743| * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
1744| * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
1745| ENDIF.
```
- **EN**: Call NUMBER_GET_NEXT on number range object RF_BELEG (range T003-NUMKR, subobject company code, fiscal year) to obtain the next tax invoice number; exception handling is commented out.
- 호출(파서): NUMBER_GET_NEXT
- SAP 객체: NUMBER_GET_NEXT, RF_BELEG, T003
- 업무 키워드: 세금계산서 번호, 채번, 번호범위, 회계연도
- English: Number Range, NUMBER_GET_NEXT, RF_BELEG, Fiscal Year
- 정의부(복사 시 함께 필요): [`T003`](#decl-zfir0140top-23-t003), [`YEAR`](#decl-zfir0140top-224-year), [`NUMBER`](#decl-zfir0140top-225-number)
- 선언을 못 찾은 이름: DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L1721-L1745` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#GET_TAX_INVOICE_NUMBER#C1`
### FORM INDIVIDUAL_INVOICES — `ZFIR0140` L1821-L1867 (47줄)
*개별 세금계산서 방식으로 선택된 전표마다 NUMBER_GET_NEXT(RF_BELEG)로 세금계산서 번호를 채번해 SEL_AUSGLOP_ITAB-AUGBL 에 부여한다(시뮬레이션이면 순번).*
> 이 unit 의 조각 1개가 41/47줄(87%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] 선택된 발행 항목마다 시뮬레이션이면 순번을, 실제 발행이면 NUMBER_GET_NEXT(객체 RF_BELEG, 번호범위 T003-NUMKR, 회사코드·연도)로 전표번호범위에서 세금계산서 번호를 채번해 AUGBL 에 저장한다.
```abap
1824| IF SIM = 'X'.
1825| NUMBER = 0.
1826| ENDIF.
1827|
1828| LOOP AT SEL_AUSGLOP_ITAB.
1829|
1830| *Simulate
1831| IF SIM = 'X'.
1832| NUMBER = NUMBER + 1.
1833| ELSE.
1834|
1835| CALL FUNCTION 'NUMBER_GET_NEXT'
1836| EXPORTING
1837| NR_RANGE_NR = T003-NUMKR
1838| OBJECT = 'RF_BELEG'
1839| * QUANTITY = '1'
1840| SUBOBJECT = DD_BUKRS-LOW
1841| TOYEAR = YEAR
1842| * IGNORE_BUFFER = ' '
1843| IMPORTING
1844| NUMBER = NUMBER.
1845| * QUANTITY =
1846| * RETURNCODE =
1847| * EXCEPTIONS
1848| * INTERVAL_NOT_FOUND = 1
1849| * NUMBER_RANGE_NOT_INTERN = 2
1850| * OBJECT_NOT_FOUND = 3
1851| * QUANTITY_IS_0 = 4
1852| * QUANTITY_IS_NOT_1 = 5
1853| * INTERVAL_OVERFLOW = 6
1854| * OTHERS = 7
1855| .
1856| IF SY-SUBRC <> 0.
1857| * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
1858| * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
1859| ENDIF.
1860| ENDIF.
1861| SEL_AUSGLOP_ITAB-AUGBL = NUMBER.
1862| MODIFY SEL_AUSGLOP_ITAB TRANSPORTING AUGBL.
1863|
1864| ENDLOOP.
```
- **EN**: For each selected item assign an individual tax invoice number: a counter in simulation mode, otherwise NUMBER_GET_NEXT on object RF_BELEG with number range T003-NUMKR, company code and fiscal year, stored in AUGBL.
- 테이블(파서): read - / write [SEL_AUSGLOP_ITAB](/tables/SEL_AUSGLOP_ITAB.md)
- 호출(파서): NUMBER_GET_NEXT
- SAP 객체: NUMBER_GET_NEXT, RF_BELEG, T003
- 업무 키워드: 개별 세금계산서, 채번, 번호범위, 전표유형 번호범위, 시뮬레이션
- English: Individual Tax Invoice, Number Range, NUMBER_GET_NEXT, Document Type
- 정의부(복사 시 함께 필요): [`SIM`](#decl-zfir0140top-65-sim), [`NUMBER`](#decl-zfir0140top-225-number), [`SEL_AUSGLOP_ITAB`](#decl-zfir0140top-126-sel_ausglop_itab), [`T003`](#decl-zfir0140top-23-t003), [`YEAR`](#decl-zfir0140top-224-year)
- 선언을 못 찾은 이름: DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L1824-L1864` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#INDIVIDUAL_INVOICES#C1`
### FORM POSSIBLE_ENTRY — `ZFIR0140` L2154-L2200 (47줄)
*매출 세금계산서용 세금코드(A1~A8)와 한글 설명을 하드코딩으로 구성해 세금코드 F4 도움말(VALUE_HELP)을 표시한다.*
> 이 unit 의 조각 1개가 37/47줄(79%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] T007S 조회 대신 매출 세금코드 A1(일반)·A2(주민번호)·A4(특판)·A6~A8(영세율)과 설명을 IT_T007S 에 하드코딩하고 값 도움말 필드·값 테이블을 만들어 VALUE_HELP 팝업을 띄운다.
```abap
2162| MOVE 'A1' TO IT_T007S-MWSKZ.
2163| MOVE '세금계산서(일반)' TO IT_T007S-TEXT1.
2164| APPEND IT_T007S.
2165| MOVE 'A2' TO IT_T007S-MWSKZ.
2166| MOVE '세금계산서(주민번호발행)' TO IT_T007S-TEXT1.
2167| APPEND IT_T007S.
2168| MOVE 'A4' TO IT_T007S-MWSKZ.
2169| MOVE '세금계산서(특판)' TO IT_T007S-TEXT1.
2170| APPEND IT_T007S.
2171| MOVE 'A6' TO IT_T007S-MWSKZ.
2172| MOVE '세금계산서(영세율)' TO IT_T007S-TEXT1.
2173| APPEND IT_T007S.
2174| MOVE 'A7' TO IT_T007S-MWSKZ.
2175| MOVE '세금계산서(영세율-수출면장)' TO IT_T007S-TEXT1.
2176| APPEND IT_T007S.
2177| MOVE 'A8' TO IT_T007S-MWSKZ.
2178| MOVE '세금계산서(영세율-국내수출)' TO IT_T007S-TEXT1.
2179| APPEND IT_T007S.
2180|
2181|
2182| T_HELPFIELD-TABNAME = 'T007S'.
2183| T_HELPFIELD-FIELDNAME = 'MWSKZ'.
2184| T_HELPFIELD-SELECTFLAG = 'X'.
2185| APPEND T_HELPFIELD.
2186| T_HELPFIELD-TABNAME = 'T007S'.
2187| T_HELPFIELD-FIELDNAME = 'TEXT1'.
2188| T_HELPFIELD-SELECTFLAG = ' '.
2189| APPEND T_HELPFIELD.
2190|
2191| LOOP AT IT_T007S.
2192| T_HELPVALUE-VALUE = IT_T007S-MWSKZ.
2193| APPEND T_HELPVALUE.
2194| T_HELPVALUE-VALUE = IT_T007S-TEXT1.
2195| APPEND T_HELPVALUE.
2196| ENDLOOP.
2197|
2198| PERFORM VALUE_HELP USING '세금코드 조회'.
```
- **EN**: Hard-code the sales tax codes A1..A8 with Korean descriptions instead of reading T007S, build the help field/value tables and call VALUE_HELP to show the tax code F4 popup.
- 호출(파서): VALUE_HELP
- SAP 객체: T007S, HELP_VALUES_GET_WITH_TABLE_EXT
- 업무 키워드: 세금코드, 값 도움말, 영세율, 세금계산서 유형
- English: Tax Code, F4 Help, Zero-rated Tax, T007S
- 정의부(복사 시 함께 필요): [`IT_T007S`](#decl-zfir0140top-299-it_t007s), [`T_HELPFIELD`](#decl-zfir0140top-304-t_helpfield), [`T_HELPVALUE`](#decl-zfir0140top-312-t_helpvalue)
- 위치: `abap://ZFIR0140/ZFIR0140#L2162-L2198` · confidence 0.8 · `ZFIR0140#ZFIR0140#FORM#POSSIBLE_ENTRY#C1`
### FORM CHECK_MWSKZ — `ZFIR0140` L2269-L2290 (22줄)
*세금코드 선택조건(SMWSKZ)이 비어 있으면 매출 세금계산서 대상 세금코드(A1,A2,A4,A6,A7,A8)를 기본값으로 채운다.*
> 이 unit 의 조각 1개가 18/22줄(82%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 사용자가 세금코드(MWSKZ)를 입력하지 않으면 매출 세금계산서 대상 세금코드 A1·A2·A4·A6·A7·A8 을 SMWSKZ 선택옵션에 기본 적용한다.
```abap
2271| IF SMWSKZ-LOW EQ SPACE AND SMWSKZ-HIGH EQ SPACE.
2272| SMWSKZ-SIGN = 'I'.
2273| SMWSKZ-OPTION = 'EQ'.
2274|
2275| SMWSKZ-LOW = 'A1'.
2276| APPEND SMWSKZ.
2277| SMWSKZ-LOW = 'A2'.
2278| APPEND SMWSKZ.
2279| SMWSKZ-LOW = 'A4'.
2280| APPEND SMWSKZ.
2281| SMWSKZ-LOW = 'A6'.
2282| APPEND SMWSKZ.
2283| SMWSKZ-LOW = 'A7'.
2284| APPEND SMWSKZ.
2285| SMWSKZ-LOW = 'A8'.
2286| APPEND SMWSKZ.
2287|
2288| ENDIF.
```
- **EN**: Default the tax code select-option SMWSKZ to the output tax codes A1, A2, A4, A6, A7, A8 used for sales tax invoices when the user entered none.
- 업무 키워드: 세금코드, 기본값, 매출부가세, 영세율, 선택옵션
- English: Tax Code, Select-Option, Output Tax, Default Value
- 정의부(복사 시 함께 필요): [`SMWSKZ`](#decl-zfir0140-47-smwskz)
- 위치: `abap://ZFIR0140/ZFIR0140#L2271-L2288` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#CHECK_MWSKZ#C1`
### FORM GET_SALES_TAX_SGTXT — `ZFIR0140` L2454-L2474 (21줄)
*발행 대상 각 전표의 매출부가세 라인(BSEG MWART='A')의 품목텍스트(SGTXT)를 읽어 AUSGLOP_ITAB 에 보강한다.*
> 이 unit 의 조각 1개가 17/21줄(81%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 발행 대상 전표별로 BSEG 에서 매출부가세 라인(MWART='A')을 SELECT SINGLE 하여 그 품목텍스트(SGTXT)를 세금계산서 적요로 AUSGLOP_ITAB 에 반영한다.
```abap
2456| LOOP AT AUSGLOP_ITAB.
2457|
2458| * SELECT SINGLE * FROM bseg WHERE belnr = ausglop_itab-belnr
2459| * AND mwart = 'A'.
2460| * 아래와 같이 고침 2003.10.14
2461|
2462| SELECT SINGLE * FROM BSEG WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2463| AND BELNR = AUSGLOP_ITAB-BELNR
2464| AND GJAHR = AUSGLOP_ITAB-GJAHR
2465| AND MWART = 'A'.
2466|
2467|
2468| IF SY-SUBRC EQ 0.
2469| MOVE BSEG-SGTXT TO AUSGLOP_ITAB-SGTXT.
2470| MODIFY AUSGLOP_ITAB.
2471| ENDIF.
2472| ENDLOOP.
```
- **EN**: For each candidate document, read the output tax line (MWART='A') from BSEG and copy its item text SGTXT into AUSGLOP_ITAB as the tax invoice description.
- 테이블(파서): read [BSEG](/tables/BSEG.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSEG
- 업무 키워드: 매출부가세, 품목텍스트, 적요, 세금라인
- English: Output Tax, Item Text, BSEG, Tax Line
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`BSEG`](#decl-zfir0140top-8-bseg), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs)
- 위치: `abap://ZFIR0140/ZFIR0140#L2456-L2472` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#GET_SALES_TAX_SGTXT#C1`
### FORM PARK_DOCUMENT_SELECTION — `ZFIR0140` L2483-L2567 (85줄)
*임시저장(Parked) 매출전표(VBKPF/VBSEGD/VBSEGS)를 읽어 고객·세금코드·공급가액·세액을 계산하고 세금계산서 발행 대상(AUSGLOP_ITAB)으로 적재한다.*
> 이 unit 의 조각 3개가 72/85줄(85%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 선택화면 조건(회사코드·전표번호·전기일·전표유형 DR)에 맞는 임시저장(BSTAT='V') 매출전표 헤더를 VBKPF 에서 조회한다.
```abap
2492| SELECT * INTO CORRESPONDING FIELDS OF TABLE P_AUSGLOP_ITAB
2493| FROM VBKPF
2494| WHERE BUKRS = DD_BUKRS-LOW
2495| AND AUSBK = DD_BUKRS-LOW
2496| AND BELNR IN SBELNR
2497| AND BLDAT IN SBDAT
2498| AND BUDAT IN SBUDAT
2499| AND BUDAT IN SFKDAT
2500| AND BLART IN PBLART
2501| AND BLART EQ 'DR'
2502| AND BSTAT EQ 'V'.
```
- **EN**: Select parked (BSTAT='V') customer invoice document headers of type DR from VBKPF by company code, document number and posting date ranges.
- 테이블(파서): read [VBKPF](/tables/VBKPF.md) / write -
- SAP 객체: VBKPF
- 업무 키워드: 임시전표, 매출전표, 전표헤더, 회사코드, 전표유형
- English: Parked Document, Document Header, Company Code, Document Type
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`P_AUSGLOP_ITAB`](#decl-zfir0140top-176-p_ausglop_itab), [`VBKPF`](#decl-zfir0140top-24-vbkpf), [`CODE`](#decl-zfir0140top-281-code), [`BUKRS`](#decl-zfir0140top-291-bukrs), [`SBELNR`](#decl-zfir0140-57-sbelnr), [`SBDAT`](#decl-zfir0140-58-sbdat), [`SBUDAT`](#decl-zfir0140-48-sbudat), [`SFKDAT`](#decl-zfir0140-66-sfkdat), [`BLART`](#decl-zfir0140top-289-blart), [`PBLART`](#decl-zfir0140-49-pblart)
- 선언을 못 찾은 이름: DD_BUKRS (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L2492-L2502` · confidence 0.9 · `ZFIR0140#ZFIR0140#FORM#PARK_DOCUMENT_SELECTION#C1`
#### [calculation] 각 임시전표에 대해 VBSEGD 고객라인을 읽어 고객·세금코드·금액을 채우고, 자동세금계산(XMWST) 여부에 따라 Z_SB_TAX_CAL 세율로 역산하거나 입력세액(MWSTS) 또는 VBSEGS 세금라인(MWART='A')에서 공급가액(HWBAS)·세액(HWSTE)을 결정하며 고객라인이 없으면 대상에서 제외한다.
```abap
2504| LOOP AT P_AUSGLOP_ITAB.
2505| CLEAR : VBSEGD, VBSEGS, T_VBSEGS, T_VBSEGS[], GV_KBETR.
2506| SELECT SINGLE *
2507| FROM VBSEGD
2508| WHERE AUSBK EQ P_AUSGLOP_ITAB-BUKRS
2509| AND BELNR EQ P_AUSGLOP_ITAB-BELNR
2510| AND GJAHR EQ P_AUSGLOP_ITAB-GJAHR
2511| AND KUNNR IN DD_KUNNR
2512| AND MWSKZ IN SMWSKZ.
2513|
2514| IF SY-SUBRC EQ 0.
2515| MOVE : VBSEGD-KUNNR TO P_AUSGLOP_ITAB-KUNNR,
2516| VBSEGD-BUPLA TO P_AUSGLOP_ITAB-BUPLA,
2517| VBSEGD-MWSKZ TO P_AUSGLOP_ITAB-MWSKZ,
2518| VBSEGD-ZTERM TO P_AUSGLOP_ITAB-ZTERM,
2519| VBSEGD-DMBTR TO P_AUSGLOP_ITAB-DMBTR. " 총금액
2520|
2521| * 1. 자동계산을 체크하는 방법
2522| IF P_AUSGLOP_ITAB-XMWST EQ 'X'.
2523| CALL FUNCTION 'Z_SB_TAX_CAL'
2524| EXPORTING
2525| MWSKZ = VBSEGD-MWSKZ
2526| IMPORTING
2527| KBETR = GV_KBETR.
2528| IF NOT GV_KBETR IS INITIAL.
2529| P_AUSGLOP_ITAB-HWBAS = VBSEGD-DMBTR / GV_KBETR.
2530| P_AUSGLOP_ITAB-HWSTE = VBSEGD-DMBTR - P_AUSGLOP_ITAB-HWBAS.
2531|
2532| ENDIF.
2533| ELSE.
2534| * 2. 자동계산 체크 안하고 세액을 직접 입력하는 방법
2535| IF VBSEGD-MWSKZ NE ''.
2536| P_AUSGLOP_ITAB-HWBAS = VBSEGD-DMBTR - VBSEGD-MWSTS.
2537| P_AUSGLOP_ITAB-HWSTE = VBSEGD-MWSTS.
2538| * 3. 자동계산 체크 않하고 전표항목에 세금계정을 추가해서 생성하는 방법
2539| ELSE.
2540| SELECT SINGLE *
2541| FROM VBSEGS
2542| WHERE AUSBK = P_AUSGLOP_ITAB-BUKRS
2543| AND BELNR = P_AUSGLOP_ITAB-BELNR
2544| AND GJAHR = P_AUSGLOP_ITAB-GJAHR
2545| AND MWART EQ 'A' " 매출 부가가치세
2546| AND MWSKZ IN SMWSKZ.
2547| P_AUSGLOP_ITAB-HWBAS = VBSEGS-HWBAS.
2548| P_AUSGLOP_ITAB-HWSTE = VBSEGS-DMBTR.
2549| P_AUSGLOP_ITAB-MWSKZ = VBSEGS-MWSKZ.
2550| ENDIF.
2551| ENDIF.
2552| MODIFY P_AUSGLOP_ITAB.
2553| CLEAR P_AUSGLOP_ITAB.
2554| ELSE.
2555| DELETE P_AUSGLOP_ITAB.
2556| CLEAR P_AUSGLOP_ITAB.
2557| ENDIF.
2558| ENDLOOP.
```
- **EN**: For each parked document read the customer line from VBSEGD and derive tax base (HWBAS) and tax amount (HWSTE) either via Z_SB_TAX_CAL rate back-calculation, the entered tax amount, or the output tax G/L line in VBSEGS (MWART='A'); drop documents without a matching customer line.
- 테이블(파서): read [VBSEGD](/tables/VBSEGD.md), [VBSEGS](/tables/VBSEGS.md) / write -
- 호출(파서): Z_SB_TAX_CAL
- SAP 객체: VBSEGD, VBSEGS, Z_SB_TAX_CAL
- 업무 키워드: 공급가액, 세액, 자동세금계산, 세금코드, 매출부가세, 고객라인
- English: Tax Base Amount, Tax Amount, Tax Code, Output Tax, Customer Line Item
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`P_AUSGLOP_ITAB`](#decl-zfir0140top-176-p_ausglop_itab), [`VBSEGD`](#decl-zfir0140top-25-vbsegd), [`VBSEGS`](#decl-zfir0140top-26-vbsegs), [`T_VBSEGS`](#decl-zfir0140top-177-t_vbsegs), [`GV_KBETR`](#decl-zfir0140top-180-gv_kbetr), [`SMWSKZ`](#decl-zfir0140-47-smwskz)
- 선언을 못 찾은 이름: DD_KUNNR (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIR0140/ZFIR0140#L2504-L2558` · confidence 0.85 · `ZFIR0140#ZFIR0140#FORM#PARK_DOCUMENT_SELECTION#C2`
#### [other] 계산이 끝난 임시전표 목록을 세금계산서 발행 대상 내부테이블 AUSGLOP_ITAB 으로 옮긴다.
```abap
2560| CLEAR : AUSGLOP_ITAB.
2561| LOOP AT P_AUSGLOP_ITAB.
2562| MOVE-CORRESPONDING P_AUSGLOP_ITAB TO AUSGLOP_ITAB.
2563| APPEND AUSGLOP_ITAB.
2564| CLEAR AUSGLOP_ITAB.
2565| ENDLOOP.
```
- **EN**: Copy the processed parked documents into the tax invoice candidate table AUSGLOP_ITAB.
- 업무 키워드: 발행대상, 내부테이블 복사
- English: Tax Invoice, Internal Table
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0140top-74-ausglop_itab), [`P_AUSGLOP_ITAB`](#decl-zfir0140top-176-p_ausglop_itab)
- 위치: `abap://ZFIR0140/ZFIR0140#L2560-L2565` · confidence 0.8 · `ZFIR0140#ZFIR0140#FORM#PARK_DOCUMENT_SELECTION#C3`
## 정의부 (131건)
로직 조각을 다른 프로그램으로 옮겨 붙일 때 **함께 가야 하는 선언**이다. 조각별로 무엇이 필요한지는 위 조각 항목의 `정의부` 줄에 있고(이름을 누르면 여기로 온다), 붙여넣기용으로 의존까지 묶은 코드는 `GET /chunks/<chunk_id>``declaration_code` 로 받는다.
### `ZFIR0140` (42건)
#### SBAREA — select-option · L45-L45 {#decl-zfir0140-45-sbarea}
```abap
SELECT-OPTIONS: SBAREA FOR BSID-GSBER NO-DISPLAY.
```
#### SBUPLA — select-option · L46-L46 {#decl-zfir0140-46-sbupla}
```abap
SELECT-OPTIONS: SBUPLA FOR BSID-BUPLA.
```
#### SMWSKZ — select-option · L47-L47 {#decl-zfir0140-47-smwskz}
```abap
SELECT-OPTIONS: SMWSKZ FOR BSET-MWSKZ.
```
#### SBUDAT — select-option · L48-L48 {#decl-zfir0140-48-sbudat}
```abap
SELECT-OPTIONS: SBUDAT FOR BSID-BUDAT.
```
#### PBLART — select-option · L49-L49 {#decl-zfir0140-49-pblart}
```abap
SELECT-OPTIONS: PBLART FOR BKPF-BLART. " Document type
```
#### SBELNR — select-option · L57-L57 {#decl-zfir0140-57-sbelnr}
```abap
SELECT-OPTIONS: SBELNR FOR BSID-BELNR. "acc. doc. number
```
#### SBDAT — select-option · L58-L58 {#decl-zfir0140-58-sbdat}
```abap
SELECT-OPTIONS: SBDAT FOR BSID-BLDAT. "acc. doc date
```
#### SVBELN — select-option · L64-L64 {#decl-zfir0140-64-svbeln}
```abap
SELECT-OPTIONS: SVBELN FOR VBRK-VBELN NO-DISPLAY. "billing document
```
#### SFKART — select-option · L65-L65 {#decl-zfir0140-65-sfkart}
```abap
SELECT-OPTIONS: SFKART FOR VBRK-FKART NO-DISPLAY. "bill. doc. type
```
#### SFKDAT — select-option · L66-L66 {#decl-zfir0140-66-sfkdat}
```abap
SELECT-OPTIONS: SFKDAT FOR VBRK-FKDAT NO-DISPLAY. "billing date
```
#### SBLDAT — parameter · L72-L72 {#decl-zfir0140-72-sbldat}
```abap
PARAMETERS: SBLDAT LIKE BSID-BLDAT. " DEFAULT sy-datum OBLIGATORY.
```
#### SBLART — parameter · L74-L74 {#decl-zfir0140-74-sblart}
```abap
PARAMETERS: SBLART LIKE BKPF-BLART OBLIGATORY. " DEFAULT 'T1'.
```
#### SN1OP — parameter · L81-L81 {#decl-zfir0140-81-sn1op}
```abap
PARAMETER SN1OP RADIOBUTTON GROUP OPIT DEFAULT 'X'. "aggregate invoices
```
#### S11OP — parameter · L82-L82 {#decl-zfir0140-82-s11op}
```abap
PARAMETER S11OP RADIOBUTTON GROUP OPIT. "indiv.invoices
```
#### STA1 — parameter · L88-L88 {#decl-zfir0140-88-sta1}
```abap
PARAMETER STA1 RADIOBUTTON GROUP TATI DEFAULT 'X'. " normal tax inv.
```
#### STA2 — parameter · L89-L89 {#decl-zfir0140-89-sta2}
```abap
PARAMETER STA2 RADIOBUTTON GROUP TATI. "tax exempted tax inv
```
#### SAP — parameter · L94-L94 {#decl-zfir0140-94-sap}
```abap
PARAMETER SAP RADIOBUTTON GROUP OUT. " SAP Script output
```
#### FULLLIST — parameter · L95-L95 {#decl-zfir0140-95-fulllist}
```abap
PARAMETER FULLLIST RADIOBUTTON GROUP OUT DEFAULT 'X'. "List Output
```
#### LIST — parameter · L96-L96 {#decl-zfir0140-96-list}
```abap
PARAMETER LIST RADIOBUTTON GROUP OUT. " List Output
```
#### RECEIPT — parameter · L99-L99 {#decl-zfir0140-99-receipt}
```abap
PARAMETER RECEIPT RADIOBUTTON GROUP IND. " Receipt indicator
```
#### BILLING — parameter · L103-L103 {#decl-zfir0140-103-billing}
```abap
PARAMETER BILLING RADIOBUTTON GROUP IND DEFAULT 'X'." Billing indicator
```
#### P_MAXROW — parameter · L112-L112 {#decl-zfir0140-112-p_maxrow}
```abap
PARAMETERS: P_MAXROW TYPE I DEFAULT 50.
```
#### P_VARI — parameter · L115-L115 {#decl-zfir0140-115-p_vari}
```abap
PARAMETERS: P_VARI LIKE DISVARIANT-VARIANT.
```
#### P_ZEBRA — parameter · L119-L119 {#decl-zfir0140-119-p_zebra}
```abap
PARAMETERS:
P_ZEBRA AS CHECKBOX DEFAULT 'X'.
```
#### P_COLOPT — parameter · L120-L120 {#decl-zfir0140-120-p_colopt}
```abap
PARAMETERS:
P_COLOPT AS CHECKBOX DEFAULT 'X'.
```
#### CHCKBOXH — parameter · L122-L122 {#decl-zfir0140-122-chckboxh}
```abap
PARAMETERS:
CHCKBOXH RADIOBUTTON GROUP BOX.
```
#### CHCKBOXI — parameter · L123-L123 {#decl-zfir0140-123-chckboxi}
```abap
PARAMETERS:
CHCKBOXI RADIOBUTTON GROUP BOX DEFAULT 'X'.
```
#### P_DETPOP — parameter · L124-L124 {#decl-zfir0140-124-p_detpop}
```abap
PARAMETERS:
P_DETPOP AS CHECKBOX DEFAULT 'X'.
```
#### G_BOXNAM — data · L129-L129 {#decl-zfir0140-129-g_boxnam}
```abap
DATA: G_BOXNAM TYPE SLIS_FIELDNAME VALUE 'BOX'.
```
#### P_F2CODE — data · L130-L130 {#decl-zfir0140-130-p_f2code}
```abap
DATA:
P_F2CODE LIKE SY-UCOMM VALUE '&ETA'.
```
#### P_LIGNAM — data · L131-L131 {#decl-zfir0140-131-p_lignam}
```abap
DATA:
P_LIGNAM TYPE SLIS_FIELDNAME VALUE 'LIGHTS'.
```
#### G_SAVE — data · L132-L132 {#decl-zfir0140-132-g_save}
```abap
DATA:
G_SAVE(1) TYPE C.
```
#### G_TABNAME_HEADER — data · L133-L133 {#decl-zfir0140-133-g_tabname_header}
```abap
DATA:
G_TABNAME_HEADER TYPE SLIS_TABNAME.
```
#### G_TABNAME_ITEM — data · L134-L134 {#decl-zfir0140-134-g_tabname_item}
```abap
DATA:
G_TABNAME_ITEM TYPE SLIS_TABNAME.
```
#### G_DEFAULT — data · L135-L135 {#decl-zfir0140-135-g_default}
```abap
DATA:
G_DEFAULT(1) TYPE C.
```
#### G_EXIT — data · L136-L136 {#decl-zfir0140-136-g_exit}
```abap
DATA:
G_EXIT(1) TYPE C.
```
#### GX_VARIANT — data · L137-L137 {#decl-zfir0140-137-gx_variant}
```abap
DATA:
GX_VARIANT LIKE DISVARIANT.
```
#### G_VARIANT — data · L138-L138 {#decl-zfir0140-138-g_variant}
```abap
DATA:
G_VARIANT LIKE DISVARIANT.
```
#### LS_LINE — data · unit 로컬 · L1013-L1013 {#decl-zfir0140-1013-ls_line}
```abap
DATA: LS_LINE TYPE SLIS_LISTHEADER.
```
#### CLEAR — data · unit 로컬 · L1878-L1878 {#decl-zfir0140-1878-clear}
```abap
DATA : SIGN TYPE C, CLEAR TYPE C.
```
#### SIGN — data · unit 로컬 · L1878-L1878 {#decl-zfir0140-1878-sign}
```abap
DATA : SIGN TYPE C, CLEAR TYPE C.
```
#### L_STATE_INSC — data · unit 로컬 · L2066-L2066 {#decl-zfir0140-2066-l_state_insc}
```abap
DATA: L_STATE_INSC(4).
```
### `ZFIR0140TOP` (89건)
#### BSEG — tables · L8-L8 {#decl-zfir0140top-8-bseg}
```abap
TABLES: BSEG. " accounting document segment
```
#### BSID — tables · L9-L9 {#decl-zfir0140top-9-bsid}
```abap
TABLES:
BSID. " secondary index for customers
```
#### BSEC — tables · L10-L10 {#decl-zfir0140top-10-bsec}
```abap
TABLES:
BSEC. " One-time account data document
```
#### VBRK — tables · L12-L12 {#decl-zfir0140top-12-vbrk}
```abap
TABLES:
VBRK. " billing : header data
```
#### BSET — tables · L13-L13 {#decl-zfir0140top-13-bset}
```abap
TABLES:
BSET. " tax data document segment
```
#### T001 — tables · L14-L14 {#decl-zfir0140top-14-t001}
```abap
TABLES:
T001. " company codes
```
#### KNA1 — tables · L15-L15 {#decl-zfir0140top-15-kna1}
```abap
TABLES:
KNA1. " customers
```
#### FIMSG — tables · L16-L16 {#decl-zfir0140top-16-fimsg}
```abap
TABLES:
FIMSG. " structure
```
#### BKPF — tables · L17-L17 {#decl-zfir0140top-17-bkpf}
```abap
TABLES:
BKPF. " acc. document header
```
#### BSAD — tables · L18-L18 {#decl-zfir0140top-18-bsad}
```abap
TABLES:
BSAD. " sec. index for customers :
```
#### SADR — tables · L21-L21 {#decl-zfir0140top-21-sadr}
```abap
TABLES:
SADR. " address administration
```
#### T074U — tables · L22-L22 {#decl-zfir0140top-22-t074u}
```abap
TABLES:
T074U. " Special G/L indicator properties
```
#### T003 — tables · L23-L23 {#decl-zfir0140top-23-t003}
```abap
TABLES:
T003. " FI Document no range
```
#### VBKPF — tables · L24-L24 {#decl-zfir0140top-24-vbkpf}
```abap
TABLES:
VBKPF.
```
#### VBSEGD — tables · L25-L25 {#decl-zfir0140top-25-vbsegd}
```abap
TABLES:
VBSEGD.
```
#### VBSEGS — tables · L26-L26 {#decl-zfir0140top-26-vbsegs}
```abap
TABLES:
VBSEGS.
```
#### ZDTI_SAPP — tables · L27-L27 {#decl-zfir0140top-27-zdti_sapp}
```abap
TABLES:
ZDTI_SAPP.
```
#### ZDTI_STATUS — tables · L28-L28 {#decl-zfir0140top-28-zdti_status}
```abap
TABLES:
ZDTI_STATUS.
```
#### DATE — data · L35-L35 {#decl-zfir0140top-35-date}
```abap
DATA: DATE(12).
```
#### BUDATE — data · L36-L36 {#decl-zfir0140top-36-budate}
```abap
DATA: BUDATE(12).
```
#### BLDATE — data · L37-L37 {#decl-zfir0140top-37-bldate}
```abap
DATA: BLDATE(12).
```
#### ZFBDTE — data · L38-L38 {#decl-zfir0140top-38-zfbdte}
```abap
DATA: ZFBDTE(12).
```
#### SAVE1_KUNNR — data · L39-L39 {#decl-zfir0140top-39-save1_kunnr}
```abap
DATA: SAVE1_KUNNR LIKE BSID-KUNNR.
```
#### SAVE2_STCD — data · L40-L40 {#decl-zfir0140top-40-save2_stcd}
```abap
DATA: SAVE2_STCD LIKE BSEC-STCD1.
```
#### LINE_COUNT_SD — data · L41-L41 {#decl-zfir0140top-41-line_count_sd}
```abap
DATA: LINE_COUNT_SD TYPE I. "number of lines
```
#### LINE_COUNT_FI — data · L42-L42 {#decl-zfir0140top-42-line_count_fi}
```abap
DATA: LINE_COUNT_FI TYPE I. "number of lines
```
#### LINE_COUNT2 — data · L43-L43 {#decl-zfir0140top-43-line_count2}
```abap
DATA: LINE_COUNT2 TYPE I. "number of lines
```
#### LINE_COUNT — data · L44-L44 {#decl-zfir0140top-44-line_count}
```abap
DATA: LINE_COUNT TYPE I. "number of lines
```
#### SD_SELECTION — data · L45-L45 {#decl-zfir0140top-45-sd_selection}
```abap
DATA: SD_SELECTION. "check billing doc.
```
#### FI_SELECTION — data · L47-L47 {#decl-zfir0140top-47-fi_selection}
```abap
DATA: FI_SELECTION. "check accounting doc.
```
#### SEL_INDEX — data · L50-L50 {#decl-zfir0140top-50-sel_index}
```abap
DATA: SEL_INDEX TYPE I.
```
#### SAVE_BELNR — data · L51-L51 {#decl-zfir0140top-51-save_belnr}
```abap
DATA: SAVE_BELNR LIKE BSID-BELNR.
```
#### SAVE_AWTYP — data · L52-L52 {#decl-zfir0140top-52-save_awtyp}
```abap
DATA: SAVE_AWTYP LIKE BKPF-AWTYP.
```
#### SAVE_KUNNR — data · L53-L53 {#decl-zfir0140top-53-save_kunnr}
```abap
DATA: SAVE_KUNNR LIKE BSID-KUNNR.
```
#### SAVE_BUPLA — data · L54-L54 {#decl-zfir0140top-54-save_bupla}
```abap
DATA: SAVE_BUPLA LIKE BSID-BUPLA.
```
#### SAVE_UMSKZ — data · L55-L55 {#decl-zfir0140top-55-save_umskz}
```abap
DATA: SAVE_UMSKZ LIKE BSEG-UMSKZ.
```
#### ERR_DEB — data · L56-L56 {#decl-zfir0140top-56-err_deb}
```abap
DATA: ERR_DEB LIKE BSID-KUNNR.
```
#### SAVE_STCD — data · L57-L57 {#decl-zfir0140top-57-save_stcd}
```abap
DATA: SAVE_STCD LIKE KNA1-STCD1.
```
#### CLEARING_DATA — data · L58-L58 {#decl-zfir0140top-58-clearing_data}
```abap
DATA : CLEARING_DATA-SBUKRS LIKE BSID-BUKRS.
```
#### CLEARING_DATA — data · L59-L59 {#decl-zfir0140top-59-clearing_data}
```abap
DATA : CLEARING_DATA-SGJAHR LIKE BSID-GJAHR.
```
#### CLEARING_DATA — data · L60-L60 {#decl-zfir0140top-60-clearing_data}
```abap
DATA : CLEARING_DATA-LOW LIKE BSAD-AUGBL.
```
#### CLEARING_DATA — data · L61-L61 {#decl-zfir0140top-61-clearing_data}
```abap
DATA : CLEARING_DATA-HIGH LIKE BSAD-AUGBL.
```
#### CZTERM — data · L62-L62 {#decl-zfir0140top-62-czterm}
```abap
DATA: CZTERM LIKE VBRK-ZTERM.
```
#### CWAERS — data · L63-L63 {#decl-zfir0140top-63-cwaers}
```abap
DATA: CWAERS LIKE T001-WAERS.
```
#### SIM — data · L65-L65 {#decl-zfir0140top-65-sim}
```abap
DATA : SIM TYPE C.
```
#### AUSGLOP_ITAB — data · L74-L122 {#decl-zfir0140top-74-ausglop_itab}
```abap
DATA : BEGIN OF AUSGLOP_ITAB OCCURS 0,
BUKRS LIKE BSID-BUKRS, "company code
KUNNR LIKE BSID-KUNNR, "customer number
STCD2 LIKE BSEC-STCD2, "CPD tax code2
STCD1 LIKE BSEC-STCD1, "CPD tax code1
NAME1 LIKE BSEC-NAME1, "CPD-customer name
ORT01 LIKE BSEC-ORT01, "CPD-customer city
GJAHR LIKE BSID-GJAHR, "business year
GSBER LIKE BSID-GSBER, "business area
BUPLA LIKE BSID-BUPLA, "business place
BLART LIKE BKPF-BLART, "acc. document type
BELNR LIKE BSID-BELNR, "acc. document number
AUGBL LIKE BSAD-AUGBL, "clearing document number
KOART LIKE BSEG-KOART, "account type
BUZEI LIKE BSEG-BUZEI, "item line in acc. document
BUDAT LIKE BSID-BUDAT, "posting document date
BLDAT LIKE BSID-BLDAT, "acc. document date
SHKZG LIKE BSID-SHKZG, "debit/credit indicator
BSCHL LIKE BSID-BSCHL, "posting key
AWTYP LIKE BKPF-AWTYP, "object type for
"calling application
AWKEY LIKE BKPF-AWKEY, "object key
DMBTR LIKE BSID-DMBTR, "amount in local curr
WRBTR LIKE BSID-WRBTR, "amount in document currency
HWBAS LIKE BSET-HWBAS, "tax base amount
HWSTE LIKE BSET-HWSTE, "tax amount
FWBAS LIKE BSET-FWBAS, "tax base amount in doc. curr
FWSTE LIKE BSET-FWSTE, "tax amount in doc. curr
WAERS LIKE T001-WAERS, "company code currency
HWAER LIKE T001-WAERS, "company code currency
MWSKZ LIKE BSET-MWSKZ, "tax code
UMSKZ LIKE BSID-UMSKZ, "special G/L indicator
HKONT LIKE BSID-HKONT, "reconc. acc.
FISTL LIKE BSID-FISTL, "special G/L indicator
ZTERM LIKE BSEG-ZTERM, "payment terms
ZFBDT LIKE BSEG-ZFBDT, "base line date
VBELN LIKE VBRK-VBELN, "billing document
FKDAT LIKE VBRK-FKDAT, "billing date
FKART LIKE VBRK-FKART, "billing type
FKTYP LIKE VBRK-FKTYP, "billing category
MSCHL LIKE BSEG-MSCHL, "dunning key
MANSP LIKE BSEG-MANSP, "dunning block
MADAT LIKE BSEG-MADAT, "last dunned on
MANST LIKE BSEG-MANST, "dunning level
MABER LIKE BSEG-MABER, "dunning area
XCPDK LIKE KNA1-XCPDK, "one time customers..
SGTXT LIKE BSEG-SGTXT,
XMWST LIKE VBKPF-XMWST, "임시전표를 위한 추가
END OF AUSGLOP_ITAB.
```
#### SEL_AUSGLOP_ITAB — data · L126-L173 {#decl-zfir0140top-126-sel_ausglop_itab}
```abap
DATA: BEGIN OF SEL_AUSGLOP_ITAB OCCURS 0,
BUKRS LIKE BSID-BUKRS, "company code
KUNNR LIKE BSID-KUNNR, "customer number
XCPDK LIKE KNA1-XCPDK, "one time customer...
STCD LIKE BSEC-STCD1, "CPD tax code1
NAME1 LIKE BSEC-NAME1, "CPD-customer name
ORT01 LIKE BSEC-ORT01, "CPD-customer city
GJAHR LIKE BSID-GJAHR, "business year
GSBER LIKE BSID-GSBER, "business area
BUPLA LIKE BSID-BUPLA, "business place
BLART LIKE BKPF-BLART, "acc. document type
BELNR LIKE BSID-BELNR, "acc. document number
AUGBL LIKE BSAD-AUGBL, "tax invoice number
AUGDT LIKE BSEG-AUGDT, "tax invoice date
BUZEI LIKE BSEG-BUZEI, "item line in acc. document
BUDAT LIKE BSID-BUDAT, "posting documnet date
BLDAT LIKE BSID-BLDAT, "acc. document date
SHKZG LIKE BSID-SHKZG, "debit/credit indicator
BSCHL LIKE BSID-BSCHL, "posting key
AWTYP LIKE BKPF-AWTYP, "object type for
"calling application
AWKEY LIKE BKPF-AWKEY, "object key
DMBTR LIKE BSID-DMBTR, "amount in document curr
WRBTR LIKE BSID-WRBTR, "amount in document currency
HWBAS LIKE BSET-HWBAS, "tax base amount
HWSTE LIKE BSET-HWSTE, "tax amount
FWBAS LIKE BSET-FWBAS, "tax base amount in doc. curr
FWSTE LIKE BSET-FWSTE, "tax amount in doc.curr
WAERS LIKE T001-WAERS, "document currency
HWAER LIKE T001-WAERS, "company code currency
MWSKZ LIKE BSET-MWSKZ, "tax code
UMSKZ LIKE BSID-UMSKZ, "special G/L indicator
ZTERM LIKE BSEG-ZTERM, "payment terms
ZFBDT LIKE BSEG-ZFBDT, "base line date
VBELN LIKE VBRK-VBELN, "billing document
FKDAT LIKE VBRK-FKDAT, "billing date
FKART LIKE VBRK-FKART, "billing type
FKTYP LIKE VBRK-FKTYP, "billing category
MSCHL LIKE BSEG-MSCHL, "dunning key
MANSP LIKE BSEG-MANSP, "dunning block
MADAT LIKE BSEG-MADAT, "last dunned on
MANST LIKE BSEG-MANST, "dunning level
MABER LIKE BSEG-MABER, "dunning area
HKONT LIKE BSEG-HKONT,
FISTL LIKE BSEG-FISTL,
SGTXT LIKE BSEG-SGTXT,
RESULT TYPE BAPIRETURN-CODE, "smartbill 추가 2006.07.24
END OF SEL_AUSGLOP_ITAB.
```
#### P_AUSGLOP_ITAB — data · L176-L176 {#decl-zfir0140top-176-p_ausglop_itab}
```abap
DATA : P_AUSGLOP_ITAB LIKE TABLE OF AUSGLOP_ITAB WITH HEADER LINE.
```
#### T_VBSEGS — data · L177-L177 {#decl-zfir0140top-177-t_vbsegs}
```abap
DATA:
T_VBSEGS LIKE TABLE OF VBSEGS WITH HEADER LINE.
```
#### GV_KBETR — data · L180-L180 {#decl-zfir0140top-180-gv_kbetr}
```abap
DATA : GV_KBETR LIKE KONP-KBETR.
```
#### RANGE_CANCEL — ranges · L183-L183 {#decl-zfir0140top-183-range_cancel}
```abap
RANGES : RANGE_CANCEL FOR ZDTI_STATUS-ZSTAT.
```
#### ITABSAPP — data · L184-L198 {#decl-zfir0140top-184-itabsapp}
```abap
DATA : BEGIN OF ITABSAPP OCCURS 0,
BUKRS TYPE ZDTI_SAPP-BUKRS,
ZETNO TYPE ZDTI_SAPP-ZETNO,
ZARAP TYPE ZDTI_SAPP-ZARAP,
BELNR TYPE ZDTI_SAPP-BELNR,
GJAHR TYPE ZDTI_SAPP-GJAHR,
REBELNR TYPE ZDTI_SAPP-REBELNR,
REGJAHR TYPE ZDTI_SAPP-REGJAHR,
EBELN TYPE ZDTI_SAPP-EBELN,
EBELP TYPE ZDTI_SAPP-EBELP,
MBLNR TYPE ZDTI_SAPP-MBLNR,
MJAHR TYPE ZDTI_SAPP-MJAHR,
VBELN TYPE ZDTI_SAPP-VBELN,
ZSTAT TYPE ZDTI_STATUS-ZSTAT,
END OF ITABSAPP.
```
#### CLEARING_ITAB1 — data · L203-L206 {#decl-zfir0140top-203-clearing_itab1}
```abap
DATA : BEGIN OF CLEARING_ITAB1 OCCURS 0,
BELNR LIKE BSAD-BELNR,
AUGBL LIKE BSAD-AUGBL,
END OF CLEARING_ITAB1.
```
#### SELTAB — data · L211-L213 {#decl-zfir0140top-211-seltab}
```abap
DATA: BEGIN OF SELTAB OCCURS 6. " internal table to transfer
INCLUDE STRUCTURE RSPARAMS. " select-options and paramete
DATA: END OF SELTAB. " between reports
```
#### CUST_TAB — data · L215-L215 {#decl-zfir0140top-215-cust_tab}
```abap
DATA : CUST_TAB LIKE SEL_AUSGLOP_ITAB OCCURS 0 WITH HEADER LINE.
```
#### CUSTOMER_TAB — data · L217-L221 {#decl-zfir0140top-217-customer_tab}
```abap
DATA: BEGIN OF CUSTOMER_TAB OCCURS 0,
KUNNR LIKE KNA1-KUNNR,
STCD1 LIKE KNA1-STCD1,
STCD2 LIKE KNA1-STCD2,
END OF CUSTOMER_TAB.
```
#### YEAR — data · L224-L224 {#decl-zfir0140top-224-year}
```abap
DATA : YEAR LIKE BKPF-GJAHR. "FI Period determination
```
#### NUMBER — data · L225-L225 {#decl-zfir0140top-225-number}
```abap
DATA : NUMBER LIKE BSEG-AUGBL . "tax invoice number
```
#### CURR — data · L226-L226 {#decl-zfir0140top-226-curr}
```abap
DATA : CURR LIKE T001-WAERS . "currency
```
#### PROG_NAME — data · L227-L227 {#decl-zfir0140top-227-prog_name}
```abap
DATA : PROG_NAME LIKE SYST-CPROG. "program name for export
```
#### SLIS — type-pool · L232-L232 {#decl-zfir0140top-232-slis}
```abap
TYPE-POOLS: SLIS.
```
#### GC_FORMNAME_TOP_OF_PAGE — constants · L243-L243 {#decl-zfir0140top-243-gc_formname_top_of_page}
```abap
CONSTANTS:
GC_FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME VALUE 'TOP_OF_PAGE'.
```
#### GT_FIELDCAT — data · L246-L246 {#decl-zfir0140top-246-gt_fieldcat}
```abap
DATA: GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
```
#### GS_LAYOUT — data · L247-L247 {#decl-zfir0140top-247-gs_layout}
```abap
DATA:
GS_LAYOUT TYPE SLIS_LAYOUT_ALV.
```
#### GS_KEYINFO — data · L248-L248 {#decl-zfir0140top-248-gs_keyinfo}
```abap
DATA:
GS_KEYINFO TYPE SLIS_KEYINFO_ALV.
```
#### GT_SP_GROUP — data · L249-L249 {#decl-zfir0140top-249-gt_sp_group}
```abap
DATA:
GT_SP_GROUP TYPE SLIS_T_SP_GROUP_ALV.
```
#### GT_EVENTS — data · L250-L250 {#decl-zfir0140top-250-gt_events}
```abap
DATA:
GT_EVENTS TYPE SLIS_T_EVENT.
```
#### G_USER_COMMAND — data · L251-L251 {#decl-zfir0140top-251-g_user_command}
```abap
DATA:
G_USER_COMMAND TYPE SLIS_FORMNAME VALUE 'USER_COMMAND'.
```
#### WA_COLORF — data · L255-L255 {#decl-zfir0140top-255-wa_colorf}
```abap
DATA : WA_COLORF TYPE SLIS_SPECIALCOL_ALV.
```
#### INT_COLORF — data · L257-L257 {#decl-zfir0140top-257-int_colorf}
```abap
DATA: INT_COLORF TYPE SLIS_T_SPECIALCOL_ALV.
```
#### GT_AUSGLOP — data · L259-L267 {#decl-zfir0140top-259-gt_ausglop}
```abap
DATA: BEGIN OF GT_AUSGLOP OCCURS 0. "internal table
INCLUDE STRUCTURE AUSGLOP_ITAB."for fieldcatalog
DATA: BOX,
SIM(1), "simulation check
WERT(4) TYPE P,
LIGHTS,
COLORF TYPE SLIS_T_SPECIALCOL_ALV. "fieldcolor
"items
DATA: END OF GT_AUSGLOP.
```
#### GT_KUNDE — data · L269-L274 {#decl-zfir0140top-269-gt_kunde}
```abap
DATA: BEGIN OF GT_KUNDE OCCURS 0. "internal table
INCLUDE STRUCTURE KNA1. "for fieldcatalog header
DATA: BOX,
LIGHTS,
STATE_INSC LIKE J_1BBRANCH-STATE_INSC.
DATA: END OF GT_KUNDE.
```
#### G_REPID — data · L276-L276 {#decl-zfir0140top-276-g_repid}
```abap
DATA: G_REPID LIKE SY-REPID.
```
#### GT_LIST_TOP_OF_PAGE — data · L277-L277 {#decl-zfir0140top-277-gt_list_top_of_page}
```abap
DATA: GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER.
```
#### G_STATUS — data · L278-L278 {#decl-zfir0140top-278-g_status}
```abap
DATA: G_STATUS TYPE SLIS_FORMNAME VALUE 'STANDARD01'.
```
#### GS_STATUS — data · L279-L279 {#decl-zfir0140top-279-gs_status}
```abap
DATA: GS_STATUS TYPE SLIS_STATUS.
```
#### CODE — types · L281-L286 {#decl-zfir0140top-281-code}
```abap
TYPES : BEGIN OF CODE,
SIGN LIKE RSDSSELOPT-SIGN,
OPTION LIKE RSDSSELOPT-OPTION,
LOW LIKE RSDSSELOPT-LOW,
HIGH LIKE RSDSSELOPT-HIGH,
END OF CODE.
```
#### TAX_CODE — data · L288-L288 {#decl-zfir0140top-288-tax_code}
```abap
DATA : TAX_CODE TYPE CODE OCCURS 0 WITH HEADER LINE.
```
#### BLART — data · L289-L289 {#decl-zfir0140top-289-blart}
```abap
DATA:
BLART TYPE CODE OCCURS 0 WITH HEADER LINE.
```
#### BUPLA — data · L290-L290 {#decl-zfir0140top-290-bupla}
```abap
DATA:
BUPLA TYPE CODE OCCURS 0 WITH HEADER LINE.
```
#### BUKRS — data · L291-L291 {#decl-zfir0140top-291-bukrs}
```abap
DATA:
BUKRS TYPE CODE OCCURS 0 WITH HEADER LINE.
```
#### STBLG — data · L295-L295 {#decl-zfir0140top-295-stblg}
```abap
DATA : STBLG LIKE RBKP-STBLG.
```
#### IT_FCODE — data · L296-L296 {#decl-zfir0140top-296-it_fcode}
```abap
DATA : IT_FCODE LIKE RSMPE-FUNC OCCURS 0 WITH HEADER LINE.
```
#### IT_T007S — data · L299-L302 {#decl-zfir0140top-299-it_t007s}
```abap
DATA : BEGIN OF IT_T007S OCCURS 0,
MWSKZ LIKE T007S-MWSKZ,
TEXT1 LIKE T007S-TEXT1,
END OF IT_T007S.
```
#### T_HELPFIELD — data · L304-L306 {#decl-zfir0140top-304-t_helpfield}
```abap
DATA : BEGIN OF T_HELPFIELD OCCURS 0.
INCLUDE STRUCTURE HELP_VALUE.
DATA : END OF T_HELPFIELD.
```
#### T_HELPVTAB — data · L308-L310 {#decl-zfir0140top-308-t_helpvtab}
```abap
DATA : BEGIN OF T_HELPVTAB OCCURS 0.
INCLUDE STRUCTURE HELP_VTAB.
DATA : END OF T_HELPVTAB.
```
#### T_HELPVALUE — data · L312-L314 {#decl-zfir0140top-312-t_helpvalue}
```abap
DATA : BEGIN OF T_HELPVALUE OCCURS 0,
VALUE LIKE HELP_VTAB-VALUE,
END OF T_HELPVALUE.
```
#### T_DYNPREAD — data · L316-L318 {#decl-zfir0140top-316-t_dynpread}
```abap
DATA : BEGIN OF T_DYNPREAD OCCURS 0.
INCLUDE STRUCTURE DYNPREAD.
DATA : END OF T_DYNPREAD.
```
#### W_CURSORLOC — data · L320-L320 {#decl-zfir0140top-320-w_cursorloc}
```abap
DATA : W_CURSORLOC LIKE SY-TABIX.
```
## Unit 목록 (컨테이너)
| unit | 유형 | 위치 | 조각 | 한 줄 요약 |
|---|---|---|---|---|
| AT SELECTION-SCREEN OUTPUT | EVENT | ZFIR0140 L145-166 | 0 | 선택화면 PBO 에서 회사코드·회계연도 범위의 HIGH 필드와 다중선택 버튼을 숨겨 단일 값 입력만 허용하는 화면 속성 플러밍 이벤트이다. |
| INITIALIZATION | EVENT | ZFIR0140 L167-218 | 1 | INITIALIZATION 에서 계층 ALV 의 헤더/아이템 테이블명과 키정보(KUNNR/BELNR)를 정의하고 REUSE_ALV_VARIANT_DEFAULT_GET 으로 기본 변형을 P_VARI 에 제안한다. |
| AT SELECTION-SCREEN ON VALUE-REQUEST | EVENT | ZFIR0140 L219-232 | 0 | ALV 변형 파라미터 P_VARI 의 F4 요청 시 F4_FOR_VARIANT 를 호출하는 선택화면 이벤트이다(세금코드 F4 는 주석 처리). |
| AT SELECTION-SCREEN | EVENT | ZFIR0140 L233-235 | 0 | AT SELECTION-SCREEN 에서 PAI_OF_SELECTION_SCREEN 을 호출해 ALV 변형을 검증하는 이벤트이다. |
| AT SELECTION-SCREEN ON DD_BUKRS | EVENT | ZFIR0140 L236-238 | 0 | 회사코드 입력 시 CHECK_BUKRS 로 필수 입력을 검증하는 선택화면 이벤트이다. |
| AT SELECTION-SCREEN ON SBLART | EVENT | ZFIR0140 L239-316 | 2 | 전표유형 입력 시 유효성을 검증하고 세금코드·전표유형·사업장·회사코드 선택값을 KR_USER_EXIT_TAX_CODE 에 넘긴 뒤 SD/FI 선택 조건 입력 여부로 SD_SELECTION/FI_SELECTION 플래그를 결정한다. |
| START-OF-SELECTION | EVENT | ZFIR0140 L317-327 | 1 | START-OF-SELECTION 에서 회사코드의 현지통화(T001-WAERS)를 CURR 에 읽어 이후 논리DB 처리에 사용한다. |
| GET BSID | EVENT | ZFIR0140 L328-353 | 1 | 논리DB GET BSID 이벤트에서 사업영역·세금코드·미반제 조건을 통과한 미결 매출채권 항목의 키 필드를 발행 후보 AUSGLOP_ITAB 에 채운다. |
| GET BKPF | EVENT | ZFIR0140 L354-471 | 2 | 논리DB GET BKPF 이벤트에서 전표 헤더를 검증(헤더텍스트·역분개·비망·전표유형·FB05 제외)하고 SD 청구(VBRK)·MM 송장(RBKP) 참조 정보를 보강해 발행 후보 항목을 준비한다. |
| GET BSEG | EVENT | ZFIR0140 L472-484 | 1 | 논리DB GET BSEG 이벤트에서 고객 라인(KOART='D')의 세금코드가 선택범위에 있을 때 지급조건·기산일·금액을 채워 발행 후보 AUSGLOP_ITAB 에 추가한다. |
| END-OF-SELECTION | EVENT | ZFIR0140 L485-538 | 2 | END-OF-SELECTION 에서 반제 항목 선별, 전자세금계산서 발행 여부 확인, 세금·고객주소 보강, 한국 반올림 User-Exit 호출 후 계층 ALV 를 출력하는 메인 흐름을 수행한다. |
| STANDARD01 | FORM | ZFIR0140 L539-565 | 0 | ALV PF-STATUS STANDARD01 을 설정하는 FORM 으로, 사용자별 인쇄 제어 로직은 주석 처리되어 있다. |
| E01_FIELDCAT_INIT | FORM | ZFIR0140 L574-935 | 0 | REUSE_ALV_FIELDCATALOG_MERGE 로 고객 헤더(KNA1)와 아이템(AUSGLOP_ITAB) 필드카탈로그를 생성하고 비키 필드를 숨김 처리하는 ALV 필드카탈로그 초기화 FORM 이다(1/2 창). |
| E02_DATA_ADD | FORM | ZFIR0140 L942-980 | 2 | ALV 출력 전 아이템(GT_AUSGLOP)의 체크박스를 초기화하고 선수금(특별G/L) 건의 공급가액·세액을 양수로 바꾸며 고객 헤더(GT_KUNDE)의 신호등 값을 설정한다. |
| E03_EVENTTAB_BUILD | FORM | ZFIR0140 L989-1003 | 0 | REUSE_ALV_EVENTS_GET 으로 ALV 이벤트 목록을 받아 TOP_OF_PAGE 콜백 FORM 을 등록하는 ALV 플러밍 FORM 이다. |
| E04_COMMENT_BUILD | FORM | ZFIR0140 L1012-1049 | 1 | ALV TOP-OF-PAGE 헤더에 발행 방식(합산/개별), 회사코드, 세금계산서 작성일자를 표시하는 리스트 헤더를 구성한다. |
| E05_LAYOUT_BUILD | FORM | ZFIR0140 L1058-1075 | 0 | 계층 ALV(REUSE_ALV_HIERSEQ_LIST_DISPLAY)의 레이아웃(체크박스 필드, 헤더/아이템 텍스트, 색상 필드 COLORF)을 설정하는 ALV 플러밍 FORM 이다. |
| E07_SP_GROUP_BUILD | FORM | ZFIR0140 L1084-1091 | 0 | ALV 특수 그룹(SP_GROUP 'A') 하나를 등록하는 ALV 플러밍 FORM 이다. |
| SELECTION | FORM | ZFIR0140 L1098-1135 | 2 | 발행 후보(AUSGLOP_ITAB)에서 차변 부호를 조정하고 선수금 요청(T074U 비망항목)을 제외하며 FI/SD 선택 옵션에 따라 ALV 아이템(GT_AUSGLOP)과 고객 헤더(GT_KUNDE)를 확정한다. |
| TOP_OF_PAGE | FORM | ZFIR0140 L1142-1147 | 0 | ALV TOP_OF_PAGE 이벤트에서 REUSE_ALV_COMMENTARY_WRITE 로 상단 코멘트를 출력하는 플러밍 FORM 이다. |
| USER_COMMAND | FORM | ZFIR0140 L1158-1557 | 11 | ALV 사용자 명령 처리 FORM 의 시작부(1/3 창)로 로컬 변수 선언과 시뮬레이션 플래그 초기화만 있다. |
| F4_FOR_VARIANT | FORM | ZFIR0140 L1564-1586 | 0 | REUSE_ALV_VARIANT_F4 로 ALV 변형 검색도움을 띄우고 선택한 변형을 P_VARI 에 넣는 F4 플러밍 FORM 이다. |
| PAI_OF_SELECTION_SCREEN | FORM | ZFIR0140 L1593-1608 | 0 | 선택화면 PAI 에서 입력된 ALV 변형(P_VARI)의 존재를 REUSE_ALV_VARIANT_EXISTENCE 로 확인하거나 기본 변형을 초기화하는 ALV 변형 플러밍 FORM 이다. |
| VARIANT_INIT | FORM | ZFIR0140 L1618-1622 | 0 | ALV 변형 구조(G_VARIANT)를 초기화하고 리포트 ID 를 설정하는 플러밍 FORM 이다. |
| STATUS_2000 OUTPUT | MODULE | ZFIR0140 L1629-1634 | 0 | 화면 2000 PBO 에서 GUI 상태 PROTOK1 과 타이틀바를 설정하는 플러밍 MODULE 이다. |
| PROT OUTPUT | MODULE | ZFIR0140 L1643-1652 | 0 | 화면 PBO 에서 대화를 억제하고 리스트 처리로 전환하는 플러밍 MODULE 이다. |
| CHECK_BUKRS | FORM | ZFIR0140 L1661-1667 | 1 | 회사코드(DD_BUKRS-LOW)가 비어 있으면 오류 메시지 E501 을 내는 필수 입력 검증 FORM 이다. |
| GET_TAXINVOICE_YEAR | FORM | ZFIR0140 L1676-1708 | 1 | 선택 항목의 전기일(BUDAT)과 회사코드로 FI_PERIOD_DETERMINE 을 호출해 세금계산서 채번에 쓸 회계연도(YEAR)를 구한다. |
| GET_TAX_INVOICE_NUMBER | FORM | ZFIR0140 L1717-1748 | 1 | 전표유형 번호범위(T003-NUMKR)와 회사코드·회계연도로 NUMBER_GET_NEXT(RF_BELEG)를 호출해 세금계산서 번호(NUMBER)를 채번한다. |
| COLLECTIVE_INVOICES | FORM | ZFIR0140 L1757-1812 | 3 | 합산 세금계산서 방식으로 고객(KUNNR)·사업장(BUPLA) 단위(CPD 고객은 전표 단위)로 세금계산서 번호를 채번해 선택 항목(SEL_AUSGLOP_ITAB-AUGBL)에 부여한다. |
| INDIVIDUAL_INVOICES | FORM | ZFIR0140 L1821-1867 | 1 | 개별 세금계산서 방식으로 선택된 전표마다 NUMBER_GET_NEXT(RF_BELEG)로 세금계산서 번호를 채번해 SEL_AUSGLOP_ITAB-AUGBL 에 부여한다(시뮬레이션이면 순번). |
| GET_TAX_DATA | FORM | ZFIR0140 L1876-2054 | 1 | 세금계산서 발행 대상 항목에 BSET 세금 데이터를 합산하고 부호를 맞춘 뒤 고객 목록을 만든다. |
| GET_CUSTOMER_ADDRESS | FORM | ZFIR0140 L2063-2114 | 3 | 고객 마스터(KNA1)에서 사업자번호와 주소를 읽어 고객 헤더(GT_KUNDE)와 발행 항목에 보강하고, 일회성(CPD) 고객은 전표의 BSEC 주소 데이터를 사용하며 종사업장번호(J_1BBRANCH)를 붙인다. |
| CHECK_DOC_TYPE | FORM | ZFIR0140 L2123-2130 | 1 | 세금계산서 전표유형(SBLART)이 T003 에 존재하고 번호범위(NUMKR)가 지정되어 있는지 검증해 없으면 E098 오류를 낸다. |
| EXECLUDING_FCODE | FORM | ZFIR0140 L2138-2145 | 0 | GUI 상태에서 제외할 기능코드(P_POST)를 IT_FCODE 에 담는 단순 유틸리티 FORM 이다. |
| POSSIBLE_ENTRY | FORM | ZFIR0140 L2154-2200 | 1 | 매출 세금계산서용 세금코드(A1~A8)와 한글 설명을 하드코딩으로 구성해 세금코드 F4 도움말(VALUE_HELP)을 표시한다. |
| FIELD_REFRESH | FORM | ZFIR0140 L2209-2220 | 0 | F4 팝업에서 선택한 세금코드를 선택화면 필드에 반영(DYNP_VALUES_UPDATE)하고 도움말 작업 테이블을 초기화하는 플러밍 FORM 이다. |
| VALUE_HELP | FORM | ZFIR0140 L2229-2242 | 0 | HELP_VALUES_GET_WITH_TABLE_EXT 로 세금코드 값 도움말 팝업을 띄우고 선택 인덱스를 받는 F4 도우미 FORM 이다. |
| VALUE_UPDATE | FORM | ZFIR0140 L2251-2260 | 0 | DYNP_VALUES_UPDATE 로 선택화면 필드 값을 갱신하는 F4 결과 반영 유틸리티 FORM 이다. |
| CHECK_MWSKZ | FORM | ZFIR0140 L2269-2290 | 1 | 세금코드 선택조건(SMWSKZ)이 비어 있으면 매출 세금계산서 대상 세금코드(A1,A2,A4,A6,A7,A8)를 기본값으로 채운다. |
| CLEAR_ITEM_SELECTION | FORM | ZFIR0140 L2299-2389 | 4 | 반제된 매출채권(BSAD)을 선택조건으로 읽어 역분개·비망·FB05 반제 전표를 제외하고 SD 청구(VBRK)·MM 송장(RBKP) 취소 여부와 세금코드를 확인해 세금계산서 발행 후보(AUSGLOP_ITAB)를 만든다. |
| BUILD_UP_ALV_LAYOUT | FORM | ZFIR0140 L2399-2445 | 1 | 필드카탈로그·이벤트·헤더·특수그룹을 구성하고 SELECTION 으로 대상을 확정한 뒤 REUSE_ALV_HIERSEQ_LIST_DISPLAY 로 고객(GT_KUNDE)-전표(GT_AUSGLOP) 계층 ALV 를 출력한다. |
| GET_SALES_TAX_SGTXT | FORM | ZFIR0140 L2454-2474 | 1 | 발행 대상 각 전표의 매출부가세 라인(BSEG MWART='A')의 품목텍스트(SGTXT)를 읽어 AUSGLOP_ITAB 에 보강한다. |
| PARK_DOCUMENT_SELECTION | FORM | ZFIR0140 L2483-2567 | 3 | 임시저장(Parked) 매출전표(VBKPF/VBSEGD/VBSEGS)를 읽어 고객·세금코드·공급가액·세액을 계산하고 세금계산서 발행 대상(AUSGLOP_ITAB)으로 적재한다. |
| DTI_CHECK | FORM | ZFIR0140 L2576-2628 | 2 | 전자세금계산서 상태 테이블(ZDTI_SAPP/ZDTI_STATUS)을 조회해 이미 발행(취소·거부 상태 제외)된 전표를 발행 대상(AUSGLOP_ITAB)에서 제거한다. |