- 환경/라우터 모듈에 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
14 KiB
14 KiB
프런트엔드/백엔드 정합성 점검 리포트 (2025-10-21)
개요
- 기준 문서:
doc/backup/backend_change_requests.md와 최신 계약 문서(doc/stock_approval_system_api_v4.md)를 토대로 Flutter 프런트(superport_v2)와 Rust 백엔드(superport_api_v2) 구현을 재검증했다. - 백엔드 팀이 전달한 최신 패치(로그인/트랜잭션, 결재 단계, 대시보드·보고서, 권한)와
cargo test통과 결과를 반영해 실제 로그인 → 대시보드 → 재고/결재 → 보고서/권한 흐름을 다시 점검했다. - Approval Flow 전면 개편 합의를 위해 백엔드 작업 계획(
../superport_api_v2/doc/approval_flow_backend_task_plan.md)과 프런트 작업 계획(doc/approval_flow_frontend_task_plan.md)을 신규 작성했다.
주요 정합성 결과
| 구분 | 내용 | 결과 | 후속 조치 |
|---|---|---|---|
| 1 | 대여/출고 expected_return_date 저장·조회 |
✅ 해결 (backend/src/domain/stock_transactions.rs:274, backend/src/adapters/repositories/stock_transactions.rs:808) |
프런트 DTO·폼이 필드를 유지하는지 위젯 테스트로 확인 |
| 2 | 결재 단계 q·status_id 필터 및 status 응답 |
✅ 해결 (backend/src/domain/approval_steps.rs:31, backend/src/adapters/repositories/approval_steps.rs:162) |
검색/필터 UI와 리스트 표시가 새 계약(status)을 반영하는지 시나리오 테스트 필요 |
| 3 | 결재 단계 요청/응답 내 상태 필드 정규화 | ✅ 해결 (요청 status_id, 응답 status) |
프런트 DTO(lib/features/approvals/step/domain/entities/approval_step_input.dart:30)에서 레거시 step_status_id 제거 여부 확인 |
| 4 | 보고서 PDF 스트리밍·메타데이터 생성 | ✅ 해결 (backend/src/api/v1/reports.rs:94) |
ReportingRepositoryRemote가 스트림·파일명 메타 처리하는지 합동 점검 |
| 5 | 그룹-메뉴 권한 path·is_deleted·include_deleted |
✅ 해결 (backend/src/domain/group_menu_permissions.rs:149, backend/src/adapters/repositories/group_menu_permissions.rs:227) |
DTO/필터·권한 편집 UI가 추가 필드로 회귀 없는지 테스트 |
| 6 | 대시보드 KPI delta 전일 대비 비율 계산 |
✅ 해결 (backend/src/adapters/repositories/dashboard.rs:61) |
KPI 카드/차트가 백분율·부호 표시를 지원하는지 확인 |
| 7 | 사용자 요약(created_by, requester) 기본 노출 및 회귀 테스트 |
✅ 해결 (backend/src/domain/approval_templates.rs:34, backend/src/adapters/repositories/approval_templates.rs:100, backend/src/adapters/repositories/approvals.rs:878, backend/src/adapters/repositories/stock_transactions.rs:1173, backend/src/adapters/repositories/reports.rs:256) |
프런트 DTO가 사번(employee_id)·이름을 모두 반영하는지, 리스트/리포트 표시가 정상인지 검증 |
| 8 | Approval Flow v2: 트랜잭션 결재 구성 필수화 + /approval/* 엔드포인트 확장 |
🚧 진행중 (backend/src/domain/stock_transactions.rs:365, backend/src/domain/approvals/models.rs:583, backend/src/api/v1/approval_flow.rs:13) |
프런트 DTO/리포지토리 확장(lib/features/inventory/transactions/data/dtos/, lib/features/approvals/data/) 및 기능 토글 기반 UI 연동 필요 |
아래 섹션에서 영역별 관찰 내용과 프런트엔드 후속 작업을 정리했다.
로그인 & 세션
- 변경 없음: 로그인/세션 API는 기존 계약과 동일하며(
backend/src/api/v1/login.rs), 프런트AuthSessionDto매핑도 변동이 없다(lib/features/auth/data/dtos/auth_session_dto.dart:17). - 체크포인트: 세션 만료 401 처리 시 백엔드 토큰 갱신 로직은 유지되므로, 프런트 재시도/로그아웃 UX를 QA 체크리스트에 유지한다.
- 추가 확인:
POST /api/v1/auth/refresh오류 메시지가 문서 규격(token expired,token revoked,invalid token)으로 일치하는지 스테이징 로그로 검증한다. 메시지 표준화가 미완료인 경우Failure매퍼에서 임시 매핑을 추가해야 한다.
대시보드
- KPI
delta가 전일 대비 증감률(예:0.125→ 12.5%)로 채워지며(backend/src/adapters/repositories/dashboard.rs:61), 프런트는 % 포맷과 부호를 고려해 렌더링해야 한다(lib/features/dashboard/presentation/widgets/dashboard_kpi_card.dart). step_summary포맷이"2단계 / 승인자"에서"2단계 · 승인자"로 정규화됐다. 문자열을 그대로 노출하는 UI라면 디자인팀과 표시 규칙을 다시 합의한다.- 추가 활동: 대시보드 테스트에서
delta != null기준으로 동작하는 메트릭 뱃지/차트 회귀 여부를 확인한다.
재고·대여 트랜잭션
expected_return_date가 생성/수정/조회 전 흐름에 포함된다(backend/src/domain/stock_transactions.rs:274,backend/src/adapters/repositories/stock_transactions.rs:808). 프런트StockTransactionInput과RentalPage는 이미 필드를 전송하므로, 저장 후 상세/목록에서 값이 노출되는지 UI 테스트를 추가하면 된다(lib/features/inventory/rental/presentation/pages/rental_page.dart:1651).- 마이그레이션
migration/006_add_expected_return_date_to_stock_transactions.sql을 반드시 적용해야 하며, 로컬/스테이징 DB에 컬럼이 없으면 500 에러가 발생한다. DevOps와 일정 합의 후diesel migration run을 실행하고.envDB URL을 재확인한다. - 추가 확인: 고객 정보(
customers[].customer), 거래 라인 메모, 템플릿명 등 선택 필드가 null일 때 키가 빠지지 않는지 샘플 데이터를 확보해 양쪽 DTO 직렬화/역직렬화 테스트를 보강한다. - 최종 승인 완료 전에는 기본 입고/출고/대여 목록에서 전표가 숨겨져야 하므로, 프런트 목록/완료 카드에
status=draft|submitted필터를 추가하고 대기 전용 섹션을 제공한다.
결재 단계
- 목록 API가
q·status_id필터를 처리하고 응답에transaction_no를 포함한다(backend/src/adapters/repositories/approval_steps.rs:176). 프런트 검색 바(lib/features/approvals/step/presentation/controllers/approval_step_controller.dart)가 두 파라미터를 전달하는지, 리스트에서 거래번호를 표시하는지 확인한다. - 도메인이
status구조체({ id, name, code })를 반환한다(backend/src/domain/approval_steps.rs:84). 프런트 DTO는status_id입력과status응답을 모두 지원해야 하므로, 레거시 필드 제거와 단위 테스트(test/features/approvals/step/domain/) 성공 여부를 점검한다. - 컨트롤러/위젯 테스트: 필터링, 상태 변경, 거래번호 표시 흐름을 추가해 회귀를 방지한다.
- 추가 확인:
histories[].action에 레거시 데이터가 들어오는 경우(id,name누락) 프런트가 안전하게 폴백 문자열을 표시하는지, 백엔드는 해당 케이스를 데이터 정제 로직으로 보완할지 정한다. - 열람 권한은 상신자와 이미 결재한 승인자에게만 부여된다. 단계 미도달 승인자는 목록/상세 접근 시 403 처리되므로, 프런트
ApprovalDetailPage·MyApprovals에서 숨김/권한 안내 토스트를 구현하고 최종 승인 대기 상태에서도 상신자·중간 승인자만 접근 가능하도록 필터링한다.
Approval Flow v2
- 입·출·대여 생성 요청에
approval블록이 필수(backend/src/domain/stock_transactions.rs:365)이며,approval.config는 템플릿(template_id) 또는 직접 지정 단계(steps[]) 중 하나가 존재해야 한다(backend/src/domain/stock_transactions.rs:384). 프런트 입력모델(lib/features/inventory/transactions/domain/entities/stock_transaction_input.dart:1)은approval을 선택이 아닌 필수 값으로 승격하고, 최소 1단계 + 최종 승인자 검증을 위젯 레벨에서 선반영해야 한다. - 트랜잭션 목록 기본 필터는 승인 완료 건만 노출하고
include_pending파라미터를 명시해야 대기/초안이 반환된다(backend/src/domain/stock_transactions.rs:29,backend/src/domain/stock_transactions.rs:178). 프런트 리스트 필터(lib/features/inventory/transactions/domain/entities/stock_transaction_input.dart:158)와 대시보드 카드가 새 파라미터를 전달하도록 조정하고, 결재 대기 전표 전용 섹션을 기능 토글(feature.approval_flow_v2)로 가드한다. - 결재 제출·재상신 엔드포인트는
ApprovalSubmitRequest/ApprovalResubmitRequest를 사용하며 전 단계 배열을 전송해야 한다(backend/src/domain/approvals/models.rs:583,backend/src/api/v1/approval_flow.rs:13). 프런트는ApprovalRequestDto·ApprovalStepDto·ApprovalAuditDto신설 후ApprovalRepositoryRemote를 통해/approval/submit|resubmit호출 시 단계 순번·승인자 ID를 직렬화한다. - 승인/반려/회수 액션은
actor_id가 세션 사용자와 일치해야 하고 옵티미스틱 잠금(expected_updated_at,transaction_expected_updated_at)을 요구한다(backend/src/domain/approvals/models.rs:624,backend/src/domain/approvals/models.rs:634). 프런트 컨트롤러(lib/features/approvals/presentation/controllers/approval_history_controller.dart)는 서버 응답의approval.updated_at을 저장해 재전송 시 파라미터로 포함해야 충돌 409를 피할 수 있다. - 결재 상세 응답은
current_step,steps[].status.is_blocking_next,histories[].action_code를 포함하며 비허용 사용자에게는APPROVAL_ACCESS_DENIED가 반환된다(doc/stock_approval_system_api_v4.md:1011,backend/src/api/v1/approval_flow.rs:42). DTO 파서(lib/features/approvals/data/dtos/approval_dto.dart)에서 새 서브 객체를 맵핑하고, 403 수신 시 접근 제한 안내를 표준 토스트로 노출한다. - 프런트 데이터 계층에
ApprovalSubmissionInput/ApprovalDecisionInput/ApprovalRecallInput/ApprovalResubmissionInput을 추가하고,ApprovalRepositoryRemote.submit|approve|reject|recall|resubmit|listHistory메서드를 신규 엔드포인트(/approval/submit,/approval/approve,/approval/reject,/approval/recall,/approval/resubmit,/approval/history)에 맞춰 구현했다. (lib/features/approvals/domain/entities/approval.dart,lib/features/approvals/data/repositories/approval_repository_remote.dart, 2025-10-29) — 기존create/update/assignSteps경로는 레거시 호환을 위해 유지하되, F2 단계에서 컨트롤러/유즈케이스를 새 흐름으로 전환할 예정이다.
보고서 (PDF)
- 백엔드가 PDF를 스트리밍으로 내려주고 파일명·Content-Length·ETag를 헤더에 포함한다(
backend/src/api/v1/reports.rs:94). 프런트ReportingRepositoryRemote는StreamedResponse처리를 유지하되, 새 메타데이터(report_name,generated_at)로 다운로드 UI를 업데이트한다(lib/features/reporting/presentation/controllers/reporting_controller.dart). - 단위 테스트(
backend/tests/api_reports_pdf.rs)가 계약을 고정하고 있으므로, 프런트에서도 PDF 다운로드 및 실패 경로(404/500 등)를 위젯 테스트에 반영한다. - 추가 확인: PDF 다운로드 요청이 감사 로그에 기록되는지 스테이징에서 확인하고, 정책상 필요 시 프런트 다운로드 성공/실패 토스트에 감사 로그 연동 여부를 표시한다.
권한/문서
- 그룹-메뉴 권한 API가
include_deleted=true시 삭제 항목을 함께 반환하고 각 항목에path,is_deleted가 포함된다(backend/src/domain/group_menu_permissions.rs:149). 프런트 DTO(lib/features/masters/group_permission/data/dtos/group_permission_dto.dart:49)와 편집 UI가 새 필드를 사용하는지 확인한다. doc/stock_approval_system_api_v4.md가 갱신됐으므로, 프런트 문서는tool/sync_stock_docs.sh로 재동기화한다.- 추가 확인: 그룹-메뉴 배치 업데이트 API가 변경 이력을 남기는지 백엔드 로그로 점검하고, 프런트 편집 시 이력 누락에 대비한 사용자 안내를 준비한다.
공동 액션 아이템
| 구분 | 작업 내용 | 담당 | 상태 | 비고 |
|---|---|---|---|---|
| DB | 006_add_expected_return_date_to_stock_transactions.sql 적용 확인 |
백엔드 | 진행 예정 | 스테이징 DB 스키마 점검 후 공유 |
| 결재 | 단계 검색(q, status_id)·거래번호 노출 통합 테스트 |
프런트/백엔드 | 준비 | 계약 데이터 샘플 확보 필요 |
| 결재 | histories.action 레거시 데이터 폴백 처리 협의 |
프런트/백엔드 | 준비 | 데이터 정제 vs UI 폴백 선택 |
| 결재 | 열람 권한/대기 전표 노출 제한 구현 (draft,submitted 접근 제어) |
프런트/백엔드 | 준비 | API 403/필터 명세 동기화 |
| 보고서 | Approvals/Transactions PDF 스트리밍 합동 점검 | 프런트/백엔드 | 준비 | 대용량 파일·감사 로그 확인 |
| 보고서 | 감사 로그 정책 준수 여부 재확인 | 백엔드 | 준비 | 정책 준수 결과 문서화 |
| 결재 | Approval Flow 작업 계획 상호 공유(doc/approval_flow_frontend_task_plan.md) |
프런트/백엔드 | 완료 | 백엔드 문서(../superport_api_v2/doc/approval_flow_backend_task_plan.md)와 동기화 |
| QA | flutter analyze, flutter test --coverage 회귀 실행 후 공유 |
프런트 | 준비 | DTO/테스트 수정 후 notify.py 발송 |
| QA | cargo test + 통합 시나리오 스크립트 재실행 |
백엔드 | 준비 | 보고서/결재 단계 회귀 포함 |
테스트 & 다음 단계
- Approval Flow 개선 과제는
doc/approval_flow_frontend_task_plan.md를 기준으로 우선순위를 재정정하고 백엔드 진행 상황과 주별 체크인을 맞춘다. - 백엔드
cargo test통과 보고가 공유됐지만, 프런트 QA 관점에서는 다음을 진행한다.- 새 마이그레이션(
006_add_expected_return_date_to_stock_transactions.sql) 적용 → 스테이징 DB 반영 상태 확인. - 결재 단계 검색(
q,status_id), 거래번호 노출, 결재 열람 권한 제한, 보고서 PDF 다운로드를 프런트/백엔드 합동 점검. flutter analyze,flutter test --coverage로 DTO·테스트 변경 이후 회귀 여부 확인.
- 새 마이그레이션(
- 모든 작업을 마치면
notify.py워크플로를 통해 완료 알림을 발송한다.