578 lines
18 KiB
Markdown
578 lines
18 KiB
Markdown
|
|
# Dashboard API 연동 개발 계획
|
|||
|
|
|
|||
|
|
> **작성일**: 2026-01-20
|
|||
|
|
> **목적**: CEO Dashboard 페이지의 목업 데이터 → 실제 API 연동
|
|||
|
|
> **Serena ID**: dashboard-api-state
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📍 현재 상태 요약
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 전체 진행률: 45% (5/11 섹션 완료) │
|
|||
|
|
├─────────────────────────────────────────────────────────────────┤
|
|||
|
|
│ ✅ Phase 1 완료 - 기존 API 연동 (프론트엔드) │
|
|||
|
|
│ ⏳ Phase 2 대기 - 신규 API 개발 필요 (백엔드) │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| 구분 | 섹션 | 데이터 소스 | 상태 |
|
|||
|
|
|:---:|------|:----------:|:----:|
|
|||
|
|
| Phase 1 | 일일 일보 (DailyReport) | API | ✅ |
|
|||
|
|
| Phase 1 | 미수금 현황 (Receivable) | API | ✅ |
|
|||
|
|
| Phase 1 | 채권추심 현황 (DebtCollection) | API | ✅ |
|
|||
|
|
| Phase 1 | 당월 예상 지출 (MonthlyExpense) | API | ✅ |
|
|||
|
|
| Phase 1 | 카드/가지급금 관리 (CardManagement) | API | ✅ |
|
|||
|
|
| **Phase 2** | **오늘의 이슈 (TodayIssue)** | mockData | ⏳ |
|
|||
|
|
| **Phase 2** | **현황판 (StatusBoard)** | mockData | ⏳ |
|
|||
|
|
| **Phase 2** | **접대비 현황 (Entertainment)** | mockData | ⏳ |
|
|||
|
|
| **Phase 2** | **복리후생비 현황 (Welfare)** | mockData | ⏳ |
|
|||
|
|
| **Phase 2** | **부가세 현황 (Vat)** | mockData | ⏳ |
|
|||
|
|
| **Phase 2** | **캘린더 (Calendar)** | mockData | ⏳ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Phase 1 완료 내역
|
|||
|
|
|
|||
|
|
### 생성된 파일
|
|||
|
|
|
|||
|
|
| 파일 | 설명 |
|
|||
|
|
|------|------|
|
|||
|
|
| `react/src/lib/api/dashboard/types.ts` | API 응답 타입 정의 (5개 엔드포인트) |
|
|||
|
|
| `react/src/lib/api/dashboard/transformers.ts` | API → Frontend 변환 함수 + CheckPoint 생성 |
|
|||
|
|
| `react/src/hooks/useCEODashboard.ts` | 통합 Dashboard Hook (병렬 API 호출) |
|
|||
|
|
| `react/src/lib/api/dashboard/index.ts` | 모듈 export |
|
|||
|
|
|
|||
|
|
### 수정된 파일
|
|||
|
|
|
|||
|
|
| 파일 | 변경 내용 |
|
|||
|
|
|------|----------|
|
|||
|
|
| `CEODashboard.tsx` | `useCEODashboard` Hook 연동, mockData fallback 패턴 |
|
|||
|
|
|
|||
|
|
### 연동된 API 엔드포인트
|
|||
|
|
|
|||
|
|
| 섹션 | 프론트 호출 경로 | 백엔드 실제 경로 |
|
|||
|
|
|------|-----------------|-----------------|
|
|||
|
|
| DailyReport | `/api/proxy/daily-report/summary` | `DailyReportService::summary()` |
|
|||
|
|
| Receivable | `/api/proxy/receivables/summary` | `ReceivablesService::summary()` |
|
|||
|
|
| DebtCollection | `/api/proxy/bad-debts/summary` | `BadDebtService::summary()` |
|
|||
|
|
| MonthlyExpense | `/api/proxy/expected-expenses/summary` | `ExpectedExpenseService::summary()` |
|
|||
|
|
| CardManagement | `/api/proxy/card-transactions/summary` | `CardTransactionService::summary()` |
|
|||
|
|
|
|||
|
|
### API 불일치 사항 (fallback 처리)
|
|||
|
|
|
|||
|
|
| 섹션 | 이슈 | 처리 방식 |
|
|||
|
|
|------|------|----------|
|
|||
|
|
| MonthlyExpense | `by_transaction_type` 필드로 제공 | purchase/card/bill 키로 분류 |
|
|||
|
|
| CardManagement | 가지급금, 법인세 예상 가중 등 미제공 | mockData fallback 사용 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Phase 2 개발 계획 (신규 API 필요)
|
|||
|
|
|
|||
|
|
### 2.1 오늘의 이슈 (TodayIssue)
|
|||
|
|
|
|||
|
|
#### 기능 설명
|
|||
|
|
|
|||
|
|
대시보드 상단에 표시되는 실시간 이벤트 목록. 각 이벤트는 뱃지, 내용, 시간, 관련 페이지 링크로 구성.
|
|||
|
|
|
|||
|
|
#### 현재 mockData 구조
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
todayIssueList: [
|
|||
|
|
{
|
|||
|
|
id: string,
|
|||
|
|
badge: string, // "수주 성공", "주식 이슈", "직정 제고", "세금 신고", "결재 요청", "기타"
|
|||
|
|
content: string, // "A전자 신규 수주 450,000,000원 확정"
|
|||
|
|
time: string, // "10분 전", "1시간 전", "어제"
|
|||
|
|
date: string, // "2026-01-16"
|
|||
|
|
needsApproval: boolean, // 결재 필요 여부
|
|||
|
|
path: string // 관련 페이지 경로
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 개발 방향 제안
|
|||
|
|
|
|||
|
|
**방향 A: 통합 이벤트 테이블 신규 생성**
|
|||
|
|
|
|||
|
|
| 장점 | 단점 |
|
|||
|
|
|------|------|
|
|||
|
|
| 단일 API로 모든 이슈 조회 가능 | 신규 테이블 설계 필요 |
|
|||
|
|
| 이벤트 타입별 필터링 용이 | 각 도메인에서 이벤트 생성 로직 추가 필요 |
|
|||
|
|
| 확장성 좋음 | 실시간성 유지를 위한 트리거/큐 필요 |
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
테이블: dashboard_events
|
|||
|
|
- id, tenant_id
|
|||
|
|
- event_type: enum (order, receivable, stock, tax, approval, etc.)
|
|||
|
|
- badge: string
|
|||
|
|
- content: string
|
|||
|
|
- metadata: json (금액, 거래처명 등)
|
|||
|
|
- related_path: string
|
|||
|
|
- needs_approval: boolean
|
|||
|
|
- created_at
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**방향 B: 각 도메인 API 조합 (Aggregation)**
|
|||
|
|
|
|||
|
|
| 장점 | 단점 |
|
|||
|
|
|------|------|
|
|||
|
|
| 기존 API 재활용 | 여러 API 호출 필요 (성능) |
|
|||
|
|
| 신규 테이블 불필요 | 프론트에서 데이터 병합 로직 필요 |
|
|||
|
|
| 도메인별 독립성 유지 | 일관된 포맷 변환 필요 |
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
호출할 API 목록:
|
|||
|
|
- /orders/recent-events (수주)
|
|||
|
|
- /receivables/overdue-alerts (미수금 연체)
|
|||
|
|
- /stock/low-alerts (재고 부족)
|
|||
|
|
- /tax/deadlines (세금 신고 기한)
|
|||
|
|
- /approvals/pending (결재 대기)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**방향 C: 이벤트 큐 기반 실시간 시스템**
|
|||
|
|
|
|||
|
|
| 장점 | 단점 |
|
|||
|
|
|------|------|
|
|||
|
|
| 실시간 푸시 가능 | 인프라 복잡도 증가 |
|
|||
|
|
| 확장성 최고 | Redis/Queue 추가 필요 |
|
|||
|
|
| 알림 시스템과 통합 가능 | 개발 공수 큼 |
|
|||
|
|
|
|||
|
|
#### 데이터 소스 후보
|
|||
|
|
|
|||
|
|
| 뱃지 | 데이터 소스 | 조건 |
|
|||
|
|
|------|------------|------|
|
|||
|
|
| 수주 성공 | `orders` 테이블 | status = 'confirmed', 최근 N일 |
|
|||
|
|
| 주식 이슈 (미수금) | `receivables` 테이블 | overdue_days > 0 |
|
|||
|
|
| 직정 제고 (재고) | `stock_items` 테이블 | quantity < safety_stock |
|
|||
|
|
| 세금 신고 | `tax_schedules` 테이블 | deadline 임박 |
|
|||
|
|
| 결재 요청 | `approvals` 테이블 | status = 'pending' |
|
|||
|
|
| 지출예상내역서 | `expense_requests` 테이블 | status = 'pending' |
|
|||
|
|
|
|||
|
|
#### 권장 사항
|
|||
|
|
|
|||
|
|
- **MVP**: 방향 B (기존 API 조합)로 시작
|
|||
|
|
- **확장**: 추후 방향 A로 마이그레이션 고려
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2.2 현황판 (StatusBoard)
|
|||
|
|
|
|||
|
|
#### 기능 설명
|
|||
|
|
|
|||
|
|
각 업무 영역별 미처리 건수를 카드 형태로 표시. 클릭 시 해당 페이지로 이동.
|
|||
|
|
|
|||
|
|
#### 현재 mockData 구조
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
todayIssue: [
|
|||
|
|
{
|
|||
|
|
id: string,
|
|||
|
|
label: string, // "수주", "채권 추심", "안전 재고" 등
|
|||
|
|
count: number|string, // 3 또는 "부가세 신고 D-15"
|
|||
|
|
path: string, // 이동할 페이지 경로
|
|||
|
|
isHighlighted: boolean // 강조 표시 여부
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 개발 방향 제안
|
|||
|
|
|
|||
|
|
**방향 A: 단일 집계 API**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
GET /api/dashboard/status-board
|
|||
|
|
|
|||
|
|
응답:
|
|||
|
|
{
|
|||
|
|
items: [
|
|||
|
|
{ key: "orders", label: "수주", count: 3, path: "/sales/order-management-sales" },
|
|||
|
|
{ key: "debt_collection", label: "채권 추심", count: 3, path: "/accounting/bad-debt-collection" },
|
|||
|
|
{ key: "safety_stock", label: "안전 재고", count: 3, path: "/material/stock-status", isHighlighted: true },
|
|||
|
|
{ key: "tax_report", label: "세금 신고", count: "부가세 신고 D-15", path: "/accounting/tax" },
|
|||
|
|
...
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| 장점 | 단점 |
|
|||
|
|
|------|------|
|
|||
|
|
| 단일 API 호출 | 백엔드에서 여러 테이블 집계 필요 |
|
|||
|
|
| 프론트 로직 단순 | 새 항목 추가 시 백엔드 수정 필요 |
|
|||
|
|
|
|||
|
|
**방향 B: 설정 기반 동적 집계**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. dashboard_status_items 테이블에 항목 정의
|
|||
|
|
2. 각 항목별 count_query (SQL 또는 서비스 메서드) 지정
|
|||
|
|
3. API에서 동적으로 집계하여 반환
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| 장점 | 단점 |
|
|||
|
|
|------|------|
|
|||
|
|
| 관리자가 항목 추가/수정 가능 | 구현 복잡도 증가 |
|
|||
|
|
| 유연성 높음 | 쿼리 성능 관리 필요 |
|
|||
|
|
|
|||
|
|
#### 집계 대상 테이블
|
|||
|
|
|
|||
|
|
| 항목 | 테이블 | 집계 조건 |
|
|||
|
|
|------|--------|----------|
|
|||
|
|
| 수주 | `orders` | status = 'pending' AND tenant_id |
|
|||
|
|
| 채권 추심 | `bad_debts` | status IN ('collecting', 'legal_action') |
|
|||
|
|
| 안전 재고 | `stock_items` | quantity < safety_stock |
|
|||
|
|
| 세금 신고 | `tax_schedules` | D-day 계산 |
|
|||
|
|
| 신규 업체 등록 | `vendors` | status = 'pending_approval' |
|
|||
|
|
| 연차 | `vacation_requests` | status = 'pending' |
|
|||
|
|
| 발주 | `purchase_orders` | status = 'pending' |
|
|||
|
|
| 결재 요청 | `approvals` | status = 'pending' |
|
|||
|
|
|
|||
|
|
#### 권장 사항
|
|||
|
|
|
|||
|
|
- 방향 A로 시작 (단일 집계 API)
|
|||
|
|
- 항목은 하드코딩으로 시작, 추후 설정 테이블로 분리 가능
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2.3 접대비 현황 (Entertainment)
|
|||
|
|
|
|||
|
|
#### 기능 설명
|
|||
|
|
|
|||
|
|
세무 규정에 따른 접대비 한도 및 사용 현황. 분기별 한도 관리 필요.
|
|||
|
|
|
|||
|
|
#### 현재 mockData 구조
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
entertainment: {
|
|||
|
|
cards: [
|
|||
|
|
{ label: "매출", amount: 30530000000 },
|
|||
|
|
{ label: "{1사분기} 접대비 총 한도", amount: 40123000 },
|
|||
|
|
{ label: "{1사분기} 접대비 잔여한도", amount: 30123000 },
|
|||
|
|
{ label: "{1사분기} 접대비 사용금액", amount: 10000000 }
|
|||
|
|
],
|
|||
|
|
checkPoints: [...] // AI 분석 메시지
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 세무 규정 (접대비 한도 계산)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
기본 한도: 3,600만원 (중소기업 기준)
|
|||
|
|
매출 추가 한도:
|
|||
|
|
- 100억 이하: 매출 × 0.3%
|
|||
|
|
- 100~500억: 100억 초과분 × 0.2%
|
|||
|
|
- 500억 초과: 500억 초과분 × 0.03%
|
|||
|
|
|
|||
|
|
분기별 한도 = 연간 한도 ÷ 4
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 개발 방향 제안
|
|||
|
|
|
|||
|
|
**방향 A: 전용 서비스 클래스**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
EntertainmentExpenseService
|
|||
|
|
├── getQuarterlyLimit(year, quarter) // 분기별 한도 계산
|
|||
|
|
├── getUsedAmount(year, quarter) // 분기별 사용액 집계
|
|||
|
|
├── getRemainingLimit(year, quarter) // 잔여 한도
|
|||
|
|
├── getSummary() // 대시보드용 요약
|
|||
|
|
└── generateCheckPoints() // AI 분석 메시지 생성
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**방향 B: 기존 회계 시스템 확장**
|
|||
|
|
|
|||
|
|
- `expenses` 테이블에서 접대비 계정 필터링
|
|||
|
|
- 한도 계산 로직만 별도 서비스로 분리
|
|||
|
|
|
|||
|
|
#### 필요 데이터
|
|||
|
|
|
|||
|
|
| 데이터 | 소스 | 비고 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 연간 매출 | `orders` 또는 `sales_summary` | 한도 계산용 |
|
|||
|
|
| 접대비 사용액 | `expenses` | account_code = '접대비' |
|
|||
|
|
| 거래처 정보 | `expense_details` | 접대비 증빙용 |
|
|||
|
|
|
|||
|
|
#### CheckPoint 생성 규칙
|
|||
|
|
|
|||
|
|
| 상황 | 타입 | 메시지 예시 |
|
|||
|
|
|------|------|------------|
|
|||
|
|
| 한도 85% 미만 | info | "여유 있게 운영 중입니다" |
|
|||
|
|
| 한도 85~100% | warning | "잔여 한도 600만원입니다. 점검 필요" |
|
|||
|
|
| 한도 초과 | error | "초과분은 손금불산입됩니다" |
|
|||
|
|
| 거래처 정보 누락 | error | "3건의 거래처 정보가 누락되었습니다" |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2.4 복리후생비 현황 (Welfare)
|
|||
|
|
|
|||
|
|
#### 기능 설명
|
|||
|
|
|
|||
|
|
복리후생비 한도 및 사용 현황. 직원 수 기반 한도 계산.
|
|||
|
|
|
|||
|
|
#### 현재 mockData 구조
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
welfare: {
|
|||
|
|
cards: [
|
|||
|
|
{ label: "당해년도 복리후생비 한도", amount: 30123000 },
|
|||
|
|
{ label: "{1사분기} 복리후생비 총 한도", amount: 10123000 },
|
|||
|
|
{ label: "{1사분기} 복리후생비 잔여한도", amount: 5123000 },
|
|||
|
|
{ label: "{1사분기} 복리후생비 사용금액", amount: 5123000 }
|
|||
|
|
],
|
|||
|
|
checkPoints: [...]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 한도 계산 방식 옵션
|
|||
|
|
|
|||
|
|
**방식 1: 고정 금액 기준**
|
|||
|
|
- 설정된 연간 한도를 분기별로 분배
|
|||
|
|
- 예: 연간 3,000만원 → 분기당 750만원
|
|||
|
|
|
|||
|
|
**방식 2: 직원 수 기준 (비율)**
|
|||
|
|
- 직원 1인당 월 N만원 기준
|
|||
|
|
- 예: 50명 × 20만원 × 3개월 = 3,000만원/분기
|
|||
|
|
|
|||
|
|
#### 개발 방향 제안
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
WelfareExpenseService
|
|||
|
|
├── getAnnualLimit() // 연간 한도 (설정값 또는 계산)
|
|||
|
|
├── getQuarterlyLimit(quarter) // 분기별 한도
|
|||
|
|
├── getUsedAmount(quarter) // 분기별 사용액
|
|||
|
|
├── getPerEmployeeAverage() // 1인당 평균 사용액
|
|||
|
|
├── getSummary() // 대시보드용 요약
|
|||
|
|
└── generateCheckPoints() // AI 분석 메시지
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 필요 데이터
|
|||
|
|
|
|||
|
|
| 데이터 | 소스 | 비고 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 직원 수 | `employees` | active 상태 |
|
|||
|
|
| 복리후생비 사용액 | `expenses` | account_code = '복리후생비' |
|
|||
|
|
| 한도 설정 | `company_settings` | 연간 한도 또는 1인당 기준 |
|
|||
|
|
|
|||
|
|
#### CheckPoint 생성 규칙
|
|||
|
|
|
|||
|
|
| 상황 | 타입 | 메시지 예시 |
|
|||
|
|
|------|------|------------|
|
|||
|
|
| 1인당 업계 평균 이내 | success | "업계 평균(15~25만원) 내 정상 운영 중" |
|
|||
|
|
| 식대 비과세 한도 초과 | error | "식대가 월 25만원으로 비과세 한도(20만원) 초과" |
|
|||
|
|
| 분기 한도 85% 이상 | warning | "한도 소진 임박" |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2.5 부가세 현황 (Vat)
|
|||
|
|
|
|||
|
|
#### 기능 설명
|
|||
|
|
|
|||
|
|
부가세 신고 예상 금액 및 관련 이슈 표시.
|
|||
|
|
|
|||
|
|
#### 현재 mockData 구조
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
vat: {
|
|||
|
|
cards: [
|
|||
|
|
{ label: "매출세액", amount: 3050000000 },
|
|||
|
|
{ label: "매입세액", amount: 2050000000 },
|
|||
|
|
{ label: "예상 납부세액", amount: 110000000 },
|
|||
|
|
{ label: "세금계산서 미발행", amount: 3, unit: "건" }
|
|||
|
|
],
|
|||
|
|
checkPoints: [...]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 개발 방향 제안
|
|||
|
|
|
|||
|
|
**방향 A: 전용 부가세 서비스**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
VatService
|
|||
|
|
├── getSalesTax(period) // 매출세액 집계
|
|||
|
|
├── getPurchaseTax(period) // 매입세액 집계
|
|||
|
|
├── getEstimatedPayment(period)// 예상 납부/환급세액
|
|||
|
|
├── getUnissuedInvoices() // 미발행 세금계산서
|
|||
|
|
├── getSummary() // 대시보드용 요약
|
|||
|
|
└── generateCheckPoints() // AI 분석 메시지
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**방향 B: 기존 세금계산서 시스템 확장**
|
|||
|
|
|
|||
|
|
- 발행/수취 세금계산서에서 세액 집계
|
|||
|
|
- 미발행 건수 조회 추가
|
|||
|
|
|
|||
|
|
#### 필요 데이터
|
|||
|
|
|
|||
|
|
| 데이터 | 소스 | 비고 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 매출세액 | `tax_invoices` (발행) | type = 'sales', 합계 × 10% |
|
|||
|
|
| 매입세액 | `tax_invoices` (수취) | type = 'purchase', 합계 × 10% |
|
|||
|
|
| 미발행 건 | `orders` 또는 `sales` | 세금계산서 미연결 건 |
|
|||
|
|
|
|||
|
|
#### CheckPoint 생성 규칙
|
|||
|
|
|
|||
|
|
| 상황 | 타입 | 메시지 예시 |
|
|||
|
|
|------|------|------------|
|
|||
|
|
| 환급 예상 | success | "예상 환급세액 520만원" |
|
|||
|
|
| 납부 예상 (전기 대비 증가) | info | "전기 대비 12.9% 증가" |
|
|||
|
|
| 미발행 세금계산서 존재 | warning | "3건 미발행, 발행 필요" |
|
|||
|
|
| 신고 기한 임박 | error | "신고 기한 D-3" |
|
|||
|
|
|
|||
|
|
#### 부가세 신고 기간
|
|||
|
|
|
|||
|
|
| 신고 유형 | 과세 기간 | 신고 기한 |
|
|||
|
|
|----------|----------|----------|
|
|||
|
|
| 1기 예정 | 1/1 ~ 3/31 | 4/25 |
|
|||
|
|
| 1기 확정 | 1/1 ~ 6/30 | 7/25 |
|
|||
|
|
| 2기 예정 | 7/1 ~ 9/30 | 10/25 |
|
|||
|
|
| 2기 확정 | 7/1 ~ 12/31 | 다음해 1/25 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2.6 캘린더 (Calendar)
|
|||
|
|
|
|||
|
|
#### 기능 설명
|
|||
|
|
|
|||
|
|
회사 일정 표시 및 관리. 부서별, 개인별 일정 지원.
|
|||
|
|
|
|||
|
|
#### 현재 mockData 구조
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
calendarSchedules: [
|
|||
|
|
{
|
|||
|
|
id: string,
|
|||
|
|
title: string,
|
|||
|
|
startDate: string, // "2026-01-01"
|
|||
|
|
endDate: string, // "2026-01-04"
|
|||
|
|
startTime?: string, // "09:00"
|
|||
|
|
endTime?: string, // "12:00"
|
|||
|
|
type: string, // "schedule", "order", "construction"
|
|||
|
|
department?: string, // 부서명
|
|||
|
|
personName?: string // 담당자명
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 개발 방향 제안
|
|||
|
|
|
|||
|
|
**방향 A: 전용 일정 테이블**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
테이블: calendar_schedules
|
|||
|
|
- id, tenant_id
|
|||
|
|
- title
|
|||
|
|
- start_date, end_date
|
|||
|
|
- start_time, end_time (nullable, 종일 여부)
|
|||
|
|
- type: enum (schedule, order, construction, vacation, tax, etc.)
|
|||
|
|
- department_id (nullable)
|
|||
|
|
- user_id (nullable, 담당자)
|
|||
|
|
- color (nullable)
|
|||
|
|
- content (nullable, 상세 내용)
|
|||
|
|
- created_by, created_at, updated_at
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**방향 B: 기존 데이터 연동 (읽기 전용)**
|
|||
|
|
|
|||
|
|
각 도메인의 기존 데이터를 캘린더 형식으로 변환
|
|||
|
|
|
|||
|
|
| 타입 | 소스 테이블 | 변환 규칙 |
|
|||
|
|
|------|------------|----------|
|
|||
|
|
| 수주 납기 | `orders` | due_date → startDate |
|
|||
|
|
| 공사 일정 | `constructions` | start_date, end_date |
|
|||
|
|
| 세금 신고 | `tax_schedules` | deadline → startDate |
|
|||
|
|
| 휴가 | `vacation_requests` | start_date, end_date |
|
|||
|
|
|
|||
|
|
**방향 C: 하이브리드 (A + B)**
|
|||
|
|
|
|||
|
|
- 직접 등록 일정: 전용 테이블
|
|||
|
|
- 시스템 일정: 각 도메인에서 자동 생성
|
|||
|
|
- 통합 API에서 병합하여 제공
|
|||
|
|
|
|||
|
|
#### API 설계
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
GET /api/calendar/schedules?year=2026&month=1
|
|||
|
|
POST /api/calendar/schedules (일정 생성)
|
|||
|
|
PUT /api/calendar/schedules/{id} (일정 수정)
|
|||
|
|
DELETE /api/calendar/schedules/{id} (일정 삭제)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 권장 사항
|
|||
|
|
|
|||
|
|
- **MVP**: 방향 A (전용 테이블)로 CRUD 구현
|
|||
|
|
- **확장**: 추후 방향 C로 시스템 일정 연동
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 개발 우선순위 제안
|
|||
|
|
|
|||
|
|
| 순위 | 섹션 | 이유 |
|
|||
|
|
|:---:|------|------|
|
|||
|
|
| 1 | **현황판 (StatusBoard)** | 기존 데이터 집계만으로 구현 가능, 공수 적음 |
|
|||
|
|
| 2 | **캘린더 (Calendar)** | 독립적인 CRUD, 다른 섹션과 의존성 없음 |
|
|||
|
|
| 3 | **오늘의 이슈 (TodayIssue)** | StatusBoard 로직 재활용 가능 |
|
|||
|
|
| 4 | **부가세 현황 (Vat)** | 세금계산서 데이터 기반, 로직 명확 |
|
|||
|
|
| 5 | **접대비 현황 (Entertainment)** | 세무 로직 포함, 한도 계산 복잡 |
|
|||
|
|
| 6 | **복리후생비 현황 (Welfare)** | 접대비와 유사한 패턴, 함께 개발 권장 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 공통 개발 패턴
|
|||
|
|
|
|||
|
|
### API 응답 형식
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": {
|
|||
|
|
"cards": [...],
|
|||
|
|
"checkPoints": [...]
|
|||
|
|
},
|
|||
|
|
"message": null
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### CheckPoint 구조
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"id": "unique-id",
|
|||
|
|
"type": "error|warning|success|info",
|
|||
|
|
"message": "메시지 내용",
|
|||
|
|
"highlights": [
|
|||
|
|
{ "text": "강조할 텍스트", "color": "red|green|blue" }
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 색상 체계 (AI 리포트)
|
|||
|
|
|
|||
|
|
| 색상 | 의미 | 적용 기준 |
|
|||
|
|
|:---:|:---:|----------|
|
|||
|
|
| 🔴 error | 경고 | 한도 초과, 즉각 조치 필요 |
|
|||
|
|
| 🟠 warning | 주의 | 한도 85~100%, 기한 임박 |
|
|||
|
|
| 🟢 success | 긍정 | 목표 달성, 입금/회수 발생 |
|
|||
|
|
| 🔵 info | 양호 | 정상 범위, 안정적 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 참고 문서
|
|||
|
|
|
|||
|
|
| 문서 | 경로 |
|
|||
|
|
|------|------|
|
|||
|
|
| AI 리포트 색상 체계 | `docs/plans/AI_리포트_키워드_색상체계_가이드_v1.4.md` |
|
|||
|
|
| Hook 패턴 예제 | `react/src/hooks/useClientList.ts` |
|
|||
|
|
| Transform 예제 | `react/src/lib/api/dashboard/transformers.ts` |
|
|||
|
|
| Proxy 라우트 | `react/src/app/api/proxy/[...path]/route.ts` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 변경 이력
|
|||
|
|
|
|||
|
|
| 날짜 | 내용 |
|
|||
|
|
|------|------|
|
|||
|
|
| 2026-01-20 | 초기 분석 문서 작성 |
|
|||
|
|
| 2026-01-20 | Phase 1 완료 (5개 섹션 API 연동) |
|
|||
|
|
| 2026-01-20 | Phase 2 개발 계획 상세화: 각 섹션별 개발 방향, 데이터 소스, 권장 사항 추가 |
|