# 발행유형

팝빌 현금영수증은 모든 발행유형(승인/취소 발행)을 지원하며, 필요한 발행 유형만 선택하여 연동할 수 있습니다.

## 1. 승인 발행

현금거래에 대한 증빙으로, 가맹점이 구매자의 식별번호(휴대폰번호, 카드번호, 사업자번호 등)를 기준으로 현금영수증을 발행하는 유형입니다.

![팝빌 현금영수증 승인발행 소개](https://developers.popbill.com/images/guide/introduction/cashbill/img-approve.webp)

| 구분    | 식별번호                                | 설명                    |
| ----- | ----------------------------------- | --------------------- |
| 소득공제용 | 휴대폰번호 / 주민등록번호 / 신용카드 또는 현금영수증 카드번호 | 구매자가 개인인 경우 (자진발급 가능) |
| 지출증빙용 | 휴대폰번호 / 사업자번호 / 신용카드 또는 현금영수증 카드번호  | 구매자가 사업자인 경우          |

> **자진발급**\
> 구매자가 현금영수증 발급을 거부하거나, 구매자의 식별번호를 확인할 수 없는 경우 발행하는 현금영수증입니다.\
> 이 때, 국세청이 지정한 대표번호(010-000-1234)를 사용하여 소득공제용으로만 발행할 수 있습니다.

### 승인 발행 프로세스

팝빌에 저장과 동시에 발행하여 현금영수증을 처리합니다. [\[RegistIssue - 즉시 발행\]](https://developers.popbill.com/api-reference/cashbill/api/issue#RegistIssue)\
가맹점이 기재사항을 작성하여 발행한 현금영수증은 팝빌이 자동으로 국세청 전송 처리합니다.

**승인 발행**

```mermaid
flowchart LR
    WriteFranchise("가맹점 작성")
    Issued("발행완료 <br/> (300)")
    SendNTS{"국세청 전송"}
    SendSuccess("전송성공 <br/> (304)")
    SendFail("전송실패 <br/> (305)")

    WriteFranchise -- RegistIssue <br> (즉시 발행) --> Issued
    Issued --> SendNTS
    SendNTS --> SendFail
    SendNTS --> SendSuccess

    classDef invoicee stroke-width:1px,font-weight:bold;
    classDef popbill stroke-width:1px,font-weight:bold;

    class WriteFranchise,Issued invoicee
    class SendNTS,SendFail,SendSuccess popbill
```

### 문서번호 관리체계

문서번호란 현금영수증의 중복 발행을 방지하고 내부 관리를 위해 프로그램 공급사가 직접 생성하여 할당하는 고유번호 입니다.

| 관리주체     | 유형      | 변수명        |  길이 | 설명                                                          |
| -------- | ------- | ---------- | :-: | ----------------------------------------------------------- |
| 프로그램 공급사 | 문서번호    | mgtKey     |  24 | 문서 관리를 위해 파트너가 할당하는 식별번호 영문 대소문자, 숫자, 특수문자(’-’,’\_‘)만 이용 가능 |
| 팝빌       | 국세청승인번호 | confirmNum |  9  | 현금영수증 발행 시점에 팝빌에서 자동으로 할당                                   |

> **동일한 국세청승인번호가 존재합니다. 중복하여 할당이 가능한가요?**\
> 같은 거래일자에는 국세청승인번호를 중복하여 할당하지 않으며, 다른 거래 일자에는 동일한 국세청승인번호로 할당될 수 있습니다.

### 상태확인

팝빌에서 처리된 현금영수증 상태 확인을 위해 아래 2가지 방법을 지원합니다.

- **Webhook(Push)**\
  팝빌에서 현금영수증 상태가 변경된 시점에 파트너가 지정한 Callback URL로 이벤트 전송 [\[Webhook\]](https://developers.popbill.com/api-reference/cashbill/webhook/introduction)

- **API(Polling)**\
  파트너가 주기적으로 API를 호출하여 상태 확인

**Webhook(Push)**

```mermaid
sequenceDiagram
    participant 가맹점
    participant Webhook Receiver
    participant POPBiLL
    
    가맹점->>POPBiLL: Callback URL 등록
    가맹점->>POPBiLL: RegistIssue - 즉시 발행
    POPBiLL-->>가맹점: confirmNum(국세청승인번호) 반환
    POPBiLL->>Webhook Receiver: Webhook 실행 <br> Event Type = "Issue"
    POPBiLL->>POPBiLL: 국세청 전송 처리 완료
    POPBiLL->>Webhook Receiver: Webhook 실행 <br> Event Type = "NTS" <br> stateCode = 304(전송성공) <br> stateCode = 305(전송실패)
    Webhook Receiver->>Webhook Receiver: 결과 업데이트
```

**API(Polling)**

```mermaid
sequenceDiagram
    participant 가맹점
    participant POPBiLL

    가맹점->>POPBiLL: RegistIssue - 즉시 발행
    POPBiLL-->>가맹점: confirmNum(국세청승인번호) 반환
    POPBiLL->>POPBiLL: 국세청 전송 및 결과반영
    가맹점->>POPBiLL: GetInfo - 상태 확인
    POPBiLL-->>가맹점: stateCode(상태코드) 반환 <br> stateCode = 304(전송성공) <br> stateCode = 305(전송실패)
    가맹점->>가맹점: 결과 업데이트
```

## 2. 취소 발행

발행된 현금영수증의 전체 또는 부분 현금거래를 취소하기 위해 발행하는 유형입니다. 단, 취소 금액의 합은 승인 현금영수증의 금액을 초과할 수 없습니다.

![팝빌 현금영수증 취소발행 소개](https://developers.popbill.com/images/guide/introduction/cashbill/img-cancel.webp)

### 취소 발행 프로세스

당초 승인 현금영수증의 ‘거래일자’와 ‘국세청승인번호’를 이용하여 전체 또는 부분 취소 현금영수증을 발행합니다.\
부분 취소의 경우 ‘부분 취소 거래금액’ 입력이 필요합니다. [\[RevokeRegistIssue - 취소 현금영수증 즉시 발행\]](https://developers.popbill.com/api-reference/cashbill/api/issue#RevokeRegistIssue)

**취소 발행**

```mermaid
flowchart LR
    WriteFranchise("가맹점 작성")
    CancelCondition{"전체취소 <br> or <br> 부분취소"}
    AllCancel("전체취소")
    PartCancel("부분취소")
    SendNTS{"국세청 전송"}
    SendSuccess("전송성공 <br/> (304)")
    SendFail("전송실패 <br/> (305)")

    WriteFranchise -- RevokeRegistIssue <br> (취소 현금영수증 즉시 발행) --> CancelCondition{"전체취소 <br> or <br> 부분취소"}
    CancelCondition -- isPartCancel = false --> AllCancel
    CancelCondition -- isPartCancel = true --> PartCancel
    AllCancel --> SendNTS{"국세청 전송"}
    PartCancel --> SendNTS{"국세청 전송"}
    SendNTS --> SendFail
    SendNTS --> SendSuccess

    classDef invoicee stroke-width:1px,font-weight:bold;
    classDef popbill stroke-width:1px,font-weight:bold;

    class WriteFranchise,CancelCondition,AllCancel,PartCancel,id8,id10,id11 invoicee
    class SendNTS,SendSuccess,SendFail popbill
```

> **IsPartCancel(취소유형) 값을 false(전체 취소)로 설정하고, 부분취소 금액을 입력하는 경우 어떻게 처리되나요?**\
> IsPartCancel이 false로 설정된 경우에는, 부분 취소 금액을 입력하더라도 전체 취소로만 처리됩니다.\
> 부분 취소의 경우에는 취소 유형을 반드시 true(부분 취소)로 설정하고 부분 취소 금액을 입력하여 주시기 바랍니다.

### 문서번호 관리체계

문서번호란 현금영수증의 중복 발행을 방지하고 내부 관리를 위해 프로그램 공급사가 직접 생성하여 할당하는 고유번호 입니다.

| 관리주체     | 유형      | 변수명        |  길이 | 설명                                                          |
| -------- | ------- | ---------- | :-: | ----------------------------------------------------------- |
| 프로그램 공급사 | 문서번호    | mgtKey     |  24 | 문서 관리를 위해 파트너가 할당하는 식별번호 영문 대소문자, 숫자, 특수문자(’-’,’\_‘)만 이용 가능 |
| 팝빌       | 국세청승인번호 | confirmNum |  9  | 현금영수증 발행 시점에 팝빌에서 자동으로 할당                                   |

> **동일한 국세청승인번호가 존재합니다. 중복하여 할당이 가능한가요?**\
> 국세청승인번호는 같은 거래일자 내에서는 중복하여 할당되지 않지만, 거래일자가 다른 경우 동일한 국세청승인번호가 할당될 수 있습니다.\
> 따라서 국세청승인번호와 거래일자를 함께 확인하여 고유값(Unique Value)으로 관리해야 합니다.

### 상태확인

팝빌에서 처리된 현금영수증 상태 확인을 위해 아래 2가지 방법을 지원합니다.

- **Webhook(Push)**\
  팝빌에서 현금영수증 상태가 변경된 시점에 파트너가 지정한 Callback URL로 이벤트 전송 [\[Webhook\]](https://developers.popbill.com/api-reference/cashbill/webhook/introduction)

- **API(Polling)**\
  파트너가 주기적으로 API를 호출하여 상태 확인

**Webhook(Push)**

```mermaid
sequenceDiagram
    participant 가맹점
    participant Webhook Receiver
    participant POPBiLL         

    가맹점->>POPBiLL: Callback URL 등록
    가맹점->>POPBiLL: RevokeRegistIssue - 취소 현금영수증 즉시 발행
    POPBiLL-->>가맹점: confirmNum(국세청승인번호) 반환
    POPBiLL->>Webhook Receiver: Webhook 실행 <br> Event Type = "Issue"
    POPBiLL->>POPBiLL: 국세청 전송 처리 완료
    POPBiLL->>Webhook Receiver: Webhook 실행 <br> Event Type = "NTS" <br> stateCode = 304(전송성공) <br> stateCode = 305(전송실패)
    Webhook Receiver->>Webhook Receiver: 결과 업데이트
```

**API(Polling)**

```mermaid
sequenceDiagram
    participant 가맹점
    participant POPBiLL

    가맹점->>POPBiLL: RevokeRegistIssue - 취소 현금영수증 즉시 발행
    POPBiLL-->>가맹점: confirmNum(국세청승인번호) 반환

    POPBiLL->>POPBiLL: 국세청 전송 및 결과반영
    가맹점->>POPBiLL: GetInfo - 상태 확인
    POPBiLL-->>가맹점: stateCode(상태코드) 반환 <br> stateCode = 304(전송성공) <br> stateCode = 305(전송실패)
    가맹점->>가맹점: 결과 업데이트
```
