feat(training): 안전교육 실시 페이지 수정/삭제 기능 추가
대기 목록·완료 이력 양쪽에 수정/삭제 버튼 추가. 교육 기록 삭제 시 트랜잭션으로 출입 신청 상태를 approved로 복원. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -280,6 +280,19 @@ exports.updateTrainingRecord = async (req, res) => {
|
||||
}
|
||||
};
|
||||
|
||||
exports.deleteTrainingRecord = async (req, res) => {
|
||||
try {
|
||||
const result = await visitRequestModel.deleteTrainingRecord(req.params.id);
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({ success: false, message: '안전교육 기록을 찾을 수 없습니다.' });
|
||||
}
|
||||
res.json({ success: true, message: '안전교육 기록이 삭제되었습니다.' });
|
||||
} catch (err) {
|
||||
console.error('안전교육 기록 삭제 오류:', err);
|
||||
res.status(500).json({ success: false, message: '안전교육 기록 삭제 중 오류가 발생했습니다.' });
|
||||
}
|
||||
};
|
||||
|
||||
exports.completeTraining = async (req, res) => {
|
||||
try {
|
||||
const trainingId = req.params.id;
|
||||
|
||||
@@ -350,6 +350,42 @@ const completeTraining = async (trainingId, signatureData) => {
|
||||
return result;
|
||||
};
|
||||
|
||||
const deleteTrainingRecord = async (trainingId) => {
|
||||
const db = getPool();
|
||||
const connection = await db.getConnection();
|
||||
try {
|
||||
await connection.beginTransaction();
|
||||
|
||||
// 1. training record 조회 → request_id 획득
|
||||
const [rows] = await connection.query(
|
||||
'SELECT training_id, request_id FROM safety_training_records WHERE training_id = ?',
|
||||
[trainingId]
|
||||
);
|
||||
if (!rows.length) {
|
||||
await connection.rollback();
|
||||
return { affectedRows: 0 };
|
||||
}
|
||||
const requestId = rows[0].request_id;
|
||||
|
||||
// 2. training record 삭제
|
||||
await connection.query('DELETE FROM safety_training_records WHERE training_id = ?', [trainingId]);
|
||||
|
||||
// 3. 출입 신청 상태를 approved로 복원
|
||||
await connection.query(
|
||||
"UPDATE workplace_visit_requests SET status = 'approved', updated_at = NOW() WHERE request_id = ?",
|
||||
[requestId]
|
||||
);
|
||||
|
||||
await connection.commit();
|
||||
return { affectedRows: 1 };
|
||||
} catch (err) {
|
||||
await connection.rollback();
|
||||
throw err;
|
||||
} finally {
|
||||
connection.release();
|
||||
}
|
||||
};
|
||||
|
||||
const getTrainingRecords = async (filters = {}) => {
|
||||
const db = getPool();
|
||||
let query = `
|
||||
@@ -581,6 +617,7 @@ module.exports = {
|
||||
createTrainingRecord,
|
||||
getTrainingRecordByRequestId,
|
||||
updateTrainingRecord,
|
||||
deleteTrainingRecord,
|
||||
completeTraining,
|
||||
getTrainingRecords,
|
||||
getAllCategories,
|
||||
|
||||
@@ -41,6 +41,7 @@ router.post('/training', requireAdmin, visitRequestController.createTrainingReco
|
||||
router.get('/training', visitRequestController.getTrainingRecords);
|
||||
router.get('/training/request/:requestId', visitRequestController.getTrainingRecordByRequestId);
|
||||
router.put('/training/:id', requireAdmin, visitRequestController.updateTrainingRecord);
|
||||
router.delete('/training/:id', requireAdmin, visitRequestController.deleteTrainingRecord);
|
||||
router.post('/training/:id/complete', requireAdmin, visitRequestController.completeTraining);
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user