internal static IQueryable <SarEvent> GetActiveEvents(IMissionLineDbContext db, IConfigSource config) { IQueryable <SarEvent> query = db.Events; DateTimeOffset cutoff = DateTimeOffset.UtcNow.AddDays(-2).ToOrgTime(config); query = query.Where(f => f.Closed == null || f.Closed > cutoff); return(query.OrderByDescending(f => f.Opened)); }
internal static EventEntry GetEventEntry(int id, IMissionLineDbContext db) { return(db.Events.Where(f => f.Id == id) .Select(proj) .SingleOrDefault()); }
internal async static Task <CallEntry> GetCallEntry(int id, IMissionLineDbContext db) { return(await db.Calls.Where(f => f.Id == id) .Select(proj) .SingleOrDefaultAsync()); }
//[HttpPost] //[Route("api/roster/{rosterId}/signout")] //public async Task<SubmitResult> Signout(int rosterId, DateTime when, int? miles) //{ // var result = new SubmitResult(); // using (var db = dbFactory()) // { // var roster = db.SignIns.SingleOrDefault(f => f.Id == rosterId); // if (roster == null) // { // result.Errors.Add(new SubmitError("Roster entry not found")); // } // else // { // roster.TimeOut = when; // roster.Miles = miles; // await AssignInternal(roster, roster.EventId, db, config); // } // } // return result; //} //[HttpPost] //[Route("api/roster/{rosterId}/undoSignout")] //public async Task<SubmitResult> UndoSignout(int rosterId) //{ // var result = new SubmitResult(); // using (var db = dbFactory()) // { // var roster = db.SignIns.SingleOrDefault(f => f.Id == rosterId); // if (roster == null) // { // result.Errors.Add(new SubmitError("Roster entry not found")); // } // else // { // roster.TimeOut = null; // await AssignInternal(roster, roster.EventId, db, config); // } // } // return result; //} internal static RosterEntry GetRosterEntry(int id, IMissionLineDbContext db) { return(db.SignIns.Where(f => f.Id == id) .Select(proj) .SingleOrDefault()); }
private static MemberSignIn SplitSignin(int?eventId, MemberSignIn outer, MemberSignIn inner, IMissionLineDbContext db, IConfigSource config) { MemberSignIn front = new MemberSignIn { EventId = eventId, isMember = outer.isMember, MemberId = outer.MemberId, Name = outer.Name, TimeIn = outer.TimeIn, TimeOut = inner.TimeIn }; db.SignIns.Add(front); outer.TimeIn = inner.TimeOut ?? DateTimeOffset.UtcNow.ToOrgTime(config); return(front); }
internal static async Task <SubmitResult> AssignInternal(MemberSignIn signin, int?eventId, IMissionLineDbContext db, IConfigSource config) { var result = new SubmitResult(); var notifications = new List <Action>(); var hub = config.GetPushHub <CallsHub>(); var exposedSignin = await db.SignIns .Where(f => f.MemberId == signin.MemberId && f.EventId == signin.EventId && f.Id != signin.Id) .OrderByDescending(f => f.TimeIn) .FirstOrDefaultAsync(); if (exposedSignin != null) { notifications.Add(() => hub.updatedRoster(compiledProj(exposedSignin), true)); } var others = db.SignIns.Where(f => f.EventId == eventId && f.MemberId == signin.MemberId && f.Id != signin.Id).OrderBy(f => f.TimeIn).ToList(); DateTimeOffset effectiveTimeOut = signin.TimeOut ?? DateTimeOffset.MaxValue; bool rosterisLatest = true; foreach (var other in others) { var otherTimeOut = other.TimeOut ?? DateTimeOffset.MaxValue; // R: [----------> // O: [----------] // R: [----------> // O: [--------> // R: [----------] // O: [-----> // R: [--------------------] // O: [-------] // R: [---------] // O: [---> // R: [------] // O: [------] // R: [---] // O: [----] // R: [-----] // O: [-----] // R: [---] // O: [---] // Trim signins that overlap our time in. if (signin.TimeIn <= other.TimeIn) { if (effectiveTimeOut >= other.TimeIn && effectiveTimeOut <= otherTimeOut) { // roster is before the other one. It is not the latest rosterisLatest = false; notifications.Add(() => hub.updatedRoster(compiledProj(other), true)); signin.TimeOut = other.TimeIn; } else if (effectiveTimeOut > otherTimeOut) { // split roster around other. // roster is the most recent, other and front are not. var front = SplitSignin(eventId, signin, other, db, config); notifications.Add(() => hub.updatedRoster(compiledProj(front), false)); notifications.Add(() => hub.updatedRoster(compiledProj(other), false)); } } else { if (otherTimeOut > signin.TimeIn && otherTimeOut <= effectiveTimeOut) { // other overlaps on the early side other.TimeOut = signin.TimeIn; notifications.Add(() => hub.updatedRoster(compiledProj(other), false)); } else if (otherTimeOut > effectiveTimeOut) { //split other around roster var front = SplitSignin(eventId, other, signin, db, config); notifications.Add(() => hub.updatedRoster(compiledProj(front), false)); notifications.Add(() => hub.updatedRoster(compiledProj(other), true)); rosterisLatest = false; } else if (otherTimeOut < signin.TimeIn) { // other notification is not the latest. notifications.Add(() => hub.updatedRoster(compiledProj(other), false)); } } } signin.EventId = eventId; notifications.Add(() => hub.updatedRoster(compiledProj(signin), rosterisLatest)); db.SaveChanges(); foreach (var notify in notifications) { notify(); } return(result); }
// ========================================= END PUBLIC METHODS ============================================= private Task <MemberSignIn> GetMembersLatestSignin(IMissionLineDbContext db, string memberId) { return(db.SignIns.OrderByDescending(f => f.TimeIn).FirstOrDefaultAsync(f => f.MemberId == memberId)); }