튜토리얼
PowerBuilder 개발환경에서 팝빌 SDK를 추가하여 전자명세서 즉시 발행 (RegistIssue) 함수를 구현하는 예시입니다.
1. POPBiLL SDK 추가
① 팝빌 연동자료실에서 PowerBuilder SDK 예제코드 다운로드 후 압축을 해제합니다.
② 압축해제한 SDK 예제코드에서 linkhub.pbl, popbill.pbl 파일을 기존 프로젝트 폴더로 복사하고 Library List에 추가합니다.

2. POPBiLL SDK 설정
Window 폼의 Declare Instance Variables 탭에 인증정보와 클래스를 선언하고 open() 함수에 클래스 초기화 코드를 추가합니다.
Declare Instance Variables 탭
// 링크아이디, 연동신청시 발급받은 값으로 변경
string in_linkid = "TESTER"
// 비밀키, 연동신청시 발급받은 값으로 변경
string in_secretkey = "SwWxqU+0TErBXy/9TVjIPEnI0VTUMMSQZtJf3Ed8q3I="
statementservice in_statementservice
Window Form Open() 함수
in_statementservice = create statementservice
// 링크아이디
in_statementservice.linkid = in_linkid
// 비밀키
in_statementservice.secretkey = in_secretkey
// 연동환경 설정값, true-개발용, false-상업용
in_statementservice.setIstest(true)
// 인증토큰 IP제한기능 사용여부, true-사용, false-미사용, 기본값(true)
in_statementservice.setIPRestrictOnOff(true)
// 로컬시스템 시간 사용여부 true-사용, false-미사용, 기본값(false)
in_statementservice.setUseLocalTimeYN(false)
3. RegistIssue 기능 구현
Form에 버튼을 생성하고 버튼의 Click Event 코드에 전자명세서 즉시 발행 (RegistIssue) 기능을 추가합니다.
statement l_statement
response l_response
integer result, itemcode
string memo, mgtKey, corpNum
// 팝빌회원 사업자번호
corpNum = "1234567890"
// [필수] 문서번호, 발행자별 고유번호 할당 1~24자리 영문, 숫자조합으로 중복없이 구성
mgtKey = "20220101-021"
// [필수] 명세서 종류코드
l_statement.itemCode = 121
// [필수] 문서번호
l_statement.mgtkey = mgtKey
// [필수] 작성일자, 날짜형식(yyyyMMdd)
l_statement.writeDate = "20220101"
// [필수] {영수, 청구, 없음} 중 기재
l_statement.purposeType = "영수"
// [필수] 세금형태, {과세, 영세, 면세} 중 기재
l_statement.taxType = "과세"
// 맞춤양식코드, 미기재시 기본양식으로 처리
l_statement.formCode = ""
/********************************************************
* 발신자 정보
********************************************************/
// [필수] 발신자 사업자번호, '-' 제외 10자리
l_statement.senderCorpNum = corpnum
// 종사업장번호, 4자리숫자 필요시 기재
l_statement.senderTaxRegID = ""
// 발신자 상호
l_statement.senderCorpName = "공급자 상호"
// 발신자 대표자 성명
l_statement.senderCEOName = "공급자 대표자 성명"
// 발신자 주소
l_statement.senderAddr = "공급자 주소"
// 발신자 종목
l_statement.senderBizClass = "공급자 업종"
// 발신자 업태
l_statement.senderBizType = "공급자 업태"
// 발신자 담당자 성명
l_statement.senderContactName = "공급자 담당자명"
// 발신자 담당자 메일
l_statement.senderEmail = "test@test.com"
// 발신자 연락처
l_statement.senderTEL = "070-111-222"
// 발신자 휴대폰번호
l_statement.senderHP = "010-111-222"
/********************************************************
* 수신자 정보
********************************************************/
// 수신자 사업자번호
l_statement.receiverCorpNum = "8888888888"
// [필수] 수신자 상호
l_statement.receiverCorpName = "공급받는자 상호"
// 수신자 대표자 성명
l_statement.receiverCEOName = "공급받는자 대표자 성명"
// 수신자 담당자 성명
l_statement.receiverContactName = "공급받는자 담당자명"
// 수신자 주소
l_statement.receiverAddr = "공급받는자 주소"
// 수신자 종목
l_statement.receiverBizClass = "공급받는자 업종"
// 수신자 업태
l_statement.receiverBizType = "공급받는자 업태"
// 수신자 메일주소
// 팝빌 개발환경에서 테스트하는 경우에도 안내 메일이 전송되므로,
// 실제 거래처의 메일주소가 기재되지 않도록 주의
l_statement.receiverEmail = "test@receiver.com"
/********************************************************
* 전자명세서 정보
********************************************************/
// [필수] 공급가액 합계
l_statement.supplyCostTotal = "20000"
// [필수] 세액 합계
l_statement.taxTotal = "2000"
// 합계금액, (공급가액 합계 + 세액 합계)
l_statement.totalAmount = "22000"
// 기재 상 "일련번호" 항목
l_statement.serialNum = "123"
// 기재 상 "비고" 항목
l_statement.remark1 = "비고1"
l_statement.remark2 = "비고2"
l_statement.remark3 = "비고3"
// 사업자등록증 이미지 첨부 여부
l_statement.businessLicenseYN = False
// 통장사본 이미지 첨부 여부
l_statement.bankBookYN = False
/********************************************************
* 전자명세서 상세품목 정보
********************************************************/
l_statement.detailList[1].serialNum = 1 // 일련번호 1부터 순차 기재
l_statement.detailList[1].purchaseDT = "20220101" // 거래일자 yyyyMMdd
l_statement.detailList[1].itemName = "품명" // 품목명
l_statement.detailList[1].spec = "규격" // 규격
l_statement.detailList[1].qty = "1" // 수량
l_statement.detailList[1].unitCost = "10000" // 단가
l_statement.detailList[1].supplyCost = "10000" // 공급가액
l_statement.detailList[1].tax = "1000" // 세액
l_statement.detailList[1].remark = "비고" // 비고
l_statement.detailList[1].spare1 = "spare1" // 여분1
l_statement.detailList[1].spare2 = "spare2" // 여분2
l_statement.detailList[1].spare3 = "spare3" // 여분3
l_statement.detailList[1].spare4 = "spare4" // 여분4
l_statement.detailList[1].spare5 = "spare5" // 여분5
l_statement.detailList[2].serialNum = 2 // 일련번호 1부터 순차 기재
l_statement.detailList[2].purchaseDT = "20220101" // 거래일자 yyyyMMdd
l_statement.detailList[2].itemName = "품명" // 품목명
l_statement.detailList[2].spec = "규격" // 규격
l_statement.detailList[2].qty = "1" // 수량
l_statement.detailList[2].unitCost = "10000" // 단가
l_statement.detailList[2].supplyCost = "10000" // 공급가액
l_statement.detailList[2].tax = "1000" // 세액
l_statement.detailList[2].remark = "비고" // 비고
l_statement.detailList[2].spare1 = "spare1" // 여분1
l_statement.detailList[2].spare2 = "spare2" // 여분2
l_statement.detailList[2].spare3 = "spare3" // 여분3
l_statement.detailList[2].spare4 = "spare4" // 여분4
l_statement.detailList[2].spare5 = "spare5" // 여분5
// 추가속성 항목
l_statement.propertyBag[1].key = "Balance" //전잔액
l_statement.propertyBag[1].value = "3500"
l_statement.propertyBag[2].key = "CBalance" //입금액
l_statement.propertyBag[2].value = "5500"
l_statement.propertyBag[3].key = "Deposit" //현잔액
l_statement.propertyBag[3].value = "2000"
// 메모
memo = "즉시 발행 메모"
try
l_response = in_statementservice.registIssue(corpNum, l_statement, memo)
messagebox("전자명세서 즉시 발행", "응답코드 : " + String(l_response.code) + "~n응답메시지 : " + l_response.message + "~n팝빌 승인번호 : " + l_response.invoicenum)
catch(popbillexception pe)
messagebox("전자명세서 즉시 발행", "응답코드 : " + String(pe.getcode()) + "~n응답메시지 : " + pe.getmessage())
end try
4. 결과 확인
함수 호출이 정상적으로 처리된 경우 Response가 "성공"으로 반환되며, 실패일 경우 PopbillException으로 오류코드("-"로 시작하는 8자리 숫자값)와 오류메시지가 반환됩니다. [오류코드] 바로가기