/// <summary>
        /// Get the full details of each of the stages of the application provided.
        /// If no application ID is provided, it is assumed that the we want details of the current
        /// application in progress.
        /// </summary>
        /// <param name="applicationId"></param>
        /// <param name="_ctx"></param>
        /// <returns></returns>
        public async Task <ApplicationDetailsViewModel> GetApplicationDetails(StudentPortalContext _ctx, int?applicationId = null)
        {
            Application application = await GetCurrentApplication(_ctx, applicationId);

            ApplicationDetailsViewModel model = new ApplicationDetailsViewModel
            {
                Application      = application,
                PersonalDetails  = await GetPersonalDetails(_ctx, applicationId),
                Address          = await GetAddress(_ctx, applicationId),
                CourseSelection  = await GetCourses(_ctx, applicationId),
                Qualifications   = await GetQualifications(_ctx, applicationId),
                Education        = await GetEducationHistory(_ctx, applicationId),
                LearningSupport  = await GetLearningSupport(_ctx, applicationId),
                UserDisabilities = await _disabilityService.GetDisabilities(application, _ctx),
                DisabilityString = await _disabilityService.ConvertDisabilitiesToString(application, _ctx),
                Progress         = await _ctx.ApplicationProgress.ToListAsync(),
                Titles           = await _ctx.Titles.ToListAsync(),
                Genders          = await _ctx.Genders.ToListAsync(),
                Countries        = await _ctx.Countries.ToListAsync(),
                Ethnicities      = await _ctx.Ethnicity.ToListAsync(),
                Courses          = await _ctx.Courses.ToListAsync(),
                Schools          = await _ctx.Schools.ToListAsync(),
                Disabilities     = await _ctx.Disabilities.ToListAsync(),
            };

            return(model);
        }
        public async Task <ActionResult> Update(int applicationId, int progressId)
        {
            Application application = await _applicationService.GetCurrentApplication(_ctx, applicationId);

            application.Progress = progressId;

            await _ctx.SaveChangesAsync();

            // Gather application details to be included in the email
            ApplicationDetailsViewModel model = await _applicationService.GetApplicationDetails(_ctx, application.Id);

            Dictionary <string, string> parameters = new Dictionary <string, string> {
                { "Name", model.PersonalDetails.Forename },
                { "Institution", ViewBag.Institution }
            };

            // Send an email to the user to alert them of the change
            await _mailService.SendEmailAsync(
                emailAddress : model.PersonalDetails.EmailAddress,
                subject : "Update on your application",
                message : null,
                emailTemplate : "ApplicationUpdate",
                parameters : parameters
                );

            return(RedirectToAction("Details", routeValues: new { id = applicationId }));
        }
예제 #3
0
        public async Task <IActionResult> Details(Guid id, [FromServices] ICryptoServices crypto)
        {
            var model = await ApplicationDetailsViewModel.LoadAsync(_ctx, crypto, id);

            if (model != null)
            {
                return(View(model));
            }

            return(NotFound());
        }
        public async Task <ActionResult> Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            ApplicationDetailsViewModel model = await _applicationService.GetApplicationDetails(_ctx, id);

            return(View(model));
        }
        public IActionResult Details(int id)
        {
            JobApplication job = applicationUoW.Repository.GetItem(id);
            ApplicationDetailsViewModel model = new ApplicationDetailsViewModel
            {
                JobApplication = job,
                Position       = positionUoW.Repository.GetItem(job.PositionId)
            };

            return(View(model));
        }
예제 #6
0
        public async Task <IActionResult> ApplicationDetails(long did, long sid)
        {
            ViewBag.id = did;
            Student stu = await _applicationDbContext.Students.Where(s => s.ID == sid).FirstOrDefaultAsync();

            ApplicationDetailsViewModel applicationDetailsViewModel = new ApplicationDetailsViewModel
            {
                Stu = stu,
                Did = did,
                Sid = sid
            };

            return(View(applicationDetailsViewModel));
        }
        public async Task <ActionResult> Continue(int id)
        {
            await _applicationService.OwnsApplication(id, User.Identity.Name, _ctx, forceRedirect : true);

            Session["ApplicationId"] = id;
            ApplicationDetailsViewModel model = await _applicationService.GetApplicationDetails(_ctx, id);

            // Don't allow you to continue an application that has already been submitted.
            if (model.Application.Submitted)
            {
                Session["ApplicationId"] = null;
                return(Redirect("~/"));
            }

            return(RedirectToAction("Manage"));
        }
예제 #8
0
        public async Task <ApplicationDetailsViewModel> GetViewModelForApplicationDetails(string applicationId, string userId)
        {
            _logger.LogInformation($"Executing GetViewModelForApplicationDetails with applicationId={applicationId}. (UserID: {userId})");

            var application = _context.Applications
                              .Include(x => x.JobPosition)
                              .Include(x => x.User)
                              .FirstOrDefault(x => x.Id == applicationId);

            if (application == null)
            {
                _logger.LogError($"Application with ID:{applicationId} not found. (UserID: {userId})");
                throw new NotFoundException(_stringLocalizer["Application with ID:{0} not found.", applicationId]);
            }

            await _applicationsViewHistoriesService.AddApplicationsViewHistory(applicationId, userId);

            var applicationStages = _context.ApplicationStages
                                    .Include(x => x.ResponsibleUser)
                                    .Include(x => x.AcceptedBy)
                                    .Where(x => x.ApplicationId == application.Id).OrderBy(x => x.Level);

            var viewHistories = await _context.ApplicationsViewHistories
                                .Where(x => x.ApplicationId == application.Id)
                                .OrderByDescending(x => x.ViewTime)
                                .Take(10)
                                .ToListAsync();

            foreach (var viewHistory in viewHistories)
            {
                viewHistory.ViewTime = viewHistory.ViewTime.ToLocalTime();
            }

            var vm = new ApplicationDetailsViewModel()
            {
                Id          = application.Id,
                User        = _mapper.Map <ApplicationUser, UserDetailsViewModel>(application.User),
                JobPosition = _mapper.Map <JobPosition, JobPositionViewModel>(application.JobPosition),
                CvFileUrl   = _cvStorageService.UriFor(application.CvFileName),
                CreatedAt   = application.CreatedAt.ToLocalTime(),
                ApplicationsViewHistories = viewHistories,
                ApplicationStages         = applicationStages.ToList()
            };

            return(vm);
        }
        public async Task <ActionResult> Manage()
        {
            Application application = await _applicationService.GetCurrentApplication(_ctx);

            await _applicationService.OwnsApplication(application.Id, User.Identity.Name, _ctx, forceRedirect : true);

            ApplicationDetailsViewModel model = await _applicationService.GetApplicationDetails(_ctx, application.Id);

            // Mark the application as complete if all sections have been filled out.
            if (!application.Complete && model.Complete)
            {
                application.Complete = true;
                await _ctx.SaveChangesAsync();
            }

            return(View(model));
        }
        public ApplicationDetailsViewModel GetApplicationDetailsViewModel(Guid id)
        {
            var creditApplication = unitOfWork.GetRepository <CreditApplication>().GetById(id);
            ApplicationDetailsViewModel applicationDetailsModel = new ApplicationDetailsViewModel();

            if (creditApplication.Client.ClientGroup == ClientGroup.PrivatePerson)
            {
                LegalPerson client = unitOfWork.GetRepository <LegalPerson>().GetById(creditApplication.ClientId);
                applicationDetailsModel.ClientName = client.FirstName + " " + client.LastName;
            }
            else
            {
                applicationDetailsModel.ClientName = unitOfWork.GetRepository <JuridicalPerson>().GetById(creditApplication.ClientId).Name;
            }
            AutoMapper.Mapper.Map(creditApplication, applicationDetailsModel);
            return(applicationDetailsModel);
        }
예제 #11
0
        public IActionResult Details(int id, bool isEditing)
        {
            var baseModel = DatabaseReader.GetApplications(context, User.GetExternalId(), User.GetRole(), true)
                            .FirstOrDefault(application => application.Id == id);

            if (!User.HasAccessToApplication(baseModel, context))
            {
                return(RedirectToAction("Index", "Application"));
            }

            var model = new ApplicationDetailsViewModel
            {
                ApplicationModel = baseModel,
                IsEditing        = isEditing && !User.IsInRole(UserRole.HR.ToString())
            };

            return(View(model));
        }
        public async Task <ActionResult> Submit()
        {
            Application application = await _applicationService.GetCurrentApplication(_ctx);

            // Ensure user owns the application - not trying to submit someone elses
            await _applicationService.OwnsApplication(application.Id, User.Identity.Name, _ctx, forceRedirect : true);

            // Ensure the application has been completed
            if (application.Complete)
            {
                // Mark the application and completed
                await _applicationService.CompleteApplication(application, _ctx);

                // Gather application details to be included in the confirmation email
                ApplicationDetailsViewModel model = await _applicationService.GetApplicationDetails(_ctx, application.Id);

                Dictionary <string, string> parameters = new Dictionary <string, string> {
                    { "Name", model.PersonalDetails.Forename },
                    { "ContactEmail", ViewBag.ContactEmail },
                    { "ContactPhone", ViewBag.ContactPhone },
                    { "Institution", ViewBag.Institution }
                };

                // Send a confirmation email to the user
                await _mailService.SendEmailAsync(
                    emailAddress : model.PersonalDetails.EmailAddress,
                    subject : "Thank you for your application",
                    message : null,
                    emailTemplate : "ApplicationComplete",
                    parameters : parameters
                    );

                Session["ApplicationId"] = null;

                return(RedirectToAction("Thanks", "Home"));
            }

            return(Redirect("~/"));
        }
예제 #13
0
        private ApplicationDetailsViewModel GetApplicationDetails(CreditApplication creditApplication)
        {
            ApplicationDetailsViewModel applicationDetailsModel = new ApplicationDetailsViewModel();

            if (creditApplication.Client.ClientGroup == ClientGroup.PrivatePerson)
            {
                LegalPerson client = unitOfWork.GetRepository <LegalPerson>().GetById(creditApplication.ClientId);
                applicationDetailsModel.ClientName = client.FirstName + " " + client.LastName;
            }
            else
            {
                applicationDetailsModel.ClientName = unitOfWork.GetRepository <JuridicalPerson>().GetById(creditApplication.ClientId).Name;
            }
            AutoMapper.Mapper.Map(creditApplication, applicationDetailsModel);
            var contract = applicationDetailsModel.Attachments.FirstOrDefault(x => x.IsContract);

            if (contract != null)
            {
                applicationDetailsModel.Attachments.Remove(contract);
                applicationDetailsModel.Contract = contract;
            }
            return(applicationDetailsModel);
        }
예제 #14
0
        public async Task <ActionResult> Save(int id, ApplicationDetailsViewModel viewModel)
        {
            // Find application to update in DB
            var toUpdate = context.Application.Include(x => x.User).FirstOrDefault(x => x.IdApplication == id);

            if (toUpdate == null || !User.HasAccessToApplication(toUpdate))
            {
                return(RedirectToAction("Index", "Application"));
            }

            if (toUpdate.Status != ApplicationStatus.Draft)
            {
                // If application was already submitted, withdraw it
                toUpdate.Status = ApplicationStatus.Withdrawn;
                await context.SaveChangesAsync();

                // And create new application with data copied from previous one
                var newModel = new HR_Project_Database.Models.Application
                {
                    JobOfferId           = toUpdate.JobOfferId,
                    UserId               = toUpdate.UserId,
                    CvId                 = toUpdate.CvId,
                    AttachmentGroupId    = toUpdate.AttachmentGroupId,
                    ApplicationMessageId = toUpdate.ApplicationMessageId,
                    Status               = ApplicationStatus.Draft
                };

                context.Application.Add(newModel);
                await context.SaveChangesAsync();

                id       = newModel.IdApplication;
                toUpdate = newModel;
            }

            // If file with CV is selected, replace file in storage
            if (viewModel.ApplicationModel.CV != null && viewModel.ApplicationModel.CV?.Length != 0)
            {
                // If no file in storage, generate new id for CV
                if (toUpdate.CvId == null)
                {
                    toUpdate.CvId = Guid.NewGuid();
                    await context.SaveChangesAsync();
                }

                StorageContext.ReplaceCVFile(toUpdate.CvId.Value, viewModel.ApplicationModel.CV);
            }

            // If new attachments are selected, add them to DB (creating new AttachmentGroup) and storage
            if (viewModel.ApplicationModel.OtherAttachments != null && viewModel.ApplicationModel.OtherAttachments.Count != 0)
            {
                var attachmentGroup = new AttachmentGroup();
                context.AttachmentGroup.Add(attachmentGroup);
                await context.SaveChangesAsync();

                var groupId = toUpdate.AttachmentGroupId = attachmentGroup.IdAttachmentGroup;

                List <Attachment> attachments = new List <Attachment>();
                foreach (var attachmentFile in viewModel.ApplicationModel.OtherAttachments)
                {
                    attachments.Add(new Attachment {
                        AttachmentGroupId = groupId, Extension = Path.GetExtension(attachmentFile.FileName)
                    });
                }
                await context.AddRangeAsync(attachments);

                await context.SaveChangesAsync();

                StorageContext.UploadAttachmentGroup(attachments, viewModel.ApplicationModel.OtherAttachments);
            }

            // Replace message if necessary
            ApplicationMessage message;

            if ((message = context.ApplicationMessage.Find(toUpdate.ApplicationMessageId)) == null)
            {
                if (viewModel.ApplicationModel.Message == null)
                {
                    return(RedirectToAction("Details", new { id = id, isEditing = true }));
                }

                message = new ApplicationMessage {
                    MessageContent = viewModel.ApplicationModel.Message
                };
                context.ApplicationMessage.Add(message);
                await context.SaveChangesAsync();

                toUpdate.ApplicationMessageId = message.IdApplicationMessage;
            }
            else
            {
                message.MessageContent = viewModel.ApplicationModel.Message;
            }
            await context.SaveChangesAsync();

            return(RedirectToAction("Details", new { id = id, isEditing = true }));
        }