kreta/KretaWeb/Areas/ImportExport/Controllers/OratervImportExportController.cs
2024-03-13 00:33:46 +01:00

349 lines
16 KiB
C#

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<string>();
Dictionary<int, string> importHeaderList = OratervImportExportHelper.ImportHeaderList;
List<List<string>> importData = ImportExportHelper.GetImportDataFromExcel(importFile.InputStream, importHeaderList, out List<string> 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<ImportInfoSummaryModel>
{
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<OratervImportNemImportalhatoItemModel> GetNemImportalhatoItemModelList(List<OratervImportItemCo> nemImportalhatoItemList)
{
var nemImportalhatoItemModelList = new List<OratervImportNemImportalhatoItemModel>();
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<OratervCO> coList)
{
List<OratervImportJsonItemCo> 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<OratervImportItemModel> GetOratervImportItemModelList(List<OratervImportJsonItemCo> importJsonItemList, List<OratervCO> oratervItemCoList)
{
var importItemModelList = new List<OratervImportItemModel>();
if (importJsonItemList == null)
{
if (oratervItemCoList.Count == 0)
{
return importItemModelList;
}
importJsonItemList = new List<OratervImportJsonItemCo>();
}
//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<OratervTantargyCO> coList)
{
List<OratervTargyImportJsonItemCo> 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<OratervTantargyImportItemModel> GetOratervTantargyImportItemModelList(List<OratervTargyImportJsonItemCo> importJsonItemList, List<OratervTantargyCO> oratervTantargyItemCoList, List<OratervCO> oratervItemCoList)
{
var importItemModelList = new List<OratervTantargyImportItemModel>();
if (importJsonItemList == null)
{
if (oratervTantargyItemCoList.Count == 0)
{
return importItemModelList;
}
importJsonItemList = new List<OratervTargyImportJsonItemCo>();
}
//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
}
}