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 { 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 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 GetVacations(Guid peopleResourceId) { if (Guid.Empty.Equals(peopleResourceId)) return null; var vacations = new Dictionary(); 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(); } } }