fix: 작업자 비활성화 기능 완전 수정
작업자 퇴사 시 비활성화 기능이 제대로 작동하지 않던 문제 해결 백엔드 수정: - is_active 가상 필드 추가 (status 기반 자동 생성) - ISO 8601 날짜 형식을 MySQL DATE 형식으로 변환 - 작업자 업데이트 필드 오류 수정 (salary, annual_leave 제거) 프론트엔드 수정 (11개 파일): - 모든 페이지에서 비활성 작업자 필터링 로직 추가 - 대시보드, 작업보고서, 근태관리, 사용자관리 등 전체 페이지 적용 영향받는 기능: - 작업자 관리: 비활성화 상태가 DB에 저장되고 새로고침 후에도 유지 - 모든 페이지: 비활성화된 작업자가 선택 목록에서 제외됨 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,12 +1,21 @@
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
// 날짜 형식 변환 헬퍼 함수 (ISO 8601 -> MySQL DATE)
|
||||
const formatDate = (dateStr) => {
|
||||
if (!dateStr) return null;
|
||||
if (typeof dateStr === 'string' && dateStr.includes('T')) {
|
||||
return dateStr.split('T')[0]; // ISO 8601 -> YYYY-MM-DD
|
||||
}
|
||||
return dateStr;
|
||||
};
|
||||
|
||||
// 1. 작업자 생성
|
||||
const create = async (worker, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const {
|
||||
worker_name,
|
||||
job_type = 'worker',
|
||||
const {
|
||||
worker_name,
|
||||
job_type = 'worker',
|
||||
phone_number = null,
|
||||
email = null,
|
||||
hire_date = null,
|
||||
@@ -16,10 +25,10 @@ const create = async (worker, callback) => {
|
||||
} = worker;
|
||||
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO workers
|
||||
`INSERT INTO workers
|
||||
(worker_name, job_type, phone_number, email, hire_date, department, notes, status)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[worker_name, job_type, phone_number, email, hire_date, department, notes, status]
|
||||
[worker_name, job_type, phone_number, email, formatDate(hire_date), department, notes, status]
|
||||
);
|
||||
|
||||
callback(null, result.insertId);
|
||||
@@ -32,7 +41,13 @@ const create = async (worker, callback) => {
|
||||
const getAll = async (callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`SELECT * FROM workers ORDER BY worker_id DESC`);
|
||||
const [rows] = await db.query(`
|
||||
SELECT
|
||||
*,
|
||||
CASE WHEN status = 'active' THEN 1 ELSE 0 END AS is_active
|
||||
FROM workers
|
||||
ORDER BY worker_id DESC
|
||||
`);
|
||||
callback(null, rows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
@@ -43,7 +58,13 @@ const getAll = async (callback) => {
|
||||
const getById = async (worker_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`SELECT * FROM workers WHERE worker_id = ?`, [worker_id]);
|
||||
const [rows] = await db.query(`
|
||||
SELECT
|
||||
*,
|
||||
CASE WHEN status = 'active' THEN 1 ELSE 0 END AS is_active
|
||||
FROM workers
|
||||
WHERE worker_id = ?
|
||||
`, [worker_id]);
|
||||
callback(null, rows[0]);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
@@ -54,18 +75,43 @@ const getById = async (worker_id, callback) => {
|
||||
const update = async (worker, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const { worker_id, worker_name, join_date, job_type, salary, annual_leave, status } = worker;
|
||||
const {
|
||||
worker_id,
|
||||
worker_name,
|
||||
job_type,
|
||||
join_date,
|
||||
status,
|
||||
phone_number,
|
||||
email,
|
||||
hire_date,
|
||||
department,
|
||||
notes
|
||||
} = worker;
|
||||
|
||||
const [result] = await db.query(
|
||||
`UPDATE workers
|
||||
SET worker_name = ?,
|
||||
join_date = ?,
|
||||
job_type = ?,
|
||||
salary = ?,
|
||||
annual_leave = ?,
|
||||
status = ?
|
||||
join_date = ?,
|
||||
status = ?,
|
||||
phone_number = ?,
|
||||
email = ?,
|
||||
hire_date = ?,
|
||||
department = ?,
|
||||
notes = ?
|
||||
WHERE worker_id = ?`,
|
||||
[worker_name, join_date, job_type, salary, annual_leave, status, worker_id]
|
||||
[
|
||||
worker_name,
|
||||
job_type,
|
||||
formatDate(join_date),
|
||||
status,
|
||||
phone_number,
|
||||
email,
|
||||
formatDate(hire_date),
|
||||
department,
|
||||
notes,
|
||||
worker_id
|
||||
]
|
||||
);
|
||||
|
||||
callback(null, result.affectedRows);
|
||||
|
||||
Reference in New Issue
Block a user