SAP 법인카드 처리현황 — 자동으로 들어온 건과 직접 넣는 건
카드사에서 수신한 사용내역과 직접 등록하는 내역을 한 목록에서 보되, 손대면 안 되는 건은 잠가 두는 화면입니다.
법인카드 사용내역은 두 경로로 들어옵니다. 카드사가 매일 밀어 넣는 건과 담당자가 직접 입력하는 건입니다.
연계되는 카드사는 보통 한 곳이고, 나머지 카드는 사용내역을 손으로 넣어야 합니다. 문제는 이 둘이 한 테이블에 섞이고, 여기에 이미 전표가 만들어진 건까지 더해진다는 점입니다. 카드사가 보낸 값을 고치면 다음 수신에 되돌아가고, 전표가 나간 건을 고치면 장부와 어긋납니다. 그래서 이 화면은 줄마다 왜 잠겼는지를 먼저 표시하고, 고칠 수 있는 건만 입력칸을 열어 둡니다.
SAP 표준 구조를 그대로 이어받은 부분
- 사용내역 —
ZTFIA0020(법인카드 사용내역) 구조 그대로 - 카드 목록 —
ZTFIA0010(카드 마스터)의 상태 '정상' 카드만 제공 - 권한 —
ZTFIA0100(재무팀) 등록 여부로 전체/본인 카드 조회 분기 - 잠금 기준 —
BANK_CODE'012' IF 건,BELNR가 채워진 건
| 항목 | 내용 |
|---|---|
| 업무 영역 | 재무회계(FI) · 법인카드 사용내역 |
| Namespace | zui5.cardproc |
| 셸 구조 | 조회조건 영역(우측 조회) + 편집 가능한 사용내역 목록 |
| 화면 수 | 조회·편집 화면 1개 |
| 데이터 | 사용내역 32건 (IF 16 · 수기 16) · 카드 9매 |
| 성격 | 조회·등록형(CRUD) — IF 건과 전표 생성 건은 잠금 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 9종 둘러보기
조회하면 줄마다 잠금 사유가 보입니다 → 고칠 수 있는 건만 수정·등록하고 → 자릿수 점검을 거쳐 저장합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 승인/매입일자를 확인합니다. 기본값은 최근 한 달입니다.
- 카드구분과 회계처리 라디오로 연계 건과 수기 건, 처리 여부를 갈라 봅니다.
- 목록에서 잠금 칸을 먼저 봅니다. IF 잠금과 전표 잠금은 대응 방법이 다릅니다.
- 등록으로 연계 대상이 아닌 카드의 사용내역을 추가합니다.
- 해외사용을 바꾸면 국가·통화·거래구분·과세구분이 자동으로 맞춰집니다.
- 저장 시 승인번호 자릿수와 필수값을 점검합니다. 국내는 8 또는 10자리입니다.
잠금·기본값·자릿수 규칙
잠금 판정과 국내·해외 기본값, 승인번호 자릿수가 이 화면의 뼈대입니다.
수정 가능 여부 (사양서)
BANK_CODE = '012' (연계 카드사 IF 수신 건)
→ 체크박스 및 모든 조회 필드 수정 불가
BANK_CODE ≠ '012'
BELNR 공란 → 체크박스 및 모든 필드 수정 가능
BELNR 존재 → 체크박스 및 모든 필드 수정 불가
해외사용 여부에 따른 기본값
FORE_USE = '1' 국내
국가코드 KR · 통화 KRW · 거래구분 '01' 승인
AQUI_WON = ACKAMOUNT
가맹점 사업자번호·상호·주소·업종 입력 (과세구분 01)
FORE_USE = '2' 해외
거래구분 '03' 매입 · 과세구분 '99'
가맹점 사업자번호 · 상호 · 주소 · 업종명 비활성
원화환산 = 현지 액면금액 × 적용환율
승인/매입번호 자릿수
국내 : 8 또는 10자리
11자리 이상이면 저장 불가
"승인번호 8 or 10자리를 수정하시거나 해외사용여부를 수정하세요."
해외 : 22~23자리| 항목 | 산식 · 규칙 |
|---|---|
| 잠금 판정 | 연계 카드사 IF 건이거나 전표가 생성된 건 |
| 조회 권한 | 재무팀 등록 사용자는 전체, 그 외는 본인이 사용자·처리자인 카드만 |
| 국내 기본값 | 국가 KR · 통화 KRW · 거래구분 01 · 원화환산 = 승인금액 |
| 해외 기본값 | 거래구분 03 · 과세구분 99 · 가맹점 정보 비활성 |
| 승인번호 자릿수 | 국내 8·10자리 / 해외 22~23자리 |
| 환가료·봉사료·할인 | 연계 카드사 IF 건에만 존재하는 항목 |
| 원천 구분 | IF 수신 / 수기 등록 |
잠금 사유를 나눠서 보여 주는 이유
둘 다 '못 고침'이지만 대응이 다릅니다. IF 건은 카드사에 요청해야 하고, 전표 생성 건은 역분개부터 해야 합니다. 그냥 잠김이라고만 하면 담당자가 어디로 가야 할지 모릅니다. 삭제를 막을 때도 몇 건이 어느 사유인지 나눠서 알려 줍니다.
건별 상태 3종
같은 목록이지만 줄마다 할 수 있는 일이 다릅니다.
| 상태 | 들어온 경로 | 입력칸 | 할 수 있는 일 |
|---|---|---|---|
| IF 수신 | 연계 카드사 | 항상 잠금 | 값 확인만 가능, 수정·삭제 불가 |
| 수기 · 미처리 | 담당자 직접 등록 | 열림 | 등록·수정·삭제 모두 가능 |
| 수기 · 전표생성 | 담당자 등록 후 회계처리 | 잠금 | 전표와 어긋나지 않도록 고정 |
세 상태가 목록에서 바로 갈리므로 고칠 수 있는 줄만 골라 작업하면 됩니다.
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| Company code | 필수 | 변경 못함. 로그인 사용자 → 사번 → 사원 Vendor 순으로 기본값 결정 |
| 승인/매입(취소)일자 | 필수 | 기본값 현재일자 −1개월 ~ 현재일자 |
| 카드번호 · 승인번호 | 선택 | 카드 마스터 목록에서 선택 |
| Fiscal Year · Document Number | 선택 | 회계처리된 건을 전표로 추적 |
| 해외사용 여부 | 필수 | 전체 / 국내 / 해외 |
| 카드구분 · 회계처리 | 선택 | 연계/수기, 처리완료/미처리 |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
| 변경 · 잠금 · 원천 | 신규/수정 표시, 잠금 사유, IF/수기 구분 |
| 카드번호 · 카드사 | 카드 마스터에서 선택 |
| 해외사용 · 거래구분 | 국내/해외와 승인/매입 구분 |
| 승인/매입번호 · 승인번호 · 승인시간 | 카드사 승인 정보 |
| 승인금액 · 통화 · 적용환율 | 현지 금액과 환산 기준 |
| 공급가액 · 부가세 · 원화환산 | 국내는 세액 분리, 해외는 환산액 |
| 환가료 | 연계 카드사 IF 건에만 값 존재 |
| 가맹점 사업자번호·상호·주소·업종·과세구분 | 매입공제 판단 근거 |
| 회계처리 · 전표번호 | 전표 생성 여부와 전표 키 |
보조 기능
| 컬럼 | 의미 · 표시 |
|---|---|
| 등록 | 연계 대상이 아닌 카드로 신규 라인 추가 |
| 삭제 | 잠긴 건이 섞이면 사유를 나눠 알리고 차단 |
| 저장 | 필수값과 승인번호 자릿수를 점검한 뒤 반영 |
SAP 표준 기능 매핑
카드사 수신은 인터페이스가, 전표 생성은 표준이 담당합니다. 이 화면은 그 사이를 맡습니다.
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
| 카드사 인터페이스 | 사용내역 자동 수신 | IF 건을 화면에서 잠가 덮어쓰기 충돌을 막음 |
FB60 관점 | 카드 비용 전표 | 전표 생성 후에는 이 화면에서 잠김 |
USR21 · ADCP · LFB1 | 사용자·사번·사원 Vendor | 회사코드 기본값 결정 |
운영 데이터 소스 매핑
| 항목 | SAP 원천 | 비고 |
|---|---|---|
| 사용내역 | ZTFIA0020 | CRUD 대상 테이블 |
| 카드 마스터 | ZTFIA0010 | 상태 '정상' 카드만 Search help 제공 |
| 재무팀 | ZTFIA0100 | 전체 조회 권한 판정 |
| 사업장 | J_1BBRANCH | 사업장 정보 |
| 첨부 | SRGBTBREL | GOS 첨부 관계 |
도입 시 확인이 필요한 부분
연계 카드사 코드가 회사마다 다르고 여러 곳일 수도 있습니다. 잠금 대상 카드사를 설정 테이블로 빼면 계약이 바뀌어도 프로그램을 고치지 않아도 됩니다. 재무팀 사용자 등록(ZTFIA0100)도 유지보수 뷰로 관리해야 인사이동 때 권한이 따라갑니다.
참고 CDS 뷰
사용내역을 조회할 때는 카드 마스터를 붙이고 잠금 사유를 계산한 뷰가 편합니다.
@AbapCatalog.sqlViewName: 'ZCCARDPROC'
@EndUserText.label: '법인카드 사용내역 (Z)'
define view Z_C_CARD_TRANSACTION
as select from ztfia0020 as Usage
left outer join ztfia0010 as Card on Usage.bukrs = Card.bukrs
and Usage.card_num = Card.zcardno
left outer join lfa1 as CardUser on Card.user = CardUser.lifnr
{
key Usage.bukrs as Bukrs,
key Usage.card_num as CardNo,
key Usage.aqui_coll as AcquireNo,
Usage.ackdate as ApprovalDate,
Usage.ackno as ApprovalNo,
Usage.fore_use as ForeignUse,
Usage.purchaseflag as TransactionType,
Usage.ackamount as ApprovalAmount,
Usage.valueofsupply as SupplyValue,
Usage.vat as VatAmount,
Usage.aqui_won as AmountKrw,
Usage.aqui_rate as ExchangeRate,
Usage.exch_comm as ExchangeFee,
Usage.merc_socno as MerchantTaxNo,
Usage.merc_name as MerchantName,
Usage.mccname as MerchantCategory,
Usage.bank_code as CardCompany,
Usage.origin as DataOrigin,
Usage.belnr as AccountingDoc,
CardUser.name1 as CardUserName,
// 수정 가능 여부 — IF 건이거나 전표가 있으면 잠금
case when Usage.bank_code = '012' then 'IF'
when Usage.belnr <> '' then 'DOC'
else '' end as LockReason
}사용내역을 조회하거나 전표와 대조할 때 쓰는 참고용 설계입니다. 잠금 사유를 뷰에서 계산해 두면 화면과 보고서가 같은 기준을 씁니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · 편집 가능한 사용내역 목록 |
| 조회조건 | sap.m.Input · DatePicker · RadioButtonGroup 3종 |
| 편집 목록 | sap.ui.table.Table — 변경·잠금·원천·카드번호 4컬럼 고정 |
| 조건부 잠금 | editable 을 카드사·전표번호에 바인딩 |
| 기본값 세팅 | 해외사용 전환 시 국가·통화·거래구분·과세구분 자동 반영 |
| 자릿수 점검 | 입력 즉시 안내 + 저장 시 차단 |
| CSV | Blob + UTF-8 BOM — 28개 항목 |
잠금 컬럼을 앞쪽에 고정한 이유
이 화면에서 가장 먼저 알아야 할 것은 '이 줄을 내가 고칠 수 있는가'입니다. 금액이나 가맹점을 확인한 뒤에야 잠긴 것을 알면 이미 시간을 쓴 뒤입니다. 변경·잠금·원천을 카드번호 앞에 고정해 두면 목록을 훑는 순간 갈립니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.cardproc) · ko 로케일 · sap_horizon |
Component.js | 조회조건 모델 · 결과 모델 초기화 |
view/Main.view.xml | 조회화면 + 편집 가능한 사용내역 목록 |
controller/Main.controller.js | 조회 · 필터 3종 · 편집 · 등록/삭제 · 저장 · CSV |
model/ModelMock.js | 권한 분기 · 잠금 판정 · 기본값 세팅 · 자릿수 점검 · 저장 |
model/formatter.js | 원천 · 잠금 · 금액 · 환율 · 회계처리 포맷터 |
i18n/i18n_ko.properties | ko 로케일 리소스 — 사양서 메시지 원문 포함 |
localdata/cardproc.json | 사용내역 시뮬레이션 데이터 |
검증 결과
화면 구성에 쓴 데이터는 IF 수신분과 수기 등록분이 섞인 사용내역입니다.
| 데이터 | 규모 | 구성 |
|---|---|---|
| 사용내역 | 32건 | IF 16 · 수기 16 · 해외 13 |
| 잠금 상태 | IF 16 · 전표 3 | 수정 가능 13건 |
| 카드 · 카드사 | 9매 · 4곳 | 원화환산 44,870,465원 |
| 검증 항목 | 결과 |
|---|---|
| 카드번호가 카드 마스터에 존재 · 카드사 일치 | 통과 |
| 연계 카드사는 원천 IF, 그 외는 수기(MU) | 통과 |
| 국내는 거래구분 01, 해외는 03 | 통과 |
| 국내 승인번호 8·10자리 · 해외 매입번호 22~23자리 | 통과 |
| 국내는 국가 KR · 통화 KRW · 원화환산 = 승인금액 | 통과 |
| 국내는 승인금액 = 공급가액 + 부가세 · 가맹점 정보 보유 | 통과 |
| 해외는 가맹점 사업자번호 없음 · 과세구분 99 · 부가세 0 | 통과 |
| 해외는 원화환산 = 현지금액 × 환율 · 달러환산 보유 | 통과 |
| 환가료·봉사료·할인은 IF 건에만 존재 | 통과 |
| 화면 렌더링 — 목록 → IF 잠금 → 등록 → 해외 전환 → 검증 | 9/9 |
카드번호·가맹점·금액은 모두 검증용 데이터입니다.
자주 묻는 질문
연계 카드사 건은 왜 아예 못 고치나요?
카드사가 매일 다시 밀어 넣기 때문입니다. 화면에서 고쳐도 다음 수신에 되돌아가는데 담당자는 고쳤다고 믿게 됩니다. 값이 틀렸다면 카드사에 정정을 요청하거나, 회계 처리 단계에서 조정해야 합니다.
전표가 생긴 뒤에는 왜 잠기나요?
사용내역이 전표의 근거이기 때문입니다. 금액이나 가맹점을 뒤에 바꾸면 전표와 근거가 달라져 부가세 신고나 감사에서 설명할 수 없게 됩니다. 고쳐야 한다면 전표를 역분개한 뒤 다시 처리하는 순서가 맞습니다.
해외 건은 왜 가맹점 정보를 안 넣나요?
해외 가맹점은 국내 사업자번호가 없고 매입세액공제 대상도 아닙니다. 입력해도 쓰이지 않는 값이라 사양서에서 비활성으로 지정했습니다. 대신 과세구분을 99로 넣어 국내 건과 구분합니다.
승인번호 자릿수를 왜 따지나요?
국내 승인번호는 8 또는 10자리, 해외 매입번호는 22~23자리로 체계가 다릅니다. 자릿수가 어긋났다는 건 해외 건을 국내로 넣었거나 번호를 잘못 옮겨 적었다는 뜻입니다. 저장 전에 걸러 두면 나중에 카드사 원본과 대조할 때 헤매지 않습니다.
SAP 표준 기능과 어떻게 이어지나요?
사용내역은 커스텀 테이블이고 카드 목록은 카드 마스터에서 가져옵니다. 여기서 정리한 내역이 비용 전표의 근거가 되고, 전표가 생기면 이 화면은 읽기 전용으로 바뀝니다. 같은 카드의 청구내역은 청구현황 화면에서 이어 봅니다.