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