Files
sam-react-prod/src/components/business/CEODashboard/mockData.ts
유병철 00a6209347 feat: 레이아웃/출하/생산/회계/대시보드 전반 개선
- HeaderFavoritesBar 대폭 개선
- Sidebar/AuthenticatedLayout 소폭 수정
- ShipmentCreate, VehicleDispatch 출하 관련 개선
- WorkOrderCreate/Edit, WorkerScreen 생산 관련 개선
- InspectionCreate 자재 입고검사 개선
- DailyReport, VendorDetail 회계 수정
- CEO 대시보드: CardManagement/DailyProduction/DailyAttendance 섹션 개선
- useCEODashboard, expense transformer 정비
- DocumentViewer, PDF generate route 소폭 수정
- bill-prototype 개발 페이지 추가
- mockData 불필요 데이터 제거
2026-03-05 13:35:48 +09:00

487 lines
19 KiB
TypeScript

import type { CEODashboardData } from './types';
/* ============================================
* 전체 Mock 데이터 주석 처리
* API 연동 완료 후 이 파일 삭제 예정
* 기존 mock 데이터는 git history에서 확인 가능
* ============================================ */
// 빈 기본값 (타입 안전성 유지 — 필수 필드만)
export const mockData: CEODashboardData = {
todayIssue: [],
todayIssueList: [],
};
/* ============================================
* 아래는 주석 처리된 기존 Mock 데이터
* ============================================
import type {
SalesStatusData,
PurchaseStatusData,
DailyProductionData,
UnshippedData,
DailyAttendanceData,
} from './types';
const _originalMockData: CEODashboardData = {
todayIssue: [],
todayIssueList: [],
dailyReport: {
date: '2026년 1월 5일 월요일',
cards: [
{ id: 'dr1', label: '일일일보', amount: 3050000000, path: '/ko/accounting/daily-report' },
{ id: 'dr2', label: '미수금 잔액', amount: 3050000000, path: '/ko/accounting/receivables-status' },
{ id: 'dr3', label: '미지급금 잔액', amount: 3050000000 },
{ id: 'dr4', label: '당월 예상 지출 합계', amount: 350000000 },
],
checkPoints: [
{
id: 'dr-cp1',
type: 'success',
message: '어제 3.5억원 출금했습니다. 최근 7일 평균 대비 2배 이상으로 점검이 필요합니다.',
highlights: [
{ text: '3.5억원 출금', color: 'red' },
{ text: '점검이 필요', color: 'red' },
],
},
{
id: 'dr-cp2',
type: 'success',
message: '어제 10.2억원이 입금되었습니다. 대한건설 선수금 입금이 주요 원인입니다.',
highlights: [
{ text: '10.2억원', color: 'green' },
{ text: '입금', color: 'green' },
{ text: '대한건설 선수금 입금', color: 'green' },
],
},
{
id: 'dr-cp3',
type: 'success',
message: '총 현금성 자산이 300.2억원입니다. 월 운영비용 대비 18개월분이 확보되어 안정적입니다.',
highlights: [
{ text: '18개월분', color: 'blue' },
{ text: '안정적', color: 'blue' },
],
},
],
},
monthlyExpense: {
cards: [
{ id: 'me1', label: '매입', amount: 3050000000, previousLabel: '전월 대비 +10.5%' },
{ id: 'me2', label: '카드', amount: 30123000, previousLabel: '전월 대비 +10.5%' },
{ id: 'me3', label: '발행어음', amount: 30123000, previousLabel: '전월 대비 +10.5%' },
{ id: 'me4', label: '총 예상 지출 합계', amount: 350000000, previousLabel: '전월 대비 +10.5%' },
],
checkPoints: [
{
id: 'me-cp1',
type: 'success',
message: '이번 달 예상 지출이 전월 대비 15% 증가했습니다. 매입 비용 증가가 주요 원인입니다.',
highlights: [
{ text: '전월 대비 15% 증가', color: 'red' },
],
},
{
id: 'me-cp2',
type: 'success',
message: '이번 달 예상 지출이 예산을 12% 초과했습니다. 비용 항목별 점검이 필요합니다.',
highlights: [
{ text: '예산을 12% 초과', color: 'red' },
],
},
{
id: 'me-cp3',
type: 'success',
message: '이번 달 예상 지출이 전월 대비 8% 감소했습니다. {계정과목명} 비용이 줄었습니다.',
highlights: [
{ text: '전월 대비 8% 감소', color: 'green' },
],
},
],
},
entertainment: {
cards: [
{ id: 'et1', label: '주말/심야', amount: 3123000, previousLabel: '미증빙 5건' },
{ id: 'et2', label: '기피업종 (유흥, 귀금속 등)', amount: 3123000, previousLabel: '불인정 5건' },
{ id: 'et3', label: '고액 결제', amount: 3123000, previousLabel: '미증빙 5건' },
{ id: 'et4', label: '증빙 미비', amount: 3123000, previousLabel: '미증빙 5건' },
],
checkPoints: [
{
id: 'et-cp1',
type: 'success',
message: '{1사분기} 접대비 사용 1,000만원 / 한도 4,012만원 (75%). 여유 있게 운영 중입니다.',
highlights: [
{ text: '1,000만원', color: 'green' },
{ text: '4,012만원 (75%)', color: 'green' },
],
},
{
id: 'et-cp2',
type: 'success',
message: '접대비 한도 85% 도달. 잔여 한도 600만원입니다. 사용 계획을 점검해 주세요.',
highlights: [
{ text: '잔여 한도 600만원', color: 'red' },
],
},
{
id: 'et-cp3',
type: 'error',
message: '접대비 한도 초과 320만원 발생. 초과분은 손금불산입되어 법인세 부담이 증가합니다.',
highlights: [
{ text: '320만원 발생', color: 'red' },
],
},
{
id: 'et-cp4',
type: 'error',
message: '접대비 사용 중 3건(45만원)의 거래처 정보가 누락되었습니다. 기록을 보완해 주세요.',
highlights: [
{ text: '3건(45만원)', color: 'red' },
{ text: '거래처 정보가 누락', color: 'red' },
],
},
],
},
welfare: {
cards: [
{ id: 'wf1', label: '비과세 한도 초과', amount: 3123000, previousLabel: '5건' },
{ id: 'wf2', label: '사적 사용 의심', amount: 3123000, previousLabel: '5건' },
{ id: 'wf3', label: '특정인 편중', amount: 3123000, previousLabel: '5건' },
{ id: 'wf4', label: '항목별 한도 초과', amount: 3123000, previousLabel: '5건' },
],
checkPoints: [
{
id: 'wf-cp1',
type: 'success',
message: '1인당 월 복리후생비 20만원. 업계 평균(15~25만원) 내 정상 운영 중입니다.',
highlights: [
{ text: '1인당 월 복리후생비 20만원', color: 'green' },
],
},
{
id: 'wf-cp2',
type: 'error',
message: '식대가 월 25만원으로 비과세 한도(20만원)를 초과했습니다. 초과분은 근로소득 과세됩니다.',
highlights: [
{ text: '식대가 월 25만원으로', color: 'red' },
{ text: '초과', color: 'red' },
],
},
],
},
receivable: {
cards: [
{
id: 'rv1',
label: '누적 미수금',
amount: 30123000,
subItems: [
{ label: '매출', value: 60123000 },
{ label: '입금', value: 30000000 },
],
},
{
id: 'rv2',
label: '당월 미수금',
amount: 10123000,
},
{
id: 'rv3',
label: '미수금 거래처',
amount: 31,
unit: '건',
subItems: [
{ label: '연체', value: '21건' },
{ label: '악성채권', value: '11건' },
],
},
{
id: 'rv4',
label: '미수금 Top 3',
amount: 0,
displayValue: '상세보기',
},
],
checkPoints: [
{
id: 'rv-cp1',
type: 'success',
message: '90일 이상 장기 미수금 3건(2,500만원) 발생. 회수 조치가 필요합니다.',
highlights: [
{ text: '90일 이상 장기 미수금 3건(2,500만원) 발생', color: 'red' },
],
},
{
id: 'rv-cp2',
type: 'success',
message: '(주)대한전자 미수금 1,500만원으로 전체의 35%를 차지합니다. 리스크 분산이 필요합니다.',
highlights: [
{ text: '(주)대한전자 미수금 1,500만원으로 전체의 35%를', color: 'red' },
],
},
],
detailButtonPath: '/ko/accounting/receivables-status',
},
debtCollection: {
cards: [
{ id: 'dc1', label: '누적 악성채권', amount: 350000000, subLabel: '25건' },
{ id: 'dc2', label: '추심중', amount: 30123000, subLabel: '12건' },
{ id: 'dc3', label: '법적조치', amount: 3123000, subLabel: '3건' },
{ id: 'dc4', label: '추심종료', amount: 280000000, subLabel: '10건' },
],
checkPoints: [
{
id: 'dc-cp1',
type: 'success',
message: '(주)대한전자 건 지급명령 신청 완료. 법원 결정까지 약 2주 소요 예정입니다.',
highlights: [{ text: '(주)대한전자 건 지급명령 신청 완료.', color: 'red' }],
},
{
id: 'dc-cp2',
type: 'success',
message: '(주)삼성테크 건 회수 불가 판정. 대손 처리 검토가 필요합니다.',
highlights: [{ text: '(주)삼성테크 건 회수 불가 판정.', color: 'red' }],
},
],
detailButtonPath: '/ko/accounting/bad-debt-collection',
},
vat: {
cards: [
{ id: 'vat1', label: '매출세액', amount: 3050000000 },
{ id: 'vat2', label: '매입세액', amount: 2050000000 },
{ id: 'vat3', label: '예상 납부세액', amount: 110000000 },
{ id: 'vat4', label: '세금계산서 미발행', amount: 3, unit: '건' },
],
checkPoints: [
{
id: 'vat-cp1',
type: 'success',
message: '2026년 1기 예정신고 기준, 예상 환급세액은 5,200,000원입니다. 설비투자에 따른 매입세액 증가가 주요 원인입니다.',
highlights: [{ text: '2026년 1기 예정신고 기준, 예상 환급세액은 5,200,000원입니다.', color: 'red' }],
},
{
id: 'vat-cp2',
type: 'success',
message: '2026년 1기 예정신고 기준, 예상 납부세액은 110,100,000원입니다. 전기 대비 12.9% 증가했으며, 이는 매출 증가에 따른 정상적인 증가로 판단됩니다.',
highlights: [{ text: '2026년 1기 예정신고 기준, 예상 납부세액은 110,100,000원입니다.', color: 'red' }],
},
],
},
// ===== 신규 섹션 Mock 데이터 =====
salesStatus: {
cumulativeSales: 312300000,
achievementRate: 94.5,
yoyChange: 12.5,
monthlySales: 312300000,
monthlyTrend: [
{ month: '8월', amount: 250000000 },
{ month: '9월', amount: 280000000 },
{ month: '10월', amount: 310000000 },
{ month: '11월', amount: 290000000 },
{ month: '12월', amount: 320000000 },
{ month: '1월', amount: 300000000 },
{ month: '2월', amount: 312300000 },
],
clientSales: [
{ name: '대한건설', amount: 95000000 },
{ name: '삼성테크', amount: 78000000 },
{ name: '현대산업', amount: 62000000 },
{ name: 'LG전자', amount: 45000000 },
{ name: '기타', amount: 32300000 },
],
dailyItems: [
{ date: '2026-02-01', client: '대한건설', item: '스크린 외', amount: 25000000, status: '입금완료' },
{ date: '2026-02-03', client: '삼성테크', item: '슬루 외', amount: 18000000, status: '미입금' },
{ date: '2026-02-05', client: '현대산업', item: '절곡 외', amount: 32000000, status: '입금완료' },
{ date: '2026-02-07', client: 'LG전자', item: '스크린', amount: 15000000, status: '부분입금' },
{ date: '2026-02-10', client: '대한건설', item: '슬루', amount: 28000000, status: '입금완료' },
{ date: '2026-02-12', client: '삼성테크', item: '절곡', amount: 22000000, status: '미입금' },
{ date: '2026-02-15', client: '현대산업', item: '스크린 외', amount: 35000000, status: '입금완료' },
],
dailyTotal: 312300000,
},
purchaseStatus: {
cumulativePurchase: 312300000,
unpaidAmount: 312300000,
yoyChange: -12.5,
monthlyTrend: [
{ month: '8월', amount: 180000000 },
{ month: '9월', amount: 200000000 },
{ month: '10월', amount: 220000000 },
{ month: '11월', amount: 195000000 },
{ month: '12월', amount: 230000000 },
{ month: '1월', amount: 210000000 },
{ month: '2월', amount: 312300000 },
],
materialRatio: [
{ name: '원자재', value: 55, percentage: 55, color: '#3b82f6' },
{ name: '부자재', value: 35, percentage: 35, color: '#10b981' },
{ name: '소모품', value: 10, percentage: 10, color: '#f59e0b' },
],
dailyItems: [
{ date: '2026-02-01', supplier: '한국철강', item: '철판 외', amount: 45000000, status: '결제완료' },
{ date: '2026-02-03', supplier: '삼성소재', item: '알루미늄', amount: 28000000, status: '미결제' },
{ date: '2026-02-05', supplier: '현대자재', item: '볼트/너트', amount: 12000000, status: '결제완료' },
{ date: '2026-02-08', supplier: 'LG화학', item: '도료 외', amount: 18000000, status: '부분결제' },
{ date: '2026-02-10', supplier: '한국철강', item: '스테인리스', amount: 52000000, status: '미결제' },
{ date: '2026-02-13', supplier: '삼성소재', item: '구리판', amount: 35000000, status: '결제완료' },
],
dailyTotal: 312300000,
},
dailyProduction: {
date: '2026년 2월 23일 월요일',
processes: [
{
processName: '스크린',
totalWork: 10,
todo: 10,
inProgress: 10,
completed: 10,
urgent: 3,
subLine: 2,
regular: 5,
workerCount: 8,
workItems: [
{ id: 'sp1', orderNo: 'SO-2026-001', client: '대한건설', product: '스크린 A형', quantity: 50, status: '진행중' },
{ id: 'sp2', orderNo: 'SO-2026-002', client: '삼성테크', product: '스크린 B형', quantity: 30, status: '진행중' },
{ id: 'sp3', orderNo: 'SO-2026-003', client: '현대산업', product: '스크린 C형', quantity: 20, status: '대기' },
{ id: 'sp4', orderNo: 'SO-2026-004', client: 'LG전자', product: '스크린 D형', quantity: 40, status: '대기' },
{ id: 'sp5', orderNo: 'SO-2026-005', client: '대한건설', product: '스크린 E형', quantity: 25, status: '완료' },
],
workers: [
{ name: '김철수', assigned: 5, completed: 3, rate: 60 },
{ name: '이영희', assigned: 4, completed: 4, rate: 100 },
{ name: '박민수', assigned: 3, completed: 2, rate: 67 },
{ name: '정수진', assigned: 3, completed: 1, rate: 33 },
],
},
{
processName: '슬랫',
totalWork: 10,
todo: 10,
inProgress: 10,
completed: 10,
urgent: 2,
subLine: 3,
regular: 5,
workerCount: 6,
workItems: [
{ id: 'sl1', orderNo: 'SO-2026-010', client: '대한건설', product: '슬루 A형', quantity: 40, status: '진행중' },
{ id: 'sl2', orderNo: 'SO-2026-011', client: '삼성테크', product: '슬루 B형', quantity: 25, status: '진행중' },
{ id: 'sl3', orderNo: 'SO-2026-012', client: '현대산업', product: '슬루 C형', quantity: 35, status: '대기' },
],
workers: [
{ name: '최동훈', assigned: 4, completed: 3, rate: 75 },
{ name: '강미영', assigned: 3, completed: 2, rate: 67 },
{ name: '윤상호', assigned: 3, completed: 3, rate: 100 },
],
},
{
processName: '절곡',
totalWork: 10,
todo: 10,
inProgress: 10,
completed: 10,
urgent: 1,
subLine: 2,
regular: 7,
workerCount: 5,
workItems: [
{ id: 'jg1', orderNo: 'SO-2026-020', client: '현대산업', product: '절곡 A형', quantity: 60, status: '진행중' },
{ id: 'jg2', orderNo: 'SO-2026-021', client: 'LG전자', product: '절곡 B형', quantity: 45, status: '대기' },
{ id: 'jg3', orderNo: 'SO-2026-022', client: '대한건설', product: '절곡 C형', quantity: 30, status: '완료' },
],
workers: [
{ name: '한지원', assigned: 4, completed: 4, rate: 100 },
{ name: '서준혁', assigned: 3, completed: 2, rate: 67 },
],
},
],
shipment: {
expectedAmount: 150000000,
expectedCount: 12,
actualAmount: 120000000,
actualCount: 9,
},
},
unshipped: {
items: [
{ id: 'us1', portNo: 'P-2026-001', siteName: '강남 현장', orderClient: '대한건설', dueDate: '2026-02-25', daysLeft: 2 },
{ id: 'us2', portNo: 'P-2026-002', siteName: '서초 현장', orderClient: '삼성테크', dueDate: '2026-02-26', daysLeft: 3 },
{ id: 'us3', portNo: 'P-2026-003', siteName: '판교 현장', orderClient: '현대산업', dueDate: '2026-02-27', daysLeft: 4 },
{ id: 'us4', portNo: 'P-2026-004', siteName: '송도 현장', orderClient: 'LG전자', dueDate: '2026-02-28', daysLeft: 5 },
{ id: 'us5', portNo: 'P-2026-005', siteName: '마포 현장', orderClient: '대한건설', dueDate: '2026-03-01', daysLeft: 6 },
{ id: 'us6', portNo: 'P-2026-006', siteName: '영등포 현장', orderClient: '삼성테크', dueDate: '2026-03-03', daysLeft: 8 },
{ id: 'us7', portNo: 'P-2026-007', siteName: '용산 현장', orderClient: '현대산업', dueDate: '2026-03-05', daysLeft: 10 },
],
},
constructionData: {
thisMonth: 15,
completed: 15,
items: [
{ id: 'cs1', siteName: '강남 현장', client: '대한건설', startDate: '2026-02-01', endDate: '2026-02-28', progress: 85, status: '진행중' },
{ id: 'cs2', siteName: '서초 현장', client: '삼성테크', startDate: '2026-02-05', endDate: '2026-03-05', progress: 60, status: '진행중' },
{ id: 'cs3', siteName: '판교 현장', client: '현대산업', startDate: '2026-02-10', endDate: '2026-03-10', progress: 40, status: '진행중' },
{ id: 'cs4', siteName: '송도 현장', client: 'LG전자', startDate: '2026-03-01', endDate: '2026-03-30', progress: 0, status: '예정' },
{ id: 'cs5', siteName: '마포 현장', client: '대한건설', startDate: '2026-01-15', endDate: '2026-02-15', progress: 100, status: '완료' },
],
},
dailyAttendance: {
present: 10,
onLeave: 10,
late: 10,
absent: 10,
employees: [
{ id: 'att1', department: '생산부', position: '과장', name: '김철수', status: '출근' },
{ id: 'att2', department: '영업부', position: '대리', name: '이영희', status: '출근' },
{ id: 'att3', department: '관리부', position: '사원', name: '박민수', status: '휴가' },
{ id: 'att4', department: '생산부', position: '부장', name: '정수진', status: '지각' },
{ id: 'att5', department: '영업부', position: '과장', name: '최동훈', status: '출근' },
{ id: 'att6', department: '관리부', position: '대리', name: '강미영', status: '결근' },
{ id: 'att7', department: '생산부', position: '사원', name: '윤상호', status: '출근' },
],
},
calendarSchedules: [
{
id: 'sch1',
title: '제목',
startDate: '2026-01-01',
endDate: '2026-01-04',
startTime: '09:00',
endTime: '12:00',
type: 'schedule',
department: '부서명',
},
{
id: 'sch2',
title: '제목',
startDate: '2026-01-06',
endDate: '2026-01-06',
type: 'schedule',
personName: '홍길동',
},
{
id: 'sch3',
title: '제목',
startDate: '2026-01-06',
endDate: '2026-01-06',
startTime: '09:00',
endTime: '12:00',
type: 'order',
department: '부서명',
},
{
id: 'sch4',
title: '제목',
startDate: '2026-01-06',
endDate: '2026-01-06',
startTime: '12:35',
type: 'construction',
personName: '홍길동',
},
],
};
============================================ */