using Neo.Afx.Common; using Neo.Afx.Security; using Neo.Afx.Services.Audits; using Neo.Afx.Services.Integration; using Neo.Afx.Services.Workflows.Entities; using Neo.Afx.ViewModels; using Neo.LegitimateLicences.ApplicationRequest.Models.Database; using Neo.LegitimateLicences.Common; using Neo.LegitimateLicences.Common.Helpers; using System; using System.Collections.Generic; using System.Data.Entity.Validation; using System.Linq; using System.Web.Mvc; namespace Neo.LegitimateLicences.ApplicationRequest { public partial class ApplicationRequestController { #region LicenceVehicle /// /// Return the licence vehicle dialog /// /// /// /// public ActionResult LicenceVehicle(long applicationDetailID, long applicationLicenceID) { #region Get active user task Vw_WorkflowInstanceTask activeUserTask = null; activeUserTask = WorkflowHelper.GetActiveUserTask(Profile.UserID, EntityEnum.ApplicationRequestDetails, applicationDetailID); #endregion var model = new ApplicationRequestFormModel { UserSecurables = (Profile.Securables != null) ? Profile.Securables.ToList() : new List(), Ui = new WorkflowConsoleUIProperties() }; var applicationDatabase = new ApplicationDatabase(); var vehicle = applicationDatabase.GetLicenceVehicle(applicationLicenceID, Profile.UserID); var application = applicationDatabase.GetApplicationView(applicationDetailID, Profile.UserID); var vehicleOptional = "true"; if( application.ApplicationRequestTypeID == (short)ApplicationRequestTypeEnum.ReplacementsCOV || application.ApplicationRequestTypeID == (short)ApplicationRequestTypeEnum.RenewalAndCOV || application.ApplicationRequestTypeID == (short)ApplicationRequestTypeEnum.RenewalCOVAndIncreaseInCarryingCapacity || application.ApplicationRequestTypeID == (short)ApplicationRequestTypeEnum.RenewalDeceasedTransferIncreaseInCarryingCapacityAndCOV || application.ApplicationRequestTypeID == (short)ApplicationRequestTypeEnum.IncreaseInCarryingCapacityAndCOV || application.ApplicationRequestTypeID == (short)ApplicationRequestTypeEnum.RenewalNormalTransferAndCOV || application.ApplicationRequestTypeID == (short)ApplicationRequestTypeEnum.RenewalAndDeceasedTransferAndCOV ) { vehicleOptional = "false"; vehicle.IsStillToBeAcquired = false; } model.Data = vehicle; model.ApplicationView = application; model.Lookups = GetVehicleLookups(); model.WorkflowInstance = WorkflowHelper.GetWorkflowInstanceView(WebHelper.EntityID, WebHelper.ItemID, Profile.UserID); if (model.ApplicationView.CopiedFromApplicationDetailID != null) { model.ParentApplicationView = Database.GetApplicationView(model.ApplicationView.CopiedFromApplicationDetailID.Value, Profile.UserID); } else { model.ParentApplicationView = new Neo.LegitimateLicences.ApplicationRequest.Models.Database.Vw_ApplicationDetails_Light(); } model.SetFormEditState(activeUserTask); model.VehicleOptional = vehicleOptional; return View("Licences.VehicleDetails", model); } #endregion #region LicencePreviousVehicle /// /// Return the licence previous vehicle documents /// /// /// /// public ActionResult LicencePreviousVehicle(long applicationDetailID, long applicationLicenceID) { #region Get active user task Vw_WorkflowInstanceTask activeUserTask = null; activeUserTask = WorkflowHelper.GetActiveUserTask(Profile.UserID, EntityEnum.ApplicationRequestDetails, applicationDetailID); #endregion var model = new ApplicationRequestFormModel { UserSecurables = (Profile.Securables != null) ? Profile.Securables.ToList() : new List(), Ui = new WorkflowConsoleUIProperties() }; var applicationDatabase = new ApplicationDatabase(); var vehicle = applicationDatabase.GetLicencePreviousVehicle(applicationLicenceID, Profile.UserID); var application = applicationDatabase.GetApplicationView(applicationDetailID, Profile.UserID); model.Data = vehicle; model.ApplicationView = application; model.Lookups = GetPrevouisVehicleLookups(); model.WorkflowInstance = WorkflowHelper.GetWorkflowInstanceView(WebHelper.EntityID, WebHelper.ItemID, Profile.UserID); if (model.ApplicationView.CopiedFromApplicationDetailID != null) { model.ParentApplicationView = Database.GetApplicationView(model.ApplicationView.CopiedFromApplicationDetailID.Value, Profile.UserID); } else { model.ParentApplicationView = new Neo.LegitimateLicences.ApplicationRequest.Models.Database.Vw_ApplicationDetails_Light(); } model.SetFormEditState(activeUserTask); return View("Licences.PreviousVehicleDetails", model); } #endregion #region LicenceVehicleDocuments /// /// Return the licence vehicle documents dialog /// /// /// /// public ActionResult LicenceVehicleDocuments(long applicationDetailID, long applicationLicenceID) { #region Get active user task Vw_WorkflowInstanceTask activeUserTask = null; activeUserTask = WorkflowHelper.GetActiveUserTask(Profile.UserID, EntityEnum.ApplicationRequestDetails, applicationDetailID); #endregion var model = new ApplicationRequestFormModel { UserSecurables = (Profile.Securables != null) ? Profile.Securables.ToList() : new List(), Ui = new WorkflowConsoleUIProperties() }; var applicationDatabase = new ApplicationDatabase(); var vehicle = applicationDatabase.GetLicenceVehicle(applicationLicenceID, Profile.UserID); var services = applicationDatabase.GetLicenceServiceDetails(applicationLicenceID, Profile.UserID); var application = applicationDatabase.GetApplicationView(applicationDetailID, Profile.UserID); model.Data = vehicle; model.ApplicationView = application; model.WorkflowInstance = WorkflowHelper.GetWorkflowInstanceView(WebHelper.EntityID, WebHelper.ItemID, Profile.UserID); Boolean isUnscheduledService = false; if (services.Services.Where(a => a.ServiceTypeID == (short)ServiceTypeEnum.Unscheduled).Count() > 0) { isUnscheduledService = true; } model.IsUnscheduledService = isUnscheduledService; if (model.ApplicationView.CopiedFromApplicationDetailID != null) { model.ParentApplicationView = Database.GetApplicationView(model.ApplicationView.CopiedFromApplicationDetailID.Value, Profile.UserID); } else { model.ParentApplicationView = new Neo.LegitimateLicences.ApplicationRequest.Models.Database.Vw_ApplicationDetails_Light(); } model.SetFormEditState(activeUserTask); return View("Licences.VehicleDocuments", model); } #endregion #region GetLookups /// /// Get lookup lists used on vehicle details /// /// public List GetVehicleLookups() { var lookups = new List(); var integrationStore = new SqlIntegrationStore(); try { integrationStore.Open(); lookups.Add(new LookupList("VehicleTypes", integrationStore.GetDataEntities("VehicleTypes", string.Empty).OrderBy(a => a.Title))); lookups.Add(new LookupList("CarryingCapacities", integrationStore.GetDataEntities("CarryingCapacities", string.Empty))); lookups.Add(new LookupList("VehicleModels", integrationStore.GetDataEntities("VehicleModels", string.Empty))); } finally { integrationStore.Close(); } return lookups; } public List GetPrevouisVehicleLookups() { var lookups = new List(); var integrationStore = new SqlIntegrationStore(); try { integrationStore.Open(); lookups.Add(new LookupList("VehicleTypes", integrationStore.GetDataEntities("VehicleTypes", string.Empty).OrderBy(a => a.Title))); lookups.Add(new LookupList("CarryingCapacities", integrationStore.GetDataEntities("CarryingCapacities", string.Empty))); lookups.Add(new LookupList("VehicleModels", integrationStore.GetDataEntities("VehicleModels", string.Empty))); lookups.Add(new LookupList("VehicleMakes", integrationStore.GetDataEntities("VehicleMakes", string.Empty))); } finally { integrationStore.Close(); } return lookups; } #endregion #region SaveLicenceVehicle /// /// Save details for licence vehicle record /// /// /// /// [HttpPost] public JsonNetResult SaveLicenceVehicle(long applicationDetailID, ApplicationLicenceVehicleDetail value) { var changes = new List(); var auditDb = new AuditsDatabase(); try { #region Check if can save var model = GetModel(); if (!model.Ui.canSubmit) { throw new Exception("#EXPOSE_ERROR#Security error"); } if (!model.CanEditNewVehicleDocuments) { throw new Exception("#EXPOSE_ERROR#Security error"); } #endregion var appDb = new ApplicationDatabase(); //don't use database context as we need the values refreshed every time var existingModel = appDb.GetLicenceVehicle(value.ApplicationLicenceID, Profile.UserID); Database.Update(value); changes.AddRange(auditDb.GetEntityDifferences(existingModel, value, "ApplicationLicenceID")); Database.Save(); if (changes.Count > 0) { auditDb.WriteEntries((short)AuditSourceEnum.Application, (short)AuditActionEnum.Updated, changes, (short)EntityEnum.ApplicationtDetails, applicationDetailID, Profile.UserID); } } catch (DbEntityValidationException dbEx) { foreach (var validationError in dbEx.EntityValidationErrors.SelectMany(validationErrors => validationErrors.ValidationErrors)) { return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error =string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) } }; } } catch (Exception ex) { #region Error Handling #region Error Additional Data Dictionary additionalData = new Dictionary(); additionalData.Add("applicationDetailID", applicationDetailID); additionalData.Add("value", value); #endregion string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "SaveLicenceVehicleDocuments", additionalData); #endregion return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = error } }; } //Update the Vehicle ID record linked on licence record try { #region Check if can save var model = GetModel(); if (!model.Ui.canSubmit) { throw new Exception("#EXPOSE_ERROR#Security error"); } if (!model.CanEditNewVehicleDocuments) { throw new Exception("#EXPOSE_ERROR#Security error"); } #endregion var appDb = new ApplicationDatabase(); //don't use database context as we need the values refreshed every time var existingModel = appDb.GetLicence(value.ApplicationLicenceID, Profile.UserID); var updatdModel = existingModel; updatdModel.VehicleTypeID = value.VehicleTypeID; Database.Update(updatdModel); changes.AddRange(auditDb.GetEntityDifferences(existingModel, updatdModel, "ApplicationLicenceID")); Database.Save(); if (changes.Count > 0) { auditDb.WriteEntries((short)AuditSourceEnum.Application, (short)AuditActionEnum.Updated, changes, (short)EntityEnum.ApplicationtDetails, applicationDetailID, Profile.UserID); } } catch (DbEntityValidationException dbEx) { foreach (var validationError in dbEx.EntityValidationErrors.SelectMany(validationErrors => validationErrors.ValidationErrors)) { return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) } }; } } catch (Exception ex) { #region Error Handling #region Error Additional Data Dictionary additionalData = new Dictionary(); additionalData.Add("applicationDetailID", applicationDetailID); additionalData.Add("value", value); #endregion string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "SaveLicenceVehicleDocuments", additionalData); #endregion return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = error } }; } return new JsonNetResult() { Data = new JsonBaseResult() { Success = true } }; } #endregion #region SaveLicenceVehicleDocuments /// /// Save the documents for the licence vehicle record /// /// /// /// [HttpPost] public JsonNetResult SaveLicenceVehicleDocuments(long applicationDetailID, ApplicationLicenceVehicleDetail value) { var changes = new List(); var auditDb = new AuditsDatabase(); try { #region Check if can save var model = GetModel(); if (!model.Ui.canSubmit) { throw new Exception("#EXPOSE_ERROR#Security error"); } if (!model.CanEditNewVehicleDocuments) { throw new Exception("#EXPOSE_ERROR#Security error"); } #endregion var appDb = new ApplicationDatabase(); //don't use database context as we need the values refreshed every time var existingModel = appDb.GetLicenceVehicle(value.ApplicationLicenceID, Profile.UserID); Database.Update(value); changes.AddRange(auditDb.GetEntityDifferences(existingModel, value, "ApplicationLicenceID")); Database.Save(); if (changes.Count > 0) { auditDb.WriteEntries((short)AuditSourceEnum.Application, (short)AuditActionEnum.Updated, changes, (short)EntityEnum.ApplicationtDetails, applicationDetailID, Profile.UserID); } } catch (DbEntityValidationException dbEx) { foreach (var validationError in dbEx.EntityValidationErrors.SelectMany(validationErrors => validationErrors.ValidationErrors)) { return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) } }; } } catch (Exception ex) { #region Error Handling #region Error Additional Data Dictionary additionalData = new Dictionary(); additionalData.Add("applicationDetailID", applicationDetailID); additionalData.Add("value", value); #endregion string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "SaveLicenceVehicleDocuments", additionalData); #endregion return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = error } }; } return new JsonNetResult() { Data = new JsonBaseResult() { Success = true } }; } #endregion } }