OwlCyberSecurity - MANAGER
Edit File: leaveController.mjs
// ✅ No function call — just import the model import Employee from '../models/employee.mjs'; import Leave from '../models/leave.mjs'; import YearlyLeave from '../models/yearly.mjs'; export const submitLeave = async (req, res) => { try { const { EmployeeName, EmpNo, EmpStatus, Department, Designation, LeaveType, LeavePurpose, NoOfDaysRequired, ImmediateOfficer, GeneralManager, LeaveDate, } = req.body; // Basic required field validation if (!EmpNo || !EmployeeName || !LeaveType || !LeaveDate) { return res.status(400).json({ message: 'Required fields are missing' }); } const employee = await Employee.findOne({ where: { EmpNo } }); if (!employee) { return res.status(404).json({ message: 'Employee not found' }); } const daysRequested = parseInt(NoOfDaysRequired); // ✅ Validate Casual Leave if (LeaveType.toLowerCase() === 'casual') { if (employee.AvailedBalancedOfCL < daysRequested) { return res.status(400).json({ message: `❌ Cannot take ${daysRequested} days of Casual Leave. You only have ${employee.AvailedBalancedOfCL} day(s) left.`, }); } employee.AvailedLeaveCL += daysRequested; employee.AvailedBalancedOfCL -= daysRequested; await employee.save(); } // ✅ Validate Medical Leave else if (LeaveType.toLowerCase() === 'medical') { if (employee.AvailedBalancedOfML < daysRequested) { return res.status(400).json({ message: `❌ Cannot take ${daysRequested} days of Medical Leave. You only have ${employee.AvailedBalancedOfML} day(s) left.`, }); } employee.AvailedLeaveML += daysRequested; employee.AvailedBalancedOfML -= daysRequested; await employee.save(); } // ✅ Earned Leave → Save to YearlyLeave table else if (LeaveType.toLowerCase() === 'earned') { await YearlyLeave.create({ EmployeeId: employee.EmployeeId, LeaveID: null, // Optional: link later periodOfDuty: `${new Date().getFullYear()}`, leaveAtCredit: 30, leaveAvailed: daysRequested, startDate: new Date(LeaveDate), endDate: new Date(LeaveDate), // Adjust if multi-day balanceLeave: 30 - daysRequested, remarks: LeavePurpose || null, }); } const leave = await Leave.create({ LeaveDate: new Date(LeaveDate), EmployeeName, EmpNo, EmpStatus, Department, Designation, LeaveType, LeavePurpose, NoOfDaysRequired, ImmediateOfficer, GeneralManager, }); return res.status(201).json({ message: '✅ Leave submitted successfully', leave, }); } catch (error) { console.error('❌ Error submitting leave:', error); return res.status(500).json({ error: 'Internal server error', details: error.message }); } }; export const fetchAllLeaves = async (req, res, Leave) => { try { const leaves = await Leave.findAll({ order: [['LeaveID', 'DESC']], // Sort by latest leave }); res.json({ count: leaves.length, data: leaves }); } catch (err) { console.error('Failed to fetch leaves:', err); res.status(500).json({ message: 'Failed to fetch leaves' }); } }; export const updateLeave = async (req, res) => { try { const id = req.params.id; const updated = await Leave.update(req.body, { where: { LeaveID: id } }); if (updated[0] === 0) { return res.status(404).json({ message: 'Leave not found or not updated' }); } res.json({ message: 'Leave updated successfully' }); } catch (err) { console.error('❌ Update Error:', err); res.status(500).json({ message: 'Server error' }); } }; export const deleteLeave = async (req, res, Leave, Employee) => { const { id } = req.params; try { const leave = await Leave.findByPk(id); if (!leave) { return res.status(404).json({ message: 'Leave not found' }); } // 🔄 Reverse leave balance if it was approved if (leave.LeaveStatus === 'Approved') { const employee = await Employee.findOne({ where: { EmpNo: leave.EmpNo } }); if (employee) { const days = parseInt(leave.NoOfDaysRequired) || 0; if (leave.LeaveType.toLowerCase() === 'casual') { employee.AvailedLeaveCL -= days; employee.AvailedBalancedOfCL += days; } if (leave.LeaveType.toLowerCase() === 'medical') { employee.AvailedLeaveML -= days; employee.AvailedBalancedOfML += days; } await employee.save(); } } await leave.destroy(); res.json({ message: '🗑️ Leave deleted successfully' }); } catch (err) { console.error('Error deleting leave:', err); res.status(500).json({ message: 'Internal server error' }); } };