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