using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using NHibernate; using NHibernate.Linq; using Sleis.Models; using Sleis.ViewModels; using Sleis.Infrastructure; using Sleis.Service; using Sleis.Utility; using Sleis.Validation; using Sleis.Validation.Attribute; using Sleis.Validation.Spring; using System.IO; using System.Text; namespace Sleis.Controllers { [HandleError] public class ValidationController : BaseController { public ValidationService ValidationService { get; set; } public ReportService ReportService { get; set; } public override void Init() { base.Init(); ArgumentValidationUtility.ThrowOnNull(ValidationService, "ValidationService"); ArgumentValidationUtility.ThrowOnNull(ReportService, "ReportService"); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilitySubmitter, AppUserRoleType.FacilityAdmin, AppUserRoleType.FacilityEditor)] public ActionResult Report(int facilityId, int reportId, int submitOnSuccess = 0, int downloadOnSuccess = 0) { //When initiating a submission we need to do additional checks. if (submitOnSuccess == 1) { //Confirm that the user is authorized to submit. if (!AppUser.User.IsElectronicSigVerified) { TempData[Constants.GlobalMessageKey] = new SimpleMessage("You must have a verified Electronic Subscriber Agreement to Submit a Report."); return RedirectToAction("Report", "Facility", new System.Web.Routing.RouteValueDictionary { { "Id", reportId }, { "facilityId", facilityId } }); } // Confirm that the user has populated their security Q&A if (!AppUser.User.HasFiveUniqueQuestionsAndAnswers()) { TempData[Constants.GlobalMessageKey] = new SimpleMessage("You have not yet configured your Electronic Signature Challenge Questions required for electronic submission. Please update your user profile under My Profile, and try again."); return RedirectToAction("Report", "Facility", new System.Web.Routing.RouteValueDictionary { { "Id", reportId }, { "facilityId", facilityId } }); } } if (!SessionUtility.CurrentUser.IsAgencyUser()) { ReportService.SetReportReadyIndicator(reportId, 0); //resets the report ready indicator. } var model = new ValidationQueryView() { FacilityId = facilityId, ReportId = reportId, User = AppUser, SubmitOnSuccess = submitOnSuccess, DownloadOnSuccess = downloadOnSuccess, Report = UserService.FacilityData.GetReport(facilityId, reportId), }; return View(model); } [Authorize, HttpGet] public JsonResult SetReportReady(int reportId, int facilityId, int isReady) { if (!SessionUtility.CurrentUser.IsAgencyUser()) { ReportService.SetReportReadyIndicator(reportId, isReady); return Json(isReady, JsonRequestBehavior.AllowGet); } return Json(0, JsonRequestBehavior.AllowGet); } [Authorize, HttpGet, AppFacilityRoleValidation(AppUserRoleType.FacilitySubmitter, AppUserRoleType.FacilityAdmin, AppUserRoleType.FacilityEditor)] public JsonResult ValidateReport(int facilityId, int reportId) { //validate ListView model = null; AgencyReport report = ReportService.GetAgencyReport(facilityId, reportId); try { model = ValidationService.ValidateReport( ReportService.GetCompleteReport(facilityId, reportId), facilityId, reportId); if (model.Count > 0) { StringBuilder csv = new StringBuilder(); //header row csv.AppendLine(CsvUtility.CreateLine("Error", "Context")); for (int i = 0; i < model.Count; i++) { csv.AppendLine(CsvUtility.CreateLine(model.List[i].Message, model.List[i].Context)); } //File(Encoding.ASCII.GetBytes(csv.ToString()), "text/csv"); string filePath = Path.Combine(Path.GetTempPath(), String.Format("{0}_{1}_{2}", report.Number, AppUser.SelectedFacility.Facility.FacilityIdentifier, "Validation_Error_List.csv")); System.IO.File.WriteAllText(filePath, csv.ToString()); //remove majority of the errors to prevent overflowing of the json output if (model.List.Count > 1) { model.List.RemoveRange(1, model.List.Count - 2); //should leave only 1 error, which is enough to cause UI to act accordingly. } } } catch (Exception ex) { Log.Error(ex.Message, ex); model = new ListView(); model.HasError = true; model.Message = "Server error during validation, please contact administrator."; } //return view return Json(model, JsonRequestBehavior.AllowGet); } public ActionResult GetValidationReportDocument(int facilityId, int reportId) { AgencyReport report = ReportService.GetAgencyReport(facilityId, reportId); string fileName = String.Format("{0}_{1}_{2}", report.Number, AppUser.SelectedFacility.Facility.FacilityIdentifier, "Validation_Error_List.csv"); string filePath = Path.Combine(Path.GetTempPath(), fileName); return File(filePath, "text/csv", fileName); } } }