using System; using System.Linq; using System.Web.Mvc; using System.Data.Entity.Validation; using System.Collections.Generic; using Neo.Afx.Services.Workflows; using Neo.LegitimateLicences.Data.Models; using Neo.Afx.Services.Audits; using Neo.LegitimateLicences.ApplicationRequest.Models.Database; using Neo.Afx.Common; using Neo.LegitimateLicences.Common; namespace Neo.LegitimateLicences.ApplicationRequest { public partial class ApplicationRequestController { #region Save /// /// Save application form data /// /// /// [HttpPost] public JsonNetResult Save(ApplicationDetail value) { var changes = new List(); var auditDb = new AuditsDatabase(); try { if (value.ApplicationDetailID <= 0) { changes.Add("New application created"); value.CreatedDate = DateTime.Now; value.CreatedByID = Profile.UserID; value.UpdatedDate = DateTime.Now; value.UpdatedByID = Profile.UserID; #region Applicant var appDb = new ApplicationDatabase(); //don't use database context as we need the values refreshed every time var existingModel = appDb.GetApplicationForm(value.ApplicationDetailID, Profile.UserID); changes.AddRange(auditDb.GetEntityDifferences(existingModel.Applicant, value.Applicant, "ApplicationDetailID")); #endregion Database.Insert(value); } else { #region Check if can save var model = GetModel(); if (!model.Ui.canSubmit) { throw new Exception("Security error"); } #endregion var appDb = new ApplicationDatabase(); //don't use database context as we need the values refreshed every time var existingModel = appDb.GetApplicationForm(value.ApplicationDetailID, Profile.UserID); value.UpdatedDate = DateTime.Now; value.UpdatedByID = Profile.UserID; #region Update ApplicationDetail, ApplicationApplicantDetail, ApplicationPreviousLicenceHolder, ApplicationContractDetail, ApplicationNPTRDetail, ApplicationProxyDetail Details Database.Update(value); changes.AddRange(auditDb.GetEntityDifferences(existingModel, value, "ApplicationDetailID")); Database.Update(value.Applicant); changes.AddRange(auditDb.GetEntityDifferences(existingModel.Applicant, value.Applicant, "ApplicationDetailID")); Database.Update(value.PreviousLicenceHolder); changes.AddRange(auditDb.GetEntityDifferences(existingModel.PreviousLicenceHolder, value.PreviousLicenceHolder, "ApplicationDetailID")); Database.Update(value.Contract); changes.AddRange(auditDb.GetEntityDifferences(existingModel.Contract, value.Contract, "ApplicationDetailID")); Database.Update(value.NPTR); changes.AddRange(auditDb.GetEntityDifferences(existingModel.NPTR, value.NPTR, "ApplicationDetailID")); Database.Update(value.Proxy); changes.AddRange(auditDb.GetEntityDifferences(existingModel.Proxy, value.Proxy, "ApplicationDetailID")); #endregion } } catch (Exception ex) { #region Error Handling #region Error Additional Data Dictionary additionalData = new Dictionary(); additionalData.Add("ApplicationDetailID", value.ApplicationDetailID); #endregion string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "Save", additionalData); #endregion return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error =string.Format("Error: {0}", error) } }; } try { Database.Save(); WorkflowsDatabase workflowsDatabase = new WorkflowsDatabase(); workflowsDatabase.ExecutePostFormSave(value.WorkflowInstanceID.Value, Profile.UserID); if (changes.Count > 0) { auditDb.WriteEntries((short)AuditSourceEnum.Application, (short)AuditActionEnum.Updated, changes, (short)EntityEnum.ApplicationtDetails, value.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", value.ApplicationDetailID); #endregion string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "Save", additionalData); #endregion if (ex.InnerException != null) { if (ex.InnerException.Message.Contains("IX_PrecheckDetailID")) { return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = "The application has already been saved against this pre-check. Please submit the original application instead." } }; } else { return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = string.Format("Error: {0}", error) } }; } } else { return new JsonNetResult() { Data = new JsonBaseResult() { Success = false, ErrorCode = "ERROR", Error = string.Format("Error: {0}", error) } }; } } var formDb = new ApplicationDatabase(); var formData = formDb.GetApplicationForm(value.ApplicationDetailID, Profile.UserID); return new JsonNetResult() { Data = new JsonBaseResult() { Result = formData, Success = true } }; } #endregion } }