diff --git a/tkpurchase/api/controllers/checkinController.js b/tkpurchase/api/controllers/checkinController.js index 9f29520..27455c6 100644 --- a/tkpurchase/api/controllers/checkinController.js +++ b/tkpurchase/api/controllers/checkinController.js @@ -108,4 +108,16 @@ async function stats(req, res) { } } -module.exports = { list, myCheckins, checkIn, checkOut, update, stats }; +// 체크인 삭제 +async function deleteCheckin(req, res) { + try { + const result = await checkinModel.deleteCheckin(req.params.id); + if (!result) return res.status(404).json({ success: false, error: '체크인 기록을 찾을 수 없습니다' }); + res.json({ success: true }); + } catch (err) { + console.error('Checkin delete error:', err); + res.status(500).json({ success: false, error: err.message }); + } +} + +module.exports = { list, myCheckins, checkIn, checkOut, update, stats, deleteCheckin }; diff --git a/tkpurchase/api/models/checkinModel.js b/tkpurchase/api/models/checkinModel.js index b469862..d9f128c 100644 --- a/tkpurchase/api/models/checkinModel.js +++ b/tkpurchase/api/models/checkinModel.js @@ -78,4 +78,32 @@ async function countActive() { return rows[0].cnt; } -module.exports = { findBySchedule, findById, findTodayByCompany, checkIn, checkOut, update, resetCheckout, countActive }; +async function deleteCheckin(id) { + const checkin = await findById(id); + if (!checkin) return false; + + const db = getPool(); + const conn = await db.getConnection(); + try { + await conn.beginTransaction(); + await conn.query('DELETE FROM partner_work_reports WHERE checkin_id = ?', [id]); + await conn.query('DELETE FROM partner_work_checkins WHERE id = ?', [id]); + const [remaining] = await conn.query( + 'SELECT COUNT(*) AS cnt FROM partner_work_checkins WHERE schedule_id = ?', + [checkin.schedule_id]); + if (remaining[0].cnt === 0) { + await conn.query( + "UPDATE partner_schedules SET status = 'scheduled' WHERE id = ? AND status = 'in_progress'", + [checkin.schedule_id]); + } + await conn.commit(); + return true; + } catch (err) { + await conn.rollback(); + throw err; + } finally { + conn.release(); + } +} + +module.exports = { findBySchedule, findById, findTodayByCompany, checkIn, checkOut, update, resetCheckout, countActive, deleteCheckin }; diff --git a/tkpurchase/api/routes/checkinRoutes.js b/tkpurchase/api/routes/checkinRoutes.js index 204613e..f0193cc 100644 --- a/tkpurchase/api/routes/checkinRoutes.js +++ b/tkpurchase/api/routes/checkinRoutes.js @@ -1,6 +1,6 @@ const express = require('express'); const router = express.Router(); -const { requireAuth } = require('../middleware/auth'); +const { requireAuth, requirePage } = require('../middleware/auth'); const ctrl = require('../controllers/checkinController'); router.use(requireAuth); @@ -10,6 +10,7 @@ router.get('/schedule/:scheduleId', ctrl.list); router.get('/my', ctrl.myCheckins); // partner portal router.post('/', ctrl.checkIn); // partner can do this router.put('/:id/checkout', ctrl.checkOut); -router.put('/:id', ctrl.update); +router.put('/:id', requirePage('purchasing_schedule'), ctrl.update); +router.delete('/:id', requirePage('purchasing_schedule'), ctrl.deleteCheckin); module.exports = router; diff --git a/tkpurchase/web/schedule.html b/tkpurchase/web/schedule.html index 03fb35a..0b20ab7 100644 --- a/tkpurchase/web/schedule.html +++ b/tkpurchase/web/schedule.html @@ -211,8 +211,21 @@ - - + +
+ + +