using Neo.Afx.Common;
using Neo.Afx.Security;
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 Neo.LegitimateLicences.Data.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
namespace Neo.LegitimateLicences.ApplicationRequest
{
public partial class ApplicationRequestController
{
#region PaymentDetails
///
/// Load the payment details
///
///
public ActionResult PaymentDetails()
{
var itemId = WebHelper.ItemID;
var taskId = WebHelper.TaskID;
#region Get active user task
Vw_WorkflowInstanceTask activeUserTask = null;
if (taskId != -1)
{
activeUserTask = WorkflowHelper.GetActiveUserUserTaskByID((long)EntityEnum.ApplicationRequestDetails, itemId, taskId, Profile.UserID);
}
if (activeUserTask == null)
{
activeUserTask = WorkflowHelper.GetActiveUserTask(Profile.UserID, EntityEnum.ApplicationRequestDetails, itemId);
}
#endregion
var model = new ApplicationRequestFormModel
{
UserSecurables = (Profile.Securables != null) ? Profile.Securables.ToList() : new List(),
Ui = new WorkflowConsoleUIProperties()
{
canSave = (activeUserTask != null && activeUserTask.WorkflowTemplateStepNumber == 2)
}
};
var applicationDatabase = new ApplicationDatabase();
var application = applicationDatabase.GetApplicationForm(itemId, Profile.UserID);
var receipts = applicationDatabase.GetApplicationReceipts(itemId, Profile.UserID);
model.Data = receipts;
model.AmountDue = application.AmountDue;
model.AmountPaid = application.AmountPaid;
model.Lookups = GetLookupsForPayment();
model.WorkflowInstance = WorkflowHelper.GetWorkflowInstanceView(WebHelper.EntityID, WebHelper.ItemID, Profile.UserID);
model.UnassignedReceipts = applicationDatabase.GetApplicantUnassignedReceipt(WebHelper.ItemID, Profile.UserID);
return View("PaymentDetails", model);
}
#endregion
#region CreateApplicationReceipt
///
/// Create Application Receipt
///
///
///
[HttpPost]
public JsonNetResult CreateApplicationReceipt(long applicationDetailID)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_Receipts_Generateandprintreceipt))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#region Check if can save
var model = GetModel();
if (!model.Ui.canSubmit)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
if (!model.CanEditPaymentDetails)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#endregion
var database = new LegitimateDatabase();
var applicationDatabase = new ApplicationDatabase();
var receiptDetailID = database.ReceiptApplication(applicationDetailID, Profile.UserID, out string errorMessage);
var itemId = WebHelper.ItemID;
var application = applicationDatabase.GetApplicationForm(itemId, Profile.UserID);
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = "",
Result = new
{
ReceiptDetail = (receiptDetailID > 0) ? applicationDatabase.GetApplicationReceipt(applicationDetailID, receiptDetailID, Profile.UserID) : null,
application.AmountDue,
application.AmountPaid
}
}
};
} catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("applicationDetailID", applicationDetailID);
#endregion
string error = ErrorHelper.ProcessError(ex, "ApplicationRequest", "CreateApplicationReceipt", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = error
}
};
}
}
#endregion
#region AssignApplicationReceipt
///
/// Assign a prepaid application receipt
///
///
///
///
[HttpPost]
public JsonNetResult AssignApplicationReceipt(long receiptDetailID, long applicationDetailID)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_Receipts_Generateandprintreceipt))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#region Check if can save
var model = GetModel();
if (!model.Ui.canSubmit)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
if (!model.CanEditPaymentDetails)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#endregion
var itemId = WebHelper.ItemID;
var applicationDatabase = new ApplicationDatabase();
Pr_ApplicationReceiptsGet_Result receipt = new Pr_ApplicationReceiptsGet_Result();
ApplicationDetail application = new ApplicationDetail();
applicationDatabase.AssignReceiptToApplication(receiptDetailID, applicationDetailID, Profile.UserID);
receipt = applicationDatabase.GetApplicationReceipt(applicationDetailID, receiptDetailID, Profile.UserID);
application = applicationDatabase.GetApplicationForm(itemId, Profile.UserID);
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = "",
Result = new
{
ReceiptDetail = receipt,
application.AmountDue,
application.AmountPaid
}
}
};
} catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("receiptDetailID", receiptDetailID);
additionalData.Add("applicationDetailID", applicationDetailID);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "ApplicationRequest", "AssignApplicationReceipt", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region ApplicationReceiptSavePaymentType
///
/// Update payment type on receipt
///
///
///
///
///
[HttpPost]
public JsonNetResult ApplicationReceiptSavePaymentType(long applicationDetailID, long receiptDetailID, short paymentTypeID)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_Receipts_Generateandprintreceipt))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#region Check if can save
var model = GetModel();
if (!model.Ui.canSubmit)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
if (!model.CanEditPaymentDetails)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#endregion
var applicationDatabase = new ApplicationDatabase();
applicationDatabase.ReceiptApplicationPaymentTypeUpdate(applicationDetailID, receiptDetailID, paymentTypeID, Profile.UserID);
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = "",
Result = new
{
}
}
};
} catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("receiptDetailID", receiptDetailID);
additionalData.Add("applicationDetailID", applicationDetailID);
additionalData.Add("paymentTypeID", paymentTypeID);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "ApplicationRequest", "ApplicationReceiptSavePaymentType", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region ApplicationReceiptSaveProofOfPaymentRefNo
///
/// Update payment type on receipt
///
///
///
///
///
[HttpPost]
public JsonNetResult ApplicationReceiptSaveProofOfPaymentRefNo(long applicationDetailID, long receiptDetailID, string proofOfPaymentRefNo)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_Receipts_Generateandprintreceipt))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#region Check if can save
var model = GetModel();
if (!model.Ui.canSubmit)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
if (!model.CanEditPaymentDetails)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
#endregion
var applicationDatabase = new ApplicationDatabase();
applicationDatabase.ReceiptApplicationProofOfPaymentRefNoUpdate(applicationDetailID, receiptDetailID, proofOfPaymentRefNo, Profile.UserID);
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = "",
Result = new
{
}
}
};
} catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("receiptDetailID", receiptDetailID);
additionalData.Add("applicationDetailID", applicationDetailID);
additionalData.Add("proofOfPaymentRefNo", proofOfPaymentRefNo);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "ApplicationRequest", "ApplicationReceiptSavePaymentType", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region StartReceiptPrintout
[HttpPost]
public JsonNetResult StartReceiptPrintout(int entityID, long itemID, short printoutTypeID, bool isReprint, string reprintReason, bool isTestPrint)
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_Receipts_Createreceipt) && !isReprint)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_ApplicationRequest_ReprintReceipt) && isReprint)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
var database = new LegitimateDatabase();
database.WriteAuditEntry((int)Profile.UserID, "Application", "Receipt Printed", reprintReason, false, false, "receiptdetails", itemID);
var verificationToken = database.CreateVerifiedPrintout(entityID, itemID, printoutTypeID, Profile.UserID, isReprint, reprintReason, isTestPrint, "");
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = "",
Result = new
{
PrintoutToken = verificationToken
}
}
};
} catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("entityID", entityID);
additionalData.Add("itemID", itemID);
additionalData.Add("printoutTypeID", printoutTypeID);
additionalData.Add("isReprint", isReprint);
additionalData.Add("reprintReason", reprintReason);
additionalData.Add("isTestPrint", isTestPrint);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "ApplicationRequest", "StartReceiptPrintout", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region GetLookupsForPayment
///
/// Get Lookups For Payment
///
///
public List GetLookupsForPayment()
{
var lookups = new List();
var integrationStore = new SqlIntegrationStore();
try
{
integrationStore.Open();
lookups.Add(new LookupList("PaymentTypes", integrationStore.GetDataEntities("PaymentTypes", string.Empty).OrderBy(a => a.Title)));
} finally
{
integrationStore.Close();
}
return lookups;
}
#endregion
#region MarkAsPrinted
///
/// Mark licence as print
///
///
///
///
///
///
///
///
///
///
///
[HttpPost]
public JsonNetResult MarkAsPrinted(int entityID, long itemID, short printoutTypeID, bool isReprint, string reprintReason, bool isTestPrint, string verificationToken)
{
try
{
var database = new LegitimateDatabase();
if (isTestPrint)
{
database.WriteAuditEntry((int)Profile.UserID, "Application", "Receipt Test Print", "", false, false, "receiptdetails", itemID);
} else
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_Receipts_Createreceipt) && !isReprint)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.ApplicationsModule_ApplicationRequest_ReprintReceipt) && isReprint)
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
}
#region Flag Printing Request is Successful
database.UpdateVerifiedPrintout(entityID, itemID, verificationToken, true, Profile.UserID);
#endregion
var result = new
{
Success = true,
PrintoutToken = verificationToken,
ErrorMessage = ""
};
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = "",
Result = new
{
PrintoutToken = verificationToken
}
}
};
} catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary
{
{ "entityID", entityID },
{ "itemID", itemID },
{ "isReprint", isReprint },
{ "reprintReason", reprintReason },
{ "isTestPrint", isTestPrint },
{ "verificationToken", verificationToken }
};
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "ApplicationRequest", "MarkAsPrinted", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
}
}