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

7808 lines
389 KiB
Markdown

---
type: abap-program
title: "ZFIR0141"
description: "ZFIR0140 이 선별한 매출 세금계산서를 실제로 출력(SAPscript)하고 전자세금계산서 중계사(스마트빌)로 전송하는 프로그램이다. 세금계산서 양식에 품목·금액·합계·공란수를 채워 WRITE/SAPscript 로 인쇄하고, 재발행(REPRINT)과 전자 전송(SMARTBILL_TRANS, 316줄)을 함께 처리한다. 27본 중 가장 크고(6,376줄) 출력 서식 로직이 집중된 프로그램이다."
resource: "abap://ZFIR0141"
tags: ["세금계산서", "전자세금계산서", "매출", "부가세", "출력", "인터페이스", "FI", "공급가액", "세액", "매출부가세", "영세율", "특소세", "반품", "부호반전", "세금코드", "사용자 명령", "ALV 변경 검증", "화면 종료", "PAI", "공란수"]
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: ["ADR6", "ADRC", "BKPF", "BSEC", "BSEG", "BSET", "J_1BBRANCH", "KNA1", "T001", "T001F", "T074T", "VBRK", "VBRP", "ZDTI_CONFIG", "ZDTI_LAYOUT"]
x-tables-write: ["ALL_ITEMS_ITAB", "AUSGLOP_ITAB", "AUSGLOP_ITAB2", "AUSGLOP_MAT_ITAB", "BKPF", "BSEG", "BSET", "CHECK_ITAB", "LINE", "MATZEIL4_ITAB", "SEL_AUSGLOP_ITAB"]
x-calls: ["CLOSE_FORM", "CONVERT_TO_LOCAL_CURRENCY", "END_FORM", "FB03", "GET_BUPLA_ADDRESS", "GET_PRINT_PARAMETERS", "KR_USER_EXIT_CANCEL_TAXINVOICE", "KR_USER_EXIT_COPY_TAXINVOICE", "KR_USER_EXIT_LIST_TAXINVOICE", "KR_USER_EXIT_ROUNDOFF", "LAST_DAY_OF_MONTHS", "NUMERIC_CHECK", "OPEN_FORM", "START_FORM", "STRING_SPLIT", "WRITE_FORM", "Z_FI_COMMA_DEL", "Z_SB_DTI_ISSUE", "Z_SB_RETURN_MESSAGE"]
x-code-hash: "c00e842f51b6a0fd80c608908fe26e6c41172772cc4801035199a91ec41c97b3"
x-unit-count: 85
x-chunk-count: 144
x-declaration-count: 168
---
## 업무 목적
ZFIR0140 이 선별한 매출 세금계산서를 실제로 출력(SAPscript)하고 전자세금계산서 중계사(스마트빌)로 전송하는 프로그램이다. 세금계산서 양식에 품목·금액·합계·공란수를 채워 WRITE/SAPscript 로 인쇄하고, 재발행(REPRINT)과 전자 전송(SMARTBILL_TRANS, 316줄)을 함께 처리한다. 27본 중 가장 크고(6,376줄) 출력 서식 로직이 집중된 프로그램이다.
## 주 흐름
1. 출력 양식(레이아웃 세트)을 결정한다 (GET_LAYOUT)
2. 대상 세금계산서와 세금·거래처 정보를 채운다 (FILL_TABLES → GET_TAXES → GET_BUPLA → GET_ADDRESS)
3. 출력 옵션(영수/청구, 일반/세금계산서, 출력매체)을 검증한다 (CHECK_OPTION → CHECK_RECEIPT / CHECK_BILLING)
4. 고객 유형별로 양식을 분기해 항목·금액·합계를 Write 한다 (KIND_OF_CUSTOMERS → WRITE_PART1-1/1-2 → PRINT_ITEM_* → PRINT_SUM_LINE)
5. SAPscript 로 세금계산서를 출력한다 (SAP_SCRIPT, 373줄 / OPEN_FORM → WRITE_FORM → CLOSE_FORM)
6. 전자세금계산서는 스마트빌 전송 데이터를 만들어 전송한다 (SMARTBILL_TRANS → MAKE_ZSB_HEADER / MAKE_ZSB_ITEM / MAKE_ZSB_PAYMENT → TRANSMIT_DTI_TO_SB)
7. 전송 결과 코드를 저장하고 오류는 화면에 표시한다 (SAVE_RETURN_CODE_TO_AUSGLOP → DISPLAY_ERROR_MSG)
8. 재발행 요청은 별도 경로로 처리한다 (REPRINT, 236줄)
## 핵심 내부테이블
- `AUSGLOP_ITAB` — 출력 대상 세금계산서 항목 (채움: FILL_TABLES / 소비: PRINT_INVOICES, SMARTBILL_TRANS)
- `SEL_AUSGLOP_ITAB` — 사용자가 선택한 발행 대상 (채움: SET_SELECTION, SEL_DOCUMENT / 소비: UPDATE_TABLE, SAVE_RETURN_CODE_TO_AUSGLOP)
## 테이블 / 외부 호출
- read: ADR6, ADRC, BKPF, BSEC, BSEG, BSET, J_1BBRANCH, KNA1, T001, T001F, T074T, VBRK, VBRP, ZDTI_CONFIG, ZDTI_LAYOUT
- write: ALL_ITEMS_ITAB, AUSGLOP_ITAB, AUSGLOP_ITAB2, AUSGLOP_MAT_ITAB, BKPF, BSEG, BSET, CHECK_ITAB, LINE, MATZEIL4_ITAB, SEL_AUSGLOP_ITAB
- 외부 호출: CLOSE_FORM, CONVERT_TO_LOCAL_CURRENCY, END_FORM, FB03, GET_BUPLA_ADDRESS, GET_PRINT_PARAMETERS, KR_USER_EXIT_CANCEL_TAXINVOICE, KR_USER_EXIT_COPY_TAXINVOICE, KR_USER_EXIT_LIST_TAXINVOICE, KR_USER_EXIT_ROUNDOFF, LAST_DAY_OF_MONTHS, NUMERIC_CHECK, OPEN_FORM, START_FORM, STRING_SPLIT, WRITE_FORM, Z_FI_COMMA_DEL, Z_SB_DTI_ISSUE, Z_SB_RETURN_MESSAGE
## 로직 조각 (144건 / unit 75개)
LLM 이 코드에서 골라낸 업무 로직 단위다. **조각마다 소스 원문과 자연어 설명을 함께 싣는다** — 설명이 코드와 맞는지 바로 대조할 수 있어야 하기 때문이다.
테이블·호출은 LLM 이 쓴 값이 아니라 파서가 조각 범위에서 다시 뽑은 사실이다. 순서는 실행 순서다.
### EVENT AT SELECTION-SCREEN — `ZFIR0141` L712-L742 (31줄)
*선택화면 검증으로 SAPscript 재발행이면 양식(GET_LAYOUT)을 결정하고 전체 리스트와 추가 시트 옵션을 함께 선택하면 E353 오류를 낸다.*
> 이 unit 의 조각 1개가 9/31줄(29%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] SAPscript 출력(SAP)과 재발행(REPRINT)이 선택되면 GET_LAYOUT 으로 T001F 양식을 결정하고, 전체 리스트(FULLLIST)와 추가 시트(CHK_PRAD) 조합은 허용하지 않아 E353 메시지를 낸다.
```abap
714| IF SAP = 'X' AND REPRINT = 'X'.
715|
716| PERFORM GET_LAYOUT.
717|
718| ENDIF.
719|
720| IF FULLLIST = 'X' AND CHK_PRAD = 'X'.
721| MESSAGE E353.
722| ENDIF.
```
- **EN**: On the selection screen, determine the SAPscript form for reprint via GET_LAYOUT and reject the combination of full list with additional sheet with message E353.
- 호출(파서): GET_LAYOUT
- 업무 키워드: 선택화면 검증, 양식 결정, 출력 옵션 조합, 오류 E353
- English: Selection Screen, Validation, SAPscript Form, Output Option
- 정의부(복사 시 함께 필요): [`SAP`](#decl-zfir0141-665-sap), [`REPRINT`](#decl-zfir0141-485-reprint), [`FULLLIST`](#decl-zfir0141-667-fulllist), [`CHK_PRAD`](#decl-zfir0141-682-chk_prad)
- 위치: `abap://ZFIR0141/ZFIR0141#L714-L722` · confidence 0.85 · `ZFIR0141#ZFIR0141#EVENT#AT_SELECTION-SCREEN#C1`
### FORM GET_LAYOUT — `ZFIR0141` L1447-L1493 (47줄)
*회사코드 T001 을 읽고 양식 종류(STA1 일반/세금계산서)·인쇄 옵션(CHK_PRTI)에 따라 T001F 에서 SAPscript 양식명(FORNR)을 결정하며 없으면 E202 오류를 낸다.*
> 이 unit 의 조각 1개가 42/47줄(89%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] T001 로 회사코드 정보를 읽고 STA1='X' 이면 세금계산서 인쇄(CHK_PRTI)는 EVENT 없는 T001F, 추가 시트는 EVENT='AS', 그 외는 EVENT='TF' 조건으로 회사코드별 → 공통(BUKRS 공백) 순으로 T001F 를 조회해 양식명 FORM 을 세팅하고 미존재 시 E202 메시지를 낸다.
```abap
1449| SELECT SINGLE * FROM T001 WHERE BUKRS = SBUKRS.
1450|
1451| IF STA1 = 'X'.
1452| IF CHK_PRTI = 'X'.
1453| SELECT SINGLE * FROM T001F WHERE BUKRS = SBUKRS
1454| AND PROGRAMM = SY-CPROG.
1455| IF SY-SUBRC <> 0.
1456| SELECT SINGLE * FROM T001F WHERE BUKRS = ' '
1457| AND PROGRAMM = SY-CPROG.
1458| IF SY-SUBRC <> 0.
1459| MESSAGE E202.
1460| ENDIF.
1461| ENDIF.
1462| ELSE.
1463| SELECT SINGLE * FROM T001F WHERE BUKRS = SBUKRS
1464| AND PROGRAMM = SY-CPROG
1465| AND EVENT = 'AS'.
1466| IF SY-SUBRC <> 0.
1467| SELECT SINGLE * FROM T001F WHERE BUKRS = ' '
1468| AND PROGRAMM = SY-CPROG
1469| AND EVENT = 'AS'.
1470| IF SY-SUBRC <> 0.
1471| MESSAGE E202.
1472| ENDIF.
1473| ENDIF.
1474| ENDIF.
1475| FORM = T001F-FORNR. "note 0318410
1476| ELSE.
1477| SELECT SINGLE * FROM T001F WHERE BUKRS = SBUKRS
1478| AND PROGRAMM = SY-CPROG
1479| AND EVENT = 'TF'.
1480| IF SY-SUBRC <> 0.
1481| SELECT SINGLE * FROM T001F WHERE BUKRS = ' '
1482| AND PROGRAMM = SY-CPROG
1483| AND EVENT = 'TF'.
1484| IF SY-SUBRC <> 0.
1485| MESSAGE E202.
1486| ENDIF.
1487| ENDIF.
1488|
1489| FORM = T001F-FORNR.
1490| ENDIF.
```
- **EN**: Read T001 and determine the SAPscript form name from T001F by program and event (none/AS/TF) with fallback to the cross-company entry; raise E202 if no form is configured.
- 테이블(파서): read [T001](/tables/T001.md), [T001F](/tables/T001F.md) / write -
- SAP 객체: T001, T001F
- 업무 키워드: 양식 결정, SAPscript 양식, 회사코드 양식 설정, 추가 시트, 오류 E202
- English: SAPscript Form, T001F, Form Determination, Company Code
- 정의부(복사 시 함께 필요): [`T001`](#decl-zfir0141-40-t001), [`SBUKRS`](#decl-zfir0141-629-sbukrs), [`STA1`](#decl-zfir0141-655-sta1), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`T001F`](#decl-zfir0141-48-t001f), [`FORM`](#decl-zfir0141-98-form)
- 위치: `abap://ZFIR0141/ZFIR0141#L1449-L1490` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#GET_LAYOUT#C1`
### EVENT START-OF-SELECTION — `ZFIR0141` L773-L801 (29줄)
*호출 프로그램(ZFIR0140/YFIR0601)이 ABAP 메모리로 넘긴 선택 세금계산서·프로그램명·시뮬레이션·통합발행·발행일을 IMPORT 한 뒤 단독 실행이면 목록 표시, 호출 실행이면 재발행·테이블 갱신·User Exit 를 수행한다.*
> 이 unit 의 조각 2개가 21/29줄(72%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] 메모리 ID 'TI'(선택 세금계산서), 'KRPROG'(호출 프로그램명), 'KRSIM'(시뮬레이션), 'SN1OP'(통합 세금계산서), 'SBLDAT'(발행일)를 IMPORT 하고 메모리를 해제하여 호출 프로그램과의 파라미터를 받는다.
```abap
777| IMPORT SEL_AUSGLOP_ITAB[] FROM MEMORY ID 'TI'.
778| IMPORT PROG_NAME FROM MEMORY ID 'KRPROG'.
779| IMPORT SIM FROM MEMORY ID 'KRSIM'.
780| IMPORT SN1OP FROM MEMORY ID 'SN1OP'.
781| IMPORT SBLDAT FROM MEMORY ID 'SBLDAT'.
782| FREE MEMORY ID 'TI'.
783| FREE MEMORY ID 'KRPROG'.
784| FREE MEMORY ID 'KRSIM'.
785| FREE MEMORY ID 'SN1OP'.
786| FREE MEMORY ID 'SBLDAT'.
```
- **EN**: Import the selected tax invoices, calling program name, simulation flag, consolidated invoice option and issue date from ABAP memory IDs and free them.
- 업무 키워드: ABAP 메모리, 호출 프로그램 연계, 선택 세금계산서, 시뮬레이션, 발행일
- English: ABAP Memory, IMPORT, Calling Program, Simulation
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0141-408-sel_ausglop_itab), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`SIM`](#decl-zfir0141-130-sim), [`SN1OP`](#decl-zfir0141-143-sn1op), [`SBLDAT`](#decl-zfir0141-638-sbldat)
- 위치: `abap://ZFIR0141/ZFIR0141#L777-L786` · confidence 0.9 · `ZFIR0141#ZFIR0141#EVENT#START-OF-SELECTION#C1`
#### [control_flow] 호출 프로그램명이 없으면(단독 실행) DISPLAY_TAX_INVOICE 로 발행 목록을 표시하고, YFIR0601 등에서 호출되면 REPRINT 로 출력/전송하고 UPDATE_TABLE·USER_EXIT2 로 전표에 세금계산서 정보를 반영한다.
```abap
789| IF PROG_NAME = ' ' .
790| PERFORM DISPLAY_TAX_INVOICE.
791|
792| * YFIR0601에서 호출되어 실행 경우 -----------------------------------
793| ELSE.
794| PERFORM REPRINT.
795| PERFORM UPDATE_TABLE.
796| PERFORM USER_EXIT2.
797|
798|
799| ENDIF.
```
- **EN**: Branch on standalone execution (display tax invoice list) versus called execution (REPRINT, UPDATE_TABLE and USER_EXIT2).
- 호출(파서): DISPLAY_TAX_INVOICE, REPRINT, UPDATE_TABLE, USER_EXIT2
- 업무 키워드: 단독 실행, 호출 실행, 재발행, 전표 갱신
- English: Standalone, Reprint, Update Table, User Exit
- 정의부(복사 시 함께 필요): [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`REPRINT`](#decl-zfir0141-485-reprint)
- 위치: `abap://ZFIR0141/ZFIR0141#L789-L799` · confidence 0.85 · `ZFIR0141#ZFIR0141#EVENT#START-OF-SELECTION#C2`
### FORM DISPLAY_TAX_INVOICE — `ZFIR0141` L4029-L4051 (23줄)
*출력 옵션을 검증한 뒤 재발행이면 반올림 User Exit KR_USER_EXIT_ROUNDOFF 를 적용하고 대상이 없으면 메시지 I500 을 표시하며 세금계산서 리스트를 표시한다.*
> 이 unit 의 조각 1개가 18/23줄(78%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] CHECK_OPTION 으로 출력 옵션을 검증하고 재발행(REPRINT='X')이면 FM KR_USER_EXIT_ROUNDOFF 로 AUSGLOP_ITAB 금액을 고객사 반올림 규칙으로 보정하며, 대상 건이 없으면 I500 메시지 후 종료하고 있으면 DISPLAY_LIST 로 목록을 표시한다.
```abap
4032| PERFORM CHECK_OPTION.
4033|
4034| IF REPRINT = 'X'.
4035| CALL FUNCTION 'KR_USER_EXIT_ROUNDOFF'
4036| EXPORTING
4037| YSTA1 = STA1
4038| YPROG_NAME = SY-CPROG
4039| TABLES
4040| YAUSGLOP_ITAB = AUSGLOP_ITAB.
4041| ENDIF.
4042|
4043| DESCRIBE TABLE AUSGLOP_ITAB LINES SY-TFILL.
4044| IF SY-TFILL = 0.
4045| MESSAGE I500.
4046| EXIT.
4047| ENDIF.
4048|
4049| PERFORM DISPLAY_LIST.
```
- **EN**: Validate output options, apply the rounding user exit KR_USER_EXIT_ROUNDOFF for reprints, show message I500 when no rows exist, otherwise display the tax invoice list.
- 호출(파서): CHECK_OPTION, KR_USER_EXIT_ROUNDOFF, DISPLAY_LIST
- SAP 객체: KR_USER_EXIT_ROUNDOFF
- 업무 키워드: 출력 옵션 검증, 재발행, 반올림 User Exit, 대상 없음
- English: Option Check, Reprint, User Exit, Round Off
- 정의부(복사 시 함께 필요): [`REPRINT`](#decl-zfir0141-485-reprint), [`STA1`](#decl-zfir0141-655-sta1), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L4032-L4049` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#DISPLAY_TAX_INVOICE#C1`
### FORM CHECK_OPTION — `ZFIR0141` L1925-L2136 (212줄)
*단독 실행 시 선택 조건(세금계산서번호 SAUGBL 또는 발행일 SAUGDT)에 따라 BKPF/BSEG/BSET 에서 발행된 세금계산서 전표를 찾아 AUSGLOP_ITAB 을 구성하고 매출부가세 기준 공급가액·세액을 집계한다.*
> 이 unit 의 조각 4개가 196/212줄(92%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 세금계산서번호 조건이 있으면 BKPF-BKTXT(세금계산서번호 저장 필드)가 범위에 드는 전표를 읽고 고객(KOART='D') BSEG 라인에서 고객·사업영역·사업장·특별G/L·세금코드·전표금액(대변이면 부호 반전)을 가져와 AUSGLOP_ITAB 에 APPEND 한다.
```abap
1931| IF SAUGBL NE ' '. " 세금계산서 번호가 있으면
1932| SELECT * FROM BKPF WHERE BUKRS = SBUKRS
1933| AND GJAHR = SGJAHR
1934| AND BKTXT IN SAUGBL.
1935|
1936| IF SY-SUBRC = 0.
1937| MOVE-CORRESPONDING BKPF TO AUSGLOP_ITAB.
1938| MOVE BKPF-BKTXT TO AUSGLOP_ITAB-AUGBL.
1939| SELECT SINGLE * FROM BSEG WHERE BUKRS = BKPF-BUKRS
1940| AND BELNR = BKPF-BELNR
1941| AND GJAHR = BKPF-GJAHR
1942| AND KOART = 'D'
1943| AND KUNNR IN SKUNNR.
1944| IF SY-SUBRC = 0.
1945| MOVE BSEG-KUNNR TO AUSGLOP_ITAB-KUNNR.
1946| MOVE BSEG-GSBER TO AUSGLOP_ITAB-GSBER.
1947| MOVE BSEG-BELNR TO AUSGLOP_ITAB-BELNR.
1948| MOVE BSEG-BUPLA TO AUSGLOP_ITAB-BUPLA.
1949| MOVE BSEG-UMSKZ TO AUSGLOP_ITAB-UMSKZ.
1950| MOVE BSEG-MWSKZ TO AUSGLOP_ITAB-MWSKZ.
1951| * 매출부가세 텍스트를 가져오기 위한 설정
1952| * MOVE bseg-sgtxt TO ausglop_itab-sgtxt.
1953| IF BSEG-SHKZG = 'H'.
1954| BSEG-DMBTR = -1 * ( BSEG-DMBTR ).
1955| ENDIF.
1956| MOVE BSEG-DMBTR TO AUSGLOP_ITAB-DMBTR.
1957| APPEND AUSGLOP_ITAB.
1958| ELSE.
1959| CONTINUE.
1960| ENDIF.
1961| ENDIF.
1962| ENDSELECT.
```
- **EN**: When a tax invoice number range is given, read BKPF whose header text BKTXT holds the invoice number and take customer line data (KOART='D') from BSEG into AUSGLOP_ITAB with sign-adjusted amounts.
- 테이블(파서): read [BKPF](/tables/BKPF.md), [BSEG](/tables/BSEG.md) / write -
- SAP 객체: BKPF, BSEG
- 업무 키워드: 세금계산서 번호, 전표 헤더 텍스트, 고객 라인, 전표금액, 부호 반전
- English: Tax Invoice Number, Document Header Text, Customer Line Item, BKPF, BSEG
- 정의부(복사 시 함께 필요): [`SAUGBL`](#decl-zfir0141-645-saugbl), [`BKPF`](#decl-zfir0141-43-bkpf), [`SBUKRS`](#decl-zfir0141-629-sbukrs), [`SGJAHR`](#decl-zfir0141-632-sgjahr), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BSEG`](#decl-zfir0141-35-bseg), [`SKUNNR`](#decl-zfir0141-630-skunnr)
- 위치: `abap://ZFIR0141/ZFIR0141#L1931-L1962` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#CHECK_OPTION#C1`
#### [aggregation] 매출부가세 텍스트를 가져온 뒤 각 전표의 세금 항목 BSET 를 매출부가세 계정 0040605000 으로 한정해(특소세 이중합산 방지, A6 세금코드는 세액 0 포함) 차대(SHKZG) 부호를 고려해 공급가액(HWBAS)·세액(HWSTE)을 합산하고 신고일(MLDDT)을 발행일 AUGDT 로 세팅한다.
```abap
1965| PERFORM GET_SALES_TAX_SGTXT.
1966|
1967| LOOP AT AUSGLOP_ITAB.
1968|
1969| CLEAR: SIGN,CLEAR.
1970| * 특소세 때문에 LC표준액이 2 더해지므로 특소세를 제외한
1971| * 매출부가가치세의 LC표준액만 더하기 위해 계정번호를 조건으로 추가.
1972| IF AUSGLOP_ITAB-MWSKZ <> 'A6'.
1973| SELECT * FROM BSET WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1974| AND BELNR = AUSGLOP_ITAB-BELNR
1975| AND GJAHR = AUSGLOP_ITAB-GJAHR
1976| AND HKONT = '0040605000'
1977| AND HWSTE <> ''.
1978|
1979|
1980| IF SY-SUBRC = 0.
1981|
1982| IF SIGN = ' '.
1983| SIGN = BSET-SHKZG.
1984| ENDIF.
1985|
1986| IF SIGN <> ' ' AND SIGN <> BSET-SHKZG .
1987| AUSGLOP_ITAB-HWSTE = AUSGLOP_ITAB-HWSTE - BSET-HWSTE.
1988| AUSGLOP_ITAB-HWBAS = AUSGLOP_ITAB-HWBAS - BSET-HWBAS.
1989| CLEAR = 'X'.
1990| ELSE.
1991| ADD BSET-HWSTE TO AUSGLOP_ITAB-HWSTE.
1992| ADD BSET-HWBAS TO AUSGLOP_ITAB-HWBAS.
1993| ENDIF.
1994|
1995| * ADD bset-hwste TO ausglop_itab-hwste.
1996| * ADD bset-hwbas TO ausglop_itab-hwbas.
1997|
1998| MOVE BSET-MLDDT TO AUSGLOP_ITAB-AUGDT.
1999| * MOVE bset-shkzg to ausglop_itab-shkzg.
2000| IF AUSGLOP_ITAB-SHKZG = ' ' .
2001| MOVE BSET-SHKZG TO AUSGLOP_ITAB-SHKZG.
2002| ENDIF.
2003|
2004| * if bset-shkzg = 'S'.
2005| IF BSET-SHKZG = 'S' AND CLEAR = ' '.
2006| AUSGLOP_ITAB-HWSTE = AUSGLOP_ITAB-HWSTE * -1.
2007| AUSGLOP_ITAB-HWBAS = AUSGLOP_ITAB-HWBAS * -1.
2008| ENDIF.
2009| MODIFY AUSGLOP_ITAB.
2010| ENDIF.
2011| ENDSELECT.
2012|
2013| ELSEIF AUSGLOP_ITAB-MWSKZ = 'A6'.
2014| SELECT * FROM BSET WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2015| AND BELNR = AUSGLOP_ITAB-BELNR
2016| AND GJAHR = AUSGLOP_ITAB-GJAHR
2017| AND HKONT = '0040605000'.
2018|
2019|
2020|
2021| IF SY-SUBRC = 0.
2022|
2023| IF SIGN = ' '.
2024| SIGN = BSET-SHKZG.
2025| ENDIF.
2026|
2027| IF SIGN <> ' ' AND SIGN <> BSET-SHKZG .
2028| AUSGLOP_ITAB-HWSTE = AUSGLOP_ITAB-HWSTE - BSET-HWSTE.
2029| AUSGLOP_ITAB-HWBAS = AUSGLOP_ITAB-HWBAS - BSET-HWBAS.
2030| CLEAR = 'X'.
2031| ELSE.
2032| ADD BSET-HWSTE TO AUSGLOP_ITAB-HWSTE.
2033| ADD BSET-HWBAS TO AUSGLOP_ITAB-HWBAS.
2034| ENDIF.
2035|
2036| * ADD bset-hwste TO ausglop_itab-hwste.
2037| * ADD bset-hwbas TO ausglop_itab-hwbas.
2038|
2039| MOVE BSET-MLDDT TO AUSGLOP_ITAB-AUGDT.
2040| * MOVE bset-shkzg to ausglop_itab-shkzg.
2041| IF AUSGLOP_ITAB-SHKZG = ' ' .
2042| MOVE BSET-SHKZG TO AUSGLOP_ITAB-SHKZG.
2043| ENDIF.
2044|
2045| * if bset-shkzg = 'S'.
2046| IF BSET-SHKZG = 'S' AND CLEAR = ' '.
2047| AUSGLOP_ITAB-HWSTE = AUSGLOP_ITAB-HWSTE * -1.
2048| AUSGLOP_ITAB-HWBAS = AUSGLOP_ITAB-HWBAS * -1.
2049| ENDIF.
2050| MODIFY AUSGLOP_ITAB.
2051| ENDIF.
2052| ENDSELECT.
2053| ENDIF.
2054| ENDLOOP.
```
- **EN**: Aggregate tax base and tax amount from BSET restricted to the output VAT account 0040605000 (avoiding double counting of special consumption tax, tax code A6 including zero tax), applying debit/credit sign logic, and set the reporting date as the issue date.
- 테이블(파서): read [BSET](/tables/BSET.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- 호출(파서): GET_SALES_TAX_SGTXT
- SAP 객체: BSET
- 업무 키워드: 매출부가세, 세금 항목, 공급가액 합산, 세액 합산, 특소세, 차대 구분, 신고일
- English: Output VAT, BSET, Tax Base, Tax Amount, Debit/Credit Indicator, Reporting Date
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`CLEAR`](#decl-zfir0141-1927-clear), [`SIGN`](#decl-zfir0141-1927-sign), [`BSET`](#decl-zfir0141-34-bset)
- 위치: `abap://ZFIR0141/ZFIR0141#L1965-L2054` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#CHECK_OPTION#C2`
#### [sql_select] 발행일 조건만 있으면 매출부가세 계정 0040605000 의 BSET 를 신고일(MLDDT) 범위로 읽어 전표별로 공급가액·세액을 합산(차변이면 부호 반전)하고 신고일을 발행일로 하여 AUSGLOP_ITAB 에 추가·갱신한다.
```abap
2056| ELSEIF SAUGBL = ' ' AND SAUGDT NE ' '.
2057|
2058| SELECT * FROM BSET WHERE BUKRS = SBUKRS
2059| AND GJAHR = SGJAHR
2060| * 특소세 때문에 LC표준액이 2번 더해지므로 특소세를 제외한
2061| * 매출부가가치세의 LC표준액만 더하기 위해 계정번호를 조건으로 추가.
2062| AND HKONT = '0040605000'
2063| AND MLDDT IN SAUGDT.
2064| IF SY-SUBRC = 0.
2065| READ TABLE AUSGLOP_ITAB WITH KEY BUKRS = BSET-BUKRS
2066| BELNR = BSET-BELNR
2067| GJAHR = BSET-GJAHR.
2068| IF SY-SUBRC = 0.
2069| ADD BSET-HWBAS TO AUSGLOP_ITAB-HWBAS.
2070| ADD BSET-HWSTE TO AUSGLOP_ITAB-HWSTE.
2071| IF BSET-SHKZG = 'S'.
2072| AUSGLOP_ITAB-HWSTE = AUSGLOP_ITAB-HWSTE * -1.
2073| AUSGLOP_ITAB-HWBAS = AUSGLOP_ITAB-HWBAS * -1.
2074| ENDIF.
2075| MOVE BSET-MLDDT TO AUSGLOP_ITAB-AUGDT.
2076| MOVE BSET-SHKZG TO AUSGLOP_ITAB-SHKZG.
2077| MODIFY AUSGLOP_ITAB INDEX SY-TABIX.
2078| ELSE.
2079| MOVE-CORRESPONDING BSET TO AUSGLOP_ITAB.
2080| IF BSET-SHKZG = 'S'.
2081| AUSGLOP_ITAB-HWSTE = AUSGLOP_ITAB-HWSTE * -1.
2082| AUSGLOP_ITAB-HWBAS = AUSGLOP_ITAB-HWBAS * -1.
2083| ENDIF.
2084| MOVE BSET-MLDDT TO AUSGLOP_ITAB-AUGDT.
2085| APPEND AUSGLOP_ITAB.
2086| ENDIF.
2087| ENDIF.
2088|
2089| ENDSELECT.
```
- **EN**: When only an issue date range is given, read BSET by reporting date for the output VAT account and accumulate tax base and tax per document into AUSGLOP_ITAB.
- 테이블(파서): read [BSET](/tables/BSET.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSET
- 업무 키워드: 발행일 조건, 신고일, 세금 항목, 공급가액, 세액
- English: Reporting Date, BSET, Tax Base, Tax Amount
- 정의부(복사 시 함께 필요): [`SAUGBL`](#decl-zfir0141-645-saugbl), [`SAUGDT`](#decl-zfir0141-646-saugdt), [`BSET`](#decl-zfir0141-34-bset), [`SBUKRS`](#decl-zfir0141-629-sbukrs), [`SGJAHR`](#decl-zfir0141-632-sgjahr), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2056-L2089` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#CHECK_OPTION#C3`
#### [sql_select] 발행일 기준으로 모은 각 전표에 대해 고객 BSEG 라인(KOART='D', 고객 범위)과 BKPF 헤더(원천 유형·참조키·통화·세금계산서번호 BKTXT·전표일·전기일·전표유형)를 읽어 채우고 STRING_CHECK 로 세금계산서번호가 숫자형이 아니거나 고객 라인이 없으면 삭제한다.
```abap
2093| LOOP AT AUSGLOP_ITAB.
2094| SELECT SINGLE * FROM BSEG WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2095| AND BELNR = AUSGLOP_ITAB-BELNR
2096| AND GJAHR = AUSGLOP_ITAB-GJAHR
2097| AND KOART = 'D'
2098| AND KUNNR IN SKUNNR.
2099| IF SY-SUBRC = 0.
2100| MOVE BSEG-KUNNR TO AUSGLOP_ITAB-KUNNR.
2101| MOVE BSEG-GSBER TO AUSGLOP_ITAB-GSBER.
2102| MOVE BSEG-BUPLA TO AUSGLOP_ITAB-BUPLA.
2103| MOVE BSEG-UMSKZ TO AUSGLOP_ITAB-UMSKZ.
2104| MOVE BSEG-SGTXT TO AUSGLOP_ITAB-SGTXT.
2105| IF BSEG-SHKZG = 'H'.
2106| BSEG-DMBTR = -1 * ( BSEG-DMBTR ).
2107| ENDIF.
2108| MOVE BSEG-DMBTR TO AUSGLOP_ITAB-DMBTR.
2109|
2110| SELECT SINGLE * FROM BKPF WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2111| AND BELNR = AUSGLOP_ITAB-BELNR
2112| AND GJAHR = AUSGLOP_ITAB-GJAHR.
2113|
2114| AUSGLOP_ITAB-AWTYP = BKPF-AWTYP.
2115| AUSGLOP_ITAB-AWKEY = BKPF-AWKEY.
2116| AUSGLOP_ITAB-HWAER = BKPF-HWAER.
2117| AUSGLOP_ITAB-WAERS = BKPF-WAERS.
2118| AUSGLOP_ITAB-AUGBL = BKPF-BKTXT.
2119| AUSGLOP_ITAB-BLDAT = BKPF-BLDAT.
2120| AUSGLOP_ITAB-BUDAT = BKPF-BUDAT.
2121| AUSGLOP_ITAB-BLART = BKPF-BLART.
2122| *augbl이 세금계산서번호로만(숫자) 이루어진것을 체크한다.
2123| PERFORM STRING_CHECK.
2124| IF W_HTYPE = 'NUMC' AND AUSGLOP_ITAB-AUGDT NE 0.
2125| MODIFY AUSGLOP_ITAB.
2126| ELSE.
2127| DELETE AUSGLOP_ITAB.
2128| ENDIF.
2129| ELSE.
2130| DELETE AUSGLOP_ITAB.
2131| ENDIF.
2132| ENDLOOP.
```
- **EN**: For each collected document, enrich with the customer line from BSEG and header data from BKPF, then drop rows whose tax invoice number is not numeric or that have no matching customer line.
- 테이블(파서): read [BSEG](/tables/BSEG.md), [BKPF](/tables/BKPF.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- 호출(파서): STRING_CHECK
- SAP 객체: BSEG, BKPF
- 업무 키워드: 고객 라인, 전표 헤더, 세금계산서번호 검증, 숫자형 체크, 대상 정리
- English: Customer Line Item, Document Header, Validation, NUMERIC_CHECK
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BSEG`](#decl-zfir0141-35-bseg), [`SKUNNR`](#decl-zfir0141-630-skunnr), [`BKPF`](#decl-zfir0141-43-bkpf), [`W_HTYPE`](#decl-zfir0141-484-w_htype)
- 위치: `abap://ZFIR0141/ZFIR0141#L2093-L2132` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#CHECK_OPTION#C4`
### FORM GET_SALES_TAX_SGTXT — `ZFIR0141` L4801-L4820 (20줄)
*각 출력 대상 전표의 매출세(MWART='A') BSEG 라인 항목 텍스트(SGTXT)를 읽어 AUSGLOP_ITAB-SGTXT 에 저장한다.*
> 이 unit 의 조각 1개가 16/20줄(80%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 전표(BUKRS/BELNR/GJAHR)의 매출세 유형(MWART='A') BSEG 라인을 SELECT SINGLE 하여 항목 텍스트 SGTXT 를 AUSGLOP_ITAB 에 MODIFY 로 반영해 세금계산서 품목명 원천으로 사용한다.
```abap
4803| LOOP AT AUSGLOP_ITAB.
4804|
4805| * SELECT SINGLE * FROM bseg WHERE belnr = ausglop_itab-belnr
4806| * AND mwart = 'A'.
4807| * 아래와 같이 고침 2003.10.16
4808|
4809| SELECT SINGLE * FROM BSEG WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4810| AND BELNR = AUSGLOP_ITAB-BELNR
4811| AND GJAHR = AUSGLOP_ITAB-GJAHR
4812| AND MWART = 'A'.
4813|
4814| IF SY-SUBRC EQ 0.
4815| MOVE BSEG-SGTXT TO AUSGLOP_ITAB-SGTXT.
4816| MODIFY AUSGLOP_ITAB.
4817| ENDIF.
4818| ENDLOOP.
```
- **EN**: Read the output tax (MWART='A') line item from BSEG for each document and store its text SGTXT in AUSGLOP_ITAB.
- 테이블(파서): read [BSEG](/tables/BSEG.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSEG
- 업무 키워드: 매출세, 전표 항목 텍스트, 세금 라인
- English: Output Tax, Line Item Text, BSEG
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BSEG`](#decl-zfir0141-35-bseg)
- 위치: `abap://ZFIR0141/ZFIR0141#L4803-L4818` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#GET_SALES_TAX_SGTXT#C1`
### FORM STRING_CHECK — `ZFIR0141` L3541-L3551 (11줄)
*세금계산서번호(AUSGLOP_ITAB-AUGBL)가 숫자형인지 FM NUMERIC_CHECK 로 판정해 W_HTYPE 에 담는다.*
> 이 unit 의 조각 1개가 6/11줄(55%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] AUSGLOP_ITAB-AUGBL 을 FM NUMERIC_CHECK 에 넘겨 데이터 유형(HTYPE, NUMC 여부)을 받아 세금계산서번호 형식 검증에 사용한다.
```abap
3544| CALL FUNCTION 'NUMERIC_CHECK'
3545| EXPORTING
3546| STRING_IN = AUSGLOP_ITAB-AUGBL
3547| IMPORTING
3548| * STRING_OUT =
3549| HTYPE = W_HTYPE.
```
- **EN**: Call FM NUMERIC_CHECK on the tax invoice number to obtain its type (NUMC or not) for format validation.
- 호출(파서): NUMERIC_CHECK
- SAP 객체: NUMERIC_CHECK
- 업무 키워드: 세금계산서번호, 숫자형 검증
- English: NUMERIC_CHECK, Validation, Tax Invoice Number
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`W_HTYPE`](#decl-zfir0141-484-w_htype)
- 위치: `abap://ZFIR0141/ZFIR0141#L3544-L3549` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#STRING_CHECK#C1`
### FORM DISPLAY_LIST — `ZFIR0141` L2406-L2522 (117줄)
*발행된 세금계산서를 번호(AUGBL) 단위로 금액을 합산해 AUSGLOP_ITAB2 로 요약하고 고객명·사업자번호와 함께 체크박스 리스트로 표시한다.*
> 이 unit 의 조각 3개가 103/117줄(88%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [aggregation] 동일 세금계산서번호·발행일의 항목은 AUSGLOP_ITAB2 에 전표금액(DMBTR)·공급가액·세액을 누적하고, 새 번호는 STRING_CHECK 로 숫자형 확인 후 TX 전표유형 번호범위(8000000000~)이면 최신 전기일(BUDAT1)과 함께 AUSGLOP_ITAB2 에 APPEND 한다.
```abap
2410| LOOP AT AUSGLOP_ITAB.
2411| LOOP AT AUSGLOP_ITAB2 WHERE AUGBL = AUSGLOP_ITAB-AUGBL
2412| AND AUGDT = AUSGLOP_ITAB-AUGDT.
2413| AUG = 'X'.
2414| AUSGLOP_ITAB2-DMBTR = AUSGLOP_ITAB2-DMBTR + AUSGLOP_ITAB-DMBTR.
2415| AUSGLOP_ITAB2-HWBAS = AUSGLOP_ITAB2-HWBAS + AUSGLOP_ITAB-HWBAS.
2416| AUSGLOP_ITAB2-HWSTE = AUSGLOP_ITAB2-HWSTE + AUSGLOP_ITAB-HWSTE.
2417| MODIFY AUSGLOP_ITAB2.
2418| ENDLOOP.
2419|
2420| IF AUG <> 'X'.
2421| CLEAR L_AUGBL.
2422| * ausglop_itab-augbl의 type 체크
2423| PERFORM STRING_CHECK.
2424|
2425| * IF w_htype = 'NUMC' AND ausglop_itab-augdt NE 0.
2426| * MOVE-CORRESPONDING ausglop_itab TO ausglop_itab2.
2427| * APPEND ausglop_itab2.
2428| * ENDIF.
2429| IF W_HTYPE = 'NUMC' AND AUSGLOP_ITAB-AUGDT NE 0.
2430| WRITE AUSGLOP_ITAB-AUGBL TO L_AUGBL.
2431|
2432| * 전표 번호 범위 체크
2433| * 전표유형 TX 번호 범위가 8000000000 번대
2434| IF L_AUGBL >= 8000000000 AND L_AUGBL =< 81999999999.
2435| MOVE-CORRESPONDING AUSGLOP_ITAB TO AUSGLOP_ITAB2.
2436|
2437| LOOP AT AUSGLOP_ITAB WHERE AUGBL = L_AUGBL .
2438|
2439| MOVE-CORRESPONDING AUSGLOP_ITAB TO IT_BUDAT.
2440| APPEND IT_BUDAT.
2441| ENDLOOP.
2442| SORT IT_BUDAT BY BUDAT DESCENDING .
2443|
2444| LOOP AT IT_BUDAT .
2445|
2446| SY-TABIX = 1.
2447| AUSGLOP_ITAB2-BUDAT1 = IT_BUDAT-BUDAT.
2448| EXIT.
2449| ENDLOOP.
2450|
2451| REFRESH IT_BUDAT. CLEAR IT_BUDAT.
2452|
2453| APPEND AUSGLOP_ITAB2.
2454| CLEAR AUSGLOP_ITAB2.
2455| ENDIF.
2456| ENDIF.
2457|
2458| ENDIF.
2459|
2460| CLEAR AUG.
2461|
2462| ENDLOOP.
```
- **EN**: Summarize rows per tax invoice number into AUSGLOP_ITAB2 by accumulating amounts, and for new numeric numbers in the TX document number range append a new row with the latest posting date.
- 테이블(파서): read - / write [AUSGLOP_ITAB2](/tables/AUSGLOP_ITAB2.md)
- 호출(파서): STRING_CHECK
- 업무 키워드: 세금계산서 번호, 금액 합산, 번호 범위, 전표유형 TX, 최신 전기일
- English: Tax Invoice Number, Aggregation, Number Range, Posting Date
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUSGLOP_ITAB2`](#decl-zfir0141-215-ausglop_itab2), [`AUGBL`](#decl-zfir0141-461-augbl), [`AUG`](#decl-zfir0141-131-aug), [`L_AUGBL`](#decl-zfir0141-2407-l_augbl), [`W_HTYPE`](#decl-zfir0141-484-w_htype), [`IT_BUDAT`](#decl-zfir0141-159-it_budat), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L2410-L2462` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#DISPLAY_LIST#C1`
#### [output] 재발행/취소·세금계산서/추가시트 옵션 조합에 따라 제목 텍스트(B01~B04)를 쓰고 T001 을 읽은 뒤 리스트 헤더(세금계산서번호·발행일·고객·고객명·사업자번호·사업장·금액·공급가액·세액)를 출력한다.
```abap
2465| IF REPRINT = 'X' AND CHK_PRTI = 'X'.
2466| WRITE: TEXT-B01.
2467| ELSEIF REPRINT = 'X' AND CHK_PRAD = 'X'.
2468| WRITE: TEXT-B03.
2469| ELSEIF CANCEL = 'X' AND CHK_PRTI = 'X'.
2470| WRITE: TEXT-B02.
2471| ELSEIF CANCEL = 'X' AND CHK_PRAD = 'X'.
2472| WRITE: TEXT-B04.
2473| ENDIF.
2474|
2475| SKIP.
2476|
2477| FORMAT COLOR COL_HEADING INTENSIFIED.
2478|
2479| SET COUNTRY 'KR'.
2480| SELECT SINGLE * FROM T001 WHERE BUKRS = SBUKRS.
2481|
2482| WRITE:/3 TEXT-B05, "'Tax Inv. No.',
2483| 15 TEXT-B06, "'Tax. inv. date',
2484| 30 TEXT-B07, "'Customer',
2485| 40 TEXT-B11, "'Customer Name',
2486| * 추가필드 2004.1.13
2487| 60 TEXT-B12, "사업자번호 stcd2
2488| 72 TEXT-B13, "사업장 bupla
2489| 82 TEXT-B08, "'Doc. Amt',
2490| 103 TEXT-B09, "'Base Amt',
2491| 122 TEXT-B10. "'Tax Amt'.
```
- **EN**: Print the list title depending on reprint/cancel and form options, read T001 and write the column header line.
- 테이블(파서): read [T001](/tables/T001.md) / write -
- SAP 객체: T001
- 업무 키워드: 리스트 헤더, 재발행, 취소, 제목
- English: List Header, Reprint, Cancel
- 정의부(복사 시 함께 필요): [`REPRINT`](#decl-zfir0141-485-reprint), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`CHK_PRAD`](#decl-zfir0141-682-chk_prad), [`CANCEL`](#decl-zfir0141-486-cancel), [`T001`](#decl-zfir0141-40-t001), [`SBUKRS`](#decl-zfir0141-629-sbukrs)
- 위치: `abap://ZFIR0141/ZFIR0141#L2465-L2491` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#DISPLAY_LIST#C2`
#### [output] 요약된 세금계산서마다 KNA1 에서 고객명·사업자번호를 조회하고 체크박스·번호·발행일·고객·사업장·전표금액·공급가액·세액을 회사 통화로 WRITE 하며 라인 번호(LIST_LINE)를 저장해 이후 선택 처리에 사용한다.
```abap
2498| LOOP AT AUSGLOP_ITAB2.
2499| SELECT SINGLE NAME1 STCD2
2500| INTO (AUSGLOP_ITAB2-NAME1, STCD2)
2501| FROM KNA1
2502| WHERE KUNNR = AUSGLOP_ITAB2-KUNNR.
2503|
2504| CHECK NOT AUSGLOP_ITAB2-AUGBL IS INITIAL.
2505| * CHECK ausglop_itab2-augbl IS NUMERIC.
2506| WRITE:/1 AUSGLOP_ITAB2-CHECK AS CHECKBOX,
2507| 3 AUSGLOP_ITAB2-AUGBL,
2508| 15 AUSGLOP_ITAB2-BUDAT1 ,"augdt,
2509| 30 AUSGLOP_ITAB2-KUNNR,
2510| 40 AUSGLOP_ITAB2-NAME1,
2511| 60 STCD2, "사업자번호 추가 2003.1.13
2512| 72 AUSGLOP_ITAB2-BUPLA,
2513| 77 AUSGLOP_ITAB2-DMBTR CURRENCY T001-WAERS,
2514| 93 AUSGLOP_ITAB2-HWBAS CURRENCY T001-WAERS,
2515| 120 AUSGLOP_ITAB2-HWSTE CURRENCY T001-WAERS.
2516|
2517| AUSGLOP_ITAB2-LIST_LINE = SY-LINNO.
2518| MODIFY AUSGLOP_ITAB2.
2519| CLEAR STCD2.
2520| ENDLOOP.
```
- **EN**: For each summarized tax invoice, read customer name and tax number from KNA1, write the checkbox list line with amounts in company currency and store the list line number.
- 테이블(파서): read [KNA1](/tables/KNA1.md) / write [AUSGLOP_ITAB2](/tables/AUSGLOP_ITAB2.md)
- SAP 객체: KNA1
- 업무 키워드: 체크박스 리스트, 고객명, 사업자번호, 세금계산서 목록
- English: Checkbox, Customer Name, KNA1, List Output
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB2`](#decl-zfir0141-215-ausglop_itab2), [`STCD2`](#decl-zfir0141-2496-stcd2), [`KNA1`](#decl-zfir0141-41-kna1), [`T001`](#decl-zfir0141-40-t001)
- 위치: `abap://ZFIR0141/ZFIR0141#L2498-L2520` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#DISPLAY_LIST#C3`
### FORM REPRINT — `ZFIR0141` L2531-L2766 (236줄)
*세금계산서 재발행 메인 흐름으로 호출 프로그램에서 넘어온 선택 항목을 AUSGLOP_ITAB 에 옮기고 원천·세금코드·특별G/L·사업장·주소·품목·합계를 순서대로 준비한 뒤 출력 옵션(LIST/FULLLIST/SAP)에 따라 인쇄한다.*
> 이 unit 의 조각 7개가 207/236줄(88%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 다른 프로그램에서 호출된 경우 SEL_AUSGLOP_ITAB 을 AUSGLOP_ITAB 으로 옮기며 발행일(AUGDT)을 입력 SBLDAT 로, 통합 세금계산서(SN1OP)면 FM LAST_DAY_OF_MONTHS 로 전기일의 말일로 세팅한다.
```abap
2535| IF PROG_NAME <> ' '.
2536| DESCRIBE TABLE SEL_AUSGLOP_ITAB LINES G_LINES. "sy-tfill.
2537| *only reprint is called
2538| CHECK G_LINES > 0.
2539| * CHECK sy-tfill > 0.
2540| * values coming in from the calling program move values to ausglop_itab.
2541| LOOP AT SEL_AUSGLOP_ITAB.
2542| MOVE-CORRESPONDING SEL_AUSGLOP_ITAB TO AUSGLOP_ITAB.
2543| * 세금계산서 발행일자 - smartbill 2006.07.21
2544| IF SBLDAT IS INITIAL.
2545| IF SN1OP EQ 'X'. " 통합 세금계산서 발행일 경우
2546| * 전기일자의 말일.
2547| CALL FUNCTION 'LAST_DAY_OF_MONTHS'
2548| EXPORTING
2549| DAY_IN = SEL_AUSGLOP_ITAB-BUDAT
2550| IMPORTING
2551| LAST_DAY_OF_MONTH = AUSGLOP_ITAB-AUGDT
2552| EXCEPTIONS
2553| DAY_IN_NO_DATE = 1
2554| OTHERS = 2.
2555| ENDIF.
2556| ELSE.
2557| AUSGLOP_ITAB-AUGDT = SBLDAT.
2558| ENDIF.
2559|
2560| APPEND AUSGLOP_ITAB.
2561| ENDLOOP.
2562|
2563| * 주석처리 - 2006.08.16
2564| ** 영세율 세금계산서 체크.
2565| * LOOP AT AUSGLOP_ITAB TRANSPORTING NO FIELDS
2566| * WHERE MWSKZ IN SMWSKZ.
2567| * EXIT.
2568| * ENDLOOP.
2569| * IF SY-SUBRC EQ 0.
2570| * FL_TAX_RAT = '0'.
2571| * ENDIF.
2572| ENDIF.
```
- **EN**: When called externally, copy SEL_AUSGLOP_ITAB into AUSGLOP_ITAB and set the issue date from SBLDAT or, for consolidated invoices, the month-end of the posting date via LAST_DAY_OF_MONTHS.
- 호출(파서): LAST_DAY_OF_MONTHS
- SAP 객체: LAST_DAY_OF_MONTHS
- 업무 키워드: 재발행, 세금계산서 발행일, 통합 세금계산서, 월말일
- English: Reprint, Issue Date, Consolidated Tax Invoice, LAST_DAY_OF_MONTHS
- 정의부(복사 시 함께 필요): [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`SEL_AUSGLOP_ITAB`](#decl-zfir0141-408-sel_ausglop_itab), [`G_LINES`](#decl-zfir0141-487-g_lines), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`SBLDAT`](#decl-zfir0141-638-sbldat), [`SN1OP`](#decl-zfir0141-143-sn1op)
- 위치: `abap://ZFIR0141/ZFIR0141#L2535-L2572` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#REPRINT#C1`
#### [control_flow] FILL_CHECK_TABLE·GET_TAX_CODE·CHECK_G_L_INDICATOR 로 원천 유형·사업자번호·특별G/L 을 채운 뒤 FI 전표(BKPF) 항목은 CHECK_ITAB 에 AWTYP_FI 를 표시하고 없으면 SAVE_UMSKZ 와 함께 새로 APPEND 한다.
```abap
2575| PERFORM FILL_CHECK_TABLE.
2576|
2577| * Getting the tax code 1 or tax code 2
2578| PERFORM GET_TAX_CODE.
2579|
2580| * check special g_l-indicator
2581| PERFORM CHECK_G_L_INDICATOR.
2582| * if document is a special g_l transaction document.
2583|
2584| LOOP AT AUSGLOP_ITAB.
2585| IF PROG_NAME = ' '.
2586| CHECK AUSGLOP_ITAB-CHECK = 'X'.
2587| ENDIF.
2588|
2589| IF AUSGLOP_ITAB-AWTYP = 'BKPF'.
2590|
2591| CLEAR CHECK_ITAB.
2592| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2593| AND KUNNR = AUSGLOP_ITAB-KUNNR
2594| AND STCD = AUSGLOP_ITAB-STCD
2595| AND AUGBL = AUSGLOP_ITAB-AUGBL.
2596| CHECK_ITAB-AWTYP_FI = AUSGLOP_ITAB-AWTYP.
2597| MOVE AUSGLOP_ITAB-BUKRS TO CHECK_ITAB-BUKRS.
2598| MOVE AUSGLOP_ITAB-KUNNR TO CHECK_ITAB-KUNNR.
2599| MOVE AUSGLOP_ITAB-STCD TO CHECK_ITAB-STCD.
2600| MOVE AUSGLOP_ITAB-AUGBL TO CHECK_ITAB-AUGBL.
2601| MODIFY CHECK_ITAB.
2602| ENDLOOP.
2603|
2604| * if check_itab not already filled :
2605| IF SY-SUBRC <> 0.
2606| CHECK_ITAB-AWTYP_FI = AUSGLOP_ITAB-AWTYP.
2607| MOVE AUSGLOP_ITAB-BUKRS TO CHECK_ITAB-BUKRS.
2608| MOVE AUSGLOP_ITAB-KUNNR TO CHECK_ITAB-KUNNR.
2609| MOVE AUSGLOP_ITAB-STCD TO CHECK_ITAB-STCD.
2610| MOVE AUSGLOP_ITAB-AUGBL TO CHECK_ITAB-AUGBL.
2611| MOVE AUSGLOP_ITAB-UMSKZ TO CHECK_ITAB-SAVE_UMSKZ.
2612| APPEND CHECK_ITAB.
2613| ENDIF.
2614|
2615| ENDIF.
2616|
2617| ENDLOOP.
```
- **EN**: Fill the check table, tax codes and special G/L indicators, then mark FI-originated rows in CHECK_ITAB (AWTYP_FI) or append new entries with the saved special G/L indicator.
- 테이블(파서): read - / write [CHECK_ITAB](/tables/CHECK_ITAB.md)
- 호출(파서): FILL_CHECK_TABLE, GET_TAX_CODE, CHECK_G_L_INDICATOR
- SAP 객체: BKPF
- 업무 키워드: 체크 테이블, FI 전표, 특별 G/L, 원천 유형
- English: Check Table, FI Document, Special G/L Indicator
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L2575-L2617` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#REPRINT#C2`
#### [validation] 추가 시트 인쇄(CHK_PRAD)인데 순수 FI 전표만으로 발행된 세금계산서면 오류 E203 을 내고, 각 항목의 발행 사업장 주소를 GET_BUPLA 로 수집한다.
```abap
2619| LOOP AT AUSGLOP_ITAB.
2620| IF PROG_NAME = ' '.
2621| CHECK AUSGLOP_ITAB-CHECK = 'X'.
2622| ENDIF.
2623|
2624| * Check if Tax invoice not issued from pure fi-documents
2625| IF CHK_PRAD = 'X'.
2626| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2627| AND KUNNR = AUSGLOP_ITAB-KUNNR
2628| AND STCD = AUSGLOP_ITAB-STCD
2629| AND AUGBL = AUSGLOP_ITAB-AUGBL.
2630|
2631| IF CHECK_ITAB-AWTYP_FI = 'BKPF' AND CHECK_ITAB-AWTYP_SD = ' '.
2632| MESSAGE E203 WITH AUSGLOP_ITAB-AUGBL.
2633| ENDIF.
2634| ENDLOOP.
2635| ENDIF.
2636|
2637| *----------------------------------------------------------------------*
2638| * get base amount and tax amount from bset
2639| *----------------------------------------------------------------------*
2640|
2641| * PERFORM get_taxes.
2642|
2643| *----------------------------------------------------------------------*
2644| * get issuer business place data
2645| *----------------------------------------------------------------------*
2646| PERFORM GET_BUPLA.
2647|
2648| ENDLOOP.
```
- **EN**: Raise error E203 when the additional sheet is requested for a pure FI-document tax invoice, and collect the issuing business place address via GET_BUPLA.
- 호출(파서): GET_BUPLA
- 업무 키워드: 추가 시트, 순수 FI 전표 검증, 사업장 주소
- English: Additional Sheet, Validation, Business Place
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`CHK_PRAD`](#decl-zfir0141-682-chk_prad), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L2619-L2648` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#REPRINT#C3`
#### [sql_select] 본사 사업장 'K000' 의 종사업장 번호(STATE_INSC)를 J_1BBRANCH 에서 조회해 세금계산서에 표시할 값으로 보관한다.
```abap
2658| CLEAR L_STATE_INSC.
2659| SELECT SINGLE STATE_INSC INTO L_STATE_INSC
2660| FROM J_1BBRANCH
2661| WHERE BUKRS = SBUKRS
2662| AND BRANCH = 'K000'.
```
- **EN**: Read the sub-business place number STATE_INSC of branch 'K000' from J_1BBRANCH for printing.
- 테이블(파서): read [J_1BBRANCH](/tables/J_1BBRANCH.md) / write -
- SAP 객체: J_1BBRANCH
- 업무 키워드: 종사업장, 사업장 마스터
- English: Business Place, J_1BBRANCH
- 정의부(복사 시 함께 필요): [`L_STATE_INSC`](#decl-zfir0141-134-l_state_insc), [`J_1BBRANCH`](#decl-zfir0141-47-j_1bbranch), [`SBUKRS`](#decl-zfir0141-629-sbukrs)
- 위치: `abap://ZFIR0141/ZFIR0141#L2658-L2662` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#REPRINT#C4`
#### [calculation] GET_ADDRESS 로 고객 주소, FILL_TABLES 로 품목·합계 테이블을 만든 뒤 FI 합계(ALL_ITEMS_FI_ITAB)의 공급가액·세액을 KRW 편집으로 4번째 라인 MATZEIL4_ITAB 에 채운다.
```abap
2669| PERFORM GET_ADDRESS.
2670|
2671|
2672| *----------------------------------------------------------------------*
2673| * filling of the internal table ausglop_mat_itab with
2674| * material-related data. For FI documents, fill aggregated table
2675| *----------------------------------------------------------------------*
2676| PERFORM FILL_TABLES.
2677|
2678| * Filling the base amount and tax amount fields of the 4th line in case
2679| * fi + sd-data or only fi-data.
2680|
2681| LOOP AT MATZEIL4_ITAB.
2682| LOOP AT ALL_ITEMS_FI_ITAB WHERE BUKRS = MATZEIL4_ITAB-BUKRS
2683| AND KUNNR = MATZEIL4_ITAB-KUNNR
2684| AND STCD = MATZEIL4_ITAB-STCD
2685| AND AUGBL = MATZEIL4_ITAB-AUGBL.
2686| WRITE ALL_ITEMS_FI_ITAB-NETWR TO MATZEIL4_ITAB-NETWR
2687| CURRENCY 'KRW'.
2688| WRITE ALL_ITEMS_FI_ITAB-MWSBP TO MATZEIL4_ITAB-MWSBP
2689| CURRENCY 'KRW'.
2690| MODIFY MATZEIL4_ITAB.
2691| ENDLOOP.
2692| ENDLOOP.
```
- **EN**: Collect customer addresses and material tables, then fill the fourth line MATZEIL4_ITAB with the FI totals in KRW.
- 테이블(파서): read - / write [MATZEIL4_ITAB](/tables/MATZEIL4_ITAB.md)
- 호출(파서): GET_ADDRESS, FILL_TABLES
- 업무 키워드: 고객 주소, 품목 테이블, FI 합계, 4번째 라인
- English: Address, Material Line, FI Totals, Item Line 4
- 정의부(복사 시 함께 필요): [`MATZEIL4_ITAB`](#decl-zfir0141-367-matzeil4_itab), [`ALL_ITEMS_FI_ITAB`](#decl-zfir0141-299-all_items_fi_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L2669-L2692` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#REPRINT#C5`
#### [aggregation] 품목을 세금계산서별로 정렬해 4번째 이후 품목을 ALL_MAT_ITAB 에 COLLECT(FLAG='X')하여 '외' 요약 합계를 만들고 전체 품목을 ALL_ITEMS_ITAB 에 COLLECT 한 뒤 GET_TOTALS 로 FI 세금 합계와 대사하며 SD 전용 합계 ALL_ITEMS_SD_ITAB 을 만든다.
```abap
2697| CLEAR : ALL_MAT_ITAB[], AUSGLOP_MAT_ITAB, COUNT.
2698|
2699| SORT AUSGLOP_MAT_ITAB BY AUGBL YYYYMMDD MATNR ASCENDING.
2700|
2701| LOOP AT AUSGLOP_MAT_ITAB.
2702| IF AUSGLOP_MAT_ITAB NE SPACE.
2703| AT NEW AUGBL.
2704| COUNT = 0.
2705| ENDAT.
2706| COUNT = COUNT + 1.
2707| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO ALL_MAT_ITAB.
2708| * IF count le 4.
2709| * append all_items_itab.
2710| IF COUNT GE 4.
2711| COLLECT ALL_MAT_ITAB.
2712| ALL_MAT_ITAB-FLAG = 'X'.
2713| MODIFY ALL_MAT_ITAB INDEX SY-TABIX TRANSPORTING FLAG .
2714| * ELSE.
2715| * append all_mat_itab.
2716| ENDIF.
2717| ENDIF.
2718| ENDLOOP.
2719|
2720| LOOP AT AUSGLOP_MAT_ITAB.
2721| IF AUSGLOP_MAT_ITAB NE SPACE.
2722| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO ALL_ITEMS_ITAB.
2723| COLLECT ALL_ITEMS_ITAB.
2724| ENDIF.
2725| ENDLOOP.
2726|
2727|
2728| * checking if currency conversion to KRW has been successfully done:
2729| * the sum over all item values = document value
2730| * if not then add the difference to first item when printing the
2731| * tax invoice
2732| * GET TOTALS...
2733|
2734| PERFORM GET_TOTALS.
2735|
2736| * filling all_items_sd_itab with only sd-data : to print
2737| * in the first line the total amount from pure sd-data.
2738| * to be printed in case of fi + sd data and number of materials > 4.
2739|
2740| REFRESH ALL_ITEMS_SD_ITAB.
2741|
2742| LOOP AT AUSGLOP_MAT_ITAB.
2743| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO ALL_ITEMS_SD_ITAB.
2744| COLLECT ALL_ITEMS_SD_ITAB.
2745| ENDLOOP.
```
- **EN**: Aggregate materials from the fourth line onward into ALL_MAT_ITAB for the summary line, collect all items into ALL_ITEMS_ITAB, reconcile with FI totals via GET_TOTALS and build the SD-only totals table.
- 호출(파서): GET_TOTALS
- 업무 키워드: 품목 집계, 요약 라인, 합계 대사, SD 합계
- English: COLLECT, Summary Line, Reconciliation, Totals
- 정의부(복사 시 함께 필요): [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`ALL_MAT_ITAB`](#decl-zfir0141-278-all_mat_itab), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`COUNT`](#decl-zfir0141-124-count), [`AUGBL`](#decl-zfir0141-461-augbl), [`ALL_ITEMS_SD_ITAB`](#decl-zfir0141-286-all_items_sd_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2697-L2745` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#REPRINT#C6`
#### [control_flow] USER_EXIT3 로 고객사 가공을 거치고 사업장 주소 중복을 제거한 뒤 출력 옵션에 따라 리스트(LIST, PF-STATUS LIST2), 전체 리스트 인쇄(FULLLIST → LIST_OUTPUT), SAPscript 출력(SAP → SAP_SCRIPT)으로 분기한다.
```abap
2747| PERFORM USER_EXIT3.
2748|
2749| SORT BUPLA_ADRESSE BY BRANCH AUGBL.
2750|
2751| DELETE ADJACENT DUPLICATES FROM BUPLA_ADRESSE COMPARING BRANCH AUGBL
2752| STCD2 STCD1.
2753|
2754| * 출력옵션 체크 --------------------------------------------------------
2755| IF LIST = 'X'.
2756| SET PF-STATUS 'LIST2'.
2757| PERFORM USER_EXIT3.
2758|
2759| ELSEIF FULLLIST = 'X'.
2760| PERFORM LIST_OUTPUT.
2761|
2762| ELSEIF SAP = 'X'.
2763| PERFORM SAP_SCRIPT.
2764| ENDIF.
```
- **EN**: Apply the user exit, dedupe business place addresses and branch by output option to list display, full list printing (LIST_OUTPUT) or SAPscript printing (SAP_SCRIPT).
- 호출(파서): USER_EXIT3, USER_EXIT3, LIST_OUTPUT, SAP_SCRIPT
- 업무 키워드: 출력 옵션, 리스트, SAPscript, User Exit
- English: Output Option, List, SAPscript, User Exit
- 정의부(복사 시 함께 필요): [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`AUGBL`](#decl-zfir0141-461-augbl), [`LIST`](#decl-zfir0141-669-list), [`FULLLIST`](#decl-zfir0141-667-fulllist), [`SAP`](#decl-zfir0141-665-sap)
- 위치: `abap://ZFIR0141/ZFIR0141#L2747-L2764` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#REPRINT#C7`
### FORM FILL_CHECK_TABLE — `ZFIR0141` L1502-L1553 (52줄)
*출력 대상 전표마다 BKPF 로 원천 유형(AWTYP/AWKEY)을 확인하고 SD 빌링 원천이면 CHECK_ITAB 에 등록한 뒤 VBRK 의 빌링 유형·통화·환율 정보를 AUSGLOP_ITAB 에 채운다.*
> 이 unit 의 조각 2개가 38/52줄(73%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 회계전표 헤더 BKPF 를 읽어 다른 프로그램에서 호출된 경우 참조 트랜잭션 유형(AWTYP)·참조키(AWKEY)·현지통화(HWAER)를 AUSGLOP_ITAB 에 세팅한다.
```abap
1511| SELECT SINGLE * FROM BKPF WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1512| AND BELNR = AUSGLOP_ITAB-BELNR
1513| AND GJAHR = AUSGLOP_ITAB-GJAHR.
1514| IF SY-SUBRC = 0.
1515| IF PROG_NAME NE SY-CPROG.
1516| MOVE BKPF-AWTYP TO AUSGLOP_ITAB-AWTYP.
1517| MOVE BKPF-AWKEY TO AUSGLOP_ITAB-AWKEY.
1518| MOVE BKPF-HWAER TO AUSGLOP_ITAB-HWAER.
1519| ENDIF.
1520| ENDIF.
```
- **EN**: Read the accounting document header BKPF and, when called from another program, copy reference transaction type, reference key and local currency to AUSGLOP_ITAB.
- 테이블(파서): read [BKPF](/tables/BKPF.md) / write -
- SAP 객체: BKPF
- 업무 키워드: 회계전표 헤더, 참조 트랜잭션, 참조키, 현지통화
- English: Accounting Document Header, Reference Transaction, AWKEY, Local Currency
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0141-43-bkpf), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`PROG_NAME`](#decl-zfir0141-462-prog_name)
- 위치: `abap://ZFIR0141/ZFIR0141#L1511-L1520` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#FILL_CHECK_TABLE#C1`
#### [sql_select] 원천이 SD 빌링(VBRK)이면 CHECK_ITAB 에 회사코드·고객·세금계산서번호·사업자번호와 AWTYP_SD 를 등록하고 빌링 헤더 VBRK 에서 빌링번호·빌링유형·빌링일·통화·환율·환율유형(없으면 'M')·환율일을 AUSGLOP_ITAB 에 채운다.
```abap
1522| IF BKPF-AWTYP = 'VBRK'.
1523| MOVE BKPF-AWTYP TO CHECK_ITAB-AWTYP_SD.
1524| MOVE AUSGLOP_ITAB-BUKRS TO CHECK_ITAB-BUKRS.
1525| MOVE AUSGLOP_ITAB-KUNNR TO CHECK_ITAB-KUNNR.
1526| MOVE AUSGLOP_ITAB-AUGBL TO CHECK_ITAB-AUGBL.
1527| MOVE AUSGLOP_ITAB-STCD TO CHECK_ITAB-STCD.
1528| APPEND CHECK_ITAB.
1529|
1530| * getting sd-related data for the selected document from table VBRK
1531| SELECT SINGLE * FROM VBRK WHERE VBELN = BKPF-AWKEY.
1532|
1533| IF SY-SUBRC = 0.
1534| MOVE VBRK-VBELN TO AUSGLOP_ITAB-VBELN.
1535| MOVE VBRK-FKART TO AUSGLOP_ITAB-FKART.
1536| MOVE VBRK-FKDAT TO AUSGLOP_ITAB-FKDAT.
1537| MOVE VBRK-FKTYP TO AUSGLOP_ITAB-FKTYP.
1538| MOVE VBRK-WAERK TO AUSGLOP_ITAB-WAERK.
1539| MOVE VBRK-KURRF TO AUSGLOP_ITAB-KURRF.
1540| IF VBRK-KURST <> ' '.
1541| MOVE VBRK-KURST TO AUSGLOP_ITAB-KURST.
1542| ELSE.
1543| AUSGLOP_ITAB-KURST = 'M'.
1544| ENDIF.
1545| MOVE VBRK-KURRF_DAT TO AUSGLOP_ITAB-KURRF_DAT.
1546| ENDIF.
1547| * ENDSELECT.
1548| ENDIF.
1549| MODIFY AUSGLOP_ITAB.
```
- **EN**: For SD billing origin, register the row in CHECK_ITAB and read billing header VBRK to fill billing number, type, date, currency, exchange rate, rate type (default 'M') and rate date.
- 테이블(파서): read [VBRK](/tables/VBRK.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: VBRK
- 업무 키워드: SD 빌링, 빌링 헤더, 환율, 환율유형, 통화, 세금계산서 체크 테이블
- English: Billing Document, VBRK, Exchange Rate, Rate Type, Currency
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0141-43-bkpf), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`VBRK`](#decl-zfir0141-38-vbrk)
- 위치: `abap://ZFIR0141/ZFIR0141#L1522-L1549` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#FILL_CHECK_TABLE#C2`
### FORM GET_TAX_CODE — `ZFIR0141` L891-L919 (29줄)
*일회성 고객 전표의 BSEC 에서 사업자번호(STCD2 우선, 없으면 주민번호 STCD1)를 읽어 AUSGLOP_ITAB 과 CHECK_ITAB 의 STCD 에 세팅한다.*
> 이 unit 의 조각 1개가 18/29줄(62%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 전표의 일회성 고객 데이터 BSEC 를 읽어 STCD2(사업자번호) 가 있으면 그것을, 없으면 STCD1 을 세금 식별번호 STCD 로 AUSGLOP_ITAB 에 저장하고 동일 세금계산서의 CHECK_ITAB-STCD 에도 반영한다.
```abap
898| SELECT SINGLE * FROM BSEC WHERE BUKRS = AUSGLOP_ITAB-BUKRS
899| AND BELNR = AUSGLOP_ITAB-BELNR
900| AND GJAHR = AUSGLOP_ITAB-GJAHR.
901| IF SY-SUBRC = 0.
902| IF BSEC-STCD2 = ' '.
903| MOVE BSEC-STCD1 TO AUSGLOP_ITAB-STCD.
904| ELSE.
905| MOVE BSEC-STCD2 TO AUSGLOP_ITAB-STCD.
906| ENDIF.
907| MODIFY AUSGLOP_ITAB.
908| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
909| AND KUNNR = AUSGLOP_ITAB-KUNNR
910| AND AUGBL = AUSGLOP_ITAB-AUGBL.
911| MOVE AUSGLOP_ITAB-STCD TO CHECK_ITAB-STCD.
912| MODIFY CHECK_ITAB.
913| ENDLOOP.
914|
915| ENDIF.
```
- **EN**: Read one-time customer data BSEC and set the tax number (STCD2, else STCD1) as STCD on AUSGLOP_ITAB and the matching CHECK_ITAB rows.
- 테이블(파서): read [BSEC](/tables/BSEC.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md), [CHECK_ITAB](/tables/CHECK_ITAB.md)
- SAP 객체: BSEC
- 업무 키워드: 일회성 고객, 사업자등록번호, 주민등록번호, 세금 식별번호
- English: One-Time Customer, BSEC, Tax Number
- 정의부(복사 시 함께 필요): [`BSEC`](#decl-zfir0141-36-bsec), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L898-L915` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#GET_TAX_CODE#C1`
### FORM CHECK_G_L_INDICATOR — `ZFIR0141` L925-L956 (32줄)
*출력 대상 전표의 BSEG 에서 특별 G/L 지시자(UMSKZ)를 읽어 AUSGLOP_ITAB 과 CHECK_ITAB(SAVE_UMSKZ)에 저장한다.*
> 이 unit 의 조각 1개가 20/32줄(62%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 전표(BUKRS/BELNR/GJAHR)의 BSEG 라인 중 특별 G/L 지시자가 있는 항목을 SELECT 하여 AUSGLOP_ITAB-UMSKZ 에 넣고 같은 세금계산서의 CHECK_ITAB-SAVE_UMSKZ 에도 반영해 선수금 등 특별 G/L 거래를 식별한다.
```abap
932| SELECT UMSKZ
933| FROM BSEG
934| INTO UMSKZ
935| WHERE BUKRS = AUSGLOP_ITAB-BUKRS
936| AND BELNR = AUSGLOP_ITAB-BELNR
937| AND GJAHR = AUSGLOP_ITAB-GJAHR
938| AND UMSKZ <> ' '.
939|
940| IF SY-SUBRC = 0.
941| MOVE UMSKZ TO AUSGLOP_ITAB-UMSKZ.
942| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
943| AND KUNNR = AUSGLOP_ITAB-KUNNR
944| AND STCD = AUSGLOP_ITAB-STCD
945| AND AUGBL = AUSGLOP_ITAB-AUGBL.
946| MOVE BSEG-UMSKZ TO CHECK_ITAB-SAVE_UMSKZ.
947| MODIFY CHECK_ITAB.
948| ENDLOOP.
949| MODIFY AUSGLOP_ITAB.
950| ENDIF.
951| ENDSELECT.
```
- **EN**: Select non-blank special G/L indicators from BSEG for the document and store them in AUSGLOP_ITAB and CHECK_ITAB to identify special G/L transactions such as down payments.
- 테이블(파서): read [BSEG](/tables/BSEG.md) / write [CHECK_ITAB](/tables/CHECK_ITAB.md), [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSEG
- 업무 키워드: 특별 G/L 지시자, 선수금, 전표 라인, 세금계산서 체크
- English: Special G/L Indicator, Down Payment, BSEG
- 정의부(복사 시 함께 필요): [`UMSKZ`](#decl-zfir0141-125-umskz), [`BSEG`](#decl-zfir0141-35-bseg), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L932-L951` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#CHECK_G_L_INDICATOR#C1`
### FORM GET_BUPLA — `ZFIR0141` L1562-L1633 (72줄)
*세금계산서 발행 사업장(BUPLA)의 주소와 J_1BBRANCH 사업장 마스터(대표자·업태·업종)를 읽어 BUPLA_ADRESSE 에 세금계산서번호와 함께 추가한다.*
> 이 unit 의 조각 1개가 60/72줄(83%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] FM GET_BUPLA_ADDRESS 로 회사코드·사업장의 주소를 받아 BUPLA_ADRESSE 에 옮기고 J_1BBRANCH 에서 사업장 마스터(명칭·대표자 KR_REPRES·업태·업종·사업자번호)를 읽어 합친 뒤 발행일과 세금계산서번호(AUGBL)를 붙여 APPEND 한다.
```abap
1567| CALL FUNCTION 'GET_BUPLA_ADDRESS'
1568| EXPORTING
1569| BUKRS = SBUKRS
1570| BUPLA = AUSGLOP_ITAB-BUPLA
1571| IMPORTING
1572| ADRESSE = ADRESSE.
1573|
1574| MOVE-CORRESPONDING ADRESSE TO BUPLA_ADRESSE.
1575|
1576| SELECT SINGLE * FROM J_1BBRANCH WHERE BUKRS = SBUKRS
1577| AND BRANCH = AUSGLOP_ITAB-BUPLA.
1578| IF SY-SUBRC = 0.
1579|
1580| MOVE-CORRESPONDING J_1BBRANCH TO BUPLA_ADRESSE.
1581| ** clear BUPLA_adresse-name1
1582| * bupla_adress-name1 = '(주)보루네오가구'.
1583|
1584|
1585| * CLEAR BUPLA_ADRESSE-KR_REPRES.
1586|
1587| ** "세금계산서 처음출력시 대표자 출력조건 2004.11.27 수정
1588| * IF PROG_NAME = 'YFIR0601'.
1589| *
1590| * WA_ITAB2-BUDAT1 = AUSGLOP_ITAB-BUDAT .
1591| *
1592| * ELSE. "세금계산서 재인쇄시 로직
1593| *
1594| *
1595| * LOOP AT AUSGLOP_ITAB2 WHERE AUGBL = AUSGLOP_ITAB-AUGBL
1596| * AND CHECK = 'X' .
1597| * SY-TABIX = 1.
1598| * WA_ITAB2-BUDAT1 = AUSGLOP_ITAB2-BUDAT1.
1599| * EXIT.
1600| * ENDLOOP.
1601| * ENDIF.
1602| * read table ausglop_itab2 into wa_itab2 with key augbl =
1603| * ausglop_itab-augbl.
1604| * if sy-subrc = 0.
1605| * move wa_itab2-budat1 to ausglop_itab2-budat1.
1606| * endif.
1607|
1608| * bif용 주석처리
1609| * IF WA_ITAB2-BUDAT1 <= '20040417' .
1610| * BUPLA_ADRESSE-KR_REPRES = '임창빈'.
1611| * MOVE WA_ITAB2-BUDAT1 TO BUPLA_ADRESSE-BUDAT1.
1612| * MOVE AUSGLOP_ITAB-AUGBL TO BUPLA_ADRESSE-AUGBL.
1613| * ELSEIF WA_ITAB2-BUDAT1 >= '20040418' .
1614| * BUPLA_ADRESSE-KR_REPRES = '한순현'.
1615| * MOVE WA_ITAB2-BUDAT1 TO BUPLA_ADRESSE-BUDAT1.
1616| * MOVE AUSGLOP_ITAB-AUGBL TO BUPLA_ADRESSE-AUGBL.
1617| * ENDIF.
1618|
1619| MOVE WA_ITAB2-BUDAT1 TO BUPLA_ADRESSE-BUDAT1.
1620| MOVE AUSGLOP_ITAB-AUGBL TO BUPLA_ADRESSE-AUGBL.
1621|
1622| APPEND BUPLA_ADRESSE.
1623|
1624| CLEAR WA_ITAB2.
1625| BUPLA = J_1BBRANCH-BRANCH.
1626| ENDIF.
```
- **EN**: Get the business place address via FM GET_BUPLA_ADDRESS, merge business place master data from J_1BBRANCH (name, representative, business/industry type) and append to BUPLA_ADRESSE with the tax invoice number.
- 테이블(파서): read [J_1BBRANCH](/tables/J_1BBRANCH.md) / write -
- 호출(파서): GET_BUPLA_ADDRESS
- SAP 객체: GET_BUPLA_ADDRESS, J_1BBRANCH
- 업무 키워드: 사업장 주소, 사업장 마스터, 대표자, 업태, 업종, 공급자 정보
- English: Business Place, J_1BBRANCH, GET_BUPLA_ADDRESS, Supplier
- 정의부(복사 시 함께 필요): [`SBUKRS`](#decl-zfir0141-629-sbukrs), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ADRESSE`](#decl-zfir0141-99-adresse), [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`J_1BBRANCH`](#decl-zfir0141-47-j_1bbranch), [`AUSGLOP_ITAB2`](#decl-zfir0141-215-ausglop_itab2), [`WA_ITAB2`](#decl-zfir0141-234-wa_itab2), [`BUPLA`](#decl-zfir0141-126-bupla)
- 위치: `abap://ZFIR0141/ZFIR0141#L1567-L1626` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#GET_BUPLA#C1`
### FORM GET_ADDRESS — `ZFIR0141` L1642-L1661 (20줄)
*출력 대상 각 고객의 KNA1 을 조회해 일회성 고객 여부(XCPDK)에 따라 마스터 주소 또는 BSEC 일회성 주소를 ADDRESS_ITAB 에 채운다.*
> 이 unit 의 조각 1개가 15/20줄(75%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 선택된 AUSGLOP_ITAB 항목마다 고객 마스터 KNA1 을 SELECT SINGLE 하고 XCPDK 가 아니면 GET_ADDRESS_OF_CUSTOMER, 일회성 고객이면 GET_ADDRESS_OF_CPD_CUSTOMER 로 주소 정보를 수집한다.
```abap
1644| LOOP AT AUSGLOP_ITAB.
1645|
1646| IF PROG_NAME = ' '.
1647| CHECK AUSGLOP_ITAB-CHECK = 'X'.
1648| ENDIF.
1649| * IF ausglop_itab-filkd = ' '.
1650| SELECT SINGLE * FROM KNA1 WHERE KUNNR = AUSGLOP_ITAB-KUNNR.
1651|
1652|
1653| IF KNA1-XCPDK <> 'X'.
1654| PERFORM GET_ADDRESS_OF_CUSTOMER.
1655| ELSE.
1656| PERFORM GET_ADDRESS_OF_CPD_CUSTOMER.
1657| ENDIF.
1658| ENDLOOP.
```
- **EN**: For each selected row read KNA1 and collect the address via the customer master or one-time customer routine depending on XCPDK.
- 테이블(파서): read [KNA1](/tables/KNA1.md) / write -
- 호출(파서): GET_ADDRESS_OF_CUSTOMER, GET_ADDRESS_OF_CPD_CUSTOMER
- SAP 객체: KNA1
- 업무 키워드: 고객 마스터 조회, 일회성 고객, 주소 수집
- English: Customer Master, One-Time Customer, Address
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`KNA1`](#decl-zfir0141-41-kna1)
- 위치: `abap://ZFIR0141/ZFIR0141#L1644-L1658` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#GET_ADDRESS#C1`
### FORM GET_ADDRESS_OF_CUSTOMER — `ZFIR0141` L4060-L4085 (26줄)
*고객 마스터 KNA1 의 주소·사업자번호·업태·업종·대표자·주소번호를 ADDRESS_ITAB 에 고객당 1건 추가한다.*
> 이 unit 의 조각 1개가 22/26줄(85%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] KNA1 의 이름·우편번호·주소·도시·업태(J_1KFTBUS)·업종(J_1KFTIND)·대표자(J_1KFREPRE)·STCD1/STCD2·주소번호(ADRNR)를 ADDRESS_ITAB 에 옮기고 사업자번호(STCD2 우선, 없으면 STCD1)를 STCD 로 정한 뒤 동일 고객이 없을 때만 APPEND 한다.
```abap
4062| MOVE KNA1-KUNNR TO ADDRESS_ITAB-KUNNR.
4063| MOVE KNA1-NAME1 TO ADDRESS_ITAB-NAME.
4064| MOVE KNA1-PSTLZ TO ADDRESS_ITAB-PSTLZ.
4065| MOVE KNA1-STRAS TO ADDRESS_ITAB-STRAS.
4066| MOVE KNA1-ORT01 TO ADDRESS_ITAB-ORT01.
4067| MOVE KNA1-ORT02 TO ADDRESS_ITAB-ORT02.
4068| MOVE KNA1-J_1KFTBUS TO ADDRESS_ITAB-BUSTYP.
4069| MOVE KNA1-J_1KFTIND TO ADDRESS_ITAB-INDTYP.
4070| MOVE KNA1-J_1KFREPRE TO ADDRESS_ITAB-REPRE.
4071| MOVE KNA1-STCD1 TO ADDRESS_ITAB-STCD1.
4072| MOVE KNA1-STCD2 TO ADDRESS_ITAB-STCD2.
4073| MOVE KNA1-ADRNR TO ADDRESS_ITAB-ADRNR. " smartbill 2006.07.24
4074| IF KNA1-STCD2 = ' '.
4075| MOVE KNA1-STCD1 TO ADDRESS_ITAB-STCD.
4076| ELSE.
4077| MOVE KNA1-STCD2 TO ADDRESS_ITAB-STCD.
4078| ENDIF.
4079| READ TABLE ADDRESS_ITAB WITH KEY KUNNR = KNA1-KUNNR.
4080| IF SY-SUBRC <> 0.
4081| * AT NEW kunnr.
4082| APPEND ADDRESS_ITAB.
4083| ENDIF.
```
- **EN**: Copy customer master address, Korean tax fields (business type, industry type, representative), tax numbers and address number from KNA1 into ADDRESS_ITAB once per customer.
- SAP 객체: KNA1
- 업무 키워드: 고객 마스터, 주소, 사업자등록번호, 업태, 업종, 대표자
- English: Customer Master, KNA1, Tax Number, Address
- 정의부(복사 시 함께 필요): [`KNA1`](#decl-zfir0141-41-kna1), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L4062-L4083` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#GET_ADDRESS_OF_CUSTOMER#C1`
### FORM GET_ADDRESS_OF_CPD_CUSTOMER — `ZFIR0141` L4095-L4136 (42줄)
*일회성 고객(CPD)의 주소·사업자번호·업태·업종·대표자를 전표의 일회성 고객 데이터 BSEC 에서 읽어 ADDRESS_ITAB 에 추가하고 AUSGLOP_ITAB/CHECK_ITAB 의 STCD·XCPDK 를 갱신한다.*
> 이 unit 의 조각 1개가 35/42줄(83%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 전표(BUKRS/BELNR/GJAHR)의 일회성 고객 데이터 BSEC 를 읽어 이름·도시·우편번호·주소·STCD1/STCD2·업태(J_1KFTBUS)·업종(J_1KFTIND)·대표자(J_1KFREPRE)를 ADDRESS_ITAB 에 APPEND 하고, 사업자번호(STCD2 우선, 없으면 STCD1)를 AUSGLOP_ITAB 과 CHECK_ITAB 의 STCD 에 반영하며 XCPDK='X' 로 일회성 고객임을 표시한다.
```abap
4100| SELECT * FROM BSEC WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4101| AND BELNR = AUSGLOP_ITAB-BELNR
4102| AND GJAHR = AUSGLOP_ITAB-GJAHR.
4103| IF SY-SUBRC = 0.
4104| MOVE AUSGLOP_ITAB-BUKRS TO ADDRESS_ITAB-BUKRS.
4105| MOVE AUSGLOP_ITAB-KUNNR TO ADDRESS_ITAB-KUNNR.
4106| MOVE BSEC-NAME1 TO ADDRESS_ITAB-NAME.
4107| MOVE BSEC-ORT01 TO ADDRESS_ITAB-ORT01.
4108| MOVE BSEC-PSTLZ TO ADDRESS_ITAB-PSTLZ.
4109| MOVE BSEC-STRAS TO ADDRESS_ITAB-STRAS.
4110| MOVE BSEC-STCD1 TO ADDRESS_ITAB-STCD1.
4111| MOVE BSEC-STCD2 TO ADDRESS_ITAB-STCD2.
4112| IF BSEC-STCD2 = ' '.
4113| MOVE BSEC-STCD1 TO AUSGLOP_ITAB-STCD.
4114| ELSE.
4115| MOVE BSEC-STCD2 TO AUSGLOP_ITAB-STCD.
4116| ENDIF.
4117|
4118| MOVE AUSGLOP_ITAB-STCD TO ADDRESS_ITAB-STCD.
4119|
4120| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4121| AND KUNNR = AUSGLOP_ITAB-KUNNR
4122| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4123| MOVE AUSGLOP_ITAB-STCD TO CHECK_ITAB-STCD.
4124| AUSGLOP_ITAB-XCPDK = 'X'.
4125| MODIFY CHECK_ITAB.
4126| ENDLOOP.
4127|
4128| MOVE BSEC-J_1KFTBUS TO ADDRESS_ITAB-BUSTYP.
4129| MOVE BSEC-J_1KFTIND TO ADDRESS_ITAB-INDTYP.
4130| MOVE BSEC-J_1KFREPRE TO ADDRESS_ITAB-REPRE.
4131| APPEND ADDRESS_ITAB.
4132| MODIFY AUSGLOP_ITAB.
4133| ENDIF.
4134| ENDSELECT.
```
- **EN**: Read one-time customer data from BSEC for the document, append address, tax numbers, business/industry type and representative to ADDRESS_ITAB, and set STCD and XCPDK on AUSGLOP_ITAB and CHECK_ITAB.
- 테이블(파서): read [BSEC](/tables/BSEC.md) / write [CHECK_ITAB](/tables/CHECK_ITAB.md), [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSEC
- 업무 키워드: 일회성 고객, 주소, 사업자등록번호, 업태, 업종, 대표자
- English: One-Time Customer, BSEC, Tax Number, Address
- 정의부(복사 시 함께 필요): [`BSEC`](#decl-zfir0141-36-bsec), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L4100-L4134` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#GET_ADDRESS_OF_CPD_CUSTOMER#C1`
### FORM FILL_TABLES — `ZFIR0141` L1670-L1871 (202줄)
*출력 대상 세금계산서의 품목 테이블(AUSGLOP_MAT_ITAB)·항목 합계(ALL_ITEMS_ITAB/ALL_ITEMS_FI_ITAB)·특별G/L 라인 정보(CHECK_ITAB, MATZEIL4_ITAB)를 SD 빌링(VBRP)과 FI 전표로부터 채운다.*
> 이 unit 의 조각 5개가 180/202줄(89%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] FI 전표(BKPF) 원천 항목에 대해 CHECK_TEXT 를 호출해 전표 텍스트에서 자재·단위·수량을 파싱하여 SD 유형 품목으로 변환한다.
```abap
1675| LOOP AT AUSGLOP_ITAB WHERE AWTYP = 'BKPF'.
1676| IF PROG_NAME = ' '.
1677| CHECK AUSGLOP_ITAB-CHECK = 'X'.
1678| ENDIF.
1679| PERFORM CHECK_TEXT.
1680| ENDLOOP.
```
- **EN**: For FI-originated rows, call CHECK_TEXT to parse material/unit/quantity from the line item text.
- 호출(파서): CHECK_TEXT
- SAP 객체: BKPF
- 업무 키워드: FI 전표, 전표 텍스트 파싱, 품목 변환
- English: FI Document, Line Item Text, Material
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`PROG_NAME`](#decl-zfir0141-462-prog_name)
- 위치: `abap://ZFIR0141/ZFIR0141#L1675-L1680` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#FILL_TABLES#C1`
#### [sql_select] SD 빌링(VBRK) 항목은 빌링 품목 VBRP 를 수량 0 제외로 읽어 자재·품목텍스트·단위·수량을 옮기고 특소세(KZWI2) 보정, 대변(FAREG 4/5) 부호 반전, CONVERT_TO_LOCAL_CURRENCY 현지통화 환산, 반품(SHKZG='S') 부호 반전 후 AUSGLOP_MAT_ITAB 에 COLLECT 하고 IT_VBRP 에 전기일·세금계산서번호와 함께 보관하며 품목 수 LINE_COUNT 를 센다.
```abap
1688| IF AUSGLOP_ITAB-AWTYP = 'VBRK' AND AUSGLOP_ITAB-FLAG = ' '.
1689| MOVE-CORRESPONDING AUSGLOP_ITAB TO AUSGLOP_MAT_ITAB.
1690|
1691| SELECT * FROM VBRP WHERE VBELN = AUSGLOP_ITAB-VBELN
1692| AND FKIMG <> '0'.
1693| CLEAR AUSGLOP_MAT_ITAB-FKIMG.
1694|
1695| MOVE VBRP-MATNR TO AUSGLOP_MAT_ITAB-MATNR.
1696| * Material description
1697| MOVE VBRP-ARKTX TO AUSGLOP_MAT_ITAB-ARKTX.
1698| * MOVE vbrp-fkimg TO ausglop_mat_itab-fkimg.
1699| MOVE VBRP-VRKME TO AUSGLOP_MAT_ITAB-VRKME.
1700| * 특소세가 있을 경우 20060424 sms
1701| IF NOT VBRP-KZWI2 IS INITIAL.
1702| VBRP-NETWR = VBRP-NETWR + VBRP-KZWI2. "정가+
1703| VBRP-MWSBP = VBRP-MWSBP - VBRP-KZWI2. "세액-
1704| ENDIF.
1705| * 특소세가 있을 경우
1706|
1707| IF VBRP-FAREG = 4 OR VBRP-FAREG = 5.
1708| VBRP-NETWR = VBRP-NETWR * -1.
1709| VBRP-MWSBP = VBRP-MWSBP * -1.
1710| ELSE.
1711| MOVE VBRP-FKIMG TO AUSGLOP_MAT_ITAB-FKIMG.
1712| ENDIF.
1713|
1714| MOVE VBRP-NETWR TO AUSGLOP_MAT_ITAB-NETWR.
1715| MOVE VBRP-MWSBP TO AUSGLOP_MAT_ITAB-MWSBP.
1716| * 정가, 세액의 통화단위 변환
1717| PERFORM CONVERT_TO_LOCAL_CURRENCY.
1718|
1719| MOVE AUSGLOP_MAT_ITAB-NETWR TO AUSGLOP_MAT_ITAB-HWBAS.
1720| MOVE AUSGLOP_MAT_ITAB-MWSBP TO AUSGLOP_MAT_ITAB-MWSBP.
1721|
1722| * in case of a material return
1723| IF AUSGLOP_ITAB-SHKZG = 'S'.
1724| AUSGLOP_MAT_ITAB-NETWR = ( -1 ) * AUSGLOP_MAT_ITAB-NETWR.
1725| AUSGLOP_MAT_ITAB-MWSBP = ( -1 ) * AUSGLOP_MAT_ITAB-MWSBP.
1726| AUSGLOP_MAT_ITAB-FKIMG = ( -1 ) * AUSGLOP_MAT_ITAB-FKIMG.
1727| ENDIF.
1728| COLLECT AUSGLOP_MAT_ITAB.
1729| ENDSELECT.
1730|
1731| SORT AUSGLOP_MAT_ITAB BY AUGBL YYYYMMDD MATNR ASCENDING.
1732|
1733| SELECT * FROM VBRP WHERE VBELN = AUSGLOP_ITAB-VBELN
1734| AND FKIMG <> '0'.
1735| MOVE-CORRESPONDING VBRP TO IT_VBRP.
1736| MOVE AUSGLOP_ITAB-BUDAT TO IT_VBRP-BUDAT.
1737| MOVE AUSGLOP_ITAB-AUGBL TO IT_VBRP-AUGBL.
1738| APPEND IT_VBRP.
1739| ENDSELECT.
1740|
1741| * number of item lines in ausglop_mat_itab --> number of sold materials
1742| LINE_COUNT = 0.
1743| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1744| AND KUNNR = AUSGLOP_ITAB-KUNNR
1745| AND STCD = AUSGLOP_ITAB-STCD
1746| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1747| LINE_COUNT = LINE_COUNT + 1.
1748| ENDLOOP.
```
- **EN**: For SD billing rows, read billing items VBRP, adjust for special consumption tax (KZWI2), reverse sign for credit memos (FAREG 4/5) and returns (SHKZG='S'), convert to local currency and COLLECT into AUSGLOP_MAT_ITAB; keep VBRP rows with posting date and count material lines.
- 테이블(파서): read [VBRP](/tables/VBRP.md) / write -
- 호출(파서): CONVERT_TO_LOCAL_CURRENCY
- SAP 객체: VBRP, CONVERT_TO_LOCAL_CURRENCY
- 업무 키워드: 빌링 품목, 특소세, 대변 메모, 반품, 현지통화 환산, 품목 집계
- English: Billing Item, VBRP, Credit Memo, Returns, Currency Conversion, COLLECT
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`VBRP`](#decl-zfir0141-39-vbrp), [`AUGBL`](#decl-zfir0141-461-augbl), [`IT_VBRP`](#decl-zfir0141-490-it_vbrp), [`LINE_COUNT`](#decl-zfir0141-93-line_count)
- 위치: `abap://ZFIR0141/ZFIR0141#L1688-L1748` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#FILL_TABLES#C2`
#### [aggregation] FI 전표(BKPF) 항목은 현지통화 공급가액(HWBAS)·세액(HWSTE)을 NETWR/MWSBP 로 하여 전표번호 단위로 ALL_ITEMS_ITAB 과 ALL_ITEMS_FI_ITAB 에 COLLECT 하여 세금계산서별 FI 합계를 만든다.
```abap
1751| ELSEIF AUSGLOP_ITAB-AWTYP = 'BKPF'.
1752| MOVE-CORRESPONDING AUSGLOP_ITAB TO ALL_ITEMS_ITAB.
1753| MOVE AUSGLOP_ITAB-HWBAS TO ALL_ITEMS_ITAB-NETWR.
1754| MOVE AUSGLOP_ITAB-HWSTE TO ALL_ITEMS_ITAB-MWSBP.
1755|
1756| AT NEW BELNR.
1757| COLLECT ALL_ITEMS_ITAB.
1758| ENDAT.
1759| ENDIF.
1760|
1761| * if cleared documents are sd-documents and fi-documents or pure FI-data
1762| * sum over tax amount and base amount
1763|
1764| IF AUSGLOP_ITAB-AWTYP = 'BKPF'.
1765| MOVE AUSGLOP_ITAB-BUKRS TO ALL_ITEMS_FI_ITAB-BUKRS.
1766| MOVE AUSGLOP_ITAB-KUNNR TO ALL_ITEMS_FI_ITAB-KUNNR.
1767| MOVE AUSGLOP_ITAB-STCD TO ALL_ITEMS_FI_ITAB-STCD.
1768| MOVE AUSGLOP_ITAB-AUGBL TO ALL_ITEMS_FI_ITAB-AUGBL.
1769| MOVE ALL_ITEMS_ITAB-HWBAS TO ALL_ITEMS_FI_ITAB-NETWR.
1770| MOVE ALL_ITEMS_ITAB-HWSTE TO ALL_ITEMS_FI_ITAB-MWSBP.
1771| AT NEW BELNR.
1772| COLLECT ALL_ITEMS_FI_ITAB.
1773| ENDAT.
1774| ENDIF.
```
- **EN**: For FI documents, COLLECT tax base and tax amount per document into ALL_ITEMS_ITAB and ALL_ITEMS_FI_ITAB as tax invoice totals.
- SAP 객체: BKPF
- 업무 키워드: FI 합계, 공급가액, 세액, 전표 집계
- English: FI Document, Tax Base, Tax Amount, COLLECT
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`ALL_ITEMS_FI_ITAB`](#decl-zfir0141-299-all_items_fi_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L1751-L1774` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#FILL_TABLES#C3`
#### [sql_select] 세금계산서 번호가 바뀔 때 CHECK_ITAB 별로 저장된 특별 G/L 지시자(SAVE_UMSKZ)와 다른 FI 라인 수 LINE_COUNT2 를 세고, FI 원천이면 4번째 라인용 MATZEIL4_ITAB 을 만들되 특별 G/L 이 하나면 T074T 의 지시자 텍스트(LTEXT)를, 아니면 TEXT-030 을 품목명으로 넣는다.
```abap
1777| AT NEW AUGBL.
1778| IF AUSGLOP_ITAB-AUGBL NE AUGBL.
1779| CLEAR CHECK_ITAB.
1780| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1781| AND KUNNR = AUSGLOP_ITAB-KUNNR
1782| AND STCD = AUSGLOP_ITAB-STCD
1783| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1784|
1785| CHECK_ITAB-LINE_COUNT2 = 0.
1786|
1787| LOOP AT AUSGLOP_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1788| AND KUNNR = AUSGLOP_ITAB-KUNNR
1789| AND STCD = AUSGLOP_ITAB-STCD
1790| AND AUGBL = AUSGLOP_ITAB-AUGBL
1791| AND UMSKZ <> CHECK_ITAB-SAVE_UMSKZ
1792| AND AWTYP = 'BKPF'.
1793|
1794| CHECK_ITAB-LINE_COUNT2 = CHECK_ITAB-LINE_COUNT2 + 1.
1795| ENDLOOP.
1796| MODIFY CHECK_ITAB.
1797| ENDLOOP.
1798|
1799| * Filling matzeil4_itab for printing the fourth line
1800| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1801| AND KUNNR = AUSGLOP_ITAB-KUNNR
1802| AND STCD = AUSGLOP_ITAB-STCD
1803| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1804|
1805| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
1806| MOVE AUSGLOP_ITAB-BUKRS TO MATZEIL4_ITAB-BUKRS.
1807| MOVE AUSGLOP_ITAB-KUNNR TO MATZEIL4_ITAB-KUNNR.
1808| MOVE AUSGLOP_ITAB-STCD TO MATZEIL4_ITAB-STCD.
1809| MOVE AUSGLOP_ITAB-AUGBL TO MATZEIL4_ITAB-AUGBL.
1810|
1811| * check if a special g_l indicator exists.
1812| IF CHECK_ITAB-SAVE_UMSKZ <> ' '.
1813| * if exactly one special g_l indicator
1814| IF CHECK_ITAB-LINE_COUNT2 = 0.
1815| SELECT SINGLE * FROM T074T WHERE SPRAS = T001-SPRAS
1816| * AND koart = bseg-koart
1817| AND KOART = 'D'
1818| AND SHBKZ = CHECK_ITAB-SAVE_UMSKZ.
1819| MOVE T074T-LTEXT TO MATZEIL4_ITAB-MATNR.
1820| * if more than one special g_l indicator
1821| ELSE.
1822| MOVE TEXT-030 TO MATZEIL4_ITAB-MATNR.
1823| ENDIF.
1824| ELSE.
1825| MOVE TEXT-030 TO MATZEIL4_ITAB-MATNR.
1826| ENDIF.
1827| *proposed design...
1828| READ TABLE MATZEIL4_ITAB WITH KEY BUKRS = CHECK_ITAB-BUKRS
1829| KUNNR = CHECK_ITAB-KUNNR
1830| AUGBL = CHECK_ITAB-AUGBL.
1831| IF SY-SUBRC NE 0.
1832| APPEND MATZEIL4_ITAB.
1833| ENDIF.
1834| *end of proposed design.
1835| ENDIF.
1836| ENDLOOP.
1837| ENDIF.
1838| ENDAT.
```
- **EN**: At each new tax invoice, count FI lines with a different special G/L indicator and build MATZEIL4_ITAB for the fourth line using the T074T special G/L text or TEXT-030.
- 테이블(파서): read [T074T](/tables/T074T.md) / write [CHECK_ITAB](/tables/CHECK_ITAB.md)
- SAP 객체: T074T, T001
- 업무 키워드: 특별 G/L 지시자, 4번째 라인, 지시자 텍스트, 라인 수
- English: Special G/L Indicator, T074T, Item Line 4
- 정의부(복사 시 함께 필요): [`AUGBL`](#decl-zfir0141-461-augbl), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`UMSKZ`](#decl-zfir0141-125-umskz), [`MATZEIL4_ITAB`](#decl-zfir0141-367-matzeil4_itab), [`T074T`](#decl-zfir0141-50-t074t), [`T001`](#decl-zfir0141-40-t001)
- 위치: `abap://ZFIR0141/ZFIR0141#L1777-L1838` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#FILL_TABLES#C4`
#### [calculation] IT_VBRP 를 자재·전기일로 정렬하고 각 품목(AUSGLOP_MAT_ITAB)에 동일 자재·세금계산서번호의 전기일을 YYYYMMDD 로 세팅한 뒤 세금계산서번호·일자·자재 순으로 정렬한다.
```abap
1842| SORT IT_VBRP BY MATNR BUDAT.
1843| DATA : L_MATNR LIKE VBRP-MATNR. CLEAR L_MATNR.
1844| * LOOP AT it_vbrp.
1845| * IF it_vbrp-matnr = l_matnr.
1846| * DELETE it_vbrp.
1847| * ENDIF.
1848| * MOVE it_vbrp-matnr TO l_matnr.
1849| * ENDLOOP.
1850|
1851|
1852|
1853| LOOP AT AUSGLOP_MAT_ITAB.
1854|
1855| READ TABLE IT_VBRP WITH KEY MATNR = AUSGLOP_MAT_ITAB-MATNR
1856| AUGBL = AUSGLOP_MAT_ITAB-AUGBL.
1857| IF SY-SUBRC EQ 0.
1858|
1859| MOVE IT_VBRP-BUDAT TO AUSGLOP_MAT_ITAB-YYYYMMDD.
1860|
1861| ENDIF.
1862| MODIFY AUSGLOP_MAT_ITAB.
1863| CLEAR AUSGLOP_MAT_ITAB.
1864| ENDLOOP.
1865|
1866|
1867| * SORT ausglop_mat_itab BY augbl yyyymmdd matnr ASCENDING.
1868| SORT AUSGLOP_MAT_ITAB BY AUGBL YYYYMMDD MATNR ASCENDING.
```
- **EN**: Assign the posting date of the matching VBRP row to each material line as YYYYMMDD and sort AUSGLOP_MAT_ITAB by invoice number, date and material.
- 테이블(파서): read - / write [AUSGLOP_MAT_ITAB](/tables/AUSGLOP_MAT_ITAB.md)
- 업무 키워드: 전기일 매핑, 품목 정렬, 세금계산서 품목
- English: Posting Date, Sort, Material Line
- 정의부(복사 시 함께 필요): [`IT_VBRP`](#decl-zfir0141-490-it_vbrp), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L1842-L1868` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#FILL_TABLES#C5`
### FORM CHECK_TEXT — `ZFIR0141` L2269-L2357 (89줄)
*FI 전표의 항목 텍스트(BSEG-SGTXT)를 '자재,단위,수량' 형식으로 파싱하여 SD 빌링처럼 취급할 품목 정보를 AUSGLOP_MAT_ITAB 에 만들고 원천 유형을 VBRK 로 표시한다.*
> 이 unit 의 조각 2개가 79/89줄(89%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [sql_select] 전표(BUKRS/BELNR/GJAHR)의 비어 있지 않은 항목 텍스트 SGTXT 를 BSEG 에서 읽고 FM STRING_SPLIT 을 ',' 구분자로 3번 호출해 자재(MATERIAL)·단위(UNIT)·수량(QTY)을 분리한다.
```abap
2275| SELECT SINGLE SGTXT INTO SGTXT FROM BSEG
2276| WHERE
2277| BUKRS = AUSGLOP_ITAB-BUKRS
2278| AND BELNR = AUSGLOP_ITAB-BELNR
2279| AND GJAHR = AUSGLOP_ITAB-GJAHR
2280| AND SGTXT NE ' '.
2281|
2282|
2283| WRITE SGTXT LEFT-JUSTIFIED TO SGTXT.
2284| CALL FUNCTION 'STRING_SPLIT'
2285| EXPORTING
2286| DELIMITER = ','
2287| STRING = SGTXT
2288| IMPORTING
2289| HEAD = MATERIAL
2290| TAIL = BAL_TEXT
2291| EXCEPTIONS
2292| NOT_FOUND = 1
2293| NOT_VALID = 2
2294| TOO_LONG = 3
2295| TOO_SMALL = 4.
2296| IF SY-SUBRC = 0.
2297| WRITE BAL_TEXT LEFT-JUSTIFIED TO BAL_TEXT.
2298| CALL FUNCTION 'STRING_SPLIT'
2299| EXPORTING
2300| DELIMITER = ','
2301| STRING = BAL_TEXT
2302| IMPORTING
2303| HEAD = UNIT
2304| TAIL = BAL_TEXT
2305| EXCEPTIONS
2306| NOT_FOUND = 1
2307| NOT_VALID = 2
2308| TOO_LONG = 3
2309| TOO_SMALL = 4.
2310|
2311| IF SY-SUBRC = 0.
2312| * write bal_text left-justified to bal_text.
2313| CALL FUNCTION 'STRING_SPLIT'
2314| EXPORTING
2315| DELIMITER = ','
2316| STRING = BAL_TEXT
2317| IMPORTING
2318| HEAD = QTY
2319| TAIL = BAL_TEXT
2320| EXCEPTIONS
2321| NOT_FOUND = 1
2322| NOT_VALID = 2
2323| TOO_LONG = 3
2324| TOO_SMALL = 4.
2325|
```
- **EN**: Read the non-empty line item text SGTXT from BSEG and split it by comma with FM STRING_SPLIT into material, unit and quantity.
- 테이블(파서): read [BSEG](/tables/BSEG.md) / write -
- 호출(파서): STRING_SPLIT, STRING_SPLIT, STRING_SPLIT
- SAP 객체: BSEG, STRING_SPLIT
- 업무 키워드: 전표 항목 텍스트, 자재, 단위, 수량, 문자열 분리
- English: Line Item Text, BSEG, STRING_SPLIT, Material, Quantity
- 정의부(복사 시 함께 필요): [`SGTXT`](#decl-zfir0141-127-sgtxt), [`BSEG`](#decl-zfir0141-35-bseg), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`MATERIAL`](#decl-zfir0141-2270-material), [`BAL_TEXT`](#decl-zfir0141-128-bal_text), [`UNIT`](#decl-zfir0141-2271-unit), [`QTY`](#decl-zfir0141-2272-qty)
- 위치: `abap://ZFIR0141/ZFIR0141#L2275-L2325` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#CHECK_TEXT#C1`
#### [calculation] 파싱에 성공하면 해당 항목을 SD 빌링(AWTYP='VBRK', FLAG='X')으로 표시하고 자재·단위·수량(소수 3자리 보정 ×1000)·공급가액(HWBAS)·세액(HWSTE)을 AUSGLOP_MAT_ITAB 에 COLLECT 하며 CHECK_ITAB 의 AWTYP_SD 를 VBRK 로 갱신한다.
```abap
2326| IF SY-SUBRC = 0.
2327|
2328| WRITE BAL_TEXT LEFT-JUSTIFIED TO BAL_TEXT.
2329| * ausglop_itab-matnr = material.
2330| * ausglop_itab-vrkme = unit.
2331| * ausglop_itab-fkmig = qty.
2332| AUSGLOP_ITAB-AWTYP = 'VBRK'.
2333| AUSGLOP_ITAB-FLAG = 'X'.
2334| MODIFY AUSGLOP_ITAB.
2335| MOVE-CORRESPONDING AUSGLOP_ITAB TO AUSGLOP_MAT_ITAB.
2336| AUSGLOP_MAT_ITAB-MATNR = MATERIAL.
2337| AUSGLOP_MAT_ITAB-VRKME = UNIT.
2338| *offset 3 decimal places in domain of fkimg...
2339| QTY = QTY * 1000.
2340| AUSGLOP_MAT_ITAB-FKIMG = QTY.
2341| AUSGLOP_MAT_ITAB-NETWR = AUSGLOP_MAT_ITAB-HWBAS.
2342| AUSGLOP_MAT_ITAB-MWSBP = AUSGLOP_MAT_ITAB-HWSTE.
2343| COLLECT AUSGLOP_MAT_ITAB.
2344| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
2345| AND KUNNR = AUSGLOP_ITAB-KUNNR
2346| AND STCD = AUSGLOP_ITAB-STCD
2347| AND AUGBL = AUSGLOP_ITAB-AUGBL.
2348|
2349| * check_itab-awtyp_fi = ' ' .
2350| CHECK_ITAB-AWTYP_SD = 'VBRK'.
2351| MODIFY CHECK_ITAB.
2352| ENDLOOP.
2353| ENDIF.
```
- **EN**: On successful parsing, flag the row as SD-type (VBRK), collect material, unit, quantity (scaled by 1000), tax base and tax into AUSGLOP_MAT_ITAB and set AWTYP_SD='VBRK' in CHECK_ITAB.
- 테이블(파서): read - / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md), [CHECK_ITAB](/tables/CHECK_ITAB.md)
- SAP 객체: VBRK
- 업무 키워드: 품목 정보 생성, SD 빌링 취급, 수량 보정, 공급가액, 세액
- English: Material Line, Billing Type, Quantity, COLLECT
- 정의부(복사 시 함께 필요): [`BAL_TEXT`](#decl-zfir0141-128-bal_text), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`MATERIAL`](#decl-zfir0141-2270-material), [`UNIT`](#decl-zfir0141-2271-unit), [`QTY`](#decl-zfir0141-2272-qty), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L2326-L2353` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#CHECK_TEXT#C2`
### FORM CONVERT_TO_LOCAL_CURRENCY — `ZFIR0141` L4557-L4603 (47줄)
*SD 품목의 외화 공급가액·세액을 전표의 환율 정보로 현지통화(KRW)로 환산한다.*
> 이 unit 의 조각 1개가 43/47줄(92%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] 판매 통화(WAERK)의 품목 공급가액(NETWR)과 세액(MWSBP)을 환율일(KURRF_DAT)·환율(KURRF)·환율유형(KURST) 기준으로 FM CONVERT_TO_LOCAL_CURRENCY 로 현지통화(HWAER)로 환산하고 실패 시 E013 오류를 낸다.
```abap
4559| CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
4560| EXPORTING
4561| CLIENT = SY-MANDT
4562| DATE = AUSGLOP_ITAB-KURRF_DAT
4563| FOREIGN_AMOUNT = AUSGLOP_MAT_ITAB-NETWR
4564| FOREIGN_CURRENCY = AUSGLOP_ITAB-WAERK
4565| LOCAL_CURRENCY = AUSGLOP_ITAB-HWAER
4566| RATE = AUSGLOP_ITAB-KURRF
4567| TYPE_OF_RATE = AUSGLOP_ITAB-KURST
4568| IMPORTING
4569| LOCAL_AMOUNT = AUSGLOP_MAT_ITAB-NETWR
4570| EXCEPTIONS
4571| NO_RATE_FOUND = 1
4572| OVERFLOW = 2
4573| NO_FACTORS_FOUND = 3
4574| NO_SPREAD_FOUND = 4
4575| DERIVED_2_TIMES = 5
4576| OTHERS = 6.
4577| IF SY-SUBRC <> 0.
4578| MESSAGE E013.
4579| ENDIF.
4580|
4581| CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
4582| EXPORTING
4583| CLIENT = SY-MANDT
4584| DATE = AUSGLOP_ITAB-KURRF_DAT
4585| FOREIGN_AMOUNT = AUSGLOP_MAT_ITAB-MWSBP
4586| FOREIGN_CURRENCY = AUSGLOP_ITAB-WAERK
4587| LOCAL_CURRENCY = AUSGLOP_ITAB-HWAER
4588| RATE = AUSGLOP_ITAB-KURRF
4589| TYPE_OF_RATE = AUSGLOP_ITAB-KURST
4590| IMPORTING
4591| LOCAL_AMOUNT = AUSGLOP_MAT_ITAB-MWSBP
4592| EXCEPTIONS
4593| NO_RATE_FOUND = 1
4594| OVERFLOW = 2
4595| NO_FACTORS_FOUND = 3
4596| NO_SPREAD_FOUND = 4
4597| DERIVED_2_TIMES = 5
4598| OTHERS = 6.
4599| IF SY-SUBRC <> 0.
4600| MESSAGE E013.
4601| ENDIF.
```
- **EN**: Convert the item net value and tax amount from the sales currency to the local currency with FM CONVERT_TO_LOCAL_CURRENCY using the document exchange rate, date and rate type; raise error E013 on failure.
- 호출(파서): CONVERT_TO_LOCAL_CURRENCY, CONVERT_TO_LOCAL_CURRENCY
- SAP 객체: CONVERT_TO_LOCAL_CURRENCY
- 업무 키워드: 환율 환산, 현지통화, 외화, 공급가액, 세액
- English: Currency Conversion, Local Currency, Exchange Rate, Rate Type
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L4559-L4601` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#CONVERT_TO_LOCAL_CURRENCY#C1`
### FORM GET_TOTALS — `ZFIR0141` L1880-L1916 (37줄)
*세금계산서별 FI 세금 합계(HWBAS/HWSTE)와 SD 품목 합계(NETWR/MWSBP)를 비교하여 차이(DELTAN/DELTAM)를 기록하고 SD 합계를 FI 세금 합계로 맞춘다.*
> 이 unit 의 조각 1개가 32/37줄(86%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [aggregation] 세금계산서(BUKRS/KUNNR/STCD/AUGBL)별로 선택된 AUSGLOP_ITAB 의 공급가액·세액을 SUM_TAXES 에 COLLECT 하고, SD 품목 합계(NETWR+MWSBP)와 다르면 차액을 DELTAN/DELTAM 에 저장한 뒤 ALL_ITEMS_ITAB 의 NETWR/MWSBP 를 FI 세금 합계로 대체하여 환산 오차를 보정한다.
```abap
1882| LOOP AT ALL_ITEMS_ITAB.
1883| LOOP AT AUSGLOP_ITAB WHERE BUKRS = ALL_ITEMS_ITAB-BUKRS
1884| AND KUNNR = ALL_ITEMS_ITAB-KUNNR
1885| AND STCD = ALL_ITEMS_ITAB-STCD
1886| AND AUGBL = ALL_ITEMS_ITAB-AUGBL.
1887| IF PROG_NAME = ' '.
1888| CHECK AUSGLOP_ITAB-CHECK = 'X'.
1889| ENDIF.
1890|
1891| MOVE-CORRESPONDING AUSGLOP_ITAB TO SUM_TAXES.
1892| COLLECT SUM_TAXES.
1893| ENDLOOP.
1894|
1895| LOOP AT SUM_TAXES WHERE BUKRS = ALL_ITEMS_ITAB-BUKRS
1896| AND KUNNR = ALL_ITEMS_ITAB-KUNNR
1897| AND STCD = ALL_ITEMS_ITAB-STCD
1898| AND AUGBL = ALL_ITEMS_ITAB-AUGBL.
1899|
1900| VALUE1 = SUM_TAXES-HWBAS + SUM_TAXES-HWSTE.
1901| VALUE2 = ALL_ITEMS_ITAB-NETWR + ALL_ITEMS_ITAB-MWSBP.
1902| IF ( VALUE1 <> VALUE2 ).
1903| ALL_ITEMS_ITAB-DELTAN =
1904| SUM_TAXES-HWBAS - ALL_ITEMS_ITAB-NETWR.
1905| ALL_ITEMS_ITAB-DELTAM =
1906| SUM_TAXES-HWSTE - ALL_ITEMS_ITAB-MWSBP.
1907|
1908| ALL_ITEMS_ITAB-NETWR = SUM_TAXES-HWBAS.
1909| ALL_ITEMS_ITAB-MWSBP = SUM_TAXES-HWSTE.
1910| ENDIF.
1911| MODIFY ALL_ITEMS_ITAB.
1912| ENDLOOP.
1913| ENDLOOP.
```
- **EN**: Collect FI tax base and tax per tax invoice into SUM_TAXES, compare with the SD item totals, store the differences and align ALL_ITEMS_ITAB amounts with the FI totals to correct rounding/conversion errors.
- 테이블(파서): read - / write [ALL_ITEMS_ITAB](/tables/ALL_ITEMS_ITAB.md)
- 업무 키워드: 합계 검증, 공급가액 차이, 세액 차이, 환산 오차 보정, 세금계산서 합계
- English: Total Reconciliation, Tax Base, Tax Amount, Delta, COLLECT
- 정의부(복사 시 함께 필요): [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`SUM_TAXES`](#decl-zfir0141-310-sum_taxes), [`VALUE1`](#decl-zfir0141-121-value1), [`VALUE2`](#decl-zfir0141-122-value2)
- 위치: `abap://ZFIR0141/ZFIR0141#L1882-L1913` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#GET_TOTALS#C1`
### FORM USER_EXIT3 — `ZFIR0141` L2865-L2893 (29줄)
*세금계산서 출력 직전 모든 출력 내부테이블과 옵션을 한국 세금계산서 리스트 User Exit FM KR_USER_EXIT_LIST_TAXINVOICE 에 넘겨 고객사 로직으로 가공한다.*
> 이 unit 의 조각 1개가 23/29줄(79%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] 영수/청구·인쇄옵션·양식 종류·품목 라인 MATZEIL1~4·SAPscript 양식명·시뮬레이션·본사 사업장과 AUSGLOP_ITAB 등 출력 테이블들을 User Exit FM KR_USER_EXIT_LIST_TAXINVOICE 로 전달해 세금계산서 출력 데이터를 고객사 요구에 맞게 수정할 수 있게 한다.
```abap
2867| CALL FUNCTION 'KR_USER_EXIT_LIST_TAXINVOICE'
2868| EXPORTING
2869| YRECEIPT = RECEIPT
2870| YCHK_PRTI = CHK_PRTI
2871| YSTA1 = STA1
2872| ZMATZEIL1 = MATZEIL1
2873| ZMATZEIL2 = MATZEIL2
2874| ZMATZEIL3 = MATZEIL3
2875| ZMATZEIL4 = MATZEIL4
2876| YPROG_NAME = PROG_NAME
2877| SFORM_NAME = SAP_FORM "Note 975866
2878| YSIM = SIM "Note 1019954
2879| YBUPLA_HQ = BUPLA_HQ
2880| TABLES
2881| ZAUSGLOP_ITAB = AUSGLOP_ITAB
2882| ZALL_ITEMS_ITAB = ALL_ITEMS_ITAB
2883| ZAUSGLOP_MAT_ITAB = AUSGLOP_MAT_ITAB
2884| ZADDRESS_ITAB = ADDRESS_ITAB
2885| ZBUPLA_ADRESSE = BUPLA_ADRESSE
2886| ZCHECK_ITAB = CHECK_ITAB
2887| ZALL_MAT_ITAB = ALL_MAT_ITAB
2888| ZMATZEIL4_ITAB = MATZEIL4_ITAB
2889| ZALL_ITEMS_SD_ITAB = ALL_ITEMS_SD_ITAB.
```
- **EN**: Call user exit FM KR_USER_EXIT_LIST_TAXINVOICE with print options, item lines, form name and all output tables so customer-specific tax invoice adjustments can be applied.
- 호출(파서): KR_USER_EXIT_LIST_TAXINVOICE
- SAP 객체: KR_USER_EXIT_LIST_TAXINVOICE
- 업무 키워드: User Exit, 세금계산서 출력, 고객사 로직, 출력 테이블
- English: User Exit, Tax Invoice, Print Option, SAPscript Form
- 정의부(복사 시 함께 필요): [`RECEIPT`](#decl-zfir0141-700-receipt), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`STA1`](#decl-zfir0141-655-sta1), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`SAP_FORM`](#decl-zfir0141-132-sap_form), [`SIM`](#decl-zfir0141-130-sim), [`BUPLA_HQ`](#decl-zfir0141-137-bupla_hq) 외 9건
- 위치: `abap://ZFIR0141/ZFIR0141#L2867-L2889` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#USER_EXIT3#C1`
### FORM LIST_OUTPUT — `ZFIR0141` L2902-L2937 (36줄)
*시뮬레이션이거나 직접 실행이면 세금계산서를 WRITE 리스트로 인쇄(PRINT_INVOICES)하고 인쇄 파라미터를 설정하며, 그 외에는 스마트빌 전송(SMARTBILL_TRANS)으로 분기한다.*
> 이 unit 의 조각 1개가 26/36줄(72%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 시뮬레이션(SIM='X') 또는 직접 실행이면 SALL/DSALL/SAVE 를 제외한 PF-STATUS LIST1 을 설정하고 PRINT_INVOICES 로 세금계산서를 인쇄한 뒤 GET_PRINT_PARAMETERS 로 X_90_120 레이아웃 인쇄 파라미터를 무대화 설정하며, 그렇지 않으면 SMARTBILL_TRANS 로 전자세금계산서를 전송한다.
```abap
2906| IF SIM EQ 'X' OR PROG_NAME = ' '.
2907| * SET PF-STATUS 'LIST1'.
2908| PERFORM EXCL_FCODE01 USING 'SALL' 'DSALL' 'SAVE'.
2909| SET PF-STATUS 'LIST1' EXCLUDING IT_FCODE.
2910|
2911| * 세금계산서 인쇄
2912| PERFORM PRINT_INVOICES.
2913|
2914| CALL FUNCTION 'GET_PRINT_PARAMETERS'
2915| EXPORTING
2916| IN_PARAMETERS = PRIPAR
2917| LAYOUT = 'X_90_120'
2918| LINE_COUNT = 90
2919| LINE_SIZE = 120
2920| NO_DIALOG = 'X'
2921| IMPORTING
2922| OUT_PARAMETERS = PRIPAR
2923| VALID = VAL.
2924|
2925| IF SY-SUBRC <> 0.
2926| * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
2927| * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
2928| ENDIF.
2929| ELSE.
2930| PERFORM SMARTBILL_TRANS.
2931| ENDIF.
```
- **EN**: In simulation or standalone mode set PF-STATUS LIST1, print tax invoices and fetch print parameters (layout X_90_120) via GET_PRINT_PARAMETERS; otherwise transmit to Smartbill via SMARTBILL_TRANS.
- 호출(파서): EXCL_FCODE01, PRINT_INVOICES, GET_PRINT_PARAMETERS, SMARTBILL_TRANS
- SAP 객체: GET_PRINT_PARAMETERS
- 업무 키워드: 시뮬레이션, 세금계산서 인쇄, 인쇄 파라미터, 스마트빌 전송
- English: Simulation, Print Parameters, GET_PRINT_PARAMETERS, Smartbill
- 정의부(복사 시 함께 필요): [`SIM`](#decl-zfir0141-130-sim), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`IT_FCODE`](#decl-zfir0141-147-it_fcode), [`PRIPAR`](#decl-zfir0141-479-pripar), [`VAL`](#decl-zfir0141-480-val)
- 위치: `abap://ZFIR0141/ZFIR0141#L2906-L2931` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#LIST_OUTPUT#C1`
### FORM PRINT_INVOICES — `ZFIR0141` L3316-L3532 (217줄)
*선택된 세금계산서(AUGBL)별로 공급자용·공급받는자용 2부를 WRITE 리스트 형식으로 인쇄하며 제목·번호·거래처·합계·품목·영수/청구 구분을 순서대로 출력한다.*
> 이 unit 의 조각 5개가 181/217줄(83%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 출력 대상을 고객·사업장·세금계산서번호 순으로 정렬하고 직접 실행(PROG_NAME 공백)이면 체크된 항목만 인쇄 대상으로 한다.
```abap
3327| SORT AUSGLOP_ITAB BY KUNNR BUPLA AUGBL.
3328|
3329| LOOP AT AUSGLOP_ITAB.
3330|
3331|
3332|
3333| IF PROG_NAME = ' '.
3334| CHECK AUSGLOP_ITAB-CHECK = 'X'.
3335| ENDIF.
```
- **EN**: Sort output rows by customer, business place and tax invoice number and restrict to checked rows when run standalone.
- 업무 키워드: 정렬, 선택 항목, 인쇄 대상
- English: Sort, Selection, Tax Invoice
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BUPLA`](#decl-zfir0141-126-bupla), [`AUGBL`](#decl-zfir0141-461-augbl), [`PROG_NAME`](#decl-zfir0141-462-prog_name)
- 위치: `abap://ZFIR0141/ZFIR0141#L3327-L3335` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_INVOICES#C1`
#### [aggregation] 세금계산서 번호가 바뀔 때 해당 번호의 전표를 DOC_CNT_ITAB 에 모아 전기일·전표번호로 정렬하고 마지막 전표를 읽은 뒤 발행일자를 입력 SBLDAT 우선(없으면 반제일 AUGDT)으로 정해 연·월·일(YY1/MM1/DD1)을 세팅한다.
```abap
3347| AT NEW AUGBL.
3348| *추가로직
3349| CLEAR : YY1 , MM1 , DD1.
3350| CLEAR L_LINES.
3351|
3352| CLEAR DOC_CNT_ITAB.
3353| REFRESH DOC_CNT_ITAB.
3354|
3355| LOOP AT AUSGLOP_ITAB WHERE AUGBL = AUSGLOP_ITAB-AUGBL.
3356|
3357| MOVE AUSGLOP_ITAB TO DOC_CNT_ITAB.
3358| APPEND DOC_CNT_ITAB.
3359| ENDLOOP.
3360|
3361|
3362| SORT DOC_CNT_ITAB BY BUDAT BELNR .
3363|
3364| DESCRIBE TABLE DOC_CNT_ITAB LINES L_LINES.
3365|
3366| READ TABLE DOC_CNT_ITAB INDEX L_LINES.
3367|
3368| * 세금계산서 발행일자
3369| IF SBLDAT IS INITIAL.
3370| DOC_CNT_ITAB-BUDAT = AUSGLOP_ITAB-AUGDT.
3371| ELSE.
3372| DOC_CNT_ITAB-BUDAT = SBLDAT.
3373| ENDIF.
3374|
3375| * IF SN1OP EQ 'X'. " 통합 세금계산서 발행일 경우
3376| ** 전기일자의 말일.
3377| * CALL FUNCTION 'LAST_DAY_OF_MONTHS'
3378| * EXPORTING
3379| * DAY_IN = DOC_CNT_ITAB-BUDAT
3380| * IMPORTING
3381| * LAST_DAY_OF_MONTH = DOC_CNT_ITAB-BUDAT
3382| * EXCEPTIONS
3383| * DAY_IN_NO_DATE = 1
3384| * OTHERS = 2.
3385| * ENDIF.
3386|
3387| YY1 = DOC_CNT_ITAB-BUDAT+2(2).
3388| MM1 = DOC_CNT_ITAB-BUDAT+4(2).
3389| DD1 = DOC_CNT_ITAB-BUDAT+6(2).
```
- **EN**: At each new tax invoice number, collect its documents, and derive the issue date (SBLDAT or clearing date AUGDT) into year/month/day fields.
- 업무 키워드: 세금계산서 발행일, 반제일, 전표 집계, AT NEW
- English: Issue Date, Clearing Date, Document Count
- 정의부(복사 시 함께 필요): [`AUGBL`](#decl-zfir0141-461-augbl), [`YY1`](#decl-zfir0141-115-yy1), [`MM1`](#decl-zfir0141-115-mm1), [`DD1`](#decl-zfir0141-115-dd1), [`L_LINES`](#decl-zfir0141-114-l_lines), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`DOC_CNT_ITAB`](#decl-zfir0141-232-doc_cnt_itab), [`SBLDAT`](#decl-zfir0141-638-sbldat)
- 위치: `abap://ZFIR0141/ZFIR0141#L3347-L3389` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_INVOICES#C2`
#### [output] 공급자용·공급받는자용 2부(COPY 1,2)를 WHILE 로 반복하며 판매 품목 수(LINE_COUNT)를 세고 양식 상단 테두리·제목(TAX_INVOICE_TITLE_CHANGE)·세금계산서 번호 칸(TRUNCATE_TAXNUM)을 WRITE 한다.
```abap
3394| IF AUSGLOP_ITAB-AUGBL NE AUGBL.
3395|
3396|
3397| CLEAR COPY.
3398| WHILE COPY < 2.
3399| COPY = COPY + 1.
3400| READ TABLE AUSGLOP_ITAB INDEX SEL_INDEX.
3401| CLEAR AUSGLOP_MAT_ITAB.
3402| CLEAR ALL_ITEMS_ITAB.
3403|
3404| * number of item lines in ausglop_mat_itab --> number of sold
3405| * materials
3406| LINE_COUNT = 0.
3407| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
3408| AND KUNNR = AUSGLOP_ITAB-KUNNR
3409| AND STCD = AUSGLOP_ITAB-STCD
3410| AND AUGBL = AUSGLOP_ITAB-AUGBL.
3411| LINE_COUNT = LINE_COUNT + 1.
3412| ENDLOOP.
3413|
3414| * new-page.
3415| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
3416| WRITE:/ TEXT-CA2,
3417| 85 TEXT-WA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3418| 97 TEXT-CA2,
3419| 110 TEXT-CA2,
3420| 114 TEXT-WA2 COLOR COL_BACKGROUND INTENSIFIED OFF,
3421| 117 TEXT-CA2.
3422| WRITE:/ TEXT-CA2,
3423| 97 TEXT-CA4,
3424| 117 TEXT-CA2.
3425| * start of tax invoice title change
3426| * create text elements w11 and w12 for this change
3427| PERFORM TAX_INVOICE_TITLE_CHANGE.
3428| * end of tax invoice title change
3429|
3430| PERFORM TRUNCATE_TAXNUM.
3431|
3432| WRITE:/ TEXT-CA2,
3433| 81 TEXT-WA4 COLOR COL_BACKGROUND INTENSIFIED OFF,
3434| 97 TAX_NUM, 117 TEXT-CA2.
3435| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Loop twice for supplier and buyer copies, count material lines and print the form header with title and boxed tax invoice number.
- 호출(파서): TAX_INVOICE_TITLE_CHANGE, TRUNCATE_TAXNUM
- 업무 키워드: 2부 인쇄, 공급자용, 공급받는자용, 세금계산서 번호, 제목
- English: Supplier Copy, Buyer Copy, Tax Invoice Number, Title
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`COPY`](#decl-zfir0141-464-copy), [`SEL_INDEX`](#decl-zfir0141-96-sel_index), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`TAX_NUM`](#decl-zfir0141-475-tax_num)
- 위치: `abap://ZFIR0141/ZFIR0141#L3394-L3435` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_INVOICES#C3`
#### [output] 고객 유형별 파트1(KIND_OF_CUSTOMERS)·합계 라인(PRINT_SUM_LINE)·품목 라인 채우기(FILL_ITEM_TABLES) 후 종사업장 표시, 전표 건수(G_LINES)와 세율 플래그(FL_TAX_RAT)에 따른 비고 텍스트(TEXT-001/002/003), 공급가액·세액 합계(FILL_AMOUNT)를 WRITE 한다.
```abap
3437| WRITE AUSGLOP_ITAB-AUGDT+2(2) TO BYEAR.
3438| WRITE AUSGLOP_ITAB-AUGDT+4(2) TO BMONTH.
3439| WRITE AUSGLOP_ITAB-AUGDT+6(2) TO BDAY.
3440|
3441| * 고객종류에 따라(On-Time, Master)
3442| PERFORM KIND_OF_CUSTOMERS.
3443|
3444| *----------------------------------------------------------------------*
3445| * print total amount and total tax amount in appropriate cases on the
3446| * tax invoice
3447| *----------------------------------------------------------------------*
3448| PERFORM PRINT_SUM_LINE.
3449|
3450| *----------------------------------------------------------------------*
3451| * Print items
3452| *----------------------------------------------------------------------*
3453|
3454| * Item라인에 보여주기위한 테이블(matzeil1,matzeil2,matzeil3,matzeil4)
3455| * 채운다.
3456| PERFORM FILL_ITEM_TABLES.
3457|
3458| * 년월일, 비고, Item공급가액 , 세액합.
3459| WRITE:/ TEXT-CA2,
3460| 2 TEXT-YA3 COLOR COL_BACKGROUND INTENSIFIED OFF,
3461| 58 TEXT-CA2, 117 TEXT-CA2,
3462|
3463| 60 '종사업장 :',
3464| 71 L_STATE_INSC.
3465|
3466|
3467| * 비고
3468| IF G_LINES > 1 AND FL_TAX_RAT EQ '0'.
3469| WRITE:/ TEXT-C10,
3470| 58 TEXT-CA2,
3471| 60 TEXT-001,
3472| 117 TEXT-CA2.
3473| ELSEIF G_LINES EQ 1 AND FL_TAX_RAT EQ '0'.
3474| WRITE:/ TEXT-C10,
3475| 58 TEXT-CA2,
3476| 60 TEXT-003,
3477| 117 TEXT-CA2.
3478| ELSEIF G_LINES > 1 AND FL_TAX_RAT EQ '1'.
3479| WRITE:/ TEXT-C10,
3480| 58 TEXT-CA2,
3481| 60 TEXT-002,
3482| 117 TEXT-CA2.
3483| ELSE.
3484| WRITE:/ TEXT-C10,
3485| 58 TEXT-CA2,
3486| 117 TEXT-CA2.
3487| ENDIF.
3488|
3489| * 공급가액,세액 합계
3490| PERFORM FILL_AMOUNT USING FELD1A FELD1B.
3491|
3492| * 내역 (Item Print).
3493| WRITE:/ TEXT-CA2,
3494| 2 TEXT-YA4 COLOR COL_BACKGROUND INTENSIFIED OFF,
3495| 117 TEXT-CA2.
3496| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print part 1 by customer type, the sum line, the remark text chosen by document count and tax rate flag, and the boxed tax base/tax amount totals.
- 호출(파서): KIND_OF_CUSTOMERS, PRINT_SUM_LINE, FILL_ITEM_TABLES, FILL_AMOUNT
- 업무 키워드: 파트1, 합계 라인, 비고, 세율, 공급가액 합계, 세액 합계, 종사업장
- English: Sum Line, Remark, Tax Rate, Tax Base, Business Place
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BYEAR`](#decl-zfir0141-117-byear), [`BMONTH`](#decl-zfir0141-118-bmonth), [`BDAY`](#decl-zfir0141-119-bday), [`L_STATE_INSC`](#decl-zfir0141-134-l_state_insc), [`G_LINES`](#decl-zfir0141-487-g_lines), [`FL_TAX_RAT`](#decl-zfir0141-488-fl_tax_rat), [`FELD1A`](#decl-zfir0141-101-feld1a), [`FELD1B`](#decl-zfir0141-104-feld1b)
- 위치: `abap://ZFIR0141/ZFIR0141#L3437-L3496` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_INVOICES#C4`
#### [output] 원천 유형(VBRK=SD 빌링/BKPF=FI 전표)에 따라 WRITE_ITEM_SD 또는 WRITE_ITEM_FI 로 품목 4줄을 인쇄하고 영수(RECEIPT='X')/청구 구분에 따라 CHECK_RECEIPT/CHECK_BILLING 으로 하단을 출력한 뒤 NEW-PAGE 한다.
```abap
3498| IF AUSGLOP_ITAB-AWTYP = 'VBRK'.
3499| PERFORM WRITE_ITEM_SD USING MATZEIL1.
3500| PERFORM WRITE_ITEM_SD USING MATZEIL2.
3501| PERFORM WRITE_ITEM_SD USING MATZEIL3.
3502| PERFORM WRITE_ITEM_SD USING MATZEIL4.
3503| ELSEIF AUSGLOP_ITAB-AWTYP = 'BKPF'.
3504| PERFORM WRITE_ITEM_FI USING MATZEIL1.
3505| PERFORM WRITE_ITEM_FI USING MATZEIL2.
3506| PERFORM WRITE_ITEM_FI USING MATZEIL3.
3507| PERFORM WRITE_ITEM_FI USING MATZEIL4.
3508| * PERFORM write_lines_fi.
3509| ENDIF.
3510|
3511| IF RECEIPT = 'X'.
3512| PERFORM CHECK_RECEIPT.
3513| ELSE.
3514| PERFORM CHECK_BILLING.
3515| ENDIF.
3516| DO 2 TIMES.
3517| WRITE: /.
3518| ENDDO.
3519| WRITE : / TEXT-CA1.
3520| DO 2 TIMES.
3521| WRITE: /.
3522| ENDDO.
3523| ENDWHILE.
3524| NEW-PAGE.
```
- **EN**: Print four item lines via the SD or FI routine depending on the reference type, then the receipt or billing footer, and start a new page.
- 호출(파서): WRITE_ITEM_SD, WRITE_ITEM_SD, WRITE_ITEM_SD, WRITE_ITEM_SD, WRITE_ITEM_FI, WRITE_ITEM_FI, WRITE_ITEM_FI, WRITE_ITEM_FI, CHECK_RECEIPT, CHECK_BILLING
- SAP 객체: VBRK, BKPF
- 업무 키워드: 품목 라인 인쇄, 영수, 청구, SD 빌링, FI 전표, 새 페이지
- English: Item Line, Receipt, Billing, Billing Document, FI Document
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`RECEIPT`](#decl-zfir0141-700-receipt)
- 위치: `abap://ZFIR0141/ZFIR0141#L3498-L3524` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_INVOICES#C5`
### FORM TAX_INVOICE_TITLE_CHANGE — `ZFIR0141` L3905-L3961 (57줄)
*세금계산서 제목 라인을 부수(COPY 1=공급자용, 2=공급받는자용)와 양식 종류(STA1 일반세금계산서/STA2 세금계산서)에 따라 다른 텍스트로 인쇄하고 시뮬레이션이면 표시를 덧붙인다.*
> 이 unit 의 조각 1개가 52/57줄(91%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] COPY(공급자용/공급받는자용)와 STA1/STA2(일반세금계산서/세금계산서) 조합에 따라 제목 TEXT-WA3/W11/W10/W12 를 WRITE 하고 시뮬레이션(SIM='X')이면 TEXT-W17 강조 표시를 추가한 뒤 TEXT-CA7 을 우측에 출력한다.
```abap
3908| IF COPY = 1 AND STA1 = 'X'.
3909| WRITE:/ TEXT-CA2,
3910| 41 TEXT-WA3 COLOR COL_BACKGROUND INTENSIFIED OFF,
3911| 117 TEXT-CA2.
3912|
3913| IF SIM = 'X'.
3914| WRITE:/ TEXT-CA2,
3915| 41 TEXT-W17 COLOR COL_HEADING INTENSIFIED ON,
3916| 117 TEXT-CA2.
3917| ENDIF.
3918|
3919| WRITE:/ TEXT-CA2, 97 TEXT-CA7, 117 TEXT-CA2.
3920| * 공급자용(세금계산서)
3921| ELSEIF COPY = 1 AND STA2 = 'X'.
3922| WRITE:/ TEXT-CA2,
3923| 41 TEXT-W11 COLOR COL_BACKGROUND INTENSIFIED OFF,
3924| 117 TEXT-CA2.
3925| IF SIM = 'X'.
3926| WRITE: / TEXT-CA2,
3927| 41 TEXT-W17 COLOR COL_HEADING INTENSIFIED ON,
3928| 117 TEXT-CA2.
3929| ENDIF.
3930|
3931| WRITE:/ TEXT-CA2, 97 TEXT-CA7, 117 TEXT-CA2.
3932| * 공급받는자용(일반세금계산서)
3933| ELSEIF COPY = 2 AND STA1 = 'X'.
3934| WRITE:/ TEXT-CA2,
3935| 41 TEXT-W10 COLOR COL_BACKGROUND INTENSIFIED OFF,
3936| 117 TEXT-CA2.
3937|
3938| IF SIM = 'X'.
3939| WRITE:/ TEXT-CA2,
3940| 41 TEXT-W17 COLOR COL_HEADING INTENSIFIED ON,
3941| 117 TEXT-CA2.
3942| ENDIF.
3943|
3944| WRITE:/ TEXT-CA2, 97 TEXT-CA7, 117 TEXT-CA2.
3945| * 공급받는자용(세금계산서)
3946| ELSEIF COPY = 2 AND STA2 = 'X'.
3947| WRITE:/ TEXT-CA2,
3948| 41 TEXT-W12 COLOR COL_BACKGROUND INTENSIFIED OFF,
3949| 117 TEXT-CA2.
3950|
3951| IF SIM = 'X'.
3952| WRITE:/ TEXT-CA2,
3953| 41 TEXT-W17 COLOR COL_HEADING INTENSIFIED ON,
3954| 117 TEXT-CA2.
3955| ENDIF.
3956|
3957| WRITE:/ TEXT-CA2, 97 TEXT-CA7, 117 TEXT-CA2.
3958|
3959| ENDIF.
```
- **EN**: Print the tax invoice title text depending on copy (supplier/buyer) and form type (general tax invoice/tax invoice), adding a simulation marker when SIM='X'.
- 업무 키워드: 세금계산서 제목, 공급자용, 공급받는자용, 일반세금계산서, 시뮬레이션
- English: Tax Invoice, Title, Supplier Copy, Buyer Copy, Simulation
- 정의부(복사 시 함께 필요): [`COPY`](#decl-zfir0141-464-copy), [`STA1`](#decl-zfir0141-655-sta1), [`SIM`](#decl-zfir0141-130-sim), [`STA2`](#decl-zfir0141-657-sta2)
- 위치: `abap://ZFIR0141/ZFIR0141#L3908-L3959` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#TAX_INVOICE_TITLE_CHANGE#C1`
### FORM TRUNCATE_TAXNUM — `ZFIR0141` L2946-L2964 (19줄)
*세금계산서 번호(AUGBL)를 10자리로 편집해 세금계산서 양식의 번호란 자릿수 칸(TAX_NUM)에 한 자리씩 배치한다.*
> 이 unit 의 조각 1개가 14/19줄(74%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 반제전표번호 기반 세금계산서 번호를 EDIT MASK 로 좌측 정렬한 뒤 각 자리를 2칸 간격의 TAX_NUM 위치에 WRITE 하여 세금계산서 일련번호 칸 형식으로 변환한다.
```abap
2949| MOVE AUSGLOP_ITAB-AUGBL TO TAX_NO.
2950| WRITE TAX_NO TO TAX_INV_NO USING EDIT MASK 'LL__________'.
2951| *WRITE TAX_INV_NO TO TAX_INV_NO USING EDIT MASK 'RR__________'.
2952|
2953| WRITE TAX_INV_NO TO TAX_NUM+1(1).
2954| WRITE TAX_INV_NO+1 TO TAX_NUM+3(1).
2955| WRITE TAX_INV_NO+2 TO TAX_NUM+5(1).
2956| WRITE TAX_INV_NO+3 TO TAX_NUM+7(1).
2957| WRITE TAX_INV_NO+4 TO TAX_NUM+9(1).
2958| WRITE TAX_INV_NO+5 TO TAX_NUM+11(1).
2959| WRITE TAX_INV_NO+6 TO TAX_NUM+13(1).
2960| WRITE TAX_INV_NO+7 TO TAX_NUM+15(1).
2961| WRITE TAX_INV_NO+8 TO TAX_NUM+17(1).
2962| WRITE TAX_INV_NO+9 TO TAX_NUM+19(1).
```
- **EN**: Format the tax invoice number (clearing document AUGBL) and spread its digits into the boxed serial number field TAX_NUM of the form.
- 업무 키워드: 세금계산서 번호, 일련번호 칸, 자릿수 배치
- English: Tax Invoice Number, Digit Boxes, EDIT MASK
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`TAX_NO`](#decl-zfir0141-473-tax_no), [`TAX_INV_NO`](#decl-zfir0141-474-tax_inv_no), [`TAX_NUM`](#decl-zfir0141-475-tax_num)
- 위치: `abap://ZFIR0141/ZFIR0141#L2949-L2962` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#TRUNCATE_TAXNUM#C1`
### FORM KIND_OF_CUSTOMERS — `ZFIR0141` L3970-L4020 (51줄)
*고객 유형(일회성 CPD·마스터 고객·지점 고객)에 따라 고객 주소와 사업장 주소를 찾아 세금계산서 파트1(공급자/공급받는자 정보)을 WRITE_PART1-1/1-2 로 인쇄한다.*
> 이 unit 의 조각 2개가 44/51줄(86%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 일회성 고객(XCPDK='X')이면 고객번호·사업자번호로 ADDRESS_ITAB 을 READ 하고 사업장·세금계산서번호에 해당하는 BUPLA_ADRESSE 를 찾아 WRITE_PART1-1 로 공급자/공급받는자 정보를 인쇄한다.
```abap
3974| IF AUSGLOP_ITAB-XCPDK = 'X'.
3975|
3976| READ TABLE ADDRESS_ITAB WITH KEY KUNNR = AUSGLOP_ITAB-KUNNR
3977| STCD = AUSGLOP_ITAB-STCD.
3978|
3979| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
3980| AND AUGBL = AUSGLOP_ITAB-AUGBL.
3981| * Part 1 (사업자등록번호, 공급자, 공급받는자, 년도, 비고)
3982| PERFORM WRITE_PART1-1.
3983| IF SY-SUBRC = 0.
3984| EXIT.
3985| ENDIF.
3986| ENDLOOP.
```
- **EN**: For one-time (CPD) customers, read the address by customer and tax number, find the business place address and print part 1 via WRITE_PART1-1.
- 호출(파서): WRITE_PART1-1
- 업무 키워드: 일회성 고객, 사업장 주소, 공급받는자, 세금계산서 파트1
- English: One-Time Customer, Business Place, Address, Tax Invoice
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`AUGBL`](#decl-zfir0141-461-augbl), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L3974-L3986` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#KIND_OF_CUSTOMERS#C1`
#### [control_flow] 마스터 고객이면 KUNNR, 지점 고객이면 FILKD 기준으로 ADDRESS_ITAB 을 LOOP 하고 세금계산서 인쇄 모드(CHK_PRTI)에서 BUPLA_ADRESSE 를 찾아 WRITE_PART1-2 로 파트1을 인쇄한다(지점 고객 분기는 출력 호출이 비어 있음).
```abap
3988| ELSE.
3989| IF AUSGLOP_ITAB-FILKD = ' '.
3990|
3991| LOOP AT ADDRESS_ITAB WHERE KUNNR = AUSGLOP_ITAB-KUNNR.
3992|
3993| IF CHK_PRTI = 'X'.
3994| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
3995| AND AUGBL = AUSGLOP_ITAB-AUGBL .
3996|
3997| * Part 1 (사업자등록번호, 공급자, 공급받는자, 년도, 비고)
3998| PERFORM WRITE_PART1-2.
3999| IF SY-SUBRC = 0.
4000| EXIT.
4001| ENDIF.
4002| ENDLOOP.
4003| ENDIF.
4004| ENDLOOP.
4005| ELSE.
4006| LOOP AT ADDRESS_ITAB WHERE KUNNR = AUSGLOP_ITAB-FILKD.
4007| IF CHK_PRTI = 'X'.
4008| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
4009| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4010| IF SY-SUBRC = 0.
4011| EXIT.
4012| ENDIF.
4013|
4014| ENDLOOP.
4015| ENDIF.
4016| ENDLOOP.
4017| ENDIF.
4018| ENDIF.
```
- **EN**: For master customers (by KUNNR) or branch customers (by FILKD), loop the address and business place tables and print part 1 via WRITE_PART1-2.
- 호출(파서): WRITE_PART1-2
- 업무 키워드: 마스터 고객, 지점 고객, 사업장 주소, 파트1 인쇄
- English: Customer Master, Branch, Business Place, Tax Invoice
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`AUGBL`](#decl-zfir0141-461-augbl), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L3988-L4018` · confidence 0.75 · `ZFIR0141#ZFIR0141#FORM#KIND_OF_CUSTOMERS#C2`
### FORM WRITE_PART1-1 — `ZFIR0141` L3645-L3764 (120줄)
*세금계산서 파트1(공급자 보관용 1번째 양식)의 사업자등록번호·상호·대표자·주소·업종·업태를 WRITE 로 인쇄한다.*
> 이 unit 의 조각 2개가 114/120줄(95%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] FILL_VAT_NUMBER 로 공급자(사업장 STCD2)와 공급받는자(고객 STCD2)의 사업자등록번호를 자릿수 칸에 인쇄하고 사업장·고객 주소 문자열(ADDRESS_BUPLA/ADDRESS_COMP)을 만든다.
```abap
3647| PERFORM FILL_VAT_NUMBER USING BUPLA_ADRESSE-STCD2
3648| ADDRESS_ITAB-STCD2.
3649|
3650|
3651| CONCATENATE BUPLA_ADRESSE-CITY1
3652| * CONCATENATE bupla_adresse-city1 bupla_adresse-city2
3653| BUPLA_ADRESSE-STREET INTO ADDRESS_BUPLA SEPARATED BY SPACE.
3654|
3655| CONCATENATE ADDRESS_ITAB-ORT01
3656| * CONCATENATE address_itab-ort01 address_itab-ort02
3657| ADDRESS_ITAB-STRAS INTO ADDRESS_COMP SEPARATED BY SPACE.
```
- **EN**: Print supplier and buyer tax registration numbers via FILL_VAT_NUMBER and build the business place and customer address strings.
- 호출(파서): FILL_VAT_NUMBER
- 업무 키워드: 사업자등록번호, 공급자, 공급받는자, 주소
- English: Tax Number, Supplier, Buyer, Address
- 정의부(복사 시 함께 필요): [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`ADDRESS_BUPLA`](#decl-zfir0141-478-address_bupla), [`ADDRESS_COMP`](#decl-zfir0141-477-address_comp)
- 위치: `abap://ZFIR0141/ZFIR0141#L3647-L3657` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_PART1-1#C1`
#### [output] 세금계산서 파트1 양식에 공급자 상호(NAME1)·대표자(KR_REPRES)·주소·업종·업태와 공급받는자 상호·대표자·주소·업태·업종을 양식 컬럼 위치에 맞춰 WRITE 한다.
```abap
3660| WRITE:/ TEXT-CA2,
3661| 4 TEXT-CA2,
3662| 5 TEXT-WA7 COLOR COL_BACKGROUND INTENSIFIED OFF,
3663| 9 TEXT-CA2,
3664| *2005년 11월3일 현업요청에의해 회사이름만 출력(사업자명 배제)
3665| 10 BUPLA_ADRESSE-NAME1, "bupla_adresse-name1,
3666| 35 TEXT-CA2,
3667| 31 TEXT-WA8 COLOR COL_BACKGROUND INTENSIFIED OFF,
3668| 42 TEXT-CA2,
3669| 43 BUPLA_ADRESSE-KR_REPRES, "공급자 대표자 성명
3670| 59 TEXT-CA2,
3671| 60 ' ' COLOR COL_BACKGROUND INTENSIFIED OFF,
3672| 62 TEXT-CA2,
3673| 63 TEXT-WA7 COLOR COL_BACKGROUND INTENSIFIED OFF,
3674| 67 TEXT-CA2,
3675| 68 ADDRESS_ITAB-NAME,
3676| 93 TEXT-CA2,
3677| 94 TEXT-WA8 COLOR COL_BACKGROUND INTENSIFIED OFF,
3678| 100 TEXT-CA2,
3679| 101 ADDRESS_ITAB-REPRE, "공급반는자 대표자 성명
3680| 117 TEXT-CA2.
3681| *이름1
3682| WRITE:/ TEXT-CA2,
3683| 2 '급' COLOR COL_BACKGROUND INTENSIFIED OFF,
3684| 4 TEXT-CA2,
3685| 5 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3686| 9 TEXT-CA2,
3687| 35 TEXT-CA2,
3688| 36 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3689| 40 TEXT-CA2,
3690| 59 TEXT-CA2,
3691| 60 '받' COLOR COL_BACKGROUND INTENSIFIED OFF,
3692| 62 TEXT-CA2,
3693| 63 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3694| 67 TEXT-CA2,
3695| 93 TEXT-CA2,
3696| 94 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3697| 100 TEXT-CA2,
3698| 117 TEXT-CA2.
3699|
3700| *이름 다음 선1
3701| WRITE:/ TEXT-CA2,
3702| 2 ' ' COLOR COL_BACKGROUND INTENSIFIED OFF,
3703| 4 TEXT-CA9, 63 TEXT-CA9, 59 TEXT-CA2,
3704| 60 '는' COLOR COL_BACKGROUND INTENSIFIED OFF,
3705| 62 TEXT-CA2.
3706|
3707| *주소1
3708| WRITE:/ TEXT-CA2,
3709| 2 '자' COLOR COL_BACKGROUND INTENSIFIED OFF,
3710| 4 TEXT-CA2,
3711| 5 TEXT-XA4 COLOR COL_BACKGROUND INTENSIFIED OFF,
3712| 9 TEXT-CA2,
3713| 10 ADDRESS_BUPLA,
3714| 59 TEXT-CA2,
3715| 60 '자' COLOR COL_BACKGROUND INTENSIFIED OFF,
3716| 62 TEXT-CA2,
3717| 63 TEXT-XA4 COLOR COL_BACKGROUND INTENSIFIED OFF,
3718| 67 TEXT-CA2,
3719| 68 ADDRESS_COMP,
3720| 117 TEXT-CA2.
3721|
3722| WRITE:/ TEXT-CA2,
3723| 4 TEXT-CA9,
3724| 59 TEXT-CA2,
3725| 63 TEXT-CA9,
3726| 60 ' ' COLOR COL_BACKGROUND INTENSIFIED OFF,
3727| 62 TEXT-CA2.
3728| * 업종/ 업태
3729| WRITE:/ TEXT-CA2,
3730| 4 TEXT-CA2,
3731| 5 TEXT-XA5 COLOR COL_BACKGROUND INTENSIFIED OFF,
3732| 9 TEXT-CA2,
3733| 10 BUPLA_ADRESSE-KR_INDTYPE,
3734| 35 TEXT-CA2,
3735| 36 TEXT-XA6 COLOR COL_BACKGROUND INTENSIFIED OFF,
3736| 40 TEXT-CA2,
3737| 41 BUPLA_ADRESSE-KR_BUSTYPE, 59 TEXT-CA2,
3738| 60 ' ' COLOR COL_BACKGROUND INTENSIFIED OFF,
3739| 62 TEXT-CA2,
3740| 63 TEXT-XA5 COLOR COL_BACKGROUND INTENSIFIED OFF,
3741| 67 TEXT-CA2,
3742| *2004.5.28업종과 업태필드 교체...
3743| * 68 address_itab-indtyp,
3744| 68 ADDRESS_ITAB-BUSTYP,
3745| 93 TEXT-CA2,
3746| 94 TEXT-XA6 COLOR COL_BACKGROUND INTENSIFIED OFF,
3747| 100 TEXT-CA2, 101 ADDRESS_ITAB-INDTYP, 117 TEXT-CA2.
3748| * 100 text-ca2, 101 address_itab-bustyp, 117 text-ca2.
3749|
3750| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
3751|
3752| WRITE:/ TEXT-CA2,
3753| 4 TEXT-YA9 COLOR COL_BACKGROUND INTENSIFIED OFF,
3754| 10 TEXT-CA2,
3755| 20 TEXT-XA9 COLOR COL_BACKGROUND INTENSIFIED OFF,
3756| 38 TEXT-CA2,
3757| 46 TEXT-YA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3758| 58 TEXT-CA2,
3759| 63 TEXT-YA2 COLOR COL_BACKGROUND INTENSIFIED OFF,
3760| 117 TEXT-CA2.
3761|
3762| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print supplier name, representative, address, industry and business type together with the buyer's data in the part 1 area of the tax invoice form.
- 업무 키워드: 세금계산서 파트1, 상호, 대표자, 업종, 업태, 주소 출력
- English: Tax Invoice, Supplier, Buyer, Business Type, WRITE
- 정의부(복사 시 함께 필요): [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`ADDRESS_BUPLA`](#decl-zfir0141-478-address_bupla), [`ADDRESS_COMP`](#decl-zfir0141-477-address_comp)
- 위치: `abap://ZFIR0141/ZFIR0141#L3660-L3762` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#WRITE_PART1-1#C2`
### FORM FILL_VAT_NUMBER — `ZFIR0141` L2973-L3020 (48줄)
*공급자(B)와 공급받는자(C)의 사업자등록번호 10자리를 세금계산서 양식의 사업자등록번호 칸(VAT_BUS/VAT_COM)에 한 자리씩 배치해 WRITE 한다.*
> 이 unit 의 조각 2개가 41/48줄(85%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 사업장 사업자번호 B 와 고객 사업자번호 C 를 EDIT MASK 로 정렬한 뒤 각 자리를 3-2-5 구분(하이픈 위치 건너뜀)의 VAT_BUS/VAT_COM 칸 위치에 WRITE 하여 사업자등록번호 칸 형식으로 변환한다.
```abap
2975| WRITE B TO BVAT USING EDIT MASK 'LL__________'.
2976| WRITE BVAT TO BVAT USING EDIT MASK 'RR__________'.
2977|
2978| WRITE BVAT TO VAT_BUS+1(1).
2979| WRITE BVAT+1 TO VAT_BUS+3(1).
2980| WRITE BVAT+2 TO VAT_BUS+5(1).
2981| WRITE BVAT+3 TO VAT_BUS+9(1).
2982| WRITE BVAT+4 TO VAT_BUS+11(1).
2983| WRITE BVAT+5 TO VAT_BUS+15(1).
2984| WRITE BVAT+6 TO VAT_BUS+17(1).
2985| WRITE BVAT+7 TO VAT_BUS+19(1).
2986| WRITE BVAT+8 TO VAT_BUS+21(1).
2987| WRITE BVAT+9 TO VAT_BUS+23(1).
2988|
2989| WRITE C TO CVAT USING EDIT MASK 'LL__________'.
2990| WRITE CVAT TO CVAT USING EDIT MASK 'RR__________'.
2991|
2992| WRITE CVAT TO VAT_COM+1(1).
2993| WRITE CVAT+1 TO VAT_COM+3(1).
2994| WRITE CVAT+2 TO VAT_COM+5(1).
2995| WRITE CVAT+3 TO VAT_COM+9(1).
2996| WRITE CVAT+4 TO VAT_COM+11(1).
2997| WRITE CVAT+5 TO VAT_COM+15(1).
2998| WRITE CVAT+6 TO VAT_COM+17(1).
2999| WRITE CVAT+7 TO VAT_COM+19(1).
3000| WRITE CVAT+8 TO VAT_COM+21(1).
3001| WRITE CVAT+9 TO VAT_COM+23(1).
```
- **EN**: Format supplier and buyer tax registration numbers and spread the digits into the boxed VAT number fields VAT_BUS and VAT_COM (3-2-5 layout).
- 업무 키워드: 사업자등록번호, 자릿수 칸, 공급자, 공급받는자
- English: Tax Number, VAT Registration, Digit Boxes
- 정의부(복사 시 함께 필요): [`BVAT`](#decl-zfir0141-465-bvat), [`VAT_BUS`](#decl-zfir0141-466-vat_bus), [`CVAT`](#decl-zfir0141-467-cvat), [`VAT_COM`](#decl-zfir0141-468-vat_com)
- 위치: `abap://ZFIR0141/ZFIR0141#L2975-L3001` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#FILL_VAT_NUMBER#C1`
#### [output] 세금계산서 상단에 공급자·공급받는자 사업자등록번호 칸(VAT_BUS/VAT_COM)과 구분선을 양식 위치에 WRITE 한다.
```abap
3005| WRITE: / TEXT-CA2,
3006| 4 TEXT-CA2,
3007| 5 TEXT-WA5 COLOR COL_BACKGROUND INTENSIFIED OFF, 35 VAT_BUS,
3008| 59 TEXT-CA2,
3009| 62 TEXT-CA2, 63 TEXT-WA5 COLOR COL_BACKGROUND INTENSIFIED OFF,
3010| 93 VAT_COM, 117 TEXT-CA2,
3011| *사업자등록번호 다음 선
3012| / TEXT-CA2,
3013| 2 '공' COLOR COL_BACKGROUND INTENSIFIED OFF,
3014| 4 TEXT-CA9,
3015| 59 TEXT-CA9,
3016| 61 TEXT-CA2,
3017| 60 '공' COLOR COL_BACKGROUND INTENSIFIED OFF,
3018| 62 TEXT-CA9, 117 TEXT-CA2.
```
- **EN**: Print the supplier and buyer tax registration number boxes and separator lines on the tax invoice header.
- 업무 키워드: 세금계산서 상단, 사업자등록번호 출력
- English: Tax Invoice, WRITE
- 정의부(복사 시 함께 필요): [`VAT_BUS`](#decl-zfir0141-466-vat_bus), [`VAT_COM`](#decl-zfir0141-468-vat_com)
- 위치: `abap://ZFIR0141/ZFIR0141#L3005-L3018` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#FILL_VAT_NUMBER#C2`
### FORM WRITE_PART1-2 — `ZFIR0141` L3773-L3896 (124줄)
*세금계산서 파트1(공급자/공급받는자 보관용 2번째 양식)의 사업자등록번호·상호·대표자·주소·업종·업태를 WRITE 로 인쇄한다.*
> 이 unit 의 조각 2개가 119/124줄(96%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] FILL_VAT_NUMBER 로 공급자(사업장 STCD2)와 공급받는자(고객 STCD2)의 사업자등록번호를 자릿수 칸에 인쇄하고 사업장·고객 주소 문자열(ADDRESS_BUPLA/ADDRESS_COMP)을 만든다.
```abap
3775| PERFORM FILL_VAT_NUMBER USING BUPLA_ADRESSE-STCD2
3776| ADDRESS_ITAB-STCD2.
3777|
3778| CONCATENATE BUPLA_ADRESSE-CITY1
3779| * CONCATENATE bupla_adresse-city1 bupla_adresse-city2
3780| BUPLA_ADRESSE-STREET INTO ADDRESS_BUPLA SEPARATED BY SPACE.
3781|
3782| CONCATENATE ADDRESS_ITAB-ORT01
3783| * CONCATENATE address_itab-ort01 address_itab-ort02
3784| ADDRESS_ITAB-STRAS INTO ADDRESS_COMP SEPARATED BY SPACE.
```
- **EN**: Print supplier and buyer tax registration numbers via FILL_VAT_NUMBER and build the business place and customer address strings.
- 호출(파서): FILL_VAT_NUMBER
- 업무 키워드: 사업자등록번호, 공급자, 공급받는자, 주소
- English: Tax Number, Supplier, Buyer, Address
- 정의부(복사 시 함께 필요): [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`ADDRESS_BUPLA`](#decl-zfir0141-478-address_bupla), [`ADDRESS_COMP`](#decl-zfir0141-477-address_comp)
- 위치: `abap://ZFIR0141/ZFIR0141#L3775-L3784` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_PART1-2#C1`
#### [output] 세금계산서 파트1 양식에 공급자 상호(NAME1)·대표자(KR_REPRES)·주소·업종·업태와 공급받는자 상호·대표자·주소·업태·업종을 양식 컬럼 위치에 맞춰 WRITE 한다.
```abap
3786| WRITE:/ TEXT-CA2,
3787| 4 TEXT-CA2,
3788| 5 TEXT-WA7 COLOR COL_BACKGROUND INTENSIFIED OFF,
3789| 9 TEXT-CA2,
3790| *2005년 11월3일 회사이름출력시 사업장 배제.. 수정자 박진성
3791| 10 BUPLA_ADRESSE-NAME1,
3792| 35 TEXT-CA2,
3793| 36 TEXT-WA8 COLOR COL_BACKGROUND INTENSIFIED OFF,
3794| 42 TEXT-CA2,
3795| 43 BUPLA_ADRESSE-KR_REPRES, "공급자 대표자 성명
3796| 59 TEXT-CA2,
3797| 60 '급' COLOR COL_BACKGROUND INTENSIFIED OFF,
3798| 62 TEXT-CA2,
3799| 63 TEXT-WA7 COLOR COL_BACKGROUND INTENSIFIED OFF,
3800| 67 TEXT-CA2,
3801| 68 ADDRESS_ITAB-NAME,
3802| 93 TEXT-CA2,
3803| 94 TEXT-WA8 COLOR COL_BACKGROUND INTENSIFIED OFF,
3804| 100 TEXT-CA2,
3805| 101 ADDRESS_ITAB-REPRE, " 공급받는자 대표자 성명
3806| 117 TEXT-CA2.
3807|
3808| *이름2
3809| WRITE:/ TEXT-CA2,
3810| 2 '급' COLOR COL_BACKGROUND INTENSIFIED OFF,
3811| 4 TEXT-CA2,
3812| 5 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3813| 9 TEXT-CA2,
3814| 35 TEXT-CA2,
3815| 36 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3816| 42 TEXT-CA2,
3817| 59 TEXT-CA2,
3818| 60 '받' COLOR COL_BACKGROUND INTENSIFIED OFF,
3819| 62 TEXT-CA2,
3820| 63 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3821| 67 TEXT-CA2,
3822| 93 TEXT-CA2,
3823| 94 TEXT-XA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3824| 100 TEXT-CA2,
3825| 117 TEXT-CA2.
3826|
3827| *이름 다음 선2
3828| WRITE:/ TEXT-CA2,
3829| 2 ' ' COLOR COL_BACKGROUND INTENSIFIED OFF,
3830| 4 TEXT-CA9,
3831| 59 TEXT-CA9,
3832| 60 '는' COLOR COL_BACKGROUND INTENSIFIED OFF,
3833| 62 TEXT-CA9,
3834| 117 TEXT-CA2.
3835|
3836| *주소2
3837| WRITE:/ TEXT-CA2,
3838| 2 '자' COLOR COL_BACKGROUND INTENSIFIED OFF,
3839| 4 TEXT-CA2,
3840| 5 TEXT-XA4 COLOR COL_BACKGROUND INTENSIFIED OFF,
3841| 9 TEXT-CA2,
3842| 10 ADDRESS_BUPLA,
3843| 59 TEXT-CA2,
3844| 60 '자' COLOR COL_BACKGROUND INTENSIFIED OFF,
3845| 62 TEXT-CA2,
3846| 63 TEXT-XA4 COLOR COL_BACKGROUND INTENSIFIED OFF,
3847| 67 TEXT-CA2,
3848| 68 ADDRESS_COMP,
3849| 117 TEXT-CA2.
3850|
3851| WRITE:/ TEXT-CA2,
3852| 4 TEXT-CA9,
3853| 59 TEXT-CA2,
3854| 60 ' ' COLOR COL_BACKGROUND INTENSIFIED OFF,
3855| 62 TEXT-CA9,
3856| 117 TEXT-CA2.
3857|
3858| * 업종/업태
3859| WRITE:/ TEXT-CA2,
3860| 4 TEXT-CA2,
3861| 5 TEXT-XA5 COLOR COL_BACKGROUND INTENSIFIED OFF,
3862| 9 TEXT-CA2,
3863| 10 BUPLA_ADRESSE-KR_INDTYPE,
3864| 35 TEXT-CA2,
3865| 36 TEXT-XA6 COLOR COL_BACKGROUND INTENSIFIED OFF,
3866| 42 TEXT-CA2, 43 BUPLA_ADRESSE-KR_BUSTYPE,
3867| 59 TEXT-CA2,
3868| 60 ' ' COLOR COL_BACKGROUND INTENSIFIED OFF,
3869| 62 TEXT-CA2,
3870| 63 TEXT-XA5 COLOR COL_BACKGROUND INTENSIFIED OFF,
3871| 67 TEXT-CA2,
3872| *2004.5.28 업종과 업태 필드교체..
3873| * 68 address_itab-indtyp,
3874| 68 ADDRESS_ITAB-BUSTYP,
3875| 93 TEXT-CA2,
3876| 94 TEXT-XA6 COLOR COL_BACKGROUND INTENSIFIED OFF,
3877| 100 TEXT-CA2,
3878| 101 ADDRESS_ITAB-INDTYP,
3879| 117 TEXT-CA2.
3880|
3881| WRITE:/ TEXT-CA1,
3882| 117 TEXT-CA2.
3883|
3884| WRITE:/ TEXT-CA2,
3885| 4 TEXT-YA9 COLOR COL_BACKGROUND INTENSIFIED OFF,
3886| 10 TEXT-CA2,
3887| 18 TEXT-XA9 COLOR COL_BACKGROUND INTENSIFIED OFF,
3888| 38 TEXT-CA2,
3889| 43 TEXT-YA1 COLOR COL_BACKGROUND INTENSIFIED OFF,
3890| 58 TEXT-CA2,
3891| 63 TEXT-YA2 COLOR COL_BACKGROUND INTENSIFIED OFF,
3892| 117 TEXT-CA2.
3893|
3894| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print supplier name, representative, address, industry and business type together with the buyer's data in the part 1 area of the tax invoice form.
- 업무 키워드: 세금계산서 파트1, 상호, 대표자, 업종, 업태, 주소 출력
- English: Tax Invoice, Supplier, Buyer, Business Type, WRITE
- 정의부(복사 시 함께 필요): [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`ADDRESS_BUPLA`](#decl-zfir0141-478-address_bupla), [`ADDRESS_COMP`](#decl-zfir0141-477-address_comp)
- 위치: `abap://ZFIR0141/ZFIR0141#L3786-L3894` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#WRITE_PART1-2#C2`
### FORM PRINT_SUM_LINE — `ZFIR0141` L1014-L1136 (123줄)
*세금계산서 합계 라인용으로 원천 유형(SD 전용/FI 전용/SD+FI)에 따라 총금액(FELD3)·공급가액(FELD1A)·세액(FELD1B) 문자열과 공란수(COUNT1)를 만든다.*
> 이 unit 의 조각 3개가 111/123줄(90%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [aggregation] 현재 세금계산서의 항목을 LOOP 하며 SD 전용(VBRK) 건은 NETWR+MWSBP 총금액을 FELD3 에, 공급가액 NETWR 을 EDIT MASK 로 FELD1A 에 넣고 12자리 기준 공란수 COUNT1(음수면 1 감소)을 계산하며 세액 MWSBP 를 FELD1B 에(0 이면 '0') 세팅한다.
```abap
1016| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1017| AND KUNNR = AUSGLOP_ITAB-KUNNR
1018| AND STCD = AUSGLOP_ITAB-STCD
1019| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1020|
1021| LOOP AT ALL_ITEMS_ITAB WHERE BUKRS = CHECK_ITAB-BUKRS
1022| AND KUNNR = CHECK_ITAB-KUNNR
1023| AND STCD = CHECK_ITAB-STCD
1024| AND AUGBL = CHECK_ITAB-AUGBL.
1025|
1026| * only sd-data
1027| IF CHECK_ITAB-AWTYP_SD = 'VBRK'.
1028| IF CHECK_ITAB-AWTYP_FI = ' '.
1029|
1030| TOT_AMOUNT = ALL_ITEMS_ITAB-NETWR + ALL_ITEMS_ITAB-MWSBP.
1031|
1032| WRITE TOT_AMOUNT TO FELD3 CURRENCY 'KRW'.
1033| * CURRENCY t001-waers USING EDIT MASK 'V____________'.
1034| SHIFT FELD3 LEFT DELETING LEADING '0'.
1035|
1036| WRITE ALL_ITEMS_ITAB-NETWR TO FELD1A
1037| CURRENCY T001-WAERS USING EDIT MASK 'V____________'.
1038| SHIFT FELD1A LEFT DELETING LEADING '0'.
1039| COUNT1 = 12 - STRLEN( FELD1A ).
1040| SHIFT FELD1A RIGHT DELETING TRAILING ' '.
1041|
1042| IF FELD1A < 0.
1043| COUNT1 = COUNT1 - 1.
1044| ENDIF.
1045|
1046| IF ALL_ITEMS_ITAB-MWSBP <> 0.
1047| WRITE ALL_ITEMS_ITAB-MWSBP TO FELD1B
1048| CURRENCY T001-WAERS USING EDIT MASK 'V___________'.
1049| SHIFT FELD1B LEFT DELETING LEADING '0'.
1050| SHIFT FELD1B RIGHT DELETING TRAILING ' '.
1051| ELSE.
1052| WRITE TEXT-ZER TO FELD1B.
1053| * 0 instead of "Zero tax"
1054| WRITE '0' TO FELD1B RIGHT-JUSTIFIED.
1055| ENDIF.
1056|
1057| ENDIF.
1058| ENDIF.
```
- **EN**: For pure SD billing items, compute the total amount, format tax base into FELD1A with blank count COUNT1 and tax amount into FELD1B (or '0' when zero).
- SAP 객체: VBRK, T001
- 업무 키워드: 합계 라인, 총금액, 공급가액, 세액, 공란수, SD 빌링
- English: Sum Line, Total Amount, Tax Base, Tax Amount, Blank Count
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`TOT_AMOUNT`](#decl-zfir0141-120-tot_amount), [`FELD3`](#decl-zfir0141-107-feld3), [`FELD1A`](#decl-zfir0141-101-feld1a), [`T001`](#decl-zfir0141-40-t001), [`COUNT1`](#decl-zfir0141-109-count1), [`FELD1B`](#decl-zfir0141-104-feld1b)
- 위치: `abap://ZFIR0141/ZFIR0141#L1016-L1058` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_SUM_LINE#C1`
#### [calculation] FI 전용(BKPF) 건은 총금액을 FELD3 에, 현지통화 공급가액 HWBAS 를 FELD1A 에 넣고 공란수 COUNT1 을 계산하며 세액 HWSTE 를 FELD1B 에(0 이면 '0') 세팅한다.
```abap
1061| IF CHECK_ITAB-AWTYP_SD = ' '.
1062| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
1063|
1064| TOT_AMOUNT = ALL_ITEMS_ITAB-NETWR + ALL_ITEMS_ITAB-MWSBP.
1065|
1066| WRITE TOT_AMOUNT TO FELD3 CURRENCY 'KRW'.
1067| * CURRENCY t001-waers USING EDIT MASK 'V____________'.
1068| SHIFT FELD3 LEFT DELETING LEADING '0'.
1069|
1070| WRITE ALL_ITEMS_ITAB-HWBAS CURRENCY T001-WAERS TO FELD1A.
1071|
1072| WRITE ALL_ITEMS_ITAB-HWBAS TO FELD1A
1073| CURRENCY T001-WAERS USING EDIT MASK 'V____________'.
1074| SHIFT FELD1A LEFT DELETING LEADING '0'.
1075| COUNT1 = 12 - STRLEN( FELD1A ).
1076| SHIFT FELD1A RIGHT DELETING TRAILING ' '.
1077|
1078| IF FELD1A < 0.
1079| COUNT1 = COUNT1 - 1.
1080| ENDIF.
1081|
1082| IF ALL_ITEMS_ITAB-HWSTE <> 0.
1083| WRITE ALL_ITEMS_ITAB-HWSTE CURRENCY T001-WAERS TO FELD1B.
1084|
1085| WRITE ALL_ITEMS_ITAB-HWSTE TO FELD1B
1086| CURRENCY T001-WAERS USING EDIT MASK 'V___________'.
1087| SHIFT FELD1B LEFT DELETING LEADING '0'.
1088| SHIFT FELD1B RIGHT DELETING TRAILING ' '.
1089| ELSE.
1090| WRITE TEXT-ZER TO FELD1B.
1091| * 0 instead of "zero tax"
1092| WRITE '0' TO FELD1B RIGHT-JUSTIFIED.
1093| ENDIF.
1094| ENDIF.
1095| ENDIF.
```
- **EN**: For pure FI documents, format total amount, local-currency tax base HWBAS with blank count and tax amount HWSTE into the sum line fields.
- SAP 객체: BKPF, T001
- 업무 키워드: FI 전표, 공급가액, 세액, 공란수, 합계 라인
- English: FI Document, Tax Base, Tax Amount, Blank Count
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`TOT_AMOUNT`](#decl-zfir0141-120-tot_amount), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`FELD3`](#decl-zfir0141-107-feld3), [`T001`](#decl-zfir0141-40-t001), [`FELD1A`](#decl-zfir0141-101-feld1a), [`COUNT1`](#decl-zfir0141-109-count1), [`FELD1B`](#decl-zfir0141-104-feld1b)
- 위치: `abap://ZFIR0141/ZFIR0141#L1061-L1095` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_SUM_LINE#C2`
#### [calculation] SD+FI 혼합 건은 NETWR+MWSBP 총금액을 FELD3 에, 공급가액 NETWR 을 FELD1A 에 넣고 공란수 COUNT1 을 계산하며 세액 MWSBP 를 FELD1B 에(0 이면 '0') 세팅한다.
```abap
1098| IF CHECK_ITAB-AWTYP_SD = 'VBRK'.
1099| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
1100|
1101| TOT_AMOUNT = ALL_ITEMS_ITAB-NETWR + ALL_ITEMS_ITAB-MWSBP.
1102|
1103| WRITE TOT_AMOUNT TO FELD3 CURRENCY 'KRW'.
1104| * CURRENCY t001-waers USING EDIT MASK 'V____________'.
1105|
1106| SHIFT FELD3 LEFT DELETING LEADING '0'.
1107|
1108| WRITE ALL_ITEMS_ITAB-NETWR TO FELD1A
1109| CURRENCY T001-WAERS USING EDIT MASK 'V____________'.
1110| SHIFT FELD1A LEFT DELETING LEADING '0'.
1111| COUNT1 = 12 - STRLEN( FELD1A ).
1112| SHIFT FELD1A RIGHT DELETING TRAILING ' '.
1113|
1114| IF FELD1A < 0.
1115| COUNT1 = COUNT1 - 1.
1116| ENDIF.
1117|
1118| IF ALL_ITEMS_ITAB-MWSBP <> 0.
1119|
1120| WRITE ALL_ITEMS_ITAB-MWSBP TO FELD1B
1121| CURRENCY T001-WAERS USING EDIT MASK 'V____________'.
1122| SHIFT FELD1B LEFT DELETING LEADING '0'.
1123| SHIFT FELD1B RIGHT DELETING TRAILING ' '.
1124| ELSE.
1125| WRITE TEXT-ZER TO FELD1B.
1126| * 0 instead of "Zero tax"
1127| WRITE '0' TO FELD1B RIGHT-JUSTIFIED.
1128| ENDIF.
1129| ENDIF.
1130| ENDIF.
```
- **EN**: For mixed SD+FI documents, format total amount, tax base with blank count and tax amount into the sum line fields.
- SAP 객체: T001
- 업무 키워드: SD+FI 혼합, 합계 라인, 공급가액, 세액, 공란수
- English: Sum Line, Tax Base, Tax Amount, Blank Count
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`TOT_AMOUNT`](#decl-zfir0141-120-tot_amount), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`FELD3`](#decl-zfir0141-107-feld3), [`FELD1A`](#decl-zfir0141-101-feld1a), [`T001`](#decl-zfir0141-40-t001), [`COUNT1`](#decl-zfir0141-109-count1), [`FELD1B`](#decl-zfir0141-104-feld1b)
- 위치: `abap://ZFIR0141/ZFIR0141#L1098-L1130` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_SUM_LINE#C3`
### FORM FILL_ITEM_TABLES — `ZFIR0141` L4527-L4548 (22줄)
*현재 세금계산서의 CHECK_ITAB 항목을 돌며 원천 유형별(순수 SD, SD+FI, 순수 FI)로 인쇄용 품목 라인을 채우는 하위 FORM 을 호출한다.*
> 이 unit 의 조각 1개가 11/22줄(50%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 세금계산서(BUKRS/KUNNR/STCD/AUGBL) 별 CHECK_ITAB 을 LOOP 하며 PRINT_ITEM_PURE_SD, PRINT_ITEM_SD_AND_FI, PRINT_ITEM_PURE_FI 를 차례로 호출해 품목 라인 MATZEIL1~4 를 구성한다.
```abap
4536| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4537| AND KUNNR = AUSGLOP_ITAB-KUNNR
4538| AND STCD = AUSGLOP_ITAB-STCD
4539| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4540| * SD-data
4541| PERFORM PRINT_ITEM_PURE_SD.
4542| * SD + FI-data
4543| PERFORM PRINT_ITEM_SD_AND_FI.
4544| * FI-data
4545| PERFORM PRINT_ITEM_PURE_FI.
4546| ENDLOOP.
```
- **EN**: Loop over CHECK_ITAB of the current tax invoice and dispatch to the pure-SD, SD+FI and pure-FI item filling routines.
- 호출(파서): PRINT_ITEM_PURE_SD, PRINT_ITEM_SD_AND_FI, PRINT_ITEM_PURE_FI
- 업무 키워드: 품목 라인 구성, 원천 유형, SD, FI
- English: Item Line, Billing Document, FI Document
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L4536-L4546` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#FILL_ITEM_TABLES#C1`
### FORM PRINT_ITEM_PURE_SD — `ZFIR0141` L1143-L1190 (48줄)
*순수 SD 빌링(VBRK 전용) 세금계산서의 품목 라인을 최대 4줄로 채우거나, 추가 시트 인쇄 시 품목별 평균 단가를 계산한다(인쇄용).*
> 이 unit 의 조각 2개가 37/48줄(77%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 원천이 SD 빌링(VBRK)이고 FI 전표가 없는 순수 SD 건에서 세금계산서 인쇄 모드이면 품목 수에 따라 MATZEIL1~4 를 초기화한 뒤 PRINT_LINES 로 최대 4개 품목 라인을 채운다.
```abap
1145| IF CHECK_ITAB-AWTYP_SD = 'VBRK'.
1146|
1147| IF CHECK_ITAB-AWTYP_FI = ' '.
1148| * if document is a pure SD-document --> print max. 4 lines
1149| IF CHK_PRTI = 'X'.
1150| CLEAR LINE_COUNT_PR.
1151| * if number of lines < 5
1152| * 4th Mat line in tax invoice
1153| CLEAR MATNUM.
1154| CLEAR NUMBER.
1155|
1156| IF LINE_COUNT < 5.
1157| PERFORM PRINT_LINES.
1158| ELSE.
1159| CLEAR MATZEIL1.
1160| CLEAR MATZEIL2.
1161| CLEAR MATZEIL3.
1162| CLEAR MATZEIL4.
1163| CLEAR COUNT.
1164|
1165| PERFORM PRINT_LINES.
1166| ENDIF.
```
- **EN**: For pure SD billing documents in tax invoice print mode, reset item lines and call PRINT_LINES to fill up to four item lines.
- 호출(파서): PRINT_LINES, PRINT_LINES
- SAP 객체: VBRK
- 업무 키워드: 순수 SD 빌링, 품목 라인, 세금계산서 인쇄
- English: Billing Document, Item Line, Tax Invoice
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`MATNUM`](#decl-zfir0141-281-matnum), [`NUMBER`](#decl-zfir0141-282-number), [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`COUNT`](#decl-zfir0141-124-count)
- 위치: `abap://ZFIR0141/ZFIR0141#L1145-L1166` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_PURE_SD#C1`
#### [calculation] 추가 시트 인쇄 시 해당 세금계산서의 품목별 평균 단가(NETWR/FKIMG)를 계산해 AUSGLOP_MAT_ITAB-UPRICE 에 MODIFY 한다.
```abap
1169| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1170| AND KUNNR = AUSGLOP_ITAB-KUNNR
1171| AND STCD = AUSGLOP_ITAB-STCD
1172| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1173|
1174| * calculating the unit price as the average price of the reported
1175| * material
1176| IF NOT AUSGLOP_MAT_ITAB-FKIMG IS INITIAL.
1177| AUSGLOP_MAT_ITAB-UPRICE = ( AUSGLOP_MAT_ITAB-NETWR ) /
1178| ( AUSGLOP_MAT_ITAB-FKIMG ).
1179| ELSE.
1180| AUSGLOP_MAT_ITAB-UPRICE = ' '.
1181| ENDIF.
1182| MODIFY AUSGLOP_MAT_ITAB.
1183| ENDLOOP.
```
- **EN**: For the additional sheet, compute the average unit price per material line and update AUSGLOP_MAT_ITAB.
- 테이블(파서): read - / write [AUSGLOP_MAT_ITAB](/tables/AUSGLOP_MAT_ITAB.md)
- 업무 키워드: 추가 시트, 평균 단가, 품목
- English: Additional Sheet, Unit Price
- 정의부(복사 시 함께 필요): [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L1169-L1183` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_PURE_SD#C2`
### FORM PRINT_LINES — `ZFIR0141` L1341-L1438 (98줄)
*세금계산서별 판매 품목(AUSGLOP_MAT_ITAB)을 일자·자재 순으로 정렬해 최대 4개 품목 라인(MATZEIL1~4)에 배치하고, 5개 이상이면 4번째 라인을 '외' 요약 라인으로 만든다(인쇄용).*
> 이 unit 의 조각 2개가 90/98줄(92%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] 판매 품목을 세금계산서번호·일자·자재로 정렬한 뒤 현재 세금계산서의 품목을 순서대로 1~3번째 라인 MATZEIL1~3 에 품목텍스트(ARKTX)·일자와 함께 옮기고 FILL_ITEM_AMOUNT 로 단가·수량·금액을 채운다.
```abap
1343| SORT AUSGLOP_MAT_ITAB BY AUGBL YYYYMMDD MATNR ASCENDING.
1344|
1345| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1346| AND KUNNR = AUSGLOP_ITAB-KUNNR
1347| AND STCD = AUSGLOP_ITAB-STCD
1348| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1349|
1350| LINE_COUNT_PR = LINE_COUNT_PR + 1.
1351|
1352| IF LINE_COUNT_PR = 1.
1353| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL1.
1354| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL1-ARKTX.
1355| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL1-FKIMG.
1356| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL1-BUDAT.
1357| * correct currency conversion error
1358| * LOOP AT all_items_itab WHERE bukrs = ausglop_itab-bukrs
1359| * AND kunnr = ausglop_itab-kunnr
1360| * AND stcd = ausglop_itab-stcd
1361| * AND augbl = ausglop_itab-augbl.
1362| * ausglop_mat_itab-netwr =
1363| * ausglop_mat_itab-netwr + all_items_itab-deltan.
1364| * ausglop_mat_itab-mwsbp =
1365| * ausglop_mat_itab-mwsbp + all_items_itab-deltam.
1366| * ENDLOOP.
1367|
1368| PERFORM FILL_ITEM_AMOUNT TABLES AUSGLOP_MAT_ITAB
1369| USING MATZEIL1.
1370| ENDIF.
1371|
1372| IF LINE_COUNT_PR = 2.
1373| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL2.
1374| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL2-ARKTX.
1375| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL2-BUDAT.
1376| * calculating the unit price as the average price of the reported
1377| * material
1378|
1379| PERFORM FILL_ITEM_AMOUNT TABLES AUSGLOP_MAT_ITAB
1380| USING MATZEIL2.
1381|
1382| ENDIF.
1383|
1384| IF LINE_COUNT_PR = 3.
1385| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL3.
1386| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL3-ARKTX.
1387| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL3-BUDAT.
1388| * calculating the unit price as the average price of the reported
1389| * material
1390| PERFORM FILL_ITEM_AMOUNT TABLES AUSGLOP_MAT_ITAB
1391| USING MATZEIL3.
1392| ENDIF.
```
- **EN**: Sort material lines and fill tax invoice item lines 1-3 with material text, date and amounts via FILL_ITEM_AMOUNT.
- 호출(파서): FILL_ITEM_AMOUNT, FILL_ITEM_AMOUNT, FILL_ITEM_AMOUNT
- 업무 키워드: 품목 라인, 정렬, 세금계산서 품목, 단가
- English: Item Line, Sort, Tax Invoice, Material Text
- 정의부(복사 시 함께 필요): [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3)
- 위치: `abap://ZFIR0141/ZFIR0141#L1343-L1392` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_LINES#C1`
#### [output] 품목이 5개 미만이면 4번째 품목을 MATZEIL4 에 그대로 채우고, 5개 이상이면 ALL_MAT_ITAB 의 합계 금액(KRW 편집)과 4번째 자재명·'외' 표기로 나머지 품목을 요약한 4번째 라인을 만든다.
```abap
1395| IF LINE_COUNT > 4 AND LINE_COUNT_PR = 4.
1396| MOVE AUSGLOP_MAT_ITAB-MATNR TO MATNUM.
1397| NUMBER = LINE_COUNT - 4.
1398| ENDIF.
1399|
1400| * Item 개수가 5개미만일 경우
1401| IF LINE_COUNT < 5.
1402| IF LINE_COUNT_PR = 4.
1403| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL4.
1404| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL4-ARKTX.
1405| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
1406| * calculating the unit price as the average price of the reported
1407| * material
1408| PERFORM FILL_ITEM_AMOUNT TABLES AUSGLOP_MAT_ITAB
1409| USING MATZEIL4.
1410| ENDIF.
1411| * item 개수가 5개 이상일 경우
1412| ELSE.
1413| READ TABLE ALL_MAT_ITAB WITH KEY BUKRS = AUSGLOP_ITAB-BUKRS
1414| KUNNR = AUSGLOP_ITAB-KUNNR
1415| STCD = AUSGLOP_ITAB-STCD
1416| AUGBL = AUSGLOP_ITAB-AUGBL
1417| FLAG = 'X'.
1418| IF SY-SUBRC = 0.
1419| * material description
1420| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL4-ARKTX.
1421| WRITE ALL_MAT_ITAB-NETWR CURRENCY 'KRW' TO MATZEIL4-NETWR.
1422| WRITE ALL_MAT_ITAB-MWSBP CURRENCY 'KRW' TO MATZEIL4-MWSBP.
1423| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
1424| * 4th mat line in tax invoice
1425| MOVE MATNUM TO MATZEIL4-MATNR. "2
1426| MOVE '외' TO MATZEIL4-VRKME.
1427| * MOVE number TO matzeil4-fkimg.
1428|
1429| * WRITE number TO matzeil4-uprice USING EDIT MASK'_______________'
1430| * RIGHT-JUSTIFIED.
1431| * MOVE text-034 TO matzeil4-uprice+5(3).
1432| ENDIF.
1433|
1434| ENDIF.
```
- **EN**: If fewer than five items, fill line 4 normally; otherwise build a summary fourth line with KRW totals from ALL_MAT_ITAB, the fourth material and the '외' (and others) marker.
- 호출(파서): FILL_ITEM_AMOUNT
- 업무 키워드: 요약 라인, 외 N건, 품목 수, 합계 금액
- English: Summary Line, Item Count, Total Amount
- 정의부(복사 시 함께 필요): [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`MATNUM`](#decl-zfir0141-281-matnum), [`NUMBER`](#decl-zfir0141-282-number), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`ALL_MAT_ITAB`](#decl-zfir0141-278-all_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L1395-L1434` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_LINES#C2`
### FORM FILL_ITEM_AMOUNT — `ZFIR0141` L3560-L3579 (20줄)
*품목 테이블 행의 평균 단가(공급가액/수량)를 계산하고 단가·수량·공급가액·부가세액을 KRW 통화 편집으로 세금계산서 품목 라인(MATZEIL)에 옮긴다.*
> 이 unit 의 조각 1개가 15/20줄(75%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 수량(FKIMG)이 있으면 공급가액(NETWR)/수량으로 평균 단가 UPRICE 를 계산하고, 단가·공급가액·부가세액(MWSBP)을 KRW 통화 편집으로, 수량은 그대로 세금계산서 품목 라인 구조 P_MATZEIL 에 넣는다.
```abap
3563| IF NOT P_MAT_ITAB-FKIMG IS INITIAL.
3564| P_MAT_ITAB-UPRICE = ( P_MAT_ITAB-NETWR ) / ( P_MAT_ITAB-FKIMG ).
3565| ELSE.
3566| P_MAT_ITAB-UPRICE = ' '.
3567| ENDIF.
3568|
3569| * 단가
3570| WRITE P_MAT_ITAB-UPRICE CURRENCY 'KRW' TO P_MATZEIL-UPRICE.
3571|
3572| * 수량
3573| MOVE P_MAT_ITAB-FKIMG TO P_MATZEIL-FKIMG.
3574| * 공급가액
3575| WRITE P_MAT_ITAB-NETWR CURRENCY 'KRW' TO P_MATZEIL-NETWR.
3576| * 부가세액
3577| WRITE P_MAT_ITAB-MWSBP CURRENCY 'KRW' TO P_MATZEIL-MWSBP .
```
- **EN**: Compute the average unit price as net value divided by quantity and write unit price, net value and VAT amount in KRW plus quantity into the tax invoice item line structure.
- 업무 키워드: 평균 단가, 수량, 공급가액, 부가세액, 품목 라인
- English: Unit Price, Quantity, Net Value, VAT Amount
- 위치: `abap://ZFIR0141/ZFIR0141#L3563-L3577` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#FILL_ITEM_AMOUNT#C1`
### FORM PRINT_ITEM_SD_AND_FI — `ZFIR0141` L1196-L1330 (135줄)
*SD 빌링과 FI 전표가 함께 반제된 세금계산서의 품목 라인(MATZEIL1~4)을 KRW 편집 금액으로 채우고 품목별 평균 단가를 계산한다(인쇄용).*
> 이 unit 의 조각 3개가 122/135줄(90%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] SD+FI 혼합 건에 대해 MATZEIL4_ITAB 의 공급가액·세액을 KRW 로 편집해 4번째 라인 MATZEIL4 에 넣고 특별 G/L 여부와 라인 수(LINE_COUNT2)에 따라 자재명/품목텍스트를 실제 자재 또는 TEXT-023 으로 세팅한 뒤 SDFI 플래그를 켠다.
```abap
1202| LOOP AT ALL_ITEMS_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1203| AND KUNNR = AUSGLOP_ITAB-KUNNR
1204| AND STCD = AUSGLOP_ITAB-STCD
1205| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1206|
1207| LOOP AT MATZEIL4_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1208| AND KUNNR = AUSGLOP_ITAB-KUNNR
1209| AND STCD = AUSGLOP_ITAB-STCD
1210| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1211|
1212| WRITE MATZEIL4_ITAB-NETWR CURRENCY 'KRW' TO MATZEIL4-NETWR.
1213| * MOVE matzeil4-netwr TO matzeil4-netwr.
1214| WRITE MATZEIL4_ITAB-MWSBP CURRENCY 'KRW' TO MATZEIL4-MWSBP.
1215| * MOVE matzeil4-mwsbp TO matzeil4-mwsbp.
1216| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
1217|
1218| IF CHECK_ITAB-SAVE_UMSKZ <> ' '.
1219| IF CHECK_ITAB-LINE_COUNT2 = 0.
1220| MOVE MATZEIL4_ITAB-MATNR TO MATZEIL4-MATNR.
1221| WRITE MATZEIL4_ITAB-ARKTX TO MATZEIL4-ARKTX.
1222| ELSE.
1223| MOVE TEXT-023 TO MATZEIL4-MATNR.
1224| MOVE TEXT-023 TO MATZEIL4-ARKTX.
1225| ENDIF.
1226| ELSEIF AUSGLOP_ITAB-FLAG = ' ' .
1227| MOVE TEXT-023 TO MATZEIL4-MATNR.
1228| MOVE TEXT-023 TO MATZEIL4-ARKTX.
1229| ENDIF.
1230| ENDLOOP.
1231| ENDLOOP.
1232|
1233| SDFI = 'X'.
```
- **EN**: For mixed SD+FI clearing, write net value and tax in KRW into item line 4 and set the material text depending on the special G/L indicator, then flag SDFI.
- 업무 키워드: SD+FI 혼합, 품목 라인 4, 특별 G/L, 품목 텍스트
- English: Billing Document, FI Document, Item Line, Special G/L Indicator
- 정의부(복사 시 함께 필요): [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`MATZEIL4_ITAB`](#decl-zfir0141-367-matzeil4_itab), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`SDFI`](#decl-zfir0141-481-sdfi)
- 위치: `abap://ZFIR0141/ZFIR0141#L1202-L1233` · confidence 0.75 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_SD_AND_FI#C1`
#### [calculation] 세금계산서 인쇄 시 품목 수가 4 미만이면 AUSGLOP_MAT_ITAB 각 품목의 평균 단가(NETWR/FKIMG)를 계산해 단가·수량·공급가액·세액을 KRW 편집으로 MATZEIL1~3 에 채우고, 4 이상이면 ALL_ITEMS_SD_ITAB 합계를 MATZEIL4 에 TEXT-030 품명으로 요약한다.
```abap
1235| IF CHK_PRTI = 'X'.
1236| LINE_COUNT_PR = 0.
1237| * if number of lines < 4
1238| IF LINE_COUNT < 4.
1239| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1240| AND KUNNR = AUSGLOP_ITAB-KUNNR
1241| AND STCD = AUSGLOP_ITAB-STCD
1242| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1243| LINE_COUNT_PR = LINE_COUNT_PR + 1.
1244|
1245| * calculating the unit price as the average price of the reported
1246| * material
1247| IF NOT AUSGLOP_MAT_ITAB-FKIMG IS INITIAL.
1248| AUSGLOP_MAT_ITAB-UPRICE = ( AUSGLOP_MAT_ITAB-NETWR ) /
1249| ( AUSGLOP_MAT_ITAB-FKIMG ).
1250| ELSE.
1251| AUSGLOP_MAT_ITAB-UPRICE = ' '.
1252| ENDIF.
1253|
1254| IF LINE_COUNT_PR = 1.
1255| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL1.
1256| WRITE AUSGLOP_MAT_ITAB-UPRICE CURRENCY 'KRW'
1257| TO MATZEIL1-UPRICE.
1258| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL1-FKIMG.
1259| WRITE AUSGLOP_MAT_ITAB-NETWR CURRENCY 'KRW'
1260| TO MATZEIL1-NETWR.
1261| WRITE AUSGLOP_MAT_ITAB-MWSBP CURRENCY 'KRW'
1262| TO MATZEIL1-MWSBP.
1263| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL1-BUDAT.
1264|
1265| ENDIF.
1266|
1267| IF LINE_COUNT_PR = 2.
1268| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL2.
1269| WRITE AUSGLOP_MAT_ITAB-UPRICE CURRENCY 'KRW'
1270| TO MATZEIL2-UPRICE.
1271| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL2-FKIMG.
1272| WRITE AUSGLOP_MAT_ITAB-NETWR CURRENCY 'KRW'
1273| TO MATZEIL2-NETWR.
1274| WRITE AUSGLOP_MAT_ITAB-MWSBP CURRENCY 'KRW'
1275| TO MATZEIL2-MWSBP.
1276| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL2-BUDAT.
1277| ENDIF.
1278|
1279| IF LINE_COUNT_PR = 3.
1280| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL3.
1281| WRITE AUSGLOP_MAT_ITAB-UPRICE CURRENCY T001-WAERS
1282| TO MATZEIL3-UPRICE.
1283|
1284| WRITE AUSGLOP_MAT_ITAB-UPRICE CURRENCY 'KRW'
1285| TO MATZEIL3-UPRICE.
1286| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL3-FKIMG.
1287| WRITE AUSGLOP_MAT_ITAB-NETWR CURRENCY 'KRW'
1288| TO MATZEIL3-NETWR.
1289| WRITE AUSGLOP_MAT_ITAB-MWSBP CURRENCY 'KRW'
1290| TO MATZEIL3-MWSBP.
1291| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL3-BUDAT.
1292| ENDIF.
1293|
1294| ENDLOOP.
1295|
1296| * if number of lines >=4
1297| ELSE.
1298| LOOP AT ALL_ITEMS_SD_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1299| AND KUNNR = AUSGLOP_ITAB-KUNNR
1300| AND STCD = AUSGLOP_ITAB-STCD
1301| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1302| WRITE ALL_ITEMS_ITAB-NETWR CURRENCY 'KRW' TO MATZEIL4-NETWR.
1303| WRITE ALL_ITEMS_ITAB-MWSBP CURRENCY 'KRW' TO MATZEIL4-MWSBP.
1304| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
1305| MOVE TEXT-030 TO MATZEIL4-MATNR.
1306| ENDLOOP.
1307| ENDIF.
```
- **EN**: When printing the tax invoice, compute the average unit price per material and fill item lines 1-3 in KRW if fewer than 4 lines, otherwise summarize SD totals into line 4 with text TEXT-030.
- SAP 객체: T001
- 업무 키워드: 평균 단가, 품목 라인, 세금계산서 인쇄, 요약 라인
- English: Unit Price, Item Line, Tax Invoice, Summary Line
- 정의부(복사 시 함께 필요): [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`T001`](#decl-zfir0141-40-t001), [`ALL_ITEMS_SD_ITAB`](#decl-zfir0141-286-all_items_sd_itab) 외 2건
- 위치: `abap://ZFIR0141/ZFIR0141#L1235-L1307` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_SD_AND_FI#C2`
#### [calculation] 추가 시트 인쇄 시 AUSGLOP_MAT_ITAB 각 품목의 평균 단가(NETWR/FKIMG)를 계산해 UPRICE 에 MODIFY 로 반영한다.
```abap
1310| ELSE.
1311| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
1312| AND KUNNR = AUSGLOP_ITAB-KUNNR
1313| AND STCD = AUSGLOP_ITAB-STCD
1314| AND AUGBL = AUSGLOP_ITAB-AUGBL.
1315| * calculating the unit price as the average price of the reported
1316| * material
1317| IF NOT AUSGLOP_MAT_ITAB-FKIMG IS INITIAL.
1318|
1319| AUSGLOP_MAT_ITAB-UPRICE = ( AUSGLOP_MAT_ITAB-NETWR ) /
1320| ( AUSGLOP_MAT_ITAB-FKIMG ).
1321| ELSE.
1322| AUSGLOP_MAT_ITAB-UPRICE = ' '.
1323| ENDIF.
1324| MODIFY AUSGLOP_MAT_ITAB.
1325| ENDLOOP.
1326| ENDIF.
```
- **EN**: For the additional sheet, compute the average unit price per material line and update AUSGLOP_MAT_ITAB.
- 테이블(파서): read - / write [AUSGLOP_MAT_ITAB](/tables/AUSGLOP_MAT_ITAB.md)
- 업무 키워드: 추가 시트, 평균 단가, 품목 갱신
- English: Additional Sheet, Unit Price
- 정의부(복사 시 함께 필요): [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L1310-L1326` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_SD_AND_FI#C3`
### FORM PRINT_ITEM_PURE_FI — `ZFIR0141` L3588-L3636 (49줄)
*순수 FI 전표(BKPF 전용)로 반제된 세금계산서의 첫 품목 라인 MATZEIL1 을 전표 텍스트(SGTXT)와 KRW 편집된 공급가액·세액으로 채운다.*
> 이 unit 의 조각 1개가 42/49줄(86%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 원천이 FI 전표(BKPF)이고 SD 빌링이 없는 경우 ALL_ITEMS_ITAB 을 돌며 세금계산서번호로 AUSGLOP_ITAB 을 READ 해 전기일을 넣고 전표 항목 텍스트(SGTXT)를 '/' 로 SPLIT 해 품명·수량·단위로 분리하며 공급가액(HWBAS)·세액(HWSTE)을 KRW 로 편집해 MATZEIL1 에 넣고, 특별 G/L 지시자(SAVE_UMSKZ)가 있으면 MATZEIL1_ITAB 의 자재명으로 대체한다.
```abap
3594| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
3595| IF CHECK_ITAB-AWTYP_SD = ' '.
3596| * if the cleared invoices are pure FI-documents fill first line
3597| CLEAR MATZEIL1.
3598| LOOP AT ALL_ITEMS_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
3599| AND KUNNR = AUSGLOP_ITAB-KUNNR
3600| AND STCD = AUSGLOP_ITAB-STCD
3601| AND AUGBL = AUSGLOP_ITAB-AUGBL.
3602|
3603| * READ TABLE ausglop_itab INDEX l_lines.
3604| READ TABLE AUSGLOP_ITAB WITH KEY AUGBL = ALL_ITEMS_ITAB-AUGBL.
3605|
3606| IF SY-SUBRC EQ 0.
3607| MOVE AUSGLOP_ITAB-BUDAT TO MATZEIL1-BUDAT.
3608| ENDIF.
3609|
3610| SPLIT AUSGLOP_ITAB-SGTXT AT '/' INTO MATZEIL1-MATNR
3611| MATZEIL1-FKIMG
3612| MATZEIL1-VRKME.
3613|
3614| WRITE ALL_ITEMS_ITAB-HWBAS TO MATZEIL1-NETWR CURRENCY 'KRW'.
3615| WRITE ALL_ITEMS_ITAB-HWSTE TO MATZEIL1-MWSBP CURRENCY 'KRW'.
3616|
3617| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
3618| AND KUNNR = AUSGLOP_ITAB-KUNNR
3619| AND STCD = AUSGLOP_ITAB-STCD
3620| AND AUGBL = AUSGLOP_ITAB-AUGBL.
3621| IF CHECK_ITAB-SAVE_UMSKZ = ' '.
3622| * MOVE text-030 TO matzeil1-matnr.
3623| ELSE.
3624| LOOP AT MATZEIL1_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
3625| AND KUNNR = AUSGLOP_ITAB-KUNNR
3626| AND STCD = AUSGLOP_ITAB-STCD
3627| AND AUGBL = AUSGLOP_ITAB-AUGBL.
3628| MOVE MATZEIL1_ITAB-MATNR TO MATZEIL1-MATNR.
3629| ENDLOOP.
3630| ENDIF.
3631| ENDLOOP.
3632| ENDLOOP.
3633| ENDIF.
3634|
3635| ENDIF.
```
- **EN**: For pure FI documents, fill the first tax invoice item line MATZEIL1 by splitting the line item text SGTXT into material/quantity/unit and writing tax base and tax amount in KRW; override the material with MATZEIL1_ITAB when a special G/L indicator exists.
- SAP 객체: BKPF
- 업무 키워드: 순수 FI 전표, 품목 라인, 전표 텍스트 분리, 공급가액, 세액, 특별 G/L
- English: FI Document, Item Line, Line Item Text, Tax Base, Special G/L Indicator
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`MATZEIL4_ITAB`](#decl-zfir0141-367-matzeil4_itab), [`MATZEIL1_ITAB`](#decl-zfir0141-385-matzeil1_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L3594-L3635` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_PURE_FI#C1`
### FORM FILL_AMOUNT — `ZFIR0141` L3029-L3134 (106줄)
*세금계산서 상단의 공급가액·세액을 자릿수별 칸(AMT_BASE/AMT_TAX)에 한 자리씩 배치하고 발행일·전표수·사업장 주소와 함께 WRITE 한다.*
> 이 unit 의 조각 2개가 49/106줄(46%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 사업장 주소를 합치고 공급가액(A)과 세액(T)을 EDIT MASK 로 좌·우 정렬한 뒤 각 자리를 AMT_BASE/AMT_TAX 의 2칸 간격 위치에 한 자리씩 WRITE 하여 세금계산서 금액란(자릿수 칸) 형식으로 변환한다.
```abap
3036| CONCATENATE BUPLA_ADRESSE-CITY1 BUPLA_ADRESSE-STREET INTO L_AAA.
3037|
3038| ***** CLEAR : yy,mm,dd, l_last_date, l_date.
3039|
3040| WRITE A TO BASE USING EDIT MASK 'LL____________'.
3041| WRITE BASE TO BASE USING EDIT MASK 'RR____________'.
3042|
3043| WRITE BASE+1 TO AMT_BASE+0(1).
3044| WRITE BASE+2 TO AMT_BASE+2(1).
3045| WRITE BASE+3 TO AMT_BASE+4(1).
3046| WRITE BASE+4 TO AMT_BASE+6(1).
3047| WRITE BASE+5 TO AMT_BASE+8(1).
3048| WRITE BASE+6 TO AMT_BASE+10(1).
3049| WRITE BASE+7 TO AMT_BASE+12(1).
3050| WRITE BASE+8 TO AMT_BASE+14(1).
3051| WRITE BASE+9 TO AMT_BASE+16(1).
3052| WRITE BASE+10 TO AMT_BASE+18(1).
3053| WRITE BASE+11 TO AMT_BASE+20(1).
3054|
3055| WRITE T TO TAX USING EDIT MASK 'LL___________'.
3056| WRITE TAX TO TAX USING EDIT MASK 'RR___________'.
3057|
3058| WRITE TAX+1 TO AMT_TAX+0(1).
3059| WRITE TAX+2 TO AMT_TAX+2(1).
3060| WRITE TAX+3 TO AMT_TAX+4(1).
3061| WRITE TAX+4 TO AMT_TAX+6(1).
3062| WRITE TAX+5 TO AMT_TAX+8(1).
3063| WRITE TAX+6 TO AMT_TAX+10(1).
3064| WRITE TAX+7 TO AMT_TAX+12(1).
3065| WRITE TAX+8 TO AMT_TAX+14(1).
3066| WRITE TAX+9 TO AMT_TAX+16(1).
3067| WRITE TAX+10 TO AMT_TAX+18(1).
```
- **EN**: Concatenate the business place address and split the tax base and tax amount digit by digit into the boxed amount fields AMT_BASE and AMT_TAX of the tax invoice form.
- 업무 키워드: 공급가액, 세액, 자릿수 칸, 금액 편집, 사업장 주소
- English: Tax Base, Tax Amount, Digit Boxes, EDIT MASK
- 정의부(복사 시 함께 필요): [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`L_AAA`](#decl-zfir0141-3035-l_aaa), [`BASE`](#decl-zfir0141-469-base), [`AMT_BASE`](#decl-zfir0141-470-amt_base), [`TAX`](#decl-zfir0141-471-tax), [`AMT_TAX`](#decl-zfir0141-472-amt_tax)
- 위치: `abap://ZFIR0141/ZFIR0141#L3036-L3067` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#FILL_AMOUNT#C1`
#### [output] 발행일(YY1/MM1/DD1)·전표 수(COUNT1)·자릿수별 공급가액·세액·사업장 주소를 세금계산서 상단 라인에 WRITE 한다.
```abap
3115| WRITE:/ TEXT-CA2, 2 TEXT-CA5,
3116| 2 YY1,
3117| 5 MM1,
3118| 8 DD1,
3119| * 2 byear,
3120| * 5 bmonth,
3121| * 8 bday,
3122| 12 COUNT1,
3123| 16 TEXT-CA2, 17 AMT_BASE, 39 AMT_TAX, 117 TEXT-CA2,
3124|
3125| 60 '주 소 :',
3126| 71 L_AAA.
3127|
3128|
3129|
3130|
3131| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print the issue date, document count, boxed tax base/tax amounts and address on the tax invoice header line.
- 업무 키워드: 세금계산서 상단, 발행일, 공급가액, 세액 출력
- English: Tax Invoice, Issue Date, WRITE
- 정의부(복사 시 함께 필요): [`YY1`](#decl-zfir0141-115-yy1), [`MM1`](#decl-zfir0141-115-mm1), [`DD1`](#decl-zfir0141-115-dd1), [`COUNT1`](#decl-zfir0141-109-count1), [`AMT_BASE`](#decl-zfir0141-470-amt_base), [`AMT_TAX`](#decl-zfir0141-472-amt_tax), [`L_AAA`](#decl-zfir0141-3035-l_aaa)
- 위치: `abap://ZFIR0141/ZFIR0141#L3115-L3131` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#FILL_AMOUNT#C2`
### FORM WRITE_ITEM_SD — `ZFIR0141` L4611-L4671 (61줄)
*SD 빌링 기준 세금계산서 품목 라인 한 줄의 공급가액·세액 부호와 정렬을 정리한 뒤 월/일·품목·단위·수량·단가·공급가액·세액을 WRITE 로 인쇄한다.*
> 이 unit 의 조각 2개가 51/61줄(84%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 전기일에서 월·일을 추출하고 공급가액(NETWR)·세액(MWSBP) 문자열의 '-' 부호를 앞으로 옮긴 뒤 CIRCULAR SHIFT 로 우측 정렬한다.
```abap
4616| MM = P_MATZEIL-BUDAT+4(2). DD = P_MATZEIL-BUDAT+6(2).
4617| * 마이너스부호 앞으로 보낸다
4618| IF P_MATZEIL-NETWR CA '-'.
4619| SHIFT P_MATZEIL-NETWR RIGHT CIRCULAR.
4620| ENDIF.
4621| CONDENSE P_MATZEIL-NETWR NO-GAPS.
4622| * 오른쪽 정렬
4623| L_LEN = STRLEN( P_MATZEIL-NETWR ).
4624| DO L_LEN TIMES.
4625| SHIFT P_MATZEIL-NETWR CIRCULAR.
4626| ENDDO.
4627| * 마이너스부호 앞으로 보낸다
4628| IF P_MATZEIL-MWSBP CA '-'.
4629| SHIFT P_MATZEIL-MWSBP RIGHT CIRCULAR.
4630| ENDIF.
4631| CONDENSE P_MATZEIL-MWSBP NO-GAPS.
4632| * 오른쪽 정렬
4633| L_LEN = STRLEN( P_MATZEIL-MWSBP ).
4634| DO L_LEN TIMES.
4635| SHIFT P_MATZEIL-MWSBP CIRCULAR.
4636| ENDDO.
```
- **EN**: Extract month/day from the posting date and normalize sign and right-alignment of net value and tax amount strings.
- 업무 키워드: 월/일 추출, 음수 부호, 우측 정렬, 금액 편집
- English: Formatting, Sign Handling, Posting Date
- 정의부(복사 시 함께 필요): [`MM`](#decl-zfir0141-4613-mm), [`DD`](#decl-zfir0141-4613-dd), [`L_LEN`](#decl-zfir0141-4613-l_len)
- 위치: `abap://ZFIR0141/ZFIR0141#L4616-L4636` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_SD#C1`
#### [output] 월/일(0 이면 공백)·자재·판매단위·수량·단가·공급가액·세액을 KRW 통화 형식으로 세금계산서 양식 컬럼 위치에 WRITE 한다.
```abap
4640| WRITE: / TEXT-CA2.
4641| IF MM = 0. WRITE: 2 ' '. ELSE. WRITE: 2 MM. ENDIF.
4642| WRITE: 5 TEXT-CA2.
4643| IF DD = 0. WRITE: 6 ' '. ELSE. WRITE: 6 DD. ENDIF.
4644| WRITE:10 TEXT-CA2,
4645| 11 P_MATZEIL-MATNR,
4646| 38 TEXT-CA2,
4647| 39 P_MATZEIL-VRKME, 44 TEXT-CA2, 45 P_MATZEIL-FKIMG(8),
4648|
4649|
4650| 54 TEXT-CA2,
4651| 55 P_MATZEIL-UPRICE CURRENCY 'KRW', 72 TEXT-CA2,
4652|
4653| 73 P_MATZEIL-NETWR CURRENCY 'KRW', 89 TEXT-CA2,
4654|
4655| 90 P_MATZEIL-MWSBP CURRENCY 'KRW', 103 TEXT-CA2,
4656|
4657| 117 TEXT-CA2.
4658|
4659|
4660| * 수정전 로직 2004.4.23
4661| * 11 p_matzeil-matnr,
4662| * 28 text-ca2,
4663| * 29 p_matzeil-vrkme, 34 text-ca2, 35 p_matzeil-fkimg(8),
4664| * 45 text-ca2,
4665| * 46 p_matzeil-uprice CURRENCY 'KRW', 63 text-ca2,
4666| * 64 p_matzeil-netwr CURRENCY 'KRW', 82 text-ca2,
4667| * 83 p_matzeil-mwsbp CURRENCY 'KRW', 98 text-ca2,
4668| * 117 text-ca2.
4669| WRITE: / TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print month/day, material, sales unit, quantity, unit price, net value and tax amount in KRW at fixed tax invoice columns.
- 업무 키워드: 세금계산서 인쇄, 품목 라인, SD 빌링, 공급가액, 세액
- English: Tax Invoice, Item Line, Billing, WRITE
- 정의부(복사 시 함께 필요): [`MM`](#decl-zfir0141-4613-mm), [`DD`](#decl-zfir0141-4613-dd)
- 위치: `abap://ZFIR0141/ZFIR0141#L4640-L4669` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_SD#C2`
### FORM WRITE_ITEM_FI — `ZFIR0141` L4679-L4773 (95줄)
*FI 전표 기준 세금계산서 품목 라인 한 줄의 단가를 공급가액/수량으로 계산하고 금액 부호·정렬을 정리한 뒤 월/일·품목·단위·수량·단가·공급가액·세액을 WRITE 로 인쇄한다.*
> 이 unit 의 조각 3개가 82/95줄(86%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 수량(FKIMG)을 숫자로 변환하고 FM Z_FI_COMMA_DEL 로 공급가액(NETWR)의 콤마를 제거한 뒤 공급가액/수량/100 으로 인쇄용 단가(L_DANGA)를 계산한다.
```abap
4688| WRITE P_MATZEIL-FKIMG TO LN_FKIMG.
4689|
4690| CALL FUNCTION 'Z_FI_COMMA_DEL'
4691| EXPORTING
4692| INPUT = P_MATZEIL-NETWR
4693| IMPORTING
4694| OUTPUT = LN_NETWR.
4695|
4696| * O으로 나눌수 없다.
4697| IF LN_FKIMG NE ' ' OR LN_FKIMG NE 0.
4698| L_DANGA = LN_NETWR / LN_FKIMG.
4699| L_DANGA = L_DANGA / 100.
4700| ENDIF.
```
- **EN**: Convert quantity to numeric, strip commas from net value via FM Z_FI_COMMA_DEL and compute the unit price as net value divided by quantity (scaled by 100).
- 호출(파서): Z_FI_COMMA_DEL
- SAP 객체: Z_FI_COMMA_DEL
- 업무 키워드: 단가 계산, 수량, 공급가액, 콤마 제거
- English: Unit Price, Quantity, Net Value
- 정의부(복사 시 함께 필요): [`LN_FKIMG`](#decl-zfir0141-4681-ln_fkimg), [`LN_NETWR`](#decl-zfir0141-4681-ln_netwr), [`L_DANGA`](#decl-zfir0141-4680-l_danga)
- 위치: `abap://ZFIR0141/ZFIR0141#L4688-L4700` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_FI#C1`
#### [calculation] 수량·공급가액·세액 문자열을 CIRCULAR SHIFT 로 우측 정렬하고 음수면 '-' 부호를 앞으로 옮겨 세금계산서 인쇄 형식으로 정리한다.
```abap
4702| L_LEN = STRLEN( P_MATZEIL-FKIMG ).
4703| DO L_LEN TIMES.
4704| SHIFT P_MATZEIL-FKIMG CIRCULAR.
4705| ENDDO.
4706|
4707| * 마이너스부호 앞으로 보내고 오른쪽 정렬
4708| IF P_MATZEIL-NETWR CA '-'.
4709| SHIFT P_MATZEIL-NETWR RIGHT CIRCULAR.
4710| ENDIF.
4711| CONDENSE P_MATZEIL-NETWR NO-GAPS.
4712|
4713| L_LEN = STRLEN( P_MATZEIL-NETWR ).
4714| DO L_LEN TIMES.
4715| SHIFT P_MATZEIL-NETWR CIRCULAR.
4716| ENDDO.
4717|
4718| * 마이너스부호 앞으로 보내고 오른쪽 정렬
4719| IF P_MATZEIL-MWSBP CA '-'.
4720| SHIFT P_MATZEIL-MWSBP RIGHT CIRCULAR.
4721| ENDIF.
4722| CONDENSE P_MATZEIL-MWSBP NO-GAPS.
4723|
4724| L_LEN = STRLEN( P_MATZEIL-MWSBP ).
4725| DO L_LEN TIMES.
4726| SHIFT P_MATZEIL-MWSBP CIRCULAR.
4727| ENDDO.
```
- **EN**: Right-align quantity, net value and tax amount strings and move the minus sign to the front for printing.
- 업무 키워드: 우측 정렬, 음수 부호, 금액 편집
- English: Formatting, Sign Handling
- 정의부(복사 시 함께 필요): [`L_LEN`](#decl-zfir0141-4680-l_len)
- 위치: `abap://ZFIR0141/ZFIR0141#L4702-L4727` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_FI#C2`
#### [output] 월/일(0 이면 공백)·자재·단위·수량·단가(0 이면 공백)·공급가액·세액을 KRW 통화 형식으로 세금계산서 양식 컬럼 위치에 WRITE 한다.
```abap
4729| WRITE: / TEXT-CA2.
4730| IF MM = 0. WRITE: 2 ' '. ELSE. WRITE: 2 MM. ENDIF.
4731| WRITE: 5 TEXT-CA2.
4732| IF DD = 0. WRITE: 6 ' '. ELSE. WRITE: 6 DD. ENDIF.
4733| WRITE:10 TEXT-CA2,
4734| 11 P_MATZEIL-MATNR, 38 TEXT-CA2,
4735| 39 P_MATZEIL-VRKME, 44 TEXT-CA2, 45 P_MATZEIL-FKIMG+5(8),
4736|
4737| 54 TEXT-CA2.
4738|
4739| IF L_DANGA EQ 0.
4740|
4741| WRITE:55 ' '.
4742|
4743| ELSE.
4744|
4745| WRITE:55 L_DANGA CURRENCY 'KRW'.
4746|
4747| ENDIF.
4748|
4749|
4750| WRITE:72 TEXT-CA2,
4751| * 46 p_matzeil-uprice CURRENCY 'KRW', 63 text-ca2,
4752| 73 P_MATZEIL-NETWR CURRENCY 'KRW', 89 TEXT-CA2,
4753| 90 P_MATZEIL-MWSBP CURRENCY 'KRW', 103 TEXT-CA2,
4754| 117 TEXT-CA2.
4755|
4756|
4757| * 11 p_matzeil-matnr, 28 text-ca2,
4758| * 29 p_matzeil-vrkme, 34 text-ca2, 35 p_matzeil-fkimg+5(8),
4759| * 45 text-ca2.
4760| * IF l_danga EQ 0.
4761| * WRITE:46 ' '.
4762| * ELSE.
4763| * WRITE:46 l_danga CURRENCY 'KRW'.
4764| * ENDIF.
4765| *
4766| * WRITE:63 text-ca2,
4767| ** 46 p_matzeil-uprice CURRENCY 'KRW', 63 text-ca2,
4768| * 64 p_matzeil-netwr CURRENCY 'KRW', 82 text-ca2,
4769| * 83 p_matzeil-mwsbp CURRENCY 'KRW', 98 text-ca2,
4770| * 117 text-ca2.
4771| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print month/day, material, unit, quantity, unit price, net value and tax amount in KRW at fixed tax invoice columns.
- 업무 키워드: 세금계산서 인쇄, 품목 라인, 공급가액, 세액
- English: Tax Invoice, Item Line, WRITE
- 정의부(복사 시 함께 필요): [`MM`](#decl-zfir0141-4680-mm), [`DD`](#decl-zfir0141-4680-dd), [`L_DANGA`](#decl-zfir0141-4680-l_danga)
- 위치: `abap://ZFIR0141/ZFIR0141#L4729-L4771` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_FI#C3`
### FORM CHECK_RECEIPT — `ZFIR0141` L3232-L3266 (35줄)
*세금계산서 하단 '영수' 구분 영역에 합계금액(FELD3)을 부호 정리·우측정렬해 WRITE 하고 영수 체크 아이콘과 '이 금액을 영수함' 문구를 표시한다.*
> 이 unit 의 조각 2개가 28/35줄(80%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 합계금액 FELD3 을 문자로 편집하고 음수면 '-' 부호를 맨 앞으로 옮긴 뒤 공백을 제거하고 CIRCULAR SHIFT 로 우측 정렬한다.
```abap
3236| WRITE FELD3 TO L_TOTAL.
3237|
3238| * 마이너스부호 앞으로 보낸다
3239| IF L_TOTAL CA '-'.
3240| SHIFT L_TOTAL RIGHT CIRCULAR.
3241| ENDIF.
3242| CONDENSE L_TOTAL NO-GAPS.
3243| * 오른쪽 정렬
3244| L_LEN = STRLEN( L_TOTAL ).
3245| DO L_LEN TIMES.
3246| SHIFT L_TOTAL CIRCULAR.
3247| ENDDO.
```
- **EN**: Format the total amount, move the minus sign to the front, condense and right-align it for the tax invoice footer.
- 업무 키워드: 합계금액, 음수 부호, 우측 정렬
- English: Total Amount, Sign Handling, Formatting
- 정의부(복사 시 함께 필요): [`FELD3`](#decl-zfir0141-107-feld3), [`L_TOTAL`](#decl-zfir0141-3233-l_total), [`L_LEN`](#decl-zfir0141-3233-l_len)
- 위치: `abap://ZFIR0141/ZFIR0141#L3236-L3247` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#CHECK_RECEIPT#C1`
#### [output] 세금계산서 하단에 합계금액과 '영수' 구분(ICON_CHECKED) 및 '이 금액을 … 함' 문구를 양식 위치에 맞춰 WRITE 로 인쇄한다.
```abap
3249| WRITE:/ TEXT-CA2, 2 TEXT-YA5 COLOR COL_BACKGROUND INTENSIFIED OFF,
3250| 80 TEXT-CA2, 94 ICON_CHECKED AS ICON,
3251| 98 TEXT-YA7 COLOR COL_BACKGROUND INTENSIFIED OFF,
3252| 117 TEXT-CA2.
3253|
3254| WRITE:/ TEXT-C13,
3255| 84 '이 금액을' COLOR COL_BACKGROUND INTENSIFIED OFF,
3256| 117 TEXT-CA2,
3257| 105 '함' COLOR COL_BACKGROUND INTENSIFIED OFF.
3258|
3259| WRITE:/ TEXT-CA2, 2 TEXT-YA6 COLOR COL_BACKGROUND INTENSIFIED OFF,
3260| 3 L_TOTAL, 80 TEXT-CA2,
3261| 98 TEXT-YA8 COLOR COL_BACKGROUND INTENSIFIED OFF,
3262| 117 TEXT-CA2.
3263|
3264| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print the tax invoice footer with the total amount, the receipt (영수) check icon and the receipt statement text.
- SAP 객체: ICON_CHECKED
- 업무 키워드: 세금계산서 하단, 영수 구분, 합계금액 출력
- English: Tax Invoice, Receipt Indicator, WRITE
- 정의부(복사 시 함께 필요): [`L_TOTAL`](#decl-zfir0141-3233-l_total)
- 위치: `abap://ZFIR0141/ZFIR0141#L3249-L3264` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#CHECK_RECEIPT#C2`
### FORM CHECK_BILLING — `ZFIR0141` L3275-L3307 (33줄)
*세금계산서 하단 '청구' 구분 영역에 합계금액(FELD3)을 부호 정리·우측정렬해 WRITE 하고 청구 체크 아이콘을 표시한다.*
> 이 unit 의 조각 2개가 26/33줄(79%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 합계금액 FELD3 을 문자로 편집하고 음수면 '-' 부호를 맨 앞으로 옮긴 뒤 공백을 제거하고 CIRCULAR SHIFT 로 우측 정렬한다.
```abap
3279| WRITE FELD3 TO L_TOTAL.
3280|
3281| * 마이너스부호 앞으로 보낸다
3282| IF L_TOTAL CA '-'.
3283| SHIFT L_TOTAL RIGHT CIRCULAR.
3284| ENDIF.
3285| CONDENSE L_TOTAL NO-GAPS.
3286| * 오른쪽 정렬
3287| L_LEN = STRLEN( L_TOTAL ).
3288| DO L_LEN TIMES.
3289| SHIFT L_TOTAL CIRCULAR.
3290| ENDDO.
```
- **EN**: Format the total amount, move the minus sign to the front, condense and right-align it for the tax invoice footer.
- 업무 키워드: 합계금액, 음수 부호, 우측 정렬, 금액 편집
- English: Total Amount, Sign Handling, Formatting
- 정의부(복사 시 함께 필요): [`FELD3`](#decl-zfir0141-107-feld3), [`L_TOTAL`](#decl-zfir0141-3276-l_total), [`L_LEN`](#decl-zfir0141-3276-l_len)
- 위치: `abap://ZFIR0141/ZFIR0141#L3279-L3290` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#CHECK_BILLING#C1`
#### [output] 세금계산서 하단에 합계금액과 '청구' 구분(ICON_CHECKED)을 양식 위치에 맞춰 WRITE 로 인쇄한다.
```abap
3292| WRITE:/ TEXT-CA2, 2 TEXT-YA5 COLOR COL_BACKGROUND INTENSIFIED OFF,
3293| 80 TEXT-CA2, 98 TEXT-YA7 COLOR COL_BACKGROUND INTENSIFIED OFF,
3294| 117 TEXT-CA2.
3295|
3296| WRITE:/ TEXT-C13, 117 TEXT-CA2.
3297|
3298| WRITE:/ TEXT-CA2, 2 TEXT-YA6 COLOR COL_BACKGROUND INTENSIFIED OFF,
3299| 3 L_TOTAL,
3300| 80 TEXT-CA2,
3301| 94 ICON_CHECKED AS ICON,
3302| 98 TEXT-YA8 COLOR COL_BACKGROUND INTENSIFIED OFF,
3303| 117 TEXT-CA2.
3304|
3305| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print the footer of the tax invoice with the total amount and the 'billing' (청구) check icon.
- SAP 객체: ICON_CHECKED
- 업무 키워드: 세금계산서 하단, 청구 구분, 합계금액 출력
- English: Tax Invoice, Billing Indicator, WRITE
- 정의부(복사 시 함께 필요): [`L_TOTAL`](#decl-zfir0141-3276-l_total)
- 위치: `abap://ZFIR0141/ZFIR0141#L3292-L3305` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#CHECK_BILLING#C2`
### FORM SMARTBILL_TRANS — `ZFIR0141` L4829-L5144 (316줄)
*선택된 세금계산서를 스마트빌 전송용 헤더(GT_ZSBBSEG)·품목(GT_ZSBISSUE) 데이터로 변환하고 사업자단위과세 적용 시 공급자 정보를 대표 사업장으로 바꾼 뒤 이메일 확인 팝업(화면 100)을 띄운다.*
> 이 unit 의 조각 10개가 208/316줄(66%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [aggregation] 출력 대상을 고객·사업장·세금계산서번호로 정렬하고 세금계산서(AUGBL)별 전표를 DOC_CNT_ITAB 에 모아 마지막 전표를 읽으며, 판매 품목 수(LINE_COUNT)를 세고 고객 유형별 헤더 파트1을 KIND_OF_CUSTOMERS_SMARTBILL 로 채운다.
```abap
4831| SORT AUSGLOP_ITAB BY KUNNR BUPLA AUGBL.
4832| LOOP AT AUSGLOP_ITAB.
4833|
4834| LINE_COUNT_PR = 0.
4835| SEL_INDEX = SY-TABIX.
4836| GT_CNT = 0.
4837|
4838| * AT NEW AUGBL.
4839| CLEAR L_LINES.
4840| CLEAR DOC_CNT_ITAB.
4841| REFRESH DOC_CNT_ITAB.
4842|
4843| LOOP AT AUSGLOP_ITAB WHERE AUGBL = AUSGLOP_ITAB-AUGBL.
4844|
4845| MOVE AUSGLOP_ITAB TO DOC_CNT_ITAB.
4846| APPEND DOC_CNT_ITAB.
4847| ENDLOOP.
4848|
4849|
4850| SORT DOC_CNT_ITAB BY BUDAT BELNR .
4851|
4852| DESCRIBE TABLE DOC_CNT_ITAB LINES L_LINES.
4853|
4854| READ TABLE DOC_CNT_ITAB INDEX L_LINES.
4855|
4856| IF AUSGLOP_ITAB-AUGBL NE AUGBL.
4857| READ TABLE AUSGLOP_ITAB INDEX SEL_INDEX.
4858| CLEAR AUSGLOP_MAT_ITAB.
4859| CLEAR ALL_ITEMS_ITAB.
4860|
4861| * number of item lines in ausglop_mat_itab --> number of sold
4862| * materials
4863| LINE_COUNT = 0.
4864| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4865| AND KUNNR = AUSGLOP_ITAB-KUNNR
4866| AND STCD = AUSGLOP_ITAB-STCD
4867| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4868| LINE_COUNT = LINE_COUNT + 1.
4869| ENDLOOP.
4870|
4871| * 고객종류에 따라(On-Time, Master)
4872| PERFORM KIND_OF_CUSTOMERS_SMARTBILL.
```
- **EN**: Sort output rows, collect documents per tax invoice number, count sold material lines and fill supplier/buyer header data via KIND_OF_CUSTOMERS_SMARTBILL.
- 호출(파서): KIND_OF_CUSTOMERS_SMARTBILL
- 업무 키워드: 세금계산서 번호, 전표 집계, 품목 수, 고객 유형
- English: Tax Invoice, Document Count, Customer Type, Smartbill
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BUPLA`](#decl-zfir0141-126-bupla), [`AUGBL`](#decl-zfir0141-461-augbl), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`SEL_INDEX`](#decl-zfir0141-96-sel_index), [`GT_CNT`](#decl-zfir0141-144-gt_cnt), [`L_LINES`](#decl-zfir0141-114-l_lines), [`DOC_CNT_ITAB`](#decl-zfir0141-232-doc_cnt_itab), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`LINE_COUNT`](#decl-zfir0141-93-line_count)
- 위치: `abap://ZFIR0141/ZFIR0141#L4831-L4872` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C1`
#### [calculation] 세금계산서 헤더의 총금액(DMBTR)·총공급가액(HWBAS)·총세액(HWSTE)·통화 KRW 를 세팅하고 전표 건수(G_LINES)와 세율 플래그(FL_TAX_RAT)에 따라 비고(ZREMK)를 TEXT-001/002/003 으로 정한다.
```abap
4882| GT_ZSBBSEG-ZTTAT = AUSGLOP_ITAB-DMBTR.
4883| * 총공급가액
4884| GT_ZSBBSEG-HWBAS = AUSGLOP_ITAB-HWBAS.
4885| * 총세액
4886| GT_ZSBBSEG-HWSTE = AUSGLOP_ITAB-HWSTE.
4887| * 통화
4888| GT_ZSBBSEG-HWAER = 'KRW'.
4889|
4890| * 비고
4891| IF G_LINES > 1 AND FL_TAX_RAT EQ '0'.
4892| GT_ZSBBSEG-ZREMK = TEXT-001.
4893| ELSEIF G_LINES EQ 1 AND FL_TAX_RAT EQ '0'.
4894| GT_ZSBBSEG-ZREMK = TEXT-003.
4895| ELSEIF G_LINES > 1 AND FL_TAX_RAT EQ '1'.
4896| GT_ZSBBSEG-ZREMK = TEXT-002.
4897| ELSE.
4898| ENDIF.
```
- **EN**: Set total amount, tax base, tax amount and currency on the e-tax invoice header and choose the remark text based on document count and tax rate flag.
- SAP 객체: GT_ZSBBSEG
- 업무 키워드: 총금액, 공급가액, 세액, 비고, 세율
- English: Total Amount, Tax Base, Tax Amount, Remark
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`G_LINES`](#decl-zfir0141-487-g_lines), [`FL_TAX_RAT`](#decl-zfir0141-488-fl_tax_rat)
- 위치: `abap://ZFIR0141/ZFIR0141#L4882-L4898` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C2`
#### [control_flow] FILL_ITEM_TABLES_SMARTBILL 로 품목 라인 MATZEIL1~4 를 채운 뒤 원천 유형(VBRK=SD 빌링, BKPF=FI 전표)에 따라 WRITE_ITEM_SD_SMARTBILL 또는 WRITE_ITEM_FI_SMARTBILL 로 GT_ZSBISSUE 품목을 적재한다.
```abap
4907| PERFORM FILL_ITEM_TABLES_SMARTBILL.
4908|
4909| IF AUSGLOP_ITAB-AWTYP = 'VBRK'.
4910| PERFORM WRITE_ITEM_SD_SMARTBILL USING MATZEIL1.
4911| PERFORM WRITE_ITEM_SD_SMARTBILL USING MATZEIL2.
4912| PERFORM WRITE_ITEM_SD_SMARTBILL USING MATZEIL3.
4913| PERFORM WRITE_ITEM_SD_SMARTBILL USING MATZEIL4.
4914| ELSEIF AUSGLOP_ITAB-AWTYP = 'BKPF'.
4915| PERFORM WRITE_ITEM_FI_SMARTBILL USING MATZEIL1.
4916| PERFORM WRITE_ITEM_FI_SMARTBILL USING MATZEIL2.
4917| PERFORM WRITE_ITEM_FI_SMARTBILL USING MATZEIL3.
4918| PERFORM WRITE_ITEM_FI_SMARTBILL USING MATZEIL4.
4919| * PERFORM write_lines_fi.
4920| ENDIF.
```
- **EN**: Fill item lines and append them to GT_ZSBISSUE using the SD or FI item routine depending on the reference transaction type (VBRK/BKPF).
- 호출(파서): FILL_ITEM_TABLES_SMARTBILL, WRITE_ITEM_SD_SMARTBILL, WRITE_ITEM_SD_SMARTBILL, WRITE_ITEM_SD_SMARTBILL, WRITE_ITEM_SD_SMARTBILL, WRITE_ITEM_FI_SMARTBILL, WRITE_ITEM_FI_SMARTBILL, WRITE_ITEM_FI_SMARTBILL, WRITE_ITEM_FI_SMARTBILL
- SAP 객체: VBRK, BKPF
- 업무 키워드: 품목 라인, SD 빌링, FI 전표, 스마트빌 품목
- English: Billing Document, FI Document, Item, Reference Transaction
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`MATZEIL4`](#decl-zfir0141-89-matzeil4)
- 위치: `abap://ZFIR0141/ZFIR0141#L4907-L4920` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C3`
#### [calculation] 헤더에 회사코드·고객·전표번호·회계연도·사업장·전기일을 넣고 발행일(ZMKDT)은 입력 SBLDAT 우선 아니면 반제일(AUGDT), 세금코드, 세금계산서 일련번호(AUGBL), 영수(1)/청구(18) 구분, 종류 '01', 빌링문서번호를 세팅해 GT_ZSBBSEG 에 APPEND 하고 품목을 정렬·중복 제거한다.
```abap
4942| GT_ZSBBSEG-BUKRS = AUSGLOP_ITAB-BUKRS.
4943| GT_ZSBBSEG-KUNNR = AUSGLOP_ITAB-KUNNR.
4944| GT_ZSBBSEG-BELNR = AUSGLOP_ITAB-BELNR.
4945| GT_ZSBBSEG-GJAHR = AUSGLOP_ITAB-GJAHR.
4946| GT_ZSBBSEG-BUPLA = AUSGLOP_ITAB-BUPLA.
4947| GT_ZSBBSEG-BUDAT = AUSGLOP_ITAB-BUDAT.
4948| * 세금계산서 발행일자
4949| IF SBLDAT IS INITIAL.
4950| GT_ZSBBSEG-ZMKDT = AUSGLOP_ITAB-AUGDT.
4951| ELSE.
4952| GT_ZSBBSEG-ZMKDT = SBLDAT.
4953| ENDIF.
4954| * IF SN1OP EQ 'X'. " 통합 세금계산서 발행일 경우
4955| ** 전기일자의 말일.
4956| * CALL FUNCTION 'LAST_DAY_OF_MONTHS'
4957| * EXPORTING
4958| * DAY_IN = DOC_CNT_ITAB-BUDAT
4959| * IMPORTING
4960| * LAST_DAY_OF_MONTH = GT_ZSBBSEG-ZMKDT
4961| * EXCEPTIONS
4962| * DAY_IN_NO_DATE = 1
4963| * OTHERS = 2.
4964| * ELSE.
4965| * GT_ZSBBSEG-ZMKDT = DOC_CNT_ITAB-BUDAT.
4966| * ENDIF.
4967| * 세금코드
4968| GT_ZSBBSEG-MWSKZ = AUSGLOP_ITAB-MWSKZ.
4969|
4970| * 세금계산서 일련번호
4971| GT_ZSBBSEG-ZSQNO = AUSGLOP_ITAB-AUGBL.
4972| * 영수/청구 구분
4973| IF RECEIPT = 'X'.
4974| GT_ZSBBSEG-ZRPTP = '1'. " 영수
4975| ELSE.
4976| GT_ZSBBSEG-ZRPTP = '18'. " 청구
4977| ENDIF.
4978|
4979| * 세금계산서 종류
4980| GT_ZSBBSEG-ZDTIG = '01'. " 과세, 영세
4981| * 대금청구문서번호(Billing Doc)
4982| GT_ZSBBSEG-VBELN = AUSGLOP_ITAB-VBELN.
4983|
4984| ENDIF.
4985| CLEAR AUGBL.
4986|
4987| * ENDAT.
4988|
4989| APPEND GT_ZSBBSEG.
4990| CLEAR : GT_ZSBBSEG, GT_CNT.
4991|
4992| ENDLOOP.
4993|
4994| SORT GT_ZSBISSUE BY KUNNR BUZEI.
4995|
4996| DELETE ADJACENT DUPLICATES FROM GT_ZSBISSUE
4997| COMPARING KUNNR ZSQNO BUZEI.
```
- **EN**: Populate header keys, issue date (SBLDAT or clearing date), tax code, invoice sequence, receipt/billing type, invoice kind and billing document into GT_ZSBBSEG, then sort and dedupe GT_ZSBISSUE.
- SAP 객체: GT_ZSBBSEG, GT_ZSBISSUE
- 업무 키워드: 세금계산서 발행일, 영수/청구, 세금코드, 빌링문서, 일련번호, 중복 제거
- English: Issue Date, Receipt, Billing, Tax Code, Billing Document
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`SBLDAT`](#decl-zfir0141-638-sbldat), [`RECEIPT`](#decl-zfir0141-700-receipt), [`AUGBL`](#decl-zfir0141-461-augbl), [`GT_CNT`](#decl-zfir0141-144-gt_cnt), [`GT_ZSBISSUE`](#decl-zfir0141-500-gt_zsbissue)
- 위치: `abap://ZFIR0141/ZFIR0141#L4942-L4997` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C4`
#### [sql_select] 시스템ID·회사코드로 전자세금계산서 설정 ZDTI_CONFIG 를 조회해 사업자단위과세(ONEBUPLA) 적용이고 발행일이 적용 시작일(BUPLADATE) 이후이면 FLAG_ONEBUPLA 를 켠다.
```abap
5001| READ TABLE GT_ZSBBSEG INDEX 1.
5002| SELECT SINGLE * FROM ZDTI_CONFIG
5003| WHERE SYSID = SY-SYSID
5004| AND BUKRS = GT_ZSBBSEG-BUKRS.
5005| IF ZDTI_CONFIG-ONEBUPLA = 'X'
5006| AND GT_ZSBBSEG-ZMKDT >= ZDTI_CONFIG-BUPLADATE.
5007| FLAG_ONEBUPLA = 'X'.
5008| ELSE.
5009| CLEAR FLAG_ONEBUPLA.
5010| ENDIF.
```
- **EN**: Read ZDTI_CONFIG for the company code and set FLAG_ONEBUPLA when unit-of-business taxation applies from the configured date.
- 테이블(파서): read [ZDTI_CONFIG](/tables/ZDTI_CONFIG.md) / write -
- SAP 객체: ZDTI_CONFIG
- 업무 키워드: 사업자단위과세, 전자세금계산서 설정, 적용 시작일
- English: Configuration, Business Place, Taxation Unit
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`ZDTI_CONFIG`](#decl-zfir0141-150-zdti_config), [`FLAG_ONEBUPLA`](#decl-zfir0141-152-flag_onebupla)
- 위치: `abap://ZFIR0141/ZFIR0141#L5001-L5010` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C5`
#### [sql_select] 사업자단위과세 적용 시 각 헤더의 사업장(J_1BBRANCH)과 주소(ADRC)로 비고란(ZREMK)에 실제 사업장 명·주소를 넣고, 공급자 정보(사업자번호·상호·대표자·업태·업종·주소)를 ZDTI_CONFIG 의 대표 사업장 기준으로 교체해 GT_ZSBBSEG 를 MODIFY 한다.
```abap
5014| IF FLAG_ONEBUPLA = 'X'.
5015| * 사업자단위과세 적용시 - 헤더 비고란 수정 (2008.01.15)
5016| LOOP AT GT_ZSBBSEG.
5017|
5018| CLEAR : J_1BBRANCH, ADRC.
5019| SELECT SINGLE * FROM J_1BBRANCH
5020| WHERE BUKRS EQ GT_ZSBBSEG-BUKRS
5021| AND BRANCH EQ GT_ZSBBSEG-BUPLA.
5022| SELECT SINGLE * FROM ADRC
5023| WHERE ADDRNUMBER EQ J_1BBRANCH-ADRNR.
5024|
5025| CONCATENATE J_1BBRANCH-NAME ADRC-CITY1 ADRC-STREET ADRC-HOUSE_NUM1
5026| INTO GT_ZSBBSEG-ZREMK SEPARATED BY SPACE.
5027|
5028| MODIFY GT_ZSBBSEG TRANSPORTING ZREMK
5029| WHERE BUKRS = GT_ZSBBSEG-BUKRS
5030| AND KUNNR = GT_ZSBBSEG-KUNNR
5031| AND ZSQNO = GT_ZSBBSEG-ZSQNO.
5032|
5033| * 공급자 정보를 대표사업자번호에 해당하는 내용으로 수정
5034| SELECT SINGLE * FROM J_1BBRANCH
5035| WHERE BUKRS EQ GT_ZSBBSEG-BUKRS
5036| AND BRANCH EQ ZDTI_CONFIG-BUPLA.
5037| SELECT SINGLE * FROM ADRC
5038| WHERE ADDRNUMBER EQ J_1BBRANCH-ADRNR.
5039|
5040| GT_ZSBBSEG-SUPNO = ZDTI_CONFIG-STCD2. "* 공급자 사업자번호
5041| GT_ZSBBSEG-ZSPCN = J_1BBRANCH-NAME. "* 공급자 회사명
5042| GT_ZSBBSEG-ZSPNM = J_1BBRANCH-KR_REPRES. "* 공급자 대표자명
5043| GT_ZSBBSEG-ZSPIT = J_1BBRANCH-KR_BUSTYPE."* 공급자 업태
5044| GT_ZSBBSEG-ZSPBT = J_1BBRANCH-KR_INDTYPE."* 공급자 업종
5045| CONCATENATE ADRC-CITY1 ADRC-STREET
5046| INTO GT_ZSBBSEG-ZSPAR SEPARATED BY SPACE. "공급자 주소
5047|
5048| MODIFY GT_ZSBBSEG TRANSPORTING SUPNO ZSPCN ZSPNM ZSPIT ZSPBT
5049| WHERE BUKRS = GT_ZSBBSEG-BUKRS
5050| AND KUNNR = GT_ZSBBSEG-KUNNR
5051| AND ZSQNO = GT_ZSBBSEG-ZSQNO.
5052| ENDLOOP.
5053| ENDIF.
```
- **EN**: Under unit-of-business taxation, put the actual business place name/address into the remark and replace supplier fields with the representative business place from ZDTI_CONFIG using J_1BBRANCH and ADRC.
- 테이블(파서): read [J_1BBRANCH](/tables/J_1BBRANCH.md), [ADRC](/tables/ADRC.md) / write -
- SAP 객체: J_1BBRANCH, ADRC, ZDTI_CONFIG
- 업무 키워드: 사업자단위과세, 대표 사업장, 공급자 정보, 사업장 주소, 비고
- English: Business Place, J_1BBRANCH, Address, Supplier
- 정의부(복사 시 함께 필요): [`FLAG_ONEBUPLA`](#decl-zfir0141-152-flag_onebupla), [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`J_1BBRANCH`](#decl-zfir0141-47-j_1bbranch), [`ADRC`](#decl-zfir0141-151-adrc), [`ZDTI_CONFIG`](#decl-zfir0141-150-zdti_config)
- 위치: `abap://ZFIR0141/ZFIR0141#L5014-L5053` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C6`
#### [output] 헤더를 GT_MAIL 로 COLLECT 해 고객 이메일 입력용 목록을 만들고 STATUS0100/TITLE0100 을 설정한 뒤 화면 100 을 팝업으로 호출해 사용자가 수신 이메일을 확인·입력하게 한다.
```abap
5059| LOOP AT GT_ZSBBSEG.
5060| MOVE-CORRESPONDING GT_ZSBBSEG TO GT_MAIL.
5061| COLLECT GT_MAIL.
5062| CLEAR : GT_MAIL, GT_ZSBBSEG.
5063| ENDLOOP.
5064|
5065| SET PF-STATUS 'STATUS0100'.
5066| SET TITLEBAR 'TITLE0100'.
5067|
5068| CALL SCREEN 100 STARTING AT 10 2
5069| ENDING AT 116 20.
```
- **EN**: Collect header rows into GT_MAIL and call screen 100 as a popup so the user can review or enter customer e-mail addresses before transmission.
- 호출(파서): 100
- 업무 키워드: 이메일 입력, 팝업 화면, 전송 전 확인
- English: E-Mail, Popup Screen, CALL SCREEN
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`GT_MAIL`](#decl-zfir0141-503-gt_mail)
- 위치: `abap://ZFIR0141/ZFIR0141#L5059-L5069` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C7`
#### [calculation] 전송 확정(&NT1) 시 화면에서 입력받은 GT_MAIL 의 이메일(ZBYRE)을 회사코드·고객·일련번호가 일치하는 GT_ZSBBSEG 헤더에 MODIFY 로 반영한다.
```abap
5071| IF SAVE_CODE EQ '&NT1'.
5072| LOOP AT GT_MAIL.
5073| CLEAR GT_ZSBBSEG-ZBYRE.
5074| GT_ZSBBSEG-ZBYRE = GT_MAIL-ZBYRE.
5075| MODIFY GT_ZSBBSEG TRANSPORTING ZBYRE
5076| WHERE BUKRS = GT_MAIL-BUKRS
5077| AND KUNNR = GT_MAIL-KUNNR
5078| AND ZSQNO = GT_MAIL-ZSQNO.
5079| ENDLOOP.
```
- **EN**: On transmit confirmation, copy the user-entered e-mail addresses from GT_MAIL into the matching e-tax invoice header rows.
- SAP 객체: GT_ZSBBSEG
- 업무 키워드: 수신 이메일, 헤더 갱신, 전송 확정
- English: E-Mail, Header Update, Electronic Tax Invoice
- 정의부(복사 시 함께 필요): [`OK_CODE`](#decl-zfir0141-613-ok_code), [`SAVE_CODE`](#decl-zfir0141-614-save_code), [`GT_MAIL`](#decl-zfir0141-503-gt_mail), [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg)
- 위치: `abap://ZFIR0141/ZFIR0141#L5071-L5079` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C8`
#### [interface] TRANSMIT_TO_SMARTBILL 로 전자세금계산서를 스마트빌(Z_SB_DTI_ISSUE)에 전송하고 SAVE_RETURN_CODE_TO_AUSGLOP 으로 리턴 코드를 AUSGLOP_ITAB/SEL_AUSGLOP_ITAB 의 RESULT 에 저장한다.
```abap
5087| PERFORM TRANSMIT_TO_SMARTBILL CHANGING RETURN_CODE.
5088|
5089| PERFORM SAVE_RETURN_CODE_TO_AUSGLOP USING RETURN_CODE.
```
- **EN**: Transmit the e-tax invoice to Smartbill and store the return code on the output tables.
- 호출(파서): TRANSMIT_TO_SMARTBILL, SAVE_RETURN_CODE_TO_AUSGLOP
- SAP 객체: Z_SB_DTI_ISSUE
- 업무 키워드: 스마트빌 전송, 리턴 코드, 발행 결과
- English: Smartbill, Transmission, Return Code
- 정의부(복사 시 함께 필요): [`RETURN_CODE`](#decl-zfir0141-145-return_code)
- 위치: `abap://ZFIR0141/ZFIR0141#L5087-L5089` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C9`
#### [interface] 전송 결과가 담긴 SEL_AUSGLOP_ITAB 을 ABAP 메모리 ID 'TI' 로 EXPORT 해 호출 프로그램(ZFIR0140 등)이 결과를 읽게 하고 전송 테이블을 초기화한다.
```abap
5136| EXPORT SEL_AUSGLOP_ITAB[] TO MEMORY ID 'TI'.
5137| ENDIF.
5138|
5139|
5140| * 호출이 끝난 이후 clear, refresh
5141| CLEAR : GT_ZSBBSEG, GT_ZSBBSEG[], GT_ZSBISSUE, GT_ZSBISSUE[].
```
- **EN**: Export SEL_AUSGLOP_ITAB with transmission results to ABAP memory ID 'TI' for the calling program and clear the transmission tables.
- 업무 키워드: 메모리 EXPORT, 호출 프로그램 연계, 전송 결과
- English: ABAP Memory, EXPORT, Result
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0141-408-sel_ausglop_itab), [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`GT_ZSBISSUE`](#decl-zfir0141-500-gt_zsbissue)
- 위치: `abap://ZFIR0141/ZFIR0141#L5136-L5141` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#SMARTBILL_TRANS#C10`
### FORM KIND_OF_CUSTOMERS_SMARTBILL — `ZFIR0141` L5153-L5208 (56줄)
*고객 유형(일회성 CPD·마스터 고객·지점 고객)에 따라 고객 주소와 사업장 주소를 찾아 스마트빌 헤더 파트1(공급자/공급받는자 정보)을 WRITE_PART1-1_SMARTBILL 로 채운다.*
> 이 unit 의 조각 2개가 44/56줄(79%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 일회성 고객(XCPDK='X')이면 고객번호·사업자번호로 ADDRESS_ITAB 을 READ 하고 사업장·세금계산서번호에 해당하는 BUPLA_ADRESSE 를 찾아 WRITE_PART1-1_SMARTBILL 로 공급자/공급받는자 정보를 채운다.
```abap
5157| IF AUSGLOP_ITAB-XCPDK = 'X'.
5158|
5159| READ TABLE ADDRESS_ITAB WITH KEY KUNNR = AUSGLOP_ITAB-KUNNR
5160| STCD = AUSGLOP_ITAB-STCD.
5161|
5162| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
5163| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5164| * Part 1 (사업자등록번호, 공급자, 공급받는자, 년도, 비고)
5165| PERFORM WRITE_PART1-1_SMARTBILL.
5166| IF SY-SUBRC = 0.
5167| EXIT.
5168| ENDIF.
5169| ENDLOOP.
```
- **EN**: For one-time (CPD) customers, read the address by customer and tax number, find the business place address and fill part 1 of the e-tax invoice header.
- 호출(파서): WRITE_PART1-1_SMARTBILL
- 업무 키워드: 일회성 고객, 사업장 주소, 공급받는자, 세금계산서 헤더
- English: One-Time Customer, Business Place, Address, Electronic Tax Invoice
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`AUGBL`](#decl-zfir0141-461-augbl), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L5157-L5169` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#KIND_OF_CUSTOMERS_SMARTBILL#C1`
#### [control_flow] 마스터 고객이면 KUNNR, 지점 고객이면 FILKD 기준으로 ADDRESS_ITAB 을 LOOP 하고 세금계산서 인쇄 모드(CHK_PRTI)에서 BUPLA_ADRESSE 를 찾아 WRITE_PART1-1_SMARTBILL 로 헤더 파트1을 채운다(지점 고객 분기는 호출이 비어 있음).
```abap
5171| ELSE.
5172| IF AUSGLOP_ITAB-FILKD = ' '.
5173|
5174| LOOP AT ADDRESS_ITAB WHERE KUNNR = AUSGLOP_ITAB-KUNNR.
5175|
5176| IF CHK_PRTI = 'X'.
5177| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
5178| AND AUGBL = AUSGLOP_ITAB-AUGBL .
5179|
5180| * Part 1 (사업자등록번호, 공급자, 공급받는자, 년도, 비고)
5181| * PERFORM WRITE_PART1-2.
5182| PERFORM WRITE_PART1-1_SMARTBILL.
5183| IF SY-SUBRC = 0.
5184| EXIT.
5185| ENDIF.
5186| ENDLOOP.
5187| ENDIF.
5188| ENDLOOP.
5189| ELSE.
5190| LOOP AT ADDRESS_ITAB WHERE KUNNR = AUSGLOP_ITAB-FILKD.
5191| IF CHK_PRTI = 'X'.
5192| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
5193| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5194| IF SY-SUBRC = 0.
5195| EXIT.
5196| ENDIF.
5197|
5198| ENDLOOP.
5199| ENDIF.
5200| ENDLOOP.
5201| ENDIF.
```
- **EN**: For master customers (by KUNNR) or branch customers (by FILKD), loop the address table and business place address to fill part 1 of the header via WRITE_PART1-1_SMARTBILL.
- 호출(파서): WRITE_PART1-1_SMARTBILL
- 업무 키워드: 마스터 고객, 지점 고객, 사업장 주소, 헤더 파트1
- English: Customer Master, Branch, Business Place, Electronic Tax Invoice
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`AUGBL`](#decl-zfir0141-461-augbl), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L5171-L5201` · confidence 0.75 · `ZFIR0141#ZFIR0141#FORM#KIND_OF_CUSTOMERS_SMARTBILL#C2`
### FORM WRITE_PART1-1_SMARTBILL — `ZFIR0141` L5217-L5284 (68줄)
*전자세금계산서 헤더(GT_ZSBBSEG)의 공급자(사업장)·공급받는자(고객) 정보(주소·사업자번호·상호·대표자·업종·업태·담당자 이메일/전화)를 채운다.*
> 이 unit 의 조각 3개가 58/68줄(85%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 사업장 주소 BUPLA_ADRESSE 에서 공급자 주소(ZSPAR)·사업자번호(SUPNO, STCD2 앞 10자리)·상호·대표자명·업종·업태를 GT_ZSBBSEG 에 세팅하고 고객 주소(ADDRESS_ITAB)에서 공급받는자 주소(ZBYAR)를 만든다.
```abap
5221| CONCATENATE BUPLA_ADRESSE-CITY1
5222| * CONCATENATE bupla_adresse-city1 bupla_adresse-city2
5223| BUPLA_ADRESSE-STREET INTO GT_ZSBBSEG-ZSPAR SEPARATED BY SPACE.
5224|
5225| * 공급자 주소
5226| CONCATENATE ADDRESS_ITAB-ORT01
5227| * CONCATENATE address_itab-ort01 address_itab-ort02
5228| ADDRESS_ITAB-STRAS INTO GT_ZSBBSEG-ZBYAR SEPARATED BY SPACE.
5229|
5230| * 공급자 사업자번호
5231| GT_ZSBBSEG-SUPNO = BUPLA_ADRESSE-STCD2+0(10).
5232| * 공급자 상호
5233| GT_ZSBBSEG-ZSPCN = BUPLA_ADRESSE-NAME1.
5234| * 공급자 대표자명
5235| GT_ZSBBSEG-ZSPNM = BUPLA_ADRESSE-KR_REPRES.
5236| * 공급자 업종
5237| GT_ZSBBSEG-ZSPBT = BUPLA_ADRESSE-KR_INDTYPE.
5238| * 공급자 업태
5239| GT_ZSBBSEG-ZSPIT = BUPLA_ADRESSE-KR_BUSTYPE.
```
- **EN**: Fill supplier data (address, tax number from STCD2, name, representative, industry and business type) from the business place address and the buyer address from ADDRESS_ITAB into the e-tax invoice header GT_ZSBBSEG.
- SAP 객체: GT_ZSBBSEG
- 업무 키워드: 공급자, 사업장, 사업자등록번호, 상호, 대표자, 업종, 업태
- English: Supplier, Business Place, Tax Number, Electronic Tax Invoice
- 정의부(복사 시 함께 필요): [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L5221-L5239` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_PART1-1_SMARTBILL#C1`
#### [validation] 고객이 사업자(STCD2 있음)이면 사업자번호(10자리)·업종·업태·상호·대표자를 마스터 값으로, 개인이면 주민번호(STCD1 13자리)와 업종·업태 '서비스', 상호·대표자에 이름을 공급받는자 정보로 세팅한다.
```abap
5242| IF ADDRESS_ITAB-STCD2 <> ''. " 사업자
5243| * 공급받는자 사업자번호
5244| GT_ZSBBSEG-BUYNO = ADDRESS_ITAB-STCD2+0(10).
5245| * 공급받는자 업종
5246| GT_ZSBBSEG-ZBYBT = ADDRESS_ITAB-BUSTYP.
5247| * 공급받는자 업태
5248| GT_ZSBBSEG-ZBYIT = ADDRESS_ITAB-INDTYP.
5249| * 공급받는자 상호
5250| GT_ZSBBSEG-ZBYCN = ADDRESS_ITAB-NAME.
5251| * 공급받는자 대표자명
5252| GT_ZSBBSEG-ZBYNM = ADDRESS_ITAB-REPRE.
5253|
5254| ELSE. " 개인
5255| * 공급받는자 사업자번호
5256| GT_ZSBBSEG-BUYNO = ADDRESS_ITAB-STCD1+0(13).
5257| * 공급받는자 업종
5258| GT_ZSBBSEG-ZBYBT = '서비스'.
5259| * 공급받는자 업태
5260| GT_ZSBBSEG-ZBYIT = '서비스'.
5261| * 공급받는자 상호
5262| GT_ZSBBSEG-ZBYCN = ADDRESS_ITAB-NAME.
5263| * 공급받는자 대표자명
5264| GT_ZSBBSEG-ZBYNM = ADDRESS_ITAB-NAME.
5265|
5266| ENDIF.
```
- **EN**: Set buyer fields depending on whether the customer is a business (STCD2 present) or an individual (STCD1 resident number with default '서비스' industry/business type).
- SAP 객체: GT_ZSBBSEG
- 업무 키워드: 공급받는자, 사업자, 개인, 주민등록번호, 업종, 업태
- English: Buyer, Tax Number, Individual Customer, Electronic Tax Invoice
- 정의부(복사 시 함께 필요): [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg)
- 위치: `abap://ZFIR0141/ZFIR0141#L5242-L5266` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_PART1-1_SMARTBILL#C2`
#### [sql_select] 공급받는자 담당자 이메일이 비어 있으면 고객 주소번호(ADRNR)로 ADR6 의 기본(FLGDEFAULT='X') SMTP 주소를 조회해 ZBYRE 에 넣고 담당자명·전화번호를 채운다.
```abap
5269| IF GT_ZSBBSEG-ZBYRE IS INITIAL.
5270| SELECT SINGLE SMTP_ADDR INTO GT_ZSBBSEG-ZBYRE
5271| FROM ADR6
5272| WHERE ADDRNUMBER = ADDRESS_ITAB-ADRNR
5273| AND DATE_FROM = '00010101'
5274| AND FLGDEFAULT = 'X'.
5275| * AND CONSNUMBER = '001'.
5276| ENDIF.
5277|
5278| * GT_ZSBBSEG-ZBYRE = 'kscho96@frontiers.co.kr'.
5279| * 공급받는자 담당자명
5280| GT_ZSBBSEG-ZBYRN = ADDRESS_ITAB-REPRE.
5281| * 공급받는자 담당자 전화번호
5282| GT_ZSBBSEG-ZBYRT = ADDRESS_ITAB-TELF1.
```
- **EN**: If the buyer e-mail is empty, read the default SMTP address from ADR6 by the customer address number and set the buyer contact name and phone.
- 테이블(파서): read [ADR6](/tables/ADR6.md) / write -
- SAP 객체: ADR6
- 업무 키워드: 담당자 이메일, 전자세금계산서 수신, 주소번호, 전화번호
- English: E-Mail Address, ADR6, Address Number, Contact
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L5269-L5282` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#WRITE_PART1-1_SMARTBILL#C3`
### FORM FILL_ITEM_TABLES_SMARTBILL — `ZFIR0141` L5364-L5386 (23줄)
*현재 세금계산서의 CHECK_ITAB 항목을 돌며 원천 유형별(순수 SD, SD+FI, 순수 FI)로 스마트빌 품목 라인을 채우는 하위 FORM 을 호출한다.*
> 이 unit 의 조각 1개가 11/23줄(48%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 세금계산서(BUKRS/KUNNR/STCD/AUGBL) 별 CHECK_ITAB 을 LOOP 하며 PRINT_ITEM_PURE_SD_SMARTBILL, PRINT_ITEM_SD_AND_FI_SMARTBILL, PRINT_ITEM_PURE_FI_SMARTBILL 을 차례로 호출해 품목 라인 MATZEIL1~4 를 구성한다.
```abap
5374| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5375| AND KUNNR = AUSGLOP_ITAB-KUNNR
5376| AND STCD = AUSGLOP_ITAB-STCD
5377| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5378| * SD-data
5379| PERFORM PRINT_ITEM_PURE_SD_SMARTBILL.
5380| * SD + FI-data
5381| PERFORM PRINT_ITEM_SD_AND_FI_SMARTBILL.
5382| * FI-data
5383| PERFORM PRINT_ITEM_PURE_FI_SMARTBILL.
5384| ENDLOOP.
```
- **EN**: Loop over CHECK_ITAB of the current tax invoice and dispatch to the pure-SD, SD+FI and pure-FI item filling routines for Smartbill.
- 호출(파서): PRINT_ITEM_PURE_SD_SMARTBILL, PRINT_ITEM_SD_AND_FI_SMARTBILL, PRINT_ITEM_PURE_FI_SMARTBILL
- 업무 키워드: 품목 라인 구성, 원천 유형, SD, FI, 스마트빌
- English: Item Line, Billing Document, FI Document, Smartbill
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L5374-L5384` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#FILL_ITEM_TABLES_SMARTBILL#C1`
### FORM PRINT_ITEM_PURE_SD_SMARTBILL — `ZFIR0141` L5601-L5648 (48줄)
*순수 SD 빌링(VBRK 전용) 세금계산서의 품목 라인을 최대 4줄로 채우거나, 추가 시트 인쇄 시 품목별 평균 단가를 계산한다(스마트빌용).*
> 이 unit 의 조각 2개가 37/48줄(77%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 원천이 SD 빌링(VBRK)이고 FI 전표가 없는 순수 SD 건에서 세금계산서 인쇄 모드이면 품목 수에 따라 MATZEIL1~4 를 초기화한 뒤 PRINT_LINES_SMARTBILL 로 최대 4개 품목 라인을 채운다.
```abap
5603| IF CHECK_ITAB-AWTYP_SD = 'VBRK'.
5604|
5605| IF CHECK_ITAB-AWTYP_FI = ' '.
5606| * if document is a pure SD-document --> print max. 4 lines
5607| IF CHK_PRTI = 'X'.
5608| CLEAR LINE_COUNT_PR.
5609| * if number of lines < 5
5610| * 4th Mat line in tax invoice
5611| CLEAR MATNUM.
5612| CLEAR NUMBER.
5613|
5614| IF LINE_COUNT < 5.
5615| PERFORM PRINT_LINES_SMARTBILL.
5616| ELSE.
5617| CLEAR MATZEIL1.
5618| CLEAR MATZEIL2.
5619| CLEAR MATZEIL3.
5620| CLEAR MATZEIL4.
5621| CLEAR COUNT.
5622|
5623| PERFORM PRINT_LINES_SMARTBILL.
5624| ENDIF.
```
- **EN**: For pure SD billing documents in tax invoice print mode, reset item lines and call PRINT_LINES_SMARTBILL to fill up to four item lines.
- 호출(파서): PRINT_LINES_SMARTBILL, PRINT_LINES_SMARTBILL
- SAP 객체: VBRK
- 업무 키워드: 순수 SD 빌링, 품목 라인, 세금계산서 인쇄
- English: Billing Document, Item Line, Tax Invoice
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`MATNUM`](#decl-zfir0141-281-matnum), [`NUMBER`](#decl-zfir0141-282-number), [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`COUNT`](#decl-zfir0141-124-count)
- 위치: `abap://ZFIR0141/ZFIR0141#L5603-L5624` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_PURE_SD_SMARTBILL#C1`
#### [calculation] 추가 시트 인쇄 시 해당 세금계산서의 품목별 평균 단가(NETWR/FKIMG)를 계산해 AUSGLOP_MAT_ITAB-UPRICE 에 MODIFY 한다.
```abap
5627| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5628| AND KUNNR = AUSGLOP_ITAB-KUNNR
5629| AND STCD = AUSGLOP_ITAB-STCD
5630| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5631|
5632| * calculating the unit price as the average price of the reported
5633| * material
5634| IF NOT AUSGLOP_MAT_ITAB-FKIMG IS INITIAL.
5635| AUSGLOP_MAT_ITAB-UPRICE = ( AUSGLOP_MAT_ITAB-NETWR ) /
5636| ( AUSGLOP_MAT_ITAB-FKIMG ).
5637| ELSE.
5638| AUSGLOP_MAT_ITAB-UPRICE = ' '.
5639| ENDIF.
5640| MODIFY AUSGLOP_MAT_ITAB.
5641| ENDLOOP.
```
- **EN**: For the additional sheet, compute the average unit price per material line and update AUSGLOP_MAT_ITAB.
- 테이블(파서): read - / write [AUSGLOP_MAT_ITAB](/tables/AUSGLOP_MAT_ITAB.md)
- 업무 키워드: 추가 시트, 평균 단가, 품목
- English: Additional Sheet, Unit Price
- 정의부(복사 시 함께 필요): [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L5627-L5641` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_PURE_SD_SMARTBILL#C2`
### FORM PRINT_LINES_SMARTBILL — `ZFIR0141` L5473-L5563 (91줄)
*세금계산서별 판매 품목(AUSGLOP_MAT_ITAB)을 일자·자재 순으로 정렬해 최대 4개 품목 라인(MATZEIL1~4)에 배치하고, 5개 이상이면 4번째 라인을 '외 N건' 요약 라인으로 만든다(스마트빌용).*
> 이 unit 의 조각 2개가 82/91줄(90%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] 판매 품목을 세금계산서번호·일자·자재로 정렬한 뒤 현재 세금계산서의 품목을 순서대로 1~3번째 라인 MATZEIL1~3 에 품목텍스트(ARKTX)·일자와 함께 옮기고 FILL_ITEM_AMOUNT_SMARTBILL 로 단가·수량·금액을 채운다.
```abap
5476| SORT AUSGLOP_MAT_ITAB BY AUGBL YYYYMMDD MATNR ASCENDING.
5477|
5478| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5479| AND KUNNR = AUSGLOP_ITAB-KUNNR
5480| AND STCD = AUSGLOP_ITAB-STCD
5481| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5482|
5483| LINE_COUNT_PR = LINE_COUNT_PR + 1.
5484|
5485| IF LINE_COUNT_PR = 1.
5486| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL1.
5487| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL1-ARKTX.
5488| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL1-FKIMG.
5489| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL1-BUDAT.
5490|
5491| PERFORM FILL_ITEM_AMOUNT_SMARTBILL TABLES AUSGLOP_MAT_ITAB
5492| USING MATZEIL1.
5493| ENDIF.
5494|
5495| IF LINE_COUNT_PR = 2.
5496| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL2.
5497| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL2-ARKTX.
5498| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL2-BUDAT.
5499| * calculating the unit price as the average price of the reported
5500| * material
5501|
5502| PERFORM FILL_ITEM_AMOUNT_SMARTBILL TABLES AUSGLOP_MAT_ITAB
5503| USING MATZEIL2.
5504| ENDIF.
5505|
5506| IF LINE_COUNT_PR = 3.
5507| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL3.
5508| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL3-ARKTX.
5509| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL3-BUDAT.
5510| * calculating the unit price as the average price of the reported
5511| * material
5512| PERFORM FILL_ITEM_AMOUNT_SMARTBILL TABLES AUSGLOP_MAT_ITAB
5513| USING MATZEIL3.
5514| ENDIF.
```
- **EN**: Sort material lines and fill tax invoice item lines 1-3 with material text, date and amounts via FILL_ITEM_AMOUNT_SMARTBILL.
- 호출(파서): FILL_ITEM_AMOUNT_SMARTBILL, FILL_ITEM_AMOUNT_SMARTBILL, FILL_ITEM_AMOUNT_SMARTBILL
- 업무 키워드: 품목 라인, 정렬, 세금계산서 품목, 단가
- English: Item Line, Sort, Tax Invoice, Material Text
- 정의부(복사 시 함께 필요): [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3)
- 위치: `abap://ZFIR0141/ZFIR0141#L5476-L5514` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_LINES_SMARTBILL#C1`
#### [output] 품목이 5개 미만이면 4번째 품목을 MATZEIL4 에 그대로 채우고, 5개 이상이면 ALL_MAT_ITAB 의 합계 금액과 4번째 자재명·'외' 표기로 나머지 품목을 요약한 4번째 라인을 만든다.
```abap
5517| IF LINE_COUNT > 4 AND LINE_COUNT_PR = 4.
5518| MOVE AUSGLOP_MAT_ITAB-MATNR TO MATNUM.
5519| NUMBER = LINE_COUNT - 4.
5520| ENDIF.
5521|
5522|
5523| * Item 개수가 5개미만일 경우
5524| IF LINE_COUNT < 5.
5525| IF LINE_COUNT_PR = 4.
5526| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL4.
5527| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL4-ARKTX.
5528| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
5529| * calculating the unit price as the average price of the reported
5530| * material
5531| PERFORM FILL_ITEM_AMOUNT_SMARTBILL TABLES AUSGLOP_MAT_ITAB
5532| USING MATZEIL4.
5533| ENDIF.
5534| * item 개수가 5 이상일 경우
5535| ELSE.
5536| READ TABLE ALL_MAT_ITAB WITH KEY BUKRS = AUSGLOP_ITAB-BUKRS
5537| KUNNR = AUSGLOP_ITAB-KUNNR
5538| STCD = AUSGLOP_ITAB-STCD
5539| AUGBL = AUSGLOP_ITAB-AUGBL
5540| FLAG = 'X'.
5541| IF SY-SUBRC = 0.
5542| * material description
5543| MOVE AUSGLOP_MAT_ITAB-BUKRS TO MATZEIL4-BUKRS.
5544| MOVE AUSGLOP_MAT_ITAB-KUNNR TO MATZEIL4-KUNNR.
5545| WRITE AUSGLOP_MAT_ITAB-ARKTX TO MATZEIL4-ARKTX.
5546| MOVE ALL_MAT_ITAB-NETWR TO MATZEIL4-NETWR.
5547| MOVE ALL_MAT_ITAB-MWSBP TO MATZEIL4-MWSBP.
5548| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
5549| * 4th mat line in tax invoice
5550| MOVE MATNUM TO MATZEIL4-MATNR. "2
5551| MOVE '외' TO MATZEIL4-VRKME.
5552| * MOVE number TO matzeil4-fkimg.
5553|
5554| * WRITE number TO matzeil4-uprice USING EDIT MASK'_______________'
5555| * RIGHT-JUSTIFIED.
5556| * MOVE text-034 TO matzeil4-uprice+5(3).
5557| ENDIF.
5558|
5559| ENDIF.
```
- **EN**: If fewer than five items, fill line 4 normally; otherwise build a summary fourth line with totals from ALL_MAT_ITAB, the fourth material and the '외' (and others) marker.
- 호출(파서): FILL_ITEM_AMOUNT_SMARTBILL
- 업무 키워드: 요약 라인, 외 N건, 품목 수, 합계 금액
- English: Summary Line, Item Count, Total Amount
- 정의부(복사 시 함께 필요): [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`MATNUM`](#decl-zfir0141-281-matnum), [`NUMBER`](#decl-zfir0141-282-number), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`ALL_MAT_ITAB`](#decl-zfir0141-278-all_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L5517-L5559` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_LINES_SMARTBILL#C2`
### FORM FILL_ITEM_AMOUNT_SMARTBILL — `ZFIR0141` L5572-L5592 (21줄)
*품목 테이블 행의 평균 단가(공급가액/수량)를 계산하고 단가·수량·공급가액·부가세액을 세금계산서 품목 라인(MATZEIL)에 옮긴다.*
> 이 unit 의 조각 1개가 15/21줄(71%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 수량(FKIMG)이 있으면 공급가액(NETWR)/수량으로 평균 단가 UPRICE 를 계산하고, 단가·수량·공급가액·부가세액(MWSBP)을 세금계산서 품목 라인 구조 P_MATZEIL 에 복사한다.
```abap
5576| IF NOT P_MAT_ITAB-FKIMG IS INITIAL.
5577| P_MAT_ITAB-UPRICE = ( P_MAT_ITAB-NETWR ) / ( P_MAT_ITAB-FKIMG ).
5578| ELSE.
5579| P_MAT_ITAB-UPRICE = ' '.
5580| ENDIF.
5581|
5582| * 단가
5583| MOVE P_MAT_ITAB-UPRICE TO P_MATZEIL-UPRICE.
5584|
5585| * 수량
5586| MOVE P_MAT_ITAB-FKIMG TO P_MATZEIL-FKIMG.
5587| * 공급가액
5588| MOVE P_MAT_ITAB-NETWR TO P_MATZEIL-NETWR.
5589| * 부가세액
5590| MOVE P_MAT_ITAB-MWSBP TO P_MATZEIL-MWSBP .
```
- **EN**: Compute the average unit price as net value divided by quantity and move unit price, quantity, net value and VAT amount into the tax invoice item line structure.
- 업무 키워드: 평균 단가, 수량, 공급가액, 부가세액, 품목 라인
- English: Unit Price, Quantity, Net Value, VAT Amount
- 위치: `abap://ZFIR0141/ZFIR0141#L5576-L5590` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#FILL_ITEM_AMOUNT_SMARTBILL#C1`
### FORM PRINT_ITEM_SD_AND_FI_SMARTBILL — `ZFIR0141` L5657-L5781 (125줄)
*SD 빌링과 FI 전표가 함께 반제된 세금계산서의 품목 라인(MATZEIL1~4)을 채우고 품목별 평균 단가를 계산한다(스마트빌용).*
> 이 unit 의 조각 3개가 112/125줄(90%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] SD+FI 혼합 건에 대해 MATZEIL4_ITAB 의 공급가액·세액·일자를 4번째 라인 MATZEIL4 에 옮기고 특별 G/L 여부와 라인 수(LINE_COUNT2)에 따라 자재명/품목텍스트를 실제 자재 또는 TEXT-023 으로 세팅한 뒤 SDFI 플래그를 켠다.
```abap
5663| LOOP AT ALL_ITEMS_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5664| AND KUNNR = AUSGLOP_ITAB-KUNNR
5665| AND STCD = AUSGLOP_ITAB-STCD
5666| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5667|
5668| LOOP AT MATZEIL4_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5669| AND KUNNR = AUSGLOP_ITAB-KUNNR
5670| AND STCD = AUSGLOP_ITAB-STCD
5671| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5672|
5673| MOVE MATZEIL4_ITAB-NETWR TO MATZEIL4-NETWR.
5674| * MOVE matzeil4-netwr TO matzeil4-netwr.
5675| MOVE MATZEIL4_ITAB-MWSBP TO MATZEIL4-MWSBP.
5676| * MOVE matzeil4-mwsbp TO matzeil4-mwsbp.
5677| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
5678|
5679| IF CHECK_ITAB-SAVE_UMSKZ <> ' '.
5680| IF CHECK_ITAB-LINE_COUNT2 = 0.
5681| MOVE MATZEIL4_ITAB-MATNR TO MATZEIL4-MATNR.
5682| WRITE MATZEIL4_ITAB-ARKTX TO MATZEIL4-ARKTX.
5683| ELSE.
5684| MOVE TEXT-023 TO MATZEIL4-MATNR.
5685| MOVE TEXT-023 TO MATZEIL4-ARKTX.
5686| ENDIF.
5687| ELSEIF AUSGLOP_ITAB-FLAG = ' ' .
5688| MOVE TEXT-023 TO MATZEIL4-MATNR.
5689| MOVE TEXT-023 TO MATZEIL4-ARKTX.
5690| ENDIF.
5691| ENDLOOP.
5692| ENDLOOP.
5693|
5694| SDFI = 'X'.
```
- **EN**: For mixed SD+FI clearing, fill item line 4 with net value, tax and date from MATZEIL4_ITAB and set the material text depending on the special G/L indicator, then flag SDFI.
- 업무 키워드: SD+FI 혼합, 품목 라인 4, 특별 G/L, 품목 텍스트
- English: Billing Document, FI Document, Item Line, Special G/L Indicator
- 정의부(복사 시 함께 필요): [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`MATZEIL4_ITAB`](#decl-zfir0141-367-matzeil4_itab), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`SDFI`](#decl-zfir0141-481-sdfi)
- 위치: `abap://ZFIR0141/ZFIR0141#L5663-L5694` · confidence 0.75 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_SD_AND_FI_SMARTBILL#C1`
#### [calculation] 세금계산서 인쇄 시 품목 수가 4 미만이면 AUSGLOP_MAT_ITAB 각 품목의 평균 단가(NETWR/FKIMG)를 계산해 MATZEIL1~3 에 순서대로 채우고, 4 이상이면 ALL_ITEMS_SD_ITAB 합계를 MATZEIL4 에 TEXT-030 품명으로 요약한다.
```abap
5696| IF CHK_PRTI = 'X'.
5697| LINE_COUNT_PR = 0.
5698| * if number of lines < 4
5699| IF LINE_COUNT < 4.
5700| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5701| AND KUNNR = AUSGLOP_ITAB-KUNNR
5702| AND STCD = AUSGLOP_ITAB-STCD
5703| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5704| LINE_COUNT_PR = LINE_COUNT_PR + 1.
5705|
5706| * calculating the unit price as the average price of the reported
5707| * material
5708| IF NOT AUSGLOP_MAT_ITAB-FKIMG IS INITIAL.
5709| AUSGLOP_MAT_ITAB-UPRICE = ( AUSGLOP_MAT_ITAB-NETWR ) /
5710| ( AUSGLOP_MAT_ITAB-FKIMG ).
5711| ELSE.
5712| AUSGLOP_MAT_ITAB-UPRICE = ' '.
5713| ENDIF.
5714|
5715| IF LINE_COUNT_PR = 1.
5716| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL1.
5717| MOVE AUSGLOP_MAT_ITAB-UPRICE TO MATZEIL1-UPRICE.
5718| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL1-FKIMG.
5719| MOVE AUSGLOP_MAT_ITAB-NETWR TO MATZEIL1-NETWR.
5720| MOVE AUSGLOP_MAT_ITAB-MWSBP TO MATZEIL1-MWSBP.
5721| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL1-BUDAT.
5722|
5723| ENDIF.
5724|
5725| IF LINE_COUNT_PR = 2.
5726| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL2.
5727| MOVE AUSGLOP_MAT_ITAB-UPRICE TO MATZEIL2-UPRICE.
5728| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL2-FKIMG.
5729| MOVE AUSGLOP_MAT_ITAB-NETWR TO MATZEIL2-NETWR.
5730| MOVE AUSGLOP_MAT_ITAB-MWSBP TO MATZEIL2-MWSBP.
5731| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL2-BUDAT.
5732| ENDIF.
5733|
5734| IF LINE_COUNT_PR = 3.
5735| MOVE-CORRESPONDING AUSGLOP_MAT_ITAB TO MATZEIL3.
5736| MOVE AUSGLOP_MAT_ITAB-UPRICE TO MATZEIL3-UPRICE.
5737|
5738| MOVE AUSGLOP_MAT_ITAB-UPRICE TO MATZEIL3-UPRICE.
5739| MOVE AUSGLOP_MAT_ITAB-FKIMG TO MATZEIL3-FKIMG.
5740| MOVE AUSGLOP_MAT_ITAB-NETWR TO MATZEIL3-NETWR.
5741| MOVE AUSGLOP_MAT_ITAB-MWSBP TO MATZEIL3-MWSBP.
5742| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL3-BUDAT.
5743| ENDIF.
5744|
5745| ENDLOOP.
5746|
5747| * if number of lines >=4
5748| ELSE.
5749| LOOP AT ALL_ITEMS_SD_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5750| AND KUNNR = AUSGLOP_ITAB-KUNNR
5751| AND STCD = AUSGLOP_ITAB-STCD
5752| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5753| MOVE ALL_ITEMS_ITAB-NETWR TO MATZEIL4-NETWR.
5754| MOVE ALL_ITEMS_ITAB-MWSBP TO MATZEIL4-MWSBP.
5755| MOVE AUSGLOP_MAT_ITAB-YYYYMMDD TO MATZEIL4-BUDAT.
5756| MOVE TEXT-030 TO MATZEIL4-MATNR.
5757| ENDLOOP.
5758| ENDIF.
```
- **EN**: When printing the tax invoice, compute the average unit price per material and fill item lines 1-3 if fewer than 4 lines, otherwise summarize SD totals into line 4 with text TEXT-030.
- 업무 키워드: 평균 단가, 품목 라인, 세금계산서 인쇄, 요약 라인
- English: Unit Price, Item Line, Tax Invoice, Summary Line
- 정의부(복사 시 함께 필요): [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`LINE_COUNT`](#decl-zfir0141-93-line_count), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`ALL_ITEMS_SD_ITAB`](#decl-zfir0141-286-all_items_sd_itab), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab) 외 1건
- 위치: `abap://ZFIR0141/ZFIR0141#L5696-L5758` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_SD_AND_FI_SMARTBILL#C2`
#### [calculation] 추가 시트 인쇄 시 AUSGLOP_MAT_ITAB 각 품목의 평균 단가(NETWR/FKIMG)를 계산해 UPRICE 에 MODIFY 로 반영한다.
```abap
5761| ELSE.
5762| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5763| AND KUNNR = AUSGLOP_ITAB-KUNNR
5764| AND STCD = AUSGLOP_ITAB-STCD
5765| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5766| * calculating the unit price as the average price of the reported
5767| * material
5768| IF NOT AUSGLOP_MAT_ITAB-FKIMG IS INITIAL.
5769|
5770| AUSGLOP_MAT_ITAB-UPRICE = ( AUSGLOP_MAT_ITAB-NETWR ) /
5771| ( AUSGLOP_MAT_ITAB-FKIMG ).
5772| ELSE.
5773| AUSGLOP_MAT_ITAB-UPRICE = ' '.
5774| ENDIF.
5775| MODIFY AUSGLOP_MAT_ITAB.
5776| ENDLOOP.
5777| ENDIF.
```
- **EN**: For the additional sheet, compute the average unit price per material line and update AUSGLOP_MAT_ITAB.
- 테이블(파서): read - / write [AUSGLOP_MAT_ITAB](/tables/AUSGLOP_MAT_ITAB.md)
- 업무 키워드: 추가 시트, 평균 단가, 품목 갱신
- English: Additional Sheet, Unit Price
- 정의부(복사 시 함께 필요): [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L5761-L5777` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_SD_AND_FI_SMARTBILL#C3`
### FORM PRINT_ITEM_PURE_FI_SMARTBILL — `ZFIR0141` L5790-L5841 (52줄)
*순수 FI 전표(BKPF 전용)로 반제된 세금계산서의 첫 품목 라인 MATZEIL1 을 전표 텍스트(SGTXT)와 공급가액·세액으로 채운다(스마트빌용).*
> 이 unit 의 조각 1개가 43/52줄(83%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 원천이 FI 전표(BKPF)이고 SD 빌링이 없는 경우 ALL_ITEMS_ITAB 을 돌며 전기일을 넣고 전표 항목 텍스트(SGTXT)를 '/' 로 SPLIT 해 품명·수량·단위로 분리하며 공급가액(HWBAS)·세액(HWSTE)을 MATZEIL1 에 세팅하고, 특별 G/L 지시자(SAVE_UMSKZ)가 있으면 MATZEIL1_ITAB 의 자재명으로 대체한다.
```abap
5797| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
5798| IF CHECK_ITAB-AWTYP_SD = ' '.
5799| * if the cleared invoices are pure FI-documents fill first line
5800| CLEAR MATZEIL1.
5801| LOOP AT ALL_ITEMS_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5802| AND KUNNR = AUSGLOP_ITAB-KUNNR
5803| AND STCD = AUSGLOP_ITAB-STCD
5804| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5805|
5806| * READ TABLE ausglop_itab INDEX l_lines.
5807| * 주석처리 2006.08.16.
5808| * READ TABLE AUSGLOP_ITAB WITH KEY AUGBL = ALL_ITEMS_ITAB-AUGBL.
5809|
5810| IF SY-SUBRC EQ 0.
5811| MOVE AUSGLOP_ITAB-BUDAT TO MATZEIL1-BUDAT.
5812| ENDIF.
5813|
5814| SPLIT AUSGLOP_ITAB-SGTXT AT '/' INTO MATZEIL1-MATNR
5815| MATZEIL1-FKIMG
5816| MATZEIL1-VRKME.
5817|
5818| MOVE ALL_ITEMS_ITAB-HWBAS TO MATZEIL1-NETWR.
5819| MOVE ALL_ITEMS_ITAB-HWSTE TO MATZEIL1-MWSBP.
5820|
5821| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5822| AND KUNNR = AUSGLOP_ITAB-KUNNR
5823| AND STCD = AUSGLOP_ITAB-STCD
5824| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5825| IF CHECK_ITAB-SAVE_UMSKZ = ' '.
5826| * MOVE text-030 TO matzeil1-matnr.
5827| ELSE.
5828| LOOP AT MATZEIL1_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5829| AND KUNNR = AUSGLOP_ITAB-KUNNR
5830| AND STCD = AUSGLOP_ITAB-STCD
5831| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5832| MOVE MATZEIL1_ITAB-MATNR TO MATZEIL1-MATNR.
5833| ENDLOOP.
5834| ENDIF.
5835| ENDLOOP.
5836| ENDLOOP.
5837| ENDIF.
5838|
5839| ENDIF.
```
- **EN**: For pure FI documents, fill the first tax invoice item line MATZEIL1 by splitting the line item text SGTXT into material/quantity/unit and moving tax base and tax amount; override the material with MATZEIL1_ITAB when a special G/L indicator exists.
- SAP 객체: BKPF
- 업무 키워드: 순수 FI 전표, 품목 라인, 전표 텍스트 분리, 공급가액, 세액, 특별 G/L
- English: FI Document, Item Line, Line Item Text, Tax Base, Special G/L Indicator
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`MATZEIL4_ITAB`](#decl-zfir0141-367-matzeil4_itab), [`MATZEIL1_ITAB`](#decl-zfir0141-385-matzeil1_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L5797-L5839` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#PRINT_ITEM_PURE_FI_SMARTBILL#C1`
### FORM WRITE_ITEM_SD_SMARTBILL — `ZFIR0141` L5394-L5414 (21줄)
*SD 빌링 기준 세금계산서 품목 라인(MATZEIL)을 스마트빌 품목 테이블 GT_ZSBISSUE 에 일련번호·품명·규격·수량·단가·공급가액·세액으로 적재한다.*
> 이 unit 의 조각 1개가 17/21줄(81%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] 고객이 있는 품목 라인만 대상으로 카운터를 증가시키고 세금계산서 번호(AUGBL)·전기일·자재·판매단위·수량·단가·공급가액(NETWR)·세액(MWSBP)을 KRW 기준으로 GT_ZSBISSUE 에 APPEND 한다.
```abap
5396| CHECK NOT P_MATZEIL-KUNNR IS INITIAL.
5397| GT_CNT = GT_CNT + 1.
5398|
5399| GT_ZSBISSUE-KUNNR = P_MATZEIL-KUNNR.
5400| GT_ZSBISSUE-ZSQNO = AUSGLOP_ITAB-AUGBL.
5401| GT_ZSBISSUE-BUZEI = GT_CNT.
5402| GT_ZSBISSUE-ZRQDT = P_MATZEIL-BUDAT.
5403| GT_ZSBISSUE-ZITEM = P_MATZEIL-MATNR.
5404| GT_ZSBISSUE-ZSIZE = P_MATZEIL-VRKME.
5405| GT_ZSBISSUE-ZREQT = P_MATZEIL-FKIMG(8).
5406| GT_ZSBISSUE-HWAER = 'KRW'.
5407| GT_ZSBISSUE-ZNTAT = P_MATZEIL-UPRICE.
5408| GT_ZSBISSUE-HWBAS = P_MATZEIL-NETWR.
5409| GT_ZSBISSUE-HWSTE = P_MATZEIL-MWSBP.
5410|
5411| APPEND GT_ZSBISSUE.
5412| CLEAR GT_ZSBISSUE.
```
- **EN**: Append an SD-based item line to GT_ZSBISSUE with the tax invoice number, request date, material, unit, quantity, unit price, net value and tax amount in KRW.
- SAP 객체: GT_ZSBISSUE
- 업무 키워드: 세금계산서 품목, SD 빌링, 단가, 공급가액, 세액, 스마트빌
- English: Tax Invoice Item, Billing, Unit Price, Net Value, Tax Amount
- 정의부(복사 시 함께 필요): [`GT_CNT`](#decl-zfir0141-144-gt_cnt), [`GT_ZSBISSUE`](#decl-zfir0141-500-gt_zsbissue), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L5396-L5412` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_SD_SMARTBILL#C1`
### FORM WRITE_ITEM_FI_SMARTBILL — `ZFIR0141` L5422-L5464 (43줄)
*FI 전표 기준 세금계산서 품목 라인(MATZEIL)의 단가를 공급가액/수량으로 계산한 뒤 스마트빌 품목 테이블 GT_ZSBISSUE 에 적재한다.*
> 이 unit 의 조각 2개가 28/43줄(65%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 수량(FKIMG)을 숫자로 변환하고 FM Z_FI_COMMA_DEL 로 공급가액(NETWR)의 콤마를 제거한 뒤 수량이 0 이 아니면 공급가액/수량/100 으로 단가(L_DANGA)를 계산한다.
```abap
5433| WRITE P_MATZEIL-FKIMG TO LN_FKIMG.
5434|
5435| CALL FUNCTION 'Z_FI_COMMA_DEL'
5436| EXPORTING
5437| INPUT = P_MATZEIL-NETWR
5438| IMPORTING
5439| OUTPUT = LN_NETWR.
5440|
5441| * O으로 나눌수 없다.
5442| IF LN_FKIMG NE ' ' OR LN_FKIMG NE 0.
5443| L_DANGA = LN_NETWR / LN_FKIMG.
5444| L_DANGA = L_DANGA / 100.
5445| ENDIF.
```
- **EN**: Convert quantity to numeric, strip commas from the net value via FM Z_FI_COMMA_DEL, and compute the unit price as net value divided by quantity (scaled by 100) when quantity is non-zero.
- 호출(파서): Z_FI_COMMA_DEL
- SAP 객체: Z_FI_COMMA_DEL
- 업무 키워드: 단가 계산, 수량, 공급가액, 콤마 제거, 0 나누기 방지
- English: Unit Price, Quantity, Net Value, Conversion
- 정의부(복사 시 함께 필요): [`LN_FKIMG`](#decl-zfir0141-5424-ln_fkimg), [`LN_NETWR`](#decl-zfir0141-5425-ln_netwr), [`L_DANGA`](#decl-zfir0141-5426-l_danga)
- 위치: `abap://ZFIR0141/ZFIR0141#L5433-L5445` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_FI_SMARTBILL#C1`
#### [interface] 세금계산서 번호(AUGBL)·일련번호·전기일·자재·단위·수량·계산된 단가·공급가액·세액을 KRW 기준으로 스마트빌 품목 테이블 GT_ZSBISSUE 에 APPEND 한다.
```abap
5448| GT_ZSBISSUE-KUNNR = P_MATZEIL-KUNNR.
5449| GT_ZSBISSUE-ZSQNO = AUSGLOP_ITAB-AUGBL.
5450|
5451| GT_ZSBISSUE-BUZEI = GT_CNT.
5452| GT_ZSBISSUE-ZRQDT = P_MATZEIL-BUDAT.
5453| GT_ZSBISSUE-ZITEM = P_MATZEIL-MATNR.
5454| GT_ZSBISSUE-ZSIZE = P_MATZEIL-VRKME.
5455| GT_ZSBISSUE-ZREQT = P_MATZEIL-FKIMG+5(8).
5456| GT_ZSBISSUE-HWAER = 'KRW'.
5457| GT_ZSBISSUE-ZNTAT = L_DANGA.
5458| GT_ZSBISSUE-HWBAS = P_MATZEIL-NETWR.
5459| GT_ZSBISSUE-HWSTE = P_MATZEIL-MWSBP.
5460|
5461| APPEND GT_ZSBISSUE.
5462| CLEAR GT_ZSBISSUE.
```
- **EN**: Append the FI-based item line with tax invoice number, sequence, date, material, unit, quantity, computed unit price, net value and tax amount to GT_ZSBISSUE.
- SAP 객체: GT_ZSBISSUE
- 업무 키워드: 세금계산서 품목, FI 전표, 스마트빌 전송 품목
- English: Tax Invoice Item, FI Document, Smartbill
- 정의부(복사 시 함께 필요): [`GT_ZSBISSUE`](#decl-zfir0141-500-gt_zsbissue), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`GT_CNT`](#decl-zfir0141-144-gt_cnt), [`L_DANGA`](#decl-zfir0141-5426-l_danga)
- 위치: `abap://ZFIR0141/ZFIR0141#L5448-L5462` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_ITEM_FI_SMARTBILL#C2`
### FORM TRANSMIT_TO_SMARTBILL — `ZFIR0141F01` L49-L55 (7줄)
*매출 세금계산서를 스마트빌로 전송하는 상위 흐름으로 전송 데이터 생성 → Z_SB_DTI_ISSUE 전송 → 결과 메시지 표시를 순서대로 수행한다.*
> 이 unit 의 조각 1개가 3/7줄(43%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] MAKE_DATA_TO_TRANSMIT 로 전자세금계산서 전송 데이터를 만들고 TRANSMIT_DTI_TO_SB 로 스마트빌에 전송한 뒤 DISPLAY_ERROR_MSG 로 리턴 코드별 메시지를 표시한다.
```abap
51| PERFORM MAKE_DATA_TO_TRANSMIT.
52| PERFORM TRANSMIT_DTI_TO_SB CHANGING P_RETURN_CODE.
53| PERFORM DISPLAY_ERROR_MSG USING P_RETURN_CODE.
```
- **EN**: Orchestrate Smartbill transmission: build data, transmit via TRANSMIT_DTI_TO_SB and display the return-code message.
- 호출(파서): MAKE_DATA_TO_TRANSMIT, TRANSMIT_DTI_TO_SB, DISPLAY_ERROR_MSG
- 업무 키워드: 스마트빌 전송, 매출 세금계산서, 전자세금계산서
- English: Smartbill, Electronic Tax Invoice, Transmission
- 위치: `abap://ZFIR0141/ZFIR0141F01#L51-L53` · confidence 0.8 · `ZFIR0141#ZFIR0141F01#FORM#TRANSMIT_TO_SMARTBILL#C1`
### FORM MAKE_DATA_TO_TRANSMIT — `ZFIR0141F01` L62-L69 (8줄)
*스마트빌 전송용 헤더·품목·결제·전표번호 데이터를 순서대로 생성하는 PERFORM 디스패치 FORM 이다.*
> 이 unit 의 조각 1개가 4/8줄(50%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 전자세금계산서 전송 데이터를 ZSB_HEADER → ZSB_ITEM → ZSB_PAYMENT → ZSB_BELNR 순으로 생성하는 하위 FORM 들을 호출한다.
```abap
64| PERFORM MAKE_ZSB_HEADER.
65| PERFORM MAKE_ZSB_ITEM.
66| PERFORM MAKE_ZSB_PAYMENT.
67| PERFORM MAKE_ZSB_BELNR.
```
- **EN**: Sequentially call MAKE_ZSB_HEADER, MAKE_ZSB_ITEM, MAKE_ZSB_PAYMENT and MAKE_ZSB_BELNR to build the Smartbill transmission data.
- 호출(파서): MAKE_ZSB_HEADER, MAKE_ZSB_ITEM, MAKE_ZSB_PAYMENT, MAKE_ZSB_BELNR
- SAP 객체: ZSB_HEADER, ZSB_ITEM, ZSB_PAYMENT, ZSB_BELNR
- 업무 키워드: 전송 데이터 생성, 전자세금계산서, 헤더, 품목, 결제
- English: Electronic Tax Invoice, Smartbill, Transmission Data
- 위치: `abap://ZFIR0141/ZFIR0141F01#L64-L67` · confidence 0.8 · `ZFIR0141#ZFIR0141F01#FORM#MAKE_DATA_TO_TRANSMIT#C1`
### FORM MAKE_ZSB_HEADER — `ZFIR0141F01` L76-L94 (19줄)
*스마트빌 전송 헤더 테이블 ZSB_HEADER 를 GT_ZSBBSEG 로부터 생성하며 정발행(ZSIGN='S')·매출(AR) 구분을 세팅한다.*
> 이 unit 의 조각 1개가 13/19줄(68%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] GT_ZSBBSEG 각 행을 ZSB_HEADER 로 옮기고 ZSIGN='S'(정발행), ZARAP='AR'(매출) 구분을 지정해 전자세금계산서 헤더 전송 데이터를 구성한다.
```abap
80| LOOP AT GT_ZSBBSEG.
81| MOVE-CORRESPONDING GT_ZSBBSEG TO ZSB_HEADER.
82|
83| ZSB_HEADER-ZSIGN = 'S'.
84| ZSB_HEADER-ZARAP = 'AR'.
85|
86| * IF ZSB_HEADER-BUYNO = ''.
87| * ZSB_HEADER-BUYNO = '2148673542'. "개발을 위해 임시로 하드코딩
88| * ENDIF.
89|
90| APPEND ZSB_HEADER.
91| CLEAR ZSB_HEADER.
92| ENDLOOP.
```
- **EN**: Build the electronic tax invoice header table ZSB_HEADER from GT_ZSBBSEG, marking ZSIGN='S' (issued by supplier) and ZARAP='AR'.
- SAP 객체: ZSB_HEADER
- 업무 키워드: 전자세금계산서 헤더, 정발행, 매출, 전송 데이터
- English: Electronic Tax Invoice, Header, Smartbill, Accounts Receivable
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`ZSB_HEADER`](#decl-zfir0141-521-zsb_header)
- 위치: `abap://ZFIR0141/ZFIR0141F01#L80-L92` · confidence 0.85 · `ZFIR0141#ZFIR0141F01#FORM#MAKE_ZSB_HEADER#C1`
### FORM MAKE_ZSB_ITEM — `ZFIR0141F01` L127-L142 (16줄)
*스마트빌 전송 품목 테이블 ZSB_ITEM 을 전표 정보(GT_ZSBBSEG 첫 행)와 품목 정보(GT_ZSBISSUE)를 합쳐 AR 구분으로 생성한다.*
> 이 unit 의 조각 1개가 10/16줄(62%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] GT_ZSBBSEG 첫 행의 전표 공통 정보와 GT_ZSBISSUE 의 각 품목(품명·규격·수량·단가·공급가액·세액)을 MOVE-CORRESPONDING 으로 합쳐 ZARAP='AR' 인 스마트빌 품목 테이블 ZSB_ITEM 을 만든다.
```abap
131| READ TABLE GT_ZSBBSEG INDEX 1.
132|
133| LOOP AT GT_ZSBISSUE.
134| MOVE-CORRESPONDING GT_ZSBBSEG TO ZSB_ITEM.
135| MOVE-CORRESPONDING GT_ZSBISSUE TO ZSB_ITEM.
136| ZSB_ITEM-ZARAP = 'AR'.
137|
138| APPEND ZSB_ITEM.
139| CLEAR ZSB_ITEM.
140| ENDLOOP.
```
- **EN**: Merge the common document data from GT_ZSBBSEG with each item in GT_ZSBISSUE into the Smartbill item table ZSB_ITEM with ZARAP='AR'.
- SAP 객체: ZSB_ITEM
- 업무 키워드: 전자세금계산서 품목, 전송 데이터, 매출채권
- English: Electronic Tax Invoice, Item, Smartbill, Accounts Receivable
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`GT_ZSBISSUE`](#decl-zfir0141-500-gt_zsbissue), [`ZSB_ITEM`](#decl-zfir0141-525-zsb_item)
- 위치: `abap://ZFIR0141/ZFIR0141F01#L131-L140` · confidence 0.85 · `ZFIR0141#ZFIR0141F01#FORM#MAKE_ZSB_ITEM#C1`
### FORM MAKE_ZSB_PAYMENT — `ZFIR0141F01` L149-L171 (23줄)
*스마트빌 전송 결제정보 테이블 ZSB_PAYMENT 를 세금계산서별로 현금(10)·수표(20)·어음(2AA)·외상(30) 4개 결제수단 코드 행으로 생성한다.*
> 이 unit 의 조각 1개가 17/23줄(74%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] GT_ZSBBSEG 각 세금계산서에 대해 ZARAP='AR' 로 결제정보를 만들고 결제수단 코드 ZPMMC 를 '10'(현금), '20'(수표), '2AA'(어음), '30' 으로 4행 APPEND 하여 전자세금계산서 결제 구분 데이터를 구성한다.
```abap
153| LOOP AT GT_ZSBBSEG.
154| CLEAR ZSB_PAYMENT.
155| MOVE-CORRESPONDING GT_ZSBBSEG TO ZSB_PAYMENT.
156| ZSB_PAYMENT-ZARAP = 'AR'.
157|
158| ZSB_PAYMENT-ZPMMC = '10'. "* 결제정보 현금
159| APPEND ZSB_PAYMENT.
160|
161| ZSB_PAYMENT-ZPMMC = '20'. "* 결제정보 수표
162| APPEND ZSB_PAYMENT.
163|
164| ZSB_PAYMENT-ZPMMC = '2AA'. "* 결제정보 어음
165| APPEND ZSB_PAYMENT.
166|
167| ZSB_PAYMENT-ZPMMC = '30'. "* 결제정보 수표
168| APPEND ZSB_PAYMENT.
169| ENDLOOP.
```
- **EN**: For each tax invoice in GT_ZSBBSEG, append four payment rows to ZSB_PAYMENT with payment method codes 10 (cash), 20 (check), 2AA (note) and 30.
- SAP 객체: ZSB_PAYMENT
- 업무 키워드: 결제정보, 현금, 수표, 어음, 전자세금계산서, 전송 데이터
- English: Payment Method, Electronic Tax Invoice, Smartbill
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`ZSB_PAYMENT`](#decl-zfir0141-529-zsb_payment)
- 위치: `abap://ZFIR0141/ZFIR0141F01#L153-L169` · confidence 0.8 · `ZFIR0141#ZFIR0141F01#FORM#MAKE_ZSB_PAYMENT#C1`
### FORM MAKE_ZSB_BELNR — `ZFIR0141F01` L178-L191 (14줄)
*스마트빌 전송용 전표번호 테이블 ZSB_BELNR 을 GT_ZSBBSEG 로부터 만들고 AR(매출) 구분을 세팅한다.*
> 이 unit 의 조각 1개가 7/14줄(50%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] GT_ZSBBSEG 의 각 전표 항목을 MOVE-CORRESPONDING 으로 ZSB_BELNR 에 옮기고 ZARAP='AR' 로 매출채권 구분을 지정해 스마트빌 전송 전표번호 테이블을 구성한다.
```abap
182| LOOP AT GT_ZSBBSEG.
183| MOVE-CORRESPONDING GT_ZSBBSEG TO ZSB_BELNR.
184| ZSB_BELNR-ZARAP = 'AR'.
185|
186| APPEND ZSB_BELNR.
187| CLEAR ZSB_BELNR.
188| ENDLOOP.
```
- **EN**: Build the Smartbill document number table ZSB_BELNR from GT_ZSBBSEG with ZARAP='AR' marking accounts receivable.
- SAP 객체: ZSB_BELNR
- 업무 키워드: 전표번호, 매출채권, 스마트빌 전송 데이터
- English: Accounts Receivable, Document Number, Smartbill
- 정의부(복사 시 함께 필요): [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg), [`ZSB_BELNR`](#decl-zfir0141-533-zsb_belnr)
- 위치: `abap://ZFIR0141/ZFIR0141F01#L182-L188` · confidence 0.85 · `ZFIR0141#ZFIR0141F01#FORM#MAKE_ZSB_BELNR#C1`
### FORM TRANSMIT_DTI_TO_SB — `ZFIR0141F01` L197-L216 (20줄)
*전자세금계산서 헤더·품목·결제·전표번호 테이블을 스마트빌 발행 FM Z_SB_DTI_ISSUE 로 전송하고 리턴 코드를 받는다.*
> 이 unit 의 조각 1개가 14/20줄(70%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [interface] ZSB_HEADER/ZSB_ITEM/ZSB_PAYMENT/ZSB_BELNR 테이블을 넘겨 스마트빌 전자세금계산서 발행 FM Z_SB_DTI_ISSUE 를 호출하고 RETURN_CODE 를 P_RETURN_CODE 로 돌려받는다.
```abap
201| CALL FUNCTION 'Z_SB_DTI_ISSUE'
202| IMPORTING
203| RETURN_CODE = P_RETURN_CODE
204| TABLES
205| ZSB_HEADER = ZSB_HEADER
206| ZSB_ITEM = ZSB_ITEM
207| ZSB_PAYMENT = ZSB_PAYMENT
208| ZSB_BELNR = ZSB_BELNR
209| EXCEPTIONS
210| FAIL_ISSUE = 1
211| OTHERS = 2.
212|
213| IF SY-SUBRC <> 0.
214| ENDIF.
```
- **EN**: Call FM Z_SB_DTI_ISSUE with the electronic tax invoice header, item, payment and document tables to transmit to Smartbill and receive the return code.
- 호출(파서): Z_SB_DTI_ISSUE
- SAP 객체: Z_SB_DTI_ISSUE, ZSB_HEADER, ZSB_ITEM, ZSB_PAYMENT, ZSB_BELNR
- 업무 키워드: 전자세금계산서, 스마트빌 전송, 발행, 리턴 코드
- English: Electronic Tax Invoice, Smartbill, Interface, Return Code
- 정의부(복사 시 함께 필요): [`ZSB_HEADER`](#decl-zfir0141-521-zsb_header), [`ZSB_ITEM`](#decl-zfir0141-525-zsb_item), [`ZSB_PAYMENT`](#decl-zfir0141-529-zsb_payment), [`ZSB_BELNR`](#decl-zfir0141-533-zsb_belnr)
- 위치: `abap://ZFIR0141/ZFIR0141F01#L201-L214` · confidence 0.9 · `ZFIR0141#ZFIR0141F01#FORM#TRANSMIT_DTI_TO_SB#C1`
### FORM DISPLAY_ERROR_MSG — `ZFIR0141F01` L223-L245 (23줄)
*스마트빌 전송 리턴 코드에 따라 정상 발행·네트워크 장애·통신 에러·데이터 검증 오류 메시지를 표시하고 그 외 코드는 Z_SB_RETURN_MESSAGE 로 메시지를 출력한다.*
> 이 unit 의 조각 1개가 19/23줄(83%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] 리턴 코드 'Y' 면 정상 발행 메시지 S025(ZDTI), 공백이면 네트워크 장애, '2' 면 통신 에러, '3' 이면 데이터 검증 오류 메시지를 표시하고 나머지 코드는 FM Z_SB_RETURN_MESSAGE 로 코드별 메시지를 출력한다.
```abap
225| IF P_RETURN_CODE = 'Y'.
226| MESSAGE S025(ZDTI). " '정상적으로 발행했습니다!'
227|
228| ELSE.
229| IF P_RETURN_CODE IS INITIAL.
230| MESSAGE S000(ZDTI)
231| WITH '네트워크 장애. 잠시후 다시 시도해 주시기 바랍니다.'.
232| ELSEIF P_RETURN_CODE = '2'.
233| MESSAGE S000(ZDTI)
234| WITH '통신 에러. 스마트빌에 문의해 주시기 바랍니다.'.
235| ELSEIF P_RETURN_CODE = '3'.
236| MESSAGE S000(ZDTI)
237| WITH '데이터 검증 오류. 전송 데이터 확인 부탁드립니다.'.
238| ELSE.
239| CALL FUNCTION 'Z_SB_RETURN_MESSAGE' "리턴코드별 메세지 출력
240| EXPORTING
241| RETURN_CODE = P_RETURN_CODE.
242| ENDIF.
243| ENDIF.
```
- **EN**: Map the Smartbill return code to a status message (success, network failure, communication error, data validation error) or delegate to FM Z_SB_RETURN_MESSAGE for other codes.
- 호출(파서): Z_SB_RETURN_MESSAGE
- SAP 객체: Z_SB_RETURN_MESSAGE, ZDTI
- 업무 키워드: 리턴 코드, 오류 메시지, 전자세금계산서 발행, 네트워크 장애
- English: Return Code, Error Message, Electronic Tax Invoice, Smartbill
- 위치: `abap://ZFIR0141/ZFIR0141F01#L225-L243` · confidence 0.9 · `ZFIR0141#ZFIR0141F01#FORM#DISPLAY_ERROR_MSG#C1`
### FORM SAVE_RETURN_CODE_TO_AUSGLOP — `ZFIR0141F01` L251-L269 (19줄)
*스마트빌 전송 리턴 코드가 성공('Y')이면 SEL_AUSGLOP_ITAB 과 AUSGLOP_ITAB 의 RESULT 필드를 'Y' 로 표시한다.*
> 이 unit 의 조각 1개가 15/19줄(79%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 전송 결과가 'Y'(정상 발행)일 때 선택 대상 SEL_AUSGLOP_ITAB 과 전체 AUSGLOP_ITAB 의 RESULT 를 'Y' 로 MODIFY 하여 이후 UPDATE_TABLE 에서 성공 건만 전표에 반영되도록 한다.
```abap
253| IF P_RETURN_CODE = 'Y'.
254|
255| LOOP AT SEL_AUSGLOP_ITAB.
256| SEL_AUSGLOP_ITAB-RESULT = 'Y'.
257| MODIFY SEL_AUSGLOP_ITAB.
258| CLEAR SEL_AUSGLOP_ITAB.
259| ENDLOOP.
260|
261| LOOP AT AUSGLOP_ITAB.
262| AUSGLOP_ITAB-RESULT = 'Y'.
263| MODIFY AUSGLOP_ITAB.
264| CLEAR AUSGLOP_ITAB.
265| ENDLOOP.
266|
267| ENDIF.
```
- **EN**: When the Smartbill return code is 'Y', set RESULT='Y' on SEL_AUSGLOP_ITAB and AUSGLOP_ITAB so subsequent processing treats them as successfully issued.
- 테이블(파서): read - / write [SEL_AUSGLOP_ITAB](/tables/SEL_AUSGLOP_ITAB.md), [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- 업무 키워드: 전송 결과, 발행 성공, 결과 플래그
- English: Return Code, Transmission Result, Smartbill
- 정의부(복사 시 함께 필요): [`SEL_AUSGLOP_ITAB`](#decl-zfir0141-408-sel_ausglop_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141F01#L253-L267` · confidence 0.85 · `ZFIR0141#ZFIR0141F01#FORM#SAVE_RETURN_CODE_TO_AUSGLOP#C1`
### FORM SAP_SCRIPT — `ZFIR0141` L4146-L4518 (373줄)
*세금계산서 SAPscript 출력 절차의 시작 부분으로 인쇄 옵션을 설정하고 OPEN_FORM 으로 인쇄 작업을 연 뒤 고객·사업장 순으로 출력 대상을 정렬한다.*
> 이 unit 의 조각 8개가 335/373줄(90%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] 출력 옵션(TDDEST/TDIMMED/TDDELETE/TDNEWID)을 세팅하고 SAPscript FM OPEN_FORM 을 PRINTER 장치·대화 모드로 호출하여 세금계산서 인쇄 작업을 열며 실패 시 오류를 WRITE 하고 종료한다.
```abap
4151| OPTIONS-TDDEST = '*'.
4152| OPTIONS-TDIMMED = '*'.
4153| OPTIONS-TDDELETE = '*'.
4154| OPTIONS-TDNEWID = 'X'.
4155| CALL FUNCTION 'OPEN_FORM'
4156| EXPORTING
4157| DEVICE = 'PRINTER'
4158| DIALOG = 'X'
4159| OPTIONS = OPTIONS
4160| EXCEPTIONS
4161| CANCELED = 1
4162| DEVICE = 2
4163| FORM = 3
4164| OPTIONS = 4
4165| UNCLOSED = 5
4166| OTHERS = 6.
4167| IF SY-SUBRC <> 0.
4168| WRITE 'Error in OPEN_FORM'(051).
4169| EXIT.
4170| ENDIF.
```
- **EN**: Set print options and call SAPscript FM OPEN_FORM with DEVICE='PRINTER' and dialog to open the tax invoice print job; exit with an error message on failure.
- 호출(파서): OPEN_FORM
- SAP 객체: OPEN_FORM
- 업무 키워드: SAPscript, 인쇄 작업 열기, 세금계산서 출력, 출력 옵션
- English: SAPscript, OPEN_FORM, Print Job, Tax Invoice
- 정의부(복사 시 함께 필요): [`OPTIONS`](#decl-zfir0141-387-options), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L4151-L4170` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C1`
#### [aggregation] 직접 실행 시 체크된 항목만 대상으로 하고, 발행일(AUGDT)의 연·월·일을 분리하며 세금계산서 번호(AUGBL)가 바뀔 때 해당 세금계산서의 판매 품목 수(AUSGLOP_MAT_ITAB 건수)를 LINE_COUNT 로 센다.
```abap
4176| IF PROG_NAME = ' '.
4177| CHECK AUSGLOP_ITAB-CHECK = 'X'.
4178| ENDIF.
4179|
4180| LINE_COUNT_PR = 0.
4181| SEL_INDEX = SY-TABIX.
4182|
4183|
4184| WRITE AUSGLOP_ITAB-AUGDT+2(2) TO BYEAR.
4185| WRITE AUSGLOP_ITAB-AUGDT+4(2) TO BMONTH.
4186| WRITE AUSGLOP_ITAB-AUGDT+6(2) TO BDAY.
4187|
4188| AT NEW AUGBL.
4189| IF AUSGLOP_ITAB-AUGBL NE AUGBL.
4190| READ TABLE AUSGLOP_ITAB INDEX SEL_INDEX.
4191| CLEAR AUSGLOP_MAT_ITAB.
4192| CLEAR ALL_ITEMS_ITAB.
4193|
4194| * number of item lines in ausglop_mat_itab --> number of sold
4195| * materials
4196|
4197| LINE_COUNT = 0.
4198| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4199| AND KUNNR = AUSGLOP_ITAB-KUNNR
4200| AND STCD = AUSGLOP_ITAB-STCD
4201| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4202| LINE_COUNT = LINE_COUNT + 1.
4203| ENDLOOP.
```
- **EN**: Filter checked rows, split the issue date into year/month/day and, at each new tax invoice number, count sold material lines in AUSGLOP_MAT_ITAB.
- 업무 키워드: 세금계산서 번호, 발행일, 품목 수, 선택 항목
- English: Tax Invoice, Issue Date, Line Count, AT NEW
- 정의부(복사 시 함께 필요): [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`LINE_COUNT_PR`](#decl-zfir0141-95-line_count_pr), [`SEL_INDEX`](#decl-zfir0141-96-sel_index), [`BYEAR`](#decl-zfir0141-117-byear), [`BMONTH`](#decl-zfir0141-118-bmonth), [`BDAY`](#decl-zfir0141-119-bday), [`AUGBL`](#decl-zfir0141-461-augbl), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`LINE_COUNT`](#decl-zfir0141-93-line_count)
- 위치: `abap://ZFIR0141/ZFIR0141#L4176-L4203` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C2`
#### [fm_call] 고객별 세금계산서 양식을 SAPscript FM START_FORM 으로 시작하고 실패 시 오류를 출력하며 발행일의 연·월·일 텍스트를 다시 세팅한다.
```abap
4208| CALL FUNCTION 'START_FORM'
4209| EXPORTING
4210| FORM = FORM
4211| EXCEPTIONS
4212| OTHERS = 1.
4213| IF SY-SUBRC <> 0.
4214| WRITE 'Error in START_FORM'(050).
4215| EXIT.
4216| ENDIF.
4217| WRITE AUSGLOP_ITAB-AUGDT+2(2) TO BYEAR.
4218| WRITE AUSGLOP_ITAB-AUGDT+4(2) TO BMONTH.
4219| WRITE AUSGLOP_ITAB-AUGDT+6(2) TO BDAY.
```
- **EN**: Start the SAPscript form for the customer via START_FORM and set the year/month/day text symbols of the issue date.
- 호출(파서): START_FORM
- SAP 객체: START_FORM
- 업무 키워드: SAPscript, 양식 시작, 세금계산서 양식
- English: SAPscript, START_FORM, Tax Invoice Form
- 정의부(복사 시 함께 필요): [`FORM`](#decl-zfir0141-98-form), [`EXIT`](#decl-zfir0141-463-exit), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BYEAR`](#decl-zfir0141-117-byear), [`BMONTH`](#decl-zfir0141-118-bmonth), [`BDAY`](#decl-zfir0141-119-bday)
- 위치: `abap://ZFIR0141/ZFIR0141#L4208-L4219` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C3`
#### [output] 일회성 고객(XCPDK='X'), 마스터 고객, 지점(FILKD) 고객으로 나누어 ADDRESS_ITAB 과 사업장 주소 BUPLA_ADRESSE 를 읽고 세금계산서 인쇄(CHK_PRTI='X')면 BUPLA_ADRESSE/BUPLA_ADRESSE2 요소를 ADDRESS 창에, 추가 시트면 CUST_ADDR 요소를 CUSTADDR 창에 WRITE_FORM 으로 출력한다.
```abap
4224| IF AUSGLOP_ITAB-XCPDK = 'X'.
4225|
4226| LOOP AT ADDRESS_ITAB WHERE KUNNR = AUSGLOP_ITAB-KUNNR
4227| AND STCD = AUSGLOP_ITAB-STCD.
4228|
4229| IF CHK_PRTI = 'X'.
4230| LOOP AT BUPLA_ADRESSE WHERE BRANCH =
4231| AUSGLOP_ITAB-BUPLA AND AUGBL = AUSGLOP_ITAB-AUGBL .
4232|
4233| CALL FUNCTION 'WRITE_FORM'
4234| EXPORTING
4235| ELEMENT = 'BUPLA_ADRESSE'
4236| WINDOW = 'ADDRESS'
4237| EXCEPTIONS
4238| OTHERS = 1.
4239| IF SY-SUBRC <> 0.
4240| WRITE 'Error in WRITE_FORM, element BUPLA_ADRESSE'(055).
4241| EXIT.
4242| ENDIF.
4243|
4244| CALL FUNCTION 'WRITE_FORM'
4245| EXPORTING
4246| ELEMENT = 'BUPLA_ADRESSE2'
4247| WINDOW = 'ADDRESS2'
4248| EXCEPTIONS
4249| OTHERS = 1.
4250| IF SY-SUBRC <> 0.
4251| WRITE 'Error in WRITE_FORM, element BUPLA_ADRESSE2'(056).
4252| EXIT.
4253| ENDIF.
4254| ENDLOOP.
4255| ELSE.
4256| * In case of printing add. sheet
4257| CALL FUNCTION 'WRITE_FORM'
4258| EXPORTING
4259| ELEMENT = 'CUST_ADDR'
4260| WINDOW = 'CUSTADDR'
4261| EXCEPTIONS
4262| OTHERS = 1.
4263| * IF sy-subrc <> 0.
4264| * WRITE 'Error in WRITE_FORM, element CUST_ADDR'(055).
4265| * EXIT.
4266| * ENDIF.
4267| ENDIF.
4268| ENDLOOP.
4269|
4270| * in case of customers with master data
4271| ELSE.
4272|
4273| IF AUSGLOP_ITAB-FILKD = ' '.
4274|
4275| LOOP AT ADDRESS_ITAB WHERE KUNNR = AUSGLOP_ITAB-KUNNR.
4276|
4277| IF CHK_PRTI = 'X'.
4278| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
4279| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4280|
4281| CALL FUNCTION 'WRITE_FORM'
4282| EXPORTING
4283| ELEMENT = 'BUPLA_ADRESSE'
4284| WINDOW = 'ADDRESS'
4285| EXCEPTIONS
4286| OTHERS = 1.
4287| IF SY-SUBRC <> 0.
4288| WRITE 'Error in WRITE_FORM, element BUPLA_ADRESSE'(055).
4289| EXIT.
4290| ENDIF.
4291|
4292| CALL FUNCTION 'WRITE_FORM'
4293| EXPORTING
4294| ELEMENT = 'BUPLA_ADRESSE2'
4295| WINDOW = 'ADDRESS2'
4296| EXCEPTIONS
4297| OTHERS = 1.
4298| IF SY-SUBRC <> 0.
4299| WRITE 'Error in WRITE_FORM, element BUPLA_ADRESSE2'(056).
4300| EXIT.
4301| ENDIF.
4302| ENDLOOP.
4303| * In case of printing add. sheet
4304| ELSE.
4305| CALL FUNCTION 'WRITE_FORM'
4306| EXPORTING
4307| ELEMENT = 'CUST_ADDR'
4308| WINDOW = 'CUSTADDR'
4309| EXCEPTIONS
4310| OTHERS = 1.
4311| * IF sy-subrc <> 0.
4312| * WRITE 'Error in WRITE_FORM, elementCUST_ADDR'(055).
4313| * EXIT.
4314| * ENDIF.
4315| ENDIF.
4316| ENDLOOP.
4317| ELSE.
4318| LOOP AT ADDRESS_ITAB WHERE KUNNR = AUSGLOP_ITAB-FILKD.
4319| IF CHK_PRTI = 'X'.
4320| LOOP AT BUPLA_ADRESSE WHERE BRANCH = AUSGLOP_ITAB-BUPLA
4321| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4322|
4323| CALL FUNCTION 'WRITE_FORM'
4324| EXPORTING
4325| ELEMENT = 'BUPLA_ADRESSE'
4326| WINDOW = 'ADDRESS'
4327| EXCEPTIONS
4328| OTHERS = 1.
4329| IF SY-SUBRC <> 0.
4330| WRITE 'Error in WRITE_FORM, element BUPLA_ADRESSE'(055).
4331| EXIT.
4332| ENDIF.
4333|
4334| CALL FUNCTION 'WRITE_FORM'
4335| EXPORTING
4336| ELEMENT = 'BUPLA_ADRESSE2'
4337| WINDOW = 'ADDRESS2'
4338| EXCEPTIONS
4339| OTHERS = 1.
4340| IF SY-SUBRC <> 0.
4341| WRITE 'Error in WRITE_FORM, element BUPLA_ADRESSE2'(056).
4342| EXIT.
4343| ENDIF.
(17 생략 전체는 GET /chunks/ZFIR0141%23ZFIR0141%23FORM%23SAP_SCRIPT%23C4)
```
- **EN**: Depending on one-time customer, master customer or branch customer, output the customer and business place address elements (BUPLA_ADRESSE/BUPLA_ADRESSE2 or CUST_ADDR) via WRITE_FORM.
- 호출(파서): WRITE_FORM, WRITE_FORM, WRITE_FORM, WRITE_FORM, WRITE_FORM, WRITE_FORM, WRITE_FORM, WRITE_FORM, WRITE_FORM
- SAP 객체: WRITE_FORM
- 업무 키워드: 고객 주소, 사업장 주소, 일회성 고객, 지점 고객, 세금계산서 인쇄, 추가 시트
- English: One-Time Customer, Business Place, Branch, WRITE_FORM, Address Window
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ADDRESS_ITAB`](#decl-zfir0141-325-address_itab), [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`BUPLA_ADRESSE`](#decl-zfir0141-347-bupla_adresse), [`AUGBL`](#decl-zfir0141-461-augbl), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L4224-L4360` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C4`
#### [calculation] PRINT_SUM_LINE 으로 합계를 인쇄하고 CHECK_ITAB 을 돌며 SD 전용·SD+FI 품목을 PRINT_ITEM_* 로 채운 뒤, 순수 FI 전표(BKPF 전용)는 ALL_ITEMS_ITAB 의 공급가액(HWBAS)·세액(HWSTE)을 통화 편집해 MATZEIL4 라인에 넣고 특별G/L 여부(SAVE_UMSKZ)에 따라 품목명을 TEXT-030 또는 MATZEIL4_ITAB-MATNR 로 채운다.
```abap
4367| PERFORM PRINT_SUM_LINE.
4368|
4369| *----------------------------------------------------------------------*
4370| * Print items
4371| *----------------------------------------------------------------------*
4372|
4373| * recalculate total base amount and tax amount of all sd-positions
4374| * without considering fi-documents ( down payments ... )
4375| CLEAR MATZEIL1.
4376| CLEAR MATZEIL2.
4377| CLEAR MATZEIL3.
4378| CLEAR MATZEIL4.
4379|
4380| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4381| AND KUNNR = AUSGLOP_ITAB-KUNNR
4382| AND STCD = AUSGLOP_ITAB-STCD
4383| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4384|
4385| *--------------------- SD-data--------------------------------------
4386| PERFORM PRINT_ITEM_PURE_SD.
4387|
4388| *---------------------SD+FI-data------------------------------------
4389|
4390| PERFORM PRINT_ITEM_SD_AND_FI.
4391|
4392| *--------------------- FI-data--------------------------------------
4393|
4394| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
4395| IF CHECK_ITAB-AWTYP_SD = ' '.
4396|
4397| * if the cleared invoices are pure FI-documents
4398| * fill first line
4399| CLEAR MATZEIL4.
4400| LOOP AT ALL_ITEMS_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4401| AND KUNNR = AUSGLOP_ITAB-KUNNR
4402| AND STCD = AUSGLOP_ITAB-STCD
4403| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4404|
4405| WRITE ALL_ITEMS_ITAB-HWBAS TO MATZEIL4-NETWR
4406| CURRENCY T001-WAERS USING EDIT MASK 'RRV______________'.
4407| MOVE MATZEIL4-NETWR TO MATZEIL4-NETWR.
4408| WRITE ALL_ITEMS_ITAB-HWSTE TO MATZEIL4-MWSBP
4409| CURRENCY T001-WAERS USING EDIT MASK 'RRV____________'.
4410| MOVE MATZEIL4-MWSBP TO MATZEIL4-MWSBP.
4411|
4412| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4413| AND KUNNR = AUSGLOP_ITAB-KUNNR
4414| AND STCD = AUSGLOP_ITAB-STCD
4415| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4416| IF CHECK_ITAB-SAVE_UMSKZ = ' '.
4417| MOVE TEXT-030 TO MATZEIL4-MATNR.
4418| ELSE.
4419| LOOP AT MATZEIL4_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4420| AND KUNNR = AUSGLOP_ITAB-KUNNR
4421| AND STCD = AUSGLOP_ITAB-STCD
4422| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4423| MOVE MATZEIL4_ITAB-MATNR TO MATZEIL4-MATNR.
4424| ENDLOOP.
4425| ENDIF.
4426| ENDLOOP.
4427| ENDLOOP.
4428| ENDIF.
4429| ENDIF.
4430| ENDLOOP.
```
- **EN**: Print the sum line, fill SD and SD+FI items, and for pure FI documents format tax base and tax amount from ALL_ITEMS_ITAB into item line MATZEIL4 with the material text depending on the special G/L indicator.
- 호출(파서): PRINT_SUM_LINE, PRINT_ITEM_PURE_SD, PRINT_ITEM_SD_AND_FI
- SAP 객체: T001
- 업무 키워드: 합계 라인, 품목 라인, 순수 FI 전표, 공급가액, 세액, 특별 G/L
- English: Sum Line, Item Line, FI Document, Tax Base, Special G/L Indicator
- 정의부(복사 시 함께 필요): [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`MATZEIL4`](#decl-zfir0141-89-matzeil4), [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`T001`](#decl-zfir0141-40-t001), [`MATZEIL4_ITAB`](#decl-zfir0141-367-matzeil4_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L4367-L4430` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C5`
#### [output] 세금계산서 인쇄 모드면 ITEM_LINE_MAT/ITEM_LINE_MAT1 요소를 ITEMS2 창에 WRITE_FORM 하고, 추가 시트 모드면 AUSGLOP_MAT_ITAB 각 품목을 ADD_MAT 요소로 MAIN 창에 APPEND 출력한다.
```abap
4433| IF CHK_PRTI = 'X'.
4434| CALL FUNCTION 'WRITE_FORM'
4435| EXPORTING
4436| ELEMENT = 'ITEM_LINE_MAT'
4437| EXCEPTIONS
4438| OTHERS = 1.
4439| IF SY-SUBRC <> 0.
4440| WRITE 'Error in WRITE_FORM, element ITEM_LINE_MAT'(006).
4441| EXIT.
4442| ENDIF.
4443|
4444| CALL FUNCTION 'WRITE_FORM'
4445| EXPORTING
4446| ELEMENT = 'ITEM_LINE_MAT1'
4447| FUNCTION = 'APPEND'
4448| WINDOW = 'ITEMS2'
4449| EXCEPTIONS
4450| OTHERS = 1.
4451| IF SY-SUBRC <> 0.
4452| WRITE 'Error in WRITE_FORM, element ITEM_LINE_MAT1'(007).
4453| EXIT.
4454| ENDIF.
4455|
4456| * In case of additional sheet
4457| ELSE.
4458| LOOP AT AUSGLOP_MAT_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
4459| AND KUNNR = AUSGLOP_ITAB-KUNNR
4460| AND STCD = AUSGLOP_ITAB-STCD
4461| AND AUGBL = AUSGLOP_ITAB-AUGBL.
4462|
4463| CALL FUNCTION 'WRITE_FORM'
4464| EXPORTING
4465| ELEMENT = 'ADD_MAT'
4466| FUNCTION = 'APPEND'
4467| WINDOW = 'MAIN'
4468| EXCEPTIONS
4469| OTHERS = 1.
4470| IF SY-SUBRC <> 0.
4471| WRITE 'Error in WRITE_FORM, element ITEM_LINE_MAT1'(007).
4472| EXIT.
4473| ENDIF.
4474| ENDLOOP.
4475| ENDIF.
```
- **EN**: Output the item lines via WRITE_FORM: ITEM_LINE_MAT elements for the tax invoice, or one ADD_MAT element per material line for the additional sheet.
- 호출(파서): WRITE_FORM, WRITE_FORM, WRITE_FORM
- SAP 객체: WRITE_FORM
- 업무 키워드: 품목 라인 출력, 추가 시트, 세금계산서 인쇄
- English: WRITE_FORM, Item Line, Additional Sheet
- 정의부(복사 시 함께 필요): [`CHK_PRTI`](#decl-zfir0141-680-chk_prti), [`EXIT`](#decl-zfir0141-463-exit), [`AUSGLOP_MAT_ITAB`](#decl-zfir0141-236-ausglop_mat_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl)
- 위치: `abap://ZFIR0141/ZFIR0141#L4433-L4475` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C6`
#### [fm_call] 고객별 양식을 END_FORM 으로 닫고 현재 세금계산서 번호를 AUGBL 에 보관해 다음 AT NEW 비교에 사용한다.
```abap
4481| CALL FUNCTION 'END_FORM'
4482| EXCEPTIONS
4483| OTHERS = 1.
4484| IF SY-SUBRC <> 0.
4485| WRITE 'Error in END_FORM'(010).
4486| EXIT.
4487| ENDIF.
4488| ENDIF.
4489| ENDAT.
4490| CLEAR AUGBL.
4491| AUGBL = AUSGLOP_ITAB-AUGBL.
```
- **EN**: Close the customer form with END_FORM and keep the current tax invoice number for the next group change.
- 호출(파서): END_FORM
- SAP 객체: END_FORM
- 업무 키워드: 양식 종료, 세금계산서 번호
- English: END_FORM, SAPscript
- 정의부(복사 시 함께 필요): [`EXIT`](#decl-zfir0141-463-exit), [`AUGBL`](#decl-zfir0141-461-augbl), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L4481-L4491` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C7`
#### [fm_call] CLOSE_FORM 으로 인쇄 작업을 종료하고 성공 시 호출 프로그램이 YFIR0601 이고 시뮬레이션이 아니면 UPDATE_TABLE 과 USER_EXIT2 로 BKPF/BSET/BSEG 에 세금계산서 정보를 저장하며, 그 외에는 화면을 떠나고 완료 메시지 S324 를 표시한다.
```abap
4497| CALL FUNCTION 'CLOSE_FORM'
4498| IMPORTING
4499| RESULT = RESULT
4500| EXCEPTIONS
4501| OTHERS = 1.
4502| IF SY-SUBRC <> 0.
4503| WRITE 'Error in CLOSE_FORM'(011).
4504| EXIT.
4505| ELSE.
4506| IF PROG_NAME = 'YFIR0601' AND SIM <> 'X'.
4507| PERFORM UPDATE_TABLE.
4508| PERFORM USER_EXIT2.
4509| ELSE.
4510| LEAVE SCREEN.
4511| CLEAR SIM.
4512| ENDIF.
4513| IF SIM <> 'X'.
4514| MESSAGE S324.
4515| ENDIF.
4516| ENDIF.
```
- **EN**: Close the SAPscript print job with CLOSE_FORM; on success, when run from YFIR0601 in non-simulation mode, persist tax invoice data via UPDATE_TABLE and USER_EXIT2, otherwise leave the screen and show message S324.
- 호출(파서): CLOSE_FORM, UPDATE_TABLE, USER_EXIT2
- SAP 객체: CLOSE_FORM
- 업무 키워드: 인쇄 종료, 세금계산서 번호 저장, 시뮬레이션, 완료 메시지
- English: CLOSE_FORM, SAPscript, Update Table, Simulation
- 정의부(복사 시 함께 필요): [`RESULT`](#decl-zfir0141-391-result), [`EXIT`](#decl-zfir0141-463-exit), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`SIM`](#decl-zfir0141-130-sim)
- 위치: `abap://ZFIR0141/ZFIR0141#L4497-L4516` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#SAP_SCRIPT#C8`
### FORM UPDATE_TABLE — `ZFIR0141` L2145-L2260 (116줄)
*발행(또는 취소)된 세금계산서 번호를 회계전표 헤더 BKPF-BKTXT, 세금항목 BSET-MLDDT, 고객항목 BSEG-XREF3(사업자등록번호)에 반영하여 DB 를 갱신한다.*
> 이 unit 의 조각 5개가 89/116줄(77%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 취소 모드(CANCEL='X')이고 호출 프로그램이 YFIR0601 이 아니면 체크되지 않은 항목을 AUSGLOP_ITAB 에서 삭제해 갱신 대상을 선택 항목으로 한정한다.
```abap
2154| IF CANCEL = 'X' AND PROG_NAME <> 'YFIR0601'.
2155|
2156| LOOP AT AUSGLOP_ITAB WHERE CHECK = ' '.
2157| DELETE AUSGLOP_ITAB.
2158| ENDLOOP.
2159|
2160| ENDIF.
```
- **EN**: In cancel mode (not called from YFIR0601), drop unchecked rows from AUSGLOP_ITAB so only selected tax invoices are updated.
- 테이블(파서): read - / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- 업무 키워드: 세금계산서 취소, 선택 항목, 갱신 대상 한정
- English: Tax Invoice, Cancellation, Selection
- 정의부(복사 시 함께 필요): [`CANCEL`](#decl-zfir0141-486-cancel), [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2154-L2160` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#UPDATE_TABLE#C1`
#### [sql_select] 출력 대상 세금계산서의 회사코드·전표번호·회계연도로 회계전표 헤더 BKPF 와 세금 항목 BSET 을 FOR ALL ENTRIES 로 조회해 BKPF_TAB/BSET_TAB 에 적재한다.
```abap
2162| SELECT * FROM BKPF APPENDING CORRESPONDING FIELDS
2163| OF TABLE BKPF_TAB
2164| FOR ALL ENTRIES IN AUSGLOP_ITAB
2165| WHERE
2166| BUKRS EQ AUSGLOP_ITAB-BUKRS AND
2167| BELNR EQ AUSGLOP_ITAB-BELNR AND
2168| GJAHR EQ AUSGLOP_ITAB-GJAHR.
2169| IF SY-SUBRC = 0.
2170|
2171| SELECT * FROM BSET APPENDING CORRESPONDING FIELDS
2172| OF TABLE BSET_TAB
2173| FOR ALL ENTRIES IN AUSGLOP_ITAB
2174| WHERE
2175| BUKRS = AUSGLOP_ITAB-BUKRS AND
2176| BELNR = AUSGLOP_ITAB-BELNR AND
2177| GJAHR = AUSGLOP_ITAB-GJAHR.
```
- **EN**: Read accounting document headers BKPF and tax line items BSET for all selected tax invoice documents into internal tables.
- 테이블(파서): read [BKPF](/tables/BKPF.md), [BSET](/tables/BSET.md) / write -
- SAP 객체: BKPF, BSET
- 업무 키워드: 회계전표 헤더, 세금 항목, 전표 조회
- English: Accounting Document Header, Tax Line Item, FOR ALL ENTRIES
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0141-43-bkpf), [`BKPF_TAB`](#decl-zfir0141-458-bkpf_tab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BSET`](#decl-zfir0141-34-bset), [`BSET_TAB`](#decl-zfir0141-459-bset_tab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2162-L2177` · confidence 0.9 · `ZFIR0141#ZFIR0141#FORM#UPDATE_TABLE#C2`
#### [calculation] 스마트빌 전송 결과가 성공(RESULT='Y')이고 세금계산서 번호(AUGBL)가 있는 항목에 대해 BKPF-BKTXT 에 세금계산서 번호를, BSET-MLDDT 에 발행일(AUGDT)을 세팅하고 취소 모드면 공백으로 되돌린다.
```abap
2179| LOOP AT AUSGLOP_ITAB WHERE AUGBL NE ' '
2180| AND RESULT EQ 'Y'. " smartbill 2006.07.24
2181|
2182| LOOP AT BKPF_TAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS AND
2183| BELNR = AUSGLOP_ITAB-BELNR AND
2184| GJAHR = AUSGLOP_ITAB-GJAHR.
2185| IF CANCEL = 'X'.
2186| BKPF_TAB-BKTXT = ' '.
2187| ELSE.
2188| BKPF_TAB-BKTXT = AUSGLOP_ITAB-AUGBL.
2189| ENDIF.
2190| MODIFY BKPF_TAB TRANSPORTING BKTXT.
2191| LOOP AT BSET_TAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS AND
2192| BELNR = AUSGLOP_ITAB-BELNR AND
2193| GJAHR = AUSGLOP_ITAB-GJAHR.
2194| IF CANCEL = 'X'.
2195| BSET_TAB-MLDDT = ' '.
2196| ELSE.
2197| BSET_TAB-MLDDT = AUSGLOP_ITAB-AUGDT.
2198| ENDIF.
2199|
2200| MODIFY BSET_TAB TRANSPORTING MLDDT.
2201| ENDLOOP.
2202| ENDLOOP.
2203| ENDLOOP.
```
- **EN**: For successfully transmitted invoices, set the tax invoice number into BKPF-BKTXT and the issue date into BSET-MLDDT (or clear them in cancel mode).
- SAP 객체: BKPF, BSET
- 업무 키워드: 세금계산서 번호, 전표 헤더 텍스트, 발행일, 취소, 스마트빌 결과
- English: Tax Invoice Number, Document Header Text, Reporting Date, Smartbill
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`RESULT`](#decl-zfir0141-391-result), [`BKPF`](#decl-zfir0141-43-bkpf), [`BKPF_TAB`](#decl-zfir0141-458-bkpf_tab), [`CANCEL`](#decl-zfir0141-486-cancel), [`BSET`](#decl-zfir0141-34-bset), [`BSET_TAB`](#decl-zfir0141-459-bset_tab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2179-L2203` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#UPDATE_TABLE#C3`
#### [sql_select] 세금계산서 번호가 '8'로 시작하는 전표의 고객(KOART='D') 라인을 BSEG 에서 읽고, 고객별로 KNA1(일반 고객) 또는 BSEC(일회성 고객 CPD) 의 사업자등록번호 STCD2/STCD1 을 BSEG-XREF3(참조키3)에 채운다.
```abap
2214| LOOP AT BKPF_TAB.
2215| IF BKPF_TAB-BKTXT+0(1) EQ '8'. " 일련번호 체크
2216| SELECT * FROM BSEG APPENDING CORRESPONDING FIELDS
2217| OF TABLE BSEG_TAB WHERE
2218| BUKRS EQ BKPF_TAB-BUKRS AND
2219| BELNR EQ BKPF_TAB-BELNR AND
2220| GJAHR EQ BKPF_TAB-GJAHR AND
2221| KOART = 'D'.
2222| ENDIF.
2223| ENDLOOP.
2224| SORT BSEG_TAB BY BUKRS KUNNR.
2225| LOOP AT BSEG_TAB.
2226| "사업자등록번호를 참조키3(배부)에 넣기.
2227| AT NEW KUNNR.
2228| SELECT SINGLE * FROM KNA1 WHERE
2229| KUNNR = BSEG_TAB-KUNNR.
2230| IF KNA1-XCPDK = ' ' .
2231| IF NOT KNA1-STCD2 IS INITIAL.
2232| BSEG_TAB-XREF3 = KNA1-STCD2.
2233| ELSE.
2234| BSEG_TAB-XREF3 = KNA1-STCD1.
2235| ENDIF.
2236| ELSE.
2237| SELECT SINGLE * FROM BSEC WHERE
2238| BUKRS = BSEG_TAB-BUKRS AND
2239| BELNR = BSEG_TAB-BELNR AND
2240| GJAHR = BSEG_TAB-GJAHR .
2241| IF NOT BSEC-STCD2 IS INITIAL.
2242| BSEG_TAB-XREF3 = BSEC-STCD2.
2243| ELSE.
2244| BSEG_TAB-XREF3 = BSEC-STCD1.
2245| ENDIF.
2246|
2247| MODIFY BSEG_TAB TRANSPORTING XREF3.
2248| ENDIF.
2249| ENDAT.
2250| ENDLOOP.
```
- **EN**: Read customer line items (KOART='D') from BSEG for documents whose invoice number starts with '8' and fill BSEG-XREF3 with the tax registration number from KNA1 or, for one-time customers, from BSEC.
- 테이블(파서): read [BSEG](/tables/BSEG.md), [KNA1](/tables/KNA1.md), [BSEC](/tables/BSEC.md) / write -
- SAP 객체: BSEG, KNA1, BSEC
- 업무 키워드: 사업자등록번호, 참조키3, 고객 항목, 일회성 고객, 전표 라인
- English: Tax Number, Reference Key 3, Customer Line Item, One-Time Customer, BSEG
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0141-43-bkpf), [`BKPF_TAB`](#decl-zfir0141-458-bkpf_tab), [`BSEG`](#decl-zfir0141-35-bseg), [`BSEG_TAB`](#decl-zfir0141-460-bseg_tab), [`KNA1`](#decl-zfir0141-41-kna1), [`BSEC`](#decl-zfir0141-36-bsec)
- 위치: `abap://ZFIR0141/ZFIR0141#L2214-L2250` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#UPDATE_TABLE#C4`
#### [db_write] 변경된 BKPF/BSET/BSEG 내부테이블을 DB 표준 테이블에 직접 MODIFY 하고 COMMIT WORK 하여 세금계산서 번호·발행일·사업자번호를 확정 저장한다.
```abap
2253| MODIFY BKPF FROM TABLE BKPF_TAB.
2254| MODIFY BSET FROM TABLE BSET_TAB.
2255| MODIFY BSEG FROM TABLE BSEG_TAB.
2256| COMMIT WORK.
```
- **EN**: Directly MODIFY the standard tables BKPF, BSET and BSEG from the changed internal tables and COMMIT WORK.
- 테이블(파서): read - / write [BKPF](/tables/BKPF.md), [BSET](/tables/BSET.md), [BSEG](/tables/BSEG.md)
- SAP 객체: BKPF, BSET, BSEG
- 업무 키워드: DB 갱신, 표준 테이블 직접 수정, 커밋
- English: Database Update, MODIFY, COMMIT WORK
- 정의부(복사 시 함께 필요): [`BKPF`](#decl-zfir0141-43-bkpf), [`BKPF_TAB`](#decl-zfir0141-458-bkpf_tab), [`BSET`](#decl-zfir0141-34-bset), [`BSET_TAB`](#decl-zfir0141-459-bset_tab), [`BSEG`](#decl-zfir0141-35-bseg), [`BSEG_TAB`](#decl-zfir0141-460-bseg_tab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2253-L2256` · confidence 0.95 · `ZFIR0141#ZFIR0141#FORM#UPDATE_TABLE#C5`
### FORM USER_EXIT2 — `ZFIR0141` L2385-L2397 (13줄)
*출력 대상 AUSGLOP_ITAB 을 BSID 구조로 옮겨 세금계산서 번호를 BSEG 추가 필드에 저장하는 User Exit FM KR_USER_EXIT_COPY_TAXINVOICE 를 호출한다.*
> 이 unit 의 조각 1개가 8/13줄(62%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] AUSGLOP_ITAB 을 BSID 형 테이블 ZBSID 로 MOVE-CORRESPONDING 하여 채운 뒤 한국 세금계산서 복사 User Exit FM KR_USER_EXIT_COPY_TAXINVOICE 를 호출해 세금계산서 번호를 미결항목 처리용 BSEG 필드에 저장하도록 한다.
```abap
2388| LOOP AT AUSGLOP_ITAB.
2389| MOVE-CORRESPONDING AUSGLOP_ITAB TO ZBSID.
2390| APPEND ZBSID.
2391| ENDLOOP.
2392|
2393| CALL FUNCTION 'KR_USER_EXIT_COPY_TAXINVOICE'
2394| TABLES
2395| ZBSID = ZBSID.
```
- **EN**: Copy AUSGLOP_ITAB into a BSID-typed table and call user exit FM KR_USER_EXIT_COPY_TAXINVOICE so the tax invoice number is stored in an additional BSEG field for open item processing.
- 호출(파서): KR_USER_EXIT_COPY_TAXINVOICE
- SAP 객체: KR_USER_EXIT_COPY_TAXINVOICE, BSID, BSEG
- 업무 키워드: 세금계산서 번호, User Exit, 미결항목, 고객 미결
- English: Tax Invoice, User Exit, Open Item, BSID
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`ZBSID`](#decl-zfir0141-2387-zbsid)
- 위치: `abap://ZFIR0141/ZFIR0141#L2388-L2395` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#USER_EXIT2#C1`
### EVENT AT LINE-SELECTION — `ZFIR0141` L872-L890 (19줄)
*리스트에서 전표번호(AUSGLOP_ITAB-BELNR)를 더블클릭하면 회사코드·전표번호·회계연도 파라미터를 세팅하고 FB03 전표 조회 화면으로 이동한다.*
> 이 unit 의 조각 1개가 12/19줄(63%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 커서가 위치한 필드가 AUSGLOP_ITAB-BELNR 이면 SET PARAMETER ID BLN/BUK/GJR 로 전표번호·회사코드·회계연도를 넘기고 CALL TRANSACTION 'FB03' 로 회계전표를 조회한다.
```abap
873| GET CURSOR FIELD CURSORFIELD.
874| IF SY-SUBRC EQ 0.
875| CASE CURSORFIELD.
876| WHEN 'AUSGLOP_ITAB-BELNR'.
877| IF AUSGLOP_ITAB-BUKRS <> SPACE.
878| SET PARAMETER ID 'BLN' FIELD AUSGLOP_ITAB-BELNR.
879| SET PARAMETER ID 'BUK' FIELD AUSGLOP_ITAB-BUKRS.
880| SET PARAMETER ID 'GJR' FIELD AUSGLOP_ITAB-GJAHR.
881| CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
882| ENDIF.
883| ENDCASE.
884| ENDIF.
```
- **EN**: On line selection of the document number field, set parameter IDs BLN/BUK/GJR and call transaction FB03 to display the accounting document.
- 호출(파서): FB03
- SAP 객체: FB03
- 업무 키워드: 전표 조회, 더블클릭, 전표번호, 회사코드, 회계연도
- English: Accounting Document, Display Document, FB03, Line Selection
- 정의부(복사 시 함께 필요): [`CURSORFIELD`](#decl-zfir0141-129-cursorfield), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L873-L884` · confidence 0.9 · `ZFIR0141#ZFIR0141#EVENT#AT_LINE-SELECTION#C1`
### EVENT AT USER-COMMAND — `ZFIR0141` L802-L871 (70줄)
*세금계산서 리스트 화면의 사용자 명령을 처리하여 전체 선택/해제, 뒤로가기 시 테이블 갱신, 저장 시 취소 처리 또는 재발행(REPRINT)을 분기한다.*
> 이 unit 의 조각 2개가 51/70줄(73%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] BACK1/BACK2 시 YFIR0601 에서 호출되고 시뮬레이션이 아니면 UPDATE_TABLE 과 USER_EXIT2 로 전표에 세금계산서 번호를 반영한 뒤 화면을 떠나며 완료 메시지 S324 를 표시한다.
```abap
814| WHEN 'BACK1'.
815| IF PROG_NAME = 'YFIR0601' AND SIM <> 'X'.
816| PERFORM UPDATE_TABLE.
817| PERFORM USER_EXIT2.
818| ENDIF.
819| LEAVE SCREEN.
820| IF SIM <> 'X'.
821| MESSAGE S324.
822| ENDIF.
823| CLEAR SIM.
824|
825| WHEN 'BACK2'.
826|
827| IF PROG_NAME = 'YFIR0601' AND SIM <> 'X'.
828| PERFORM UPDATE_TABLE.
829| PERFORM USER_EXIT2.
830| ENDIF.
831| LEAVE SCREEN.
832| IF SIM <> 'X'.
833| MESSAGE S324.
834| ENDIF.
835| CLEAR SIM.
```
- **EN**: On BACK1/BACK2, when called from YFIR0601 in non-simulation mode, run UPDATE_TABLE and USER_EXIT2 to store the tax invoice number, then leave the screen with message S324.
- 호출(파서): UPDATE_TABLE, USER_EXIT2, UPDATE_TABLE, USER_EXIT2
- 업무 키워드: 뒤로가기, 세금계산서 번호 반영, 시뮬레이션, 전표 갱신
- English: User Command, Update Table, User Exit, Simulation
- 정의부(복사 시 함께 필요): [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`SIM`](#decl-zfir0141-130-sim)
- 위치: `abap://ZFIR0141/ZFIR0141#L814-L835` · confidence 0.8 · `ZFIR0141#ZFIR0141#EVENT#AT_USER-COMMAND#C1`
#### [control_flow] SAVE 시 SEL_DOCUMENT 로 선택 항목을 확정하고, 취소 모드(CANCEL='X')면 UPDATE_TABLE·USER_EXIT1 로 세금계산서 취소를 반영하고 S323 메시지 후 종료하며, 아니면 REPRINT 로 재발행을 수행한다.
```abap
837| WHEN 'SAVE'.
838| PERFORM SEL_DOCUMENT.
839| IF CANCEL = 'X'.
840|
841| PERFORM UPDATE_TABLE.
842|
843| *User Exit to track cancelled tax invoices....
844| PERFORM USER_EXIT1.
845| *----------------------------------------------------------------------*
846| *User Exit for updating tables in customer name space
847| *----------------------------------------------------------------------*
848| MESSAGE S323.
849| LEAVE SCREEN.
850| EXIT.
851|
852| ELSE.
853|
854|
855| PERFORM REPRINT.
856| *&&&&&&* 2004.5.10. 저장할때 테이블 업데이트 세금계산서번호
857| * IF prog_name = 'YFIR0601' AND sim <> 'X'.
858| * PERFORM update_table.
859| * PERFORM user_exit2.
860| * ENDIF.
861| * CLEAR sim.
862| *&&&&&&&*
863|
864|
865| ENDIF.
```
- **EN**: On SAVE, determine selected documents (SEL_DOCUMENT); in cancel mode update tables and call USER_EXIT1 to track cancelled tax invoices, otherwise perform REPRINT.
- 호출(파서): SEL_DOCUMENT, UPDATE_TABLE, USER_EXIT1, REPRINT
- 업무 키워드: 저장, 세금계산서 취소, 재발행, 선택 확정
- English: Save, Tax Invoice Cancellation, Reprint, User Exit
- 정의부(복사 시 함께 필요): [`CANCEL`](#decl-zfir0141-486-cancel), [`EXIT`](#decl-zfir0141-463-exit), [`REPRINT`](#decl-zfir0141-485-reprint)
- 위치: `abap://ZFIR0141/ZFIR0141#L837-L865` · confidence 0.85 · `ZFIR0141#ZFIR0141#EVENT#AT_USER-COMMAND#C2`
### FORM SET_SELECTION — `ZFIR0141` L2774-L2783 (10줄)
*리스트의 전체 선택/해제 플래그를 AUSGLOP_ITAB2-CHECK 에 반영하고 화면 라인의 체크박스 값을 MODIFY LINE 으로 갱신한다.*
> 이 unit 의 조각 1개가 7/10줄(70%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] 전체 선택/해제 FLAG 를 AUSGLOP_ITAB2 의 CHECK 필드에 MODIFY 로 일괄 반영하고 각 리스트 라인(LIST_LINE)을 READ LINE/MODIFY LINE 으로 갱신해 화면 체크박스를 동기화한다.
```abap
2776| CHECK FLAG = 'X' OR FLAG = ' '.
2777| AUSGLOP_ITAB2-CHECK = FLAG.
2778| MODIFY AUSGLOP_ITAB2 TRANSPORTING CHECK WHERE CHECK <> FLAG.
2779| LOOP AT AUSGLOP_ITAB2.
2780| READ LINE AUSGLOP_ITAB2-LIST_LINE.
2781| MODIFY LINE AUSGLOP_ITAB2-LIST_LINE FIELD VALUE AUSGLOP_ITAB2-CHECK.
2782| ENDLOOP.
```
- **EN**: Set the select-all/deselect flag on AUSGLOP_ITAB2-CHECK and refresh each list line checkbox via MODIFY LINE.
- 테이블(파서): read - / write [AUSGLOP_ITAB2](/tables/AUSGLOP_ITAB2.md), [LINE](/tables/LINE.md)
- 업무 키워드: 전체 선택, 체크박스, 리스트 갱신, 발행 대상 선택
- English: Select All, Checkbox, MODIFY LINE, List
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB2`](#decl-zfir0141-215-ausglop_itab2)
- 위치: `abap://ZFIR0141/ZFIR0141#L2776-L2782` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SET_SELECTION#C1`
### FORM SEL_DOCUMENT — `ZFIR0141` L2792-L2836 (45줄)
*리스트 화면에서 체크된 라인을 읽어 해당 세금계산서 번호(AUGBL)에 속한 AUSGLOP_ITAB/AUSGLOP_ITAB2 항목의 CHECK 플래그를 설정하고 선택 건수를 센다.*
> 이 unit 의 조각 2개가 34/45줄(76%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] 리스트 각 줄을 READ LINE 으로 읽어 체크박스 값과 세금계산서 번호(DOC_NO)를 추출하고 FILL_ZEROS 로 선행 0 을 채운 뒤, 체크된 세금계산서 번호에 해당하는 AUSGLOP_ITAB2 및 AUSGLOP_ITAB 항목의 CHECK 를 'X' 로 표시한다.
```abap
2800| DO.
2801| READ LINE SY-INDEX FIELD VALUE AUSGLOP_ITAB2-CHECK.
2802|
2803| IF SY-SUBRC NE 0.
2804| EXIT.
2805|
2806| ENDIF.
2807|
2808| FLAG = SY-LISEL(1).
2809|
2810| DOC_NO = SY-LISEL+2(10).
2811| IF NOT ( DOC_NO IS INITIAL ).
2812|
2813| PERFORM FILL_ZEROS CHANGING DOC_NO.
2814|
2815| ENDIF.
2816|
2817| IF FLAG = 'X'.
2818| LOOP AT AUSGLOP_ITAB2 WHERE AUGBL = DOC_NO.
2819| AUSGLOP_ITAB2-CHECK = FLAG.
2820| MODIFY AUSGLOP_ITAB2.
2821| LOOP AT AUSGLOP_ITAB WHERE AUGBL = AUSGLOP_ITAB2-AUGBL.
2822| AUSGLOP_ITAB-CHECK = 'X'.
2823| MODIFY AUSGLOP_ITAB.
2824| ENDLOOP.
2825|
2826| ENDLOOP.
2827| ENDIF.
2828| ENDDO.
```
- **EN**: Read each list line, extract checkbox and tax invoice number (zero-padded via FILL_ZEROS), and mark matching AUSGLOP_ITAB2/AUSGLOP_ITAB rows as selected.
- 테이블(파서): read - / write [AUSGLOP_ITAB2](/tables/AUSGLOP_ITAB2.md), [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- 호출(파서): FILL_ZEROS
- 업무 키워드: 선택 항목, 체크박스, 세금계산서 번호, 리스트 읽기
- English: READ LINE, Selection, Tax Invoice Number, Clearing Document
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB2`](#decl-zfir0141-215-ausglop_itab2), [`EXIT`](#decl-zfir0141-463-exit), [`FLAG`](#decl-zfir0141-2795-flag), [`DOC_NO`](#decl-zfir0141-2794-doc_no), [`AUGBL`](#decl-zfir0141-461-augbl), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2800-L2828` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#SEL_DOCUMENT#C1`
#### [aggregation] 직접 실행(PROG_NAME 공백)인 경우 체크된 AUSGLOP_ITAB 건수를 G_LINES 에 집계한다.
```abap
2830| IF PROG_NAME EQ SPACE.
2831| LOOP AT AUSGLOP_ITAB WHERE CHECK = 'X'.
2832| ADD 1 TO G_LINES.
2833| ENDLOOP.
2834| ENDIF.
```
- **EN**: Count selected AUSGLOP_ITAB rows into G_LINES when the program runs standalone.
- 업무 키워드: 선택 건수, 집계
- English: Count, Selected Rows
- 정의부(복사 시 함께 필요): [`PROG_NAME`](#decl-zfir0141-462-prog_name), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`G_LINES`](#decl-zfir0141-487-g_lines)
- 위치: `abap://ZFIR0141/ZFIR0141#L2830-L2834` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#SEL_DOCUMENT#C2`
### FORM FILL_ZEROS — `ZFIR0141` L2844-L2856 (13줄)
*문서번호 등 문자 필드를 우측 정렬한 뒤 앞쪽 공백을 '0'으로 채워 선행 0 형식으로 만든다.*
> 이 unit 의 조각 1개가 7/13줄(54%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 필드를 우측 정렬한 후 공백이 없을 때까지 ' ' 을 '0' 으로 치환하여 전표번호 등을 선행 0 이 채워진 형식으로 변환한다.
```abap
2847| WRITE P_FIELD TO P_FIELD RIGHT-JUSTIFIED.
2848| DO.
2849| REPLACE ' ' WITH '0' INTO P_FIELD.
2850| IF SY-SUBRC <> 0.
2851| EXIT.
2852| ENDIF.
2853| ENDDO.
```
- **EN**: Right-justify the field and replace all blanks with zeros to produce a leading-zero padded document number.
- 업무 키워드: 선행 0, 전표번호 형식, 문자 치환
- English: Leading Zeros, Conversion
- 정의부(복사 시 함께 필요): [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141#L2847-L2853` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#FILL_ZEROS#C1`
### FORM USER_EXIT1 — `ZFIR0141` L2366-L2372 (7줄)
*세금계산서 취소용 사용자 EXIT FM KR_USER_EXIT_CANCEL_TAXINVOICE 를 호출해 출력 대상 AUSGLOP_ITAB 을 고객사 로직으로 후처리한다.*
> 이 unit 의 조각 1개가 3/7줄(43%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [fm_call] 출력 대상 세금계산서 테이블 AUSGLOP_ITAB 을 넘겨 한국 세금계산서 취소 User Exit FM KR_USER_EXIT_CANCEL_TAXINVOICE 를 호출한다.
```abap
2368| CALL FUNCTION 'KR_USER_EXIT_CANCEL_TAXINVOICE'
2369| TABLES
2370| YAUSGLOP_ITAB = AUSGLOP_ITAB.
```
- **EN**: Call the Korean tax invoice cancellation user exit FM KR_USER_EXIT_CANCEL_TAXINVOICE with the output table AUSGLOP_ITAB.
- 호출(파서): KR_USER_EXIT_CANCEL_TAXINVOICE
- SAP 객체: KR_USER_EXIT_CANCEL_TAXINVOICE
- 업무 키워드: 세금계산서 취소, User Exit, 출력 대상
- English: Tax Invoice, User Exit, Cancellation
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab)
- 위치: `abap://ZFIR0141/ZFIR0141#L2368-L2370` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#USER_EXIT1#C1`
### FORM GET_TAXES — `ZFIR0141` L962-L1008 (47줄)
*세금계산서 출력 항목의 공급가액·세액을 매출부가세 계정(0040605000)의 BSET 라인에서 가져온다.*
> 이 unit 의 조각 1개가 40/47줄(85%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 세금코드가 A6(0% 이면서 세금계산서를 발행하는 코드)인지에 따라 조회 조건을 나눠, 매출부가가치세 계정 0040605000 의 세금 라인(BSET)에서 공급가액과 세액을 가져온다. 일반 코드는 세액이 있는 라인만, A6 은 세액 0 을 포함해 읽는다. 대변(S, 반품·감액 전표)인 경우 부호를 반전한다. 특소세 때문에 공급가액이 두 번 더해지는 것을 막기 위해 계정번호를 조건으로 고정한 것이 이 로직의 핵심이다.
```abap
968| IF AUSGLOP_ITAB-MWSKZ <> 'A6'.
969| SELECT * FROM BSET WHERE BUKRS = AUSGLOP_ITAB-BUKRS
970| AND BELNR = AUSGLOP_ITAB-BELNR
971| AND GJAHR = AUSGLOP_ITAB-GJAHR
972| AND HKONT = '0040605000'
973| AND HWSTE <> ''.
974| * and mwskz = ausglop_itab-mwskz.
975|
976| * in case of a credit memo
977| IF BSET-SHKZG = 'S'.
978| BSET-HWBAS = -1 * BSET-HWBAS.
979| BSET-HWSTE = -1 * BSET-HWSTE.
980| ENDIF.
981| MOVE BSET-MWSKZ TO AUSGLOP_ITAB-MWSKZ.
982| MOVE BSET-SHKZG TO AUSGLOP_ITAB-SHKZG.
983| MOVE BSET-HWBAS TO AUSGLOP_ITAB-HWBAS.
984| MOVE BSET-HWSTE TO AUSGLOP_ITAB-HWSTE.
985| MODIFY AUSGLOP_ITAB.
986| ENDSELECT.
987|
988| ELSEIF AUSGLOP_ITAB-MWSKZ = 'A6'.
989| SELECT * FROM BSET WHERE BUKRS = AUSGLOP_ITAB-BUKRS
990| AND BELNR = AUSGLOP_ITAB-BELNR
991| AND GJAHR = AUSGLOP_ITAB-GJAHR
992| AND HKONT = '0040605000'.
993|
994| * and mwskz = ausglop_itab-mwskz.
995|
996| * in case of a credit memo
997| IF BSET-SHKZG = 'S'.
998| BSET-HWBAS = -1 * BSET-HWBAS.
999| BSET-HWSTE = -1 * BSET-HWSTE.
1000| ENDIF.
1001| MOVE BSET-MWSKZ TO AUSGLOP_ITAB-MWSKZ.
1002| MOVE BSET-SHKZG TO AUSGLOP_ITAB-SHKZG.
1003| MOVE BSET-HWBAS TO AUSGLOP_ITAB-HWBAS.
1004| MOVE BSET-HWSTE TO AUSGLOP_ITAB-HWSTE.
1005| MODIFY AUSGLOP_ITAB.
1006| ENDSELECT.
1007| ENDIF.
```
- **EN**: Pulls tax base and tax amount from BSET restricted to the output-VAT account 0040605000, branching on tax code A6 (zero-rate but invoice-issuing) and flipping signs for credit memos; the account restriction prevents double-counting caused by special excise tax.
- 테이블(파서): read [BSET](/tables/BSET.md) / write [AUSGLOP_ITAB](/tables/AUSGLOP_ITAB.md)
- SAP 객체: BSET, HKONT, MWSKZ, HWBAS, HWSTE, SHKZG
- 업무 키워드: 세금계산서, 공급가액, 세액, 매출부가세, 영세율, 특소세, 반품, 부호반전, 세금코드
- English: tax invoice, tax base, tax amount, output VAT, zero rate, special excise tax, credit memo, tax code
- 정의부(복사 시 함께 필요): [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`BSET`](#decl-zfir0141-34-bset)
- 위치: `abap://ZFIR0141/ZFIR0141#L968-L1007` · confidence 0.83 · `ZFIR0141#ZFIR0141#FORM#GET_TAXES#C1`
### FORM WRITE_LINES_FI — `ZFIR0141` L3143-L3223 (81줄)
*세금계산서 양식의 FI 품목 4줄(MATZEIL1~4)을 월/일·품목·단위·수량·단가·공급가액·세액 컬럼 위치에 맞춰 WRITE 로 인쇄한다.*
> 이 unit 의 조각 2개가 62/81줄(76%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [output] 첫 번째 품목 라인의 전기일(BUDAT)에서 월·일을 추출하고 수량(FKIMG)을 CIRCULAR SHIFT 로 정렬한 뒤 품목·단위·수량·단가·공급가액(NETWR)·세액(MWSBP)을 KRW 통화 형식으로 세금계산서 양식 위치에 WRITE 한다.
```abap
3148| MM1 = MATZEIL1-BUDAT+4(2).
3149| DD1 = MATZEIL1-BUDAT+6(2).
3150|
3151| L_LEN = STRLEN( MATZEIL1-FKIMG ).
3152| DO L_LEN TIMES.
3153| SHIFT MATZEIL1-FKIMG CIRCULAR.
3154| ENDDO.
3155|
3156| WRITE:/ TEXT-CA2, 2 MM1, 5 TEXT-CA2, 6 DD1, 10 TEXT-CA2,
3157| 11 MATZEIL1-MATNR, 28 TEXT-CA2,
3158| 29 MATZEIL1-VRKME, 34 TEXT-CA2, 35 MATZEIL1-FKIMG+5(8),
3159| 45 TEXT-CA2,
3160| 46 MATZEIL1-UPRICE CURRENCY 'KRW', 63 TEXT-CA2,
3161| 64 MATZEIL1-NETWR CURRENCY 'KRW', 82 TEXT-CA2,
3162| 83 MATZEIL1-MWSBP CURRENCY 'KRW', 98 TEXT-CA2,
3163| 117 TEXT-CA2.
3164| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Extract month/day from posting date of the first item line, align quantity and WRITE material, unit, quantity, unit price, net value and tax amount in KRW at fixed tax invoice form columns.
- 업무 키워드: 세금계산서 인쇄, 품목 라인, 공급가액, 세액, 전기일, 수량
- English: Tax Invoice, Line Item, Net Value, Tax Amount, WRITE
- 정의부(복사 시 함께 필요): [`MM1`](#decl-zfir0141-3144-mm1), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL1`](#decl-zfir0141-86-matzeil1), [`DD1`](#decl-zfir0141-3144-dd1), [`L_LEN`](#decl-zfir0141-3144-l_len)
- 위치: `abap://ZFIR0141/ZFIR0141#L3148-L3164` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#WRITE_LINES_FI#C1`
#### [output] 두 번째~네 번째 품목 라인(MATZEIL2~4)도 동일하게 수량을 정렬한 뒤 품목·단위·수량·단가·공급가액·세액을 KRW 통화 형식으로 세금계산서 양식에 WRITE 한다.
```abap
3177| L_LEN = STRLEN( MATZEIL2-FKIMG ).
3178| DO L_LEN TIMES.
3179| SHIFT MATZEIL2-FKIMG CIRCULAR.
3180| ENDDO.
3181|
3182| WRITE:/ TEXT-CA2, 5 TEXT-CA2, 10 TEXT-CA2, 11 MATZEIL2-MATNR,
3183| 28 TEXT-CA2,
3184| 29 MATZEIL2-VRKME, 34 TEXT-CA2, 35 MATZEIL2-FKIMG+5(8),
3185| 45 TEXT-CA2,
3186| 46 MATZEIL2-UPRICE CURRENCY 'KRW', 63 TEXT-CA2,
3187| 64 MATZEIL2-NETWR CURRENCY 'KRW', 82 TEXT-CA2,
3188| 83 MATZEIL2-MWSBP CURRENCY 'KRW', 98 TEXT-CA2,
3189| 117 TEXT-CA2.
3190| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
3191|
3192| * third item -----------------------------------------------------------
3193| L_LEN = STRLEN( MATZEIL3-FKIMG ).
3194| DO L_LEN TIMES.
3195| SHIFT MATZEIL3-FKIMG CIRCULAR.
3196| ENDDO.
3197| WRITE:/ TEXT-CA2, 5 TEXT-CA2, 10 TEXT-CA2, 11 MATZEIL3-MATNR,
3198| 28 TEXT-CA2,
3199| 29 MATZEIL3-VRKME, 34 TEXT-CA2, 35 MATZEIL3-FKIMG+5(8),
3200| 45 TEXT-CA2,
3201| 46 MATZEIL3-UPRICE CURRENCY 'KRW', 63 TEXT-CA2,
3202| 64 MATZEIL3-NETWR CURRENCY 'KRW', 82 TEXT-CA2,
3203| 83 MATZEIL3-MWSBP CURRENCY 'KRW', 98 TEXT-CA2,
3204| 117 TEXT-CA2.
3205| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
3206|
3207| * fourth item ----------------------------------------------------------
3208| L_LEN = STRLEN( MATZEIL4-FKIMG ).
3209| DO L_LEN TIMES.
3210| SHIFT MATZEIL4-FKIMG CIRCULAR.
3211| ENDDO.
3212|
3213| WRITE:/ TEXT-CA2, 5 TEXT-CA2, 10 TEXT-CA2, 11 MATZEIL4-MATNR,
3214| 28 TEXT-CA2,
3215| 29 MATZEIL4-VRKME, 34 TEXT-CA2, 35 MATZEIL4-FKIMG+5(8),
3216| 45 TEXT-CA2,
3217| 46 MATZEIL4-UPRICE CURRENCY 'KRW', 63 TEXT-CA2,
3218| 64 MATZEIL4-NETWR CURRENCY 'KRW', 82 TEXT-CA2,
3219| 83 MATZEIL4-MWSBP CURRENCY 'KRW', 98 TEXT-CA2,
3220| 117 TEXT-CA2.
3221| WRITE:/ TEXT-CA1, 117 TEXT-CA2.
```
- **EN**: Print the second to fourth FI item lines (MATZEIL2-4) with material, unit, quantity, unit price, net value and tax amount in KRW at the tax invoice form columns.
- 업무 키워드: 세금계산서 인쇄, 품목 라인, 공급가액, 세액
- English: Tax Invoice, Line Item, WRITE
- 정의부(복사 시 함께 필요): [`L_LEN`](#decl-zfir0141-3144-l_len), [`MATTYPE`](#decl-zfir0141-58-mattype), [`MATZEIL2`](#decl-zfir0141-87-matzeil2), [`MATZEIL3`](#decl-zfir0141-88-matzeil3), [`MATZEIL4`](#decl-zfir0141-89-matzeil4)
- 위치: `abap://ZFIR0141/ZFIR0141#L3177-L3221` · confidence 0.8 · `ZFIR0141#ZFIR0141#FORM#WRITE_LINES_FI#C2`
### FORM PRINT_SUM_LINE_SMARTBILL — `ZFIR0141` L5293-L5355 (63줄)
*스마트빌 전송용 합계 라인을 만들기 위해 CHECK_ITAB/ALL_ITEMS_ITAB 를 돌며 SD·FI 원천 구분(AWTYP)에 따라 총금액·총공급가액·총세액을 GT_ZSBBSEG 에 채운다.*
> 이 unit 의 조각 1개가 59/63줄(94%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [aggregation] 현재 세금계산서(BUKRS/KUNNR/STCD/AUGBL) 에 속한 항목을 LOOP 하며 SD 전용(VBRK), FI 전용(BKPF), SD+FI 혼합 여부에 따라 NETWR/MWSBP 또는 HWBAS/HWSTE 로 총금액(ZTTAT)·공급가액(HWBAS)·세액(HWSTE)을 계산해 스마트빌 항목 구조 GT_ZSBBSEG 에 KRW 로 세팅한다.
```abap
5295| LOOP AT CHECK_ITAB WHERE BUKRS = AUSGLOP_ITAB-BUKRS
5296| AND KUNNR = AUSGLOP_ITAB-KUNNR
5297| AND STCD = AUSGLOP_ITAB-STCD
5298| AND AUGBL = AUSGLOP_ITAB-AUGBL.
5299|
5300| LOOP AT ALL_ITEMS_ITAB WHERE BUKRS = CHECK_ITAB-BUKRS
5301| AND KUNNR = CHECK_ITAB-KUNNR
5302| AND STCD = CHECK_ITAB-STCD
5303| AND AUGBL = CHECK_ITAB-AUGBL.
5304|
5305| * only sd-data
5306| IF CHECK_ITAB-AWTYP_SD = 'VBRK'.
5307| IF CHECK_ITAB-AWTYP_FI = ' '.
5308|
5309| * 총금액
5310| GT_ZSBBSEG-ZTTAT
5311| = ALL_ITEMS_ITAB-NETWR + ALL_ITEMS_ITAB-MWSBP.
5312| * 총공급가액
5313| GT_ZSBBSEG-HWBAS = ALL_ITEMS_ITAB-NETWR.
5314| * 총세액
5315| GT_ZSBBSEG-HWSTE = ALL_ITEMS_ITAB-MWSBP.
5316| * 통화
5317| GT_ZSBBSEG-HWAER = 'KRW'.
5318| ENDIF.
5319| ENDIF.
5320|
5321| * only fi-data
5322| IF CHECK_ITAB-AWTYP_SD = ' '.
5323| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
5324| * 총금액
5325| GT_ZSBBSEG-ZTTAT
5326| = ALL_ITEMS_ITAB-NETWR + ALL_ITEMS_ITAB-MWSBP.
5327| * 총공급가액
5328| GT_ZSBBSEG-HWBAS = ALL_ITEMS_ITAB-HWBAS.
5329| * 총세액
5330| GT_ZSBBSEG-HWSTE = ALL_ITEMS_ITAB-HWSTE.
5331| * 통화
5332| GT_ZSBBSEG-HWAER = 'KRW'.
5333| ENDIF.
5334| ENDIF.
5335|
5336| * FI + SD-data
5337| IF CHECK_ITAB-AWTYP_SD = 'VBRK'.
5338| IF CHECK_ITAB-AWTYP_FI = 'BKPF'.
5339| * 총금액
5340| GT_ZSBBSEG-ZTTAT
5341| = ALL_ITEMS_ITAB-NETWR + ALL_ITEMS_ITAB-MWSBP.
5342| * 총공급가액
5343| GT_ZSBBSEG-HWBAS = ALL_ITEMS_ITAB-NETWR.
5344| * 총세액
5345| GT_ZSBBSEG-HWSTE = ALL_ITEMS_ITAB-MWSBP.
5346| * 통화
5347| GT_ZSBBSEG-HWAER = 'KRW'.
5348| ENDIF.
5349| ENDIF.
5350|
5351| ENDLOOP.
5352|
5353| ENDLOOP.
```
- **EN**: Loop over CHECK_ITAB and ALL_ITEMS_ITAB for the current tax invoice and derive total amount, tax base and tax amount into GT_ZSBBSEG depending on whether the source is SD billing (VBRK), FI document (BKPF) or both.
- SAP 객체: VBRK, BKPF, GT_ZSBBSEG
- 업무 키워드: 합계 라인, 총공급가액, 총세액, 스마트빌, SD 빌링, FI 전표, 반제전표
- English: Tax Invoice, Billing Document, Tax Base, Tax Amount, Smartbill
- 정의부(복사 시 함께 필요): [`CHECK_ITAB`](#decl-zfir0141-397-check_itab), [`AUSGLOP_ITAB`](#decl-zfir0141-163-ausglop_itab), [`AUGBL`](#decl-zfir0141-461-augbl), [`ALL_ITEMS_ITAB`](#decl-zfir0141-260-all_items_itab), [`GT_ZSBBSEG`](#decl-zfir0141-499-gt_zsbbseg)
- 위치: `abap://ZFIR0141/ZFIR0141#L5295-L5353` · confidence 0.85 · `ZFIR0141#ZFIR0141#FORM#PRINT_SUM_LINE_SMARTBILL#C1`
### FORM CALCULATE_ZNCNT — `ZFIR0141F01` L101-L120 (20줄)
*세금계산서 공급가액(P_HWBAS)을 12자리 통화 형식으로 편집한 뒤 앞쪽 공백 수를 세어 세금계산서 공란수(ZSB_HEADER-ZNCNT)를 계산한다.*
> 이 unit 의 조각 1개가 14/20줄(70%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [calculation] 공급가액을 CURRENCY 편집·우측정렬한 12자리 문자열로 만들고 선행 공백 개수를 세어 스마트빌 헤더의 공란수(ZNCNT)를 구하되, 음수 금액이면 '-' 자리를 감안해 1을 뺀다.
```abap
106| WRITE P_HWBAS TO LV_HWBAS CURRENCY P_HWAER
107| RIGHT-JUSTIFIED
108| NO-GROUPING.
109| DO 12 TIMES.
110| IF LV_HWBAS+0(1) EQ SPACE.
111| ZSB_HEADER-ZNCNT = ZSB_HEADER-ZNCNT + 1.
112| SHIFT LV_HWBAS.
113| ELSE.
114| IF P_HWBAS CS '-'. " 금액이 -인 경우 공란수 1개 뺌.
115| ZSB_HEADER-ZNCNT = ZSB_HEADER-ZNCNT - 1.
116| ENDIF.
117| EXIT.
118| ENDIF.
119| ENDDO.
```
- **EN**: Format the tax base amount right-justified with currency editing and count leading blanks to derive the tax invoice blank-digit count (ZSB_HEADER-ZNCNT), subtracting one for a negative sign.
- SAP 객체: ZSB_HEADER
- 업무 키워드: 공란수, 공급가액, 세금계산서, 음수 금액, 자릿수 계산
- English: Tax Invoice, Blank Count, Tax Base Amount, Currency Formatting
- 정의부(복사 시 함께 필요): [`LV_HWBAS`](#decl-zfir0141f01-103-lv_hwbas), [`ZSB_HEADER`](#decl-zfir0141-521-zsb_header), [`EXIT`](#decl-zfir0141-463-exit)
- 위치: `abap://ZFIR0141/ZFIR0141F01#L106-L119` · confidence 0.9 · `ZFIR0141#ZFIR0141F01#FORM#CALCULATE_ZNCNT#C1`
### MODULE USER_COMMAND_0100 INPUT — `ZFIR0141I01` L9-L29 (21줄)
*화면 0100의 사용자 명령(PAI)을 처리하여 &NT1 시 ALV 그리드(GRID3)의 변경 데이터를 검증한 뒤 화면을 종료하고 EXIT 시 화면을 닫는 플럼빙 모듈이다.*
> 이 unit 의 조각 1개가 14/21줄(67%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [control_flow] OK_CODE 분기: &NT1 이면 GRID3->CHECK_CHANGED_DATA 로 ALV 편집 내용을 반영·검증하고 SET SCREEN 0 으로 팝업을 닫으며, EXIT 이면 바로 화면을 종료한다.
```abap
14| CASE SAVE_CODE.
15| WHEN '&NT1'.
16| DATA: L_VALID2 TYPE C.
17| DATA: L_LINE TYPE I.
18| SY-UCOMM = SAVE_CODE.
19| CALL METHOD GRID3->CHECK_CHANGED_DATA
20| IMPORTING
21| E_VALID = L_VALID2.
22|
23| SET SCREEN 0.
24|
25| WHEN 'EXIT'.
26| SET SCREEN 0.
27| ENDCASE.
```
- **EN**: Dispatch user command: on &NT1 call GRID3->CHECK_CHANGED_DATA to validate ALV grid changes then leave screen 0100; on EXIT leave the screen.
- 호출(파서): GRID3->CHECK_CHANGED_DATA
- SAP 객체: CL_GUI_ALV_GRID, CHECK_CHANGED_DATA
- 업무 키워드: 사용자 명령, ALV 변경 검증, 화면 종료, PAI
- English: User Command, ALV Grid, CHECK_CHANGED_DATA, PAI
- 정의부(복사 시 함께 필요): [`OK_CODE`](#decl-zfir0141-613-ok_code), [`SAVE_CODE`](#decl-zfir0141-614-save_code), [`GRID3`](#decl-zfir0141-599-grid3)
- 위치: `abap://ZFIR0141/ZFIR0141I01#L14-L27` · confidence 0.85 · `ZFIR0141#ZFIR0141I01#MODULE#USER_COMMAND_0100_INPUT#C1`
## 정의부 (199건)
로직 조각을 다른 프로그램으로 옮겨 붙일 때 **함께 가야 하는 선언**이다. 조각별로 무엇이 필요한지는 위 조각 항목의 `정의부` 줄에 있고(이름을 누르면 여기로 온다), 붙여넣기용으로 의존까지 묶은 코드는 `GET /chunks/<chunk_id>``declaration_code` 로 받는다.
### `ZFIR0141` (198건)
#### BSET — tables · L34-L34 {#decl-zfir0141-34-bset}
```abap
TABLES: BSET. " tax data document segment
```
#### BSEG — tables · L35-L35 {#decl-zfir0141-35-bseg}
```abap
TABLES:
BSEG. " accounting document segment
```
#### BSEC — tables · L36-L36 {#decl-zfir0141-36-bsec}
```abap
TABLES:
BSEC. " One-time account data document
```
#### VBRK — tables · L38-L38 {#decl-zfir0141-38-vbrk}
```abap
TABLES:
VBRK. " billing : header data
```
#### VBRP — tables · L39-L39 {#decl-zfir0141-39-vbrp}
```abap
TABLES:
VBRP. " billing : item data
```
#### T001 — tables · L40-L40 {#decl-zfir0141-40-t001}
```abap
TABLES:
T001. " company codes
```
#### KNA1 — tables · L41-L41 {#decl-zfir0141-41-kna1}
```abap
TABLES:
KNA1. " customers
```
#### FIMSG — tables · L42-L42 {#decl-zfir0141-42-fimsg}
```abap
TABLES:
FIMSG. " structure
```
#### BKPF — tables · L43-L43 {#decl-zfir0141-43-bkpf}
```abap
TABLES:
BKPF. " acc. document header
```
#### BSAD — tables · L44-L44 {#decl-zfir0141-44-bsad}
```abap
TABLES:
BSAD. " sec. index for customers :
```
#### VBPA — tables · L46-L46 {#decl-zfir0141-46-vbpa}
```abap
TABLES:
VBPA. " sales document:partner
```
#### J_1BBRANCH — tables · L47-L47 {#decl-zfir0141-47-j_1bbranch}
```abap
TABLES:
J_1BBRANCH. " business place table
```
#### T001F — tables · L48-L48 {#decl-zfir0141-48-t001f}
```abap
TABLES:
T001F. " Company code-dependent form
```
#### T074T — tables · L50-L50 {#decl-zfir0141-50-t074t}
```abap
TABLES:
T074T. " special g_l indicator text table
```
#### MATTYPE — types · L58-L80 {#decl-zfir0141-58-mattype}
```abap
TYPES: BEGIN OF MATTYPE ,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer
NAME1 LIKE BSEC-NAME1, "CPD-customer name
BUDAT LIKE BSAD-BUDAT,
* 2004.6.15일 필드길이 수정
MATNR(25) TYPE C, "LIKE vbrp-matnr, "material number
* 수정끝
ARKTX(15) TYPE C, "material description
VRKME(5) TYPE C, "판매단위
*수량에 소수점이 나오지 않도록 수정
* fkimg(10) TYPE C, "actual invoiced quantity
FKIMG(13) TYPE C, "실제청구수량
NETWR(15) TYPE C, "문서통화의 청구품목정가
MWSBP(13) TYPE C, "문서통화의 세액
UPRICE(15) TYPE C, "unit price(단가)
"청구품목정가 / 실제청구수량
HWBAS LIKE BSET-HWBAS, "현지통화로 표시된 공급가액
HWSTE LIKE BSET-HWSTE, "현지통화로 표시된 세액
* Commercial display of UOM
MSEH3 LIKE T006A-MSEH3, "commercial dsiplay (UOM)
YYYYMMDD LIKE BSID-BUDAT,
END OF MATTYPE.
```
#### MATZEIL1 — data · L86-L86 {#decl-zfir0141-86-matzeil1}
```abap
DATA: MATZEIL1 TYPE MATTYPE.
```
#### MATZEIL2 — data · L87-L87 {#decl-zfir0141-87-matzeil2}
```abap
DATA:
MATZEIL2 TYPE MATTYPE.
```
#### MATZEIL3 — data · L88-L88 {#decl-zfir0141-88-matzeil3}
```abap
DATA:
MATZEIL3 TYPE MATTYPE.
```
#### MATZEIL4 — data · L89-L89 {#decl-zfir0141-89-matzeil4}
```abap
DATA:
MATZEIL4 TYPE MATTYPE.
```
#### VALUE_SELECTED — data · L91-L91 {#decl-zfir0141-91-value_selected}
```abap
DATA: VALUE_SELECTED.
```
#### POINT — data · L92-L92 {#decl-zfir0141-92-point}
```abap
DATA: POINT TYPE C.
```
#### LINE_COUNT — data · L93-L93 {#decl-zfir0141-93-line_count}
```abap
DATA: LINE_COUNT TYPE I. "number of lines
```
#### LINE_COUNT2 — data · L94-L94 {#decl-zfir0141-94-line_count2}
```abap
DATA: LINE_COUNT2 TYPE I. "number of lines
```
#### LINE_COUNT_PR — data · L95-L95 {#decl-zfir0141-95-line_count_pr}
```abap
DATA: LINE_COUNT_PR TYPE I. "number of lines
```
#### SEL_INDEX — data · L96-L96 {#decl-zfir0141-96-sel_index}
```abap
DATA: SEL_INDEX TYPE I.
```
#### SAVE_SAVE_UMSKZ — data · L97-L97 {#decl-zfir0141-97-save_save_umskz}
```abap
DATA: SAVE_SAVE_UMSKZ LIKE BSEG-UMSKZ.
```
#### FORM — data · L98-L98 {#decl-zfir0141-98-form}
```abap
DATA: FORM LIKE THEAD-TDFORM. " Sap-Script form
```
#### ADRESSE — data · L99-L99 {#decl-zfir0141-99-adresse}
```abap
DATA: ADRESSE LIKE ADDR1_VAL. "business place address data
```
#### FELD1A — data · L101-L101 {#decl-zfir0141-101-feld1a}
```abap
DATA: FELD1A(12) TYPE N. " field for printing the total
```
#### FELD1B — data · L104-L104 {#decl-zfir0141-104-feld1b}
```abap
DATA:
FELD1B(11) TYPE N. " field for printing thetotal
```
#### FELD3 — data · L107-L107 {#decl-zfir0141-107-feld3}
```abap
DATA:
FELD3(15) TYPE N.
```
#### COUNT1 — data · L109-L109 {#decl-zfir0141-109-count1}
```abap
DATA:
COUNT1(2) TYPE N. " number of empty casesin the
```
#### TESTP — data · L112-L112 {#decl-zfir0141-112-testp}
```abap
DATA: TESTP(9) TYPE C.
```
#### L_LINES — data · L114-L114 {#decl-zfir0141-114-l_lines}
```abap
DATA : L_LINES(5).
```
#### DD1 — data · L115-L115 {#decl-zfir0141-115-dd1}
```abap
DATA : YY1(2), MM1(2), DD1(2).
```
#### MM1 — data · L115-L115 {#decl-zfir0141-115-mm1}
```abap
DATA : YY1(2), MM1(2), DD1(2).
```
#### YY1 — data · L115-L115 {#decl-zfir0141-115-yy1}
```abap
DATA : YY1(2), MM1(2), DD1(2).
```
#### BYEAR — data · L117-L117 {#decl-zfir0141-117-byear}
```abap
DATA: BYEAR(2) TYPE C.
```
#### BMONTH — data · L118-L118 {#decl-zfir0141-118-bmonth}
```abap
DATA: BMONTH(2) TYPE C.
```
#### BDAY — data · L119-L119 {#decl-zfir0141-119-bday}
```abap
DATA: BDAY(2) TYPE C.
```
#### TOT_AMOUNT — data · L120-L120 {#decl-zfir0141-120-tot_amount}
```abap
DATA: TOT_AMOUNT LIKE VBRP-NETWR.
```
#### VALUE1 — data · L121-L121 {#decl-zfir0141-121-value1}
```abap
DATA: VALUE1 LIKE VBRP-NETWR.
```
#### VALUE2 — data · L122-L122 {#decl-zfir0141-122-value2}
```abap
DATA: VALUE2 LIKE VBRP-NETWR.
```
#### COUNT — data · L124-L124 {#decl-zfir0141-124-count}
```abap
DATA : COUNT LIKE LINE_COUNT.
```
#### UMSKZ — data · L125-L125 {#decl-zfir0141-125-umskz}
```abap
DATA : UMSKZ LIKE BSEG-UMSKZ.
```
#### BUPLA — data · L126-L126 {#decl-zfir0141-126-bupla}
```abap
DATA : BUPLA LIKE BSEG-BUPLA.
```
#### SGTXT — data · L127-L127 {#decl-zfir0141-127-sgtxt}
```abap
DATA : SGTXT LIKE BSEG-SGTXT.
```
#### BAL_TEXT — data · L128-L128 {#decl-zfir0141-128-bal_text}
```abap
DATA : BAL_TEXT LIKE BSEG-SGTXT.
```
#### CURSORFIELD — data · L129-L129 {#decl-zfir0141-129-cursorfield}
```abap
DATA : CURSORFIELD(20). " cursor position for pickup
```
#### SIM — data · L130-L130 {#decl-zfir0141-130-sim}
```abap
DATA : SIM TYPE C.
```
#### AUG — data · L131-L131 {#decl-zfir0141-131-aug}
```abap
DATA : AUG TYPE C.
```
#### SAP_FORM — data · L132-L132 {#decl-zfir0141-132-sap_form}
```abap
DATA : SAP_FORM LIKE T001F-FORNR. "Note 975866
```
#### L_STATE_INSC — data · L134-L134 {#decl-zfir0141-134-l_state_insc}
```abap
DATA: L_STATE_INSC(4).
```
#### BUPLA_HQ — data · L137-L137 {#decl-zfir0141-137-bupla_hq}
```abap
DATA: BUPLA_HQ LIKE BSEG-BUPLA.
```
#### SN1OP — data · L143-L143 {#decl-zfir0141-143-sn1op}
```abap
DATA : SN1OP TYPE C.
```
#### GT_CNT — data · L144-L144 {#decl-zfir0141-144-gt_cnt}
```abap
DATA : GT_CNT(3) TYPE N.
```
#### RETURN_CODE — data · L145-L145 {#decl-zfir0141-145-return_code}
```abap
DATA : RETURN_CODE TYPE BAPIRETURN-CODE.
```
#### IT_FCODE — data · L147-L147 {#decl-zfir0141-147-it_fcode}
```abap
DATA : IT_FCODE LIKE RSMPE-FUNC OCCURS 0 WITH HEADER LINE.
```
#### ZDTI_CONFIG — tables · L150-L150 {#decl-zfir0141-150-zdti_config}
```abap
TABLES : ZDTI_CONFIG.
```
#### ADRC — tables · L151-L151 {#decl-zfir0141-151-adrc}
```abap
TABLES:
ADRC.
```
#### FLAG_ONEBUPLA — data · L152-L152 {#decl-zfir0141-152-flag_onebupla}
```abap
DATA : FLAG_ONEBUPLA.
```
#### IT_BUDAT — data · L159-L162 {#decl-zfir0141-159-it_budat}
```abap
DATA : BEGIN OF IT_BUDAT OCCURS 0,
AUGBL LIKE BSAD-AUGBL,
BUDAT LIKE BSAD-BUDAT,
END OF IT_BUDAT.
```
#### AUSGLOP_ITAB — data · L163-L210 {#decl-zfir0141-163-ausglop_itab}
```abap
DATA : BEGIN OF AUSGLOP_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer number
STCD LIKE BSEC-STCD1, "tax code1 or tax code2
FILKD LIKE BSAD-KUNNR,
NAME1 LIKE BSEC-NAME1, "CPD-customer name
ORT01 LIKE BSEC-ORT01, "CPD-customer city
GJAHR LIKE BSAD-GJAHR, "business year
GSBER LIKE BSAD-GSBER, "business area
BUPLA LIKE BSID-BUPLA, "business place
AUGBL LIKE BSAD-AUGBL, "tax invoice number
AUGDT LIKE BSAD-AUGDT, "tax invoice date
BELNR LIKE BSAD-BELNR, "acc. document number
BLART LIKE BKPF-BLART, "acc. document type
BUDAT LIKE BSAD-BUDAT, "posting documnet date
BLDAT LIKE BSAD-BLDAT, "acc. document date
SHKZG LIKE BSAD-SHKZG, "debit/credit indicator
BSCHL LIKE BSAD-BSCHL, "posting key
AWTYP LIKE BKPF-AWTYP, "object type for
"calling application
AWKEY LIKE BKPF-AWKEY, "object key
"in acc. document
DMBTR LIKE BSAD-DMBTR, "amount in document
"currency
HWBAS LIKE BSET-HWBAS, "tax base amount
HWSTE LIKE BSET-HWSTE, "tax amount
WAERS LIKE T001-WAERS, "company code currency
MWSKZ LIKE BSET-MWSKZ, "tax code
UMSKZ LIKE BSAD-UMSKZ, "special g_l indicator
VBELN LIKE VBRK-VBELN, "billing document
FKDAT LIKE VBRK-FKDAT, "billing date
FKART LIKE VBRK-FKART, "billing type
"대금청구유형(예:F2(송장))
FKTYP LIKE VBRK-FKTYP, "billing category
"(예:L(납품관련대금청구문서))
HWAER LIKE BKPF-HWAER, "현지 통화
WAERK LIKE VBRK-WAERK, "SD문서 통화
KURRF LIKE VBRK-KURRF, "exchange rate
KURST LIKE VBRK-KURST, "exchange type
KURRF_DAT LIKE VBRK-KURRF_DAT,"exchange date
XCPDK LIKE KNA1-XCPDK, "지시자: 일회성계정
SGTXT LIKE BSEG-SGTXT, "quantity info from AR invoices..
FLAG TYPE C, "AR invoices with qty..
CHECK,
LIST_LINE LIKE SY-LINNO,
BUDAT1 LIKE BSID-BUDAT, "세금계산서일자
RESULT TYPE BAPIRETURN-CODE, "smartbill 추가 2006.07.24
END OF AUSGLOP_ITAB.
```
#### AUSGLOP_ITAB2 — data · L215-L231 {#decl-zfir0141-215-ausglop_itab2}
```abap
DATA: BEGIN OF AUSGLOP_ITAB2 OCCURS 0,
BUKRS LIKE BSAD-BUKRS,
KUNNR LIKE BSAD-KUNNR,
NAME1 LIKE BSEC-NAME1,
GJAHR LIKE BSAD-GJAHR,
BUPLA LIKE BSID-BUPLA,
AUGBL LIKE BSAD-AUGBL, "반제전표번호
AUGDT LIKE BSAD-AUGDT, "반제
DMBTR LIKE BSAD-DMBTR, "현지(회사)통화금액
HWBAS LIKE BSET-HWBAS, "현지통화로 표시된 과세표준액
HWSTE LIKE BSET-HWSTE, "현지통화로 표시된 세액
WAERS LIKE T001-WAERS, "회사통화키
* 2004.2.19 세금계산서 일자를 전표일자로 변경
BUDAT1 LIKE BSAD-BUDAT, "세금계산서 일자를 전표일자로 변경
CHECK,
LIST_LINE LIKE SY-LINNO,
END OF AUSGLOP_ITAB2.
```
#### DOC_CNT_ITAB — data · L232-L232 {#decl-zfir0141-232-doc_cnt_itab}
```abap
DATA : DOC_CNT_ITAB LIKE AUSGLOP_ITAB OCCURS 0 WITH HEADER LINE.
```
#### WA_ITAB2 — data · L234-L234 {#decl-zfir0141-234-wa_itab2}
```abap
DATA : WA_ITAB2 LIKE LINE OF AUSGLOP_ITAB2.
```
#### AUSGLOP_MAT_ITAB — data · L236-L255 {#decl-zfir0141-236-ausglop_mat_itab}
```abap
DATA : BEGIN OF AUSGLOP_MAT_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer
STCD LIKE BSEC-STCD1, "tax code1 or tax code2
NAME1 LIKE BSEC-NAME1, "CPD-customer name
AUGBL LIKE BSAD-AUGBL, "clearing document number
MATNR(25) TYPE C, " LIKE vbrp-matnr, "material number
ARKTX LIKE VBRP-ARKTX, "material description
VRKME LIKE VBRP-VRKME, "sales unit(판매단위)
FKIMG LIKE VBRP-FKIMG, "actual invoiced quantity(수량)
NETWR LIKE VBRP-NETWR, "문서통화의 청구품목정가
MWSBP LIKE VBRP-MWSBP, "문서통화의 세액
UPRICE LIKE VBRP-NETWR, "단가
HWBAS LIKE BSET-HWBAS, "현지통화로 표시된 공급가액
HWSTE LIKE BSET-HWSTE, "현지통화로 표시된 세액
* Commercial display of UOM
MSEH3 LIKE T006A-MSEH3, "commercial display (UOM)
* budat like bsid-budat,
YYYYMMDD LIKE BSID-BUDAT,
END OF AUSGLOP_MAT_ITAB.
```
#### ALL_ITEMS_ITAB — data · L260-L276 {#decl-zfir0141-260-all_items_itab}
```abap
DATA: BEGIN OF ALL_ITEMS_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer
STCD LIKE BSEC-STCD1, "tax code1 or tax code2
AUGBL LIKE BSAD-AUGBL, "clearing document number
NETWR LIKE VBRP-NETWR, "Net value of the billing item
MWSBP LIKE VBRP-MWSBP, "Tax amount in document currency
HWBAS LIKE BSET-HWBAS, "Tax base amount
HWSTE LIKE BSET-HWSTE, "tax amount
DELTAN LIKE VBRP-NETWR, "delta currency conversion
DELTAM LIKE VBRP-MWSBP, "delta currency conversion
FLAG TYPE C, "for more than 5 matl records...
* BUDAT LIKE BSID-BUDAT, 세금계산서상에 두배가 나오는 문제로
* marking함 20060601-0010-5
* budat LIKE bsad-budat,
END OF ALL_ITEMS_ITAB.
```
#### ALL_MAT_ITAB — data · L278-L278 {#decl-zfir0141-278-all_mat_itab}
```abap
DATA : ALL_MAT_ITAB LIKE ALL_ITEMS_ITAB OCCURS 0 WITH HEADER LINE.
```
#### MATNUM — data · L281-L281 {#decl-zfir0141-281-matnum}
```abap
DATA: MATNUM LIKE VBRP-MATNR. "material number
```
#### NUMBER — data · L282-L282 {#decl-zfir0141-282-number}
```abap
DATA: NUMBER(2).
```
#### ALL_ITEMS_SD_ITAB — data · L286-L295 {#decl-zfir0141-286-all_items_sd_itab}
```abap
DATA: BEGIN OF ALL_ITEMS_SD_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer
STCD LIKE BSEC-STCD1, "tax code1 or tax code2
AUGBL LIKE BSAD-AUGBL, "clearing document number
NETWR LIKE VBRP-NETWR, "Net value of the billing item
MWSBP LIKE VBRP-MWSBP, "Tax amount in document currency
HWBAS LIKE BSET-HWBAS,
HWSTE LIKE BSET-HWSTE,
END OF ALL_ITEMS_SD_ITAB.
```
#### ALL_ITEMS_FI_ITAB — data · L299-L308 {#decl-zfir0141-299-all_items_fi_itab}
```abap
DATA: BEGIN OF ALL_ITEMS_FI_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer
STCD LIKE BSEC-STCD1, "tax code1 or tax code2
AUGBL LIKE BSAD-AUGBL, "clearing document number
NETWR LIKE VBRP-NETWR, "Net value of the billing item
MWSBP LIKE VBRP-MWSBP, "Tax amount in document currency
HWBAS LIKE BSET-HWBAS,
HWSTE LIKE BSET-HWSTE,
END OF ALL_ITEMS_FI_ITAB.
```
#### SUM_TAXES — data · L310-L319 {#decl-zfir0141-310-sum_taxes}
```abap
DATA: BEGIN OF SUM_TAXES OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer
STCD LIKE BSEC-STCD1, "tax code1 or tax code2
AUGBL LIKE BSAD-AUGBL, "clearing document number
NETWR LIKE VBRP-NETWR, "Net value of the billing item
MWSBP LIKE VBRP-MWSBP, "Tax amount in document currency
HWBAS LIKE BSET-HWBAS,
HWSTE LIKE BSET-HWSTE,
END OF SUM_TAXES.
```
#### ADDRESS_ITAB — data · L325-L343 {#decl-zfir0141-325-address_itab}
```abap
DATA : BEGIN OF ADDRESS_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE KNA1-KUNNR, "Custmer account
NAME LIKE KNA1-NAME1, "Customer name
STCD LIKE BSEC-STCD1, "tax code1 or tax code2
NAME1 LIKE KNA1-NAME1, "Customer name
ADRNR LIKE KNA1-ADRNR, "Customer address
ORT01 LIKE KNA1-ORT01, "Customer city
ORT02 LIKE KNA1-ORT02, "Customer city
PSTLZ LIKE KNA1-PSTLZ, "Customer city postal code
STRAS LIKE KNA1-STRAS, "Customer street
BUSTYP(16), "LIKE kna1-j_1kftbus, "type of business
INDTYP(16), " LIKE kna1-j_1kftind, "type of industry
REPRE LIKE KNA1-J_1KFREPRE, "representative
STCD1 LIKE KNA1-STCD1, "tax code1
STCD2 LIKE KNA1-STCD2, "tax code2
* smartbill 추가 2006.07.19.
TELF1 LIKE KNA1-TELF1, "전화번호
END OF ADDRESS_ITAB.
```
#### BUPLA_ADRESSE — data · L347-L362 {#decl-zfir0141-347-bupla_adresse}
```abap
DATA : BEGIN OF BUPLA_ADRESSE OCCURS 0,
BRANCH LIKE J_1BBRANCH-BRANCH,"business place
NAME1 LIKE KNA1-NAME1, "bus place name
STREET LIKE KNA1-STRAS, "bus place street name
HOUSE_NUM1 LIKE KNA1-TELF1, "bus place house-number
POST_CODE1 LIKE KNA1-PSTLZ, "bus place city postal code
CITY1 LIKE KNA1-ORT01, "bus place city
CITY2 LIKE KNA1-ORT02, "bus place city
KR_BUSTYPE(16), "LIKE kna1-j_1kftbus, "type of business
KR_INDTYPE(16), "LIKE kna1-j_1kftind, "type of industry
KR_REPRES(14), " LIKE kna1-j_1kfrepre, "representative
STCD1 LIKE KNA1-STCD1, "tax code1
STCD2 LIKE KNA1-STCD2, "tax code2
BUDAT1 LIKE BSID-BUDAT,
AUGBL LIKE BSID-AUGBL, "세금계산서번호
END OF BUPLA_ADRESSE.
```
#### MATZEIL4_ITAB — data · L367-L383 {#decl-zfir0141-367-matzeil4_itab}
```abap
DATA: BEGIN OF MATZEIL4_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS, "company code
KUNNR LIKE BSAD-KUNNR, "customer
STCD LIKE BSEC-STCD1,
AUGBL LIKE BSAD-AUGBL, "반제전표번호
MATNR(25) TYPE C," LIKE vbrp-matnr, "material number
ARKTX(15) TYPE C, "material description
VRKME(2) TYPE C, "판매단위
*수량에 소수점이 나오지 않도록 수정
* fkimg(10) TYPE c, "actual invoiced quantity
FKIMG(13) TYPE C, "actual invoiced quantity
NETWR(15) TYPE C, "Net value of the billing item
MWSBP(13) TYPE C, "Tax amount in document currency
UPRICE(15) TYPE C, "unit price
HWBAS LIKE BSET-HWBAS, "tax base amount
HWSTE LIKE BSET-HWSTE, "tax amount
END OF MATZEIL4_ITAB.
```
#### MATZEIL1_ITAB — data · L385-L385 {#decl-zfir0141-385-matzeil1_itab}
```abap
DATA : MATZEIL1_ITAB LIKE MATZEIL4_ITAB OCCURS 0 WITH HEADER LINE.
```
#### OPTIONS — data · L387-L389 {#decl-zfir0141-387-options}
```abap
DATA BEGIN OF OPTIONS.
INCLUDE STRUCTURE ITCPO.
DATA END OF OPTIONS.
```
#### RESULT — data · L391-L393 {#decl-zfir0141-391-result}
```abap
DATA BEGIN OF RESULT.
INCLUDE STRUCTURE ITCPP.
DATA END OF RESULT.
```
#### CHECK_ITAB — data · L397-L406 {#decl-zfir0141-397-check_itab}
```abap
DATA : BEGIN OF CHECK_ITAB OCCURS 0,
BUKRS LIKE BSAD-BUKRS,
KUNNR LIKE BSEG-KUNNR,
STCD LIKE BSEC-STCD1,
AUGBL LIKE BSAD-AUGBL, "반제전표번호
SAVE_UMSKZ LIKE BSEG-UMSKZ, "특별 G/L
AWTYP_FI(4),
AWTYP_SD(4),
LINE_COUNT2 TYPE I,
END OF CHECK_ITAB.
```
#### SEL_AUSGLOP_ITAB — data · L408-L456 {#decl-zfir0141-408-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
AWKEY LIKE BKPF-AWKEY, "object key
DMBTR LIKE BSID-DMBTR, "회사통화금액
WRBTR LIKE BSID-WRBTR, "전표통화금액
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, "basis 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, "qty info from AR invoices..
RESULT TYPE BAPIRETURN-CODE, "smartbill 추가 2006.07.24
END OF SEL_AUSGLOP_ITAB.
```
#### BKPF_TAB — data · L458-L458 {#decl-zfir0141-458-bkpf_tab}
```abap
DATA : BKPF_TAB LIKE BKPF OCCURS 0 WITH HEADER LINE.
```
#### BSET_TAB — data · L459-L459 {#decl-zfir0141-459-bset_tab}
```abap
DATA : BSET_TAB LIKE BSET OCCURS 0 WITH HEADER LINE.
```
#### BSEG_TAB — data · L460-L460 {#decl-zfir0141-460-bseg_tab}
```abap
DATA : BSEG_TAB LIKE BSEG OCCURS 0 WITH HEADER LINE.
```
#### AUGBL — data · L461-L461 {#decl-zfir0141-461-augbl}
```abap
DATA : AUGBL LIKE BSEG-AUGBL.
```
#### PROG_NAME — data · L462-L462 {#decl-zfir0141-462-prog_name}
```abap
DATA : PROG_NAME LIKE SYST-CPROG.
```
#### EXIT — data · L463-L463 {#decl-zfir0141-463-exit}
```abap
DATA : EXIT TYPE C.
```
#### COPY — data · L464-L464 {#decl-zfir0141-464-copy}
```abap
DATA : COPY(1) TYPE N.
```
#### BVAT — data · L465-L465 {#decl-zfir0141-465-bvat}
```abap
DATA : BVAT(12).
```
#### VAT_BUS — data · L466-L466 {#decl-zfir0141-466-vat_bus}
```abap
DATA : VAT_BUS(24) VALUE '| - - |'.
```
#### CVAT — data · L467-L467 {#decl-zfir0141-467-cvat}
```abap
DATA : CVAT(12).
```
#### VAT_COM — data · L468-L468 {#decl-zfir0141-468-vat_com}
```abap
DATA : VAT_COM(24) VALUE '| - - |'.
```
#### BASE — data · L469-L469 {#decl-zfir0141-469-base}
```abap
DATA : BASE(12).
```
#### AMT_BASE — data · L470-L470 {#decl-zfir0141-470-amt_base}
```abap
DATA : AMT_BASE(22) VALUE ' | | | | | | | | | | |'.
```
#### TAX — data · L471-L471 {#decl-zfir0141-471-tax}
```abap
DATA : TAX(11).
```
#### AMT_TAX — data · L472-L472 {#decl-zfir0141-472-amt_tax}
```abap
DATA : AMT_TAX(20) VALUE ' | | | | | | | | | |'.
```
#### TAX_NO — data · L473-L473 {#decl-zfir0141-473-tax_no}
```abap
DATA : TAX_NO(10) TYPE N. " TRUNCATED TAX INVOICE NUMBER
```
#### TAX_INV_NO — data · L474-L474 {#decl-zfir0141-474-tax_inv_no}
```abap
DATA : TAX_INV_NO(10).
```
#### TAX_NUM — data · L475-L475 {#decl-zfir0141-475-tax_num}
```abap
DATA : TAX_NUM(20) VALUE '| | | | | | | | | | '.
```
#### ADDRESS_COMP — data · L477-L477 {#decl-zfir0141-477-address_comp}
```abap
DATA: ADDRESS_COMP(43).
```
#### ADDRESS_BUPLA — data · L478-L478 {#decl-zfir0141-478-address_bupla}
```abap
DATA: ADDRESS_BUPLA(43).
```
#### PRIPAR — data · L479-L479 {#decl-zfir0141-479-pripar}
```abap
DATA: PRIPAR LIKE PRI_PARAMS.
```
#### VAL — data · L480-L480 {#decl-zfir0141-480-val}
```abap
DATA: VAL(1) TYPE C.
```
#### SDFI — data · L481-L481 {#decl-zfir0141-481-sdfi}
```abap
DATA: SDFI(1) TYPE C. " used in list output only
```
#### W_HTYPE — data · L484-L484 {#decl-zfir0141-484-w_htype}
```abap
DATA : W_HTYPE(4).
```
#### REPRINT — data · L485-L485 {#decl-zfir0141-485-reprint}
```abap
DATA:
REPRINT.
```
#### CANCEL — data · L486-L486 {#decl-zfir0141-486-cancel}
```abap
DATA:
CANCEL.
```
#### G_LINES — data · L487-L487 {#decl-zfir0141-487-g_lines}
```abap
DATA:
G_LINES TYPE I.
```
#### FL_TAX_RAT — data · L488-L488 {#decl-zfir0141-488-fl_tax_rat}
```abap
DATA:
FL_TAX_RAT VALUE '1'. " 영세율인가?
```
#### IT_VBRP — data · L490-L496 {#decl-zfir0141-490-it_vbrp}
```abap
DATA : BEGIN OF IT_VBRP OCCURS 0,
MATNR(25) TYPE C, " LIKE vbrp-matnr,
VBELN LIKE VBRP-VBELN,
BUDAT(8), " LIKE bsid-budat,
AUGBL LIKE BSAD-AUGBL, "tax invoice number
END OF IT_VBRP.
```
#### GT_ZSBBSEG — data · L499-L499 {#decl-zfir0141-499-gt_zsbbseg}
```abap
DATA : GT_ZSBBSEG LIKE ZSBBSEG OCCURS 0 WITH HEADER LINE.
```
#### GT_ZSBISSUE — data · L500-L500 {#decl-zfir0141-500-gt_zsbissue}
```abap
DATA : GT_ZSBISSUE LIKE ZSBISSUE_ITEM OCCURS 0 WITH HEADER LINE.
```
#### GT_MAIL — data · L503-L512 {#decl-zfir0141-503-gt_mail}
```abap
DATA : BEGIN OF GT_MAIL OCCURS 0,
BUKRS LIKE BKPF-BUKRS,
KUNNR LIKE KNA1-KUNNR,
ZBYCN LIKE ZDTI_HEADER-ZBYCN,
ZSQNO LIKE ZDTI_HEADER-ZSQNO,
ZBYRE LIKE ZDTI_HEADER-ZBYRE,
HWAER LIKE ZDTI_HEADER-HWAER,
HWBAS LIKE ZDTI_HEADER-HWBAS,
HWSTE LIKE ZDTI_HEADER-HWSTE,
END OF GT_MAIL.
```
#### GT_SCR — data · L515-L517 {#decl-zfir0141-515-gt_scr}
```abap
DATA: BEGIN OF GT_SCR OCCURS 0.
INCLUDE STRUCTURE ZDTI_LAYOUT.
DATA: END OF GT_SCR.
```
#### ZSB_HEADER — data · L521-L523 {#decl-zfir0141-521-zsb_header}
```abap
DATA: BEGIN OF ZSB_HEADER OCCURS 0.
INCLUDE STRUCTURE ZSB_HEADER.
DATA: END OF ZSB_HEADER.
```
#### ZSB_ITEM — data · L525-L527 {#decl-zfir0141-525-zsb_item}
```abap
DATA: BEGIN OF ZSB_ITEM OCCURS 0.
INCLUDE STRUCTURE ZSB_ITEM.
DATA: END OF ZSB_ITEM.
```
#### ZSB_PAYMENT — data · L529-L531 {#decl-zfir0141-529-zsb_payment}
```abap
DATA: BEGIN OF ZSB_PAYMENT OCCURS 0.
INCLUDE STRUCTURE ZSB_PAYMENT.
DATA: END OF ZSB_PAYMENT.
```
#### ZSB_BELNR — data · L533-L535 {#decl-zfir0141-533-zsb_belnr}
```abap
DATA: BEGIN OF ZSB_BELNR OCCURS 0.
INCLUDE STRUCTURE ZSB_BELNR.
DATA: END OF ZSB_BELNR.
```
#### LCL_EVENT_RECEIVER — class · L541-L547 {#decl-zfir0141-541-lcl_event_receiver}
```abap
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS :
HANDLE_TOOLBAR3
FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT E_INTERACTIVE.
ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
```
#### EVENT_RECEIVER — data · L574-L574 {#decl-zfir0141-574-event_receiver}
```abap
DATA : EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER. "ALVGRID EVENT용
```
#### SLIS — type-pool · L578-L578 {#decl-zfir0141-578-slis}
```abap
TYPE-POOLS: SLIS.
```
#### GT_FCAT — data · L580-L580 {#decl-zfir0141-580-gt_fcat}
```abap
DATA : GT_FCAT TYPE LVC_S_FCAT OCCURS 0 WITH HEADER LINE.
```
#### I_FIELD — data · L581-L581 {#decl-zfir0141-581-i_field}
```abap
DATA:
I_FIELD LIKE GT_FCAT OCCURS 0 WITH HEADER LINE.
```
#### G_CUSTOM_CONTAINER — data · L583-L583 {#decl-zfir0141-583-g_custom_container}
```abap
DATA : G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
```
#### DIALOGBOX_CONTAINER — data · L584-L584 {#decl-zfir0141-584-dialogbox_container}
```abap
DATA:
DIALOGBOX_CONTAINER TYPE REF TO CL_GUI_DIALOGBOX_CONTAINER.
```
#### GRID1 — data · L585-L585 {#decl-zfir0141-585-grid1}
```abap
DATA:
GRID1 TYPE REF TO CL_GUI_ALV_GRID.
```
#### GS_LAYOUT — data · L586-L586 {#decl-zfir0141-586-gs_layout}
```abap
DATA:
GS_LAYOUT TYPE LVC_S_LAYO. " ALV 제어: 레이아웃구조
```
#### GS_VARIANT — data · L587-L587 {#decl-zfir0141-587-gs_variant}
```abap
DATA:
GS_VARIANT TYPE DISVARIANT.
```
#### IT_EVENTS — data · L588-L588 {#decl-zfir0141-588-it_events}
```abap
DATA:
IT_EVENTS TYPE SLIS_ALV_EVENT OCCURS 1 WITH HEADER LINE.
```
#### LS_FIELDCAT — data · L589-L589 {#decl-zfir0141-589-ls_fieldcat}
```abap
DATA:
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
```
#### LS_FIELD — data · L590-L590 {#decl-zfir0141-590-ls_field}
```abap
DATA:
LS_FIELD TYPE LVC_S_FCAT.
```
#### ALV_LAYOUT — data · L591-L591 {#decl-zfir0141-591-alv_layout}
```abap
DATA:
ALV_LAYOUT TYPE SLIS_LAYOUT_ALV.
```
#### ALV_SORT — data · L592-L592 {#decl-zfir0141-592-alv_sort}
```abap
DATA:
ALV_SORT TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE.
```
#### L_REPID — data · L593-L593 {#decl-zfir0141-593-l_repid}
```abap
DATA:
L_REPID LIKE SY-REPID.
```
#### LINECOLOR — data · L594-L594 {#decl-zfir0141-594-linecolor}
```abap
DATA:
LINECOLOR TYPE SLIS_SPECIALCOL_ALV OCCURS 0 WITH HEADER LINE.
```
#### POS — data · L595-L595 {#decl-zfir0141-595-pos}
```abap
DATA:
POS TYPE I VALUE 1.
```
#### G_CUSTOM_CONTAINER1 — data · L596-L596 {#decl-zfir0141-596-g_custom_container1}
```abap
DATA:
G_CUSTOM_CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
```
#### GRID2 — data · L597-L597 {#decl-zfir0141-597-grid2}
```abap
DATA:
GRID2 TYPE REF TO CL_GUI_ALV_GRID.
```
#### G_CUSTOM_CONTAINER2 — data · L598-L598 {#decl-zfir0141-598-g_custom_container2}
```abap
DATA:
G_CUSTOM_CONTAINER2 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
```
#### GRID3 — data · L599-L599 {#decl-zfir0141-599-grid3}
```abap
DATA:
GRID3 TYPE REF TO CL_GUI_ALV_GRID.
```
#### I_LAYOUT — data · L600-L600 {#decl-zfir0141-600-i_layout}
```abap
DATA:
I_LAYOUT TYPE LVC_S_LAYO.
```
#### THWBAS — data · L601-L601 {#decl-zfir0141-601-thwbas}
```abap
DATA: THWBAS LIKE ZDTI_SAPP-HWBAS.
```
#### CHECK_FLAG — data · L602-L602 {#decl-zfir0141-602-check_flag}
```abap
DATA:
CHECK_FLAG.
```
#### HTML_CONTROL — data · L604-L604 {#decl-zfir0141-604-html_control}
```abap
DATA: HTML_CONTROL TYPE REF TO CL_GUI_HTML_VIEWER.
```
#### MY_CONTAINER — data · L605-L605 {#decl-zfir0141-605-my_container}
```abap
DATA:
MY_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
```
#### FCODE — data · L606-L606 {#decl-zfir0141-606-fcode}
```abap
DATA:
FCODE LIKE SY-UCOMM.
```
#### MYEVENT_TAB — data · L607-L607 {#decl-zfir0141-607-myevent_tab}
```abap
DATA:
MYEVENT_TAB TYPE CNTL_SIMPLE_EVENTS.
```
#### MYEVENT — data · L608-L608 {#decl-zfir0141-608-myevent}
```abap
DATA:
MYEVENT TYPE CNTL_SIMPLE_EVENT.
```
#### EDURL — data · L609-L609 {#decl-zfir0141-609-edurl}
```abap
DATA:
EDURL(2048).
```
#### ALIGNMENT — data · L610-L610 {#decl-zfir0141-610-alignment}
```abap
DATA:
ALIGNMENT TYPE I.
```
#### OK_CODE — data · L613-L613 {#decl-zfir0141-613-ok_code}
```abap
DATA : OK_CODE TYPE SY-UCOMM.
```
#### SAVE_CODE — data · L614-L614 {#decl-zfir0141-614-save_code}
```abap
DATA:
SAVE_CODE LIKE OK_CODE.
```
#### SBUKRS — parameter · L629-L629 {#decl-zfir0141-629-sbukrs}
```abap
PARAMETERS: SBUKRS LIKE BSAD-BUKRS DEFAULT 'KR01' OBLIGATORY.
```
#### SKUNNR — select-option · L630-L630 {#decl-zfir0141-630-skunnr}
```abap
SELECT-OPTIONS: SKUNNR FOR BSAD-KUNNR. "Customer
```
#### SGJAHR — parameter · L632-L632 {#decl-zfir0141-632-sgjahr}
```abap
PARAMETERS: SGJAHR LIKE BKPF-GJAHR OBLIGATORY.
```
#### SBLDAT — parameter · L638-L638 {#decl-zfir0141-638-sbldat}
```abap
PARAMETERS SBLDAT LIKE BKPF-BLDAT. " OBLIGATORY.
```
#### SAUGBL — select-option · L645-L645 {#decl-zfir0141-645-saugbl}
```abap
SELECT-OPTIONS: SAUGBL FOR BKPF-BKTXT . " tax inv number
```
#### SAUGDT — select-option · L646-L646 {#decl-zfir0141-646-saugdt}
```abap
SELECT-OPTIONS: SAUGDT FOR BSET-MLDDT. "tax invoice date.
```
#### STA1 — parameter · L655-L655 {#decl-zfir0141-655-sta1}
```abap
PARAMETER STA1 RADIOBUTTON GROUP TATI." normal tax inv.
```
#### STA2 — parameter · L657-L657 {#decl-zfir0141-657-sta2}
```abap
PARAMETER STA2 RADIOBUTTON GROUP TATI."tax exempted tax inv
```
#### SAP — parameter · L665-L665 {#decl-zfir0141-665-sap}
```abap
PARAMETER SAP RADIOBUTTON GROUP OUT. " SAP script output
```
#### FULLLIST — parameter · L667-L667 {#decl-zfir0141-667-fulllist}
```abap
PARAMETER FULLLIST RADIOBUTTON GROUP OUT DEFAULT 'X'. " list Output
```
#### LIST — parameter · L669-L669 {#decl-zfir0141-669-list}
```abap
PARAMETER LIST RADIOBUTTON GROUP OUT. " List Output values
```
#### CHK_PRTI — parameter · L680-L680 {#decl-zfir0141-680-chk_prti}
```abap
PARAMETER CHK_PRTI RADIOBUTTON GROUP PRIN DEFAULT 'X'." normal tax inv.
```
#### CHK_PRAD — parameter · L682-L682 {#decl-zfir0141-682-chk_prad}
```abap
PARAMETER CHK_PRAD RADIOBUTTON GROUP PRIN. "additional list
```
#### RECEIPT — parameter · L700-L700 {#decl-zfir0141-700-receipt}
```abap
PARAMETER RECEIPT RADIOBUTTON GROUP IND DEFAULT 'X'. " Receipt indicator
```
#### BILLING — parameter · L702-L702 {#decl-zfir0141-702-billing}
```abap
PARAMETER BILLING RADIOBUTTON GROUP IND. " Billing indicator
```
#### CLEAR — data · unit 로컬 · L1927-L1927 {#decl-zfir0141-1927-clear}
```abap
DATA : SIGN TYPE C, CLEAR TYPE C.
```
#### SIGN — data · unit 로컬 · L1927-L1927 {#decl-zfir0141-1927-sign}
```abap
DATA : SIGN TYPE C, CLEAR TYPE C.
```
#### MATERIAL — data · unit 로컬 · L2270-L2270 {#decl-zfir0141-2270-material}
```abap
DATA : MATERIAL LIKE VBRP-MATNR.
```
#### UNIT — data · unit 로컬 · L2271-L2271 {#decl-zfir0141-2271-unit}
```abap
DATA:
UNIT LIKE VBRP-VRKME.
```
#### QTY — data · unit 로컬 · L2272-L2272 {#decl-zfir0141-2272-qty}
```abap
DATA:
QTY LIKE VBRP-FKIMG.
```
#### ZBSID — data · unit 로컬 · L2387-L2387 {#decl-zfir0141-2387-zbsid}
```abap
DATA: ZBSID LIKE BSID OCCURS 0 WITH HEADER LINE.
```
#### L_AUGBL — data · unit 로컬 · L2407-L2407 {#decl-zfir0141-2407-l_augbl}
```abap
DATA : L_AUGBL(10) TYPE N.
```
#### STCD2 — data · unit 로컬 · L2496-L2496 {#decl-zfir0141-2496-stcd2}
```abap
DATA STCD2(10).
```
#### DOC_NO — data · unit 로컬 · L2794-L2794 {#decl-zfir0141-2794-doc_no}
```abap
DATA: DOC_NO(10) TYPE C.
```
#### FLAG — data · unit 로컬 · L2795-L2795 {#decl-zfir0141-2795-flag}
```abap
DATA: FLAG TYPE C.
```
#### L_AAA — data · unit 로컬 · L3035-L3035 {#decl-zfir0141-3035-l_aaa}
```abap
DATA: L_AAA(46).
```
#### MM1 — data · unit 로컬 · L3144-L3144 {#decl-zfir0141-3144-mm1}
```abap
DATA : MM1(2), DD1(2), L_LEN TYPE I.
```
#### DD1 — data · unit 로컬 · L3144-L3144 {#decl-zfir0141-3144-dd1}
```abap
DATA : MM1(2), DD1(2), L_LEN TYPE I.
```
#### L_LEN — data · unit 로컬 · L3144-L3144 {#decl-zfir0141-3144-l_len}
```abap
DATA : MM1(2), DD1(2), L_LEN TYPE I.
```
#### L_TOTAL — data · unit 로컬 · L3233-L3233 {#decl-zfir0141-3233-l_total}
```abap
DATA : L_TOTAL(15), L_LEN TYPE I.
```
#### L_LEN — data · unit 로컬 · L3233-L3233 {#decl-zfir0141-3233-l_len}
```abap
DATA : L_TOTAL(15), L_LEN TYPE I.
```
#### L_TOTAL — data · unit 로컬 · L3276-L3276 {#decl-zfir0141-3276-l_total}
```abap
DATA : L_TOTAL(15), L_LEN TYPE I.
```
#### L_LEN — data · unit 로컬 · L3276-L3276 {#decl-zfir0141-3276-l_len}
```abap
DATA : L_TOTAL(15), L_LEN TYPE I.
```
#### MM — data · unit 로컬 · L4613-L4613 {#decl-zfir0141-4613-mm}
```abap
DATA : MM(2), DD(2), L_LEN TYPE I.
```
#### DD — data · unit 로컬 · L4613-L4613 {#decl-zfir0141-4613-dd}
```abap
DATA : MM(2), DD(2), L_LEN TYPE I.
```
#### L_LEN — data · unit 로컬 · L4613-L4613 {#decl-zfir0141-4613-l_len}
```abap
DATA : MM(2), DD(2), L_LEN TYPE I.
```
#### L_DANGA — data · unit 로컬 · L4680-L4680 {#decl-zfir0141-4680-l_danga}
```abap
DATA : MM(2), DD(2), L_LEN TYPE I, L_DANGA LIKE BSET-HWSTE.
```
#### L_LEN — data · unit 로컬 · L4680-L4680 {#decl-zfir0141-4680-l_len}
```abap
DATA : MM(2), DD(2), L_LEN TYPE I, L_DANGA LIKE BSET-HWSTE.
```
#### MM — data · unit 로컬 · L4680-L4680 {#decl-zfir0141-4680-mm}
```abap
DATA : MM(2), DD(2), L_LEN TYPE I, L_DANGA LIKE BSET-HWSTE.
```
#### DD — data · unit 로컬 · L4680-L4680 {#decl-zfir0141-4680-dd}
```abap
DATA : MM(2), DD(2), L_LEN TYPE I, L_DANGA LIKE BSET-HWSTE.
```
#### LN_FKIMG — data · unit 로컬 · L4681-L4681 {#decl-zfir0141-4681-ln_fkimg}
```abap
DATA : LN_FKIMG(8) TYPE N, LN_NETWR(15) TYPE N.
```
#### LN_NETWR — data · unit 로컬 · L4681-L4681 {#decl-zfir0141-4681-ln_netwr}
```abap
DATA : LN_FKIMG(8) TYPE N, LN_NETWR(15) TYPE N.
```
#### LN_FKIMG — data · unit 로컬 · L5424-L5424 {#decl-zfir0141-5424-ln_fkimg}
```abap
DATA : LN_FKIMG(8) TYPE N.
```
#### LN_NETWR — data · unit 로컬 · L5425-L5425 {#decl-zfir0141-5425-ln_netwr}
```abap
DATA:
LN_NETWR(15) TYPE N.
```
#### L_DANGA — data · unit 로컬 · L5426-L5426 {#decl-zfir0141-5426-l_danga}
```abap
DATA:
L_DANGA LIKE BSET-HWSTE.
```
### `ZFIR0141F01` (1건)
#### LV_HWBAS — data · unit 로컬 · L103-L103 {#decl-zfir0141f01-103-lv_hwbas}
```abap
DATA : LV_HWBAS(12).
```
## Unit 목록 (컨테이너)
| unit | 유형 | 위치 | 조각 | 한 줄 요약 |
|---|---|---|---|---|
| LCL_EVENT_RECEIVER~HANDLE_TOOLBAR3 | METHOD | ZFIR0141 L554-571 | 0 | ALV 그리드 툴바 이벤트 핸들러로 표준 편집·복사·출력 등 불필요한 툴바 버튼을 제거한다. |
| AT SELECTION-SCREEN | EVENT | ZFIR0141 L712-742 | 1 | 선택화면 검증으로 SAPscript 재발행이면 양식(GET_LAYOUT)을 결정하고 전체 리스트와 추가 시트 옵션을 함께 선택하면 E353 오류를 낸다. |
| INITIALIZATION | EVENT | ZFIR0141 L743-772 | 0 | 선택화면 초기값으로 재발행 옵션을 기본 선택하고 취소를 해제하며 회계연도를 현재 연도로 세팅한다. |
| START-OF-SELECTION | EVENT | ZFIR0141 L773-801 | 2 | 호출 프로그램(ZFIR0140/YFIR0601)이 ABAP 메모리로 넘긴 선택 세금계산서·프로그램명·시뮬레이션·통합발행·발행일을 IMPORT 한 뒤 단독 실행이면 목록 표시, 호출 실행이면 재발행·테이블 갱신·User Exit 를 수행한다. |
| AT USER-COMMAND | EVENT | ZFIR0141 L802-871 | 2 | 세금계산서 리스트 화면의 사용자 명령을 처리하여 전체 선택/해제, 뒤로가기 시 테이블 갱신, 저장 시 취소 처리 또는 재발행(REPRINT)을 분기한다. |
| AT LINE-SELECTION | EVENT | ZFIR0141 L872-890 | 1 | 리스트에서 전표번호(AUSGLOP_ITAB-BELNR)를 더블클릭하면 회사코드·전표번호·회계연도 파라미터를 세팅하고 FB03 전표 조회 화면으로 이동한다. |
| GET_TAX_CODE | FORM | ZFIR0141 L891-919 | 1 | 일회성 고객 전표의 BSEC 에서 사업자번호(STCD2 우선, 없으면 주민번호 STCD1)를 읽어 AUSGLOP_ITAB 과 CHECK_ITAB 의 STCD 에 세팅한다. |
| CHECK_G_L_INDICATOR | FORM | ZFIR0141 L925-956 | 1 | 출력 대상 전표의 BSEG 에서 특별 G/L 지시자(UMSKZ)를 읽어 AUSGLOP_ITAB 과 CHECK_ITAB(SAVE_UMSKZ)에 저장한다. |
| GET_TAXES | FORM | ZFIR0141 L962-1008 | 1 | 세금계산서 출력 항목의 공급가액·세액을 매출부가세 계정(0040605000)의 BSET 라인에서 가져온다. |
| PRINT_SUM_LINE | FORM | ZFIR0141 L1014-1136 | 3 | 세금계산서 합계 라인용으로 원천 유형(SD 전용/FI 전용/SD+FI)에 따라 총금액(FELD3)·공급가액(FELD1A)·세액(FELD1B) 문자열과 공란수(COUNT1)를 만든다. |
| PRINT_ITEM_PURE_SD | FORM | ZFIR0141 L1143-1190 | 2 | 순수 SD 빌링(VBRK 전용) 세금계산서의 품목 라인을 최대 4줄로 채우거나, 추가 시트 인쇄 시 품목별 평균 단가를 계산한다(인쇄용). |
| PRINT_ITEM_SD_AND_FI | FORM | ZFIR0141 L1196-1330 | 3 | SD 빌링과 FI 전표가 함께 반제된 세금계산서의 품목 라인(MATZEIL1~4)을 KRW 편집 금액으로 채우고 품목별 평균 단가를 계산한다(인쇄용). |
| PRINT_LINES | FORM | ZFIR0141 L1341-1438 | 2 | 세금계산서별 판매 품목(AUSGLOP_MAT_ITAB)을 일자·자재 순으로 정렬해 최대 4개 품목 라인(MATZEIL1~4)에 배치하고, 5개 이상이면 4번째 라인을 '외' 요약 라인으로 만든다(인쇄용). |
| GET_LAYOUT | FORM | ZFIR0141 L1447-1493 | 1 | 회사코드 T001 을 읽고 양식 종류(STA1 일반/세금계산서)·인쇄 옵션(CHK_PRTI)에 따라 T001F 에서 SAPscript 양식명(FORNR)을 결정하며 없으면 E202 오류를 낸다. |
| FILL_CHECK_TABLE | FORM | ZFIR0141 L1502-1553 | 2 | 출력 대상 전표마다 BKPF 로 원천 유형(AWTYP/AWKEY)을 확인하고 SD 빌링 원천이면 CHECK_ITAB 에 등록한 뒤 VBRK 의 빌링 유형·통화·환율 정보를 AUSGLOP_ITAB 에 채운다. |
| GET_BUPLA | FORM | ZFIR0141 L1562-1633 | 1 | 세금계산서 발행 사업장(BUPLA)의 주소와 J_1BBRANCH 사업장 마스터(대표자·업태·업종)를 읽어 BUPLA_ADRESSE 에 세금계산서번호와 함께 추가한다. |
| GET_ADDRESS | FORM | ZFIR0141 L1642-1661 | 1 | 출력 대상 각 고객의 KNA1 을 조회해 일회성 고객 여부(XCPDK)에 따라 마스터 주소 또는 BSEC 일회성 주소를 ADDRESS_ITAB 에 채운다. |
| FILL_TABLES | FORM | ZFIR0141 L1670-1871 | 5 | 출력 대상 세금계산서의 품목 테이블(AUSGLOP_MAT_ITAB)·항목 합계(ALL_ITEMS_ITAB/ALL_ITEMS_FI_ITAB)·특별G/L 라인 정보(CHECK_ITAB, MATZEIL4_ITAB)를 SD 빌링(VBRP)과 FI 전표로부터 채운다. |
| GET_TOTALS | FORM | ZFIR0141 L1880-1916 | 1 | 세금계산서별 FI 세금 합계(HWBAS/HWSTE)와 SD 품목 합계(NETWR/MWSBP)를 비교하여 차이(DELTAN/DELTAM)를 기록하고 SD 합계를 FI 세금 합계로 맞춘다. |
| CHECK_OPTION | FORM | ZFIR0141 L1925-2136 | 4 | 단독 실행 시 선택 조건(세금계산서번호 SAUGBL 또는 발행일 SAUGDT)에 따라 BKPF/BSEG/BSET 에서 발행된 세금계산서 전표를 찾아 AUSGLOP_ITAB 을 구성하고 매출부가세 기준 공급가액·세액을 집계한다. |
| UPDATE_TABLE | FORM | ZFIR0141 L2145-2260 | 5 | 발행(또는 취소)된 세금계산서 번호를 회계전표 헤더 BKPF-BKTXT, 세금항목 BSET-MLDDT, 고객항목 BSEG-XREF3(사업자등록번호)에 반영하여 DB 를 갱신한다. |
| CHECK_TEXT | FORM | ZFIR0141 L2269-2357 | 2 | FI 전표의 항목 텍스트(BSEG-SGTXT)를 '자재,단위,수량' 형식으로 파싱하여 SD 빌링처럼 취급할 품목 정보를 AUSGLOP_MAT_ITAB 에 만들고 원천 유형을 VBRK 로 표시한다. |
| USER_EXIT1 | FORM | ZFIR0141 L2366-2372 | 1 | 세금계산서 취소용 사용자 EXIT FM KR_USER_EXIT_CANCEL_TAXINVOICE 를 호출해 출력 대상 AUSGLOP_ITAB 을 고객사 로직으로 후처리한다. |
| USER_EXIT2 | FORM | ZFIR0141 L2385-2397 | 1 | 출력 대상 AUSGLOP_ITAB 을 BSID 구조로 옮겨 세금계산서 번호를 BSEG 추가 필드에 저장하는 User Exit FM KR_USER_EXIT_COPY_TAXINVOICE 를 호출한다. |
| DISPLAY_LIST | FORM | ZFIR0141 L2406-2522 | 3 | 발행된 세금계산서를 번호(AUGBL) 단위로 금액을 합산해 AUSGLOP_ITAB2 로 요약하고 고객명·사업자번호와 함께 체크박스 리스트로 표시한다. |
| REPRINT | FORM | ZFIR0141 L2531-2766 | 7 | 세금계산서 재발행 메인 흐름으로 호출 프로그램에서 넘어온 선택 항목을 AUSGLOP_ITAB 에 옮기고 원천·세금코드·특별G/L·사업장·주소·품목·합계를 순서대로 준비한 뒤 출력 옵션(LIST/FULLLIST/SAP)에 따라 인쇄한다. |
| SET_SELECTION | FORM | ZFIR0141 L2774-2783 | 1 | 리스트의 전체 선택/해제 플래그를 AUSGLOP_ITAB2-CHECK 에 반영하고 화면 라인의 체크박스 값을 MODIFY LINE 으로 갱신한다. |
| SEL_DOCUMENT | FORM | ZFIR0141 L2792-2836 | 2 | 리스트 화면에서 체크된 라인을 읽어 해당 세금계산서 번호(AUGBL)에 속한 AUSGLOP_ITAB/AUSGLOP_ITAB2 항목의 CHECK 플래그를 설정하고 선택 건수를 센다. |
| FILL_ZEROS | FORM | ZFIR0141 L2844-2856 | 1 | 문서번호 등 문자 필드를 우측 정렬한 뒤 앞쪽 공백을 '0'으로 채워 선행 0 형식으로 만든다. |
| USER_EXIT3 | FORM | ZFIR0141 L2865-2893 | 1 | 세금계산서 출력 직전 모든 출력 내부테이블과 옵션을 한국 세금계산서 리스트 User Exit FM KR_USER_EXIT_LIST_TAXINVOICE 에 넘겨 고객사 로직으로 가공한다. |
| LIST_OUTPUT | FORM | ZFIR0141 L2902-2937 | 1 | 시뮬레이션이거나 직접 실행이면 세금계산서를 WRITE 리스트로 인쇄(PRINT_INVOICES)하고 인쇄 파라미터를 설정하며, 그 외에는 스마트빌 전송(SMARTBILL_TRANS)으로 분기한다. |
| TRUNCATE_TAXNUM | FORM | ZFIR0141 L2946-2964 | 1 | 세금계산서 번호(AUGBL)를 10자리로 편집해 세금계산서 양식의 번호란 자릿수 칸(TAX_NUM)에 한 자리씩 배치한다. |
| FILL_VAT_NUMBER | FORM | ZFIR0141 L2973-3020 | 2 | 공급자(B)와 공급받는자(C)의 사업자등록번호 10자리를 세금계산서 양식의 사업자등록번호 칸(VAT_BUS/VAT_COM)에 한 자리씩 배치해 WRITE 한다. |
| FILL_AMOUNT | FORM | ZFIR0141 L3029-3134 | 2 | 세금계산서 상단의 공급가액·세액을 자릿수별 칸(AMT_BASE/AMT_TAX)에 한 자리씩 배치하고 발행일·전표수·사업장 주소와 함께 WRITE 한다. |
| WRITE_LINES_FI | FORM | ZFIR0141 L3143-3223 | 2 | 세금계산서 양식의 FI 품목 4줄(MATZEIL1~4)을 월/일·품목·단위·수량·단가·공급가액·세액 컬럼 위치에 맞춰 WRITE 로 인쇄한다. |
| CHECK_RECEIPT | FORM | ZFIR0141 L3232-3266 | 2 | 세금계산서 하단 '영수' 구분 영역에 합계금액(FELD3)을 부호 정리·우측정렬해 WRITE 하고 영수 체크 아이콘과 '이 금액을 영수함' 문구를 표시한다. |
| CHECK_BILLING | FORM | ZFIR0141 L3275-3307 | 2 | 세금계산서 하단 '청구' 구분 영역에 합계금액(FELD3)을 부호 정리·우측정렬해 WRITE 하고 청구 체크 아이콘을 표시한다. |
| PRINT_INVOICES | FORM | ZFIR0141 L3316-3532 | 5 | 선택된 세금계산서(AUGBL)별로 공급자용·공급받는자용 2부를 WRITE 리스트 형식으로 인쇄하며 제목·번호·거래처·합계·품목·영수/청구 구분을 순서대로 출력한다. |
| STRING_CHECK | FORM | ZFIR0141 L3541-3551 | 1 | 세금계산서번호(AUSGLOP_ITAB-AUGBL)가 숫자형인지 FM NUMERIC_CHECK 로 판정해 W_HTYPE 에 담는다. |
| FILL_ITEM_AMOUNT | FORM | ZFIR0141 L3560-3579 | 1 | 품목 테이블 행의 평균 단가(공급가액/수량)를 계산하고 단가·수량·공급가액·부가세액을 KRW 통화 편집으로 세금계산서 품목 라인(MATZEIL)에 옮긴다. |
| PRINT_ITEM_PURE_FI | FORM | ZFIR0141 L3588-3636 | 1 | 순수 FI 전표(BKPF 전용)로 반제된 세금계산서의 첫 품목 라인 MATZEIL1 을 전표 텍스트(SGTXT)와 KRW 편집된 공급가액·세액으로 채운다. |
| WRITE_PART1-1 | FORM | ZFIR0141 L3645-3764 | 2 | 세금계산서 파트1(공급자 보관용 1번째 양식)의 사업자등록번호·상호·대표자·주소·업종·업태를 WRITE 로 인쇄한다. |
| WRITE_PART1-2 | FORM | ZFIR0141 L3773-3896 | 2 | 세금계산서 파트1(공급자/공급받는자 보관용 2번째 양식)의 사업자등록번호·상호·대표자·주소·업종·업태를 WRITE 로 인쇄한다. |
| TAX_INVOICE_TITLE_CHANGE | FORM | ZFIR0141 L3905-3961 | 1 | 세금계산서 제목 라인을 부수(COPY 1=공급자용, 2=공급받는자용)와 양식 종류(STA1 일반세금계산서/STA2 세금계산서)에 따라 다른 텍스트로 인쇄하고 시뮬레이션이면 표시를 덧붙인다. |
| KIND_OF_CUSTOMERS | FORM | ZFIR0141 L3970-4020 | 2 | 고객 유형(일회성 CPD·마스터 고객·지점 고객)에 따라 고객 주소와 사업장 주소를 찾아 세금계산서 파트1(공급자/공급받는자 정보)을 WRITE_PART1-1/1-2 로 인쇄한다. |
| DISPLAY_TAX_INVOICE | FORM | ZFIR0141 L4029-4051 | 1 | 출력 옵션을 검증한 뒤 재발행이면 반올림 User Exit KR_USER_EXIT_ROUNDOFF 를 적용하고 대상이 없으면 메시지 I500 을 표시하며 세금계산서 리스트를 표시한다. |
| GET_ADDRESS_OF_CUSTOMER | FORM | ZFIR0141 L4060-4085 | 1 | 고객 마스터 KNA1 의 주소·사업자번호·업태·업종·대표자·주소번호를 ADDRESS_ITAB 에 고객당 1건 추가한다. |
| GET_ADDRESS_OF_CPD_CUSTOMER | FORM | ZFIR0141 L4095-4136 | 1 | 일회성 고객(CPD)의 주소·사업자번호·업태·업종·대표자를 전표의 일회성 고객 데이터 BSEC 에서 읽어 ADDRESS_ITAB 에 추가하고 AUSGLOP_ITAB/CHECK_ITAB 의 STCD·XCPDK 를 갱신한다. |
| SAP_SCRIPT | FORM | ZFIR0141 L4146-4518 | 8 | 세금계산서 SAPscript 출력 절차의 시작 부분으로 인쇄 옵션을 설정하고 OPEN_FORM 으로 인쇄 작업을 연 뒤 고객·사업장 순으로 출력 대상을 정렬한다. |
| FILL_ITEM_TABLES | FORM | ZFIR0141 L4527-4548 | 1 | 현재 세금계산서의 CHECK_ITAB 항목을 돌며 원천 유형별(순수 SD, SD+FI, 순수 FI)로 인쇄용 품목 라인을 채우는 하위 FORM 을 호출한다. |
| CONVERT_TO_LOCAL_CURRENCY | FORM | ZFIR0141 L4557-4603 | 1 | SD 품목의 외화 공급가액·세액을 전표의 환율 정보로 현지통화(KRW)로 환산한다. |
| WRITE_ITEM_SD | FORM | ZFIR0141 L4611-4671 | 2 | SD 빌링 기준 세금계산서 품목 라인 한 줄의 공급가액·세액 부호와 정렬을 정리한 뒤 월/일·품목·단위·수량·단가·공급가액·세액을 WRITE 로 인쇄한다. |
| WRITE_ITEM_FI | FORM | ZFIR0141 L4679-4773 | 3 | FI 전표 기준 세금계산서 품목 라인 한 줄의 단가를 공급가액/수량으로 계산하고 금액 부호·정렬을 정리한 뒤 월/일·품목·단위·수량·단가·공급가액·세액을 WRITE 로 인쇄한다. |
| EXCL_FCODE01 | FORM | ZFIR0141 L4781-4792 | 0 | PF-STATUS 에서 제외할 기능코드(SALL/DSALL/SAVE)를 IT_FCODE 테이블에 담는 유틸리티 FORM 이다. |
| GET_SALES_TAX_SGTXT | FORM | ZFIR0141 L4801-4820 | 1 | 각 출력 대상 전표의 매출세(MWART='A') BSEG 라인 항목 텍스트(SGTXT)를 읽어 AUSGLOP_ITAB-SGTXT 에 저장한다. |
| SMARTBILL_TRANS | FORM | ZFIR0141 L4829-5144 | 10 | 선택된 세금계산서를 스마트빌 전송용 헤더(GT_ZSBBSEG)·품목(GT_ZSBISSUE) 데이터로 변환하고 사업자단위과세 적용 시 공급자 정보를 대표 사업장으로 바꾼 뒤 이메일 확인 팝업(화면 100)을 띄운다. |
| KIND_OF_CUSTOMERS_SMARTBILL | FORM | ZFIR0141 L5153-5208 | 2 | 고객 유형(일회성 CPD·마스터 고객·지점 고객)에 따라 고객 주소와 사업장 주소를 찾아 스마트빌 헤더 파트1(공급자/공급받는자 정보)을 WRITE_PART1-1_SMARTBILL 로 채운다. |
| WRITE_PART1-1_SMARTBILL | FORM | ZFIR0141 L5217-5284 | 3 | 전자세금계산서 헤더(GT_ZSBBSEG)의 공급자(사업장)·공급받는자(고객) 정보(주소·사업자번호·상호·대표자·업종·업태·담당자 이메일/전화)를 채운다. |
| PRINT_SUM_LINE_SMARTBILL | FORM | ZFIR0141 L5293-5355 | 1 | 스마트빌 전송용 합계 라인을 만들기 위해 CHECK_ITAB/ALL_ITEMS_ITAB 를 돌며 SD·FI 원천 구분(AWTYP)에 따라 총금액·총공급가액·총세액을 GT_ZSBBSEG 에 채운다. |
| FILL_ITEM_TABLES_SMARTBILL | FORM | ZFIR0141 L5364-5386 | 1 | 현재 세금계산서의 CHECK_ITAB 항목을 돌며 원천 유형별(순수 SD, SD+FI, 순수 FI)로 스마트빌 품목 라인을 채우는 하위 FORM 을 호출한다. |
| WRITE_ITEM_SD_SMARTBILL | FORM | ZFIR0141 L5394-5414 | 1 | SD 빌링 기준 세금계산서 품목 라인(MATZEIL)을 스마트빌 품목 테이블 GT_ZSBISSUE 에 일련번호·품명·규격·수량·단가·공급가액·세액으로 적재한다. |
| WRITE_ITEM_FI_SMARTBILL | FORM | ZFIR0141 L5422-5464 | 2 | FI 전표 기준 세금계산서 품목 라인(MATZEIL)의 단가를 공급가액/수량으로 계산한 뒤 스마트빌 품목 테이블 GT_ZSBISSUE 에 적재한다. |
| PRINT_LINES_SMARTBILL | FORM | ZFIR0141 L5473-5563 | 2 | 세금계산서별 판매 품목(AUSGLOP_MAT_ITAB)을 일자·자재 순으로 정렬해 최대 4개 품목 라인(MATZEIL1~4)에 배치하고, 5개 이상이면 4번째 라인을 '외 N건' 요약 라인으로 만든다(스마트빌용). |
| FILL_ITEM_AMOUNT_SMARTBILL | FORM | ZFIR0141 L5572-5592 | 1 | 품목 테이블 행의 평균 단가(공급가액/수량)를 계산하고 단가·수량·공급가액·부가세액을 세금계산서 품목 라인(MATZEIL)에 옮긴다. |
| PRINT_ITEM_PURE_SD_SMARTBILL | FORM | ZFIR0141 L5601-5648 | 2 | 순수 SD 빌링(VBRK 전용) 세금계산서의 품목 라인을 최대 4줄로 채우거나, 추가 시트 인쇄 시 품목별 평균 단가를 계산한다(스마트빌용). |
| PRINT_ITEM_SD_AND_FI_SMARTBILL | FORM | ZFIR0141 L5657-5781 | 3 | SD 빌링과 FI 전표가 함께 반제된 세금계산서의 품목 라인(MATZEIL1~4)을 채우고 품목별 평균 단가를 계산한다(스마트빌용). |
| PRINT_ITEM_PURE_FI_SMARTBILL | FORM | ZFIR0141 L5790-5841 | 1 | 순수 FI 전표(BKPF 전용)로 반제된 세금계산서의 첫 품목 라인 MATZEIL1 을 전표 텍스트(SGTXT)와 공급가액·세액으로 채운다(스마트빌용). |
| FIELDCAT_MAKE | FORM | ZFIR0141F01 L12-42 | 0 | ALV 필드카탈로그(I_FIELD) 한 컬럼을 파라미터로 받아 추가하는 유틸리티 FORM 으로, ZBYRE 필드는 소문자 허용으로 설정한다. |
| TRANSMIT_TO_SMARTBILL | FORM | ZFIR0141F01 L49-55 | 1 | 매출 세금계산서를 스마트빌로 전송하는 상위 흐름으로 전송 데이터 생성 → Z_SB_DTI_ISSUE 전송 → 결과 메시지 표시를 순서대로 수행한다. |
| MAKE_DATA_TO_TRANSMIT | FORM | ZFIR0141F01 L62-69 | 1 | 스마트빌 전송용 헤더·품목·결제·전표번호 데이터를 순서대로 생성하는 PERFORM 디스패치 FORM 이다. |
| MAKE_ZSB_HEADER | FORM | ZFIR0141F01 L76-94 | 1 | 스마트빌 전송 헤더 테이블 ZSB_HEADER 를 GT_ZSBBSEG 로부터 생성하며 정발행(ZSIGN='S')·매출(AR) 구분을 세팅한다. |
| CALCULATE_ZNCNT | FORM | ZFIR0141F01 L101-120 | 1 | 세금계산서 공급가액(P_HWBAS)을 12자리 통화 형식으로 편집한 뒤 앞쪽 공백 수를 세어 세금계산서 공란수(ZSB_HEADER-ZNCNT)를 계산한다. |
| MAKE_ZSB_ITEM | FORM | ZFIR0141F01 L127-142 | 1 | 스마트빌 전송 품목 테이블 ZSB_ITEM 을 전표 정보(GT_ZSBBSEG 첫 행)와 품목 정보(GT_ZSBISSUE)를 합쳐 AR 구분으로 생성한다. |
| MAKE_ZSB_PAYMENT | FORM | ZFIR0141F01 L149-171 | 1 | 스마트빌 전송 결제정보 테이블 ZSB_PAYMENT 를 세금계산서별로 현금(10)·수표(20)·어음(2AA)·외상(30) 4개 결제수단 코드 행으로 생성한다. |
| MAKE_ZSB_BELNR | FORM | ZFIR0141F01 L178-191 | 1 | 스마트빌 전송용 전표번호 테이블 ZSB_BELNR 을 GT_ZSBBSEG 로부터 만들고 AR(매출) 구분을 세팅한다. |
| TRANSMIT_DTI_TO_SB | FORM | ZFIR0141F01 L197-216 | 1 | 전자세금계산서 헤더·품목·결제·전표번호 테이블을 스마트빌 발행 FM Z_SB_DTI_ISSUE 로 전송하고 리턴 코드를 받는다. |
| DISPLAY_ERROR_MSG | FORM | ZFIR0141F01 L223-245 | 1 | 스마트빌 전송 리턴 코드에 따라 정상 발행·네트워크 장애·통신 에러·데이터 검증 오류 메시지를 표시하고 그 외 코드는 Z_SB_RETURN_MESSAGE 로 메시지를 출력한다. |
| SAVE_RETURN_CODE_TO_AUSGLOP | FORM | ZFIR0141F01 L251-269 | 1 | 스마트빌 전송 리턴 코드가 성공('Y')이면 SEL_AUSGLOP_ITAB 과 AUSGLOP_ITAB 의 RESULT 필드를 'Y' 로 표시한다. |
| USER_COMMAND_0100 INPUT | MODULE | ZFIR0141I01 L9-29 | 1 | 화면 0100의 사용자 명령(PAI)을 처리하여 &NT1 시 ALV 그리드(GRID3)의 변경 데이터를 검증한 뒤 화면을 종료하고 EXIT 시 화면을 닫는 플럼빙 모듈이다. |
| STATUS_0100 OUTPUT | MODULE | ZFIR0141O01 L9-13 | 0 | |
| ALV_WRITE_0100 OUTPUT | MODULE | ZFIR0141O01 L19-75 | 0 | |