feat(WEB): CEO 대시보드 Phase 2 API 연동 완료

- StatusBoard(현황판) API Hook 및 타입 추가
- TodayIssue(오늘의 이슈) API Hook 및 타입 추가
- Calendar(캘린더) API Hook 및 타입 추가
- Vat(부가세) API Hook 및 타입 추가
- Entertainment(접대비) API Hook 및 타입 추가
- Welfare(복리후생비) API Hook 및 타입 추가
- CEODashboard.tsx에 모든 Phase 2 Hook 통합
- API 응답 → Frontend 타입 변환 transformer 추가
- WelfareCalculationType 'percentage' → 'ratio' 타입 일치 수정
This commit is contained in:
2026-01-21 10:38:09 +09:00
parent e6ef80f17f
commit fb1d7bf241
5 changed files with 774 additions and 9 deletions

View File

@@ -25,7 +25,7 @@ import { DEFAULT_DASHBOARD_SETTINGS } from './types';
import { ScheduleDetailModal, DetailModal } from './modals';
import { DashboardSettingsDialog } from './dialogs/DashboardSettingsDialog';
import { mockData } from './mockData';
import { useCEODashboard } from '@/hooks/useCEODashboard';
import { useCEODashboard, useTodayIssue, useCalendar, useVat, useEntertainment, useWelfare } from '@/hooks/useCEODashboard';
import {
getMonthlyExpenseModalConfig,
getCardManagementModalConfig,
@@ -42,6 +42,21 @@ export function CEODashboard() {
cardManagementFallback: mockData.cardManagement,
});
// TodayIssue API Hook (Phase 2)
const todayIssueData = useTodayIssue(30);
// Calendar API Hook (Phase 2)
const calendarData = useCalendar();
// Vat API Hook (Phase 2)
const vatData = useVat();
// Entertainment API Hook (Phase 2)
const entertainmentData = useEntertainment();
// Welfare API Hook (Phase 2)
const welfareData = useWelfare();
// 전체 로딩 상태 (모든 API 호출 중일 때)
const isLoading = useMemo(() => {
return (
@@ -49,9 +64,15 @@ export function CEODashboard() {
apiData.receivable.loading &&
apiData.debtCollection.loading &&
apiData.monthlyExpense.loading &&
apiData.cardManagement.loading
apiData.cardManagement.loading &&
apiData.statusBoard.loading &&
todayIssueData.loading &&
calendarData.loading &&
vatData.loading &&
entertainmentData.loading &&
welfareData.loading
);
}, [apiData]);
}, [apiData, todayIssueData.loading, calendarData.loading, vatData.loading, entertainmentData.loading, welfareData.loading]);
// API 데이터와 mockData를 병합 (API 우선, 실패 시 fallback)
const data = useMemo<CEODashboardData>(() => ({
@@ -62,9 +83,14 @@ export function CEODashboard() {
debtCollection: apiData.debtCollection.data ?? mockData.debtCollection,
monthlyExpense: apiData.monthlyExpense.data ?? mockData.monthlyExpense,
cardManagement: apiData.cardManagement.data ?? mockData.cardManagement,
// Phase 2 섹션들: 아직 mockData 사용
// todayIssue, todayIssueList, entertainment, welfare, vat, calendarSchedules
}), [apiData, mockData]);
// Phase 2 섹션들
todayIssue: apiData.statusBoard.data ?? mockData.todayIssue,
todayIssueList: todayIssueData.data?.items ?? mockData.todayIssueList,
calendarSchedules: calendarData.data?.items ?? mockData.calendarSchedules,
vat: vatData.data ?? mockData.vat,
entertainment: entertainmentData.data ?? mockData.entertainment,
welfare: welfareData.data ?? mockData.welfare,
}), [apiData, todayIssueData.data, calendarData.data, vatData.data, entertainmentData.data, welfareData.data, mockData]);
// 일정 상세 모달 상태
const [isScheduleModalOpen, setIsScheduleModalOpen] = useState(false);

View File

@@ -3,9 +3,9 @@ import type { DetailModalConfig } from '../types';
/**
* 복리후생비 현황 모달 설정
* 모든 카드가 동일한 상세 모달
* @param calculationType - 계산 방식 ('fixed': 직원당 정액 금액/월, 'percentage': 연봉 총액 비율)
* @param calculationType - 계산 방식 ('fixed': 직원당 정액 금액/월, 'ratio': 연봉 총액 비율)
*/
export function getWelfareModalConfig(calculationType: 'fixed' | 'percentage'): DetailModalConfig {
export function getWelfareModalConfig(calculationType: 'fixed' | 'ratio'): DetailModalConfig {
// 계산 방식에 따른 조건부 calculationCards 생성
const calculationCards = calculationType === 'fixed'
? {