fix: 출근체크/근무현황 페이지 버그 수정
- workers API 기본 limit 10 → 100 변경 (작업자 누락 문제 해결) - 작업자 필터 조건 수정 (status='active' + employment_status 체크) - 근태 기록 저장 시 컬럼명 불일치 수정 (attendance_type_id) - 근무현황 페이지에 저장 상태 표시 추가 (✓저장됨) - 디버그 로그 제거 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -26,12 +26,7 @@ exports.createWorker = asyncHandler(async (req, res) => {
|
||||
|
||||
logger.info('작업자 생성 요청', { name: workerData.worker_name, create_account: createAccount });
|
||||
|
||||
const lastID = await new Promise((resolve, reject) => {
|
||||
workerModel.create(workerData, (err, id) => {
|
||||
if (err) reject(new DatabaseError('작업자 생성 중 오류가 발생했습니다'));
|
||||
else resolve(id);
|
||||
});
|
||||
});
|
||||
const lastID = await workerModel.create(workerData);
|
||||
|
||||
// 계정 생성 요청이 있으면 users 테이블에 계정 생성
|
||||
if (createAccount && workerData.worker_name) {
|
||||
@@ -73,7 +68,7 @@ exports.createWorker = asyncHandler(async (req, res) => {
|
||||
* 전체 작업자 조회 (캐싱 및 페이지네이션 적용)
|
||||
*/
|
||||
exports.getAllWorkers = asyncHandler(async (req, res) => {
|
||||
const { page = 1, limit = 10, search = '', status = '', department_id = null } = req.query;
|
||||
const { page = 1, limit = 100, search = '', status = '', department_id = null } = req.query;
|
||||
|
||||
const cacheKey = cache.createKey('workers', 'list', page, limit, search, status, department_id);
|
||||
|
||||
@@ -114,12 +109,7 @@ exports.getWorkerById = asyncHandler(async (req, res) => {
|
||||
throw new ValidationError('유효하지 않은 작업자 ID입니다');
|
||||
}
|
||||
|
||||
const row = await new Promise((resolve, reject) => {
|
||||
workerModel.getById(id, (err, data) => {
|
||||
if (err) reject(new DatabaseError('작업자 조회 중 오류가 발생했습니다'));
|
||||
else resolve(data);
|
||||
});
|
||||
});
|
||||
const row = await workerModel.getById(id);
|
||||
|
||||
if (!row) {
|
||||
throw new NotFoundError('작업자를 찾을 수 없습니다');
|
||||
@@ -153,27 +143,14 @@ exports.updateWorker = asyncHandler(async (req, res) => {
|
||||
});
|
||||
|
||||
// 먼저 현재 작업자 정보 조회 (계정 여부 확인용)
|
||||
const currentWorker = await new Promise((resolve, reject) => {
|
||||
workerModel.getById(id, (err, data) => {
|
||||
if (err) reject(new DatabaseError('작업자 조회 중 오류가 발생했습니다'));
|
||||
else resolve(data);
|
||||
});
|
||||
});
|
||||
const currentWorker = await workerModel.getById(id);
|
||||
|
||||
if (!currentWorker) {
|
||||
throw new NotFoundError('작업자를 찾을 수 없습니다');
|
||||
}
|
||||
|
||||
// 작업자 정보 업데이트
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
workerModel.update(workerData, (err, affected) => {
|
||||
if (err) {
|
||||
console.error('❌ workerModel.update 에러:', err);
|
||||
reject(new DatabaseError(`작업자 수정 중 오류가 발생했습니다: ${err.message}`));
|
||||
}
|
||||
else resolve(affected);
|
||||
});
|
||||
});
|
||||
const changes = await workerModel.update(workerData);
|
||||
|
||||
// 계정 생성/해제 처리
|
||||
const db = await getDb();
|
||||
@@ -281,12 +258,7 @@ exports.removeWorker = asyncHandler(async (req, res) => {
|
||||
throw new ValidationError('유효하지 않은 작업자 ID입니다');
|
||||
}
|
||||
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
workerModel.remove(id, (err, affected) => {
|
||||
if (err) reject(new DatabaseError('작업자 삭제 중 오류가 발생했습니다'));
|
||||
else resolve(affected);
|
||||
});
|
||||
});
|
||||
const changes = await workerModel.remove(id);
|
||||
|
||||
if (changes === 0) {
|
||||
throw new NotFoundError('작업자를 찾을 수 없습니다');
|
||||
|
||||
@@ -201,13 +201,15 @@ class AttendanceModel {
|
||||
const {
|
||||
record_date,
|
||||
worker_id,
|
||||
total_work_hours,
|
||||
work_attendance_type_id,
|
||||
vacation_type_id,
|
||||
is_overtime_approved,
|
||||
created_by
|
||||
total_work_hours = 8,
|
||||
work_attendance_type_id = 1,
|
||||
vacation_type_id = null,
|
||||
is_overtime_approved = false,
|
||||
created_by = 1
|
||||
} = recordData;
|
||||
|
||||
const attendance_type_id = work_attendance_type_id;
|
||||
|
||||
// 기존 기록 확인
|
||||
const [existing] = await db.execute(
|
||||
'SELECT id FROM daily_attendance_records WHERE worker_id = ? AND record_date = ?',
|
||||
@@ -217,17 +219,17 @@ class AttendanceModel {
|
||||
if (existing.length > 0) {
|
||||
// 업데이트
|
||||
const [result] = await db.execute(`
|
||||
UPDATE daily_attendance_records
|
||||
SET
|
||||
UPDATE daily_attendance_records
|
||||
SET
|
||||
total_work_hours = ?,
|
||||
work_attendance_type_id = ?,
|
||||
attendance_type_id = ?,
|
||||
vacation_type_id = ?,
|
||||
is_overtime_approved = ?,
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
WHERE id = ?
|
||||
`, [
|
||||
total_work_hours,
|
||||
work_attendance_type_id,
|
||||
attendance_type_id,
|
||||
vacation_type_id,
|
||||
is_overtime_approved,
|
||||
existing[0].id
|
||||
@@ -238,14 +240,14 @@ class AttendanceModel {
|
||||
// 생성
|
||||
const [result] = await db.execute(`
|
||||
INSERT INTO daily_attendance_records (
|
||||
record_date, worker_id, total_work_hours, work_attendance_type_id,
|
||||
record_date, worker_id, total_work_hours, attendance_type_id,
|
||||
vacation_type_id, is_overtime_approved, created_by
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||
`, [
|
||||
record_date,
|
||||
worker_id,
|
||||
total_work_hours,
|
||||
work_attendance_type_id,
|
||||
attendance_type_id,
|
||||
vacation_type_id,
|
||||
is_overtime_approved,
|
||||
created_by
|
||||
|
||||
@@ -95,12 +95,9 @@ const upsertAttendanceRecordService = async (recordData) => {
|
||||
record_date,
|
||||
worker_id,
|
||||
total_work_hours,
|
||||
attendance_type_id,
|
||||
work_attendance_type_id: attendance_type_id,
|
||||
vacation_type_id,
|
||||
is_vacation_processed,
|
||||
overtime_approved,
|
||||
status,
|
||||
notes,
|
||||
is_overtime_approved: overtime_approved,
|
||||
created_by
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user