using System.Collections.Generic; using System.Web.Mvc; using Neo.Legitimate.AdjudicationConsole.Models; using Neo.Legitimate.Common; using Neo.Legitimate.Data.Models; using Pilotfish.Afx.Mvc; using System.Linq; using System; using Pilotfish.Afx.Services.Correspondence; using Pilotfish.Afx.Services.Reports; using System.Runtime.Serialization.Formatters.Binary; using System.IO; namespace Neo.Legitimate.AdjudicationConsole.Controllers { [Authorize] public class AdjudicationConsoleController : Neo.Legitimate.Common.ControllerBase { private const long ADJUDICATION_ENTITY_ID = 1007; private const long DOCUMENT_STORE_LOCATION_ID = 3; #region Action Results #region Default public ActionResult Default(long AdjudicationDetailID, short? adjudicationTypeID, long? regionID) { var database = new LegitimateDatabase(); var adjudicationType = (short)((adjudicationTypeID.HasValue) ? adjudicationTypeID.Value : 0); var region = (short)((regionID.HasValue) ? regionID.Value : 0); var model = new DefaultModel { AdjudicationDetail = database.GetAdjudicationDetail(AdjudicationDetailID, adjudicationType, region, Profile.UserID), Provinces = database.GetProvinces(), Regions = database.GetAdjudicationRegions(), AdjudicationTypes = database.GetAdjudicationTypes(), entityID = ADJUDICATION_ENTITY_ID, itemID = AdjudicationDetailID, DocumentStoreLocationID = DOCUMENT_STORE_LOCATION_ID, UserID = Profile.UserID }; model.BrowserTitle = (model.AdjudicationDetail.AdjudicationDetailID == -1) ? "New Adjudication" : "ADJ" + model.AdjudicationDetail.AdjudicationDetailID; model.IsAdjudicationDetailsLinkVisible = true; model.IsPanelLinkVisible = model.AdjudicationDetail.AdjudicationDetailID > 0 && model.AdjudicationDetail.AdjudicationDetailStatusID != 1; model.IsApplicationsLinkVisible = model.AdjudicationDetail.AdjudicationDetailID > 0; ViewBag.Controller = "Adjudication Details"; ViewBag.Page = "Adjudication Details"; return View("Default", model); } #endregion #region Applications public ActionResult Applications(long AdjudicationDetailID) { var database = new LegitimateDatabase(); var model = new ApplicationsModel { AdjudicationDetail = database.GetAdjudicationDetail(AdjudicationDetailID, -1, -1, Profile.UserID), Applications = database.GetAdjudicationApplications(AdjudicationDetailID), entityID = ADJUDICATION_ENTITY_ID, itemID = AdjudicationDetailID, DocumentStoreLocationID = DOCUMENT_STORE_LOCATION_ID, AdjudicationDecisions = database.GetAdjudicationDecisions() }; model.BrowserTitle = (model.AdjudicationDetail.AdjudicationDetailID == -1) ? "New Adjudication" : "ADJ" + model.AdjudicationDetail.AdjudicationDetailID; model.IsAdjudicationDetailsLinkVisible = true; model.IsPanelLinkVisible = model.AdjudicationDetail.AdjudicationDetailID > 0 && model.AdjudicationDetail.AdjudicationDetailStatusID != 1; model.IsApplicationsLinkVisible = model.AdjudicationDetail.AdjudicationDetailID > 0; ViewBag.Controller = "Applications"; ViewBag.Page = "Applications"; return View("Applications", model); } #endregion #region Panel public ActionResult Panel(long AdjudicationDetailID) { var database = new LegitimateDatabase(); var model = new PanelModel { AdjudicationDetail = database.GetAdjudicationDetail(AdjudicationDetailID, -1, -1, Profile.UserID), entityID = ADJUDICATION_ENTITY_ID, itemID = AdjudicationDetailID, DocumentStoreLocationID = DOCUMENT_STORE_LOCATION_ID }; if ( model.AdjudicationDetail.AdjudicationDetailStatusID == (short)Neo.Legitimate.Common.AdjudicationDetailStatus.AwaitingHearingQuorum || model.AdjudicationDetail.AdjudicationDetailStatusID == (short)Neo.Legitimate.Common.AdjudicationDetailStatus.AwaitingAdjudicationHearingDecisions && ( SecurityHelper.UserHasRole(Profile.Roles, Neo.Legitimate.Common.Role.ChairmanOfTheAdjudicationPanel) || SecurityHelper.UserHasRole(Profile.Roles, Neo.Legitimate.Common.Role.AdjudicationPanelmember) ) ) { var error = ""; database.UpdateAttendance(model.AdjudicationDetail.AdjudicationDetailID, Profile.UserID, out error); } var panelMember = database.GetAdjudicationPanelMembers(AdjudicationDetailID); model.PanelMembers = panelMember.Where(a => !a.AddedAfterStart); model.PanelMembersAddedAfterStart = panelMember.Where(a => a.AddedAfterStart); model.IsAdjudicationDetailsLinkVisible = true; model.IsPanelLinkVisible = model.AdjudicationDetail.AdjudicationDetailID > 0 && model.AdjudicationDetail.AdjudicationDetailStatusID != 1; model.IsApplicationsLinkVisible = model.AdjudicationDetail.AdjudicationDetailID > 0; model.BrowserTitle = (model.AdjudicationDetail.AdjudicationDetailID == -1) ? "New Adjudication" : "ADJ" + model.AdjudicationDetail.AdjudicationDetailID; ViewBag.Controller = "Panel"; ViewBag.Page = "Panel"; return View("Panel", model); } #endregion #endregion #region JSON endpoints #region Save [HttpPost] public JsonResult Save(AdjudicationDetail value) { var database = new LegitimateDatabase(); var errorMessage = ""; var currentAdjudication = database.SaveAdjudicationDetail(value, Profile.UserID, out errorMessage); var results = new { AdjudicationDetail = currentAdjudication, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region FinaliseAndPrintAdjudication [HttpPost] public JsonResult FinaliseAndPrintAdjudication(long adjudicationDetailID, string comments, short AdjudicationTypeID, long regionID) { var database = new LegitimateDatabase(); var reportDatabase = new ReportDatabase(); var CorrespondenceDatabase = new CorrespondenceDatabase(); var errorMessage = ""; var success = database.AdjudicationStatusUpdate(adjudicationDetailID, (short)Common.AdjudicationDetailStatus.AwaitingHearingQuorum, Profile.UserID, comments, out errorMessage); var receiversData = database.GetAdjudicationAgendaEmails(); var receiversEmails = ""; var adjudicationDetail = database.GetAdjudicationDetail(adjudicationDetailID, AdjudicationTypeID, regionID, Profile.UserID); string error; var reportDefinitionID = 6; var reportDefinition = reportDatabase.GetReportDefinitionWithServer(reportDefinitionID); var reportFormat = "pdf"; var reportParameters = new List>(); reportParameters.Add(new KeyValuePair("UserID", Profile.UserID.ToString())); reportParameters.Add(new KeyValuePair("AdjudicationDetailID", adjudicationDetailID.ToString())); var content = ReportGenerator.Render(reportDefinition, reportFormat, reportParameters, out error); if (success == true) { foreach (var i in receiversData) { receiversEmails = i.ToString(); } List receiversEmailsList = receiversEmails.Split(',').ToList(); foreach (var a in receiversEmailsList) { var messageid = CorrespondenceDatabase.Create(9, 0, 1, a, null, null, "Adjudication Agenda for adjudication ADJ" + adjudicationDetail.AdjudicationDetailID.ToString() + " to be held on " + adjudicationDetail.MeetingDate.Day + "/"+adjudicationDetail.MeetingDate.Month + "/" + adjudicationDetail.MeetingDate.Year+ " at "+ adjudicationDetail.MeetingTime, "Please find attached the adjudication agenda for ADJ" + adjudicationDetail.AdjudicationDetailID.ToString(), false); CorrespondenceDatabase.CreateAttachment(messageid.Key, 1/*System*/, content, "application/pdf", 10, "ADJ" + adjudicationDetail.AdjudicationDetailID.ToString() + "_AdjudicationAgenda.pdf", "AdjudicationAgenda"); } } var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region GetPanelMembers [HttpPost] public JsonResult GetPanelMembers(long adjudicationDetailID) { var database = new LegitimateDatabase(); return Json(database.GetAdjudicationPanelMembers(adjudicationDetailID), JsonSerializerOptions.EscapeBackSlash | JsonSerializerOptions.FormatDateTime); } #endregion #region GetApplicationsAwaitingAdjudicationDecision [HttpPost] public JsonResult GetApplicationsAwaitingAdjudicationDecision(long adjudicationDetailID) { var database = new LegitimateDatabase(); return Json(database.GetApplicationsAwaitingAdjudication(adjudicationDetailID, "20", Profile.UserID), JsonSerializerOptions.EscapeBackSlash | JsonSerializerOptions.FormatDateTime); } #endregion #region GetApplicationsAwaitingAdjudicationApproval [HttpPost] public JsonResult GetApplicationsAwaitingAdjudicationApproval(long adjudicationDetailID) { var database = new LegitimateDatabase(); return Json(database.GetApplicationsAwaitingAdjudication(adjudicationDetailID, "22", Profile.UserID), JsonSerializerOptions.EscapeBackSlash | JsonSerializerOptions.FormatDateTime); } #endregion #region GetApplicationsAwaitingAdjudicationAdjustment [HttpPost] public JsonResult GetApplicationsAwaitingAdjudicationAdjustment(long adjudicationDetailID) { var database = new LegitimateDatabase(); return Json(database.GetApplicationsAwaitingAdjudication(adjudicationDetailID, "21", Profile.UserID), JsonSerializerOptions.EscapeBackSlash | JsonSerializerOptions.FormatDateTime); } #endregion #region CommitApproveRejectAdjudicationDecisions ////[HttpPost] ////public JsonResult CommitApproveRejectAdjudicationDecisions(IEnumerable applications, bool isApproval) ////{ //// var database = new LegitimateDatabase(); //// var errorMessage = ""; //// database.ApproveAdjudicationDecisions(applications, isApproval, Profile.UserID, out errorMessage); //// var results = new //// { //// ErrorMessage = errorMessage //// }; //// return Json(results, JsonSerializerOptions.None); ////} #endregion #region StartAdjudication [HttpPost] public JsonResult StartAdjudication(long AdjudicationDetailID, long ChairmanID) { var database = new LegitimateDatabase(); var errorMessage = ""; var success = database.StartAdjudication(AdjudicationDetailID, ChairmanID, Profile.UserID, out errorMessage); var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region RemovePanelMember [HttpPost] public JsonResult RemovePanelMember(long AdjudicationDetailID, long AdjudicationPanelID) { var database = new LegitimateDatabase(); var errorMessage = ""; var success = database.RemoveAdjudicationPanelMember(AdjudicationDetailID, AdjudicationPanelID, out errorMessage); var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region PostponeAdjudication [HttpPost] public JsonResult PostponeAdjudication(long AdjudicationDetailID, string Reason) { var database = new LegitimateDatabase(); var errorMessage = ""; var success = database.PostponeAdjudication(AdjudicationDetailID, Reason, Profile.UserID, out errorMessage); var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region ReplaceAdjudicationPanelMember [HttpPost] public JsonResult ReplaceAdjudicationPanelMember(long AdjudicationDetailID, long FromAdjudicationPanelID, long ToAdjudicationPanelID) { var database = new LegitimateDatabase(); var errorMessage = ""; var success = database.ReplaceAdjudicationPanelMember(AdjudicationDetailID, FromAdjudicationPanelID, ToAdjudicationPanelID, Profile.UserID, out errorMessage); var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region ReverseAdjudicationDecision [HttpPost] public JsonResult ReverseAdjudicationDecision(long AdjudicationDetailID, long ApplicationRequestDetailID, string comments) { if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Securable.ApplicationsModule_Adjudication_Console_ReverseDecision)) { throw new Exception("Security error"); } var database = new LegitimateDatabase(); var errorMessage = ""; var success = false; try { database.ReverseAdjudicationDecision(AdjudicationDetailID, ApplicationRequestDetailID, Profile.UserID, comments); success = true; } catch (Exception ex) { errorMessage = database.GetInnermostMessage(ex); } var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region RemoveApplicationFromAdjudication [HttpPost] public JsonResult RemoveApplicationFromAdjudication(long AdjudicationDetailID, long ApplicationRequestDetailID, string comments) { if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Securable.ApplicationsModule_Adjudication_Console_RemoveApplication)) { throw new Exception("Security error"); } var database = new LegitimateDatabase(); var errorMessage = ""; var success = false; try { // Do not allow changes to finalised agendas (i.e., status != AwaitingAgendaFinalisation). var adjudicationDetail = database.GetAdjudicationDetail(AdjudicationDetailID, -1, -1, Profile.UserID); if (adjudicationDetail == null || adjudicationDetail.AdjudicationDetailStatusID != (short)Common.AdjudicationDetailStatus.AwaitingAgendaFinalisation) { return Json(new { Success = false, ErrorMessage = "Agenda finalised. Applications cannot be removed." }, JsonSerializerOptions.None); } database.RemoveApplicationFromAdjudication(ApplicationRequestDetailID, AdjudicationDetailID, comments, Profile.UserID); success = true; } catch (Exception ex) { errorMessage = database.GetInnermostMessage(ex); } var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region AddApplicationToAdjudication [HttpPost] public JsonResult AddApplicationToAdjudication(long adjudicationDetailID, string referenceNumber) { if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Securable.ApplicationsModule_Adjudication_Console_AddApplication)) { throw new Exception("Security error"); } var database = new LegitimateDatabase(); var errorMessage = ""; var success = false; try { database.AddApplicationToAdjudication(referenceNumber, adjudicationDetailID, Profile.UserID); success = true; } catch (Exception ex) { errorMessage = database.GetInnermostMessage(ex); } var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #endregion } }