kreta/KretaWeb/Areas/Intezmeny/ApiControllers/BaseTeremApiController.cs
2024-03-13 00:33:46 +01:00

342 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.Exceptions;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Helpers.SystemSettings;
using Kreta.BusinessLogic.Logic;
using Kreta.Client.Eugyintezes.Configuration;
using Kreta.Core;
using Kreta.Core.Exceptions;
using Kreta.Core.FileService;
using Kreta.Enums;
using Kreta.Framework.Entities;
using Kreta.Framework.Util;
using Kreta.Resources;
using Kreta.Web.Areas.Intezmeny.Logic;
using Kreta.Web.Areas.Intezmeny.Models;
using Kreta.Web.Helpers;
using Kreta.Web.Helpers.Error;
using Kreta.Web.Helpers.Grid;
using Kreta.Web.Security;
using Newtonsoft.Json;
namespace Kreta.Web.Areas.Intezmeny.ApiControllers
{
public class BaseTeremApiController : ApiController
{
protected readonly IFileService FileService;
protected readonly IEugyintezesClientConfiguration EugyintezesClientConfiguration;
public BaseTeremApiController(IFileService fileService, IEugyintezesClientConfiguration eugyintezesClientConfiguration)
{
FileService = fileService;
EugyintezesClientConfiguration = eugyintezesClientConfiguration;
}
public DataSourceResult GetTeremGrid(string data, DataSourceRequest request)
{
var (gridParameter, modelList, _) = GetGridData(data, request);
return modelList.ToDataSourceResult(gridParameter);
}
public HttpResponseMessage GetExport(string data, DataSourceRequest request)
{
try
{
var (gridParameter, modelList, exportAttributeName) = GetGridData(data, request);
modelList = modelList.SortingAndPaging(gridParameter.OrderDictionary);
var simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos<TeremGridModel>(exportAttributeName);
var memoryStream = SimpleExportLogic.GetExport(IntezmenyResource.ExportSheetName, simpleExportColumnCos, modelList, ClaimData.SelectedTanevID.Value);
return HttpResponseExtensions.GetFileHttpResponse(memoryStream.ToArray(), $"{IntezmenyResource.Termek_Export}_{DateTime.Now:yyyy_MM_dd}.xlsx");
}
catch (Exception ex)
{
throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.HibaTortentAFajlExportalasaKozben) { UnHandledException = ex };
}
}
private (GridParameters gridParameter, List<TeremGridModel> modelList, string exportAttributeName) GetGridData(string data, DataSourceRequest request)
{
var connection = ConnectionTypeExtensions.GetSessionConnectionType();
var model = JsonConvert.DeserializeObject<TeremSearchModel>(data);
var gridParameter = Converter.GridParameter(request);
int? felhasznaloSzervezetId = null;
if (ClaimData.FelhasznaloSzerepkor != SzerepkorTipusEnum.Adminisztrator)
{
felhasznaloSzervezetId = new SzervezetHelper(connection).GetAlkalmazottSzervezetId(ClaimData.FelhasznaloId);
model.SzervezetId = felhasznaloSzervezetId;
}
var coList = new TeremHelper(connection).GetTeremCoList(model.ConvertToCo(), ClaimData.IsAdministrator, felhasznaloSzervezetId);
var modelList = coList.Select(x => new TeremGridModel(x)).ToList();
modelList = modelList.SortingAndPaging(gridParameter.OrderDictionary);
var exportAttributeName = model.IsFromSzervezet ? TeremGridModel.HelyszinExportAttributeId : TeremGridModel.TeremExportAttributeId;
return (gridParameter, modelList, exportAttributeName);
}
public TeremModel GetTeremBaseProperties(int teremID)
{
return TeremLogic.GetTeremBaseProperties(teremID);
}
public DataSourceResult GetTeremOrarendiOrai(string teremID, [ModelBinder(typeof(ModelBinder.DataSourceRequestModelBinder))] DataSourceRequest request)
{
var orarendiOraHelper = new OrarendiOraHelper(ConnectionTypeExtensions.GetSessionConnectionType())
{
GridParameters = Converter.GridParameter(request)
};
DataSet orak = orarendiOraHelper.GetOrarendiOrakForTerem(int.Parse(teremID));
return orak.ToDataSourceResult();
}
[HttpPost]
[ApiValidateAjaxAntiForgeryToken]
public HttpResponseMessage SaveModifiedOrNewTerem(TeremModel teremModel)
{
try
{
var teremHelper = new TeremHelper(ConnectionTypeExtensions.GetSessionConnectionType());
var kapcsolodoOraTipusok = teremHelper.GetTeremKapcsolodoOraTipusok(teremModel.TeremId);
TeremModel.ValidateModel(teremModel, kapcsolodoOraTipusok, ModelState);
if (ModelState.IsValid)
{
var terem = TeremLogic.GetTeremBaseProperties(teremModel.TeremId);
var teremBerbeadhatoAlapertek = terem.TeremBerbeadasModel.Berbeadhato;
var teremCO = TeremModel.ConvertModelToCO(teremModel);
var teremId = 0;
if (teremModel.TeremBerbeadasModel.Berbeadhato)
{
if (teremModel.TeremBerbeadasModel.PictureList.Count > 0)
{
var kepInfo = new FileInfo(teremModel.TeremBerbeadasModel.PictureList.Select(x => x.Name).First());
teremCO.KepUtvonal = teremHelper.SaveTeremFiles(FileService, teremModel.TeremBerbeadasModel.PictureList.Select(x => x.ContentAsBase64EncodedString)).First();
teremCO.KepNev = Path.GetFileNameWithoutExtension(kepInfo.Name);
teremCO.KepKiterjesztes = kepInfo.Extension.Replace(".", string.Empty);
}
if (teremModel.TeremBerbeadasModel.Document != null
&& teremModel.TeremBerbeadasModel.Document.Count > 0)
{
var dokumentumInfo = new FileInfo(teremModel.TeremBerbeadasModel.Document.Select(x => x.Name).First());
teremCO.DokumentumUtvonal = teremHelper.SaveTeremFiles(FileService, teremModel.TeremBerbeadasModel.Document.Select(x => x.ContentAsBase64EncodedString)).First();
teremCO.DokumentumNev = Path.GetFileNameWithoutExtension(dokumentumInfo.Name);
teremCO.DokumentumKiterjesztes = dokumentumInfo.Extension.Replace(".", string.Empty);
}
}
if (teremModel.TeremId > 0)
{
teremHelper.UpdateTerem(teremCO);
}
else
{
teremId = teremHelper.InsertTerem(teremCO);
}
if (teremModel.TeremBerbeadasModel.Berbeadhato && teremModel.TeremBerbeadasModel.TeremBerbeadasIdopontokListModel?.Count > 0)
{
//nyakatekert
teremCO.TeremBerbeadasIdopontokCOList.ForEach(item =>
{
if (item.TeremElerhetosegId.HasValue)
{
teremHelper.UpdateTeremElerhetoseg(item);
}
else
{
teremHelper.InsertTeremElerhetoseg(item, teremCO.TeremId ?? teremId);
}
});
}
// Ha bérbeadható, vagy most váltott nem bérbeadható státuszra
if (teremModel.TeremBerbeadasModel.Berbeadhato || teremBerbeadhatoAlapertek)
{
TeremLogic.EugyErtesitesTeremBerbeadhatoStatuszValtozasrol(EugyintezesClientConfiguration);
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
catch (SDA.DataProvider.UniqueKeyViolationException)
{
throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.MarLetezikTeremIlyenNevvel);
}
catch (EntityDeleteFailedException edfex)
{
throw new StatusError(HttpStatusCode.Forbidden, edfex.Message.Replace("'CONNECTIONS'", edfex.ConnectionErrorMessage));
}
}
[HttpPost]
[ApiValidateAjaxAntiForgeryToken]
public IHttpActionResult ValidateSaveModifiedOrNewTerem(TeremModModel model)
{
var systemSettingsHelper = new SystemSettingsHelper(ConnectionTypeExtensions.GetSessionConnectionType());
var naplozasTeremBefogadokepessegSystemSetting = systemSettingsHelper.GetSystemSettingValue<bool>(RendszerBeallitasTipusEnum.Naplozas_terem_befogadokepesseg);
var kapacitastTullepettTermekFigyelmeztetoUzenet = string.Empty;
if (!string.IsNullOrWhiteSpace(model.TeremIDArray) && model.Kapacitas.HasValue && naplozasTeremBefogadokepessegSystemSetting)
{
var h = new TeremHelper(ConnectionTypeExtensions.GetSessionConnectionType());
kapacitastTullepettTermekFigyelmeztetoUzenet = h.ValidateTeremBefogadokepesseg(tervezettKapacitas: model.Kapacitas, teremIdArrayString: model.TeremIDArray);
}
if (!string.IsNullOrWhiteSpace(kapacitastTullepettTermekFigyelmeztetoUzenet))
{
return Json(new { Valid = false, Text = kapacitastTullepettTermekFigyelmeztetoUzenet });
}
return Json(new { Valid = true, Text = "" });
}
[HttpPost]
[ApiValidateAjaxAntiForgeryToken]
public HttpResponseMessage SaveModTerem(TeremModModel model)
{
if (ModelState.IsValid)
{
if (model.VizsgaKapacitas > model.Kapacitas)
{
throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.AVizsgaBefogadokepessegNemLehetNagyobbMintABefogadokepesseg);
}
var co = TeremModModel.ConvertModelToCO(model);
var h = new TeremHelper(ConnectionTypeExtensions.GetSessionConnectionType());
string[] teremIDArray;
var errorMsgs = new List<(string errorMsg, HttpStatusCode errorStatusCode)>();
if (string.IsNullOrWhiteSpace(model.TeremIDArray))
{
teremIDArray = new string[] { co.ID.ToString() };
}
else
{
teremIDArray = model.TeremIDArray.Split(',');
}
foreach (var item in teremIDArray)
{
try
{
co.ID = int.Parse(item);
h.TeremTobbesModify(co);
}
catch (BlException e)
{
errorMsgs.Add((e.Message, HttpStatusCode.BadRequest));
continue;
}
catch (EntityDeleteFailedException edfex)
{
errorMsgs.Add((edfex.Message.Replace("'CONNECTIONS'", edfex.ConnectionErrorMessage), HttpStatusCode.Forbidden));
continue;
}
}
if (errorMsgs.Count == 0)
{
return new HttpResponseMessage(HttpStatusCode.OK);
}
var usedErrorStatusCode = errorMsgs.GroupBy(x => x.errorStatusCode).Select(group => new { Key = group.Key, Count = group.Count() }).OrderBy(x => x.Count).First().Key;
throw new StatusError(usedErrorStatusCode, string.Join(Environment.NewLine, errorMsgs.Select(x => x.errorMsg)));
}
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
public TeremModModel GetTeremBasePropertiesMod(int teremID)
=> TeremModModel.ConvertCOToModel(new TeremHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetTeremCo(teremID));
[HttpPost]
[ApiValidateAjaxAntiForgeryToken]
public HttpResponseMessage DeleteTerem([FromBody] int TeremId)
{
try
{
var h = new TeremHelper(ConnectionTypeExtensions.GetSessionConnectionType());
h.DeleteTerem(TeremId);
return new HttpResponseMessage(HttpStatusCode.OK);
}
catch (CannotBeDeletedException ex)
{
throw new StatusError(HttpStatusCode.BadRequest, ex.Message);
}
catch (EntityDeleteFailedException ex)
{
var uzenet = string.Format(ErrorResource.Az0NemTorolhetoMertEgyVagyTobbKapcsolodasaVanKapcsolatok1, IntezmenyResource.Terem, ex.ConnectionErrorMessage);
throw new StatusError(HttpStatusCode.BadRequest, uzenet);
}
}
[HttpPost]
[ApiValidateAjaxAntiForgeryToken]
public IHttpActionResult DeleteSelectedTerem(List<int> idList)
{
var h = new TeremHelper(ConnectionTypeExtensions.GetSessionConnectionType());
string errorMsg = string.Empty, entityName = string.Empty;
var counter = 0;
foreach (var id in idList)
{
try
{
h.DeleteTerem(id);
counter++;
}
catch (CannotBeDeletedException ex)
{
errorMsg += $"{ex.Message}{Environment.NewLine}";
continue;
}
catch (EntityDeleteFailedException ex)
{
var teremNev = h.GetTeremNev(id);
var errorMessage = string.Format(ErrorResource.NemTorolhetoKapcsolatMiatt, teremNev, ex.ConnectionErrorMessage);
errorMsg += $"{errorMessage}{Environment.NewLine}{Environment.NewLine}";
continue;
}
}
if (string.IsNullOrWhiteSpace(errorMsg))
{
return Json(new { Message = string.Format(ErrorResource.NSorTorlesSikeres, counter) });
}
if (counter > 0)
{
errorMsg += Environment.NewLine + string.Format(ErrorResource.NSorTorlesSikeres, counter);
}
throw new StatusError(HttpStatusCode.BadRequest, errorMsg);
}
}
}