189 lines
5.2 KiB
JavaScript
189 lines
5.2 KiB
JavaScript
import { AttendanceSalesCoOrdinator } from "./AttandanceSalesCoordinatorModel.js";
|
|
|
|
export const markAttendance = async (req, res) => {
|
|
try {
|
|
const { date, time, location, notes } = req.body;
|
|
const salesCoordinatorId = req.salescoordinator._id;
|
|
|
|
// Get the start and end of the day to check if the attendance is already marked
|
|
const startOfDay = new Date(date);
|
|
startOfDay.setHours(0, 0, 0, 0);
|
|
|
|
const endOfDay = new Date(date);
|
|
endOfDay.setHours(23, 59, 59, 999);
|
|
|
|
// Check if the attendance record exists for today
|
|
const existingAttendance = await AttendanceSalesCoOrdinator.findOne({
|
|
salesCoordinator: salesCoordinatorId,
|
|
"records.date": { $gte: startOfDay, $lte: endOfDay },
|
|
});
|
|
|
|
if (existingAttendance) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: "Attendance for today is already marked.",
|
|
});
|
|
}
|
|
|
|
// Check if attendance record exists for the sales coordinator
|
|
let attendance = await AttendanceSalesCoOrdinator.findOne({
|
|
salesCoordinator: salesCoordinatorId,
|
|
});
|
|
|
|
if (!attendance) {
|
|
// Create a new attendance record if it doesn't exist
|
|
attendance = new AttendanceSalesCoOrdinator({
|
|
salesCoordinator: salesCoordinatorId,
|
|
records: [],
|
|
});
|
|
}
|
|
|
|
// Add the new attendance record to the array
|
|
attendance.records.push({ date, time, location, notes });
|
|
await attendance.save();
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: "Attendance marked successfully",
|
|
record: { date, time, location, notes },
|
|
});
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || "Something went wrong",
|
|
});
|
|
}
|
|
};
|
|
|
|
export const getAttendanceBySalesCoordinator = async (req, res) => {
|
|
try {
|
|
const salesCoordinatorId = req.salescoordinator._id;
|
|
|
|
const attendance = await AttendanceSalesCoOrdinator.findOne({
|
|
salesCoordinator: salesCoordinatorId,
|
|
}).populate("salesCoordinator", "name email");
|
|
|
|
if (!attendance) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: "No attendance records found for this sales coordinator.",
|
|
});
|
|
}
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
attendance,
|
|
});
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || "Something went wrong",
|
|
});
|
|
}
|
|
};
|
|
// admin
|
|
export const AdmingetAttendanceBySalesCoordinator = async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
const { page = 1, show = 10 } = req.query;
|
|
const limit = parseInt(show);
|
|
const skip = (page - 1) * limit;
|
|
|
|
// Find attendance records for the given sales coordinator
|
|
const attendanceDoc = await AttendanceSalesCoOrdinator.findOne({
|
|
salesCoordinator: id,
|
|
}).populate("salesCoordinator", "name email");
|
|
|
|
if (!attendanceDoc) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: "No attendance records found for this sales coordinator.",
|
|
});
|
|
}
|
|
|
|
// Pagination and slicing records
|
|
const totalData = attendanceDoc.records.length;
|
|
const paginatedRecords = attendanceDoc.records.slice(skip, skip + limit);
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
salesCoordinator: attendanceDoc.salesCoordinator,
|
|
attendance: paginatedRecords,
|
|
total_data: totalData,
|
|
});
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || "Something went wrong",
|
|
});
|
|
}
|
|
};
|
|
|
|
|
|
export const getTodayAttendance = async (req, res) => {
|
|
try {
|
|
const today = new Date();
|
|
today.setHours(0, 0, 0, 0);
|
|
|
|
const startOfDay = new Date(today);
|
|
const endOfDay = new Date(today);
|
|
endOfDay.setHours(23, 59, 59, 999);
|
|
|
|
const { page = 1, show = 10 } = req.query;
|
|
const limit = parseInt(show);
|
|
const skip = (page - 1) * limit;
|
|
|
|
const attendances = await AttendanceSalesCoOrdinator.aggregate([
|
|
{ $unwind: '$records' },
|
|
{
|
|
$match: {
|
|
'records.date': { $gte: startOfDay, $lte: endOfDay }
|
|
}
|
|
},
|
|
{
|
|
$lookup: {
|
|
from: 'salescoordinators',
|
|
localField: 'salesCoordinator',
|
|
foreignField: '_id',
|
|
as: 'salesCoordinator'
|
|
}
|
|
},
|
|
{ $unwind: '$salesCoordinator' },
|
|
{
|
|
$facet: {
|
|
totalData: [{ $count: 'count' }],
|
|
attendance: [
|
|
{ $skip: skip },
|
|
{ $limit: limit },
|
|
{
|
|
$project: {
|
|
salesCoordinator: {
|
|
id: '$salesCoordinator._id',
|
|
name: '$salesCoordinator.name',
|
|
email: '$salesCoordinator.email'
|
|
},
|
|
date: '$records.date',
|
|
time: '$records.time',
|
|
location: '$records.location',
|
|
note: '$records.notes'
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]);
|
|
|
|
const totalData = attendances[0].totalData[0] ? attendances[0].totalData[0].count : 0;
|
|
|
|
res.status(200).json({
|
|
success: true,
|
|
attendance: attendances[0].attendance,
|
|
total_data: totalData
|
|
});
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || 'Something went wrong'
|
|
});
|
|
}
|
|
}; |