- Adds knex.js to manage database schema changes systematically. - Creates an initial migration file based on `hyungi_schema_v2.sql` to represent the current database state. - Adds npm scripts (`db:migrate`, `db:rollback`, etc.) for easy execution of migration tasks. - Archives legacy SQL files and old migration scripts into the `db_archive/` directory to prevent confusion and clean up the project structure.
226 lines
4.4 KiB
JavaScript
226 lines
4.4 KiB
JavaScript
/**
|
|
* 테스트용 더미 데이터
|
|
*
|
|
* 테스트에서 재사용 가능한 모킹 데이터
|
|
*/
|
|
|
|
// 사용자 더미 데이터
|
|
const mockUsers = {
|
|
admin: {
|
|
id: 1,
|
|
username: 'admin',
|
|
role: 'admin',
|
|
access_level: 5
|
|
},
|
|
groupLeader: {
|
|
id: 2,
|
|
username: 'group_leader',
|
|
role: 'group_leader',
|
|
access_level: 3
|
|
},
|
|
worker: {
|
|
id: 3,
|
|
username: 'worker',
|
|
role: 'worker',
|
|
access_level: 1
|
|
}
|
|
};
|
|
|
|
// 작업자 더미 데이터
|
|
const mockWorkers = [
|
|
{
|
|
worker_id: 1,
|
|
worker_name: '김철수',
|
|
job_type: 'developer',
|
|
is_active: 1,
|
|
created_at: '2025-01-01 00:00:00'
|
|
},
|
|
{
|
|
worker_id: 2,
|
|
worker_name: '이영희',
|
|
job_type: 'designer',
|
|
is_active: 1,
|
|
created_at: '2025-01-01 00:00:00'
|
|
},
|
|
{
|
|
worker_id: 3,
|
|
worker_name: '박민수',
|
|
job_type: 'developer',
|
|
is_active: 0,
|
|
created_at: '2025-01-01 00:00:00'
|
|
}
|
|
];
|
|
|
|
// 프로젝트 더미 데이터
|
|
const mockProjects = [
|
|
{
|
|
project_id: 1,
|
|
project_name: '프로젝트 A',
|
|
job_no: 'PRJ-001',
|
|
created_at: '2025-01-01 00:00:00'
|
|
},
|
|
{
|
|
project_id: 2,
|
|
project_name: '프로젝트 B',
|
|
job_no: 'PRJ-002',
|
|
created_at: '2025-01-15 00:00:00'
|
|
}
|
|
];
|
|
|
|
// 작업 유형 더미 데이터
|
|
const mockWorkTypes = [
|
|
{ id: 1, name: '개발' },
|
|
{ id: 2, name: '디자인' },
|
|
{ id: 3, name: '테스트' },
|
|
{ id: 4, name: '회의' }
|
|
];
|
|
|
|
// 에러 유형 더미 데이터
|
|
const mockErrorTypes = [
|
|
{ id: 1, name: '버그 수정' },
|
|
{ id: 2, name: '재작업' },
|
|
{ id: 3, name: '긴급 수정' }
|
|
];
|
|
|
|
// 작업 보고서 더미 데이터
|
|
const mockWorkReports = [
|
|
{
|
|
id: 1,
|
|
report_date: '2025-12-11',
|
|
worker_id: 1,
|
|
project_id: 1,
|
|
work_type_id: 1,
|
|
work_hours: 8.0,
|
|
work_content: '기능 개발',
|
|
error_type_id: null,
|
|
work_status_id: 1,
|
|
created_by: 1,
|
|
created_at: '2025-12-11 09:00:00',
|
|
updated_at: '2025-12-11 09:00:00'
|
|
},
|
|
{
|
|
id: 2,
|
|
report_date: '2025-12-11',
|
|
worker_id: 2,
|
|
project_id: 1,
|
|
work_type_id: 2,
|
|
work_hours: 7.5,
|
|
work_content: 'UI 디자인',
|
|
error_type_id: null,
|
|
work_status_id: 1,
|
|
created_by: 2,
|
|
created_at: '2025-12-11 09:00:00',
|
|
updated_at: '2025-12-11 09:00:00'
|
|
},
|
|
{
|
|
id: 3,
|
|
report_date: '2025-12-11',
|
|
worker_id: 1,
|
|
project_id: 2,
|
|
work_type_id: 1,
|
|
work_hours: 2.0,
|
|
work_content: '버그 수정',
|
|
error_type_id: 1,
|
|
work_status_id: 2,
|
|
created_by: 1,
|
|
created_at: '2025-12-11 14:00:00',
|
|
updated_at: '2025-12-11 14:00:00'
|
|
}
|
|
];
|
|
|
|
// 출석 더미 데이터
|
|
const mockAttendance = [
|
|
{
|
|
id: 1,
|
|
worker_id: 1,
|
|
attendance_date: '2025-12-11',
|
|
status: 'work',
|
|
regular_hours: 8.0,
|
|
overtime_hours: 0.0,
|
|
created_by: 1,
|
|
created_at: '2025-12-11 09:00:00'
|
|
},
|
|
{
|
|
id: 2,
|
|
worker_id: 2,
|
|
attendance_date: '2025-12-11',
|
|
status: 'vacation',
|
|
regular_hours: 0.0,
|
|
overtime_hours: 0.0,
|
|
created_by: 2,
|
|
created_at: '2025-12-11 09:00:00'
|
|
}
|
|
];
|
|
|
|
// 분석 데이터 더미
|
|
const mockAnalysisData = {
|
|
summary: {
|
|
total_entries: 100,
|
|
total_hours: 800.0,
|
|
unique_workers: 10,
|
|
unique_projects: 5,
|
|
working_days: 20,
|
|
avg_hours_per_entry: 8.0,
|
|
contributors: 3,
|
|
error_entries: 5,
|
|
error_rate: 5.0
|
|
},
|
|
dailyStats: [
|
|
{ report_date: '2025-12-01', daily_hours: 40.0, daily_entries: 5, daily_workers: 5 },
|
|
{ report_date: '2025-12-02', daily_hours: 35.0, daily_entries: 5, daily_workers: 4 }
|
|
]
|
|
};
|
|
|
|
// API 응답 형식
|
|
const createSuccessResponse = (data, message = '성공') => ({
|
|
success: true,
|
|
data,
|
|
message
|
|
});
|
|
|
|
const createErrorResponse = (error, message = '오류 발생') => ({
|
|
success: false,
|
|
error,
|
|
message
|
|
});
|
|
|
|
// 날짜 헬퍼
|
|
const createDateString = (daysFromToday = 0) => {
|
|
const date = new Date();
|
|
date.setDate(date.getDate() + daysFromToday);
|
|
return date.toISOString().split('T')[0];
|
|
};
|
|
|
|
// DB 쿼리 결과 모킹 헬퍼
|
|
const createDbResult = (data, affectedRows = 1, insertId = 1) => {
|
|
if (Array.isArray(data)) {
|
|
return [data, []]; // [rows, fields]
|
|
}
|
|
return [
|
|
{
|
|
affectedRows,
|
|
insertId,
|
|
changedRows: affectedRows
|
|
},
|
|
[]
|
|
];
|
|
};
|
|
|
|
module.exports = {
|
|
// 더미 데이터
|
|
mockUsers,
|
|
mockWorkers,
|
|
mockProjects,
|
|
mockWorkTypes,
|
|
mockErrorTypes,
|
|
mockWorkReports,
|
|
mockAttendance,
|
|
mockAnalysisData,
|
|
|
|
// 헬퍼 함수
|
|
createSuccessResponse,
|
|
createErrorResponse,
|
|
createDateString,
|
|
createDbResult
|
|
};
|