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.Classes.ExcelHelpers; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.HelperClasses.ImportCo; using Kreta.BusinessLogic.Helpers; using Kreta.BusinessLogic.Helpers.ImportExport; using Kreta.BusinessLogic.Security; using Kreta.Core.Exceptions; using Kreta.Core.FeatureToggle; 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.TantargyfelosztasImportExport; 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.IsOnlyAlkalmozott.ClaimValue)] [MvcRolePackageAuthorize(TanevEnum.AktEsKovTanev, KretaClaimPackages.Adminisztrator.ClaimValue)] public class TantargyfelosztasImportExportController : BaseTantargyfelosztasImportExportController { #region Fields private const string TovabbUrl = @"~/Tantargy/TantargyFelosztas"; #endregion Fields #region Properties private IFeatureContext FeatureContext { get; } public static string EgyszeruImportFileName => "EgyszeruImportFile"; public static string KereszttablasImportFileName => "KereszttablasImportFile"; public static string KereszttablasOsztalyOszlopokkalImportFileName => "KereszttablasOsztalyOszlopokkalImportFile"; public static string FeladatfelosztasImportFileName => "FeladatfelosztasImportFile"; public static string AscImportFileName => "AscImportFile"; public static string JavascriptHelperClassName => "TantargyfelosztasImportExportHelper"; public static string ConrtollerName => "TantargyfelosztasImportExport"; #endregion Properties #region Constructors public TantargyfelosztasImportExportController(IUploadFileValidator uploadFileValidator, IFeatureContext featureContext) { FeatureContext = featureContext; UploadFileValidator = uploadFileValidator ?? throw new ArgumentNullException(nameof(uploadFileValidator)); } #endregion Constructors public ActionResult Index() { var model = new TantargyfelosztasImportExportModel { MaxAllowedFileSizeInBytes = UploadFileValidator.Configuration.ImportMaxAllowedFileSizeInBytes, AllowedFileExtensions = UploadFileValidator.Configuration.ImportAllowedFileExtensions, AscAllowedFileExtensions = UploadFileValidator.Configuration.AscImportAllowedFileExtensions }; return View(model); } #region Sablon public ActionResult DownloadTemplate() { MemoryStream memoryStream = new TantargyfelosztasImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetTemplate(isSzakkepzo : ClaimData.IsSzakkepzoIntezmeny); return new FileStreamResult(memoryStream, Core.Constants.ContentTypes.Xlsx) { FileDownloadName = ImportExportTantargyfelosztasResource.ImportSablonFileNameEgyszeru }; } public ActionResult DownloadTemplateKereszttablas() { return GetExcelTemplate(ImportExportTantargyfelosztasResource.ImportSablonFileNameKereszttablas); } public ActionResult DownloadTemplateKereszttablasOsztalyOszlopokkal() { return GetExcelTemplate(ImportExportTantargyfelosztasResource.ImportSablonFileNameKereszttablasOsztalyOszlopokkal); } public ActionResult DownloadTemplateFeladatfelosztas() { return GetExcelTemplate(ImportExportTantargyfelosztasResource.ImportSablonFileNameFeladatfelosztas); } #endregion Sablon #region Export [HttpPost] [MvcValidateAjaxAntiForgeryToken] public string ExportEgyszeruTantargyfelosztas() { MemoryStream memoryStream = new TantargyfelosztasImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetExport(); return GetExportFileString(memoryStream); } [HttpPost] [MvcValidateAjaxAntiForgeryToken] public string ExportLepedoTantargyfelosztas() { MemoryStream memoryStream = new TTFExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).ExportLepedoTTF(); return GetExportFileString(memoryStream); } [HttpPost] [MvcValidateAjaxAntiForgeryToken] public string ExportLepedoOsztalyTantargyfelosztas() { MemoryStream memoryStream = new TTFExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).ExportLepedoOsztalyTTF(); return GetExportFileString(memoryStream); } [HttpPost] [MvcValidateAjaxAntiForgeryToken] public string ExportFeladatfelosztas() { //TODO: MEGCSINÁLNI!!! throw new NotImplementedException(); //MemoryStream memoryStream = new TTFExportHelper().(); //return GetExportFileString(memoryStream); } [HttpPost] [MvcValidateAjaxAntiForgeryToken] public string ExportFormazottTantargyfelosztas() { bool isMunkaugyiAdatokKlebelsbergOrNszfh = FeatureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokKlebelsberg) || FeatureContext.IsEnabled(Core.Constants.FeatureName.MunkaugyiAdatokNSZFH); MemoryStream memoryStream = new TTFExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).ExportFormazottTtf(isMunkaugyiAdatokKlebelsbergOrNszfh ? 1 : 0); if (memoryStream != null) { return GetExportFileString(memoryStream); } return ImportExportCommonResource.NincsElegendoAdatARendszerbenAzExportalashoz; } public string NemImportalhatoSorokExport() { MemoryStream memoryStream = new TantargyfelosztasImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetNemImportalhatoSorokExport(); return GetExportFileString(memoryStream); } #endregion Export #region Import public JsonResult UploadEgyszeruFile(HttpPostedFileBase egyszeruImportFile, int importMuvelet, int? feladatellatasiHelyId) { return UploadFile(egyszeruImportFile, importMuvelet, (int)TantargyfelosztasImportTipusEnum.EgyszeruImport, feladatellatasiHelyId); } public JsonResult UploadKereszttablasFile(HttpPostedFileBase kereszttablasImportFile, int importMuvelet, int? feladatellatasiHelyId) { return UploadFile(kereszttablasImportFile, importMuvelet, (int)TantargyfelosztasImportTipusEnum.KereszttablasImport, feladatellatasiHelyId); } public JsonResult UploadKereszttablasOsztalyOszlopokkalFile(HttpPostedFileBase kereszttablasOsztalyOszlopokkalImportFile, int importMuvelet, int? feladatellatasiHelyId) { return UploadFile(kereszttablasOsztalyOszlopokkalImportFile, importMuvelet, (int)TantargyfelosztasImportTipusEnum.KereszttablasOsztalyOszlopokkalImport, feladatellatasiHelyId); } public JsonResult UploadFeladatfelosztasFile(HttpPostedFileBase feladatfelosztasImportFile, int importMuvelet, int? feladatellatasiHelyId) { return UploadFile(feladatfelosztasImportFile, importMuvelet, (int)TantargyfelosztasImportTipusEnum.FeladatfelosztasImport, feladatellatasiHelyId); } public JsonResult UploadAscFile(HttpPostedFileBase ascImportFile, int importMuvelet, int? feladatellatasiHelyId) { return UploadFile(ascImportFile, importMuvelet, (int)TantargyfelosztasImportTipusEnum.AscImport, feladatellatasiHelyId); } private JsonResult UploadFile(HttpPostedFileBase importFile, int importMuvelet, int tantargyfelosztasImportTipus, int? feladatellatasiHelyId) { switch (tantargyfelosztasImportTipus) { case (int)TantargyfelosztasImportTipusEnum.EgyszeruImport: case (int)TantargyfelosztasImportTipusEnum.KereszttablasImport: case (int)TantargyfelosztasImportTipusEnum.KereszttablasOsztalyOszlopokkalImport: case (int)TantargyfelosztasImportTipusEnum.FeladatfelosztasImport: UploadFileValidator.ValidateImportFile(importFile); break; case (int)TantargyfelosztasImportTipusEnum.AscImport: UploadFileValidator.ValidateAscImportFile(importFile); break; } var errorResult = new List(); if (feladatellatasiHelyId == null) { errorResult.Add(ErrorResource.FeladatellatasiHelyMegadasaKotelezo); } var fileErrorResultList = new List(); var importData = new List>(); switch (tantargyfelosztasImportTipus) { case (int)TantargyfelosztasImportTipusEnum.EgyszeruImport: importData = ImportExportHelper.GetImportDataFromExcel(importFile.InputStream, TantargyfelosztasImportExportHelper.ImportHeaderListEgyszeru, out fileErrorResultList); break; case (int)TantargyfelosztasImportTipusEnum.KereszttablasImport: importData = TantargyfelosztasImportExportHelper.GetImportDataFromKereszttablasTantargyfelosztasExcel(importFile.InputStream, TantargyfelosztasImportExportHelper.ImportHeaderListKereszttablas, out fileErrorResultList); break; case (int)TantargyfelosztasImportTipusEnum.KereszttablasOsztalyOszlopokkalImport: importData = TantargyfelosztasImportExportHelper.GetImportDataFromKereszttablasTantargyfelosztasOsztalyOszlopokkalExcel(importFile.InputStream, TantargyfelosztasImportExportHelper.ImportHeaderListKereszttablasOsztalyOszlopokkal, out fileErrorResultList); break; case (int)TantargyfelosztasImportTipusEnum.FeladatfelosztasImport: importData = TantargyfelosztasImportExportHelper.GetImportDataFromFeladatfelosztasExcel(importFile.InputStream, TantargyfelosztasImportExportHelper.ImportHeaderListFeladatfelosztasExcel, out fileErrorResultList); break; case (int)TantargyfelosztasImportTipusEnum.AscImport: try { importData = AscImportExportHelper.GetTantargyfelosztasImportDataFromAsc(importFile.InputStream); } catch (BlException e) { errorResult.Add(e.Message.Replace(Core.Constants.General.Sortores, $"{Core.Constants.General.Sortores}- ")); } break; } errorResult.AddRange(fileErrorResultList); if (errorResult.Count > 0) { JsonResult errorJson = ThrowCustomError(errorResult); return errorJson; } //NOTE: feladatellatasiHelyId.Value nem lehet null a korábbi vizsgálatok miatt! new TantargyfelosztasImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).SetImportCo(importData, importMuvelet, feladatellatasiHelyId.Value, tantargyfelosztasImportTipus); return Json(null); } public ActionResult OpenImportPreviewPopup() { TantargyfelosztasImportCo importCo = new TantargyfelosztasImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).ImportCo; List tantargyCoList = new TantargyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetTantargyCoList(); List osztalyCoList = new OsztalyHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetOsztalyCoList(); List csoportCoList = new CsoportHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetCsoportCoList(); List tantargyfelosztasCoList = new TantargyFelosztasHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetTantargyfelosztasCoList(); var importInfoModel = new TantargyfelosztasImportInfoModel { ImportInfoSummaryList = new ImportInfoSummaryListModel { ImportInfoSummaryModelList = new List { GetTantargyImportInfoSummary(importCo.TantargyImportJsonItemList, tantargyCoList), GetOsztalyImportInfoSummary(importCo.OsztalyImportJsonItemList, osztalyCoList), GetCsoportImportInfoSummary(importCo.CsoportImportJsonItemList, csoportCoList), GetTantargyfelosztasImportInfoSummary(importCo, tantargyfelosztasCoList) } }, TantargyImportItemList = new TantargyImportItemListModel { ImportItemModelList = GetTantargyImportItemModelList(importCo.TantargyImportJsonItemList, tantargyCoList) }, OsztalyImportItemList = new OsztalyImportItemListModel { ImportItemModelList = GetOsztalyImportItemModelList(importCo.OsztalyImportJsonItemList, osztalyCoList) }, CsoportImportItemList = new CsoportImportItemListModel { ImportItemModelList = GetCsoportImportItemModelList(importCo.CsoportImportJsonItemList, csoportCoList) }, MainImportItemList = new TantargyfelosztasImportItemListModel { ImportItemModelList = GetTantargyfelosztasImportItemModelList(importCo, tantargyfelosztasCoList) }, NemImportalhatoItemList = new TantargyfelosztasImportNemImportalhatoItemListModel { NemImportalhatoItemModelList = GetNemImportalhatoItemModelList(importCo.NemImportalhatoItemList), TantargyfelosztasImportTipus = importCo.TantargyfelosztasImportTipus } }; 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 static ImportInfoSummaryModel GetTantargyfelosztasImportInfoSummary(TantargyfelosztasImportCo importCo, List coList) { List importJsonItemList = importCo.MainImportJsonItemList; 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; case (int)ImportMuveletEnum.DeleteAndInsert: unchangedRowCount = coList.Count(x => !x.Importalt); break; } var importInfoSummary = new ImportInfoSummaryModel { ImportName = ImportExportTantargyfelosztasResource.ImportDefaultSheetName, InsertRowCount = importJsonItemList?.Count(x => x.Operation == (int)ImportItemOperationEnum.Insert).ToString() ?? "0", UpdateRowCount = updateRowCount.ToString(), DeleteRowCount = importCo.ImportMuvelet == (int)ImportMuveletEnum.DeleteAndInsert ? coList.Count(x => x.Importalt).ToString() : "0", UnchangedRowCount = unchangedRowCount.ToString(), InvalidRowCount = importCo.NemImportalhatoItemList.Count.ToString() }; return importInfoSummary; } protected List GetTantargyfelosztasImportItemModelList(TantargyfelosztasImportCo importCo, List coList) { var importItemModelList = new List(); List importJsonItemList = importCo.MainImportJsonItemList; if (importJsonItemList == null) { if (!coList.Any()) { return importItemModelList; } importJsonItemList = new List(); } //NOTE: Hozzáadjuk azokat a az elemeket, amik az excel-ből jöttek! foreach (TantargyfelosztasImportJsonItemCo importJsonItem in importJsonItemList) { importItemModelList.Add(new TantargyfelosztasImportItemModel { Nev = importJsonItem.Nev ?? string.Empty, OsztalyCsoportNev = importJsonItem.OsztalyCsoportNev ?? string.Empty, TantargyNev = importJsonItem.TantargyNev ?? string.Empty, TanarNev = importJsonItem.TanarNev, Oraszam = importJsonItem.Oraszam, Tuloraszam = importJsonItem.Tuloraszam, IsOsszevontOra = importJsonItem.IsOsszevontOra, IsNemzetisegiOra = importJsonItem.IsNemzetisegiOra, MegbizasiOraszam = importJsonItem.MegbizasiOraszam, Operation = importJsonItem.Operation }); } //NOTE: Hozzáadjuk azokat a az elemeket, amik az adatbázisból jöttek! foreach (TantargyfelosztasItemCo co in coList) { if (!importJsonItemList.Select(x => x.Id).Contains(co.Id)) { var operation = importCo.ImportMuvelet == (int)ImportMuveletEnum.DeleteAndInsert && co.Importalt ? (int)ImportItemOperationEnum.Delete : (int)ImportItemOperationEnum.Default; importItemModelList.Add(new TantargyfelosztasImportItemModel { Nev = co.Nev ?? string.Empty, OsztalyCsoportNev = co.OsztalyCsoportNev ?? string.Empty, TantargyNev = co.TantargyNev ?? string.Empty, TanarNev = co.TanarNev, Oraszam = co.Oraszam, Tuloraszam = co.Tuloraszam, IsOsszevontOra = co.IsOsszevontOra, IsNemzetisegiOra = co.IsNemzetisegiOra, MegbizasiOraszam = co.MegbizasiOraszam, Operation = operation }); } } return importItemModelList.OrderBy(x => x.Nev).ThenByDescending(x => x.OperationText).ToList(); } private List GetNemImportalhatoItemModelList(List nemImportalhatoItemList) { var nemImportalhatoItemModelList = new List(); foreach (TantargyfelosztasImportItemCo nemImportalhatoItem in nemImportalhatoItemList) { nemImportalhatoItemModelList.Add(new TantargyfelosztasImportNemImportalhatoItemModel { OsztalyNevImportData = nemImportalhatoItem.OsztalyNevImportData, CsoportNevImportData = nemImportalhatoItem.CsoportNevImportData, TantargyNevImportData = nemImportalhatoItem.TantargyNevImportData, OraszamImportData = nemImportalhatoItem.OraszamImportData, TanarNevImportData = nemImportalhatoItem.TanarNevImportData, TuloraImportData = nemImportalhatoItem.TuloraImportData, TtfOraszamKorrekcioImportData = nemImportalhatoItem.TtfOraszamKorrekcioImportData, NemzetisegiOraImportData = nemImportalhatoItem.NemzetisegiOraImportData, MegbizasiOraszamImportData = nemImportalhatoItem.MegbizasiOraszamImportData, ErrorList = string.Join(Environment.NewLine, nemImportalhatoItem.ErrorList) }); } return nemImportalhatoItemModelList.OrderBy(x => x.TanarNevImportData).ToList(); } public ActionResult Import() { if (ModelState.IsValid) { var helper = new TantargyfelosztasImportExportHelper(ConnectionTypeExtensions.GetSessionConnectionType()); TantargyfelosztasImportCo importCo = helper.ImportCo; helper.Import(new { ImportJson = importCo }, importCo.ImportMuvelet); return Content(Url.Content(TovabbUrl)); } return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } #endregion Import } }