# 경조사비 대시보드 연동

**날짜:** 2026-03-19
**작업자:** Claude Code

---

## 변경 개요

CEO 대시보드의 가지급금 현황 API(`GET /api/v1/loans/dashboard`)에 경조사비(`condolence_expenses` 테이블) 요약 데이터를 추가했다.

### 배경

- 경조사비 관리 페이지(`condolence_expenses`)에서 등록한 데이터가 대시보드 가지급금 "경조사" 항목에 반영되지 않는 문제
- `loans` 테이블의 `category=congratulatory`(가지급금)와 `condolence_expenses` 테이블(직접 지출)은 데이터 성격이 다름
- **방안 B(별도 항목 추가)** 채택 — 데이터 출처를 명확히 분리

### 방안 선택 근거

| 방안 | 설명 | 채택 여부 |
|------|------|----------|
| A. 합산 | loans + condolence_expenses 합산 | 금액 의미 모호 |
| **B. 별도 항목** | **condolence_summary 필드 추가** | **채택** |
| C. 자동 생성 | condolence → loans 자동 삽입 | 결합도 과도 |
| D. 현행 유지 | 변경 없음 | 사용자 혼란 지속 |

---

## 수정된 파일

| 파일 | 변경 내용 |
|------|----------|
| `api/app/Services/LoanService.php` | `dashboard()` 메서드에 `condolence_expenses` 요약 쿼리 추가, 응답에 `condolence_summary` 포함 |

---

## 상세 변경 사항

### API 응답 변경

`GET /api/v1/loans/dashboard` 응답에 `condolence_summary` 필드 추가:

```json
{
    "summary": {
        "total_outstanding": 5000000,
        "recognized_interest": 23000,
        "outstanding_count": 3
    },
    "category_breakdown": {
        "card": { "outstanding_amount": 1150000, "total_count": 5, "unverified_count": 1 },
        "congratulatory": { "outstanding_amount": 300000, "total_count": 2, "unverified_count": 0 },
        "gift_certificate": { "outstanding_amount": 500000, "total_count": 3, "unverified_count": 0 },
        "entertainment": { "outstanding_amount": 450000, "total_count": 2, "unverified_count": 0 }
    },
    "condolence_summary": {
        "total_count": 5,
        "total_amount": 150000,
        "congratulation_amount": 100000,
        "condolence_amount": 50000
    },
    "loans": [...]
}
```

### 필드 설명

| 필드 | 타입 | 설명 |
|------|------|------|
| `condolence_summary.total_count` | `int` | 경조사비 총 건수 |
| `condolence_summary.total_amount` | `int` | 경조사비 총 금액 (원) |
| `condolence_summary.congratulation_amount` | `int` | 축의금 합계 |
| `condolence_summary.condolence_amount` | `int` | 부조금 합계 |

### 날짜 필터

- 기존 `category_breakdown`: `loan_date` 기준
- 신규 `condolence_summary`: `event_date` 기준
- 대시보드의 `start_date`, `end_date` 파라미터가 동일하게 적용됨

---

## 구현 방식

```
LoanService::dashboard()
├── 1. Summary (loans 미정산 집계)
├── 2. 인정이자 계산
├── 3. getCategoryBreakdown() — loans 4개 카테고리
├── 4. condolence_expenses 요약 쿼리 (신규)  ← 추가
└── 5. 가지급금 목록 (최대 50건)
```

`CondolenceExpense` 모델을 직접 조회하여 서비스 간 결합을 피함 (기존 패턴과 동일).

---

## FE 작업 필요 사항

- `CardManagementSection` 컴포넌트에 경조사비 카드 1개 추가 (기존 4개 → 5개)
- `expense.ts` transformer에 `condolence_summary` 매핑 추가
- 별도 FE 전달 문서 참조: `frontend/api-specs/condolence-dashboard-fe-request.md`

---

## 테스트 체크리스트

- [x] API 코드 수정 완료
- [x] Pint 포맷팅 적용
- [x] 개발서버 푸시 완료
- [ ] FE 경조사비 카드 추가 (React 작업 필요)

---

## 관련 문서

- [경조사비 서비스 이관 기획](../dev/dev_plans/condolence-expense-service-plan.md)
- [경조사비 API 명세](../frontend/api-specs/condolence-expense-api.md)

---

**최종 업데이트**: 2026-03-19
