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
}
}