SAP 증빙 전표 작성 — 영수증을 골라 결재상신까지
영수증 카드 목록에서 올릴 건을 고르고, 회계계정과 금액을 맞춘 뒤 여러 건을 한 번에 결재상신하는 화면입니다.
경비 전표는 영수증에서 시작합니다. 법인카드 승인 내역이나 세금계산서가 들어오면 계정과 코스트센터를 붙이고, 금액을 맞춘 뒤, 결재를 올려야 전표가 끝납니다.
이 과정을 SAP GUI 화면 여러 개를 오가며 하면 한 건씩 처리하게 됩니다. 이 앱은 증빙을 카드 목록으로 보여 주고, 여러 건을 골라 한 번에 결재상신하도록 OpenUI5 화면으로 확장했습니다. 서버에 올린 앱에서 목록 → 선택 → 결재상신 순서로 실제 캡처한 화면 4종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 회사코드·회계연도 — 전표 헤더 기준 정보
- 전표번호 — 전표 생성 시 표준 번호 범위에서 채번
- 회계계정 — 계정과목(G/L)·코스트센터·내부오더·적요
- 금액 — 공급가액·부가세·통화
- 증빙 — 법인카드·세금계산서·기타증빙·예산신청 구분과 첨부파일
| 항목 | 내용 |
|---|---|
| 대응 T-code | FB60 · FV60 (매입 송장·전표 입력) |
| 업무 영역 | 재무회계(FI) · 경비 전표 |
| Namespace | fi077_journalentry |
| 셸 구조 | sap.f.FlexibleColumnLayout — 왼쪽 증빙 카드 목록, 오른쪽 상세·편집 |
| 데이터 | ZFCMC_F00_C007(증빙 헤더) · to_acct(회계계정) · VL_APPRLINE(결재선) · ZFILESet(첨부파일) |
| 성격 | 입력형 — 편집 저장, 전표 생성·삭제, 결재상신 |
| 처리 상태 | 임시 → 전표작성완료 → 결재상신완료 → 부서장결재완료 → 결재완료 / 반려 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 4종 둘러보기
증빙을 목록에서 보고 → 올릴 건을 선택한 뒤 → 결재선과 메모를 넣어 결재상신합니다.
아래는 서버에 올린 앱을 실제 브라우저로 열어 순서대로 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다. 데이터는 시연용 목업입니다.
조작 방법
- 조회조건을 넣고 [조회]를 누르거나, 처리 단계 탭(임시·전표작성완료·결재상신완료 등)을 눌러 목록을 좁힙니다.
- 카드를 누르면 오른쪽에 상세가 열립니다. 사용내역·처리상태와 회계계정 품목을 확인합니다.
- 내용을 고치려면 [편집]에서 헤더와 품목을 수정하고 [저장]합니다. 품목은 [라인 추가]·[라인 삭제]로 조정합니다.
- 상세 하단의 [전표생성]으로 SAP 전표를 만들고, 잘못 만들었으면 [전표삭제]로 되돌립니다.
- 영수증 파일은 [증빙첨부]로 올리고, 새 증빙은 목록 하단 [영수증 추가]로 등록합니다.
- 목록에서 올릴 카드의 체크박스를 선택하고 [결재 상신]을 누릅니다.
- 대화상자에서 결재선을 고르고 메모를 적은 뒤 [결재상신]을 누릅니다.
- 결과 메시지를 닫으면 목록과 탭 건수가 새로 고쳐집니다.
저장·상신 검증 규칙
전표로 넘어가기 전에 화면에서 먼저 막아야 할 것들입니다.
① 금액 합계 헤더 금액(h_hwbas) = Σ 회계계정 품목 금액(hwbas)
불일치 → "금액 합계가 일치하지 않습니다." 헤더 금액 · 품목 합계 · 차이 표시
품목 표 머리글에 "합계: 품목합계 (차이)" 실시간 표시
② 필수값 회사코드 · 카드번호 · 가맹점명 · 금액 · 부가세 · 거래일 · 거래시간 · 거래번호 · 구매처
품목: 금액 · 통화 · 계정과목 · 코스트센터
③ 형식 거래일 YYYY-MM-DD · 거래시간 HH:MM · 금액은 숫자
④ 버튼 노출 전표번호 없음 → [전표생성]
전표번호 있음 → [전표삭제] · [결재상신]
⑤ 결재상신 선택 0건 → "선택한 라인이 없습니다."
요청값 I_IFKEY = 선택 전표 키를 쉼표로 연결, I_BUKRS · I_APPRCD(결재선) · I_MEMO
품목을 모두 불러온 뒤 합계를 비교하는 이유
품목 표를 10줄씩 끊어 읽으면 화면에 보이는 줄만 합산돼, 11번째 줄부터는 합계에서 빠지고 저장에서도 누락됩니다. 편집 화면은 품목 전체를 한 번에 불러와 검증과 저장이 모든 줄을 대상으로 하도록 했습니다.
| 증빙구분 | 카드번호 칸 | 가맹점명 칸 | 금액 칸 | 부가세 칸 |
|---|---|---|---|---|
| 법인카드(C) | 카드번호 | 가맹점명 | 총액 | 부가세 |
| 세금계산서(T) | 세금계산서승인번호 | 상호 | 공급가액 | 세액 |
| 기타증빙(O) | 카드번호 | 가맹점명 | 총액 | 부가세 |
| 예산신청(B) | 예산신청번호 | 예산신청명 | 예산금액 | 해당 없음 |
처리 단계
| 단계 | 처리 | 상태·결과 |
|---|---|---|
| ① 증빙 등록 | 영수증 추가 · 엑셀 업로드 · 첨부파일 등록 | 임시 |
| ② 계정 입력 | 편집에서 계정과목·코스트센터·금액 입력, 금액 합계 검증 후 저장 | 임시 |
| ③ 전표 생성 | 헤더(회사코드·증빙일·통화·공급가액·세액)와 품목(계정·코스트센터·금액)을 묶어 전표 생성 요청 | 전표작성완료 · 전표번호 채번 |
| ④ 결재상신 | 선택한 증빙을 결재선·메모와 함께 funcRequestList 로 상신 | 결재상신완료(P) |
| ⑤ 결재 | 부서장 → 최종 결재자 순으로 승인 또는 반려 | 부서장결재완료(A) · 결재완료(C) · 반려(R) |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 회사코드 | 선택 | 값도움으로 회사코드 지정 |
| 증빙구분 | 선택 | 전체 · 법인카드 · 세금계산서 · 기타증빙 · 예산신청 |
| 카드번호 | 선택 | 카드번호 또는 세금계산서 승인번호 |
| 결재문서번호 | 선택 | 상신 후 채번된 결재문서 |
| 전표번호 | 선택 | 생성된 SAP 전표번호 |
| 처리상태 | 선택 | 처리상태 목록에서 선택(기본 전체) |
| 처리 단계 탭 | — | 임시 · 전표작성완료 · 결재상신완료 · 부서장결재완료 · 결재완료 · 반려 (탭마다 건수 표시) |
화면 항목
증빙 카드 · 상세 사용내역
| 항목 | 필드 | 설명 |
|---|---|---|
| 처리상태 | status | 미처리 · 결재중(P) · 승인(A) · 완료(C) · 반려 |
| 증빙구분 | datagb | 법인카드(C) · 세금계산서(T) · 기타증빙(O) · 예산신청(B) |
| 카드번호 · 가맹점명 | cardno · mernm | 증빙구분에 따라 칸 이름이 바뀜 |
| 공급가액 · 부가세 | h_hwbas · h_hwste | 품목 합계와 비교되는 헤더 금액 |
| 거래일 · 거래시간 · 거래번호 | trxdt · trxtm · trxno | 승인 일시와 승인번호 |
| 전표번호 · 회계연도 · 결재문서번호 | belnr · gjahr · docno | 전표 생성·상신 결과 |
| 증빙파일1·2 | file1_name · file2_name | /odata/…/ZFILESet(전표키,번호)/$value 로 열기 |
회계계정 품목
| 항목 | 필드 | 설명 |
|---|---|---|
| 항목번호 | itmno | 품목 순번 |
| 금액 · 통화 | hwbas · waers | 품목 금액 |
| 계정과목 | saknr · saknr_tx | 계정명(코드) 형식 |
| 코스트센터 | kostl · kostl_tx | 부서명(코드) 형식 |
| 내부오더 · 적요 | aufnr · sgtxt | 원가 귀속과 설명 |
결재상신 대화상자
| 영역 | 내용 |
|---|---|
| 결재선 · 메모 | 결재선 코드(값도움)와 결재 요청 사유 |
| 증빙 | 선택한 증빙의 카드번호·거래일·가맹점·업종·공급가액·세액·첨부파일 |
| 결재선 목록 | 결재순번 · 결재자ID · 결재자명 |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
FB60 · FV60 | 매입 송장 입력 · 임시 저장 | 증빙 카드에서 바로 계정 입력 |
BAPI_ACC_DOCUMENT_POST | 전표 전기 | 헤더·품목을 묶어 전표 생성 요청 |
BKPF · BSEG | 전표 헤더 · 라인 | 전표번호 · 회계연도 결과 |
SKA1 · CSKS | 계정 · 코스트센터 마스터 | 계정명(코드) · 부서명(코드) 표시 |
| 결재선 · 상신 이력 | 표준 기능 없음 | 별도 엔티티(결재선·결재문서)로 관리 |
도입 시 확인이 필요한 부분
법인카드 승인 내역을 어디서 받아올지(카드사 연계·엑셀 업로드)와, 부가세 코드·사업장·거래처를 증빙구분별로 어떻게 정할지 먼저 합의해야 합니다. 결재선은 조직 개편 때마다 바뀌므로 결재선 코드를 부서 마스터와 분리해 관리하는 편이 안전합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCJOUENTRY'
@EndUserText.label: '증빙 전표 작성 목록 (Z)'
define view Z_C_JOURNAL_ENTRY
as select from zfit_evidence as Head -- 증빙 헤더(카드 승인·세금계산서)
left outer join bkpf as Doc on Doc.bukrs = Head.bukrs
and Doc.belnr = Head.belnr
and Doc.gjahr = Head.gjahr
association [0..*] to zfit_evidence_item as _Acct on _Acct.ifkey = Head.ifkey
association [0..1] to zfit_appr_doc as _Appr on _Appr.docno = Head.docno
{
key Head.ifkey,
Head.bukrs,
Head.datagb, -- C 법인카드 · T 세금계산서 · O 기타 · B 예산
Head.cardno,
Head.mernm,
@Semantics.amount.currencyCode: 'Waers'
Head.hwbas as SupplyAmount,
@Semantics.amount.currencyCode: 'Waers'
Head.hwste as TaxAmount,
Head.waers as Waers,
Head.trxdt,
Head.belnr,
Head.gjahr,
Head.docno,
Head.status, -- '' · P · A · C · R
_Acct, -- 회계계정 품목(to_acct)
_Appr
}
매핑 이해를 돕기 위한 참고용 설계입니다. 증빙·결재 테이블 이름은 예시이며, 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 · 구현 |
|---|---|
| 화면 골격 | sap.f.FlexibleColumnLayout — 목록과 상세를 한 화면에 나란히 |
| 조회·탭 | FilterBar · VariantManagement + sap.m.IconTabBar(처리 단계별 건수) |
| 증빙 목록 | sap.f.GridList 다중 선택 — 영수증 sap.m.Image + 데이터 필드 |
| 상세 · 편집 | sap.uxap.ObjectPageLayout + 어노테이션(FieldGroup · LineItem) XML 템플릿으로 필드·품목 자동 구성 |
| 회계계정 품목 | sap.m.Table — 편집 시 인라인 입력, 머리글에 합계·차이 표시 |
| 결재상신 | sap.m.Dialog — 결재선 값도움, 증빙·결재선 표, 상신 요청 |
| 라벨 | 어노테이션 라벨 + 증빙구분별 i18n 라벨(카드번호 ↔ 세금계산서승인번호 등) |
목록을 카드로 만든 이유
경비 전표를 검토할 때 가장 먼저 보는 것은 영수증 자체입니다. 표에서 파일명만 보면 한 건씩 열어 봐야 하지만, 카드에 영수증 이미지와 금액·가맹점을 함께 두면 목록을 훑는 것만으로 올릴 건을 고를 수 있습니다.
파일 구성
| 경로 | 역할 |
|---|---|
webapp/view/Main.view.js · _Main.view.xml | 조회조건 · 처리 단계 탭 · 증빙 카드 목록 |
webapp/view/fragments/mainPicGridList.fragment.xml | 영수증 이미지 카드 템플릿 |
webapp/view/Detail.view.js · _Detail.view.xml | 상세(사용내역 · 처리상태 · 회계계정) |
webapp/view/DetailEdit.view.js · _DetailEdit.view.xml | 편집(헤더 입력 · 품목 추가/삭제) |
webapp/view/ApprovalRequest.view.js · _ApprovalRequest.view.xml | 결재상신 대화상자 |
webapp/controller/Main · Detail · ApprovalRequest.controller.js | 조회 · 저장 검증 · 전표 생성 · 상신 |
webapp/view/fragments/FieldGroup · ItemTable (편집 포함) | 어노테이션 기반 필드·품목 템플릿 |
webapp/annotations/annotations.xml | 필드 그룹 · 품목 컬럼 · 한국어 라벨 |
webapp/localdata/*.json | 증빙 · 회계계정 · 결재선 목업 데이터 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| ① 목록 — 증빙 25건, 처리 단계 탭 건수, 카드 첫 화면 10건 표시 | 통과 |
| ② 선택 — 체크박스 2건 선택 시 선택 컨텍스트 2건 | 통과 |
| ③ 결재상신 — 대화상자에 선택 증빙 2건 전달 | 통과 |
| ③ 결재선 A100 지정 → 결재자 3명(순번 1~3) 표시 | 통과 |
| ④ 상신 요청 → 처리 완료 메시지, 목록 새로고침 | 통과 |
| 편집 저장 — 헤더 금액 = 품목 합계일 때 저장 (예: 327,000 = 196,000 + 131,000) | 통과 |
| 편집 저장 — 금액 불일치 시 헤더 금액·품목 합계·차이 표시 후 차단 | 통과 |
| 목업 헤더 25건 전체 — 헤더 금액과 품목 합계 일치 | 25/25 |
| 증빙파일 링크 — /odata/…/ZFILESet(전표키,번호)/$value | 통과 |
| 화면 라벨 한국어 표시 · 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
여러 영수증을 한 번에 상신할 수 있나요?
네. 목록 카드의 체크박스로 여러 건을 고른 뒤 [결재 상신]을 누르면, 선택한 증빙이 한 대화상자에 모이고 전표 키가 쉼표로 묶여 한 번의 상신 요청으로 전달됩니다.
결재선은 어떻게 지정하나요?
결재선 코드를 값도움으로 고르면 등록된 결재선 목록(결재순번·결재자)이 바로 아래 표에 채워집니다. 상신 전에 누가 어떤 순서로 결재하는지 확인할 수 있습니다.
편집 후 저장이 막히는 경우는요?
헤더 금액과 회계계정 품목 금액 합계가 다르면 저장되지 않습니다. 오류 메시지에 헤더 금액·품목 합계·차이가 함께 표시되고, 품목 표 머리글에도 합계와 차이가 실시간으로 보입니다.
증빙구분에 따라 입력 항목이 달라지나요?
네. 법인카드는 카드번호·가맹점명·거래번호, 세금계산서는 승인번호·상호·공급가액처럼 같은 칸이라도 증빙구분에 맞는 이름과 필수 여부로 바뀝니다.
SAP 표준 기능과 어떻게 이어지나요?
전표 생성은 표준 전표 전기(BAPI) 구조에 맞춰 헤더와 품목을 넘기고, 전표번호가 채번된 건만 결재상신 대상이 됩니다. 결재선과 상신 이력은 표준에 없는 부분이라 별도 엔티티로 관리합니다.