/// <summary> /// Termin entfernen /// </summary> /// <param name="request"></param> /// <returns></returns> private async Task <ExSaveDataResult> DeleteMeetingInternal([FromBody] ExRemoveMeetingRequest request) { using (var db = new Db()) { var meeting = db.TblAppointments .Include(x => x.Employee) .Include(x => x.Employee).ThenInclude(x => x.Store) .Include(x => x.User) .FirstOrDefault(x => x.Id == request.MeetingId); if (meeting.UserId != request.UserId && request.UserType == EnumUserType.Customer) { return(new ExSaveDataResult { Result = EnumSaveDataResult.Error, Caption = "Nicht möglich!", Description = "Nur der Ersteller des Termins kann diesen auch wieder löschen!" }); } meeting.Canceled = true; try { switch (request.UserType) { //Kunde hat den Termin storniert => E-Mail an Shop als Info case EnumUserType.Customer: string shopEMail = meeting.Employee.Store.EMail; string userName = $"{meeting.User.Firstname} {meeting.User.Lastname}"; string emailContent = $"Leider hat {(String.IsNullOrEmpty(userName.Trim()) ? "UNBEKANNT" : userName)} den Termin am {meeting.ValidFrom.AddHours(2):dd.MM.yyy} um {meeting.ValidFrom.AddHours(2):HH:mm} absagen müssen."; string employeeTel = meeting.Employee.TelephoneNumber; string email = _mailgenerator.GetStornoAppointmentShopEmail(new ExEMailStornoAppointmentShop { Message = emailContent }); BissEMail bm = new BissEMail(WebAppSettings.EmailCredentials); var res = await bm.SendHtmlEMail(Constants.SendEMailAs, new List <string> { shopEMail }, "Termin-Storno", email, Constants.SendEMailAsDisplayName); //ToDo: Umstellung auf Push sobald möglich //Common.SendSMS(employeeTel, $"{emailContent} Auf diese SMS kann nicht geantwortet werden."); break; //Shop musst den Termin stonieren => SMS an Kunden als Info //ToDo: Umstellung auf Push sobald möglich case EnumUserType.ShopEmployee: string telCustomer = meeting.User.PhoneNumber; string employeeName = $"{meeting.Employee.FirstName} {meeting.Employee.LastName}"; string smsContent = $"Leider hat {(String.IsNullOrEmpty(employeeName.Trim()) ? "UNBEKANNT" : employeeName)} von {meeting.Employee.Store.CompanyName} den Termin am {meeting.ValidFrom.AddHours(2):dd.MM.yyy} um {meeting.ValidFrom.AddHours(2):HH:mm} absagen müssen. Du kannst gerne wieder einen neuen Termin über die App vereinbaren. Auf diese SMS kann nicht geantwortet werden."; Common.SendSMS(telCustomer, smsContent); break; default: throw new ArgumentOutOfRangeException(); } } catch (Exception e) { Logging.Log.LogWarning($"Could not inform customer or shop about chanceled appointment: {e}"); } try { await db.SaveChangesAsync(); return(ExSaveDataResult.GetDefaultSuccess()); } catch (Exception e) { Logging.Log.LogError($"{e}"); return(ExSaveDataResult.GetDefaultSaveError()); } } }
/// <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> /// Userdaten löschen /// </summary> /// <param name="userId"></param> /// <returns></returns> private async Task <ExSaveDataResult> DeleteUsereInternal(int userId) { using (var db = new Db()) { var user = db.TblUsers.Include(i => i.TblAppointments).Include(i => i.TblUserDevices).FirstOrDefault(x => x.Id == userId); if (user.IsAdmin || user.IsDemoUser) { return(new ExSaveDataResult { Description = "Admins oder Demouser können nicht gelöscht werden!", Caption = "Nicht möglich!", Result = EnumSaveDataResult.Information, }); } //Termine absagen und löschen var mc = new MeetingController(_view); var appointmentsToInform = user.TblAppointments.Where(a => a.ValidFrom > DateTime.UtcNow && a.Canceled == false); foreach (var appointment in appointmentsToInform) { await mc.DeleteMeetingWeb(new ExRemoveMeetingRequest { UserType = EnumUserType.Customer, MeetingId = appointment.Id, UserId = userId, CheckPassword = WebAppSettings.CheckPassword, }); } db.TblAppointments.RemoveRange(user.TblAppointments); db.TblUserDevices.RemoveRange(user.TblUserDevices); //ToDo: Geräte auch aus AzurePush entfernen! //Admins informieren List <string> eMails2Inform; if (Constants.CurrentAppSettings.AppConfigurationConstants == 0) //master { eMails2Inform = new List <string> { "*****@*****.**", "*****@*****.**", }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } else { eMails2Inform = new List <string> { "*****@*****.**" }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } string userName = $"{user.Firstname} {user.Lastname}"; string emailContent = $"Leider hat {(String.IsNullOrEmpty(userName.Trim()) ? "UNBEKANNT" : userName)} mit der Telefonnummer {user.PhoneNumber} seinen Account gelöscht."; string email = _mailgenerator.GetMessageOnlyEmail(new ExEMailMessageOnly { Message = emailContent }); BissEMail bm = new BissEMail(WebAppSettings.EmailCredentials); var res = await bm.SendHtmlEMail(Constants.SendEMailAs, eMails2Inform, "Kunde gelöscht.", email, Constants.SendEMailAsDisplayName); //Löschen db.TblUsers.Remove(user); try { await db.SaveChangesAsync(); return(ExSaveDataResult.GetDefaultSuccess()); } catch (Exception e) { Logging.Log.LogError($"{e}"); return(ExSaveDataResult.GetDefaultSaveError()); } } }
public async Task <ExSaveDataResult> ForgotPasswordShop(ExShopForgotPassword exShopRegistration) { using (Db db = new Db()) { var shop = await db.TblStores.FirstOrDefaultAsync(a => a.EMail.ToLower() == exShopRegistration.EMail.ToLower()); if (shop == null) { return(new ExSaveDataResult { Result = EnumSaveDataResult.Error }); } if (exShopRegistration.Step == EnumShopForgotPassword.Step1) { //LINK VERSENDEN zum Ändern des Passwortes BissEMail bm = new BissEMail(WebAppSettings.EmailCredentials); ExEmailResetPassword er = new ExEmailResetPassword(); er.Message = "Bitte bestätige den folgenden Link, damit dir ein neues Passwort zugesendet wird."; er.ApproveLink = $"{Constants.WebAppBaseUrl}ShopForgotPassword/?guid={shop.ActivationCode}"; string email = _mailgenerator.GetPasswordResetEmail(er); List <string> eMails2Inform; if (Constants.CurrentAppSettings.AppConfigurationConstants == 0) //master { eMails2Inform = new List <string> { exShopRegistration.EMail }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } else { eMails2Inform = new List <string> { "*****@*****.**", exShopRegistration.EMail }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } var res = await bm.SendHtmlEMail(Constants.SendEMailAs, eMails2Inform, "Passwort vergessen?", email, Constants.SendEMailAsDisplayName); } else if (exShopRegistration.Step == EnumShopForgotPassword.Step2) { //PASSWORT VERSENDEN string pwd = PasswordHelper.GeneratePassword(6); shop.Password = PasswordHelper.CumputeHash(pwd); shop.ActivationCode = PasswordHelper.GeneratePassword(10); await db.SaveChangesAsync(); BissEMail bm = new BissEMail(WebAppSettings.EmailCredentials); ExEmailNewPassword er = new ExEmailNewPassword(); er.Message = "Du kannst dich jetzt mit dem folgenden Passwort einloggen: "; er.NewPassword = pwd; er.ApproveLink = $"{Constants.WebAppBaseUrl}Activate/?guid={shop.ActivationCode}"; List <string> eMails2Inform; if (Constants.CurrentAppSettings.AppConfigurationConstants == 0) //master { eMails2Inform = new List <string> { exShopRegistration.EMail }; } else { eMails2Inform = new List <string> { "*****@*****.**", exShopRegistration.EMail }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } string email = _mailgenerator.GetNewPasswordEmail(er); var res = await bm.SendHtmlEMail(Constants.SendEMailAs, eMails2Inform, "Passwort wurde geändert", email, Constants.SendEMailAsDisplayName); } return(new ExSaveDataResult()); } }
public async Task <ExSaveDataResult> RegisterShop(ExShopRegistration exShopRegistration) { using (Db db = new Db()) { var shop = await db.TblStores.FirstOrDefaultAsync(a => a.EMail.ToLower() == exShopRegistration.EMail.ToLower()); if (shop == null) { //NEU ANLEGEN shop = new TableStore(); shop.EMail = exShopRegistration.EMail.ToLower(); shop.CreatedAt = DateTime.UtcNow; shop.CompanyName = ""; db.TblStores.Add(shop); } else if (shop.Activated) { return(new ExSaveDataResult { Result = EnumSaveDataResult.Error }); } string pwd = PasswordHelper.GeneratePassword(6); shop.Password = PasswordHelper.CumputeHash(pwd); shop.ActivationCode = PasswordHelper.GeneratePassword(10); await db.SaveChangesAsync(); BissEMail bm = new BissEMail(WebAppSettings.EmailCredentials); ExEmailRegistration er = new ExEmailRegistration(); er.Message = $"Bitte bestätige den folgenden Link um dein Geschäft freizuschalten. Du kannst dich anschließend mit dem Passwort {pwd} einloggen"; er.ApproveLink = $"{Constants.WebAppBaseUrl}Activate/?guid={shop.ActivationCode}"; List <string> eMails2Inform; if (Constants.CurrentAppSettings.AppConfigurationConstants == 0) //master { eMails2Inform = new List <string> { exShopRegistration.EMail }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } else { eMails2Inform = new List <string> { "*****@*****.**", exShopRegistration.EMail }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } string email = _mailgenerator.GetRegistrationEmail(er); var res = await bm.SendHtmlEMail(Constants.SendEMailAs, eMails2Inform, "Danke für die Registrierung", email, Constants.SendEMailAsDisplayName); return(new ExSaveDataResult()); } }
public async Task <bool> DeleteShop([FromBody] ExDeleteRequest request) { var shopId = request.Id; if (request.CheckPassword != WebAppSettings.CheckPassword) { HttpContext.Response.StatusCode = Unauthorized().StatusCode; return(false); } using (var db = new Db()) { //Kundentermine absagen var appointments = db.TblAppointments .Include(x => x.Employee) .Where(a => a.Employee.StoreId == shopId); var appointmentsToInformForDelete = appointments.Where(a => a.ValidFrom > DateTime.UtcNow && a.Canceled == false); var mc = new MeetingController(_view); foreach (var appointment in appointmentsToInformForDelete) { await mc.DeleteMeetingWeb(new ExRemoveMeetingRequest { UserType = EnumUserType.ShopEmployee, MeetingId = appointment.Id, CheckPassword = WebAppSettings.CheckPassword, UserId = -1 }); } //Kundentermine löschen db.TblAppointments.RemoveRange(appointments); //Mitarbeiter löschen var emp = db.TblEmployees .Include(x => x.TblLocationEmployee).Where(e => e.StoreId == shopId); foreach (var e in emp) { db.TblLocationEmployee.RemoveRange(e.TblLocationEmployee); } db.TblEmployees.RemoveRange(emp); //Shop var shop = await db.TblStores.Include(i => i.TblLocations).Include(i => i.TblStoreDelivery).Include(i => i.TblStorePayments).Include(i => i.TblStoreCategories).FirstOrDefaultAsync(s => s.Id == shopId); if (shop == null) { return(false); } //Zwischentabellen db.TblLocations.RemoveRange(shop.TblLocations); db.TblStoreDelivery.RemoveRange(shop.TblStoreDelivery); db.TblStorePayment.RemoveRange(shop.TblStorePayments); db.TblStoreCategory.RemoveRange(shop.TblStoreCategories); //Admins informieren List <string> eMails2Inform; if (Constants.CurrentAppSettings.AppConfigurationConstants == 0) //master { eMails2Inform = new List <string> { "*****@*****.**" }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } else { eMails2Inform = new List <string> { "*****@*****.**" }; //ToDo: Wenn die Settings Tabelle existiert dann über die Settings Tabelle } string emailContent = $"Leider hat der Shop {shop.CompanyName} mit der Telefonnummer {shop.Telephonenumber} seinen Account gelöscht."; string email = _mailgenerator.GetMessageOnlyEmail(new ExEMailMessageOnly { Message = emailContent }); BissEMail bm = new BissEMail(WebAppSettings.EmailCredentials); var res = await bm.SendHtmlEMail(Constants.SendEMailAs, eMails2Inform, "Kunde gelöscht.", email, Constants.SendEMailAsDisplayName); //Löschen db.TblStores.Remove(shop); try { await db.SaveChangesAsync(); } catch (Exception e) { Logging.Log.LogError($"Error deleting Shop: {shop.CompanyName} Id: {shopId}: {e}"); return(false); } } return(true); }