계정 정보 다이얼로그 추가 및 전체 목록 페치 개선

This commit is contained in:
JiWoong Sul
2025-10-22 01:05:47 +09:00
parent 6b58effc83
commit f4dc83d441
44 changed files with 1636 additions and 362 deletions

View File

@@ -9,7 +9,7 @@
## 0. 구현 현황 요약 (2025-09-18 기준)
- 마스터 데이터: `/vendors`, `/uoms`, `/transaction-types`, `/transaction-statuses`, `/approval-statuses`, `/approval-actions`, `/warehouses`, `/customers`, `/products`, `/employees`, `/groups`, `/menus`, `/group-menu-permissions`, `/zipcodes`
- 각 자원은 `/api/v1/<resource>` 패턴을 따르며, 목록 필터·페이지네이션·`include` 확장을 지원한다.
- 그룹 권한은 `/api/v1/group-menu-permissions``/api/v1/groups/{id}/permissions` 일괄 갱신 엔드포인트로 관리한다. `group-menu-permissions` 응답의 `menu` 객체에는 `route_path`가 포함되며, `include=group` 쿼리로 그룹 요약을 함께 받을 수 있다.
- 그룹 권한은 `/api/v1/group-menu-permissions``/api/v1/groups/{id}/permissions` 일괄 갱신 엔드포인트로 관리한다. `group-menu-permissions` 응답의 `menu` 객체에는 `route_path`와 동일 값을 가진 `path`가 포함되며 각 항목은 `is_deleted`를 노출한다. `include=group,menu` 확장과 `include_deleted=true` 파라미터로 삭제 권한을 함께 조회할 수 있다.
- 우편번호 검색 `/api/v1/zipcodes`는 부분 일치 검색(`q`, `zipcode`, `road_name`)과 단건 조회를 제공한다.
---
@@ -17,6 +17,7 @@
## 1. 공통 규칙
- **URI 규칙:** 복수형 리소스 명 사용. 기본 경로 예) `/api/v1/vendors`.
- **표준 응답 구조:** 목록은 `{ items: [], page, page_size, total }`, 단건은 `{ data: { ... } }`.
- **헬스 체크:** `GET /health``{ status, build_version, error? }` 구조를 반환하며 `build_version` 값은 `config/default.toml``[app].build_version`에서 로딩된다. 원격 배포 시 `script/deploy_remote.sh`가 배포 아카이브 파일명에서 버전을 추출해 해당 값을 갱신한다.
- **시간대:** 모든 날짜·시간은 ISO8601 UTC 문자열.
- **소프트 삭제:** `DELETE /{res}/{id}` 호출 시 서버는 `is_deleted=true`, `is_active=false`로 처리하고 응답 바디는 `{ data: { id, deleted_at } }` 형식을 사용.
- **복구:** `POST /{res}/{id}/restore`.
@@ -34,6 +35,7 @@
- `409 CONFLICT` — 유니크 제약, 결재 단계 상태 충돌.
- `422 UNPROCESSABLE_ENTITY` — 비즈니스 규칙 위반(출고 고객 누락, blocking 상태 전이 등).
- 에러 응답 예: `{ "error": { "code": 422, "message": "출고 트랜잭션에는 고객이 최소 1건 필요합니다.", "details": [...] } }`.
- **CORS 정책:** 서버는 `config/default.toml``[cors]` 설정을 사용해 허용 오리진을 제어한다. `allowed_origins`가 비어 있으면 모든 오리진을 허용하고, 값에 `http://localhost` 또는 `https://web.example.com:*`처럼 포트 와일드카드(`:*`)를 포함하면 동적 포트 환경에서도 `Access-Control-Allow-Origin`이 요청 오리진과 동일하게 반환된다. 허용 오리진에 일치하지 않으면 `400 BAD_REQUEST`가 응답된다.
---
@@ -60,6 +62,7 @@
"total": 1
}
```
- `delta` 값은 전일 대비 증감률(비율)로 반환되며 `1.0`은 100% 증가, `-0.5`는 50% 감소를 의미한다. 값이 계산되지 않는 KPI는 `delta`를 생략한다.
### 2.2 단건 조회
`GET /{type}/{id}`
@@ -129,6 +132,8 @@
## 3. 마스터 데이터 API
리소스: `/vendors`, `/warehouses`, `/customers`, `/employees`, `/products`, `/menus`, `/groups`, `/zipcodes`
> 기본 정렬: 별도 `sort` 파라미터가 없으면 항상 `id` 오름차순으로 응답을 정렬한다. (`order` 기본값도 `asc`)
### 3.1 목록 조회
`GET /vendors?page=1&q=한빛`
```json
@@ -1120,6 +1125,7 @@
"approval_id": 5001,
"step_order": 1,
"approver_id": 21,
"status_id": 1,
"step_status_id": 1,
"status": {
"id": 1,
@@ -1137,6 +1143,7 @@
"approval_id": 5001,
"step_order": 2,
"approver_id": 34,
"status_id": 1,
"step_status_id": 1,
"status": {
"id": 1,
@@ -1152,6 +1159,7 @@
],
"approval": {
"id": 5001,
"transaction_no": "TXN-2025-0001",
"status": {
"id": 1,
"name": "대기",
@@ -1199,6 +1207,7 @@
"approval_id": 5001,
"step_order": 1,
"approver_id": 21,
"status_id": 1,
"step_status_id": 1,
"status": {
"id": 1,
@@ -1216,6 +1225,7 @@
"approval_id": 5001,
"step_order": 2,
"approver_id": 35,
"status_id": 1,
"step_status_id": 1,
"status": {
"id": 1,
@@ -1231,6 +1241,7 @@
],
"approval": {
"id": 5001,
"transaction_no": "TXN-2025-0001",
"status": {
"id": 1,
"name": "대기",
@@ -1263,6 +1274,7 @@
"data": {
"approval": {
"id": 5001,
"transaction_no": "TXN-2025-0001",
"status": {
"id": 2,
"name": "진행중",
@@ -1317,6 +1329,7 @@
"approval_id": 5001,
"step_order": 1,
"approver_id": 21,
"status_id": 2,
"step_status_id": 2,
"status": {
"id": 2,
@@ -1485,17 +1498,17 @@
### 5.10 단계 개별 CRUD
- `GET /approval-steps?approval_id=5001&include=approval,approver,status``{ items: [], page, page_size, total }` 형태로 반환하며, 각 항목은 `approval`, `approver`, `status` 서브 오브젝트를 선택적으로 포함한다.
- `GET /approval-steps/7001?include=approval,approver,status``{ data: { ... } }`.
- `POST /approval-steps` → 단일 단계를 생성하고 `{ data: { ... } }` 형태로 생성된 요약을 반환한다. `step_status_id`를 생략하면 자동으로 `대기` 상태가 지정된다.
- `POST /approval-steps` → 단일 단계를 생성하고 `{ data: { ... } }` 형태로 생성된 요약을 반환한다. `status_id`(구 버전 호환용 `step_status_id`)를 생략하면 자동으로 `대기` 상태가 지정된다.
- `PATCH /approval-steps/{id}` → 갱신된 단계 요약을 반환한다.
- `DELETE /approval-steps/{id}``{ data: { id, deleted_at } }`.
- `POST /approval-steps/{id}/restore``{ data: { id, restored_at } }`.
주요 필터 및 확장 파라미터:
- `approval_id`, `approval_step_id`, `approver_id`, `approval_action_id`
- `action_from`, `action_to` (ISO8601)
- `approval_id`, `approval_step_id`, `approver_id`, `approval_action_id`, `status_id`
- `q`(결재번호·승인자 검색), `action_from`, `action_to` (ISO8601)
- `sort=action_at|created_at|updated_at`, `order=asc|desc`
- `include` 기본값은 `approver,approval_action,from_status,to_status`; `approval`, `step` 토큰으로 확장
- `include` 기본값은 `approver,approval_action,from_status,to_status`; `approval`, `step`, `status` 토큰으로 확장
`GET /approval-histories/91001?include=approval,step`
```json