/// <summary>
        /// Binds the analyst dashboard.
        /// </summary>
        /// <param name="masterId">The identifier master.</param>
        /// <returns></returns>
        private async Task<AnaRequestViewModel> BindAnalystDashboard(int masterId)
        {
            FARMasterDto master = await MasterRepository.SingleAsync(masterId);

            if (master == null)
                return null;

            var request = await BindRequestDashboard();

            var farRequest = new AnaRequestViewModel();
            farRequest.Id = masterId;
            farRequest.Analyst = master.Analyst;
            farRequest.BUId = master.BUId;
            farRequest.FailureDesc = master.FailureDesc;
            farRequest.FailureOriginId = master.FailureOriginId;
            farRequest.FailureRate = master.FailureRate;
            farRequest.FailureTypeId = master.FailureTypeId;
            farRequest.FARNumber = master.Number;
            farRequest.FinalReportTargetDate = master.FinalReportTargetDate;
            farRequest.InitialReportTargetDate = master.InitialReportTargetDate;
            farRequest.OriginId = master.OriginId;
            farRequest.PriorityId = master.PriorityId;
            farRequest.Product = master.Product;
            farRequest.RefNo = master.RefNo;
            farRequest.RequestDate = master.RequestDate;
            farRequest.Requestor = master.Requestor;
            farRequest.SamplesArriveDate = master.SamplesArriveDate;
            farRequest.StatusId = master.StatusId;
            farRequest.Submitted = master.Submitted;
            farRequest.Origins = request.Origins;
            farRequest.Status = request.Status;
            farRequest.BUs = request.BUs;
            farRequest.FailureTypes = request.FailureTypes;
            farRequest.FailureOrigins = request.FailureOrigins;
            farRequest.Priorities = request.Priorities;
            farRequest.Site = request.Site;
            farRequest.InitialReason = await ReasonChangingINITargetRepository.GetAllAsync(); //reason;
            farRequest.FinalReason = await ReasonChangingFINTargetRepository.GetAllAsync();// reason;
            farRequest.OnHoldReason = await ReasonFAROnHoldRepository.GetAllAsync();

            var userRequestor = UserRepository.CheckExistEmail(request.Requestor);
            if (userRequestor != null)
                farRequest.Site = userRequestor.Sites.Name;
            var userAnalyst = UserRepository.CheckExistEmail(master.Analyst);
            if (userAnalyst != null)
                farRequest.UserId = userAnalyst.Id;

            farRequest.Users = (await UserRepository.GetAllAsync()).Where(w => w.RoleId == (int)RoleType.ANALYST || w.RoleId == (int)RoleType.MANAGER);
            farRequest.Status = await StatusRepository.GetAllAsync();

            //Get all files in folder master with id
            string folderMaster = System.IO.Path.Combine(Server.MapPath("~/Upload"), masterId.ToString().PadLeft(10, '0'));
            if (System.IO.Directory.Exists(folderMaster))
            {
                string[] files = System.IO.Directory.GetFiles(folderMaster);
                string json = string.Empty;
                foreach (string file in files)
                {
                    json += "<a href=" + Url.Action("DownloadTemp", "Upload", new { id = masterId, file = System.IO.Path.GetFileName(file) }) + ">" + System.IO.Path.GetFileName(file) + "</a>" + "<br/>";
                }
                farRequest.Reports = json;
            }

            if (farRequest.Reports == null)
                farRequest.Reports = String.Empty;

            return farRequest;
        }
        public async Task<JsonResult> AnaEditFA(int id, string btnSubmit, AnaRequestViewModel viewmodel)
        {
            var master = await MasterRepository.SingleAsync(id);

            if (btnSubmit == "Release")
            {
                master.StatusId = (int)StatusType.ONGOING;
                var update = MasterRepository.Update(master);
                if (update == Model.SaveResult.SUCCESS)
                {
                    Response.StatusCode = (int)HttpStatusCode.OK;
                    return new JsonResult
                    {
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                        Data = new { code = "RL01" }
                    };
                }
                else
                {
                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
                    return new JsonResult
                    {
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                        Data = new { code = "RL02" }
                    };
                }
            }

            if (master != null)
            {
                if (viewmodel.InitialReportTargetDate != master.InitialReportTargetDate)
                {
                    //Write log
                    FARInitialTargetLogDto logIni = new FARInitialTargetLogDto
                    {
                        MasterId = id,
                        ReasonId = viewmodel.InitialReasonId,
                        TargetDate = viewmodel.InitialReportTargetDate,
                        LastUpdatedBy = this.CurrentName,
                    };
                    InitialTargetLogRepository.Add(logIni);
                }

                if (viewmodel.FinalReportTargetDate != master.FinalReportTargetDate)
                {
                    //Write log
                    FARFinalTargetLogDto logFinal = new FARFinalTargetLogDto
                    {
                        MasterId = id,
                        ReasonId = viewmodel.FinalReasonId,
                        TargetDate = viewmodel.FinalReportTargetDate,
                        LastUpdatedBy = this.CurrentName,
                    };
                    FinalTargetLogRepository.Add(logFinal);
                }
                master.SamplesArriveDate = viewmodel.SamplesArriveDate;
                var reportType = ReportTypesRepository.GetAll();
                if (viewmodel.InitialReportTargetDate == null)
                    master.InitialReportTargetDate = viewmodel.SamplesArriveDate.Value.AddDays(reportType.Single(x => x.Id == (int)ReportType.INITIAL).DaysAfter);
                else
                    master.InitialReportTargetDate = viewmodel.InitialReportTargetDate;
                if (viewmodel.FinalReportTargetDate == null)
                    master.FinalReportTargetDate = viewmodel.SamplesArriveDate.Value.AddDays(reportType.Single(x => x.Id == (int)ReportType.FINAL).DaysAfter);
                else
                    master.FinalReportTargetDate = viewmodel.FinalReportTargetDate;
                master.LastUpdatedBy = this.CurrentName;

                var result = await MasterRepository.UpdateAsync(master);
                if (result == Model.SaveResult.SUCCESS)
                {
                    Response.StatusCode = (int)HttpStatusCode.OK;
                    return new JsonResult
                    {
                        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                        Data = new
                        {
                            code = "ED01",
                            initialDate = master.InitialReportTargetDate.HasValue ? master.InitialReportTargetDate.Value.ToString("MM/dd/yyyy") : "",
                            finalDate = master.FinalReportTargetDate.HasValue ? master.FinalReportTargetDate.Value.ToString("MM/dd/yyyy") : ""
                        }
                    };
                }
            }
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return new JsonResult
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new { code = "ED02" }
            };
        }