public async Task <ExSaveDataResult <ExMeeting> > SetMeetingWeb([FromBody] ExSaveMeetingRequest request) { if (request.CheckPassword != WebAppSettings.CheckPassword) { HttpContext.Response.StatusCode = Unauthorized().StatusCode; return(null); } return(await SetMeetingInternal(request)); }
public async Task <ExSaveDataResult <ExMeeting> > SetMeeting([FromBody] ExSaveMeetingRequest request) { ClaimsIdentity identity = null; try { identity = HttpContext.User.Identity as ClaimsIdentity; } catch (Exception e) { Logging.Log.LogError("No Claims identity"); } if (identity != null) { var claims = identity.Claims; if (!identity.HasClaim(c => c.Type == "UserID")) { HttpContext.Response.StatusCode = Unauthorized().StatusCode; return(null); } var userId = identity.HasClaim(c => c.Type == "UserID") ? identity.FindFirst("UserID").Value : "a"; //BENUTZER ID if (request.UserId.ToString() != userId) { HttpContext.Response.StatusCode = Unauthorized().StatusCode; return(null); } } else { HttpContext.Response.StatusCode = Unauthorized().StatusCode; return(null); } return(await SetMeetingInternal(request)); }
/// <summary> /// Termin vereinbaren /// </summary> /// <param name="request"></param> /// <returns></returns> private async Task <ExSaveDataResult <ExMeeting> > SetMeetingInternal([FromBody] ExSaveMeetingRequest request) { using (var db = new Db()) { var freeEmployeeId = request.StaffId; if (freeEmployeeId == null) { var employees = db.TblLocations .Include(x => x.TblLocationEmployee) .Include(x => x.TblLocationEmployee).ThenInclude(x => x.TblEmployee) .AsNoTracking() .FirstOrDefault(x => x.Id == request.LocationId)?.TblLocationEmployee; // TODO Freien Mitarbeiter suchen var employeesFree = employees?.Where(x => x.TblEmployee.Active); freeEmployeeId = employeesFree?.FirstOrDefault()?.Id; } if (freeEmployeeId == null) { return(new ExSaveDataResult <ExMeeting> { Description = "Leider wurde kein freier Verkäufer gefunden!", Caption = "Kein freier Termin", Result = EnumSaveDataResult.Error, Data = null, }); } // prüfen ob der Mitarbeiter (noch) Zeit hat var locationEmployee = db.TblEmployees .Include(x => x.TblVirtualWorkTimes) .AsNoTracking() .FirstOrDefault(x => x.Id == freeEmployeeId.Value); var slotTime = locationEmployee.TblVirtualWorkTimes.FirstOrDefault(x => x.Weekday == request.StartTime.Date.DayOfWeek); if (slotTime == null) { return(new ExSaveDataResult <ExMeeting> { Description = "Leider hat der Verkäufer heute frei.", Caption = "Kein Arbeitstag", Result = EnumSaveDataResult.Error, Data = null, }); } var meeting = db.TblAppointments.AsNoTracking() .FirstOrDefault(x => x.EmployeeId == locationEmployee.Id && x.ValidTo > request.StartTime && x.ValidFrom <= request.StartTime && !x.Canceled); if (meeting != null) { return(new ExSaveDataResult <ExMeeting> { Description = "Der gewünschte Verkäufer hat zu diesem Zeitpunkt leider bereits einen Termin.", Caption = "Terminkonflikt", Result = EnumSaveDataResult.Error, Data = null, }); } var dbMeeting = new TableAppointment { UserId = request.UserId, EmployeeId = freeEmployeeId.Value, Text = request.OptionalText, BookedOn = DateTime.UtcNow, ValidFrom = request.StartTime, ValidTo = request.StartTime.AddMinutes(slotTime?.TimeSlot ?? 1), Attended = false, Canceled = false, AppointmentDate = request.StartTime.Date, }; db.TblAppointments.Add(dbMeeting); try { await db.SaveChangesAsync(); } catch (Exception e) { Logging.Log.LogError($"{e}"); return(new ExSaveDataResult <ExMeeting> { Description = ExSaveDataResult.GetDefaultSaveError().Description, Caption = ExSaveDataResult.GetDefaultSaveError().Caption, Result = EnumSaveDataResult.Error, Data = null, }); } var shop = db.TblLocations .Include(x => x.Store) .AsNoTracking() .FirstOrDefault(x => x.Id == request.LocationId); var res = new ExSaveDataResult <ExMeeting> { Result = EnumSaveDataResult.Ok, Caption = ExSaveDataResult.GetDefaultSuccess().Caption, Description = ExSaveDataResult.GetDefaultSuccess().Description, Data = new ExMeeting { Id = dbMeeting.Id, Start = dbMeeting.ValidFrom, End = dbMeeting.ValidTo, ShopId = shop.Id, ShopName = shop.Store.CompanyName, Staff = Staff.GetExStaff(db, dbMeeting.EmployeeId), UserId = dbMeeting.UserId, } }; //Shop per E-Mail über neuen Termin informieren try { var meetingInfo = db.TblAppointments .Include(x => x.Employee) .Include(x => x.Employee).ThenInclude(x => x.Store) .Include(x => x.User) .FirstOrDefault(x => x.Id == dbMeeting.Id); string shopEMail = meetingInfo.Employee.Store.EMail; string userName = $"{meetingInfo.User.Firstname} {meetingInfo.User.Lastname}"; string emailContent = $"Neuer Termin mit {(String.IsNullOrEmpty(userName.Trim()) ? "UNBEKANNT" : userName)} am {meetingInfo.ValidFrom.AddHours(2):dd.MM.yyy} um {meetingInfo.ValidFrom.AddHours(2):HH:mm}."; string email = _mailgenerator.GetMessageOnlyEmail(new ExEMailMessageOnly { Message = emailContent }); BissEMail bm = new BissEMail(WebAppSettings.EmailCredentials); await bm.SendHtmlEMail(Constants.SendEMailAs, new List <string> { shopEMail }, "Neuer Termin", email, Constants.SendEMailAsDisplayName); } catch (Exception e) { Logging.Log.LogWarning($"E-Mail über neuen Termin konnte nicht gesendet werden: {e}"); throw; } return(res); } }
/// <summary> /// Termin vereinbaren /// </summary> /// <param name="request"></param> /// <returns></returns> public async Task <ResultData <ExSaveDataResult <ExMeeting> > > SetMeetingWeb(ExSaveMeetingRequest request) { return(await _wap.Post <ExSaveDataResult <ExMeeting> >("SetMeetingWeb", request)); }