using Neo.Afx.ComponentModel;
using Neo.Afx.Mvc;
using Neo.Afx.Security;
using Neo.Afx.Services.Integration;
using Neo.Afx.Services.Notifications.Entities;
using Neo.Afx.Services.Workflows.Entities;
using Neo.Afx.ViewModels;
using Neo.LegitimateLicences.LicenceIssueRequest.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;
using System.Web.Mvc;
using Xceed.Words.NET;
using System.Drawing;
using Neo.Afx.Services.Documents;
using System.IO;
using Neo.Afx.Common;
namespace Neo.LegitimateLicences.LicenceIssueRequest
{
public partial class LicenceIssueRequestController
{
#region Printing
///
/// Return printing view
///
///
public ActionResult Printing()
{
var isNew = WebHelper.ItemID == -1;
var itemId = WebHelper.ItemID;
var model = new LicenceIssueRequestPrintingModel
{
UserSecurables = (Profile.Securables != null) ? Profile.Securables.ToList() : new List()
};
var db = new LicenceIssueDatabase();
var licenceIssue = db.GetLicenceIssueForm(itemId, Profile.UserID);
model.Data = licenceIssue;
model.WorkflowInstance = WorkflowHelper.GetWorkflowInstanceView(WebHelper.EntityID, WebHelper.ItemID, Profile.UserID);
model.ExceptionCount = db.GetLicenceExceptions(licenceIssue.VerifiedLicenceID, Profile.UserID).Count;
return View("Printing", model);
}
#endregion
#region StartPrintout
///
/// StartPrintout
///
///
///
///
///
///
///
///
///
[HttpPost]
public JsonNetResult StartPrintout(int entityID, long itemID, short printoutTypeID, string certificateNumber, bool isReprint, string reprintReason, bool isTestPrint )
{
try
{
var database = new LegitimateDatabase();
if (isTestPrint)
{
database.WriteAuditEntry((int)Profile.UserID, "Application", "LIR Test Print", "", false, false, "licence", itemID);
}
else
{
if (!isReprint)
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_PrintLicence_Actual) && !SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_PrintLicence_Test))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
}
else
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_RePrintLicence))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
}
}
var verificationToken = database.CreateVerifiedPrintout(entityID, itemID, printoutTypeID, Profile.UserID, isReprint, reprintReason, isTestPrint, certificateNumber);
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("certificateNumber", certificateNumber);
additionalData.Add("isReprint", isReprint);
additionalData.Add("reprintReason", reprintReason);
additionalData.Add("isTestPrint", isTestPrint);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "LicenceIssueRequest", "StartPrintout", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region StartDecalPrintout
///
/// Print licence record
///
///
///
///
///
///
///
///
///
[HttpPost]
public JsonNetResult StartDecalPrintout(int entityID, long itemID, short printoutTypeID, string certificateNumber, bool isReprint, string reprintReason, bool isTestPrint )
{
try
{
var database = new LegitimateDatabase();
if (!isReprint)
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_PrintLicence_Actual) && !SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_PrintLicence_Test))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
}
else
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_RePrintLicence))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
}
var verificationToken = database.CreateVerifiedPrintout(entityID, itemID, printoutTypeID, Profile.UserID, isReprint, reprintReason, isTestPrint, certificateNumber);
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("certificateNumber", certificateNumber);
additionalData.Add("isReprint", isReprint);
additionalData.Add("reprintReason", reprintReason);
additionalData.Add("isTestPrint", isTestPrint);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "LicenceIssueRequest", "StartDecalPrintout", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region IssueWithoutPrint
//[HttpPost]
//public JsonResult IssueWithoutPrint(long licenceID, string reason)
//{
// var database = new LegitimateDatabase();
// var errorMessage = "";
// if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_IssueWithoutPrint))
// {
// throw new Exception("Security error");
// }
// try
// {
// database.IssueLicenceWithoutPrint(licenceID, reason, Profile.UserID);
// }
// catch (Exception ex)
// {
// errorMessage = database.GetInnermostMessage(ex);
// }
// var result = new
// {
// ErrorMessage = errorMessage
// };
// return Json(result, JsonSerializerOptions.None);
//}
#endregion
#region PrintAnnexure
[HttpGet]
public FileResult PrintAnnexure(long licenceIssueDetailID, long licenceId)
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Common.SecurableEnum.OperatingLicencesModule_Issuing_LicencesAwaitingVerificationandPrinting))
{
throw new Exception("Security error");
}
var db = new LegitimateDatabase();
var licDb = new LicenceIssueDatabase();
var docDb = new DocumentsDatabase();
var officeLocationDocuments = db.GetOfficeLocationSetupDocumentTemplate(Profile.OfficeLocationID.Value);
var licenceIssueDetail = db.GetLicenceIssueDetailsReport(licenceIssueDetailID, Profile.UserID);
var applicationDetail = db.GetApplicationDetail_ViewOnly(licenceIssueDetail.ApplicationDetailID);
var lirRoutes = db.GetVerifiedLicenceRoutes(licenceId, Profile.UserID);
var licenceServices = db.GetVerifiedLicenceServiceDetails(licenceId);
var licenceVehicle = licDb.GetLicenceIssueForm(licenceIssueDetailID, Profile.UserID);
#region Create Blank Document With Footer
var verificationToken = db.CreateVerifiedPrintout((short)EntityEnum.LicenceIssueDetails, licenceIssueDetailID, (short)PrintoutTypeEnum.OperatingLicenceAnnexure, Profile.UserID, false, "", false, "");
var verificationSiteUrl = db.GetSettingValue("VerificationSiteUrl");
string footerUrl = "To verify document browse to "+ verificationSiteUrl + " , Verification Token: " + verificationToken;
string footerOlNumber = licenceIssueDetail.OperatingLicenceNumber;
if (licenceIssueDetail.CertificateNumber != null)
{
footerOlNumber = footerOlNumber + " " + licenceIssueDetail.CertificateNumber;
}
var doc = DocX.Create("");
doc.AddFooters();
#region Footer
Footer footer = doc.Footers.Odd;
Paragraph pOl = footer.InsertParagraph();
pOl.Append(footerOlNumber)
.Font("Arial")
.FontSize(9)
.Color(Color.Black)
.Bold();
pOl.Alignment = Alignment.center;
Paragraph pUrl = footer.InsertParagraph();
pUrl.Append(footerUrl)
.Font("Arial")
.FontSize(9)
.Color(Color.Black)
.Bold();
pUrl.Alignment = Alignment.center;
footer.PageNumbers = true;
#endregion
#endregion
#region Annexure 1
Paragraph pAnnexure1 = doc.InsertParagraph();
// Append some text and add formatting.
pAnnexure1.Append("Annexure 1 \n")
.Font("Arial")
.FontSize(12)
.Color(Color.Black)
.UnderlineStyle(UnderlineStyle.singleLine)
.Bold();
foreach (var route in lirRoutes)
{
var table = doc.AddTable(2, 2);
table.Alignment = Alignment.left;
table.SetColumnWidth(0, 2500);
table.SetColumnWidth(1, 6500);
table.Rows[0].Cells[0].Paragraphs.First().Append("Operating licence:").Bold();
table.Rows[0].Cells[1].Paragraphs.First().Append(licenceIssueDetail.OperatingLicenceNumber);
table.Rows[1].Cells[0].Paragraphs.First().Append("Description:").Bold();
table.Rows[1].Cells[1].Paragraphs.First().Append(route.Description);
var blankBorder = new Border(BorderStyle.Tcbs_none, 0, 0, Color.White);
table.SetBorder(TableBorderType.Bottom, blankBorder);
table.SetBorder(TableBorderType.Top, blankBorder);
table.SetBorder(TableBorderType.Left, blankBorder);
table.SetBorder(TableBorderType.Right, blankBorder);
table.SetBorder(TableBorderType.InsideV, blankBorder);
table.SetBorder(TableBorderType.InsideH, blankBorder);
doc.InsertTable(table);
if (route.TimeTableDocumentID.HasValue)
{
try
{
doc.InsertSectionPageBreak();
var docDatabase = new DocumentsDatabase();
var timeTableDocument = docDatabase.GetDocumentObject(route.TimeTableDocumentID.Value);
Stream timeTableStream = new MemoryStream(timeTableDocument.Content);
var templateTimeTableDoc = DocX.Load(timeTableStream);
doc.InsertDocument(templateTimeTableDoc, true);
}
catch
{
throw new Exception("Error loading timetable annexure for route " + route.NationalRouteNumber + ". Please ensure that the file is uploaded as a .docx file");
}
}
if (route.FareScheduleDocumentID.HasValue)
{
try
{
doc.InsertSectionPageBreak();
var docDatabase = new DocumentsDatabase();
var fareScheduleDocument = docDatabase.GetDocumentObject(route.FareScheduleDocumentID.Value);
Stream fareScheduleStream = new MemoryStream(fareScheduleDocument.Content);
var fareScheduleDoc = DocX.Load(fareScheduleStream);
doc.InsertDocument(fareScheduleDoc, true);
}
catch
{
throw new Exception("Error loading fare schedule annexure for route " + route.NationalRouteNumber + ". Please ensure that the file is uploaded as a .docx file");
}
}
}
doc.InsertSectionPageBreak();
#endregion
#region Annexure 2
// Insert a Paragraph into this document.
Paragraph p = doc.InsertParagraph();
// Append some text and add formatting.
p.Append(/*"Annexure 2 \n"*/)
.Font("Arial")
.FontSize(12)
.Color(Color.Black)
.UnderlineStyle(UnderlineStyle.singleLine)
.Bold();
bool isFirstAnnexure2 = true;
foreach(var service in licenceServices)
{
var mapping = db.SearchDivisionTypeAnnexureMapping(service.ServiceTypeID, licenceVehicle.Vehicle.VehicleTypeID, Profile.UserID);
if (mapping != null && mapping.AnnexureDocumentID != null)
{
if(!isFirstAnnexure2)
{
doc.InsertSectionPageBreak();
}
var templateFile = docDb.GetDocumentObject(mapping.AnnexureDocumentID.Value);
using (var stream = new MemoryStream(templateFile.Content))
{
var TemplateAnnexure2 = DocX.Load(stream);
doc.InsertDocument(TemplateAnnexure2, true);
}
isFirstAnnexure2 = false;
}
}
//if (licenceIssueDetail.ShowTouristAnnexure == 1)
//{
// string fileLicenceConditionsTourist = Server.MapPath(@"~\Content\Annexure Documents\" + templateFolder + @"\LicenceConditionsTouristService.docx");
// var TemplateLicenceConditionsTourist = DocX.Load(fileLicenceConditionsTourist);
// doc.InsertDocument(TemplateLicenceConditionsTourist, true);
// //doc.InsertSectionPageBreak();
//}
//if (licenceIssueDetail.ShowBusAnnexure == 1)
//{
// string fileLicenceConditionsBuses = Server.MapPath(@"~\Content\Annexure Documents\" + templateFolder + @"\LicenceConditionsBuses.docx");
// var TemplateLicenceConditionsBuses = DocX.Load(fileLicenceConditionsBuses);
// doc.InsertDocument(TemplateLicenceConditionsBuses, true);
// doc.InsertSectionPageBreak();
//}
//if (licenceIssueDetail.ShowMidiBusAnnexure == 1)
//{
// string fileLicenceConditionsMidiBus = Server.MapPath(@"~\Content\Annexure Documents\" + templateFolder + @"\LicenceConditionsMidiBus.docx");
// var TemplateLicenceConditionsMidiBus = DocX.Load(fileLicenceConditionsMidiBus);
// doc.InsertDocument(TemplateLicenceConditionsMidiBus, true);
// doc.InsertSectionPageBreak();
//}
//if (licenceIssueDetail.ShowMinibusAnnexure == 1)
//{
// string fileLicenceConditionsMinibu = Server.MapPath(@"~\Content\Annexure Documents\" + templateFolder + @"\LicenceConditionsMinibus.docx");
// var TemplateLicenceConditionsMinibu = DocX.Load(fileLicenceConditionsMinibu);
// doc.InsertDocument(TemplateLicenceConditionsMinibu, true);
// doc.InsertSectionPageBreak();
//}
//if (licenceIssueDetail.ShowMeteredTaxiAnnexure == 1)
//{
// string fileLicenceConditionsMeteredTaxi = Server.MapPath(@"~\Content\Annexure Documents\" + templateFolder + @"\LicenceConditionsMeteredTaxi.docx");
// var TemplateLicenceConditionsMeteredTaxi = DocX.Load(fileLicenceConditionsMeteredTaxi);
// doc.InsertDocument(TemplateLicenceConditionsMeteredTaxi, true);
// doc.InsertSectionPageBreak();
//}
//if (licenceIssueDetail.ShowScholarAnnexure == 1)
//{
// string fileLicenceConditionsScholarTransport = Server.MapPath(@"~\Content\Annexure Documents\" + templateFolder + @"\LicenceConditionsScholarTransport.docx");
// var TemplateLicenceConditionsScholarTransport = DocX.Load(fileLicenceConditionsScholarTransport);
// doc.InsertDocument(TemplateLicenceConditionsScholarTransport, true);
// doc.InsertSectionPageBreak();
//}
//if (licenceIssueDetail.ShowStaffServiceAnnexure == 1)
//{
// string fileLicenceConditionsStaffService = Server.MapPath(@"~\Content\Annexure Documents\" + templateFolder + @"\LicenceConditionsStaffService.docx");
// var TemplateLicenceConditionsStaffServices = DocX.Load(fileLicenceConditionsStaffService);
// doc.InsertDocument(TemplateLicenceConditionsStaffServices, true);
// doc.InsertSectionPageBreak();
//}
#endregion
#region Annexure 3
if (applicationDetail.AdjudicationDetailID != null)
{
if(officeLocationDocuments.LicenceAnnexure_AdjudicationPanelDocumentID != null)
{
doc.InsertSectionPageBreak();
Paragraph p3 = doc.InsertParagraph();
// Append some text and add formatting.
p3.Append("Annexure 3 \n")
.Font("Arial")
.FontSize(12)
.Color(Color.Black)
.UnderlineStyle(UnderlineStyle.singleLine)
.Bold();
var templateFile = docDb.GetDocumentObject(officeLocationDocuments.LicenceAnnexure_AdjudicationPanelDocumentID.Value);
using (var stream = new MemoryStream(templateFile.Content))
{
var TemplateAnnexure3 = DocX.Load(stream);
TemplateAnnexure3.ReplaceText("[OperatingLicenceNumber]", licenceIssueDetail.OperatingLicenceNumber, false);
doc.InsertDocument(TemplateAnnexure3, true);
}
}
}
#endregion
#region Add protection to document
EditRestrictions erReadOnly = EditRestrictions.readOnly;
doc.AddProtection(erReadOnly);
#endregion
var populatedFileStream = new MemoryStream();
doc.SaveAs(populatedFileStream);
return File(populatedFileStream.ToArray(), "application/vnd.openxmlformats-officedocument.wordprocessingm", "APP" + licenceIssueDetail.ApplicationDetailID + "_" + licenceIssueDetail.CertificateNumber + ".docx");
}
#endregion
#region GetStationeryNumber
///
/// Get Next Available Stationery Number
///
///
[HttpPost]
public JsonNetResult GetStationeryNumber()
{
try
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), Common.SecurableEnum.OperatingLicencesModule_Issuing_LicencesAwaitingVerificationandPrinting))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
var db = new LegitimateDatabase();
Stationery stationery = new Stationery();
stationery = db.GetIssuedToStationery(Profile.UserID);
if (stationery == null)
{
throw new Exception("#EXPOSE_ERROR#No issued stationary found for " + Profile.FullName);
}
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = "",
Result = new
{
stationery = stationery
}
}
};
}
catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "LicenceIssueRequest", "GetStationeryNumber", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region MarkAsPrinted
///
/// Mark licence as print
///
///
///
///
///
///
///
///
///
///
///
[HttpPost]
public JsonNetResult MarkAsPrinted(int entityID, long itemID, short printoutTypeID, string certificateNumber, bool isReprint, string reprintReason, bool isTestPrint, string verificationToken, long stationeryID)
{
try
{
var database = new LegitimateDatabase();
if (isTestPrint)
{
database.WriteAuditEntry((int)Profile.UserID, "Application", "LIR Test Print", "", false, false, "licence", itemID);
}
else
{
if (!isReprint)
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_PrintLicence_Actual) && !SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_PrintLicence_Test))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
}
else
{
if (!SecurityHelper.UserHasAccessToSecurable(Profile.Securables.ToList(), SecurableEnum.OperatingLicencesModule_LicenceIssueRequest_RePrintLicence))
{
throw new Exception("#EXPOSE_ERROR#Security error");
}
}
var errorMessage = "";
var ol = database.UpdateOperatingLicence(itemID, certificateNumber, isReprint, reprintReason, Profile.UserID, out errorMessage);
if (string.IsNullOrEmpty(errorMessage) && string.IsNullOrEmpty(ol.LicenceExceptions))
{
if (isReprint)
{
database.WriteAuditEntry((int)Profile.UserID, "Application", "LIR Reprint", reprintReason, false, false, "licence", itemID);
}
else
{
database.WriteAuditEntry((int)Profile.UserID, "Application", "LIR Print", reprintReason, false, false, "licence", itemID);
}
}
else
{
var errorResult = new
{
Success = false,
ErrorMessage = errorMessage
};
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
Error = errorMessage,
ErrorCode = "Error"
}
};
}
}
#region Flag Printing Request is Successful
database.UpdateVerifiedPrintout(entityID, itemID, verificationToken, certificateNumber, true, Profile.UserID);
database.UpdateStationeryStatus(stationeryID, (short)StationeryStatusEnum.Used, "", 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();
additionalData.Add("entityID", entityID);
additionalData.Add("itemID", itemID);
additionalData.Add("certificateNumber", certificateNumber);
additionalData.Add("isReprint", isReprint);
additionalData.Add("reprintReason", reprintReason);
additionalData.Add("isTestPrint", isTestPrint);
additionalData.Add("verificationToken", verificationToken);
additionalData.Add("stationeryID", stationeryID);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "LicenceIssueRequest", "MarkAsPrinted", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
#region UpdateStationeryStatus
///
/// Update Stationery Status to used/lost/ruined
///
///
///
///
///
[HttpPost]
public JsonNetResult UpdateStationeryStatus(long stationeryID, short stationeryStatusID, string comments)
{
try
{
var database = new LegitimateDatabase();
#region Flag Printing Request is Successful
database.UpdateStationeryStatus(stationeryID, stationeryStatusID, comments, Profile.UserID);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = true,
Error = "",
ErrorCode = ""
}
};
}
catch (Exception ex)
{
#region Error Handling
#region Error Additional Data
Dictionary additionalData = new Dictionary();
additionalData.Add("stationeryID", stationeryID);
additionalData.Add("stationeryStatusID", stationeryStatusID);
additionalData.Add("comments", comments);
#endregion
var errorMessage = ErrorHelper.ProcessError(ex, "LicenceIssueRequest", "UpdateStationeryStatus", additionalData);
#endregion
return new JsonNetResult()
{
Data = new JsonBaseResult()
{
Success = false,
ErrorCode = "ERROR",
Error = errorMessage
}
};
}
}
#endregion
}
}