# 세금 처리

가맹점 서버는 주문의 최종 결제 금액과 세금 구성을 확인한 뒤 [결제 생성](/payment-creation)의 세션 생성 API를 호출합니다.

## 요청 필드

| 필드 | 요청 여부 | 규칙 |
| --- | --- | --- |
| `amount` | 필수 | 구매자가 지불할 결제 총액입니다. 단위는 대한민국 원(KRW)이며 정수여야 합니다. |
| `taxFreeAmount` | 선택 | `amount`에 포함된 면세 금액입니다. 기본 값은 0입니다. |
| `vat` | 선택 | `amount`에 포함된 부가세 금액입니다. 입력하지 않으면 point3가 자동 계산합니다. |
| `tradeOpt` | 선택 | 도서공연, 대중교통 상품 분류의 결제 시 설정하는 값입니다. |

### 세금 용어 정리

| 용어 | 필드 | 설명 |
| --- | --- | --- |
| **결제 총액** | `amount` | 구매자가 지불하는 결제의 전체 금액입니다. |
| **공급가액** | `supplyAmount` | 과세 대상 공급가액입니다. point3가 자동으로 계산합니다. |
| **면세금액** | `taxFreeAmount` | 결제 총액에 포함된 면세 금액입니다. |
| **부가세** | `vat` | 결제 총액에 포함된 부가세 금액입니다. |

모든 요청과 응답에는 다음 불변식이 성립합니다.

```javascript
amount = supplyAmount + taxFreeAmount + vat
supplyAmount = amount - taxFreeAmount - vat
```

## VAT를 생략했을 때의 계산

`vat`를 생략하면 point3 서버는 다음 순서로 값을 계산합니다.

```javascript
taxableGrossAmount = amount - taxFreeAmount
vat = Math.round(taxableGrossAmount / 11)
supplyAmount = amount - taxFreeAmount - vat
```

`vat`를 직접 전달하면 서버는 자동 계산값으로 바꾸지 않고 검증을 통과한 입력값을 그대로 사용합니다. `taxFreeAmount`가 `amount`와 같은 전액 면세 거래에서는 `vat`를 생략하거나 0으로 전달해야 합니다.

## 계산 예제

| 시나리오 | 요청 | 응답 세금 구성 |
| --- | --- | --- |
| 일반 과세 | `amount: 10000` | `supplyAmount: 9091`, `vat: 909`, `taxFreeAmount: 0` |
| 전액 면세 | `amount: 10000`, `taxFreeAmount: 10000` | `supplyAmount: 0`, `vat: 0`, `taxFreeAmount: 10000` |
| 혼합 과세 | `amount: 11000`, `taxFreeAmount: 1000` | `taxableGrossAmount: 10000`, `supplyAmount: 9091`, `vat: 909` |
| VAT 직접 지정 | `amount: 12000`, `taxFreeAmount: 1000`, `vat: 500` | `supplyAmount: 10500`, `vat: 500` |

면세 거래를 위해서는 `taxFreeAmount`가 `amount`와 동일하게 설정하여야 합니다. 세율이 10%가 아닌 상품의 경우 `vat`를 직접 입력하여 정확한 세금 구성을 전달할 수 있습니다. 대부분의 가맹점은 `vat`를 직접 입력할 필요가 없습니다.

<Callout type="caution" title="기술 동작 안내이며 세무 자문이 아닙니다">
  면세 여부, 영세율과 면세의 구분, 간이과세자·특수세율 적용, 할인 배분과 복합 상품 분류는 가맹점과 세무 전문가의 확인이 필요합니다. 해당 문서에서는 point3가 결제 세션 생성 시 세금 필드를 처리하는 기술적 동작을 안내합니다.
</Callout>

## 결제 취소의 세금 필드

결제 취소의 `refundAmount`, `refundTaxFreeAmount`, `refundVat`는 취소하려는 부분의 금액과 세금 구성을 반영해야 하며, 결제 세션 생성과 달리 자동으로 세금 값을 계산하지 않으므로 호출 시 주의해야 합니다. 필수 필드와 결과 처리 방법은 [결제 취소](/payment-cancellation)를 참고하세요.
