137 lines
4.4 KiB
C#
137 lines
4.4 KiB
C#
using FirmTracker_Server.Entities;
|
|
using FirmTracker_Server.nHibernate;
|
|
|
|
public class WorkdayRepository
|
|
{
|
|
public void StartWorkday(int userId)
|
|
{
|
|
using (var session = SessionFactory.OpenSession())
|
|
using (var transaction = session.BeginTransaction())
|
|
{
|
|
try
|
|
{
|
|
// Check if there is an existing workday that hasn't been stopped yet
|
|
var ongoingWorkday = session.Query<Workday>()
|
|
.Where(w => w.User.UserId == userId && w.EndTime == null)
|
|
.OrderByDescending(w => w.StartTime)
|
|
.FirstOrDefault();
|
|
|
|
if (ongoingWorkday != null)
|
|
{
|
|
// If there is an ongoing workday, throw an exception or return a specific message
|
|
throw new Exception("Previous workday wasn't stopped yet.");
|
|
}
|
|
|
|
// Fetch the user entity
|
|
var user = session.Get<User>(userId);
|
|
if (user == null) throw new Exception("User not found");
|
|
|
|
// Create a new workday if there is no ongoing one
|
|
var workday = new Workday
|
|
{
|
|
StartTime = DateTime.Now,
|
|
User = user,
|
|
Absence = ""
|
|
};
|
|
|
|
session.Save(workday);
|
|
transaction.Commit();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
transaction.Rollback();
|
|
throw new Exception("An error occurred while starting the workday", ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddAbsence(int userId, string absenceType, DateTime startTime, DateTime endTime)
|
|
{
|
|
using (var session = SessionFactory.OpenSession())
|
|
using (var transaction = session.BeginTransaction())
|
|
{
|
|
try
|
|
{
|
|
var user = session.Get<User>(userId);
|
|
if (user == null) throw new Exception("User not found");
|
|
|
|
// Create a new workday entry for the absence
|
|
var workday = new Workday
|
|
{
|
|
User = user,
|
|
StartTime = startTime,
|
|
EndTime = endTime,
|
|
Absence = absenceType // Store the absence type as a string
|
|
};
|
|
|
|
session.Save(workday);
|
|
transaction.Commit();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
transaction.Rollback();
|
|
throw new Exception("An error occurred while adding the absence", ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool StopWorkday(int userId)
|
|
{
|
|
using (var session = SessionFactory.OpenSession())
|
|
using (var transaction = session.BeginTransaction())
|
|
{
|
|
try
|
|
{
|
|
var workday = session.Query<Workday>()
|
|
.Where(w => w.User.UserId == userId && w.EndTime == null)
|
|
.OrderByDescending(w => w.StartTime)
|
|
.FirstOrDefault();
|
|
|
|
if (workday == null)
|
|
{
|
|
return false; // No ongoing workday found
|
|
}
|
|
|
|
workday.EndTime = DateTime.Now;
|
|
|
|
session.Update(workday);
|
|
transaction.Commit();
|
|
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
transaction.Rollback();
|
|
throw new Exception("An error occurred while stopping the workday", ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
public List<Workday> GetWorkdaysByUser(string email)
|
|
{
|
|
using (var session = SessionFactory.OpenSession())
|
|
{
|
|
try
|
|
{
|
|
var workdays = session.Query<Workday>()
|
|
.Where(w => w.User.Email == email)
|
|
.Select(w => new Workday
|
|
{
|
|
Id = w.Id,
|
|
StartTime = w.StartTime,
|
|
EndTime = w.EndTime ?? DateTime.Today.AddHours(17),
|
|
WorkedHours = (w.EndTime ?? DateTime.Today.AddHours(17)) - w.StartTime,
|
|
Absence = w.Absence,
|
|
})
|
|
.ToList();
|
|
|
|
return workdays;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception("An error occurred while fetching workdays", ex);
|
|
}
|
|
}
|
|
}
|
|
}
|