# -*- coding: utf-8 -*-
# Module for Popbill Statement API. It include base functionality of the
# RESTful web service request and parse json result. It uses Linkhub module
# to accomplish authentication APIs.
#
# http://www.popbill.com
# Author : Jeong Yohan (code@linkhubcorp.com)
# Written : 2015-03-20
# Updated : 2022-08-03
# Thanks for your interest.
from .base import File, PopbillBase, PopbillException

try:
    from urllib import parse as parse
except ImportError:
    import urllib as parse


class StatementService(PopbillBase):
    """팝빌 전자명세서 API Service Implementation."""

    def __init__(self, LinkID, SecretKey):
        """생성자
        args
            LinkID : 링크허브에서 발급받은 링크아이디(LinkID)
            SecretKey : 링크허브에서 발급받은 비밀키(SecretKey)
        """
        super(self.__class__, self).__init__(LinkID, SecretKey)
        self._addScope("121")
        self._addScope("122")
        self._addScope("123")
        self._addScope("124")
        self._addScope("125")
        self._addScope("126")

    def getChargeInfo(self, CorpNum, ItemCode, UserID=None):
        """과금정보 확인
        args
            CorpNum : 회원 사업자번호
            ItemCode : 전자명세서 종류코드
            UserID : 팝빌 회원아이디
        return
            과금정보 객체
        raise
            PopbillException
        """
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        return self._httpget("/Statement/ChargeInfo/" + ItemCode, CorpNum, UserID)

    def getURL(self, CorpNum, UserID, ToGo):
        """팝빌 전자명세서 관련 URL
        args
            CorpNum : 팝빌회원 사업자번호
            UserID : 팝빌 회원아이디
            ToGo : 전자명세서 관련 기능 지정 문자.(TBOX-임시문서함, SBOX-매출문서함)
        return
            30초 보안 토큰을 포함한 url
        raise
            PopbillException
        """
        if ToGo == None or ToGo == "":
            raise PopbillException(-99999999, "TOGO값이 입력되지 않았습니다.")

        result = self._httpget("/Statement?TG=" + ToGo, CorpNum, UserID)
        return result.url

    def getUnitCost(self, CorpNum, ItemCode):
        """전자명세서 발행단가 확인.
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
        return
            발행단가 by float
        raise
            PopbillException
        """
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        result = self._httpget("/Statement/" + str(ItemCode) + "?cfg=UNITCOST", CorpNum)
        return float(result.unitCost)

    def checkMgtKeyInUse(self, CorpNum, ItemCode, MgtKey):
        """파트너 문서번호 사용여부 확인.
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 문서번호(최대 24자리, 숫자,영문,'-','_'로 구성)
        return
            사용 여부 by True/False
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        try:
            result = self._httpget(
                "/Statement/" + str(ItemCode) + "/" + MgtKey, CorpNum
            )
            return result.itemKey != None and result.itemKey != ""

        except PopbillException as PE:
            if PE.code == -12000004:
                return False
            raise PE

    def FAXSend(self, CorpNum, statement, SendNum, ReceiveNum, UserID=None):
        """선팩스 전송
        args
            CorpNum : 팝빌회원 사업자번호
            statement : 전자명세서 객체
            SendNum : 팩스 발신번호
            ReceiveNum : 팩스 수신번호
            UserID : 팝빌회원 아이디
        return
            팩스전송 접수번호(receiptNum)
        raise
            PopbillException
        """
        if statement == None:
            raise PopbillException(-99999999, "전송할 전자명세서 정보가 입력되지 않았습니다.")
        if SendNum == None or SendNum == "":
            raise PopbillException(-99999999, "팩스전송 발신번호가 올바르지 않습니다.")
        if ReceiveNum == None or ReceiveNum == "":
            raise PopbillException(-99999999, "팩스전송 수신번호가 올바르지 않습니다.")

        statement.sendNum = SendNum
        statement.receiveNum = ReceiveNum

        postData = self._stringtify(statement)

        return self._httppost("/Statement", postData, CorpNum, UserID, "FAX").receiptNum

    def registIssue(
        self, CorpNum, statement, Memo=None, UserID=None, EmailSubject=None
    ):
        """즉시발행
        args
            CorpNum : 팝빌회원 사업자번호
            statement : 등록할 전자명세서 object. made with Statement(...)
            Memo : 즉시발행메모
            EmailSubject: 전자명세서 발행 안내메일 제목
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if statement == None:
            raise PopbillException(-99999999, "등록할 전자명세서 정보가 입력되지 않았습니다.")

        if Memo != None or Memo != "":
            statement.memo = Memo

        if EmailSubject != None or EmailSubject != "":
            statement.emailSubject = EmailSubject

        postData = self._stringtify(statement)

        return self._httppost("/Statement", postData, CorpNum, UserID, "ISSUE")

    def register(self, CorpNum, statement, UserID=None):
        """임시저장
        args
            CorpNum : 팝빌회원 사업자번호
            statement : 등록할 전자명세서 object. made with Statement(...)
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if statement == None:
            raise PopbillException(-99999999, "등록할 전자명세서 정보가 입력되지 않았습니다.")

        postData = self._stringtify(statement)

        return self._httppost("/Statement", postData, CorpNum, UserID)

    def update(self, CorpNum, ItemCode, MgtKey, Statement, UserID=None):
        """임시저장
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            Statement : 등록할 전자명세서 object. made with Statement(...)
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """

        if Statement == None:
            raise PopbillException(-99999999, "등록할 전자명세서 정보가 입력되지 않았습니다.")
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        postData = self._stringtify(Statement)

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey,
            postData,
            CorpNum,
            UserID,
            "PATCH",
        )

    def issue(
        self,
        CorpNum,
        ItemCode,
        MgtKey,
        Memo=None,
        UserID=None,
        EmailSubject=None,
    ):
        """발행
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            Memo : 처리메모
            EmailSubject : 발행메일 제목(미기재시 기본양식으로 전송)
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        req = {}
        postData = ""

        if Memo != None and Memo != "":
            req["memo"] = Memo
        if EmailSubject != None and EmailSubject != "":
            req["emailSubject"] = EmailSubject

        postData = self._stringtify(req)

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey,
            postData,
            CorpNum,
            UserID,
            "ISSUE",
        )

    def cancel(self, CorpNum, ItemCode, MgtKey, Memo=None, UserID=None):
        """발행취소
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            Memo : 처리메모
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """

        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        postData = ""

        if Memo != None and Memo != "":
            postData = self._stringtify({"memo": Memo})

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey,
            postData,
            CorpNum,
            UserID,
            "CANCEL",
        )

    def delete(self, CorpNum, ItemCode, MgtKey, UserID=None):
        """삭제
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey,
            "",
            CorpNum,
            UserID,
            "DELETE",
        )

    def search(
        self,
        CorpNum,
        DType,
        SDate,
        EDate,
        State,
        ItemCode,
        Page,
        PerPage,
        Order,
        UserID=None,
        QString=None,
    ):
        """목록 조회
        args
            CorpNum : 팝빌회원 사업자번호
            DType : 일자유형, R-등록일시, W-작성일자, I-발행일시 중 택 1
            SDate : 시작일자, 표시형식(yyyyMMdd)
            EDate : 종료일자, 표시형식(yyyyMMdd)
            State : 상태코드, 2,3번째 자리에 와일드카드(*) 사용가능
            ItemCode : 명세서 종류코드 배열, 121-명세서, 122-청구서, 123-견적서, 124-발주서 125-입금표, 126-영수증
            Page : 페이지번호
            PerPage : 페이지당 목록개수
            Order : 정렬방향, D-내림차순, A-오름차순
            QString : 거래처 정보, 거래처 상호 또는 사업자등록번호 기재, 미기재시 전체조회
            UserID : 팝빌 회원아이디
        """

        if DType == None or DType == "":
            raise PopbillException(-99999999, "일자유형이 입력되지 않았습니다.")

        if SDate == None or SDate == "":
            raise PopbillException(-99999999, "시작일자가 입력되지 않았습니다.")

        if EDate == None or EDate == "":
            raise PopbillException(-99999999, "종료일자가 입력되지 않았습니다.")

        uri = "/Statement/Search"
        uri += "?DType=" + DType
        uri += "&SDate=" + SDate
        uri += "&EDate=" + EDate
        uri += "&State=" + ",".join(State)
        uri += "&ItemCode=" + ",".join(ItemCode)
        uri += "&Page=" + str(Page)
        uri += "&PerPage=" + str(PerPage)
        uri += "&Order=" + Order

        if QString is not None:
            uri += "&QString=" + parse.quote(QString)

        return self._httpget(uri, CorpNum, UserID)

    def getInfo(self, CorpNum, ItemCode, MgtKey):
        """상태/요약 정보 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
        return
            문서 상태/요약정보 object
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        return self._httpget("/Statement/" + str(ItemCode) + "/" + MgtKey, CorpNum)

    def getInfos(self, CorpNum, ItemCode, MgtKeyList):
        """상태정보 다량 확인, 최대 1000건
        args
            CorpNum : 회원 사업자 번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKeyList : 문서번호 목록
        return
            상태정보 목록 as List
        raise
            PopbillException
        """
        if MgtKeyList == None or len(MgtKeyList) < 1:
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")

        postData = self._stringtify(MgtKeyList)

        return self._httppost("/Statement/" + str(ItemCode), postData, CorpNum)

    def getDetailInfo(self, CorpNum, ItemCode, MgtKey):
        """전자명세서 상세정보 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
        return
            문서 상세정보 object
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        return self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "?Detail", CorpNum
        )

    def sendEmail(self, CorpNum, ItemCode, MgtKey, ReceiverEmail, UserID=None):
        """메일 재전송
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            ReceiverEmail : 수신자 메일주소
            UserID : 팝빌 회원아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        postData = self._stringtify({"receiver": ReceiverEmail})

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey,
            postData,
            CorpNum,
            UserID,
            "EMAIL",
        )

    def sendSMS(
        self, CorpNum, ItemCode, MgtKey, Sender, Receiver, Contents, UserID=None
    ):
        """알림문자 전송
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            Sender : 발신번호
            Receiver : 수신번호
            Contents : 문자메시지 내용(최대 90Byte), 최대길이를 초과한경우 길이가 조정되어 전송됨
            UserID : 팝빌 회원아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """

        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        postData = self._stringtify(
            {"sender": Sender, "receiver": Receiver, "contents": Contents}
        )

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey,
            postData,
            CorpNum,
            UserID,
            "SMS",
        )

    def sendFAX(self, CorpNum, ItemCode, MgtKey, Sender, Receiver, UserID=None):
        """전자명세서 팩스 전송
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            Sender : 발신번호
            Receiver : 수신 팩스번호
            UserID : 팝빌 회원아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        postData = self._stringtify({"sender": Sender, "receiver": Receiver})

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey,
            postData,
            CorpNum,
            UserID,
            "FAX",
        )

    def getLogs(self, CorpNum, ItemCode, MgtKey):
        """전자명세서 문서이력 목록 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
        return
            문서이력 정보 목록 as List
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        return self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "/Logs", CorpNum
        )

    def getSealURL(self, CorpNum, UserID):
        """팝빌 인감 및 첨부문서 등록 URL
        args
            CorpNum : 회원 사업자번호
            UserID  : 회원 팝빌아이디
        return
            30초 보안 토큰을 포함한 url
        raise
            PopbillException
        """
        result = self._httpget("/?TG=SEAL", CorpNum, UserID)
        return result.url

    def attachFile(self, CorpNum, ItemCode, MgtKey, FilePath, UserID=None):
        """파일 첨부
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            FilePath : 첨부파일의 경로
            UserID : 팝빌 회원아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if FilePath == None or FilePath == "":
            raise PopbillException(-99999999, "파일경로가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")
        files = []

        try:
            with open(FilePath, "rb") as F:
                files = [File(fieldName="Filedata", fileName=F.name, fileData=F.read())]
        except IOError:
            raise PopbillException(-99999999, "해당경로에 파일이 없거나 읽을 수 없습니다.")

        return self._httppost_files(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "/Files",
            None,
            files,
            CorpNum,
            UserID,
        )

    def getFiles(self, CorpNum, ItemCode, MgtKey):
        """첨부파일 목록 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
        return
            첨부파일 목록 as List
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        return self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "/Files", CorpNum
        )

    def deleteFile(self, CorpNum, ItemCode, MgtKey, FileID, UserID=None):
        """첨부파일 삭제
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            FileID : 파일아이디, 첨부파일 목록확인(getFiles) API 응답전문의 AttachedFile 변수값
            UserID : 팝빌회원 아이디
        return
            첨부파일 정보 목록 as List
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")
        if FileID == None or FileID == "":
            raise PopbillException(-99999999, "파일아이디가 입력되지 않았습니다.")

        postData = ""

        return self._httppost(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "/Files/" + FileID,
            postData,
            CorpNum,
            UserID,
            "DELETE",
        )

    def getPopUpURL(self, CorpNum, ItemCode, MgtKey, UserID=None):
        """전자명세서 1장의 팝빌 화면을 볼수있는 PopUp URL 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            UserID : 팝빌회원 아이디
        return
            팝빌 URL as str
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        result = self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "?TG=POPUP",
            CorpNum,
            UserID,
        )

        return result.url

    def getPrintURL(self, CorpNum, ItemCode, MgtKey, UserID=None):
        """공급자용 인쇄 URL 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            UserID : 팝빌회원 아이디
        return
            팝빌 URL as str
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        result = self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "?TG=PRINT",
            CorpNum,
            UserID,
        )

        return result.url

    def getViewURL(self, CorpNum, ItemCode, MgtKey, UserID=None):
        """전자명세서 보기 팝업 URL 확인 (메뉴/버튼 제외)
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            UserID : 팝빌회원 아이디
        return
            팝빌 URL as str
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        result = self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "?TG=VIEW",
            CorpNum,
            UserID,
        )

        return result.url

    def getEPrintURL(self, CorpNum, ItemCode, MgtKey, UserID=None):
        """공급받는자용 인쇄 URL 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            UserID : 팝빌회원 아이디
        return
            팝빌 URL as str
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        result = self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "?TG=EPRINT",
            CorpNum,
            UserID,
        )

        return result.url

    def getMailURL(self, CorpNum, ItemCode, MgtKey, UserID=None):
        """공급받는자용 메일 링크 URL 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKey : 파트너 문서번호
            UserID : 팝빌회원 아이디
        return
            팝빌 URL as str
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        result = self._httpget(
            "/Statement/" + str(ItemCode) + "/" + MgtKey + "?TG=MAIL",
            CorpNum,
            UserID,
        )

        return result.url

    def getMassPrintURL(self, CorpNum, ItemCode, MgtKeyList, UserID=None):
        """다량 인쇄 URL 확인
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 명세서 종류 코드
                [121 - 거래명세서], [122 - 청구서], [123 - 견적서],
                [124 - 발주서], [125 - 입금표], [126 - 영수증]
            MgtKeyList : 파트너 문서번호 목록
            UserID : 팝빌회원 아이디
        return
            팝빌 URL as str
        raise
            PopbillException
        """
        if MgtKeyList == None:
            raise PopbillException(-99999999, "문서번호 배열이 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        postData = self._stringtify(MgtKeyList)

        result = self._httppost(
            "/Statement/" + str(ItemCode) + "?Print", postData, CorpNum, UserID
        )

        return result.url

    def attachStatement(
        self, CorpNum, ItemCode, MgtKey, SubItemCode, SubMgtKey, UserID=None
    ):
        """다른 전자명세서 첨부
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 전자명세서 종류코드, 121-명세서, 122-청구서, 123-견적서, 124-발주서 125-입금표, 126-영수증
            MgtKey : 전자명세서 문서번호
            SubItemCode : 첨부할 명세서 종류코드, 121-명세서, 122-청구서, 123-견적서, 124-발주서 125-입금표, 126-영수증
            SubMgtKey : 첨부할 전자명세서 문서번호
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        uri = "/Statement/" + ItemCode + "/" + MgtKey + "/AttachStmt"

        postData = self._stringtify({"ItemCode": ItemCode, "MgtKey": SubMgtKey})

        return self._httppost(uri, postData, CorpNum, UserID)

    def detachStatement(
        self, CorpNum, ItemCode, MgtKey, SubItemCode, SubMgtKey, UserID=None
    ):
        """전자명세서 첨부해제
        args
            CorpNum : 팝빌회원 사업자번호
            ItemCode : 전자명세서 종류코드, 121-명세서, 122-청구서, 123-견적서, 124-발주서 125-입금표, 126-영수증
            MgtKey : 전자명세서 문서번호
            SubItemCode : 첨부해제할 명세서 종류코드, 121-명세서, 122-청구서, 123-견적서, 124-발주서 125-입금표, 126-영수증
            SubMgtKey : 첨부해제할 전자명세서 문서번호
            UserID : 팝빌회원 아이디
        return
            처리결과. consist of code and message
        raise
            PopbillException
        """
        if MgtKey == None or MgtKey == "":
            raise PopbillException(-99999999, "문서번호가 입력되지 않았습니다.")
        if ItemCode == None or ItemCode == "":
            raise PopbillException(-99999999, "명세서 종류 코드가 입력되지 않았습니다.")

        uri = "/Statement/" + ItemCode + "/" + MgtKey + "/DetachStmt"

        req = {}

        postData = self._stringtify({"ItemCode": ItemCode, "MgtKey": SubMgtKey})

        return self._httppost(uri, postData, CorpNum, UserID)

    def listEmailConfig(self, CorpNum, UserID=None):
        """알림메일 전송목록 조회
        args
            CorpNum : 팝빌회원 사업자번호
            UserID : 팝빌회원 아이디
        return
           전자명세서 관련 메일전송 항목에 대한 전송여부 목록
        raise
            PopbillException
        """
        return self._httpget("/Statement/EmailSendConfig", CorpNum, UserID)

    def updateEmailConfig(self, Corpnum, EmailType, SendYN, UserID=None):
        """알림메일 전송설정 수정
        args
            CorpNum : 팝빌회원 사업자번호
            EmailType: 메일전송유형
            SendYN: 전송여부 (True-전송, False-미전송)
            UserID : 팝빌회원 아이디
        return
           처리결과. consist of code and message
        raise
            PopbillException
        """
        if EmailType == None or EmailType == "":
            raise PopbillException(-99999999, "메일전송 타입이 입력되지 않았습니다.")

        if SendYN == None or SendYN == "":
            raise PopbillException(-99999999, "메일전송 여부 항목이 입력되지 않았습니다.")

        uri = (
            "/Statement/EmailSendConfig?EmailType="
            + EmailType
            + "&SendYN="
            + str(SendYN)
        )
        return self._httppost(uri, "", Corpnum, UserID)


class Statement(object):
    def __init__(self, **kwargs):
        self.__dict__ = kwargs


class StatementDetail(object):
    def __init__(self, **kwargs):
        self.__dict__ = kwargs
