/// <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);
            }
        }
Example #3
0
        /// <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);
        }