sendbill-mcp/src/error-codes.ts
thug0bin 65c69f5666 🤖 센드빌(Sendbill) MCP 서버 초기 구현
- 전자세금계산서 API 전체 커버 (29개 툴)
- 인증서 관리, 계산서 발행(단건/묶음/대량), 상태조회, 회원관리
- 홈택스 연동 (세금계산서/현금영수증 일별/월별 매출/매입)
- 휴폐업 조회, 추가메일 전송
- 에러코드표 내장 (Excel 기반)
- 코드표 참조 툴 (billtype, taxrate, billstat 등)
- 인증: SENDBILL_SBKEY 환경변수

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-02 01:51:24 +09:00

149 lines
5.9 KiB
TypeScript

// 센드빌 API 에러코드 참조표
// 출처: https://www.sendbill.co.kr/SendbillAPI_Error_Code.xls
export const ERROR_CODES: Record<string, string> = {
// SBKEY 관련
"-10001": "SBKEY Header 데이터가 없습니다.",
"-10002": "SBKEY의 데이터가 옳바르지 않습니다.",
"-10003": "폐기 처리된 SBKEY 입니다.",
"-10004": "SBKEY의 사용 기간이 만료되었습니다.",
// 인증서 관련
"-11001": "실패",
"-11002": "등록된 인증서가 없습니다.",
"-11003": "기타오류, 고객센터로 문의 바랍니다.",
"-11004": "파일 업로드 중 오류가 발생하였습니다.",
"-11101": "올바른 파일을 선택해 주세요.",
"-11102": "[venderno] 필수 항목입니다.",
"-11103": "[venderno] 최대 길이는 10 bytes 입니다.",
"-11104": "[venderno] 숫자만 입력 가능합니다.",
"-11105": "[venderno] 올바른 형태의 사업자번호가 아닙니다.",
"-11106": "[password] 필수 항목입니다.",
"-11107": "[certderfile] 필수 항목입니다.",
"-11108": "[certkeyfile] 필수 항목입니다.",
"-11401": "등록된 인증서의 발급 정보와 사업자 번호가 일치하지 않습니다.",
"-11402": "인증서의 발급 정보와 인증서 비밀번호가 일치하지 않습니다.",
"-11403": "인증서의 사용기간이 만료되었습니다.",
"-11509": "등록된 인증서의 데이터가 옳바르지 않습니다. 인증서 신규 등록 후 다시 시도해주세요.",
"-11701": "URL 유효 시간이 만료되었습니다.",
"-11702": "token 오류, token 재발행 후 재시도해주세요.",
"-11703": "올바르지 않은 토큰입니다.",
// 계산서 발행 관련
"-12001": "실패",
"-12002": "조회된 데이터가 없습니다.",
"-12003": "기타오류, 고객센터로 문의 바랍니다.",
"-66666": "/api/agent/document/registDirect 긴급점검중 입니다.",
"-12501": "충전된 요금이 부족합니다.",
"-12502": "우대권 잔여 건 수 및 충전된 요금이 부족합니다.",
"-12503": "[대납] 충전된 요금이 부족합니다.",
"-12504": "[대납] 우대권 잔여 건 수 및 충전된 요금이 부족합니다.",
"-12631": "[A] 공급자 사업자번호에 해당하는 회원 ID가 없습니다.",
"-12633": "[A] 공급받는자 사업자번호에 해당하는 회원 ID가 없습니다.",
"-12641": "[A] 관리자가 마감하여 전송할 수 없습니다.",
"-12651": "[A] 품목의 합계 금액이 총 금액과 맞지 않습니다.",
"-12654": "[A] 과세기간(반기)이 지난 세금계산서는 발행이 불가능 합니다.",
"-12701": "발행자의 인증서가 등록되어 있지 않습니다.",
"-12703": "발행자의 등록된 인증서 사용기간이 만료되었습니다.",
"-12101": "[Billseq] 데이터가 중복되었습니다.",
"-12102": "[Item(Array)] 필수 항목입니다.",
// 회원 등록 관련
"-13001": "실패",
"-13002": "조회된 데이터가 없습니다.",
"-13003": "기타오류, 고객센터로 문의 바랍니다.",
"-13101": "이미 등록된 아이디 입니다.",
// 계산서 관리 관련
"-14001": "실패",
"-14002": "조회된 데이터가 없습니다.",
"-14003": "기타오류, 고객센터로 문의 바랍니다.",
"-14101": "[Orderseq] 데이터 중복 입니다.",
"-14102": "[Billseq] 필수 항목 입니다.",
"-14104": "[cmd_div] 필수 항목 입니다.",
"-14110": "[cmd_div] 올바른 코드 값을 입력 해주세요. [ 6, E ]",
// 계산서 상태조회 관련
"-15001": "실패",
"-15002": "조회된 데이터가 없습니다.",
"-15101": "[Billseq] 필수 항목 입니다.",
// 홈택스 연동 관련
"-18001": "실패",
"-18002": "조회된 데이터가 없습니다.",
"-18004": "홈택스에서 조회된 데이터가 없습니다.",
"-18101": "요청 사업자번호의 인증서가 등록되어 있지 않습니다.",
"-18403": "센드빌에 등록된 홈택스 계정 또는 인증서 정보가 없습니다.",
"-18401": "홈택스연동 사용 사업자가 아닙니다. 고객센터에 문의 바랍니다.",
};
export function getErrorMessage(code: number | string): string {
const key = String(Math.round(Number(code)));
return ERROR_CODES[key] ?? `알 수 없는 오류 코드: ${code}`;
}
// 코드표
export const CODE_TABLES = {
billtype: {
"10": "세금계산서",
"11": "비회원 세금계산서",
"20": "(면세)계산서",
"21": "비회원(면세)계산서",
"30": "거래명세서",
"31": "비회원 거래명세서",
"40": "위수탁 세금계산서",
"41": "비회원 위수탁 세금계산서",
"50": "위수탁 (면세)계산서",
"51": "비회원 위수탁 (면세)계산서",
"61": "개인 매출 세금계산서",
"62": "개인 매출 계산서",
"Y1": "외부 매출 세금계산서",
"Z1": "외부 매입 세금계산서",
},
cmd_div: {
"6": "삭제요청",
"E": "EMAIL 전송",
},
taxrate: {
"0": "과세율",
"1": "영세율",
"2": "면세율",
"3": "매입세액불공제",
"4": "의제매입",
},
report_stat: {
"N": "미신고",
"A": "접수대기",
"B": "접수완료",
"R": "신고상태",
"F": "신고실패",
},
report_amend_cd: {
"1": "기재사항 착오/정정",
"2": "공급가액 변동",
"3": "환입",
"4": "계약의 해제",
"5": "내국신용장 사후 개설",
"6": "착오에 의한 이중발행",
},
billstat: {
"5": "미전송",
"0": "미개봉",
"3": "개봉",
"1": "승인",
"2": "반려",
"4": "승인취소",
"9": "종이문서저장",
"6": "삭제",
},
gubun: {
"1": "영수",
"2": "청구",
},
etc01: {
"S": "SENDID: 센드빌 ID / RECVID: 센드빌 ID",
"I": "SENDID: 센드빌 ID / RECVID: 거래처 ID",
"X": "SENDID: 거래처 ID / RECVID: 거래처 ID",
},
};