EnVisageOnline/Beta/Source/EnVisage/Code/BLL/VacationManager.cs

181 lines
7.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using EnVisage.Models;
namespace EnVisage.Code.BLL
{
public class VacationManager : ManagerBase<Vacation, VacationModel>
{
public VacationManager(EnVisageEntities dbContext)
: base(dbContext)
{
}
protected override Vacation InitInstance()
{
return new Vacation { Id = Guid.NewGuid() };
}
protected override Vacation RetrieveReadOnlyById(Guid key)
{
return DataTable.AsNoTracking().FirstOrDefault(t => t.Id == key);
}
public override DbSet<Vacation> DataTable
{
get
{
return DbContext.Vacations;
}
}
public override Vacation Save(VacationModel model)
{
if (!model.StartDate.HasValue)
throw new ArgumentNullException("model.StartDate");
if (!model.EndDate.HasValue)
throw new ArgumentNullException("model.EndDate");
var obj = base.Save(model);
#region Save PeopleResourceVacations
if (!Guid.Empty.Equals(model.Id))
{
var items2Delete = DbContext.PeopleResourceVacations.Where(t => t.VacationId == model.Id);
foreach (var peopleResourceVacation in items2Delete)
{
DbContext.Entry(peopleResourceVacation).State = EntityState.Deleted;
}
}
var weekEndingSetting = DbContext.SystemSettings.FirstOrDefault(t => t.Type == (int)SystemSettingType.FiscalCalendarWeekEnding);
var weekEndingDay = weekEndingSetting != null
? (DayOfWeek)Convert.ToInt16(weekEndingSetting.Value)
: DayOfWeek.Saturday;
var weekEndingDate = model.StartDate.Value;
if (weekEndingDate.DayOfWeek != weekEndingDay)
weekEndingDate = Utils.GetNextDateByWeekDate(weekEndingDate, (short)weekEndingDay, 1, true);
var rangeEndDate = model.EndDate.Value;
if (rangeEndDate.DayOfWeek != weekEndingDay)
rangeEndDate = Utils.GetNextDateByWeekDate(rangeEndDate, (short)weekEndingDay, 1, true);
var dt = weekEndingDate.AddDays(-6);
var businessDays = 0;
var wkEndDts = 0;
while (dt <= rangeEndDate)
{
if (dt > weekEndingDate)
{
var hoursOff = Convert.ToInt32(businessDays * model.UOMValue * model.HoursOff / ((7 - wkEndDts) * 100));
if (hoursOff > 0)
{
DbContext.PeopleResourceVacations.Add(new PeopleResourceVacation
{
Id = Guid.NewGuid(),
VacationId = obj.Id,
WeekEndingDate = weekEndingDate,
HoursOff = hoursOff,
LastUpdate = DateTime.Now,
PeopleResourceId = model.PeopleResourceId
});
}
weekEndingDate = weekEndingDate.AddDays(7);
businessDays = 0;
wkEndDts = 0;
}
if (model.StartDate.Value <= dt && dt <= model.EndDate.Value)
businessDays++;
if (model.Weekends.Any(t => dt == t))
{
wkEndDts++;
if (model.StartDate.Value <= dt && dt <= model.EndDate.Value)
businessDays--;
}
dt = dt.AddDays(1);
}
if (wkEndDts != 7)
{
var hoursOff = Convert.ToInt32(businessDays * model.UOMValue * model.HoursOff / ((7 - wkEndDts) * 100));
if (hoursOff > 0)
{
DbContext.PeopleResourceVacations.Add(new PeopleResourceVacation
{
Id = Guid.NewGuid(),
VacationId = obj.Id,
WeekEndingDate = weekEndingDate,
HoursOff = hoursOff,
LastUpdate = DateTime.Now,
PeopleResourceId = model.PeopleResourceId
});
}
}
#endregion
return obj;
}
public static List<VacationModel> GetVacations(Guid peopleResourceId)
{
if (Guid.Empty.Equals(peopleResourceId))
return null;
var vacations = new Dictionary<Guid, VacationModel>();
var prevDate = DateTime.MinValue;
VacationModel item = null;
using (var db = new EnVisageEntities())
{
var uomValue = (from p in db.PeopleResources
join ec in db.ExpenditureCategory on p.ExpenditureCategoryId equals ec.Id
join uom in db.UOMs on ec.UOMId equals uom.Id
where p.Id == peopleResourceId
select new {uom.Id, uom.UOMValue}).FirstOrDefault();
if (uomValue == null || uomValue.UOMValue == 0)
throw new UOMNotExistsException();
var records = (from v in db.Vacations
join prv in db.PeopleResourceVacations on v.Id equals prv.VacationId into g
from sub in g.DefaultIfEmpty()
where v.PeopleResourceId == peopleResourceId
select
new
{
v.Id,
v.StartDate,
v.EndDate,
itemId = sub == null ? (Guid?)null : sub.Id,
HoursOff = sub == null ? (int?)null : sub.HoursOff,
WeekEndingDate = sub == null ? (DateTime?)null : sub.WeekEndingDate,
LastUpdate = sub == null ? (DateTime?)null : sub.LastUpdate
});
foreach (var vacation in records.OrderBy(o => o.WeekEndingDate))
{
if (!vacations.ContainsKey(vacation.Id))
{
item = new VacationModel
{
Id = vacation.Id,
StartDate = vacation.StartDate,
EndDate = vacation.EndDate,
PeopleResourceId = peopleResourceId,
UOMValue = uomValue.UOMValue
};
vacations.Add(item.Id, item);
}
if (vacation.itemId.HasValue)
{
item.PeopleResourceVacations.Add(new PeopleResourceVacationModel
{
Id = vacation.itemId.Value,
WeekEndingDate = vacation.WeekEndingDate.Value,
HoursOff = vacation.HoursOff.Value,
LastUpdate = vacation.LastUpdate.Value,
PeopleResourceId = peopleResourceId
});
}
}
}
return vacations.Values.ToList();
}
}
}