SAP 원천세 집계 — 전표를 신고데이터로 바꾸기
월별 원천세 전표를 읽어 Section Code 와 집계코드 단위로 요약하고, 전표 단위 상세까지 내려가는 화면입니다.
원천세 신고는 전표를 그대로 내는 것이 아닙니다. 소득 종류별로 묶고 사업장별로 나눠 인원과 과세표준과 세액으로 요약해야 합니다.
이 집계를 손으로 하면 실수가 나고 재현도 어렵습니다. 전표를 읽어 집계하고 그 결과에서 다시 전표로 내려갈 수 있어야 검증이 됩니다. 사양서 레이아웃을 그대로 담아 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 전표 — 헤더(
BKPF)와 라인(BSEG)의 전기일자와 거래처 - 원천세 항목 — 소득세·주민세 코드와 과세표준·세액(
WITH_ITEM) - Section Code — 사업장 단위 신고 구분(
SECCODET) - 집계코드 — 소득 종류별 집계 기준(
ZTFIE0030)과 매핑(ZTFIE0040) - 신고 자료 — 상세(
ZTFIE0050)와 요약(ZTFIE0060)
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 일반회계 · 원천세 신고 |
| Namespace | zui5.whtagg |
| 셸 구조 | 조회조건 영역(우측 조회) + 요약 테이블 + 전표 상세 |
| 화면 수 | 조회 화면 1개 + 상세 |
| 데이터 | 상세 112건 · 요약 15건 |
| 성격 | 집계·처리형 — 처리 방식에 따라 덮어쓰기·삭제 후 집계 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
회사코드·회계연도·신고월·처리 방식으로 실행하면 요약이 나옵니다 → Section Code 와 집계코드별 인원·세액을 확인하고 → 라인을 선택해 전표 단위로 내려갑니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드는 사양서에 따라 변경 불가입니다.
- 회계연도·신고월을 넣습니다. 기본값은 전월 연도·전월입니다.
- Section Code 로 사업장 단위 조건을 걸 수 있습니다.
- 처리 방식을 고릅니다. Display / Transfer & Overwrite / Delete & Transfer 중 선택합니다.
- 조회 버튼은 조회조건 영역 오른쪽 끝에 있고, 입력필드에서 Enter 로도 조회됩니다.
- 요약에서 인원과 세액을 확인하고 총계를 신고 서식과 대조합니다.
- 라인을 선택하면 전표 단위 상세가 열립니다.
- 전표번호를 클릭하면 회계전표 조회로 이어집니다.
처리 방식과 집계 규칙
실행 방식에 따라 기존 자료를 어떻게 다룰지가 달라집니다.
Display 이미 집계된 신고자료(요약)를 조회만
Transfer & Overwrite 전표를 다시 읽어 집계하고 상세·요약에 덮어씀
Delete & Transfer 해당 월 자료를 삭제한 뒤 다시 집계
집계 대상 = 전표 헤더 ⋈ 원천세 라인, 취소전표 제외
전기일자가 신고월 1일 ~ 말일
인원 = 원천징수 대상 거래처 수
주민세과세표준 = 소득세액
주민세액 = 소득세액 × 10%
주민세 과세표준이 소득세액인 이유
지방소득세는 소득에 직접 매기는 것이 아니라 소득세액의 10%로 계산합니다. 그래서 주민세 입장에서는 소득세액이 과세표준이 됩니다. 이 구조를 모르면 소득 금액에 10%를 매기는 실수가 나옵니다.
원천세 집계코드
| 집계코드 | 집계코드명 | 소득세코드 | 세율 |
|---|---|---|---|
| A | 근로소득 | K1 근로소득 간이세액 | 6.0% |
| B | 기타소득 | K3 기타소득 20% | 20.0% |
| Z3 | 사업소득 | K5 사업소득 3% | 3.0% |
| Z4 | 이자소득 | K7 이자소득 14% | 14.0% |
| Z5 | 비거주자 | K9 비거주자 20% | 20.0% |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 회사코드 | 필수 | 사양서에 따라 변경 불가(읽기 전용) |
| 회계연도 / 신고월 | 필수 | 기본값 전월 연도·전월 |
| Section Code | 선택 | 사업장 단위 조건 |
| 처리 방식 | 필수 | Display / Transfer & Overwrite / Delete & Transfer |
결과 컬럼
요약
| 컬럼 | 의미 |
|---|---|
| Section Code · Section Code명 | 사업장 단위 |
| 집계코드 · 집계코드명 | 소득 종류 |
| 인원 | 원천징수 대상 거래처 수 |
| 소득세과세표준 · 소득세액 | 국세 부분 |
| 주민세과세표준 · 주민세액 | 지방세 부분 |
| 총계 라인 | 전체 합계 |
상세
| 컬럼 | 의미 |
|---|---|
| 회계연도 · 전표번호 · ITEM No. | 전표 식별 |
| 거래처 | 지급 상대 |
| 소득세코드 / 명 | 적용 코드 |
| 소득세 과세표준 · 세액 | 국세 산출 |
| 주민세코드 / 명 | 지방세 코드 |
| 주민세 과세표준 · 세액 | 지방세 산출 |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
WITH_ITEM | 원천징수 항목 | 집계 원천 |
BKPF · BSEG | 전표 헤더와 라인 | 전기일자·거래처 |
SECCODET | Section Code 텍스트 | 사업장 명칭 |
ZTFIE0030 · ZTFIE0040 | 집계코드와 매핑 | 소득 종류 분류 |
ZTFIE0050 · ZTFIE0060 | 신고 상세와 요약 | 집계 결과 저장 |
FB03 | 전표 조회 | 상세에서 연계 |
도입 시 확인이 필요한 부분
집계코드와 소득세코드의 매핑이 세법 개정에 따라 바뀝니다. 세율이 달라지거나 소득 구분이 추가되면 매핑 테이블을 갱신해야 합니다. 또 Transfer 계열 처리는 기존 자료를 덮어쓰므로 실행 권한을 제한해야 합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCWHTAGG'
@EndUserText.label: '원천세 집계 (Z)'
define view Z_C_WHT_AGGREGATION
as select from with_item as Wht
inner join bkpf as Header on Wht.bukrs = Header.bukrs
and Wht.belnr = Header.belnr
and Wht.gjahr = Header.gjahr
left outer join seccodet as Sec on Header.secco = Sec.secco
and Sec.spras = 'K'
{
key Header.bukrs,
key Header.gjahr,
key Header.secco as SectionCode,
key Wht.witht as WhtCode,
Sec.sectxt as SectionText,
count( distinct Header.lifnr ) as PersonCount,
sum( Wht.wt_qbshb ) as IncomeTaxBase,
sum( Wht.wt_qbshh ) as IncomeTaxAmount
// 주민세과세표준 = 소득세액, 주민세액 = 소득세액 × 10%
// 집계코드 매핑은 ZTFIE0040 과 조인
}
where Header.xreversed = ''
group by Header.bukrs, Header.gjahr, Header.secco, Wht.witht, Sec.sectxt
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · 요약 · 상세 |
| 조회조건 | sap.m.Select · sap.m.RadioButtonGroup — 우측 끝에 조회 |
| 요약 테이블 | sap.m.Table — 총계 라인 포함 |
| 상세 | 요약 선택 시 하단에 전표 단위로 펼침 |
| 전표 링크 | sap.m.Link — 회계전표 조회 연계 |
| 실행 결과 | 스캔 · 삭제 · 반영 건수 표시 |
실행 건수를 표시하는 이유
집계는 실행해도 화면이 크게 달라지지 않습니다. 제대로 돌았는지 알 수 없어 한 번 더 실행하게 됩니다. 스캔한 전표 수, 삭제한 건수, 반영한 건수를 보여 주면 무엇이 처리됐는지 확인되고 중복 실행도 줄어듭니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.whtagg) · ko 로케일 |
view/Main.view.xml | 조회조건 · 요약 · 상세 |
controller/Main.controller.js | 집계 실행 · 요약·상세 · 전표 연계 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 금액 · 인원 · 세율 포맷터 |
localdata/whtagg.json | 상세 112건 · 요약 15건 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| 주민세액 = 소득세액 × 10% (전 건) | 통과 |
| 주민세과세표준 = 소득세액 | 통과 |
| 요약 세액 = 상세 세액 합계 | 통과 |
| 인원 = 중복 제거한 거래처 수 | 통과 |
| 취소전표는 집계 대상에서 제외 | 통과 |
| XML · JSON 전체 파싱 | 오류 0건 |
| 화면 렌더링 — 실브라우저 집계 실행 후 캡처 | 3/3 |
| 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
Transfer & Overwrite 와 Delete & Transfer 는 무엇이 다른가요?
앞은 기존 자료 위에 덮어쓰고 뒤는 지운 뒤 새로 넣습니다. 전표가 취소되어 사라진 건이 있으면 덮어쓰기로는 남을 수 있어 Delete 방식이 안전합니다.
인원은 어떻게 세나요?
원천징수 대상 거래처 수입니다. 한 사람에게 여러 번 지급했어도 인원은 하나로 셉니다. 신고서의 인원 칸과 기준을 맞춰야 합니다.
집계 후 전표가 추가되면요?
다시 집계해야 반영됩니다. 신고 직전에 한 번 더 실행해 최신 상태로 맞추는 것이 안전합니다.
SAP 표준 기능과 어떻게 이어지나요?
원천세 항목은 지급 전기 시 표준이 만듭니다. 이 화면은 그 항목을 Section Code 와 집계코드로 묶어 신고데이터로 만들고, 요약에서 전표까지 내려갈 수 있게 하는 확장입니다.