재무 · 통합 관리

SAP 부가가치세 통합 관리 — 세금계산서 전표화부터 분기 정산 · 대사까지 한 앱에서 처리하고 승인하는 부가세 운영

세금계산서 전표화 · 직무 분리 승인 · 일괄 실행 · 분기 정산 · 대사 규칙 7건과 예외 조치 · 영역 간 연계 · 큐브 분석과 차이 요인분해 · AI 에이전트 — 소개 영상과 실제 화면 27종, 그리고 CDS 코드까지

소개 영상블로그 목차 순서대로 · 자막 포함

도입 포인트 — 이 앱을 사용해야 하는 이유

부가가치세 업무의 질문은 분기마다 같습니다. 이번 분기 세금계산서가 모두 전표가 되었나, 납부(환급) 세액은 얼마이고 원장과 맞나, 누가 승인했고 무엇이 아직 남았나. 지금 이 세 답은 표준 전표 입력 화면, 세액 집계 엑셀, 승인 메일과 정산 메모로 흩어져 있고, 신고 일정이 가까워질수록 사람이 이어 붙이는 일이 늘어납니다. 이 앱은 세 답을 하나의 흐름으로 붙입니다. 세금계산서를 전표로 만들고, 승인하고, 분기 정산 문서를 만들고, 대사 규칙으로 원장과 맞춰 보고, 남은 예외를 정리하는 일을 한 화면 묶음 안에서 합니다. 신고서 작성과 최종 판단은 회사와 세무 대리인의 몫으로 두고, 그 앞단의 처리 · 승인 · 점검을 책임집니다.

한 줄 요약 — 세금계산서 전표화에서 분기 정산, 대사, 영역 간 연계, 감사 이력까지를 한 앱에서 처리하고 승인하고 점검하며, 그 숫자가 원천과 어긋나지 않는지를 대사 규칙 7건이 매번 다시 확인합니다.

핵심 포인트 일곱 가지

핵심 포인트고객이 얻는 것지금 방식이라면
① 세금계산서에서 분기 정산까지 한 앱에서매출 · 매입 세금계산서를 전표로 만들고 승인 · 전기 · 역처리하고, 분기 정산 문서와 납부(환급) 문서까지 같은 앱에서 이어 처리합니다.전표 입력, 승인 메일, 세액 집계 엑셀, 정산 메모가 각각 다른 곳에 있고 사람이 이어 붙입니다.
② 직무 분리가 화면과 서비스에 함께 걸린다작성자는 자기 문서를 승인할 수 없고 5천만 원 이상은 서로 다른 2인이 승인합니다. 화면에서 버튼이 숨는 데 그치지 않고 서비스가 같은 규칙을 다시 확인합니다.직무 분리를 메일과 구두 약속에 의존하고, 사후 감사에서 누가 승인했는지를 따로 찾습니다.
③ 모의 실행으로 먼저 보고 실행한다일괄 전표화 · 분기 정산을 저장 없이 모의 실행해 대상과 금액을 확인하고, 실행하면 모의 합계와 같은 문서가 만들어집니다. 같은 대상 · 기간은 중복되지 않습니다.일괄 처리 뒤에 건수와 금액을 세어 보고, 중복으로 올라간 전표를 역분개로 지웁니다.
④ 대사 규칙 7건이 매번 돌고 예외가 남는다원장과 총계정, 세액 계산, 공제세액 안분, 정산 문서, 계정 연결, 시산표 차대, 국세청 전송을 규칙으로 점검합니다. 차이는 예외로 남아 조정 · 보류 · 허용 종결로 정리됩니다.신고 직전에 몰아서 엑셀로 대조하고, 어디서 틀어졌는지는 사람의 기억에 남습니다.
⑤ 불공제 세액이 원가 문서로 따라간다매입 전표를 전기하면 불공제 세액의 원가 문서가 자동 생성되고, 역처리하면 연결된 원가와 자금 문서도 함께 되돌려집니다. 문서 흐름도에서 선으로 이어 봅니다.불공제 세액을 원가 부서에 메일로 알리고, 반영 여부를 다음 달에 확인합니다.
⑥ 셀에서 문서 라인까지 내려가는 분석기간 · 회사 · 계정 · 원인 축으로 세액을 집계하고, 이름이나 칸을 누르면 원천 문서 라인까지 열립니다. 큐브 합계와 명세 합계가 같은지 그 자리에서 보입니다.리포트를 닫고 총계정 라인 항목 화면을 다시 열어 조건을 손으로 맞춥니다.
⑦ 사람이 열지 않아도 도는 점검과 감사 이력감시 규칙(지표 · 기준값 · 받을 역할)에 걸리면 보고가 대기함에 올라가고, 하루 한 번 제한은 서비스가 판정합니다. 누가 언제 무엇을 했는지는 감사 로그와 상태 이력에 남습니다.신고 일정이 닥쳐서야 미전송 건이나 미정산 건을 발견합니다.

사례로 보는 효과 — 신고 전에 드러난 미전송 세금계산서와 시산표 차이

검증용 샘플 데이터(가상)에서 대사를 돌리자 국세청 전송이 끝나지 않은 채 전표화된 세금계산서 5건이 R7 예외로 잡혔고(최대 차이 73,711,000원), 회사 2000 의 시산표에서는 차변과 대변이 4,000원 어긋난 것이 R6 예외로 나타났습니다. 둘 다 월마감이나 신고 직전에 눈으로 찾기 어려운 종류의 차이입니다. 반대로 큐브 합계와 문서 라인 명세 합계는 48개 조합 모두 차이 0, 기말 잔액 항등식도 불일치 0건이었습니다. 앱이 보여 주는 숫자가 원천과 어긋나지 않는다는 점을 먼저 확인한 다음에야 예외를 이야기할 수 있기 때문입니다.

도입하면 달라지는 것

  • 신고 준비 — 전표화 · 승인 · 정산 · 대사가 한 화면 흐름에서 이어져 엑셀 취합이 줄어듭니다.
  • 회의의 주제 — "어느 숫자가 맞나" 보다 "이 예외를 어떻게 정리할까" 를 이야기합니다.
  • 책임의 기록 — 승인자와 처리자가 상태 이력과 감사 로그에 남습니다.
  • 놓치는 날이 없는 점검 — 미전송 · 미정산 · 한쪽만 입력된 전표가 규칙에서 먼저 걸립니다.

이런 회사에 맞습니다

S/4HANA(또는 ECC)에서 매출 · 매입 세금계산서를 월 수백 건 이상 처리하고, 법인이나 사업장이 둘 이상이어서 분기 정산이 법인별로 갈리는 회사에 맞습니다. 처리 담당(재무 · 세무), 승인자(팀장 · 본부장), 관리자(세율표와 규칙 관리)가 나뉘어 있고, 불공제 매입세액이 원가 부서로 배부되는 구조라면 영역 간 연계의 효과가 큽니다. 반대로 세금계산서가 월 수십 건 안팎이고 한 사람이 전 과정을 맡는 조직이라면 표준 화면과 간단한 대사표로도 충분할 수 있습니다.

실행 화면

사용 방법

  1. 상단 선택 — 오른쪽 위에서 회사(기본 전체) · 기간(기본 2026-09) · 사용자를 고릅니다. 선택값은 모든 화면에 적용되고, 사용자를 바꾸면 역할(조회자 · 처리자 · 승인자 · 관리자)에 맞게 버튼이 달라집니다.
  2. 조회조건 입력 — 부가세 분석 화면은 기간(부터 · 까지)과 지표가 필수이고 비교 기준 · 계산 항목 · 필터는 선택입니다. 문서 처리 · 기준정보 화면은 검색어 · 상태 · 유형이 선택 조건입니다.
  3. 조회 실행 — 분석 화면의 조회 버튼은 조회 조건 영역 오른쪽 끝에 있습니다. 문서 처리 · 기준정보 화면의 검색창은 Enter 키로 바로 검색합니다.
  4. 요약 확인 — 개요 화면의 타일 10개와 결산 단계별 진행, 분석 화면의 큐브 합계 · 명세 합계, 시산표 화면의 점검 결과를 먼저 봅니다.
  5. 탭 · 축 이동 — 기준정보, 시산표 · 재무제표, 이력 · 감사 · 권한의 탭을 차례로 확인하고, 분석 화면에서는 차원 칩을 행 · 열 칸으로 끌어 옮깁니다.
  6. 행 · 셀 클릭 상세 — 문서 행을 누르면 차변 · 대변, 상태 이력, 연결 문서가 열리고 가능한 버튼이 보입니다. 분석 표의 칸을 누르면 원천 문서 라인까지 내려갑니다.
  7. 내보내기 — 문서 · 대사 예외 · 기준정보 목록은 엑셀 내보내기, 분석 결과는 표 CSV 와 PPT 보고서로 받습니다.

일괄 실행은 먼저 ‘모의 실행’으로 대상과 금액을 확인하고(저장 안 됨), 이상이 없으면 ‘실행’합니다. 대사 예외는 조정 전표 · 보류 · 허용 종결 중 하나로 조치한 뒤 ‘대사 실행’을 다시 하면 해소 여부가 판단됩니다.

무엇으로 만들었나

자리무엇왜 그렇게 두었나
화면OpenUI5 1.153 · sap.tnt ToolPage 셸 · XML 뷰 10개와 문서 상세 조각메뉴로 모듈(개요 · 기준정보 · 문서 · 시산표 · 일괄 · 대사 · 분석 · 연계 · 감사)을 오가고, 같은 컨트롤을 재사용해 화면마다 조작이 같습니다.
데이터 연결OData V2 서비스 1개 · 엔티티셋 36종 · 펑션 12종화면은 서비스 모델에만 바인딩하고 업무 규칙(상태 전이 · 대사 · 승인)은 서비스가 판정합니다. 운영에서는 서비스 주소만 바꿔 연결합니다.
업무 규칙서비스 구현부(상태 전이 · 직무 분리 · 대사 규칙 · 일괄 실행)버튼 숨김은 편의일 뿐이고, 같은 요청을 직접 보내도 서비스가 역할과 상태를 다시 확인해 거절합니다.
분석 집계큐브 집계 · 피벗 · SVG 차트 · 요인분해외부 차트 라이브러리 없이 표준 컨트롤과 직접 그린 SVG 만 써서 사내망에서도 그대로 동작합니다.
보고서브라우저에서 만드는 PowerPoint 보고서현재 범위의 표와 차트를 담아 서버에 파일을 남기지 않고 내려받습니다.
테마SAP Horizon(sap_horizon)표준 Fiori 화면과 같은 룩앤필이라 사용자가 새로 익힐 것이 적습니다.
SAP 표준 기능을 그대로 이어받은 부분 — 매출 · 매입 전표의 계정 · 세액 구조(FB70 · FB60), 세금 코드와 세율(FTXP), 전표 역처리 개념(FB08), 총계정 잔액 · 라인 항목 대조(FS10N · FBL3N)를 그대로 이어받습니다. 이 화면은 표준 실행을 대체하지 않고 처리 · 승인 · 점검 관점을 더해 확장합니다.

앱 정보

항목내용
영역재무 (원가 · 자금 영역 문서 연계 포함)
업무 흐름 범위세금계산서 수집 → 전표화 → 조정 · 정산 → 대사 → 신고 · 마감
모듈 구성개요 · 할 일 / 기준정보 / 문서 처리 / 일괄 실행 / 대사 / 분석 / 영역 간 연계 / 이력 · 감사 · 권한
업무 영역부가가치세 — 매출 · 매입 세금계산서, 영세율, 불공제 매입세액(공통매입 안분), 대손세액, 분기 정산, 국세청 전송
관련 기준서해당 없음(부가가치세 신고 · 정산 업무 / 대상 영역: 재무 · 원가 · 자금)
SAP 표준 T-codeFB70 · FB60 · FB50 · FB08 · FTXP · FS10N · FBL3N · F.01
데이터검증용 샘플 데이터(가상) — 세금계산서 401건, 처리 문서 404건, 결산 과업 340건, 분석 큐브 648행

처음 열었을 때 — 숫자는 타일에서 먼저 읽는다

개요 · 할 일
개요 · 할 일 — 현재 회사·기간 기준 타일 10개(결산 진행률, 기한 경과 과업, 승인 대기, 반려, 시산표 차대 차이, 미해결 예외 등)와 결산 단계별 진행이 나옵니다. 타일을 누르면 해당 목록으로 이동합니다.

숫자는 현재 선택한 회사 · 기간에 따라 바뀌며, 타일의 색은 점검이 필요한 정도를 뜻합니다. 기본은 회사 전체 · 2026-09 입니다.

내 할 일
내 할 일 — 현재 사용자의 역할에 맞는 할 일(승인 대기 · 반려 수정 · 예외 조치 · 기한 경과)이 기한순으로 나옵니다. 행을 누르면 해당 문서나 예외로 이동합니다.

처리자와 승인자는 보이는 할 일이 다릅니다. 사용자를 바꿔 같은 화면이 어떻게 달라지는지 확인해 보세요.

기준정보 관리 — 세금계산서 원장 · 세율표 · 계정 · 결산 과업

세금계산서 원장
세금계산서 원장 — 매출·매입 세금계산서와 대손 채권의 공급가액, 세액, 불공제 세액, 전표화 세액, 국세청 전송 상태를 한 표에서 봅니다. 구분과 전송 상태로 거릅니다.

전송 상태가 ‘대기’ 또는 ‘점검 필요’인 행은 대사 R7 의 대상입니다. 표는 열이 많아 좁은 화면에서는 일부가 행 아래로 펼쳐집니다.

세율표
세율표 — 세율 코드별 기간 세율(일반 과세, 영세율)을 관리합니다. 처리자 이상은 신규·수정·사용 중지를 할 수 있고 변경은 감사 로그에 남습니다.

세율표를 바꾸면 R2(세액 = 공급가액 × 세율) 대사의 기준도 함께 바뀝니다. 샘플의 세율 10% · 0% 는 가정값입니다.

계정 목록
계정 목록 — 계정별 서브원장 잔액과 총계정 잔액을 나란히 보여 줍니다. 두 값이 다른 계정은 대사 규칙에서 예외로 잡힙니다.

서브원장 잔액과 총계정 잔액이 다른 계정은 R1 예외의 후보입니다. 계정이 재무제표 라인에 연결되어 있는지도 여기서 봅니다.

결산 과업 일정
결산 과업 일정 — 회사·기간별 17개 과업의 계획일, 완료일, 지연 일수, 상태를 보고 시작·완료·되돌림을 처리합니다. 선행 과업을 끝내야 다음 과업을 시작할 수 있습니다.

17개 과업이 회사 · 기간마다 있어 합계 340건입니다. 선행 과업이 끝나지 않으면 시작 버튼이 열리지 않습니다.

과업 정의
과업 정의 — 결산 과업의 이름, 단계, 담당 팀, 선행 과업, 기한 일수를 정의합니다.

과업 정의를 바꾸면 이후 기간에 생성되는 결산 과업에 반영됩니다. 이미 생성된 과업은 그대로 남습니다.

문서 처리와 승인 — 승인 버튼은 승인자에게만 보인다

문서 목록
문서 목록 — 세금계산서 전표, 대손 전표, 분기 정산 문서를 상태·유형·작성자로 거릅니다. 상태 흐름과 승인 규칙이 위 안내 줄에 나옵니다.

유형(매출 · 매입 · 대손 · 정산 · 조정 · 원가 · 자금)과 상태로 거르면 승인 대기 건을 바로 찾을 수 있습니다. 행을 누르면 상세가 열립니다.

문서 상세
문서 상세 — 차변·대변 라인, 상태 이력, 연결 문서를 탭으로 봅니다. 현재 사용자가 할 수 있는 버튼만 보이며 같은 요청을 직접 보내도 서버가 거절합니다.

버튼은 현재 사용자의 역할과 문서 상태에 따라 달라집니다. 작성자 본인의 문서에서는 승인 버튼이 열리지 않습니다.

신규 문서
신규 문서 — 유형, 회사, 귀속 기간, 대상 세금계산서를 골라 작성중 문서를 만듭니다. 같은 대상·기간에는 중복으로 만들어지지 않습니다.

대상 세금계산서를 고르면 공급가액과 세액이 자동으로 채워집니다. 열린 기간이 아니면 작성할 수 없습니다.

시산표와 재무제표 — 차대 일치와 기말 항등식

시산표
시산표 — 계정별 기초, 차변, 대변, 조정, 기말 잔액과 점검 결과(차대 일치, 기말 항등식)를 보여 줍니다.

점검 줄에 시산표 차변 · 대변 차이가 나오며, 회사 2000 에는 검증용으로 넣은 4,000원 차이가 R6 예외로 보입니다.

재무제표
재무제표 — 재무상태표·손익계산서 형태로 계정을 묶어 보고, 자산과 부채·자본의 차이를 확인합니다.

모든 계정이 재무제표 라인에 연결되어 있어야 자산 = 부채 + 자본이 맞게 나옵니다. 연결이 빠지면 R5 가 예외로 잡습니다.

일괄 실행 — 모의 실행 합계와 실행 결과가 같다

실행 조건과 이력
실행 조건과 이력 — 유형(매출·매입 세금계산서 일괄 전표화, 분기 정산), 회사, 기간을 정하고 지난 실행 이력을 봅니다.

유형 · 기간은 필수이고 회사는 비우면 전체입니다. 지난 실행 이력에서 어떤 유형을 언제 돌렸는지 확인합니다.

모의 실행 결과
모의 실행 결과 — 모의 실행은 저장하지 않고 대상과 금액만 보여 줍니다. 합계를 확인한 뒤 실행하면 작성중 문서가 만들어지고 합계가 같습니다.

모의 실행은 아무것도 저장하지 않습니다. 같은 조건으로 실행하면 이 합계와 같은 문서가 만들어지고, 다시 실행해도 중복은 생기지 않습니다.

대사와 예외 조치 — 규칙 7건이 남기는 예외

규칙별 최근 결과
규칙별 최근 결과 — 일곱 가지 규칙의 점검 건수, 차이 건수, 최대 차이, 허용 범위를 보여 줍니다.

허용 범위를 넘은 규칙은 차이 건수가 0 이 아닌 값으로 보입니다. 규칙 이름을 누르면 해당 예외 목록으로 이동합니다.

예외 목록
예외 목록 — 허용 범위를 넘는 차이가 예외로 남습니다. 조정 전표 생성, 보류, 허용 종결로 조치하고 다시 대사하면 해소 여부가 판단됩니다.

조치 후 ‘대사 실행’을 다시 누르면 해소 여부가 판단됩니다. 허용 종결과 보류는 사유를 남겨야 합니다.

부가세 분석 — 조건 · 표 · 차트 · 요인분해 · 해설

조회 조건과 배치
조회 조건과 배치 — 기간 범위, 지표, 기준 비교, 필터를 정하고 차원 칩을 행·열 칸으로 끌어 옮깁니다. 조회 버튼은 조건 영역 오른쪽 끝에 있습니다.

기본은 최근 3개월 · 지표 2개이며 행은 계정, 열은 원인입니다. 차원 칩을 다른 칸으로 끌어 놓으면 배치가 바뀝니다.

조회 결과 — 표와 차트
조회 결과 — 표와 차트 — 차변·대변 발생 합계와 계정 × 원인 표, 상위 항목 막대 차트가 한 화면에 나옵니다. 이름을 누르면 전표 명세로 내려갑니다.

이름을 누르면 해당 항목의 전표 명세가 열려 합계가 맞는지 확인할 수 있습니다. 오른쪽 차트는 첫 지표의 상위 항목이며 구분선을 끌어 폭을 조절합니다.

차이 요인 분해
차이 요인 분해 — 총차이를 기초 이월 · 차변 발생 · 대변 발생 · 결산 조정 효과로 나눈 폭포 차트와 요인 표입니다. 요인 합계와 전체 차이가 같은지 아래 줄이 매번 확인합니다.

기준(계획 대비 · 직전 기간 대비)을 바꿔 다시 분해할 수 있습니다. 요인 합계가 전체 차이와 다르면 줄이 경고로 바뀝니다.

AI 해설
AI 해설 — 해설은 기본으로 규칙 기반이며 숫자는 서비스가 집계한 값을 그대로 씁니다. 근거 표를 펼쳐 문장이 어느 숫자에서 나왔는지 확인합니다.

해설은 점검 참고용 문장이며 ‘점검 필요’처럼 원인을 단정하지 않는 표현을 씁니다. 모델 연결은 기본으로 꺼져 있습니다.

영역 간 연계 — 재무 문서가 만든 원가 · 자금 문서

문서 흐름도
문서 흐름도 — 재무 문서를 전기하면 따라 생성되는 원가·자금 문서를 선으로 이어 보여 줍니다. 상자를 누르면 해당 문서로 이동합니다.

매입 전표를 전기하면 불공제 세액의 원가 문서가 따라 생성됩니다. 역처리하면 선으로 이어진 연계 문서도 함께 되돌려집니다.

영역 필터
영역 필터 — 영역(재무·원가·자금)을 골라 연결된 문서만 봅니다.

영역을 원가로 거르면 재무 문서에서 파생된 원가 문서만 남습니다. 자금 영역에서는 정산 뒤 만들어진 납부(환급) 문서를 봅니다.

이력 · 감사 · 역할 — 누가 언제 무엇을 했나

감사 로그
감사 로그 — 누가 언제 무엇을 처리했는지 사용자·결과로 거르며 봅니다.

결과가 오류인 건만 거르면 거절된 요청을 찾아볼 수 있습니다. 조회자가 보낸 쓰기 요청이 거절된 기록도 남습니다.

상태 이력
상태 이력 — 문서별 상태 변화를 시간순으로 봅니다.

문서 번호를 누르면 작성 → 검토 → 승인 → 전기 순서와 처리자 · 승인자를 시간순으로 확인합니다.

사용자 · 권한과 직무 분리
사용자 · 권한과 직무 분리 — 조회자·처리자·승인자·관리자의 쓰기·승인·실행 권한과 직무 분리 규칙, 상태 전이표를 봅니다.

직무 분리 규칙(자기 승인 금지 · 2인 승인)이 상태 전이표와 함께 보여 사용자 전환으로 직접 검증해 볼 수 있습니다.

에이전트 규칙
에이전트 규칙 — 감시 규칙(지표·기준값·받을 역할)을 관리하고 지금 점검을 실행합니다. 하루 한 번만 실행됩니다.

점검은 하루 한 번만 실행되며, 걸린 것이 없어도 실행 이력이 남습니다. 호출 주체(사람 · 화면 타이머 · 배치)가 함께 기록됩니다.

좁은 화면 — 390px 에서도 한 열로 읽힌다

좁은 화면 문서 처리
좁은 화면 문서 처리 — 390px 폭에서는 메뉴가 접히고 표가 필요한 열만 보이며, 나머지는 팝인으로 펼칩니다.

메뉴 버튼으로 왼쪽 메뉴를 펼치고 접습니다. 가로 스크롤 없이 한 열로 읽히도록 확인했습니다.

화면 뒤에서 일어나는 일

이 앱이 쓰는 산출 · 대사식은 아래 순서입니다. 숫자가 어디서 만들어지고 어디서 맞춰 보는지를 따라가면 화면의 값을 그대로 읽을 수 있습니다.

  1. 세액 산출 — 세액 = 공급가액 × 세율(세율표). 영세율 매출은 세율 0, 불공제 매입은 세액 전액을 원가로 배부합니다. (R2)
  2. 공제세액 안분 — 공통매입은 불공제 비율로 나누어 공제세액 = 세액 − 불공제세액. 불공제 세액은 원가(영역 간 연계)로 배부됩니다. (R3)
  3. 전표화와 원장 대사 — 전표화된 미정산 세액(서브원장) = 부가세예수금 · 부가세대급금 총계정 잔액. (R1)
  4. 분기 정산 — 납부(환급) 세액 = 매출세액 − 대손세액 − 공제 매입세액. 정산 문서를 전기하면 해당 분기 세금계산서가 정산 완료로 표시되고 자금 문서가 따라 생성됩니다. (R4)
  5. 시산표 · 재무제표 점검 — 차변 = 대변, 기말 = 기초 + 차변 − 대변 + 조정, 모든 계정이 재무제표 라인에 연결. (R5 · R6)
  6. 국세청 전송 점검 — 전표화된 세금계산서의 전송 완료 여부. (R7)

대사 규칙 — 판정 조건 · 결과 상태 · 사용자 조치

규칙판정 조건(차이 = 왼쪽 − 오른쪽)허용 범위결과 상태사용자 조치
R1 세금계산서 원장 ↔ 총계정원장 집계(전표화된 미정산 세액) − 총계정 잔액±1원예외 생성수기 전표 정리 또는 조정 전표로 원장 기준 정리
R2 세액 = 공급가액 × 세율장부 세액 − 세율표 계산 세액±1원예외 생성10원 단위 반올림 차이는 허용 종결, 그 밖은 세율 · 세액 점검
R3 매입 공제세액 안분전기된 공제세액 − (세액 − 불공제액)±1원예외 생성불공제 비율 점검 후 조정 전표
R4 정산 문서 ↔ 분기 원장 집계정산 문서 납부(환급) 세액 − 분기 원장 집계±1원예외 생성정산 문서 역처리 후 재작성 또는 조정
R5 계정 ↔ 재무제표 라인재무제표 라인에 연결되지 않은 계정 잔액0원예외 생성기준정보에서 계정을 라인에 연결
R6 시산표 차변 ↔ 대변차변 합계 − 대변 합계0원예외 생성한쪽만 입력된 수기 전표 확인
R7 국세청 전송 ↔ 전표화전표화된 공급가액 중 전송 미완료분0원예외 생성전송 대기 · 점검 필요 건은 보류 또는 전송 상태 확인

허용 범위를 넘으면 예외가 생기고, 예외는 조치 중 → 해소 또는 보류, 허용 종결로 정리됩니다. 점검 결과는 ‘점검 필요’로 표시하며 원인을 단정하지 않습니다.

문서 상태 전이와 직무 분리

현재 상태동작다음 상태필요 역할조건
작성중검토 요청검토중처리자작성자가 요청
반려검토 요청검토중처리자수정 후 재요청
검토중승인승인됨승인자작성자 본인 승인 불가, 5천만 원 이상은 서로 다른 2인
검토중반려반려승인자사유 필수
승인됨전기전기됨처리자열린 기간만, 세금계산서 내용이 승인 뒤 바뀌었으면 거절
전기됨역처리역처리됨승인자사유 필수, 열린 기간만, 반대 문서가 원문서와 연결됨

조회조건

화면조건필수기본값서비스 필터
공통(상단)회사 · 기간 · 사용자선택전체 · 2026-09 · 처리자Bukrs eq '1000' · Period eq '2026-09' · 요청 머리로 사용자 구분
기준정보구분 · 전송 상태 · 상태선택전체Kind eq 'IN' · Method eq 'WAIT'
문서 처리검색어 · 상태 · 유형 · 내가 작성한 것선택전체Status eq 'REVIEW' · DocType eq 'OUT' · substringof(...)
일괄 실행유형 · 회사 · 기간유형 · 기간 필수매출 일괄 전표화 · 2026-09펑션 파라미터로 전달
대사 · 예외상태 · 규칙선택전체Status eq 'OPEN' · RuleId eq 'R1'
부가세 분석기간(부터 · 까지) · 지표 · 기준 비교 · 계산 항목 · 필터 · 행 · 열 배치기간 · 지표 필수최근 3개월 · 2개 지표Period ge '2026-07' and Period le '2026-09' · 차원 값 필터
영역 간 연계영역(전체 · 재무 · 원가 · 자금)선택전체문서 번호 부분 일치
이력 · 감사사용자 · 결과 · 검색어선택전체UserId eq 'U02' · Result eq 'ERROR'

결과 컬럼

화면컬럼의미 · 산출식
문서 목록문서번호 · 유형 · 회사 · 귀속 기간 · 상태 · 금액 · 작성자금액은 문서 라인 차변 합계, 상태는 상태 전이표의 현재 값
세금계산서 원장구분 · 공급가액 · 세액 · 불공제 세액 · 전표화 세액 · 전송 상태세액 = 공급가액 × 세율, 전표화 세액은 전기된 문서의 세액 합
대사 결과규칙 · 점검 건수 · 차이 건수 · 최대 차이 · 허용 범위차이 = 왼쪽 − 오른쪽, 허용 범위를 넘으면 예외 생성
분석 표행 축 · 열 축 · 지표 값 · 합계 · 비교 값지표별 합계를 먼저 더한 뒤 비율 · 계산 항목을 계산
요인 표요인 · 금액(원) · 비중 · 설명요인 합계 = 전체 차이를 매번 검산해 표시

좁은 화면에서 달라지는 것

390px 폭에서는 왼쪽 메뉴가 접히고 표는 필요한 열만 보입니다. 나머지 열은 행 아래로 펼쳐 볼 수 있고, 분석 화면의 차트는 표 아래로 내려옵니다. 화면이 가로로 넘치지 않도록 확인했습니다.

파일 구성

(앱 폴더)
├─ index.html · Component.js · manifest.json · readme.html
├─ view/ (Main · Home · Master · Docs · Tb · Batch · Recon · Analysis · Flow · Audit)
├─ controller/ · fragment/ · i18n/ · css/
├─ model/ (Api · ErrorHandler · formatter · cube · chart · pptx)
├─ media/ (소개 영상 · 포스터 · 재생 지점)
└─ odata/ (서비스 정의 · 업무 규칙 · 엔티티셋별 샘플 데이터)

SAP 표준 기능 확장 포인트

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다. 아래는 어느 일을 표준에 두고, 어느 자리를 이 앱이 더하는지를 나란히 놓은 표입니다.

표준으로 되는 것과 이 앱이 더하는 것

하고 싶은 일표준 T-code표준에서 걸리는 자리이 앱이 하는 일
매출 · 매입 세금계산서 전표 입력FB70 · FB60화면 단위로 한 건씩 입력하며, 세액 · 불공제 안분 결과를 건별로 확인합니다.일괄 전표화와 모의 실행, 같은 계정 · 세액 구조를 이어받은 문서 처리
수기 조정 전표FB50표준은 입력과 전기까지 담당합니다. 대사 차이가 난 뒤 정리 흐름은 화면 밖에서 관리합니다.대사 예외에서 조정 전표 · 보류 · 허용 종결로 조치하고 재대사
전표 역처리FB08역처리 자체는 표준이 담당합니다. 연결된 원가 · 자금 문서까지 한 번에 보기는 어렵습니다.역처리 시 반대 문서를 원문서와 연결하고 연계 문서도 함께 되돌림
세율 · 세금 코드FTXP표준이 원천입니다.세율표를 읽어 세액을 재계산(R2)하고 기간별 세율을 보여 줌
총계정 잔액 · 라인 항목FS10N · FBL3N잔액과 라인을 각각 조회합니다.서브원장과 총계정 잔액 대사(R1), 분석 드릴스루 결과와 라인 항목 대조
재무제표F.01표준이 법정 · 공시용 재무제표를 담당합니다.시산표 · 재무제표 점검 화면(R5 · R6), 라인 연결 누락 확인
직무 분리 승인 이력없음전표 단위 승인 설정은 있지만 부가세 정산 흐름 전체의 상태 이력과 2인 승인 규칙을 한눈에 보기는 어렵습니다.상태 전이표, 2인 승인, 감사 로그, 상태 이력

T-code 별 연계 지점

맞닿은 표준 T-code 마다 이 앱이 이어받는 데이터, 두 화면 숫자를 맞춰 보는 지점, 오가는 방법을 적었습니다. 법정 · 감사 · 세무 신고 대응은 표준에 남겨 두므로 기존 표준 리포트를 없앨 필요는 없습니다.

T-code이름연계
FB70매출 송장 입력매출 세금계산서 전표의 원천입니다. 이 앱의 일괄 전표화 · 문서 처리가 같은 계정 · 세액 구조를 이어받고, 만든 전표는 FB70 에서 입력한 것과 같은 방식으로 읽습니다. 숫자를 맞춰 볼 때는 이 앱의 문서 상세 → FB70 의 전표 조회 순서로 오갑니다.
FB60매입 송장 입력매입 세금계산서와 공제 · 불공제 세액의 원천입니다. 공통매입 안분(R3) 결과를 FB60 전표의 세액 라인과 대조합니다.
FB50총계정 전표 입력수기 조정 전표입니다. 대사 R1 · R6 에서 차이로 잡히면 이 앱의 조정 전표로 정리하고, 표준 쪽 수기 전표를 정리해야 한다면 FB50 으로 돌아갑니다.
FB08전표 역처리이 앱의 역처리 동작과 같은 개념입니다. 반대 문서가 원문서와 연결되는 점을 표준 전표 조회에서 확인합니다.
FTXP세금 코드 관리세율표(세율 코드 · 기간별 세율)의 원천입니다. 이 앱의 세율표 화면과 R2 대사가 FTXP 설정을 기준으로 맞아야 합니다.
FS10N총계정 잔액 조회대사 R1 에서 맞춰 보는 총계정 잔액 확인 화면입니다. 서브원장 잔액(이 앱) 과 총계정 잔액(FS10N)이 같은지 비교합니다.
FBL3N총계정 라인 항목분석 드릴스루 결과와 대조하는 라인 항목 화면입니다. 이 앱의 셀에서 내려간 문서 라인과 FBL3N 의 같은 계정 · 기간 라인을 비교합니다.
F.01재무제표 작성시산표 · 재무제표 화면과 맞춰 보는 표준 화면입니다. 법정 · 공시 목적의 재무제표는 표준에 남겨 둡니다.

S/4HANA 분석 스택과의 자리

이 앱의 분석 모듈은 CDS 큐브와 분석 쿼리를 읽는 구조(아래 “CDS 구성”)라서, S/4HANA 에서 CDS 분석 쿼리를 쓰는 환경이라면 같은 뷰를 다른 분석 도구와 함께 읽을 수 있습니다. 표준 분석 앱이나 Analysis for Office 와는 쓰는 목적이 다릅니다 — 그쪽은 자유 분석, 이 앱은 처리 · 승인 · 대사 흐름 안에서 숫자를 확인하는 자리입니다. 표준 제공 분석 앱의 구체 이름과 적용 범위는 확인하지 못해 적지 않았습니다(확인 필요).

확장 포인트 — 운영에서 실제로 손대는 자리

자리무엇을 정하나손대는 지점
세금 코드와 세율고객사마다 다른 세금 코드 체계(과세 · 영세율 · 불공제)를 어느 코드가 어떤 세율 구분에 해당하는지 매핑표로 둡니다.매핑 테이블(앱 소유) · 세금 코드 설정
불공제 비율공통매입 안분 기준(공급가액 비율 등)과 비율 확정 시점을 정합니다.파라미터 테이블 · 필요 시 BAdI
전표 연계매입 전표 전기 시 원가 문서 생성 조건과 연계 문서 흐름 키를 정합니다.문서 흐름 키 · 연계 로직
권한조회 · 처리 · 승인 · 관리 역할을 권한 객체로 옮깁니다.PFCG 역할 · 권한 객체
확장 필드사업장 · 프로젝트 등 고객사 고유 필드를 큐브 차원으로 추가합니다.확장 필드(Include) · 차원 뷰

분석 지표 정의표

지표산식 · 판정 기준대응 기능원천 데이터비고
매출세액영세율 제외 과세 매출 공급가액 × 세율M6 분석 · M3 문서BSET-HWSTE영세율은 세율 0
공제 매입세액매입세액 − 불공제 세액M3 · R3 대사BSET-HWSTE · 불공제 비율공통매입 안분
대손세액대손 확정 채권 공급가액 × 세율(경과 개월 충족분)M3 · M4BSEG-DMBTR경과 부족 건은 점검 필요
납부(환급) 세액매출세액 − 대손세액 − 공제 매입세액M3 분기 정산 · R4총계정 부가세예수금 · 대급금양수 납부, 음수 환급
국세청 전송 미완료전표화된 건 중 전송 완료가 아닌 건수 · 금액M5 · R7세금계산서 원장 전송 상태개요 타일 제공
대사 차이규칙별 차이 건수 · 최대 차이M5규칙 7건허용 범위는 규칙표 참조

세율 · 신고 서식 · 세법 조문은 이 글에서 단정하지 않습니다. 샘플의 세율 10% · 0% 는 가정값입니다.

CDS 구성

뷰 레이어 구성

기준 데이터에서 서비스까지 일곱 층으로 나눴습니다. 위로 갈수록 의미가 분명해지고, 아래 층의 이름 변경이 위로 번지지 않습니다.

레이어뷰 · 객체하는 일왜 나누나
기준ZVAT_TAXMAP · ZVAT_INVOICE세금 코드 ↔ 세율 구분 매핑, 세금계산서 원장(앱 소유 테이블)고객사마다 다른 세금 코드 체계를 코드가 아니라 데이터로 둡니다.
차원ZI_VatAccount계정 · 재무제표 라인 차원(분석 축)계정 텍스트와 재무제표 라인을 한 곳에서 읽어 모든 뷰가 같은 이름을 씁니다.
기본 뷰ZI_VatTaxLine세금 데이터(BSET)와 전표 헤더(BKPF)를 읽는 인터페이스 뷰원천 필드 이름을 한 번만 바꾸고 위쪽 뷰는 의미 이름만 씁니다.
큐브ZI_VatCube기간 · 회사 · 계정 · 원인 축으로 세액을 집계화면의 피벗과 드릴스루가 모두 같은 집계에서 나옵니다.
쿼리ZC_VatQuarterQuery분기별 매출세액 · 매입세액 분석 쿼리조회조건(필터)과 화면 노출 필드를 한곳에서 정의합니다.
권한ZC_VatQuarterQuery(DCL)회사 코드 단위 접근 제어집계 단계에서 걸어 합계로 남의 숫자가 드러나지 않게 합니다.
서비스ZUI_VatHub(정의 · 바인딩)OData 서비스 정의와 RAP 승인 액션화면이 보는 주소와 처리 액션을 한 서비스로 묶습니다.

① ZVAT_TAXMAP — 세금 코드 매핑 테이블

이 앱에서 가장 먼저 정해야 하는 데이터입니다. 세금 코드가 과세인지 영세율인지 불공제인지, 매입이라면 공통매입인지를 코드가 아니라 테이블 행으로 둡니다. 고객사마다 코드 체계가 달라 SQL 안에 like 'O%' 같은 조건을 박아 넣으면 이식이 되지 않습니다. 이 테이블이 비어 있으면 아래 모든 뷰가 같은 결과를 내지 못합니다.

" ───────────────────────────────────────────────────────────────
"  ZVAT_TAXMAP : 세금 코드 → 부가세 구분 매핑
"  역할 : 어떤 세금 코드가 매출 과세 · 영세율 · 매입 공제 · 불공제 인지를 정한다
"  이렇게 나눈 이유 : 세금 코드 체계는 고객사 설정이라, 조건을 뷰에 박지 않고
"                    테이블 행으로 두어 현업(세무팀)이 직접 관리하게 한다
" ───────────────────────────────────────────────────────────────
@EndUserText.label : '부가세 세금 코드 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zvat_taxmap {
  key client     : abap.clnt not null;
  key mwskz      : mwskz not null;            " 세금 코드
  key valid_from : abap.dats not null;        " 적용 시작일
  valid_to       : abap.dats;
  vat_kind       : abap.char(1);              " O 매출 · I 매입
  tax_class      : abap.char(4);              " STD 과세 · NIL 영세율 · EXM 면세
  deductible     : abap_boolean;              " 공제 가능 여부
  common_purch   : abap_boolean;              " 공통매입(안분 대상)
  rate_pct       : abap.dec(5,2);             " 세율(%) — 세율표와 대사(R2)에 쓴다
}

② ZVAT_INVOICE — 세금계산서 원장(앱 소유 테이블)

표준 전표(BKPF · BSEG · BSET)에는 “국세청에 전송했는가”, “정산이 끝났는가” 같은 상태가 없습니다. 그래서 세금계산서 한 장이 전표와 어떻게 이어지는지, 전송과 정산이 어디까지 갔는지를 앱 소유 테이블로 둡니다. 대사 R7(전송 ↔ 전표화)과 R1(원장 ↔ 총계정)이 모두 이 테이블에서 시작합니다.

" ───────────────────────────────────────────────────────────────
"  ZVAT_INVOICE : 세금계산서 원장
"  역할 : 세금계산서 1장 = 1행. 전표 연결 · 전송 상태 · 정산 완료 표시
"  이렇게 나눈 이유 : 표준 전표에 없는 "전송 · 정산" 상태를 앱이 책임지고,
"                    전표 쪽 값은 키(bukrs · belnr · gjahr)로만 연결한다
" ───────────────────────────────────────────────────────────────
@EndUserText.label : '부가세 세금계산서 원장'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zvat_invoice {
  key client      : abap.clnt not null;
  key invoice_id  : sysuuid_x16 not null;
  bukrs           : bukrs;
  kind            : abap.char(3);              " OUT 매출 · IN 매입 · BAD 대손 채권
  period          : abap.char(7);              " 귀속 기간 YYYY-MM 형식
  @Semantics.amount.currencyCode : 'zvat_invoice.waers'
  base_amount     : abap.curr(15,2);           " 공급가액
  @Semantics.amount.currencyCode : 'zvat_invoice.waers'
  tax_amount      : abap.curr(15,2);           " 세액
  waers           : waers;
  send_status     : abap.char(4);              " DONE · WAIT · CHK(점검 필요)
  belnr           : belnr_d;                   " 연결된 전표(전표화 전에는 비어 있음)
  gjahr           : gjahr;
  settled_doc     : abap.char(20);             " 분기 정산 문서(정산 전에는 비어 있음)
}

③ ZI_VatAccount — 계정 · 재무제표 라인 차원

분석 축이 되는 계정은 이름과 재무제표 라인을 함께 읽어야 합니다. 라인에 연결되지 않은 계정이 있으면 대사 R5 가 예외를 만들므로, 이 차원 뷰가 “라인이 없는 계정”을 숨기지 않고 그대로 드러내도록 left outer join 으로 읽습니다.

" ───────────────────────────────────────────────────────────────
"  ZI_VatAccount : 계정 차원
"  역할 : 계정 · 계정명 · 재무제표 라인을 한 행으로
"  이렇게 나눈 이유 : 라인 연결 누락을 숨기지 않기 위해 outer join 으로 읽는다
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #NOT_REQUIRED
@Analytics.dataCategory : #DIMENSION
@ObjectModel.representativeKey : 'Account'
@EndUserText.label : '부가세 계정 차원'
define view entity ZI_VatAccount
  as select from ska1
    left outer join zvat_fsmap as _map on _map.saknr = ska1.saknr
    left outer join skat       as _txt on _txt.saknr = ska1.saknr
                                      and _txt.ktopl = ska1.ktopl
                                      and _txt.spras = $session.system_language
{
  @ObjectModel.text.element : [ 'AccountName' ]
  key ska1.saknr        as Account,
      @Semantics.text : true
      _txt.txt50        as AccountName,
      _map.fs_line      as FsLine,                       " 비어 있으면 R5 예외 대상
      case when _map.fs_line is null then 'X' else '' end as NoLineFlag
}

④ ZI_VatTaxLine — 세금 데이터 인터페이스 뷰

원천 테이블의 필드 이름(hwbas · hwste · mwskz)을 이 뷰 한 곳에서만 읽고, 위쪽 뷰는 의미 있는 이름(BaseAmount · TaxAmount)만 씁니다. 세금 코드는 매핑 테이블을 association 으로 이어 두어 “이 줄이 영세율인가”를 조건문이 아니라 조인 결과로 알 수 있게 합니다. 세액의 부호와 통화는 여기서 확정합니다.

" ───────────────────────────────────────────────────────────────
"  ZI_VatTaxLine : 세금 라인 인터페이스 뷰
"  역할 : 세금 데이터(BSET) + 전표 헤더(BKPF) + 세금 코드 매핑
"  이렇게 나눈 이유 : 원천 필드명은 이 뷰에서만 읽고, 위 뷰는 의미 이름만 쓴다
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '부가세 세금 라인'
define view entity ZI_VatTaxLine
  as select from bset
    inner join bkpf on  bkpf.bukrs = bset.bukrs
                    and bkpf.belnr = bset.belnr
                    and bkpf.gjahr = bset.gjahr
  association [0..1] to zvat_taxmap as _Map
      on  _Map.mwskz = bset.mwskz
      and _Map.valid_from <= bkpf.budat
      and ( _Map.valid_to is null or _Map.valid_to >= bkpf.budat )
{
  key bset.bukrs                         as CompanyCode,
  key bset.belnr                         as AccountingDocument,
  key bset.gjahr                         as FiscalYear,
  key bset.buzei                         as TaxItem,
      bset.mwskz                         as TaxCode,
      bkpf.budat                         as PostingDate,
      left( bkpf.budat, 6 )              as PostingPeriod,
      bkpf.waers                         as TransactionCurrency,
      @Semantics.amount.currencyCode : 'TransactionCurrency'
      bset.hwbas                         as BaseAmount,       " 공급가액(과세표준)
      @Semantics.amount.currencyCode : 'TransactionCurrency'
      bset.hwste                         as TaxAmount,        " 세액
      _Map.vat_kind                      as VatKind,
      _Map.tax_class                     as TaxClass,
      _Map.deductible                    as IsDeductible,
      _Map
}

⑤ ZI_VatCube — 분석 큐브

화면의 피벗과 드릴스루가 모두 이 큐브 한 벌에서 나옵니다. 합계가 어긋날 자리가 없다는 말은 “축을 바꿔도 같은 뷰를 다시 집계할 뿐”이라는 뜻입니다. 매출세액과 공제 매입세액은 case 로 가르고, 불공제 세액은 공제 가능 여부(IsDeductible)로 나눕니다. 이 큐브의 합계는 화면의 “큐브 합계”와 문서 라인 명세 합계를 맞춰 보는 검증의 기준이 됩니다.

" ───────────────────────────────────────────────────────────────
"  ZI_VatCube : 부가세 분석 큐브
"  역할 : 기간 · 회사 · 계정 · 세금 구분 축으로 세액을 집계
"  이렇게 나눈 이유 : 모든 분석 화면이 같은 집계를 읽어 합계가 갈라지지 않는다
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory : [#NONE]
@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '부가세 분석 큐브'
define view entity ZI_VatCube
  as select from ZI_VatTaxLine as t
{
  key t.CompanyCode,
  key t.PostingPeriod,
  key t.TaxClass,
  key t.VatKind,
      t.TransactionCurrency,
      @DefaultAggregation : #SUM
      @Semantics.amount.currencyCode : 'TransactionCurrency'
      sum( t.BaseAmount )                                                      as BaseAmount,
      @DefaultAggregation : #SUM
      @Semantics.amount.currencyCode : 'TransactionCurrency'
      sum( case when t.VatKind = 'O' then t.TaxAmount else 0 end )             as OutputTax,
      @DefaultAggregation : #SUM
      @Semantics.amount.currencyCode : 'TransactionCurrency'
      sum( case when t.VatKind = 'I' and t.IsDeductible = 'X'
                then t.TaxAmount else 0 end )                                   as InputTaxDeductible,
      @DefaultAggregation : #SUM
      @Semantics.amount.currencyCode : 'TransactionCurrency'
      sum( case when t.VatKind = 'I' and t.IsDeductible = ''
                then t.TaxAmount else 0 end )                                   as InputTaxNonDeductible
}
group by t.CompanyCode, t.PostingPeriod, t.TaxClass, t.VatKind, t.TransactionCurrency

⑥ ZC_VatQuarterQuery — 분석 쿼리(Consumption)

큐브 위에 조회조건과 화면 노출 정보를 얹는 층입니다. 기간과 회사를 필수 필터로 두면 대용량에서도 무제한 집계가 일어나지 않습니다. 납부(환급) 세액은 저장하지 않고 쿼리에서 매출세액 − 공제 매입세액으로 계산합니다(대손세액은 별도 지표로 합산).

" ───────────────────────────────────────────────────────────────
"  ZC_VatQuarterQuery : 분기 부가세 분석 쿼리
"  역할 : 필수 필터(기간 · 회사)와 계산 지표(납부 · 환급 세액) 정의
"  이렇게 나눈 이유 : 계산은 쿼리에, 집계는 큐브에 두어 책임을 나눈다
" ───────────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '분기 부가세 분석'
@Analytics.query : true
@VDM.viewType : #CONSUMPTION
define view entity ZC_VatQuarterQuery
  as select from ZI_VatCube
{
  @AnalyticsDetails.query.axis : #ROWS
  @Consumption.filter : { selectionType : #RANGE, mandatory : true, multipleSelections : false }
  key PostingPeriod,
  @AnalyticsDetails.query.axis : #ROWS
  @Consumption.filter : { selectionType : #SINGLE, mandatory : true }
  key CompanyCode,
  @AnalyticsDetails.query.axis : #ROWS
  key TaxClass,
  @AnalyticsDetails.query.axis : #COLUMNS
  OutputTax,
  @AnalyticsDetails.query.axis : #COLUMNS
  InputTaxDeductible,
  @AnalyticsDetails.query.axis : #COLUMNS
  InputTaxNonDeductible,
  @AnalyticsDetails.query.axis : #COLUMNS
  @EndUserText.label : '납부(환급) 세액'
  OutputTax - InputTaxDeductible as PayableTax          " 양수 납부, 음수 환급
}

⑦ ZC_VatQuarterQuery — DCL(접근 제어)

권한은 집계 단계에서 걸어야 합니다. 드릴스루 결과에만 걸면 합계에서 남의 회사 숫자를 뺄셈으로 알아낼 수 있습니다. 샘플의 역할 4종(조회 · 처리 · 승인 · 관리)은 운영에서 PFCG 역할과 권한 객체로 옮겨 이 DCL 과 연결합니다.

" ───────────────────────────────────────────────────────────────
"  ZC_VatQuarterQuery : 접근 제어(DCL)
"  역할 : 회사 코드 단위로 조회 범위를 제한
"  이렇게 나눈 이유 : 집계 단계에서 걸어 합계로 남의 숫자가 드러나지 않게 한다
" ───────────────────────────────────────────────────────────────
@EndUserText.label : '분기 부가세 분석 — 접근 제어'
@MappingRole : true
define role ZC_VATQUARTERQUERY {
  grant select on ZC_VatQuarterQuery
    where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}

⑧ ZUI_VatHub — 서비스 정의와 승인 액션(RAP)

화면은 서비스 한 개만 바라봅니다. 승인과 전기 같은 처리는 RAP 액션으로 노출해 서비스가 직무 분리(작성자 ≠ 승인자, 5천만 원 이상 2인 승인)를 다시 확인하게 합니다. 이 서비스 정의를 Binding 으로 게시하면 화면의 manifest.json 서비스 주소만 바꿔 운영에 연결할 수 있습니다.

" ───────────────────────────────────────────────────────────────
"  ZUI_VatHub : 서비스 정의 + 승인 액션(동작 정의)
"  역할 : 분석 쿼리와 문서 처리를 하나의 서비스로 노출하고
"        승인 · 전기 · 역처리 규칙을 서버에서 판정한다
"  이렇게 나눈 이유 : 화면의 버튼 숨김은 편의일 뿐, 권한 판정은 서버에 둔다
" ───────────────────────────────────────────────────────────────
@EndUserText.label : '부가가치세 통합 관리 서비스'
define service ZUI_VatHub {
  expose ZC_VatQuarterQuery as QuarterQuery;
  expose ZR_VatDocument     as Document;
}

managed implementation in class zbp_r_vatdocument unique;
strict ( 2 );
define behavior for ZR_VatDocument alias Document
persistent table zvat_document
lock master
authorization master ( instance )
{
  create; update;
  field ( readonly ) DocumentStatus, ApprovedBy, PostedAt;
  action ( features : instance ) submitForReview result [1] $self;
  action ( features : instance ) approve         result [1] $self;   " 작성자 본인 · 금액 구간 검사
  action ( features : instance ) reject parameter ZA_VatReason result [1] $self;
  action ( features : instance ) post            result [1] $self;
  action ( features : instance ) reverse parameter ZA_VatReason result [1] $self;
  validation checkSegregation on save { create; update; }
}

코드는 구조를 보이는 스케치이며 고객사의 세금 코드 · 계정 체계 · 릴리스에 따라 확인이 필요합니다. 표준 CDS 뷰 이름은 확인하지 못한 것을 쓰지 않고 원천 테이블 기준으로 적었습니다.

운영 시점에 해야 할 일

개발보다 정하는 일이 많습니다. 아래 열두 가지가 정해져야 샘플이 아닌 실제 원장으로 연결됩니다.

해야 할 일무엇을 정하나정하지 않으면누가
상태 흐름 · 승인 단계 · 금액 구간작성 → 검토 → 승인 → 전기 → 역처리 단계와 2인 승인 금액 구간(샘플 5천만 원)을 업무 규칙으로 확정합니다.샘플 값이 그대로 운영되어 내부 통제 기준과 어긋납니다.재무팀 · 내부통제
역할을 권한 객체로조회 · 처리 · 승인 · 관리를 SAP 권한 객체와 PFCG 역할로 옮기고 데모 사용자 전환을 없앱니다.요청 머리 값으로 누구나 역할을 바꿀 수 있습니다.보안 · 권한
처리 펑션을 표준 처리와 연결일괄 전표화 · 정산 · 역처리 펑션을 표준 BAPI · RAP 액션 · 표준 일괄 처리와 연결합니다.샘플 문서만 만들어지고 실제 원장에 전기되지 않습니다.IT · 재무팀
문서 번호 범위앱이 만드는 문서(전표화 · 정산 · 조정)의 번호 범위와 표준 전표 번호 연결 방식을 정합니다.번호가 겹치거나 추적이 끊깁니다.재무팀
세금 코드 · 세율 · 불공제 매핑세금 코드가 과세 · 영세율 · 불공제 중 무엇인지, 공통매입 안분 기준을 확정합니다.세액 재계산(R2)과 안분(R3)이 기존 신고 수치와 어긋납니다.세무팀 · 재무팀
영역 간 연계 키재무 문서와 원가 · 자금 문서를 잇는 문서 흐름 키와 되돌림 규칙을 정합니다.역처리 시 연계 문서가 남습니다.재무 · 원가 · 자금
대사 규칙 · 허용 오차규칙 7건의 허용 범위(±1원 등)와 예외 처리 기준을 정합니다.정상 차이가 예외로 쏟아지거나 진짜 차이가 허용됩니다.재무팀 · 감사
원천 확정과 차원 범위분석 큐브가 읽을 원천(총계정 라인 · 계획)과 차원 범위를 정합니다.나중에 차원을 늘리려면 뷰를 고쳐 다시 이송해야 합니다.재무 · IT
권한 설계(집계 단계)회사 코드 · 사업장 단위 권한을 집계 단계에 걸 방식을 정합니다.드릴스루에만 걸면 합계로 남의 숫자가 드러납니다.보안 · 권한
성능 기준과 전송(TR) 순서응답 시간 기준, 뷰 · 서비스 · 화면의 이송 순서를 정합니다.이송 중 서비스와 화면 버전이 어긋납니다.Basis · IT
서비스 활성화와 주소 교체서비스 활성화(/IWFND/MAINT_SERVICE 또는 Binding 게시) 뒤 manifest.json 의 서비스 주소를 교체합니다.화면이 샘플 서비스를 계속 바라봅니다.IT
배치 등록감시 에이전트 실행을 운영 배치(SM36 또는 cron)에 연결합니다.사람이 화면을 열 때만 점검이 돕니다.Basis · 재무

숫자를 믿을 수 있는가 — 검증 결과

검증용 샘플 데이터 전수에 대사식을 돌린 결과입니다. 규칙별 차이 15건은 모두 의도적으로 넣은 예외이고, 예기치 않은 차이는 0건입니다. 도입 포인트의 “사례로 보는 효과”가 같은 숫자입니다.

대사식검사 건수차이 건수
R1 세금계산서 원장 = 총계정 잔액42 (의도적)
R2 세액 = 공급가액 × 세율653 (의도적)
R3 매입 공제세액 안분322 (의도적)
R4 정산 문서 = 분기 원장 집계21 (의도적)
R5 계정이 재무제표 라인에 연결271 (의도적)
R6 시산표 차변 = 대변21 (의도적)
R7 국세청 전송 = 전표화655 (의도적)
큐브 합계 = 문서 라인 명세 합계(48개 조합)480
기말 = 기초 + 차변 − 대변 + 조정(모든 계정)전 계정0
  • 서비스 · 화면 점검 통과: 엔티티셋 36종 모두 데이터 존재, 키 없는 엔티티 0건, 필터 · 정렬 · 건수 제한 동작, 날짜 필터 동작.
  • 업무 흐름 점검: 처리자 생성 → 검토 요청 → 같은 사용자 승인 거절 → 승인자 2단계 승인 → 전기 → 역처리(반대 문서 연결), 허용되지 않는 전이와 조회자 쓰기 거절, 일괄 실행 모의 합계 = 실행 합계(재실행 중복 없음), 대사 → 예외 조치 → 재대사.
  • 화면 점검: 테마 sap_horizon, 조회 버튼 위치, 조회자 전환 시 쓰기 버튼 숨김, 390px 메뉴 접힘, 서비스 미연결 안내. 분석 PPT 보고서는 python-pptx 로 열림.

운영 데이터로 갈 때

세금계산서와 전표가 수천만 건이 되면 집계를 서비스 메모리가 아니라 CDS 큐브(데이터베이스 안)에서 해야 합니다. 분석 쿼리의 기간 · 회사 필터를 필수로 두고, 드릴스루는 건수 상한과 페이지 조회로 제한하며, 큐브의 집계 키(기간 · 회사 · 세금 구분)에 맞는 인덱스를 둡니다. 응답 시간 기준은 실제 건수로 측정해 정하고, 일괄 실행은 표준 일괄 처리 대상 건수에 맞춰 분할합니다.

자주 묻는 질문

도입을 검토할 때 자주 나오는 질문 24개를 네 묶음으로 정리했습니다.

숫자와 산식

부가세 신고서를 이 앱이 대신 작성하나요?

아니요. 이 앱은 세금계산서의 전표화, 조정 · 정산 문서, 대사와 분석을 돕는 점검 도구입니다. 신고서 작성과 제출, 세액의 최종 판단은 회사와 세무 대리인이 합니다.

앱이 만드는 납부(환급) 세액은 신고 준비를 위한 참고 값이며, 신고 서식과 세법 해석은 이 글에서 다루지 않습니다.

화면의 숫자는 실제 데이터인가요?

아니요. 모든 값은 검증용 샘플 데이터(가상)입니다. 거래처는 일반 명칭(거래처 A-001 형식)이고 세율 10% · 0% 도 가정값입니다. 운영에 연결하면 세금 코드 설정과 실제 원장 데이터로 바뀝니다.

납부(환급) 세액은 어떻게 계산하나요?

납부(환급) 세액 = 매출세액 − 대손세액 − 공제 매입세액입니다. 양수는 납부, 음수는 환급으로 읽습니다. 세액은 공급가액 × 세율로 구하고 영세율 매출은 세율 0, 공통매입은 불공제 비율로 안분합니다.

대사 R1 ~ R7 은 무엇을 맞추나요?

원장과 총계정 잔액(R1), 세액 계산(R2), 매입 공제세액 안분(R3), 정산 문서와 분기 원장 집계(R4), 계정과 재무제표 라인 연결(R5), 시산표 차변과 대변(R6), 국세청 전송과 전표화(R7)입니다. 허용 범위는 ±1원 또는 0원이며 넘으면 예외가 생깁니다.

검증용 샘플 데이터에서 일부러 넣은 예외는 몇 건인가요?

대사 예외는 전체 16건(R1 2 · R2 3 · R3 3 · R4 1 · R5 1 · R6 1 · R7 5)이며 이 가운데 허용 종결 1건과 해소 1건을 포함합니다. 마지막 대사 기준 차이 건수는 15건이고 모두 의도적으로 넣은 예외입니다. 예기치 않은 차이는 0건입니다.

외화 거래나 환율 환산도 다루나요?

이 앱의 샘플은 원화 세금계산서만 다룹니다. 외화 세금계산서나 환율 환산이 필요하면 환율 유형과 환산 시점을 먼저 정해야 하며, 그 값은 세액 계산(R2)에 들어가는 공급가액에 영향을 줍니다. 이 글에서는 외화 처리 규칙을 확정하지 않았습니다.

화면과 조작

조회 버튼은 어디에 있나요?

분석 화면의 조회 버튼은 조회 조건 영역 오른쪽 끝에 있습니다. 문서 처리 · 기준정보 화면의 검색창은 Enter 키를 누르면 바로 검색합니다. 분석 화면에서 ‘열 때 자동 조회’를 켜 두면 열자마자 조회됩니다.

일괄 실행은 어떻게 안전하게 하나요?

먼저 모의 실행으로 대상과 금액을 확인합니다(저장 안 됨). 이상이 없으면 실행하고, 실행 결과 합계는 모의 실행 합계와 같습니다. 같은 대상 · 기간은 중복으로 만들어지지 않아 재실행해도 중복 문서가 생기지 않습니다.

대사 예외는 어떻게 정리하나요?

예외마다 조정 전표 생성, 보류, 허용 종결 중 하나로 조치합니다. 조치한 뒤 대사를 다시 실행하면 해소 여부가 판단되어 ‘조치 중’이 ‘해소’로 바뀝니다. 점검 결과는 ‘점검 필요’로 표시하며 원인을 단정하지 않습니다.

좁은 화면(휴대폰)에서도 쓸 수 있나요?

390px 폭에서는 왼쪽 메뉴가 접히고, 표는 필요한 열만 보이며 나머지는 행 아래로 펼쳐 볼 수 있습니다. 가로로 넘치지 않도록 확인했습니다.

내려받기는 어떤 것이 되나요?

문서 · 대사 예외 · 기준정보 목록은 엑셀로, 분석 결과는 표 CSV 와 PowerPoint 보고서로 받습니다. 보고서는 브라우저에서 만들어지며 서버에 파일을 남기지 않습니다.

권한과 직무 분리

승인 권한은 어떻게 나뉘나요?

조회자는 보기만, 처리자는 작성 · 검토 요청 · 전기, 승인자는 승인 · 반려 · 역처리, 관리자는 기준정보와 규칙 관리를 합니다. 작성자는 자기 문서를 승인할 수 없고 5천만 원 이상은 서로 다른 2인이 승인합니다.

화면에서 버튼을 숨기면 충분한가요?

아니요. 화면의 버튼 숨김은 편의일 뿐이고 같은 요청을 직접 보내도 서비스가 역할과 상태 전이를 다시 확인해 거절합니다. 검증에서 조회자의 쓰기 요청과 허용되지 않는 전이가 거절되는 것을 확인했습니다.

데모 사용자 전환은 운영에서도 쓰나요?

아니요. 데모에서는 요청 머리 값으로 사용자를 구분하지만 운영에서는 SAP 권한 객체와 PFCG 역할로 바꾸고 사용자 전환을 없앱니다. 이 일은 “운영 시점에 해야 할 일” 표에 포함되어 있습니다.

2인 승인 금액 구간은 바꿀 수 있나요?

샘플은 5천만 원 이상을 2인 승인으로 두었습니다. 운영에서는 회사의 내부통제 기준에 맞춰 금액 구간과 승인 단계를 업무 규칙으로 확정하고 서비스의 상태 전이 규칙에 반영합니다.

감사 이력에는 무엇이 남나요?

감사 로그에는 사용자 · 동작 · 결과가 시간순으로 남고, 상태 이력에는 문서별 상태 변화가 남습니다. 기준정보 변경(세율표 수정 등)도 감사 로그에 기록됩니다.

도입과 운영

SAP 표준 T-code 와는 어떤 관계인가요?

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다. 전표 입력은 FB70 · FB60 · FB50, 역처리는 FB08, 세율은 FTXP 와 이어지며 잔액과 라인은 FS10N · FBL3N 으로 맞춰 볼 수 있습니다. 기존 표준 리포트를 없앨 필요는 없습니다.

적용 시기나 범위가 정해져 있나요?

확인된 사실은 없습니다. 이 앱은 분기 단위 정산(3 · 6 · 9월) 흐름을 샘플로 보여 주며, 실제 적용 시기와 범위는 회사의 부가가치세 신고 일정과 세무 대리인 안내에 따릅니다.

운영 연결에는 어떤 절차와 시간이 드나요?

코드를 쓰는 일보다 정하는 일이 많습니다. 세금 코드 매핑, 불공제 기준, 승인 단계, 권한 설계가 먼저 정해져야 하고, 그다음 CDS 뷰 · 서비스 활성화 · 화면 이송 순서로 진행합니다. 소요 기간은 회사의 세금 코드 정리 상태와 권한 체계에 따라 달라 이 글에서 단정하지 않습니다.

전표가 수천만 건이면 어떻게 하나요?

지금 샘플은 서비스가 메모리에서 집계합니다. 운영 규모에서는 집계를 CDS 큐브(데이터베이스 안)에서 하고, 분석 화면의 기간 · 지표 조건을 필수로 두며, 드릴스루는 건수 상한을 둡니다. 인덱스와 응답 시간 기준은 실제 건수로 측정해 정합니다.

계정 체계나 세금 코드가 바뀌면 어떻게 하나요?

세금 코드 매핑표와 계정 ↔ 재무제표 라인 연결을 기준정보로 두어 코드를 고치지 않고 관리합니다. 연결이 빠진 계정은 대사 R5 에서 예외로 잡힙니다.

운영 배치는 어떻게 연결하나요?

감시 에이전트의 하루 한 번 제한은 서비스가 판정하므로, 운영에서는 SM36 배치나 cron 이 같은 실행 펑션을 부르도록 연결하면 됩니다. 실행 이력에는 호출 주체(사람 · 화면 타이머 · 배치)가 남습니다.

이 앱의 결과를 감사나 신고에 그대로 써도 되나요?

아니요. 이 앱은 업무 처리와 분류 · 집계 · 대사를 돕는 점검 도구입니다. 최종 판단은 회사와 감사인이 하고, 세무 신고는 회사와 세무 대리인이 합니다. 법정 · 공시 · 신고용 산출은 표준 처리에 남겨 두세요.

AI 해설은 숫자를 만들어 내나요?

아니요. 금액과 비율은 서비스가 집계한 값을 그대로 쓰고, 해설은 기본으로 규칙 기반입니다. 모델 연결은 서비스 안 설정 하나로 켜며 기본은 꺼져 있습니다. 해설에 쓴 근거 표를 화면에서 펼쳐 볼 수 있습니다.