--- 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/` 의 `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 | |