diff --git a/api.hyungi.net/controllers/workerController.js b/api.hyungi.net/controllers/workerController.js
index b356073..c8bdce5 100644
--- a/api.hyungi.net/controllers/workerController.js
+++ b/api.hyungi.net/controllers/workerController.js
@@ -116,9 +116,18 @@ exports.updateWorker = asyncHandler(async (req, res) => {
const workerData = { ...req.body, worker_id: id };
+ console.log('π§ μμ
μ μμ μμ²:', {
+ worker_id: id,
+ λ°μλ°μ΄ν°: req.body,
+ μ²λ¦¬ν λ°μ΄ν°: workerData
+ });
+
const changes = await new Promise((resolve, reject) => {
workerModel.update(workerData, (err, affected) => {
- if (err) reject(new DatabaseError('μμ
μ μμ μ€ μ€λ₯κ° λ°μνμ΅λλ€'));
+ if (err) {
+ console.error('β workerModel.update μλ¬:', err);
+ reject(new DatabaseError(`μμ
μ μμ μ€ μ€λ₯κ° λ°μνμ΅λλ€: ${err.message}`));
+ }
else resolve(affected);
});
});
diff --git a/api.hyungi.net/models/workerModel.js b/api.hyungi.net/models/workerModel.js
index 96554dd..ca519a0 100644
--- a/api.hyungi.net/models/workerModel.js
+++ b/api.hyungi.net/models/workerModel.js
@@ -15,24 +15,23 @@ const create = async (worker, callback) => {
const db = await getDb();
const {
worker_name,
- job_type = 'worker',
- phone_number = null,
- email = null,
- hire_date = null,
- department = null,
- notes = null,
+ job_type = null,
+ join_date = null,
+ salary = null,
+ annual_leave = null,
status = 'active'
} = worker;
const [result] = await db.query(
`INSERT INTO workers
- (worker_name, job_type, phone_number, email, hire_date, department, notes, status)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
- [worker_name, job_type, phone_number, email, formatDate(hire_date), department, notes, status]
+ (worker_name, job_type, join_date, salary, annual_leave, status)
+ VALUES (?, ?, ?, ?, ?, ?)`,
+ [worker_name, job_type, formatDate(join_date), salary, annual_leave, status]
);
callback(null, result.insertId);
} catch (err) {
+ console.error('β create ν¨μ μλ¬:', err);
callback(err);
}
};
@@ -80,39 +79,57 @@ const update = async (worker, callback) => {
worker_name,
job_type,
status,
- phone_number,
- email,
- hire_date,
- department,
- notes
+ join_date,
+ salary,
+ annual_leave
} = worker;
- const [result] = await db.query(
- `UPDATE workers
- SET worker_name = ?,
- job_type = ?,
- status = ?,
- phone_number = ?,
- email = ?,
- hire_date = ?,
- department = ?,
- notes = ?
- WHERE worker_id = ?`,
- [
- worker_name,
- job_type,
- status,
- phone_number,
- email,
- formatDate(hire_date),
- department,
- notes,
- worker_id
- ]
- );
+ // μ
λ°μ΄νΈν νλλ§ λμ μΌλ‘ ꡬμ±
+ const updates = [];
+ const values = [];
+
+ if (worker_name !== undefined) {
+ updates.push('worker_name = ?');
+ values.push(worker_name);
+ }
+ if (job_type !== undefined) {
+ updates.push('job_type = ?');
+ values.push(job_type);
+ }
+ if (status !== undefined) {
+ updates.push('status = ?');
+ values.push(status);
+ }
+ if (join_date !== undefined) {
+ updates.push('join_date = ?');
+ values.push(formatDate(join_date));
+ }
+ if (salary !== undefined) {
+ updates.push('salary = ?');
+ values.push(salary);
+ }
+ if (annual_leave !== undefined) {
+ updates.push('annual_leave = ?');
+ values.push(annual_leave);
+ }
+
+ if (updates.length === 0) {
+ callback(new Error('μ
λ°μ΄νΈν νλκ° μμ΅λλ€'));
+ return;
+ }
+
+ values.push(worker_id); // WHERE 쑰건μ©
+
+ const query = `UPDATE workers SET ${updates.join(', ')} WHERE worker_id = ?`;
+
+ console.log('π μ€νν SQL:', query);
+ console.log('π SQL νλΌλ―Έν°:', values);
+
+ const [result] = await db.query(query, values);
callback(null, result.affectedRows);
} catch (err) {
+ console.error('β update ν¨μ μλ¬:', err);
callback(new Error(err.message || String(err)));
}
};
diff --git a/web-ui/js/api-config.js b/web-ui/js/api-config.js
index 96730fc..3a195bd 100644
--- a/web-ui/js/api-config.js
+++ b/web-ui/js/api-config.js
@@ -120,8 +120,16 @@ async function apiCall(url, method = 'GET', data = null) {
try {
const errorData = await response.json();
errorMessage = errorData.error || errorData.message || errorMessage;
+ console.error('π μλ² μλ¬ μμΈ:', errorData);
} catch (e) {
- // JSON νμ± μ€ν¨μ κΈ°λ³Έ λ©μμ§ μ¬μ©
+ // JSON νμ± μ€ν¨μ ν
μ€νΈλ‘ μλ
+ try {
+ const errorText = await response.text();
+ console.error('π μλ² μλ¬ ν
μ€νΈ:', errorText);
+ errorMessage = errorText || errorMessage;
+ } catch (e2) {
+ console.error('π μλ¬ νμ± μ€ν¨');
+ }
}
throw new Error(errorMessage);
}
@@ -129,15 +137,16 @@ async function apiCall(url, method = 'GET', data = null) {
const result = await response.json();
console.log(`β
API μ±κ³΅: ${fullUrl}`);
return result;
-
+
} catch (error) {
console.error(`β API μ€λ₯ (${fullUrl}):`, error);
-
+ console.error('β μλ¬ μ 체 λ΄μ©:', JSON.stringify(error, null, 2));
+
// λ€νΈμν¬ μ€λ₯ vs μλ² μ€λ₯ ꡬλΆ
if (error.name === 'TypeError' && error.message.includes('fetch')) {
throw new Error('λ€νΈμν¬ μ°κ²° μ€λ₯μ
λλ€. μΈν°λ· μ°κ²°μ νμΈν΄μ£ΌμΈμ.');
}
-
+
throw error;
}
}
diff --git a/web-ui/js/worker-management.js b/web-ui/js/worker-management.js
index 63f530a..46d187f 100644
--- a/web-ui/js/worker-management.js
+++ b/web-ui/js/worker-management.js
@@ -429,24 +429,30 @@ function openWorkerModal(worker = null) {
// μμ λͺ¨λ
modalTitle.textContent = 'μμ
μ μ 보 μμ ';
deleteBtn.style.display = 'inline-flex';
-
- // νΌμ λ°μ΄ν° μ±μ°κΈ°
+
+ // νΌμ λ°μ΄ν° μ±μ°κΈ° (μ€μ ν
μ΄λΈ ꡬ쑰μ λ§κ²)
document.getElementById('workerId').value = worker.worker_id;
document.getElementById('workerName').value = worker.worker_name || '';
- document.getElementById('jobType').value = worker.job_type || 'worker';
- document.getElementById('phoneNumber').value = worker.phone_number || '';
- document.getElementById('email').value = worker.email || '';
- document.getElementById('hireDate').value = worker.hire_date || '';
- document.getElementById('department').value = worker.department || '';
- document.getElementById('notes').value = worker.notes || '';
-
+ document.getElementById('jobType').value = worker.job_type || '';
+
+ // μ΅μ
νλλ€ - μ‘΄μ¬νλ κ²½μ°μλ§ μ€μ
+ const joinDateElem = document.getElementById('joinDate');
+ if (joinDateElem) joinDateElem.value = worker.join_date || '';
+
+ const salaryElem = document.getElementById('salary');
+ if (salaryElem) salaryElem.value = worker.salary || '';
+
+ const annualLeaveElem = document.getElementById('annualLeave');
+ if (annualLeaveElem) annualLeaveElem.value = worker.annual_leave || '';
+
// is_active κ° μ²λ¦¬ (DBμμ 0/1λ‘ μ€λ κ²½μ° λλΉ)
const isActiveValue = worker.status !== 'inactive' && worker.is_active !== 0 && worker.is_active !== false;
document.getElementById('isActive').checked = isActiveValue;
-
+
console.log('π§ μμ
μ λ‘λ:', {
worker_id: worker.worker_id,
worker_name: worker.worker_name,
+ job_type: worker.job_type,
status: worker.status,
is_active_raw: worker.is_active,
is_active_processed: isActiveValue
@@ -455,7 +461,7 @@ function openWorkerModal(worker = null) {
// μ κ· λ±λ‘ λͺ¨λ
modalTitle.textContent = 'μ μμ
μ λ±λ‘';
deleteBtn.style.display = 'none';
-
+
// νΌ μ΄κΈ°ν
document.getElementById('workerForm').reset();
document.getElementById('workerId').value = '';
@@ -496,19 +502,18 @@ function editWorker(workerId) {
async function saveWorker() {
try {
const form = document.getElementById('workerForm');
-
+
+ // μ€μ ν
μ΄λΈ ꡬ쑰μ λ§λ νλλ§ μ¬μ©
const workerData = {
worker_name: document.getElementById('workerName').value.trim(),
- job_type: document.getElementById('jobType').value || 'worker',
- phone_number: document.getElementById('phoneNumber').value.trim() || null,
- email: document.getElementById('email').value.trim() || null,
- hire_date: document.getElementById('hireDate').value || null,
- department: document.getElementById('department').value.trim() || null,
- notes: document.getElementById('notes').value.trim() || null,
+ job_type: document.getElementById('jobType').value || null,
+ join_date: document.getElementById('joinDate')?.value || null,
+ salary: document.getElementById('salary')?.value || null,
+ annual_leave: document.getElementById('annualLeave')?.value || null,
status: document.getElementById('isActive').checked ? 'active' : 'inactive'
};
-
- console.log('πΎ μ μ₯ν μμ
μ λ°μ΄ν°:', workerData);
+
+ console.log('πΎ μ μ₯ν μμ
μ λ°μ΄ν°:', JSON.stringify(workerData, null, 2));
// νμ νλ κ²μ¦
if (!workerData.worker_name) {
@@ -560,15 +565,21 @@ async function toggleWorkerStatus(workerId) {
}
console.log(`π μμ
μ μν λ³κ²½: ${worker.worker_name} β ${newStatus}`);
-
+
try {
+ // μ€μ ν
μ΄λΈ ꡬ쑰μ λ§λ νλλ§ μ μ‘
const updateData = {
- ...worker,
+ worker_name: worker.worker_name,
+ job_type: worker.job_type || null,
status: newStatus,
- is_active: newStatus === 'active' ? 1 : 0
+ join_date: worker.join_date || null,
+ salary: worker.salary || null,
+ annual_leave: worker.annual_leave || null
};
-
- const response = await window.apiCall(`${window.API}/workers/${workerId}`, 'PUT', updateData);
+
+ console.log('π€ μ μ‘ λ°μ΄ν°:', JSON.stringify(updateData, null, 2));
+
+ const response = await window.apiCall(`/workers/${workerId}`, 'PUT', updateData);
if (response) {
// λ‘컬 λ°μ΄ν° μ
λ°μ΄νΈ
@@ -732,3 +743,4 @@ window.filterWorkers = filterWorkers;
window.sortWorkers = sortWorkers;
window.refreshWorkerList = refreshWorkerList;
window.filterByStatus = filterByStatus;
+window.toggleWorkerStatus = toggleWorkerStatus;
diff --git a/web-ui/pages/management/project-management.html b/web-ui/pages/management/project-management.html
index 7661c72..5393643 100644
--- a/web-ui/pages/management/project-management.html
+++ b/web-ui/pages/management/project-management.html
@@ -207,8 +207,8 @@
-
-
-
+
+
+