public async Task <IActionResult> Edit(Guid id, [Bind("WorktimeID,EmplID,ProjectID,ServiceID,WorkDate,TimeUsed,DrivingTime,Lunch")] Worktime worktime) { if (id != worktime.WorktimeID) { return(NotFound()); } worktime.UserID = this.User.FindFirst(ClaimTypes.NameIdentifier).Value; if (ModelState.IsValid) { try { _context.Update(worktime); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!WorktimeExists(worktime.WorktimeID)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } PopulateProjectDropDownList(worktime.ProjectID); PopulateServiceDropDownList(worktime.ServiceID); return(View(worktime)); }
public IActionResult Worktime(AddTimeViewModel addTimeViewModel) { if (ModelState.IsValid) { Project newProject = context.Projects.Single(p => p.ProjectID == addTimeViewModel.ProjectID); Worktime newWorktime = new Worktime { Hours = addTimeViewModel.Hours, WeekRange = WeekNumber.WeekDict[addTimeViewModel.WeekId], Description = addTimeViewModel.Description, Project = newProject }; newWorktime.Amount = newWorktime.Hours * (double)newWorktime.Project.Rate; newWorktime.OpenStatus = true; context.Worktimes.Add(newWorktime); context.SaveChanges(); return(Redirect("/?id=" + addTimeViewModel.ProjectID)); } addTimeViewModel.SelectProjects = SelectListGen.SelectProjects(context.Projects.ToList()); return(View("AddTime", addTimeViewModel)); }
//*********************************************************************************** //Get Timesheet public ActionResult VolunteerTimesheet() { var vol = db.Volunteers; var user = (from i in vol where i.volEmail == User.Identity.Name select i.volID).SingleOrDefault(); var volunteerID = user; var timesheet = db.Worklog.Where(s => s.volID == volunteerID).ToList().OrderByDescending(d => d.wrkDate); var wlog = db.Worklog.Include(v => v.Volunteer); var volunteers = db.Volunteers; //will set Worktime object if Endtime null. i.e., user clocked-in. Worktime time = (from w in wlog where w.volID == volunteerID && w.wrkEndTime == null select w).SingleOrDefault(); if (time != null) //time variable holds a record with wrkEndTime==null, user is still clocked in { ViewBag.ClockStatus = "Clocked In"; ViewBag.ClockActionBtn = "Click To Clock Out"; } else //user has no record containing null wrkEndTime, user currently clocked out { ViewBag.ClockStatus = "Clocked Out"; ViewBag.ClockActionBtn = "Click To Clock In"; } return(PartialView("_VolunteerTimesheet", timesheet)); }
public async Task <IActionResult> Edit(int id, [Bind("WorktimeId,PersonId,Date,Hours,LocalId,PositionId")] Worktime worktime) { if (id != worktime.WorktimeId) { return(NotFound()); } if (ModelState.IsValid) { try { _context.Update(worktime); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!WorktimeExists(worktime.WorktimeId)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(Index))); } ViewData["LocalId"] = new SelectList(_context.Locals, "LocalId", "LocalName", worktime.LocalId); ViewData["PersonId"] = new SelectList(_context.People, "PersonId", "PersonId", worktime.PersonId); ViewData["PositionId"] = new SelectList(_context.Positions, "PositionId", "PositionName", worktime.PositionId); return(View(worktime)); }
//*********************************************************************************** //Update Timesheet public ActionResult UpdateTimesheet(int?id) { ViewBag.FullName = getUserName(); if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } Worktime worklog = db.Worklog.Find(id); if (worklog == null) { return(HttpNotFound()); } ViewBag.volID = new SelectList(db.Volunteers, "volID", "volFirstName", worklog.volID); if (Request.Browser.Browser == "InternetExplorer") { ViewBag.date = worklog.wrkDate.ToShortDateString(); } else { ViewBag.date = worklog.wrkDate.ToString("yyyy-MM-dd"); } return(View(worklog)); }
public IHttpActionResult PutWorktime(int id, Worktime worktime) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (id != worktime.WorkTimeID) { return(BadRequest()); } db.Entry(worktime).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!WorktimeExists(id)) { return(NotFound()); } else { throw; } } return(StatusCode(HttpStatusCode.NoContent)); }
public void TestWorktimeCanAddAndFormatAsTime(double value, double toAdd, WorktimePrecision withPrecision, string expectedTime, string expectedDecimal) { var wt = new Worktime(value, WorktimePrecision.Minutes); wt = wt.Add(toAdd, withPrecision); Assert.That(wt.ToString(null, CultureInfo.InvariantCulture), Is.EqualTo(expectedTime)); Assert.That(wt.ToString("d", CultureInfo.InvariantCulture), Is.EqualTo(expectedDecimal)); }
public void TestMoneyCanAddAndFormatAsTime(double worktime, double value, MoneyChargeRate chargeRate, double tax, string expected) { var wt = new Worktime(worktime, WorktimePrecision.Minutes); var money = Money.Get(wt, value, chargeRate); var taxValue = money.GetTax(tax); money = money.Add(taxValue); Assert.That(money.ToString(null, CultureInfo.InvariantCulture), Is.EqualTo(expected)); }
public IHttpActionResult GetWorktime(int id) { Worktime worktime = db.Worktimes.Find(id); if (worktime == null) { return(NotFound()); } return(Ok(worktime)); }
public IHttpActionResult PostWorktime(Worktime worktime) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } db.Worktimes.Add(worktime); db.SaveChanges(); return(CreatedAtRoute("DefaultApi", new { id = worktime.WorkTimeID }, worktime)); }
public async Task <IActionResult> Create([Bind("WorktimeID,EmplID,ProjectID,ServiceID,WorkDate,TimeUsed,DrivingTime,Lunch")] Worktime worktime) { if (ModelState.IsValid) { worktime.WorktimeID = Guid.NewGuid(); worktime.UserID = this.User.FindFirst(ClaimTypes.NameIdentifier).Value; _context.Add(worktime); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } return(View(worktime)); }
public ActionResult UpdateTimesheet([Bind(Include = "wrkID,volID,wrkDate,wrkStartTime,wrkEndTime")] Worktime worklog) { if (ModelState.IsValid) { db.Entry(worklog).State = EntityState.Modified; //db.Worklog.Add(worklog); db.SaveChanges(); return(RedirectToAction("Index", new { id = worklog.volID })); } return(View(worklog)); }
public async Task <IActionResult> Create([Bind("WorktimeId,PersonId,Date,Hours,LocalId,PositionId")] Worktime worktime) { if (ModelState.IsValid) { _context.Add(worktime); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index))); } ViewData["LocalId"] = new SelectList(_context.Locals, "LocalId", "LocalName", worktime.LocalId); ViewData["PersonId"] = new SelectList(_context.People, "PersonId", "PersonId", worktime.PersonId); ViewData["PositionId"] = new SelectList(_context.Positions, "PositionId", "PositionName", worktime.PositionId); return(View(worktime)); }
public IHttpActionResult DeleteWorktime(int id) { Worktime worktime = db.Worktimes.Find(id); if (worktime == null) { return(NotFound()); } db.Worktimes.Remove(worktime); db.SaveChanges(); return(Ok(worktime)); }
//*********************************************************************************** //Update Timesheet public ActionResult UpdateTimesheet() { var vol = db.Volunteers; var user = (from i in vol where i.volEmail == User.Identity.Name select i.volID).SingleOrDefault(); ViewBag.FullName = getUserName(); Worktime worklog = db.Worklog.Find(user); if (worklog == null) { return(HttpNotFound()); } ViewBag.volID = new SelectList(db.Volunteers, "volID", "volFirstName", worklog.volID); return(View(worklog)); }
public ActionResult UpdateTimesheet([Bind(Include = "wrkID,volID,wrkDate,wrkStartTime,wrkEndTime")] Worktime worklog) { ViewBag.FullName = getUserName(); if (Request.Browser.Browser == "InternetExplorer") { ViewBag.date = worklog.wrkDate.ToShortDateString(); } else { ViewBag.date = worklog.wrkDate.ToString("yyyy-MM-dd"); } if (ModelState.IsValid) { List <Worktime> timesheet = db.Worklog.AsNoTracking().Where(t => t.volID.Equals(worklog.volID)).ToList(); //get all records in vol's timesheet Worktime oldWorklog = timesheet.Where(t => t.wrkID.Equals(worklog.wrkID)).FirstOrDefault(); worklog.wrkStartTime = worklog.wrkDate.Add(worklog.wrkStartTime.TimeOfDay); worklog.wrkEndTime = worklog.wrkDate.Add(worklog.wrkEndTime.Value.TimeOfDay); var updateStartTime = worklog.wrkStartTime; var updateEndTime = worklog.wrkEndTime; var updatedRecordIsValid = true; var updateSuccessful = false; if (updateStartTime == null || updateEndTime == null) { ViewBag.updateTimesheetError = "All fields must be filled."; return(View(worklog)); } if (updateStartTime > updateEndTime) //user input error: clockin time after clockout time { ViewBag.updateTimesheetError = "The clock-out time should be later than clock-in time. Please adjust clock-out to after clock-in or adjust clock-in to before clock-out."; return(View(worklog)); } foreach (var record in timesheet) { if (record.wrkID != worklog.wrkID) { bool overlap = worklog.wrkStartTime < record.wrkEndTime && record.wrkStartTime < worklog.wrkEndTime; if (overlap) { updatedRecordIsValid = false; ViewBag.recordConflict = "Conflicting Record: " + record.wrkDate.Date.ToShortDateString() + " - " + record.wrkStartTime.ToShortTimeString() + " - " + record.wrkEndTime.Value.ToShortTimeString(); } } } if (updatedRecordIsValid) //everything is ok { db.Entry(worklog).State = EntityState.Modified; db.SaveChanges(); updateSuccessful = true; } else { ViewBag.updateTimesheetError = "This update conflicts with one or more existing timesheet records."; } if (updateSuccessful == true) { List <string> flags = new List <string>(); using (System.IO.StreamReader file = new System.IO.StreamReader(Server.MapPath("~/Content/docs/WorklogDataMessages/") + ("WorklogDataFlags.txt"), false)) { try { var txt = ""; while ((txt = file.ReadLine()) != null) { var msgs = txt.Split(';'); foreach (var item in msgs) { if (item != "") { var id_code = item.Split(','); if (id_code[0] != worklog.wrkID.ToString()) { flags.Add(item); } } } } file.Close(); } catch (Exception e) { } } using (System.IO.StreamWriter newFile = new System.IO.StreamWriter(Server.MapPath("~/Content/docs/WorklogDataMessages/") + ("WorklogDataFlags.txt"), false)) { try { foreach (var item in flags) { if (item != "") { newFile.Write(item + ";"); } } newFile.Close(); } catch (Exception e) { } } return(RedirectToAction("Details", new { id = worklog.volID })); } } return(View(worklog)); }
/// <summary> /// 查询指定日期范围内的运转时间并补偿相应的数量 /// </summary> /// <param name="averagable"></param> /// <returns></returns> private string HandleQueryEquipmentWorktime(bool averagable = true) { var ret = "{}"; var id = ParseInt(Utility.Decrypt(data)); var obj = EquipmentInstance.Find(f => f.id == id && f.Deleted == false); if (null != obj) { var date = DateTime.Parse(GetParamenter("date") + " 00:00:00"); // 如果不是求平均值则将日期往前推一天 //if (!averagable) { date = date.AddDays(-1); } var date1 = DateTime.Parse(GetParamenter("date1") + " 23:59:59"); List <WorktimeChart> avg = new List <WorktimeChart>(); List <WorktimeChart> work = new List <WorktimeChart>(); DateTime dt = date; // 循环每天一个节点 while (dt.Ticks < date1.Ticks) { avg.Add(new WorktimeChart() { date = dt.ToString("yyyy/MM/dd"), x = Utility.DateTimeToJavascriptDate(dt.Date), y = 0, min = 0 }); work.Add(new WorktimeChart() { date = dt.ToString("yyyy/MM/dd"), x = Utility.DateTimeToJavascriptDate(dt.Date), y = 0, min = 0 }); dt = dt.AddDays(1); } var macid = EquipmentInstance.GetFullNumber(obj); var cmds = new string[] { "0x1000", "0x600B" }; var runtimes = DataInstance.FindList(f => f.mac_id.Equals(macid) && cmds.Contains(f.command_id) && f.receive_time >= date && f.receive_time <= date1).OrderBy(o => o.receive_time); var list = new List <Worktime>(); if (null != runtimes) { long today = 0; long timeInterval = 0; foreach (var r in runtimes) { bool gps = r.command_id.Equals("0x1000"); if (today == 0) { dt = r.receive_time.Value; } else { // 计算与上一条数据的实际接收时间之间的时间差 timeInterval = (long)(r.receive_time.Value - dt).TotalSeconds; } var t = Utility.DateTimeToJavascriptDate(r.receive_time.Value.Date); // 日期不同则重置日期和运转时间 if (today != t) { today = t; } byte[] temp = null; int index = 0; if (gps) { if (r.protocol_type == ProtocolTypes.SATELLITE) { temp = CustomConvert.GetBytes(r.message_content); index = 13; } } else { temp = CustomConvert.GetBytes(r.message_content); index = 0; } // 增加一个节点 Worktime wt = new Worktime(); wt.date = r.receive_time.Value.ToString("yyyy/MM/dd HH:mm:ss"); wt.worktime = null == temp ? 0 : BitConverter.ToUInt32(temp, index); var bin = !gps ? "00000000" : CustomConvert.IntToDigit(temp[4], CustomConvert.BIN, 8); // 如果list已经有数据则计算与上一条数据之间的差值 var cnt = list.Count; if (cnt > 0) { if (wt.worktime < list[cnt - 1].worktime) { // 当前运转时间小于前一条时,小计为0 wt.interval = 0; } else { // 差值 wt.interval = !gps ? 0 : (wt.worktime - list[cnt - 1].worktime); // 计算差值与实际两条数据的接收时间差值的对比 if (wt.interval > timeInterval) { // 如果运转时间差超过了这两条数据接收时间的差值,则记为0 wt.interval = 0; } // 计算运转时间之间的差值 2016/08/15 15:00 if (wt.interval > 0) { uint hour = (uint)r.receive_time.Value.Hour, min = (uint)r.receive_time.Value.Minute; // 凌晨0点的运转时间需要分开到两个日期里 if (hour == 0) { // 时间间隔大于0点已过的分钟数,则需要把时间差分开到两个日期里 if (wt.interval > min) { list[cnt - 1].interval += wt.interval - min; wt.interval = min; } } } // 补偿的分钟 if (wt.interval > 0) { uint ad = 0; if (wt.interval > 60) { ad = wt.interval / 60; } else { ad = 1; } if (bin[6] == '1') { ad += 1; } wt.added = ad; } else { wt.interval = 0; } // 所用的小时 wt.hours = wt.interval > 0 ? (wt.interval > 60 ? wt.interval / 60 : 1) : 0; } } else { // 第一条数据小计为0 wt.interval = 0; } list.Add(wt); // 更新本日最后的运转时间 var wk = work.FirstOrDefault(f => f.x == today); if (null != wk) { //if (wk.min == 0) { wk.min = run; } wk.min = wt.worktime; } }// end of foreach // 工作时间总计 var totalWorkMins = list.Sum(s => s.interval); // 补偿的分钟 var totalAddMins = list.Sum(s => s.added); // 所用的小时数 var totalUsedHours = list.Sum(s => s.hours); // 工作效率 var compensate = totalWorkMins / 60.0 / totalUsedHours; // 最终增加的小时数 var finalAdded = totalAddMins / 60.0 * compensate; // 计算每日运转时间 foreach (var f in work) { f.y = Math.Round(list.Where(w => w.date.Contains(f.date)).Sum(s => s.interval) / 60.0, 2); f.add = finalAdded; } // 有工作时间的天数里平均加入补偿的小时数 var per = finalAdded / work.Count(c => c.y > 0); //per = Math.Round(per, 2); // 加入补偿 foreach (var w in work) { //if (!averagable) { w.y += w.y > 0 ? per : 0; // 如果超过24小时则直接设为24小时 2016/08/15 15:16 if (w.y >= 24) { w.y = 24; } } if (averagable) { w.y = Math.Round(w.y, 2); } } // 计算平均值 var avgg = Math.Round(work.Sum(s => s.y) * 1.0 / work.Count, 2); foreach (var a in avg) { a.y = avgg; } } if (averagable) { ret = string.Format("{0}\"Average\":{1},\"Worktime\":{2}{3}", "{", JsonConverter.ToJson(avg), JsonConverter.ToJson(work), "}"); } else { ret = JsonConverter.ToJson(work); } } return(ret); }
public ActionResult Index([Bind(Include = "wrkID,volID,wrkDate,wrkStartTime,wrkEndTime")] string email) { ViewBag.FullName = getUserName(); string text = ""; DirectoryInfo d = new DirectoryInfo(Server.MapPath("~/Content/docs/HomePageMessages")); foreach (var file in d.GetFiles("*.txt")) { text += System.IO.File.ReadAllText(file.FullName); } ViewBag.message = text.Replace(Environment.NewLine, "<br />"); ViewBag.confirm = email + " is now... "; ViewBag.clock = ""; var wlog = db.Worklog.Include(v => v.Volunteer); var volunteers = db.Volunteers; //get id from email var thisVolID = (from i in volunteers where i.volEmail == email select i.volID).SingleOrDefault(); //will set Worktime object if Endtime null. i.e., user clocked-in. Worktime time = (from w in wlog where w.volID == thisVolID && w.wrkEndTime == null select w).SingleOrDefault(); TimeSpan closingTime = new TimeSpan(17, 00, 00); //if wrkEndTime null, user is still clocked in. Update wrkEndTime with timestamp. //Then, user has no worktime record with empty end time. At next entry query will return null and move to else. if (time != null) //user still clocked in { time.wrkEndTime = DateTime.Now; if (time.wrkEndTime.Value.Date != time.wrkStartTime.Date) //if clocked out the day after clocked in { time.wrkEndTime = new DateTime(time.wrkStartTime.Year, time.wrkStartTime.Month, time.wrkStartTime.Day, 17, 0, 0); ViewBag.SignInMsg = "You were still signed-in. \n\n Last sign-in occured: " + time.wrkStartTime + "\n\n You are now signed-out for that day (5:00 PM). \n Please enter your e-mail again if you want to sign-in for today"; using (System.IO.StreamWriter file = new System.IO.StreamWriter(Server.MapPath("~/Content/docs/WorklogDataMessages/") + ("WorklogDataFlags.txt"), true)) { var flag = time.wrkID + ",2;"; file.Write(flag); } //send notification to admin } else if (time.wrkEndTime.Value.TimeOfDay >= closingTime) //clocked out same day as clock in, but after 5 PM { time.wrkEndTime = new DateTime(time.wrkStartTime.Year, time.wrkStartTime.Month, time.wrkStartTime.Day, 17, 0, 1); ViewBag.SignInMsg = "You were still signed-in. \n\n Last sign-in occured: " + time.wrkStartTime + "\n\n You are now signed-out for that day (5:00 PM). \n Please enter your e-mail again if you want to sign-in for today"; using (System.IO.StreamWriter file = new System.IO.StreamWriter(Server.MapPath("~/Content/docs/WorklogDataMessages/") + ("WorklogDataFlags.txt"), true)) { var flag = time.wrkID + ",1;"; file.Write(flag); } //send notification to admin } ViewBag.clock = "Clocked Out!"; db.SaveChanges(); } else //user has no record containing null wrkEndTime, user currently clocked out { try { if (ModelState.IsValid) { if (DateTime.Now.TimeOfDay >= closingTime) // if user tries to clock in after 5pm today { ViewBag.confirm = ""; ViewBag.clock = "You cannot sign in after 5 PM. Please see your administrator for more information."; } else //normal working hours { Worktime newTime = new Worktime(); newTime.volID = thisVolID; newTime.wrkDate = DateTime.Now; newTime.wrkStartTime = DateTime.Now; newTime.wrkEndTime = null; db.Worklog.Add(newTime); db.SaveChanges(); ViewBag.clock = "Clocked In!"; } } } catch (DataException) { ViewBag.clock = ""; ViewBag.confirm = ""; ModelState.AddModelError("", "We cannot find your account. Try again. If the problem persists, contact your system administrator."); } } var sorts = from s in wlog select s; sorts = sorts.OrderByDescending(s => s.wrkDate); sorts = sorts.Take(15); return(View(sorts.ToList())); }