using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.HelperClasses.ImportCo; using Kreta.BusinessLogic.Helpers.ImportExport; using Kreta.BusinessLogic.Security; using Kreta.Enums.ManualEnums; using Kreta.Enums.ManualEnums.ImportExport; using Kreta.Resources; using Kreta.Web.Areas.ImportExport.Models.CommonModels; using Kreta.Web.Areas.ImportExport.Models.OratervImportExport; using Kreta.Web.Classes; using Kreta.Web.Helpers; using Kreta.Web.Models.EditorTemplates; using Kreta.Web.Security; namespace Kreta.Web.Areas.ImportExport.Controllers { [MvcRoleClaimsAuthorize(true)] [MvcRolePackageDenyAuthorize(KretaClaimPackages.IsSzirIntezmeny.ClaimValue)] [MvcRolePackageAuthorize(TanevEnum.AktEsKovTanev, KretaClaimPackages.Adminisztrator.ClaimValue)] public class OratervImportExportController : BaseTantargyfelosztasImportExportController { #region Fields private const string TovabbUrl = @"/Tantargy/OraTerv"; #endregion Fields #region Properties public static string GridName => "OratervTantargyGrid"; public static string GridRowTemplateName => "OratervTantargyGridRowTemplate"; public static string OratervGridName => "OratervGrid"; public static string OratervGridRowTemplateName => "OratervGridRowTemplate"; public static string JavascriptHelperClassName => "OratervImportExportHelper"; public static string ConrtollerName => "OratervImportExport"; #endregion #region Constructors public OratervImportExportController(IUploadFileValidator uploadFileValidator) { UploadFileValidator = uploadFileValidator ?? throw new ArgumentNullException(nameof(uploadFileValidator)); } #endregion Constructors public ActionResult Index() { var model = new OratervImportExportModel { MaxAllowedFileSizeInBytes = UploadFileValidator.Configuration.ImportMaxAllowedFileSizeInBytes, AllowedFileExtensions = UploadFileValidator.Configuration.ImportAllowedFileExtensions, }; return View(model); } #region Sablon public ActionResult DownloadTemplate() { MemoryStream memoryStream = new OratervImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetTemplate(); return new FileStreamResult(memoryStream, Core.Constants.ContentTypes.Xlsx) { FileDownloadName = ImportExportOratervResource.ImportSablonFileName }; } #endregion Sablon #region Export [HttpPost] [MvcValidateAjaxAntiForgeryToken] public string Export() { MemoryStream memoryStream = new OratervImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetExport(); return GetExportFileString(memoryStream); } public string NemImportalhatoSorokExport() { MemoryStream memoryStream = new OratervImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetNemImportalhatoSorokExport(); return GetExportFileString(memoryStream); } #endregion Export #region Import public JsonResult UploadFile(HttpPostedFileBase importFile, int importMuvelet) { UploadFileValidator.ValidateImportFile(importFile); var errorResult = new List(); Dictionary importHeaderList = OratervImportExportHelper.ImportHeaderList; List> importData = ImportExportHelper.GetImportDataFromExcel(importFile.InputStream, importHeaderList, out List fileErrorResultList); errorResult.AddRange(fileErrorResultList); if (errorResult.Count > 0) { JsonResult errorJson = ThrowCustomError(errorResult); return errorJson; } new OratervImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).SetImportCo(importData, importMuvelet); return Json(null); } public ActionResult OpenImportPreviewPopup() { OratervImportCo importCo = new OratervImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).ImportCo; var oratervCoList = importCo.OratervCOList.GroupBy(x => x.OratervId).Select(x => x.First()).ToList(); var importInfoModel = new OratervImportInfoModel { ImportInfoSummaryList = new ImportInfoSummaryListModel { ImportInfoSummaryModelList = new List { GetTantargyImportInfoSummary(importCo.TantargyImportJsonItemList, importCo.TantargyCOList), GetOratervImportInfoSummary(importCo, oratervCoList), GetOratervTantargyImportInfoSummary(importCo, importCo.OratervTantargyCOList), } }, TantargyImportItemList = new TantargyImportItemListModel { ImportItemModelList = GetTantargyImportItemModelList(importCo.TantargyImportJsonItemList, importCo.TantargyCOList), }, OratervImportItemList = new OratervImportItemListModel { ImportItemModelList = GetOratervImportItemModelList(importCo.OratervImportJsonItemList, importCo.OratervCOList) }, MainImportItemList = new OratervTantargyImportItemListModel { ImportItemModelList = GetOratervTantargyImportItemModelList(importCo.OratervTantargyImportJsonItemList, importCo.OratervTantargyCOList, oratervCoList), }, NemImportalhatoItemList = new OratervImportNemImportalhatoItemListModel { NemImportalhatoItemModelList = GetNemImportalhatoItemModelList(importCo.NemImportalhatoItemList), } }; var popUpModel = new PopUpModel(importInfoModel, ImportPreviewPopupName); popUpModel.AddCancelBtn(popUpModel, "KretaWindowHelper.destroyAllWindow"); popUpModel.AddBtn(popUpModel, "ImportBtnOk", CommonResource.Importalas, $"{JavascriptHelperClassName}.import", "BtnOk", setDisabledAfterClick: true); popUpModel.AddBtn(popUpModel, "NemImportalhatoSorokExportBtnOk", ImportExportCommonResource.NemImportalhatoSorokExportalasa, $"{JavascriptHelperClassName}.nemImportalhatoSorokExport", "BtnOk"); return PartialView(Constants.General.PopupView, popUpModel); } private List GetNemImportalhatoItemModelList(List nemImportalhatoItemList) { var nemImportalhatoItemModelList = new List(); foreach (OratervImportItemCo nemImportalhatoItem in nemImportalhatoItemList) { nemImportalhatoItemModelList.Add(new OratervImportNemImportalhatoItemModel { TantervNeveImportData = nemImportalhatoItem.TantervNeveImportData, OratervNeveImportData = nemImportalhatoItem.OratervNeveImportData, EvfolyamNeveImportData = nemImportalhatoItem.EvfolyamNeveImportData, TantargyNeveImportData = nemImportalhatoItem.TantargyNeveImportData, EvesOraszamImportData = nemImportalhatoItem.EvesOraszamImportData, ErrorList = string.Join(Environment.NewLine, nemImportalhatoItem.ErrorList) }); } return nemImportalhatoItemModelList.OrderBy(x => x.TantervNeveImportData).ThenBy(x => x.OratervNeveImportData).ThenBy(x => x.TantargyNeveImportData).ToList(); } protected static ImportInfoSummaryModel GetOratervImportInfoSummary(OratervImportCo importCo, List coList) { List importJsonItemList = importCo.OratervImportJsonItemList; int updateRowCount = importJsonItemList?.Count(x => x.Operation == (int)ImportItemOperationEnum.Update) ?? 0; int unchangedRowCount = 0; switch (importCo.ImportMuvelet) { case (int)ImportMuveletEnum.Insert: unchangedRowCount = coList.Count; break; case (int)ImportMuveletEnum.InsertAndUpdate: unchangedRowCount = coList.Count - updateRowCount; break; } var importInfoSummary = new ImportInfoSummaryModel { ImportName = ImportExportOratervResource.Oraterv, InsertRowCount = importJsonItemList?.Count(x => x.Operation == (int)ImportItemOperationEnum.Insert).ToString() ?? "0", UpdateRowCount = updateRowCount.ToString(), DeleteRowCount = "-", UnchangedRowCount = unchangedRowCount.ToString(), InvalidRowCount = importCo.NemImportalhatoItemList.Count.ToString() }; return importInfoSummary; } protected List GetOratervImportItemModelList(List importJsonItemList, List oratervItemCoList) { var importItemModelList = new List(); if (importJsonItemList == null) { if (oratervItemCoList.Count == 0) { return importItemModelList; } importJsonItemList = new List(); } //NOTE: Hozzáadjuk azokat a az elemeket, amik az excel-ből jöttek! foreach (OratervImportJsonItemCo importJsonItem in importJsonItemList) { importItemModelList.Add(new OratervImportItemModel { Tanterv = importJsonItem.TantervNeve ?? string.Empty, Oraterv = importJsonItem.OratervNeve ?? string.Empty, Evfolyam = importJsonItem.EvfolyamNeve ?? string.Empty, Operation = importJsonItem.Operation }); } //NOTE: Hozzáadjuk azokat a az elemeket, amik az adatbázisból jöttek! foreach (var co in oratervItemCoList) { if (!importJsonItemList.Select(x => x.Id).Contains(co.OratervId)) { importItemModelList.Add(new OratervImportItemModel { Tanterv = co.TantervNev ?? string.Empty, Oraterv = co.Nev ?? string.Empty, Evfolyam = co.EvfolyamNev ?? string.Empty, Operation = (int)ImportItemOperationEnum.Default }); } } return importItemModelList .OrderBy(x => x.Tanterv) .ThenBy(x => x.Oraterv) .ThenBy(x => x.Evfolyam) .ThenByDescending(x => x.OperationText).ToList(); } protected static ImportInfoSummaryModel GetOratervTantargyImportInfoSummary(OratervImportCo importCo, List coList) { List importJsonItemList = importCo.OratervTantargyImportJsonItemList; int updateRowCount = importJsonItemList?.Count(x => x.Operation == (int)ImportItemOperationEnum.Update) ?? 0; int unchangedRowCount = 0; switch (importCo.ImportMuvelet) { case (int)ImportMuveletEnum.Insert: unchangedRowCount = coList.Count; break; case (int)ImportMuveletEnum.InsertAndUpdate: unchangedRowCount = coList.Count - updateRowCount; break; } var importInfoSummary = new ImportInfoSummaryModel { ImportName = ImportExportOratervResource.OratervTantargy, InsertRowCount = importJsonItemList?.Count(x => x.Operation == (int)ImportItemOperationEnum.Insert).ToString() ?? "0", UpdateRowCount = updateRowCount.ToString(), DeleteRowCount = "-", UnchangedRowCount = unchangedRowCount.ToString(), InvalidRowCount = importCo.NemImportalhatoItemList.Count.ToString() }; return importInfoSummary; } protected List GetOratervTantargyImportItemModelList(List importJsonItemList, List oratervTantargyItemCoList, List oratervItemCoList) { var importItemModelList = new List(); if (importJsonItemList == null) { if (oratervTantargyItemCoList.Count == 0) { return importItemModelList; } importJsonItemList = new List(); } //NOTE: Hozzáadjuk azokat a az elemeket, amik az excel-ből jöttek! foreach (var importJsonItem in importJsonItemList) { importItemModelList.Add(new OratervTantargyImportItemModel { Tanterv = importJsonItem.TantervNeve ?? string.Empty, Oraterv = importJsonItem.OratervNeve ?? string.Empty, Evfolyam = importJsonItem.EvfolyamNeve ?? string.Empty, Tantargy = importJsonItem.TantargyNeve ?? string.Empty, EvesOraszam = importJsonItem.EvesOraszam.ToString(), Operation = importJsonItem.Operation }); } //NOTE: Hozzáadjuk azokat a az elemeket, amik az adatbázisból jöttek! foreach (var co in oratervTantargyItemCoList) { if (!importJsonItemList.Select(x => x.Id).Contains(co.OratervTantargyId)) { var oratervCo = oratervItemCoList.SingleOrDefault(x => x.OratervId == co.OratervId); importItemModelList.Add(new OratervTantargyImportItemModel { Tanterv = oratervCo?.TantervNev ?? string.Empty, Oraterv = co.OratervNev ?? string.Empty, Evfolyam = oratervCo?.EvfolyamNev ?? string.Empty, Tantargy = co.TantargyNev ?? string.Empty, EvesOraszam = co.EvesOraszam.ToString(), Operation = (int)ImportItemOperationEnum.Default }); } } return importItemModelList .OrderBy(x => x.Tanterv) .ThenBy(x => x.Oraterv) .ThenBy(x => x.Evfolyam) .ThenByDescending(x => x.OperationText).ToList(); } public ActionResult Import() { if (ModelState.IsValid) { var helper = new OratervImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()); OratervImportCo importCo = helper.ImportCo; helper.Import(new { ImportJson = importCo }); return Content(Url.Content(TovabbUrl)); } return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } #endregion } }