> ## Documentation Index
> Fetch the complete documentation index at: https://docs.morrowly.app/llms.txt
> Use this file to discover all available pages before exploring further.

# 플랜 본문

> 이정표와 항목으로 플랜을 쓰고, 덮어쓰지 않게 고칩니다.

플랜은 **이정표**(언제)와 **항목**(무엇이 얼마나, 언제부터 언제까지) 두 가지로 씁니다.
지금 가진 자산·부채·수입·지출은 플랜이 아니라 가구의 **현재 재무**(`GET /v1/finances`)에 있고 모든 플랜이 같이 씁니다.
플랜 항목은 앞으로 생기는 것과, 현재 재무에 대한 계획(팔기·재계약·금액 바꾸기)입니다.

## 고치는 순서

<Steps>
  <Step title="읽기">
    `GET /v1/plans/{id}` 로 플랜 전체를 받습니다. `revision` 은 지금 판의 지문입니다.
  </Step>

  <Step title="미리 계산하기(선택)">
    `POST /v1/plans/{id}/projection` 에 바꿀 것만(`remove`·`upsert`·`milestones`) 보내면 저장하지 않고 전망을 계산합니다.
  </Step>

  <Step title="저장하기">
    받은 본문을 고쳐 `revision` 과 함께 `PUT /v1/plans/{id}` 로 보냅니다. 그사이 다른 곳(화면·다른 사람·다른 토큰)에서 저장했으면 덮어쓰지 않고 **412** 입니다. 다시 읽고 고칩니다. PUT 은 전체를 바꿉니다. 빠뜨린 `milestones`·`items` 는 빈 목록, `monteCarlo` 는 기본값으로 저장됩니다.
  </Step>
</Steps>

현재 재무도 같습니다. `GET /v1/finances` 응답의 `ETag` 를 `PUT /v1/finances` 의 `If-Match` 에 넣으면 그사이 바뀌었을 때 412 입니다(넣지 않으면 그냥 덮어씁니다).

## 시기 `Time`

항목의 시점(`at`)·시작(`start`)·끝(`end`)은 모두 셋 중 하나로 씁니다.

```json theme={null}
{ "month": "2029-12" }
{ "age": 60, "who": "SPOUSE" }
{ "milestone": "retirement", "offset": -12 }
```

* `month`: 그 달. `age`: 그 나이가 되는 생일 달(`who` 가 `SPOUSE` 면 배우자 나이). `milestone`: 이정표 달 ± `offset` 개월.
* 시작·시점은 그 달부터입니다. **끝**은 달이면 그 달까지, 나이·이정표면 **그 전 달까지**입니다(은퇴하면 그달부터 월급이 끊기는 것과 같습니다). 비우면 플랜 끝까지입니다.
* 이정표에 묶은 항목은 이정표를 옮기면 따라 움직입니다.

## 이정표

이정표는 계산이 달라지는 정해진 시점뿐이고, id 가 정해져 있습니다. 다른 id 는 400 입니다.

| id | 뜻 |
| - | - |
| `retirement` | 본인 은퇴 |
| `retirement-spouse` | 배우자 은퇴 |
| `national-pension` | 본인 국민연금 받기 시작 |
| `national-pension-spouse` | 배우자 국민연금 받기 시작 |

이정표의 시기는 달 또는 나이입니다(`{ "id": "retirement", "name": "은퇴", "time": { "age": 60 } }`).

## 항목

모든 항목은 `id`(플랜 안에서 겹치지 않게 직접 정함)·`kind`·`name` 과 종류별 필드를 가집니다. 금액은 원이고 월 금액은 `monthlyAmount` 입니다. 필드는 레퍼런스의 스키마에 있습니다.

| `kind` | 뜻 |
| - | - |
| `income` | 이 플랜의 수입(부업·새 직장·연금) |
| `expense` | 이 플랜의 지출(부모님 생활비·기부) |
| `change` | 현재 재무의 수입·지출을 어느 달부터 바꾸기(이직·퇴사, 0 이면 끝) |
| `lumpSum` | 한 번 들어오거나(+) 나가는(−) 목돈 |
| `housing` | 주거: 자가(`OWN`)·전세(`JEONSE`)·월세(`RENT`)·갭(`GAP`) |
| `asset` | 그 밖의 자산 사기(자동차 등) |
| `holding` | 지금 가진 자산의 계획(팔기·재계약·주택연금·배당 받기) |
| `child` | 자녀(출생, 월 양육비) |
| `severance` | 퇴직금 |
| `gift` | 증여 |
| `transfer` | 자산 옮기기(예금으로, ISA → 연금계좌) |

* `change`·`holding`·`transfer` 는 현재 재무의 수입·지출·자산 `id` 를 가리킵니다.
* 항목을 지우지 않고 계산에서만 빼려면 그 `id` 를 플랜의 `off` 에 넣습니다. 끈 수입·자산을 가리키는 `change`·`transfer` 도 함께 빠집니다.
* 저장할 때 400: id 가 겹칠 때, 없는 이정표·수입·지출·자산을 가리킬 때, 한 달도 없는 항목(끝이 시작보다 앞)일 때.

## 결과에서 항목 찾기

전망 응답의 이벤트 이름표는 항목 id 입니다. 한 항목에서 여러 일이 생기면 `"항목 id:부분"` 으로 가립니다(예: `home` 을 사면 `home`, 팔면 `home:sale`, 재계약하면 `home:renew`). 그래서 응답의 숫자를 항목으로 거슬러 찾을 수 있습니다.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.