Files
sam-docs/sam/docs/features/approvals/README.md
김보곤 490477421d docs: [approvals] 결재관리 시스템 문서 4종 작성
- README.md: 시스템 개요, 아키텍처, DB 스키마, 상태 관리, 권한 매트릭스
- workflows.md: 워크플로우 상세 (승인/반려/회수/보류/전결/복사재기안)
- api-reference.md: API 엔드포인트 20개 명세
- ui-screens.md: UI 화면 구성 및 인터랙션
- INDEX.md에 결재관리 문서 등록
2026-02-28 00:09:08 +09:00

12 KiB

결재관리 시스템

작성일: 2026-02-28 상태: Phase 2 구현 완료 프로젝트: SAM MNG (관리자 웹) 우선순위: 🔴 필수


1. 개요

1.1 목적

SAM MNG 전자결재 시스템. 기안부터 최종 승인, 반려, 회수, 보류, 전결, 참조까지 기업 결재 프로세스를 디지털화한다.

1.2 문서 구조

문서 설명
README.md (이 문서) 시스템 전체 개요, 아키텍처, 상태 관리
workflows.md 상세 워크플로우 (승인/반려/회수/보류/전결/복사재기안)
api-reference.md API 엔드포인트 명세
ui-screens.md 화면별 UI 구성 및 동작

1.3 구현 현황

Phase 범위 상태
Phase 1 순차결재, 기안/상신/승인/반려/회수 완료
Phase 2 보류/해제, 전결, 참조 열람 추적, 복사 재기안 완료
Phase 3 병렬결재, 위임(대결), 알림 미착수
Phase 4 ERP 연동, 결재 통계, 관리자 설정 미착수

2. 아키텍처

2.1 기술 스택

계층 기술 설명
Blade + HTMX + Alpine.js 동적 UI, 부분 렌더링
API Laravel Controller + Service JSON API (내부용)
모델 Eloquent ORM Multi-tenant 스코프
DB MySQL 8.0 API 프로젝트에서 마이그레이션 관리

2.2 프로젝트 분리

API (/home/aweso/sam/api)
├── database/migrations/    ← 모든 결재 테이블 마이그레이션

MNG (/home/aweso/sam/mng)
├── app/Models/Approvals/   ← 모델 (Approval, ApprovalStep, ApprovalForm, ApprovalLine, ApprovalDelegation)
├── app/Services/           ← ApprovalService (비즈니스 로직)
├── app/Http/Controllers/   ← ApprovalController (웹), ApprovalApiController (API)
├── resources/views/approvals/ ← Blade 뷰
└── routes/                 ← 웹 라우트 + API 라우트

2.3 핵심 클래스

ApprovalService
├── 목록 조회: getMyDrafts(), getPendingForMe(), getCompletedByMe(), getReferencesForMe()
├── CRUD: createApproval(), updateApproval(), deleteApproval(), getApproval()
├── 워크플로우: submit(), approve(), reject(), cancel(), hold(), releaseHold(), preDecide(), copyForRedraft()
├── 참조: markAsRead()
└── 유틸: getBadgeCounts(), getApprovalLines(), getApprovalForms(), saveApprovalSteps()

3. 데이터베이스

3.1 테이블 관계

approval_forms (결재 양식)
    │ 1:N
    ▼
approvals (결재 문서)
    │ 1:N                      │ N:1 (self)
    ▼                          ▼
approval_steps (결재 단계)     approvals (parent_doc_id → 원본 문서)

approval_lines (결재선 템플릿) ← approvals.line_id 참조

approval_delegations (위임 설정) ← Phase 3 준비

3.2 approvals (결재 문서)

컬럼 타입 설명
id BIGINT PK
tenant_id BIGINT 테넌트 격리
document_number VARCHAR APR-YYMMDD-001 형식
form_id BIGINT FK 양식
line_id BIGINT FK NULL 결재선 템플릿
title VARCHAR(200) 제목
content JSON 양식 필드 데이터
body TEXT NULL 본문
status VARCHAR(20) 문서 상태 (6가지)
is_urgent BOOLEAN 긴급 여부
drafter_id BIGINT FK 기안자
department_id BIGINT FK NULL 기안 부서
current_step INT 현재 결재 단계 번호
drafted_at TIMESTAMP NULL 상신 일시
completed_at TIMESTAMP NULL 완료 일시
recall_reason TEXT NULL 회수 사유
parent_doc_id BIGINT FK NULL 재기안 원본 문서
attachments JSON NULL 첨부파일

3.3 approval_steps (결재 단계)

컬럼 타입 설명
id BIGINT PK
approval_id BIGINT FK 결재 문서
step_order INT 순서 (1, 2, 3...)
step_type VARCHAR approval, agreement, reference
parallel_group INT NULL 병렬 그룹 (Phase 3)
approver_id BIGINT FK 결재자
acted_by BIGINT FK NULL 실제 처리자 (대결 시)
approver_name VARCHAR 결재자명 스냅샷
approver_department VARCHAR 부서 스냅샷
approver_position VARCHAR 직급 스냅샷
status VARCHAR(20) 단계 상태 (5가지)
approval_type VARCHAR(20) normal, pre_decided, delegated
comment TEXT NULL 결재 의견
acted_at TIMESTAMP NULL 처리 일시
is_read BOOLEAN 참조 열람 여부
read_at TIMESTAMP NULL 열람 일시

3.4 approval_delegations (위임 설정, Phase 3)

컬럼 타입 설명
id BIGINT PK
tenant_id BIGINT FK
delegator_id BIGINT FK 위임자
delegate_id BIGINT FK 대리인
start_date DATE 위임 시작일
end_date DATE 위임 종료일
form_ids JSON NULL 대상 양식 (NULL=전체)
notify_delegator BOOLEAN 대결 시 보고 여부
is_active BOOLEAN 활성 여부
reason VARCHAR(200) 위임 사유

4. 상태 관리

4.1 문서 상태 (6가지)

상태 코드 라벨 색상 설명
임시저장 draft 임시저장 gray 작성 중, 미상신
진행 pending 진행 blue 결재선 순환 중
완료 approved 완료 green 최종 승인
반려 rejected 반려 red 결재자가 반려
회수 cancelled 회수 yellow 기안자가 회수
보류 on_hold 보류 amber 결재자가 보류

4.2 단계 상태 (5가지)

상태 코드 라벨 아이콘 설명
대기 pending 대기 숫자 차례 아직 아님
승인 approved 승인 ✓ (녹색) 승인 완료
반려 rejected 반려 ✗ (적색) 반려
건너뜀 skipped 건너뜀 — (회색) 전결/회수로 소멸
보류 on_hold 보류 ⏸ (노란) 보류 중

4.3 결재 유형 (approval_type)

유형 코드 아이콘 설명
일반결재 normal 기본 승인
전결 pre_decided (남색) 이후 단계 모두 건너뛰고 즉시 완료
대결 delegated 대리인이 처리 (Phase 3)

4.4 참여자 역할 (step_type)

역할 코드 의사결정 설명
결재 approval 있음 승인/반려/보류/전결 가능
합의 agreement 있음 타부서 동의 (승인/반려 가능)
참조 reference 없음 열람만 가능, 열람 추적

4.5 상태 전이 다이어그램

                         ┌─────────────────────────────┐
                         │                             │
 ┌────────┐   submit()  │  ┌─────────┐                │
 │ draft  │────────────→│  │ pending │                │
 └────────┘              │  └────┬────┘                │
     ▲                   │       │                     │
     │                   │  ┌────┼─────────┬───────┐   │
     │ (수정 후 재상신)    │  │    │         │       │   │
     │                   │  │ approve() reject() hold()│
     │                   │  │    │         │       │   │
     │                   │  │    ▼         ▼       ▼   │
     │                   │  │ 다음 step  rejected on_hold│
     │                   │  │  또는       │       │   │
     │                   │  │ approved    │  releaseHold()
     │                   │  │    │        │       │   │
     │                   │  │    │        │       │   │
     │                   │  └────┼────────┼───────┘   │
     │                   │       │        │           │
     │                   │  preDecide()   │           │
     │                   │    → approved  │           │
     │                   │       │        │  cancel() │
     │                   │       │        │     │     │
     │                   │       ▼        │     ▼     │
     │                   │  ┌─────────┐   │ ┌──────────┐
     │                   │  │approved │   │ │cancelled │
     │                   │  └─────────┘   │ └──────────┘
     │                   │       │        │      │
     │                   │       │        │      │
     │                   │  copyForRedraft()     │
     │                   │       │        │      │
     └───────────────────┼───────┴────────┘      │
          (새 draft 생성) │                       │
                         │  copyForRedraft()      │
                         │◀──────────────────────┘
                         └─────────────────────────────┘

5. 권한 매트릭스

5.1 누가 무엇을 할 수 있는가

액션 대상자 조건
기안 작성 모든 사용자
수정 기안자 draft 또는 rejected
삭제 기안자 draft
상신 기안자 draft 또는 rejected, 결재선 1명 이상
승인 현재 결재자 pending, 자신이 현재 차례
반려 현재 결재자 pending, 사유 필수
보류 현재 결재자 pending, 사유 필수
보류 해제 보류한 결재자 on_hold, 자신이 보류한 건
전결 현재 결재자 pending, 이후 모든 단계 건너뜀
회수 기안자 pending 또는 on_hold, 첫 결재자 미처리
복사 재기안 기안자 approved, rejected, cancelled
참조 열람 참조자 reference step 보유

5.2 회수 가능 조건 상세

회수(cancel) 가능 여부 판단:

1. 문서 상태가 pending 또는 on_hold인가? → 아니면 불가
2. 요청자가 기안자(drafter_id)인가? → 아니면 불가
3. 첫 번째 결재자(approval/agreement)의 상태가 pending 또는 on_hold인가?
   → 이미 approved/rejected이면 불가 (첫 결재자가 이미 처리)

6. 메뉴 구조

결재관리
├── 기안함          /approval-mgmt/drafts       ← 내가 기안한 문서
├── 결재 대기함     /approval-mgmt/pending      ← 내가 결재해야 할 문서
├── 처리 완료함     /approval-mgmt/completed    ← 내가 결재한 문서
└── 참조함          /approval-mgmt/references   ← 참조 문서 (열람 추적)

추가 페이지

URL 설명
/approval-mgmt/create 기안 작성
/approval-mgmt/{id} 상세 조회
/approval-mgmt/{id}/edit 기안 수정

7. 관련 문서


최종 업데이트: 2026-02-28