using Neo.Afx.Common;
using Neo.Afx.Services.Integration;
using Neo.Afx.ViewModels;
using Neo.LegitimateLicences.ApplicationRequest.Models.Database;
using Neo.LegitimateLicences.Common;
using Neo.LegitimateLicences.Data.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Neo.LegitimateLicences.Logic.ApplicationLogic;
using Neo.LegitimateLicences.Logic.Helpers;
namespace Neo.LegitimateLicences.ApplicationRequest
{
public class ApplicantDetails
{
public string Name { get;set; }
public string Cell { get;set; }
public long? ProvinceID { get;set; }
public long? RegionID { get;set; }
public long? VerifiedMemberID { get;set; }
}
public partial class ApplicationRequestController
{
#region New
///
/// Load New console
///
///
public ActionResult New()
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Common.SecurableEnum.ApplicationsModule_Home_StartNewApplication))
{
return RedirectToAction("Default", "Dashboard");
}
var m = new NewApplicationRequestModel();
m.Lookups = GetLookupsForNewApplicationView();
#region Get User's Office Location
UserProfileHelper userProfileHelper = new UserProfileHelper(Profile.UserID, Profile.OfficeLocationID);
var officeLocation = userProfileHelper.OfficeLocation;
m.IsNPTR = userProfileHelper.IsNPTR;
m.IsTAT = userProfileHelper.IsTAT;
m.IsNewApplicationsRestrictedToList = (officeLocation.DivisionTypeID == (short)DivisionTypeEnum.PRE && officeLocation.ProvinceID == (short)ProvinceEnum.KwaZuluNatal);
#endregion
#region Get Vehicle/Service Types
ApplicationLogic applicationLogic = new ApplicationLogic();
m.VehicleServiceTypeCollection = applicationLogic.VehicleServiceTypeCollectionGet();
#endregion
if (m.IsTAT)
{
return View("New.TAT", m);
}
return View("New", m);
}
#endregion
#region GetLookupsForNewApplicationView
///
/// Retrieve list of master datasources for ApplicationRequest\New view
///
/// List
public List GetLookupsForNewApplicationView()
{
var lookups = new List();
var integrationStore = new SqlIntegrationStore();
try
{
integrationStore.Open();
lookups.Add(new LookupList("IDTypes", integrationStore.GetDataEntities("IDTypes", string.Empty).Where(o => o.Key != ((short)IdTypeEnum.TaxiAssociationRegistrationNumber).ToString()).ToList().OrderBy(a => a.Title)));
lookups.Add(new LookupList("ApplicationRequestTypes", integrationStore.GetDataEntities("ApplicationRequestTypes", string.Empty).OrderBy(a => a.Title)));
lookups.Add(new LookupList("VehicleTypes", integrationStore.GetDataEntities("VehicleTypes", string.Empty).OrderBy(a => a.Title)));
lookups.Add(new LookupList("ServiceTypes", integrationStore.GetDataEntities("ServiceTypes", string.Empty).OrderBy(a => a.Title)));
lookups.Add(new LookupList("Regions", integrationStore.GetDataEntities("Regions", string.Empty).OrderBy(a => a.Title)));
lookups.Add(new LookupList("Provinces", integrationStore.GetDataEntities("Provinces", string.Empty).OrderBy(a => a.Title)));
}
finally
{
integrationStore.Close();
}
return lookups;
}
#endregion
#region ApplicantSearch
///
/// Search applicant by ID number to determine valid application types/licences
///
///
/// JsonNetResult
[HttpPost]
public JsonNetResult ApplicantSearch(string idOrBusinessRegistrationNumber)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Common.SecurableEnum.ApplicationsModule_Home_StartNewApplication))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
var database = new LegitimateDatabase();
var applicationDatabase = new ApplicationDatabase();
#region Get User's Office Location
UserProfileHelper userProfileHelper = new UserProfileHelper(Profile.UserID, Profile.OfficeLocationID);
var officeLocation = userProfileHelper.OfficeLocation;
#endregion
var existingAccreditation = new List();
var allowedVehicleTypes = (short)VehicleTypeEnum.Bus + "," + (short)VehicleTypeEnum.Midibus + "," + (short)VehicleTypeEnum.Minibus + "," + (short)VehicleTypeEnum.MotorCar;
var existingLicences = new List();
var appsInProgress = new List();
var allowedNewApplications = new List();
var verifiedMember = new Pr_MemberGet_Result();
var applicant = new ApplicantDetails();
var memberState = "";
#region Default allowed application types that applies to everyone
var allowedTypes = new List();
allowedTypes.Add(Convert.ToString((short)ApplicationRequestTypeEnum.NewOperatingLicence));
allowedTypes.Add(Convert.ToString((short)ApplicationRequestTypeEnum.ApplicationForAccreditation));
allowedTypes.Add(Convert.ToString((short)ApplicationRequestTypeEnum.DeceasedTransfer));
allowedTypes.Add(Convert.ToString((short)ApplicationRequestTypeEnum.NormalTransfer));
#endregion
#region Load data
verifiedMember = database.GetVerifiedMember(idOrBusinessRegistrationNumber, Profile.UserID);
appsInProgress = applicationDatabase.GetApplicantApplicationsInProgress(idOrBusinessRegistrationNumber, Profile.UserID);
existingLicences = applicationDatabase.GetApplicationCreateMemberLicences(idOrBusinessRegistrationNumber, Profile.UserID);
if (verifiedMember != null)
{
existingAccreditation = applicationDatabase.GetApplicationCreateMemberAccreditations(verifiedMember.MemberID, Profile.UserID);
}
if (officeLocation.DivisionTypeID == (short)DivisionTypeEnum.PRE && officeLocation.ProvinceID == (short)ProvinceEnum.KwaZuluNatal)
{
allowedNewApplications = applicationDatabase.GetApplicationCreateMemberAllowedNewSummary(idOrBusinessRegistrationNumber, Profile.UserID);
}
#endregion
#region Add allowed types to list based on licences received
foreach (var licence in existingLicences)
{
if(licence.AllowedApplicationRequestTypes != null)
{
foreach (var type in licence.AllowedApplicationRequestTypes.Split(','))
{
if (!allowedTypes.Contains(type))
{
allowedTypes.Add(type);
}
}
}
}
if (existingAccreditation.Count > 0)
{
allowedTypes.Remove(Convert.ToString((short)ApplicationRequestTypeEnum.ApplicationForAccreditation));
foreach (var licence in existingAccreditation)
{
foreach (var type in licence.AllowedApplicationRequestTypes.Split(','))
{
if (!allowedTypes.Contains(type))
{
allowedTypes.Add(type);
}
}
}
}
#endregion
#region Populate applicant name etc.
if (verifiedMember != null)
{
memberState = "ExistingVerifiedMember";
applicant.Name = verifiedMember.FullName;
applicant.Cell = verifiedMember.TelCell;
applicant.RegionID = verifiedMember.RegionID;
applicant.ProvinceID = verifiedMember.ProvinceID;
applicant.VerifiedMemberID = verifiedMember.MemberID;
}
else if (appsInProgress != null && appsInProgress.Count > 0)
{
memberState = "ExistingApplicant";
var appToUse = appsInProgress.First();
applicant.Name = appToUse.ApplicantName;
applicant.Cell = appToUse.TelCell;
applicant.RegionID = appToUse.RegionID;
applicant.ProvinceID = appToUse.ProvinceID;
}
else if (existingLicences != null && existingLicences.Count > 0)
{
memberState = "ExistingMemberInOtherSystems";
var licenceToUse = existingLicences.First();
applicant.Name = licenceToUse.OperatorName;
applicant.Cell = licenceToUse.TelCell;
applicant.RegionID = licenceToUse.RegionID;
applicant.ProvinceID = licenceToUse.ProvinceID;
}
else
{
memberState = "NewApplicant";
}
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Result = new
{
MemberState = memberState,
AllowedVehicleTypes = allowedVehicleTypes,
AllowedTypes = string.Join(",", allowedTypes),
Licences = existingLicences,
Accreditations = existingAccreditation,
Applications = appsInProgress,
Applicant = applicant,
AllowedNewApplications = allowedNewApplications
}
}
};
}
catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("idOrBusinessRegistrationNumber", idOrBusinessRegistrationNumber);
#endregion
string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "ApplicantSearch", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = error
}
};
}
}
#endregion
#region CreateApplicationPrecheck
///
/// Create application precheck record and return precheck result outcome
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
[HttpPost]
public JsonNetResult CreateApplicationPrecheck(short applicationRequestTypeID, short sourceApplicationID, string applicantName, string applicantCell, short idTypeID, string idOrBusinessRegistrationNumber, string originatingLicenceNumber, string originatingAccreditationNumber, short? vehicleTypeID, string serviceTypeIDs, short numberOfLicencesRequired, short? applicantProvinceID, short? applicantRegionID, long? applicationAssociationID, string applicationAllowedNewLicenceIDs, string selectedRouteIDs)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Common.SecurableEnum.ApplicationsModule_Home_StartNewApplication))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
var applicationDatabase = new ApplicationDatabase();
bool precheckPassed = true;
long applicationPrecheckDetailID = 0;
var precheckOutcomes = applicationDatabase.CreateApplicationPrecheck(applicationRequestTypeID, sourceApplicationID, applicantName, applicantCell, idTypeID, idOrBusinessRegistrationNumber, originatingLicenceNumber, originatingAccreditationNumber, vehicleTypeID, serviceTypeIDs, numberOfLicencesRequired, applicantProvinceID, applicantRegionID, applicationAssociationID, applicationAllowedNewLicenceIDs, selectedRouteIDs, null, null, Profile.UserID);
if(precheckOutcomes != null)
{
if (precheckOutcomes.Find(a => !a.IsSuccessful) != null)
{
precheckPassed = false;
}
applicationPrecheckDetailID = precheckOutcomes.FirstOrDefault().ApplicationPrecheckDetailID;
}
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Result = new
{
PrecheckOutcomes = precheckOutcomes,
ApplicationPrecheckDetailID = applicationPrecheckDetailID,
PrecheckPassed = precheckPassed
}
}
};
}
catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("applicationRequestTypeID", applicationRequestTypeID);
additionalData.Add("sourceApplicationID", sourceApplicationID);
additionalData.Add("applicantName", applicantName);
additionalData.Add("applicantCell", applicantCell);
additionalData.Add("idTypeID", idTypeID);
additionalData.Add("idOrBusinessRegistrationNumber", idOrBusinessRegistrationNumber);
additionalData.Add("originatingLicenceNumber", originatingLicenceNumber);
additionalData.Add("originatingAccreditationNumber", originatingAccreditationNumber);
additionalData.Add("vehicleTypeID", vehicleTypeID);
additionalData.Add("serviceTypeIDs", serviceTypeIDs);
additionalData.Add("numberOfLicencesRequired", numberOfLicencesRequired);
additionalData.Add("applicantProvinceID", applicantProvinceID);
additionalData.Add("applicantRegionID", applicantRegionID);
additionalData.Add("applicationAssociationID", applicationAssociationID);
additionalData.Add("applicationAllowedNewLicenceIDs", applicationAllowedNewLicenceIDs);
additionalData.Add("selectedRouteIDs", selectedRouteIDs);
#endregion
string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "CreateApplicationPrecheck", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = error
}
};
}
}
#endregion
#region GetApplicationDocuments
///
/// Retrieve the list of documents required/optional for an application based of precheck results
///
///
///
///
/// JsonNetResult
[HttpPost]
public JsonNetResult GetApplicationDocuments(long applicationPrecheckDetailID, short applicationRequestTypeID, long? memberID)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Common.SecurableEnum.ApplicationsModule_Home_StartNewApplication))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
var applicationDatabase = new ApplicationDatabase();
var applicationDocuments = applicationDatabase.GetApplicationRequestTypeDocuments(applicationPrecheckDetailID, applicationRequestTypeID, (long)WorkflowTemplatesEnum.ApplicationRequestV1, memberID, Profile.UserID);
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Result = new
{
ApplicationDocuments = applicationDocuments
}
}
};
}
catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("applicationPrecheckDetailID", applicationPrecheckDetailID);
additionalData.Add("applicationRequestTypeID", applicationRequestTypeID);
additionalData.Add("memberID", memberID);
#endregion
string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "GetRequiredDocuments", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = error
}
};
}
}
#endregion
#region CreateApplication
///
/// Create Application
///
///
///
[HttpPost]
public JsonNetResult CreateApplication(long applicationPrecheckDetailID)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Common.SecurableEnum.ApplicationsModule_Home_StartNewApplication))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
var applicationDatabase = new ApplicationDatabase();
Neo.LegitimateLicences.ApplicationRequest.Models.Database.Vw_ApplicationDetails_Light applicationDetails = new Neo.LegitimateLicences.ApplicationRequest.Models.Database.Vw_ApplicationDetails_Light();
var db = new LegitimateDatabase();
var office = db.GetOfficeLocation(Profile.OfficeLocationID.Value);
if (office.DivisionTypeID == (short)DivisionTypeEnum.TAT)
{
applicationDetails = applicationDatabase.TAT_CreateApplication(applicationPrecheckDetailID, Profile.UserID);
}
else
{
applicationDetails = applicationDatabase.CreateApplication(applicationPrecheckDetailID, Profile.UserID);
}
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Result = new
{
ApplicationDetails = applicationDetails
}
}
};
}
catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("applicationPrecheckDetailID", applicationPrecheckDetailID);
#endregion
string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "CreateApplication", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = error
}
};
}
}
#endregion
}
}