fix: production save errors and import HR dashboard data
Resolve invalid task creator IDs, fix API routing and file uploads on Vercel, and replace dummy seed data with HR_Dashboard import.
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
import 'dotenv/config';
|
||||
import bcrypt from 'bcrypt';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
import { mapAllHrProjects } from './mapHrProjects';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
console.log('🌱 Seeding database...');
|
||||
|
||||
// ─── 사용자 ─────────────────────────────────────────────
|
||||
const adminPw = await bcrypt.hash('admin1234!', 12);
|
||||
const memberPw = await bcrypt.hash('member1234!', 12);
|
||||
|
||||
@@ -19,141 +19,48 @@ async function main() {
|
||||
|
||||
const member = await prisma.user.upsert({
|
||||
where: { email: 'member@eene.com' },
|
||||
update: {},
|
||||
create: { email: 'member@eene.com', password: memberPw, name: '홍길동', role: 'MEMBER', department: 'EENE' },
|
||||
update: { name: '정성호' },
|
||||
create: { email: 'member@eene.com', password: memberPw, name: '정성호', role: 'MEMBER', department: 'EENE' },
|
||||
});
|
||||
|
||||
console.log(`✅ Users ready`);
|
||||
console.log('✅ Users ready');
|
||||
|
||||
// ─── 기존 업무 삭제 후 재생성 ─────────────────────────
|
||||
await prisma.kpiMetric.deleteMany({});
|
||||
const mapped = mapAllHrProjects();
|
||||
|
||||
await prisma.file.deleteMany({});
|
||||
await prisma.taskDetail.deleteMany({});
|
||||
await prisma.milestone.deleteMany({});
|
||||
await prisma.kpiMetric.deleteMany({});
|
||||
await prisma.task.deleteMany({});
|
||||
|
||||
const allTasks = [
|
||||
// ─── 인사관리 ───────────────────────────────────────
|
||||
{
|
||||
title: '그룹 표준 취업규칙 개정안 (HRM)',
|
||||
description: '유연근무제 및 근태 관리 프로세스 고도화\n노사협의회 안건 조율 및 근로조건 개선안 반영',
|
||||
status: 'IN_PROGRESS' as const,
|
||||
priority: 'HIGH' as const,
|
||||
section: '인사관리',
|
||||
tag: 'Policy',
|
||||
taskType: '프로젝트',
|
||||
progress: 40,
|
||||
issueNote: '[5.28] 가족사 간 피드백 이견 조율 진행',
|
||||
startDate: new Date('2026-04-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
{
|
||||
title: '상반기 평가 지표(KPI) 보완',
|
||||
description: '1분기 피드백 기반 부서별 KPI 정렬\n상반기 업적 평가 시뮬레이션 기획',
|
||||
status: 'IN_PROGRESS' as const,
|
||||
priority: 'MEDIUM' as const,
|
||||
section: '인사관리',
|
||||
tag: 'Performance',
|
||||
taskType: '상시업무',
|
||||
progress: 70,
|
||||
issueNote: null,
|
||||
startDate: new Date('2026-04-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
{
|
||||
title: '가족사 시너지 조직문화 캠페인',
|
||||
description: '임직원 만족도 조사(Engagement Survey) 설계',
|
||||
status: 'TODO' as const,
|
||||
priority: 'LOW' as const,
|
||||
section: '인사관리',
|
||||
tag: 'Culture',
|
||||
taskType: '프로젝트',
|
||||
progress: 0,
|
||||
issueNote: null,
|
||||
startDate: new Date('2026-05-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
// ─── 학습성장 ───────────────────────────────────────
|
||||
{
|
||||
title: '사내 핵심역량 교육체계 수립 (HRD)',
|
||||
description: '직급별/직무별 필수 역량 가이드라인 도출\n사내 강사 제도 양성 및 콘텐츠 기획 단계',
|
||||
status: 'IN_PROGRESS' as const,
|
||||
priority: 'HIGH' as const,
|
||||
section: '학습성장',
|
||||
tag: 'Growth',
|
||||
taskType: '프로젝트',
|
||||
progress: 20,
|
||||
issueNote: '[5.28] 사내 강사 풀 확보 및 보상안 검토',
|
||||
startDate: new Date('2026-04-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
// ─── 운영지원 ───────────────────────────────────────
|
||||
{
|
||||
title: '기술센터 2F 세미나룸 브랜딩 기획',
|
||||
description: '다목적 교육 공간 활용을 위한 운영 매뉴얼 수립\n공간 아이덴티티 반영 사인물(Signage) 기획',
|
||||
status: 'REVIEW' as const,
|
||||
priority: 'MEDIUM' as const,
|
||||
section: '운영지원',
|
||||
tag: 'Space',
|
||||
taskType: '프로젝트',
|
||||
progress: 80,
|
||||
issueNote: null,
|
||||
startDate: new Date('2026-04-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
{
|
||||
title: '중대재해법 대응 안전보건 매뉴얼 정비',
|
||||
description: '현장 점검 기반 소방 및 MSDS 관리 체계 보완\n사내 안전사고 예방 가이드라인 표준화 기획',
|
||||
status: 'IN_PROGRESS' as const,
|
||||
priority: 'HIGH' as const,
|
||||
section: '운영지원',
|
||||
tag: 'Safety',
|
||||
taskType: '상시업무',
|
||||
progress: 30,
|
||||
issueNote: null,
|
||||
startDate: new Date('2026-04-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
{
|
||||
title: '공용 공간 인프라 개선',
|
||||
description: '기술센터 로비 및 라운지 환경 정비 기획',
|
||||
status: 'TODO' as const,
|
||||
priority: 'LOW' as const,
|
||||
section: '운영지원',
|
||||
tag: 'Environment',
|
||||
taskType: '프로젝트',
|
||||
progress: 0,
|
||||
issueNote: null,
|
||||
startDate: new Date('2026-05-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
// ─── 전산관리 ───────────────────────────────────────
|
||||
{
|
||||
title: '全사 IT자산 수명주기 표준화 구축',
|
||||
description: '자산 전수조사 데이터 기반 불용 기준 정립\n라이선스 최적화를 통한 비용 절감안 도출',
|
||||
status: 'IN_PROGRESS' as const,
|
||||
priority: 'HIGH' as const,
|
||||
section: '전산관리',
|
||||
tag: 'Asset',
|
||||
taskType: '프로젝트',
|
||||
progress: 60,
|
||||
issueNote: null,
|
||||
startDate: new Date('2026-04-01'),
|
||||
dueDate: new Date('2026-06-30'),
|
||||
},
|
||||
];
|
||||
|
||||
for (const t of allTasks) {
|
||||
await prisma.task.create({
|
||||
for (const t of mapped) {
|
||||
const { milestones, detailContent, ...taskData } = t;
|
||||
const task = await prisma.task.create({
|
||||
data: {
|
||||
...t,
|
||||
quarter: '2026-Q2',
|
||||
category: t.section,
|
||||
...taskData,
|
||||
creatorId: admin.id,
|
||||
assigneeId: member.id,
|
||||
},
|
||||
});
|
||||
|
||||
for (const [order, ms] of milestones.entries()) {
|
||||
await prisma.milestone.create({
|
||||
data: { ...ms, taskId: task.id, order },
|
||||
});
|
||||
}
|
||||
|
||||
if (detailContent) {
|
||||
await prisma.taskDetail.create({
|
||||
data: {
|
||||
taskId: task.id,
|
||||
content: detailContent,
|
||||
updatedBy: admin.id,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`✅ Tasks created: ${allTasks.length}개`);
|
||||
console.log(`✅ Tasks created: ${mapped.length}개 (HR_Dashboard 데이터)`);
|
||||
console.log('🎉 Seeding complete!');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user