Files
superport_v2/test/fixtures/approvals/approval_five_step_pending.json
JiWoong Sul d76f765814 feat(approvals): Approval Flow v2 프런트엔드 전면 개편
- 환경/라우터 모듈에 approval_flow_v2 토글을 추가하고 FeatureFlags 초기화를 연결 (.env*, lib/core/**)
- ApiClient 빌더·ApiRoutes 확장과 ApprovalRepositoryRemote 리팩터링으로 include·액션 시그니처를 정합화
- ApprovalFlow·ApprovalDraft 엔티티/레포/유즈케이스를 도입해 서버 초안과 단계 액션(승인·회수·재상신)을 지원
- Approval 컨트롤러·히스토리·템플릿 페이지와 공유 위젯을 재작성해 감사 로그·회수 UX·템플릿 CRUD를 반영
- Inbound/Outbound/Rental 컨트롤러·페이지에 결재 섹션을 삽입하고 대시보드 pending 카드 요약을 갱신
- SuperportDialog·FormField 등 공통 위젯을 보강하고 승인 위젯 가이드를 추가해 UI 가이드를 정리
- 결재/재고 테스트 픽스처와 단위·위젯·통합 테스트를 확장하고 flutter_test_config로 스테이징 호스트를 허용
- Approval Flow 레포트/플랜 문서를 업데이트하고 ApprovalFlow_System_Integration_and_ChangePlan.md를 추가
- 실행: flutter analyze, flutter test
2025-10-31 01:05:39 +09:00

238 lines
5.1 KiB
JSON

{
"id": 51001,
"approval_no": "APP-202511100201",
"transaction": {
"id": 91001,
"transaction_no": "IN-20251110-0001"
},
"status": {
"id": 2,
"name": "진행중",
"color": "#3B82F6",
"is_blocking_next": true,
"is_terminal": false
},
"current_step": {
"id": 72003,
"step_order": 3,
"status": {
"id": 2,
"name": "진행중",
"is_blocking_next": true,
"is_terminal": false
},
"approver": {
"id": 104,
"employee_id": "E20250104",
"employee_no": "E20250104",
"name": "박팀장"
},
"assigned_at": "2025-09-18T07:10:00Z",
"decided_at": null,
"note": null
},
"requester": {
"id": 77,
"employee_id": "E20250077",
"employee_no": "E20250077",
"name": "김상신"
},
"requested_at": "2025-09-18T06:55:00Z",
"decided_at": null,
"note": "입고 5단계 결재",
"is_active": true,
"is_deleted": false,
"steps": [
{
"id": 72001,
"step_order": 1,
"status": {
"id": 3,
"name": "승인",
"is_blocking_next": false,
"is_terminal": false
},
"approver": {
"id": 101,
"employee_id": "E20250101",
"employee_no": "E20250101",
"name": "이검토"
},
"assigned_at": "2025-09-18T06:58:00Z",
"decided_at": "2025-09-18T06:59:30Z",
"note": "조건부 승인"
},
{
"id": 72002,
"step_order": 2,
"status": {
"id": 3,
"name": "승인",
"is_blocking_next": false,
"is_terminal": false
},
"approver": {
"id": 102,
"employee_id": "E20250102",
"employee_no": "E20250102",
"name": "최검수"
},
"assigned_at": "2025-09-18T07:00:00Z",
"decided_at": "2025-09-18T07:04:10Z",
"note": null
},
{
"id": 72003,
"step_order": 3,
"status": {
"id": 2,
"name": "진행중",
"is_blocking_next": true,
"is_terminal": false
},
"approver": {
"id": 104,
"employee_id": "E20250104",
"employee_no": "E20250104",
"name": "박팀장"
},
"assigned_at": "2025-09-18T07:10:00Z",
"decided_at": null,
"note": null
},
{
"id": 72004,
"step_order": 4,
"status": {
"id": 1,
"name": "대기",
"is_blocking_next": true,
"is_terminal": false
},
"approver": {
"id": 105,
"employee_id": "E20250105",
"employee_no": "E20250105",
"name": "정차장"
},
"assigned_at": "2025-09-18T07:10:00Z",
"decided_at": null,
"note": null
},
{
"id": 72005,
"step_order": 5,
"status": {
"id": 1,
"name": "대기",
"is_blocking_next": true,
"is_terminal": false
},
"approver": {
"id": 201,
"employee_id": "E20250201",
"employee_no": "E20250201",
"name": "한임원"
},
"assigned_at": "2025-09-18T07:10:00Z",
"decided_at": null,
"note": null
}
],
"histories": [
{
"id": 93001,
"action": {
"id": 1,
"name": "상신"
},
"from_status": null,
"to_status": {
"id": 1,
"name": "대기",
"is_blocking_next": true,
"is_terminal": false
},
"approver": {
"id": 77,
"employee_id": "E20250077",
"employee_no": "E20250077",
"name": "김상신"
},
"action_at": "2025-09-18T06:55:00Z",
"note": null
},
{
"id": 93002,
"action": {
"id": 2,
"name": "승인"
},
"from_status": {
"id": 1,
"name": "대기",
"is_blocking_next": true,
"is_terminal": false
},
"to_status": {
"id": 3,
"name": "승인",
"is_blocking_next": false,
"is_terminal": false
},
"approver": {
"id": 101,
"employee_id": "E20250101",
"employee_no": "E20250101",
"name": "이검토"
},
"action_at": "2025-09-18T06:59:30Z",
"note": "조건 수용"
},
{
"id": 93003,
"action": {
"id": 2,
"name": "승인"
},
"from_status": {
"id": 1,
"name": "대기",
"is_blocking_next": true,
"is_terminal": false
},
"to_status": {
"id": 3,
"name": "승인",
"is_blocking_next": false,
"is_terminal": false
},
"approver": {
"id": 102,
"employee_id": "E20250102",
"employee_no": "E20250102",
"name": "최검수"
},
"action_at": "2025-09-18T07:04:10Z",
"note": null
}
],
"created_at": "2025-09-18T06:55:00Z",
"updated_at": "2025-09-18T07:10:00Z",
"visibility": {
"allowed_roles": [
"requester",
"completed_approver"
],
"restricted_roles": [
"pending_approver",
"external"
]
},
"permissions": {
"can_recall": true,
"can_resubmit": false,
"can_comment": true
}
}