using Neo.Legitimate.Common; using Neo.Legitimate.Data.Models; using Neo.Legitimate.VerificationConsole.Models; using Pilotfish.Afx.Mvc; using Pilotfish.Afx.Security; using Pilotfish.Afx.Services.Comments; using Pilotfish.Afx.Services.Comments.Entities; using Pilotfish.Afx.Services.Documents; using Pilotfish.Afx.Services.Documents.Entities; using Pilotfish.Afx.Services.Reports; using Pilotfish.Afx.Services.Workflows; using Pilotfish.Afx.Services.Workflows.Entities; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; namespace Neo.Legitimate.VerificationConsole.Controllers { [Authorize] public partial class VerificationConsoleController : Neo.Legitimate.Common.ControllerBase { private const int _applicationWorkflowID = 1; private const int _lirWorkflowID = 5; private const int _applicationEntityID = 1000; private const int _lirEntityID = 1014; private const long _documentStoreLocationID = 3; private const int _lerEntityID = 1019; private const short _documentTypeID = 1042; #region Action Results #region Default public ActionResult Default(long applicationRequestDetailID, long workflowInstanceTaskID, string appOrLir, long? licenceIssueDetailID, long? licenceUpliftmentExtensionRequestDetailID) { var database = new LegitimateDatabase(); var commentDatabase = new CommentsDatabase(); var documentDatabase = new DocumentsDatabase(); var workflowsDatabase = new WorkflowsDatabase(); var application = database.GetApplicationRequestDetail_ViewOnly(applicationRequestDetailID); var licence = new Vw_LicenceIssueDetails(); var licenceUpliftmentExtension = new Vw_LicenceUpliftmentExtensionRequestDetails(); var resetDocumentQuestions = false; if (appOrLir == "LIR") { licence = database.GetLicenceIssueDetail_ViewOnly(licenceIssueDetailID.Value); } if (appOrLir == "LER") { licenceUpliftmentExtension = database.GetLicenceUpliftmentExtensionDetail_ViewOnly(licenceUpliftmentExtensionRequestDetailID.Value); } #region ensure that task is assigned to current user var at = new Vw_WorkflowInstanceTask(); if (appOrLir == "APP") { at = WorkflowHelper.GetActiveTask((long)Entity.ApplicationRequestDetails, applicationRequestDetailID); } else if (appOrLir == "LIR") { at = WorkflowHelper.GetActiveTask((long)Entity.LicenceIssueDetails, licenceIssueDetailID.Value); } else { at = WorkflowHelper.GetActiveTask((long)Entity.LicenceUpliftmentExtensionRequestDetails, licenceUpliftmentExtensionRequestDetailID.Value); } if (at == null) { return RedirectToAction("ShowError", "Error", new { msg = "The application is not in verification any more" }); } if (at.WorkflowTemplateStepID != 9 /*APP doc verification*/ && at.WorkflowTemplateStepID != 57 /*LIR document verification*/ && at.WorkflowTemplateStepID != 60 /*LER document verification*/) { return RedirectToAction("ShowError", "Error", new { msg = "The application is not in verification any more" }); } if (!SecurityHelper.UserHasRole(((UserProfile)Profile).Roles, Neo.Legitimate.Common.Role.Verifier)) { return RedirectToAction("ShowError", "Error", new { msg = "The user has not been linked to the verification role" }); } if (at.AssignedToID == (long)Defaults.SystemUserID) { var user = ConfigurationManager.AppSettings["SystemUsername"].ToString(); var reassign = workflowsDatabase.ReAssignWorkflowInstanceTask(at.WorkflowInstanceTaskID, Profile.UserID, "", user); if (String.IsNullOrEmpty(reassign)) { if (appOrLir == "APP") { workflowInstanceTaskID = WorkflowHelper.GetActiveTask((long)Entity.ApplicationRequestDetails, applicationRequestDetailID).WorkflowInstanceTaskID; } else if (appOrLir == "LIR") { workflowInstanceTaskID = WorkflowHelper.GetActiveTask((long)Entity.LicenceIssueDetails, licenceIssueDetailID.Value).WorkflowInstanceTaskID; } else { workflowInstanceTaskID = WorkflowHelper.GetActiveTask((long)Entity.LicenceUpliftmentExtensionRequestDetails, licenceUpliftmentExtensionRequestDetailID.Value).WorkflowInstanceTaskID; } resetDocumentQuestions = true; } else { return RedirectToAction("ShowError", "Error", new { msg = "Error re-assiging verification task: " + reassign }); } } else if (at.AssignedToID == Profile.UserID) { workflowInstanceTaskID = at.WorkflowInstanceTaskID; } else { return RedirectToAction("ShowError", "Error", new { msg = "The task is currently assigned to " + at.AssignedToName + ". Please refresh the verification list" }); } #endregion var documentsAwaitingVerification = new List(); var documentQuestions = new List(); var comments = new List(); long activeEntityID = -1; long activeItemID = -1; var reportDatabase = new ReportDatabase(); try { if (appOrLir == "APP") { //This section is disabled as per PCR0000285 (undo this and delete the var routeSummaryInList = false and var isRouteDocumentNull = false ) ////generate pdf ////get list of applicationdocuments for app //var applicationDocuments = database.GetApplicationDocuments(applicationRequestDetailID, true); ////check if new documenttypeid is part of the set //var routeSummaryInList = false; //var isRouteDocumentNull = false; //foreach(var Document in applicationDocuments) //{ // if(Document.DocumentTypeID == 1042) // { // routeSummaryInList = true; // } // if (Document.DocumentTypeID == 1042 && Document.Key == -1) // { // routeSummaryInList = true; // isRouteDocumentNull = true; // } //} var routeSummaryInList = false; var isRouteDocumentNull = false; if (routeSummaryInList) { string error; var reportDefinitionID = 10051; var reportDefinition = reportDatabase.GetReportDefinitionWithServer(reportDefinitionID); var reportFormat = "pdf"; var reportParameters = new List>(); reportParameters.Add(new KeyValuePair("UserID", Profile.UserID.ToString())); reportParameters.Add(new KeyValuePair("ApplicationRequestDetailID", applicationRequestDetailID.ToString())); var content = ReportGenerator.Render(reportDefinition, reportFormat, reportParameters, out error); //upload pdf DocumentUtilities _utilities = new DocumentUtilities(); var documentStoreLocationID = _documentStoreLocationID; var documentTypeID = _documentTypeID; var itemID = applicationRequestDetailID; var entityID = _applicationEntityID; var documentID = -1; var file = content; var filename = "Application Routes Document.pdf"; var mimeType = "application/pdf"; var document = _utilities.Upload( UserProfile.Current.UserID, UserProfile.Current.UserName, documentID, entityID, itemID, documentTypeID, documentStoreLocationID, filename, mimeType, file); if(isRouteDocumentNull) { database.AddDocumentToApplication(applicationRequestDetailID, document.DocumentTypeID, document.DocumentID, Profile.UserID); } } documentsAwaitingVerification = documentDatabase.GetDocumentsAwaitingVerification(_applicationEntityID, applicationRequestDetailID); documentQuestions = documentDatabase.GetDocumentsAwaitingVerificationQuestionsResetAndGet(_applicationEntityID, applicationRequestDetailID, resetDocumentQuestions); comments = commentDatabase.GetComments(_applicationEntityID, applicationRequestDetailID).ToList(); activeEntityID = _applicationEntityID; activeItemID = applicationRequestDetailID; } else if (appOrLir == "LIR") { documentsAwaitingVerification = documentDatabase.GetDocumentsAwaitingVerification(_lirEntityID, licenceIssueDetailID.Value); documentQuestions = documentDatabase.GetDocumentsAwaitingVerificationQuestionsResetAndGet(_lirEntityID, licenceIssueDetailID.Value, resetDocumentQuestions); comments = commentDatabase.GetComments(_lirEntityID, licenceIssueDetailID.Value).ToList(); activeEntityID = _lirEntityID; activeItemID = licenceIssueDetailID.Value; } else //LER { documentsAwaitingVerification = documentDatabase.GetDocumentsAwaitingVerification(_lerEntityID, licenceUpliftmentExtensionRequestDetailID.Value); documentQuestions = documentDatabase.GetDocumentsAwaitingVerificationQuestionsResetAndGet(_lerEntityID, licenceUpliftmentExtensionRequestDetailID.Value, resetDocumentQuestions); comments = commentDatabase.GetComments(_lerEntityID, licenceUpliftmentExtensionRequestDetailID.Value).ToList(); activeEntityID = _lerEntityID; activeItemID = licenceUpliftmentExtensionRequestDetailID.Value; } } catch(Exception ex) { database.HandleVerificationErrors(applicationRequestDetailID, Profile.UserID); throw ex; } if (documentsAwaitingVerification.Count == 0) { database.HandleVerificationErrors(applicationRequestDetailID, Profile.UserID); return RedirectToAction("ShowError", "Error", new { msg = "The application does not have any documents to verify." }); } //To fix this server error, run the following proc [Doc].[Pr_DocumentsAwaitingVerificationQuestionsResetAndGet] if (documentQuestions.Count == 0) { if (resetDocumentQuestions == false) /*the questions was not reset*/ { resetDocumentQuestions = true; //force a reset of the questions if (appOrLir == "APP") { documentQuestions = documentDatabase.GetDocumentsAwaitingVerificationQuestionsResetAndGet(_applicationEntityID, applicationRequestDetailID, resetDocumentQuestions); } else if (appOrLir == "LIR") { documentQuestions = documentDatabase.GetDocumentsAwaitingVerificationQuestionsResetAndGet(_lirEntityID, licenceIssueDetailID.Value, resetDocumentQuestions); } else //LER { documentQuestions = documentDatabase.GetDocumentsAwaitingVerificationQuestionsResetAndGet(_lerEntityID, licenceUpliftmentExtensionRequestDetailID.Value, resetDocumentQuestions); } } if (documentQuestions.Count == 0) { database.HandleVerificationErrors(applicationRequestDetailID, Profile.UserID); return RedirectToAction("ShowError", "Error", new { msg = "The application does not have any questions to verify." }); } } var model = new VerificationModel { DocumentsAwaitingVerification = documentsAwaitingVerification, CurrentDocumentID = documentsAwaitingVerification.FirstOrDefault().DocumentID, Comments = comments, DocumentQuestions = documentQuestions, Application = application, LicenceIssueDetail = licence, LicenceUpliftmentExtensionDetail = licenceUpliftmentExtension, entityID = activeEntityID, itemID = activeItemID, WorkflowInstanceTaskID = workflowInstanceTaskID, AppOrLir = appOrLir }; ViewBag.Controller = "Verification Details"; ViewBag.Page = "Verification Details"; return View("Verification", model); } #endregion #endregion #region JSON endpoints #region CompleteApplicationVerification [HttpPost] public JsonResult CompleteApplicationVerification(long applicationRequestDetailID, long workflowInstanceTaskID, List documentQuestions, string comments) { var database = new LegitimateDatabase(); var documentDatabase = new DocumentsDatabase(); var errorMessage = ""; var success = false; var at = WorkflowHelper.GetActiveTask((long)Entity.ApplicationRequestDetails, applicationRequestDetailID); if (at.WorkflowInstanceTaskID == workflowInstanceTaskID) { documentDatabase.UpdateDocumentQuestions(documentQuestions, Profile.UserID); success = database.CompleteApplicationRequestVerification(applicationRequestDetailID, workflowInstanceTaskID, comments, Profile.UserID, out errorMessage); } else { success = false; errorMessage = "The given task is not active any more."; } var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region CompleteLicenceVerification [HttpPost] public JsonResult CompleteLicenceVerification(long licenceIssueDetailID, long workflowInstanceTaskID, List documentQuestions, string comments) { var database = new LegitimateDatabase(); var documentDatabase = new DocumentsDatabase(); var errorMessage = ""; var success = false; var at = WorkflowHelper.GetActiveTask((long)Entity.LicenceIssueDetails, licenceIssueDetailID); if (at.WorkflowInstanceTaskID == workflowInstanceTaskID) { documentDatabase.UpdateDocumentQuestions(documentQuestions, Profile.UserID); success = database.CompleteLicenceIssueVerification(licenceIssueDetailID, workflowInstanceTaskID, comments, Profile.UserID, out errorMessage); } else { success = false; errorMessage = "The given task is not active any more."; } var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #region CompleteLicenceUpliftmentExtensionVerification [HttpPost] public JsonResult CompleteLicenceUpliftmentExtensionVerification(long licenceUpliftmentExtensionRequestDetailID, long workflowInstanceTaskID, List documentQuestions, string comments) { var database = new LegitimateDatabase(); var documentDatabase = new DocumentsDatabase(); var errorMessage = ""; var success = false; var at = WorkflowHelper.GetActiveTask((long)Entity.LicenceUpliftmentExtensionRequestDetails, licenceUpliftmentExtensionRequestDetailID); if (at.WorkflowInstanceTaskID == workflowInstanceTaskID) { documentDatabase.UpdateDocumentQuestions(documentQuestions, Profile.UserID); success = database.CompleteLicenceUpliftmentExtensionVerification(licenceUpliftmentExtensionRequestDetailID, workflowInstanceTaskID, comments, Profile.UserID, out errorMessage); } else { success = false; errorMessage = "The given task is not active any more."; } var results = new { Success = success, ErrorMessage = errorMessage }; return Json(results, JsonSerializerOptions.None); } #endregion #endregion #region GetFileContent /// /// Gets the content of the file. /// /// The file. /// static byte[] GetFileContent(HttpPostedFile file) { var fileLen = file.ContentLength; var result = new byte[fileLen]; file.InputStream.Read(result, 0, fileLen); return result; } #endregion } }