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