Esempio n. 1
0
        public async Task <IActionResult> Create(ProfileCreateViewModel model)
        {
            var employees = employeeService.GetEmployees();

            model.Employees = employees
                              .Where(e => e.Profile == null &&
                                     (!e.DateRelieved.HasValue || e.DateRelieved.Value.Date > DateTime.Now.Date))
                              .Select(e => new SelectListItem()
            {
                Text  = e.ToString(),
                Value = e.Id.ToString()
            }).OrderBy(i => i.Text);
            if (await profileService.FindByNameAsync(model.Alias) != null)
            {
                ViewData[ErrorKey] = $"Alias '{model.Alias}' is already in use.";
                return(View(model));
            }
            if (model.DateRegistered.Date < DateTimeOffset.Now.Date)
            {
                ViewData[ErrorKey] = string.Format(DateInPastErrorMessage, "Activation date");
                return(View(model));
            }
            User profile = mapper.Map <User>(model);

            profile.EmailConfirmed = true;
            var profileCreateResult = await profileService.CreateAsync(profile, model.Password);

            if (!profileCreateResult.Succeeded)
            {
                ViewData[ErrorKey] = profileCreateResult.Errors.Select(e => e.Description);
                return(View(model));
            }
            var typeClaim = new Claim(TypeKey, nameof(Employee));
            await profileService.AddClaimAsync(profile, typeClaim);

            if (!string.IsNullOrWhiteSpace(model.EmployeeId))
            {
                var employee = await employeeService.FindByIdAsync(model.EmployeeId);

                if (employee == null)
                {
                    ViewData[ErrorKey] = string.Format(InvalidObjectErrorMessage, nameof(Employee));
                    return(View(model));
                }
                profile.Employee = employee;
                var departmentClaim = new Claim(DepartmentKey, employee.Department.ToString());
                await profileService.AddClaimAsync(profile, departmentClaim);

                var roleAssignResult = await profileService.AddToRoleAsync(profile, employee.Position.Name);

                if (!roleAssignResult.Succeeded)
                {
                    ViewData[ErrorKey] = roleAssignResult.Errors.Select(e => e.Description);
                    return(View(model));
                }
                var roleClaim = new Claim(RoleKey, employee.Position.Name);
                await profileService.AddClaimAsync(profile, roleClaim);
            }
            var infoMessages = new string[0];

            infoMessages = infoMessages.Append($"Profile '{profile.UserName}' created successfully.").ToArray();
            if (profile.Employee != null)
            {
                infoMessages = infoMessages
                               .Append($"Profile '{profile.UserName}' assigned to employee {profile.Employee.ToString()}.")
                               .ToArray();
            }
            ViewData[InfoKey] = infoMessages;
            logger.LogInformation($"'{User.Identity.Name}' created profile '{profile.UserName}'.");
            await employeeService.UpdateLastWorkedAsync(User.GetId());

            return(View(model));
        }
Esempio n. 2
0
        public async Task <IActionResult> Hire(EmployeeHireViewModel model)
        {
            if (string.IsNullOrWhiteSpace(model.PIN))
            {
                return(BadRequest(new
                {
                    Message = string.Format(StringBlankErrorMessage,
                                            model.GetPropertyDisplayName(nameof(model.PIN)))
                }));
            }
            if (employeeService.FindByPin(model.PIN) != null)
            {
                return(BadRequest(new
                {
                    Message = string.Format(ObjectExistsErrorMessage,
                                            "A record with the same identification number")
                }));
            }
            if (string.IsNullOrWhiteSpace(model.FirstName) ||
                string.IsNullOrWhiteSpace(model.MiddleName) ||
                string.IsNullOrWhiteSpace(model.LastName))
            {
                return(BadRequest(new
                {
                    Message = string.Format(StringBlankErrorMessage, "A name")
                }));
            }
            if (string.IsNullOrWhiteSpace(model.DepartmentName))
            {
                return(BadRequest(new
                {
                    Message = string.Format(SelectionNullErrorMessage, "a department")
                }));
            }
            if (string.IsNullOrWhiteSpace(model.ManagerId))
            {
                return(BadRequest(new
                {
                    Message = string.Format(SelectionNullErrorMessage, "a manager")
                }));
            }
            if (string.IsNullOrWhiteSpace(model.RoleName))
            {
                return(BadRequest(new
                {
                    Message = string.Format(SelectionNullErrorMessage, "a role")
                }));
            }
            if (model.MonthlySalaryInEUR <= 0)
            {
                return(BadRequest(new
                {
                    Message = string.Format(InvalidObjectErrorMessage, "Salary")
                }));
            }
            string dateHiredDisplayName = model.GetPropertyDisplayName(nameof(model.DateHired));

            if (model.DateHired.Date < DateTimeOffset.Now.Date)
            {
                return(BadRequest(new
                {
                    Message = string.Format(DateInPastErrorMessage, dateHiredDisplayName)
                }));
            }
            if (model.IsTemporary && model.DateRelieved.Value.Date <= model.DateHired.Date)
            {
                string dateRelievedDisplayName = model.GetPropertyDisplayName(nameof(model.DateRelieved));
                return(BadRequest(new
                {
                    Message = $"{dateRelievedDisplayName} must be after {dateHiredDisplayName.ToLower()}!"
                }));
            }
            string portraitMimeType = string.Empty;

            if (model.Portrait != null)
            {
                string propertyDisplayName = model.GetPropertyDisplayName(nameof(model.Portrait));
                portraitMimeType = await fileService.GetMimeTypeAsync(model.Portrait);

                if (string.IsNullOrWhiteSpace(portraitMimeType))
                {
                    return(BadRequest(new
                    {
                        Message = $"{propertyDisplayName} is corrupted."
                    }));
                }
                if (!portraitMimeType.StartsWith(ImageMimeTypePrefix))
                {
                    return(BadRequest(new
                    {
                        Message = $"{propertyDisplayName} must be an image file!"
                    }));
                }
            }
            var employee = mapper.Map <Employee>(model);

            employee.Manager = await employeeService.FindByIdAsync(model.ManagerId);

            var role = await roleService.FindByNameAsync(model.RoleName);

            employee.Position = role;
            if (!string.IsNullOrWhiteSpace(model.ProfileId))
            {
                var profile = await profileService.FindByIdAsync(model.ProfileId);

                if (profile.Employee != null)
                {
                    return(BadRequest(new
                    {
                        Message = $"Profile '{profile.UserName}' is already in use by another employee."
                    }));
                }
                employee.Profile = profile;
                if (!employee.Profile.Claims.Any(c => c.ClaimType == TypeKey))
                {
                    var typeClaim = new Claim(TypeKey, nameof(Employee));
                    await profileService.AddClaimAsync(employee.Profile, typeClaim);
                }
                if (!employee.Profile.Claims.Any(c => c.ClaimType == DepartmentKey))
                {
                    var departmentClaim = new Claim(DepartmentKey, employee.Department.ToString());
                    await profileService.AddClaimAsync(employee.Profile, departmentClaim);
                }
                var roleAssignTask = await profileService.AddToRoleAsync(employee.Profile, model.RoleName);

                if (!roleAssignTask.Succeeded)
                {
                    return(BadRequest(new
                    {
                        Message = string.Join(HtmlNewLine, roleAssignTask.Errors.Select(e => e.Description))
                    }));
                }
                if (!employee.Profile.Claims.Any(c => c.ClaimValue == model.RoleName))
                {
                    var roleClaim = new Claim(RoleKey, model.RoleName);
                    await profileService.AddClaimAsync(employee.Profile, roleClaim);
                }
                employee.Profile.DateDeleted = employee.DateRelieved;
            }
            try
            {
                await employeeService.HireAsync(employee);

                if (!string.IsNullOrWhiteSpace(portraitMimeType))
                {
                    string portraitFileType     = portraitMimeType.Replace(ImageMimeTypePrefix, string.Empty);
                    string portraitFileName     = $"portrait.{portraitFileType}";
                    string profileDirectoryName = employee.PIN.ToBase64();
                    string portraitFilePath     = fileService.BuildPath(new string[]
                    {
                        PersonnelDataRoot, profileDirectoryName, portraitFileName
                    }, trimmed: true);
                    await fileService.SaveFileAsync(model.Portrait, portraitFilePath);
                }
                logger.LogInformation($"'{User.Identity.Name}' hired a new employee - {employee.ToString()}.");
                await employeeService.UpdateLastWorkedAsync(User.GetId());

                return(Json(new { Message = $"{employee.ToString()} hired." }));
            }
            catch (Exception exception)
            {
                logger.LogError(exception.GetMessageStack());
                return(BadRequest(new { Message = exception.GetMessageStack(HtmlNewLine) }));
            }
        }