튜토리얼
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="
taxinvoiceservice in_taxinvoiceservice
Window Form Open() 함수
in_taxinvoiceservice = create taxinvoiceservice
// 링크아이디
in_taxinvoiceservice.linkid = in_linkid
// 비밀키
in_taxinvoiceservice.secretkey = in_secretkey
// 연동환경 설정값, true-개발용, false-상업용
in_taxinvoiceservice.setIstest(true)
// 인증토큰 IP제한기능 사용여부, true-사용, false-미사용, 기본값(true)
in_taxinvoiceservice.setIPRestrictOnOff(true)
// 로컬시스템 시간 사용여부 true-사용, false-미사용, 기본값(false)
in_taxinvoiceservice.setUseLocalTimeYN(false)
3. RegistIssue 기능 구현
Form에 버튼을 생성하고 버튼의 Click Event 코드에 전자세금계산서 즉시 발행 (RegistIssue) 기능을 추가합니다.
taxinvoice l_taxinvoice
response l_response
string memo, dealinvoicemgtkey, emailsubject, corpNum, mgtKey
boolean forceissue, writespecification
// 팝빌회원 사업자번호
corpNum = "1234567890"
// 전자세금계산서 문서번호
mgtKey = "20220101-021"
// [필수] 작성일자, 날짜형식(yyyyMMdd)
l_taxinvoice.writeDate = "20220101"
// [필수] 발행형태, {정발행, 역발행, 위수탁} 중 기재
l_taxinvoice.issueType = "정발행"
// [필수] {영수, 청구, 없음} 중 기재
l_taxinvoice.purposeType = "영수"
// [필수] 과세형태, {과세, 영세, 면세} 중 기재
l_taxinvoice.taxType = "과세"
// [필수] 과금방향 {정과금, 역과금} 중 기재
// - 정과금(공급자 과금), 역과금(공급받는자 과금)
// - 역과금은 역발행 세금계산서 발행하는 경우만 이용가능.
l_taxinvoice.chargeDirection = "정과금"
/********************************************************
* 공급자 정보
********************************************************/
// [필수] 공급자 사업자번호, '-' 제외 10자리
l_taxinvoice.invoicerCorpNum = corpNum
// 종사업장 식별번호. 필요시 기재. 형식은 숫자 4자리.
l_taxinvoice.invoicerTaxRegID = ""
// [필수] 공급자 상호
l_taxinvoice.invoicerCorpName = "공급자 상호"
// [필수] 공급자 문서번호, 1~24자리 숫자, 영문, '-', '_' 조합으로
// 사업자별로 중복되지 않도록 구성하여 할당
l_taxinvoice.invoicerMgtKey = mgtKey
// [필수] 공급자 대표자 성명
l_taxinvoice.invoicerCEOName = "공급자 대표자 성명"
// 공급자 주소
l_taxinvoice.invoicerAddr = "공급자 주소"
// 공급자 종목
l_taxinvoice.invoicerBizClass = "공급자 업종"
// 공급자 업태
l_taxinvoice.invoicerBizType = "공급자 업태,업태2"
// 공급자 담당자 성명
l_taxinvoice.invoicerContactName = "공급자 담당자명"
// 공급자 담당자 메일주소
l_taxinvoice.invoicerEmail = "test@test.com"
// 공급자 담당자 연락처
l_taxinvoice.invoicerTEL = "070-7070-0707"
// 공급자 담당자 휴대폰 번호
l_taxinvoice.invoicerHP = "010-000-2222"
// 발행시 알림문자 전송여부 (정발행에서만 사용가능)
// - 공급받는자 주)담당자 휴대폰번호(invoiceeHP1)로 전송
// - 전송시 포인트가 차감되며 전송실패하는 경우 포인트 환불처리
l_taxinvoice.invoicerSMSSendYN = False
/********************************************************
* 공급받는자 정보
********************************************************/
// [필수] 공급받는자 구분, {사업자, 개인, 외국인} 중 기재
l_taxinvoice.invoiceeType = "사업자"
// [필수] 공급받는자 사업자번호, '-' 제외 10자리
l_taxinvoice.invoiceeCorpNum = "8888888888"
// 종사업장 식별번호. 필요시 기재. 형식은 숫자 4자리.
l_taxinvoice.invoiceeTaxRegID = ""
// [필수] 공급받는자 상호
l_taxinvoice.invoiceeCorpName = "공급받는자 상호"
// [필수] 공급받는자 대표자 성명
l_taxinvoice.invoiceeCEOName = "공급받는자 대표자 성명"
// 역발행시 필수, 공급받는자 문서번호
l_taxinvoice.invoiceeMgtKey = ""
// 공급받는자 주소
l_taxinvoice.invoiceeAddr = "공급받는자 주소"
// 공급받는자 종목
l_taxinvoice.invoiceeBizClass = "공급받는자 업종"
// 공급받는자 업태
l_taxinvoice.invoiceeBizType = "공급받는자 업태"
// 공급받는자 담당자 성명
l_taxinvoice.invoiceeContactName1 = "공급받는자 담당자명"
// 공급받는자 담당자 메일주소
// 팝빌 개발환경에서 테스트하는 경우에도 안내 메일이 전송되므로,
// 실제 거래처의 메일주소가 기재되지 않도록 주의
l_taxinvoice.invoiceeEmail1 = "test@test.com"
/********************************************************
* 세금계산서 정보
********************************************************/
// [필수] 공급가액 합계
l_taxinvoice.supplyCostTotal = "100000"
// [필수] 세액 합계
l_taxinvoice.taxTotal = "10000"
// [필수] 합계금액. 공급가액 + 세액
l_taxinvoice.totalAmount = "110000"
l_taxinvoice.serialNum = "123" // 기재 상 일련번호 항목
l_taxinvoice.cash = "" // 기재 상 현금 항목
l_taxinvoice.chkBill = "" // 기재 상 수표 항목
l_taxinvoice.note = "" // 기재 상 어음 항목
l_taxinvoice.credit = "" // 기재 상 외상미수금 항목
l_taxinvoice.remark1 = "비고1" // 비고1
l_taxinvoice.remark2 = "비고2" // 비고2
l_taxinvoice.remark3 = "비고3" // 비고3
// 권, 숫자만 기재. 최대 32767
// 미기재시 l_taxinvoice.kwon = ""
l_taxinvoice.kwon = "1"
// 호, 숫자만 기재. 최대 32767
// 미기재시 l_taxinvoice.ho = ""
l_taxinvoice.ho = "1"
// 사업자등록증 이미지 첨부여부
l_taxinvoice.businessLicenseYN = False
// 통장사본 이미지 첨부여부
l_taxinvoice.bankBookYN = False
/*************************************************************
* 수정세금계산서 정보 (수정세금계산서 작성시에만 기재
* - 수정세금계산서 관련 정보는 연동매뉴얼 또는 개발가이드 링크 참조
**************************************************************/
// [수정세금계산서 작성시 필수] 수정사유코드, 1~6까지 선택기재
l_taxinvoice.modifyCode = ""
// [수정세금계산서 작성시 필수] 원본세금계산서의 국세청승인번호 기재
l_taxinvoice.orgNTSConfirmNum = ""
/********************************************************
* 상세항목(품목) 정보
* - 일련번호(serialNum)을 1부터 순차적으로 기재하시기 바랍니다.
* - 최대 99건까지 작성할 수 있습니다.
********************************************************/
l_taxinvoice.detailList[1].serialNum = 1 // 일련번호 1부터 순차 기재
l_taxinvoice.detailList[1].purchaseDT = "20220101" // 거래일자 yyyyMMdd
l_taxinvoice.detailList[1].itemName = "품명" // 품명
l_taxinvoice.detailList[1].spec = "규격" // 규격
l_taxinvoice.detailList[1].qty = "1" // 수량
l_taxinvoice.detailList[1].unitCost = "50000" // 단가
l_taxinvoice.detailList[1].supplyCost = "50000" // 공급가액
l_taxinvoice.detailList[1].tax = "5000" // 세액
l_taxinvoice.detailList[1].remark = "비고" // 비고
l_taxinvoice.detailList[2].serialNum = 2 //일련번호 1부터 순차 기재
l_taxinvoice.detailList[2].purchaseDT = "20220101" //거래일자 yyyyMMdd
l_taxinvoice.detailList[2].itemName = "품명" //품명
l_taxinvoice.detailList[2].spec = "규격" //규격
l_taxinvoice.detailList[2].qty = "1" //수량
l_taxinvoice.detailList[2].unitCost = "50000" //단가
l_taxinvoice.detailList[2].supplyCost = "50000" //공급가액
l_taxinvoice.detailList[2].tax = "5000" //세액
l_taxinvoice.detailList[2].remark = "비고" //비고
/********************************************************
* 추가담당자 정보
* - 공급받는자 담당자가 다수인 경우 담당자 정보를 추가하여
* 발행안내메일을 다수에게 전송할 수 있습니다.
* - 최대 5개까지 기재 할 수 있습니다.
********************************************************/
l_taxinvoice.addContactList[1].serialNum = 1 // 일련번호, 1부터 순차기재
l_taxinvoice.addContactList[1].contactName = "담당자 성명" // 담당자 성명
l_taxinvoice.addContactList[1].email = "test1@test.com" // 담당자 메일 주소
l_taxinvoice.addContactList[2].serialNum = 2 // 일련번호, 1부터 순차기재
l_taxinvoice.addContactList[2].contactName = "담당자 성명" // 담당자 성명
l_taxinvoice.addContactList[2].email = "test2@test.com" // 담당자 메일 주소
// 메모
memo = "즉시 발행 메모"
// 지연발행 강제여부
// - 발행마감이 지난 세금계산서를 발행해야 하는경우 true로 값을 지정하시기 바랍니다.
// - 지연발행의 경우 가산세가 부과될 수 있으니 주의하시기 바랍니다.
forceissue = false
try
l_response = in_taxinvoiceService.registIssue(corpNum, l_taxinvoice, memo, forceissue)
messagebox("즉시 발행","응답코드 : " + String(l_response.code) + "~n응답메시지 : " + l_response.message + "~n국세청승인번호 : " + l_response.ntsConfirmNum)
catch(popbillexception pe)
messagebox("즉시 발행","응답코드 : " + String(pe.getcode()) + "~n응답메시지 : " + pe.getmessage())
end try
4. 결과 확인
함수 호출이 정상적으로 처리된 경우 Response가 "성공"으로 반환되며, 실패일 경우 PopbillException으로 오류코드("-"로 시작하는 8자리 숫자값)와 오류메시지가 반환됩니다. [오류코드] 바로가기