igcrmapi/src/attendance/attendance.service.ts

96 lines
2.8 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { CreateAttendanceDto } from './dto/create-attendance.dto';
import { UpdateAttendanceDto } from './dto/update-attendance.dto';
import { PrismaService } from '../prisma/prisma.service';
import { UsersService } from '../users/users.service';
import { user_role } from '@prisma/client';
@Injectable()
export class AttendanceService {
constructor(
private prisma: PrismaService,
private usersService: UsersService
) { }
private getDateRange(dateStr?: string) {
const start = dateStr ? new Date(dateStr) : new Date();
start.setHours(0, 0, 0, 0);
const end = new Date(start);
end.setHours(23, 59, 59, 999);
return { start, end };
}
async checkIn(userId: string, createAttendanceDto: CreateAttendanceDto) {
// Check if already checked in today? (Optional enhancement)
return this.prisma.attendance.create({
data: {
userId,
checkInLat: createAttendanceDto.latitude,
checkInLng: createAttendanceDto.longitude,
checkInLoc: createAttendanceDto.address,
checkInTime: new Date(),
},
});
}
async checkOut(id: string, updateAttendanceDto: UpdateAttendanceDto) {
return this.prisma.attendance.update({
where: { id },
data: {
checkOutLat: updateAttendanceDto.latitude,
checkOutLng: updateAttendanceDto.longitude,
checkOutLoc: updateAttendanceDto.address,
checkOutTime: new Date(),
}
})
}
async findAll(user: any, date?: string) {
const { start, end } = this.getDateRange(date);
if (user.role === user_role.ADMIN) {
return this.prisma.attendance.findMany({
where: {
checkInTime: { gte: start, lte: end }
},
include: { user: true },
orderBy: { checkInTime: 'desc' }
});
}
const subordinateIds = await this.usersService.getSubordinateIds(user.id);
const allowedUserIds = [user.id, ...subordinateIds];
return this.prisma.attendance.findMany({
where: {
userId: { in: allowedUserIds },
checkInTime: { gte: start, lte: end }
},
include: { user: true },
orderBy: { checkInTime: 'desc' }
});
}
findOne(id: string) {
return this.prisma.attendance.findUnique({ where: { id }, include: { user: true } });
}
// Find active check-in for user
findActiveCheckIn(userId: string) {
// Logic to find if user has a check-in without check-out today
// For simplicity, returning the latest one
return this.prisma.attendance.findFirst({
where: { userId, checkOutTime: null },
orderBy: { checkInTime: 'desc' }
});
}
findMyHistory(userId: string) {
return this.prisma.attendance.findMany({
where: { userId },
orderBy: { checkInTime: 'desc' },
take: 30 // Last 30 records for now
});
}
}