181 lines
7.7 KiB
C#
181 lines
7.7 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);//add check for non-working week
|
|
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();
|
|
}
|
|
}
|
|
} |