feat: 승인·감사 워크플로우 구현 - #37
Merged
Merged
Conversation
This was referenced Jul 23, 2026
Contributor
Author
|
리뷰 전에 확인할 마지막 보완사항입니다.
따라서 화면 값을 조작해 |
chaeliki
requested changes
Jul 23, 2026
chaeliki
left a comment
Contributor
There was a problem hiding this comment.
V3 관련해서 조율이 필요할 것 같습니다.
일단 저도 PR 드래프트 올려두고 자러가겠습니다..!! 수고많으셨어요!!
18 tasks
승인 스냅샷, 외부 제출, 증빙, 감사 이벤트를 V5 마이그레이션과 JPA 저장소로 구성합니다. 사업장 범위 외래키와 상태·버전 제약을 추가하고 감사 이벤트는 일반 수정·삭제 경로 없이 append 방식으로만 기록합니다.
승인 요청·승인·반려·외부 제출·증빙·완료 command를 상태 전이와 같은 transaction에서 처리합니다. 민감정보를 차단하는 snapshot 검증과 fingerprint, request/trace 감사 기록, 사업장 범위 활동 이력과 ADMIN cursor 검색 API를 추가합니다.
JPA 동시성 version과 승인 대상 내용의 content_revision을 분리합니다. 승인은 content revision과 핵심값 fingerprint가 모두 일치할 때만 재사용하고, 중요값 변경 시 revision을 증가시켜 기존 승인을 무효화합니다. ADR-0003에 맞춰 외부 제출과 완료의 허용 상태도 보정합니다.
요청·응답 필드를 명시적인 snake_case 계약으로 고정하고 보호 API의 401·403 및 409·422 오류를 OpenAPI에 문서화합니다. Task 상태 전이와 동시성 오류 코드를 Accepted ADR의 안정적인 코드로 통일합니다.
정상 승인·반려 기반 상태 전이, 민감정보 유입 시 transaction rollback, 역할·사업장 격리, stale version, cursor pagination을 HTTP 통합 테스트로 검증합니다. PostgreSQL migration 계약에도 Worker·Task·Approval·Audit schema와 tenant-aware FK를 추가합니다.
현재 구현 API와 migration 목록을 갱신하고 승인 snapshot, version·revision 구분, 역할·감사 조회 규칙을 초보자도 따라갈 수 있게 설명합니다.
반려된 승인 요청의 재사용 차단, 외부 제출 reference 누락 시 상태 보존, 감사 이벤트 저장 실패 시 Task·Approval·전이 이력 전체 rollback을 통합 테스트합니다.
동일 Task version에 대한 두 승인 요청을 동시에 실행해 하나만 성공하고 다른 요청은 409로 차단되며 승인·감사 기록도 하나만 남는지 반복 검증합니다.
PostgreSQL migration 계약 테스트의 Task INSERT에 필수 created_at·updated_at을 명시해 실제 V4 NOT NULL 제약과 일치시킵니다.
Client가 requirements_satisfied 값을 보내는 계약을 제거하고 Task 상태와 미완료 필수 체크리스트를 서버가 직접 조회해 승인 검토 가능 여부를 판단합니다. 필수 체크리스트가 남은 Task는 승인 요청·상태 전이·감사 기록이 생성되지 않는 통합 테스트를 추가합니다.
hywznn
force-pushed
the
agent/11-approval-audit
branch
from
July 24, 2026 02:16
00e7f38 to
8e1f8a5
Compare
chaeliki
approved these changes
Jul 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
왜 필요한가요?
Closes #11
Refs #5, #6, #23
AI가 만든 업무를 사람 승인 없이 전달하지 않고, 승인 시점의 내용과 이후 상태 변경을 사업장 범위 안에서 추적하기 위한 기반입니다.
Worker·Document 스키마는 병합된 PR #40의 canonical V3를 사용합니다. 이 PR은 Task·Approval이 소유하는 V4·V5만 추가합니다.
무엇이 바뀌나요?
DRAFT → READY_FOR_REVIEW → APPROVED → WAITING_EXTERNAL → COMPLETED상태 guardversion과 승인 대상content_revision + fingerprint분리409 CONCURRENT_MODIFICATION반환#40 Worker 계약 반영
V3__create_worker_core.sql제거work_status,stay_expiry_date,nationality_code,RESIGNED계약 반영(worker_id, company_id)tenant-aware FK 유지대표 API
POST /api/v1/tasks/{taskId}/approval-requestsPOST /api/v1/tasks/{taskId}/approvePOST /api/v1/tasks/{taskId}/rejectPOST /api/v1/tasks/{taskId}/external-submissionsPOST /api/v1/tasks/{taskId}/evidencePOST /api/v1/tasks/{taskId}/completeGET /api/v1/tasks/{taskId}/activitiesGET /api/v1/audit-events검증
./gradlew clean testTest and build통과ADR·저장소 경계
/api/v1, JWT company scope, 공통 오류, 404 tenant hiding, optimistic concurrency를 따릅니다.version·content_revision·fingerprint를 각각 사용합니다.리뷰에서 중점 확인할 부분
ADMIN/HR/VIEWER와 company scope가 API·application 양쪽에 적용됐는지