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

336 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.ModelBinding;
using System.Web.Http.Results;
using Kendo.Mvc.UI;
using Kreta.BusinessLogic.Classes.ComboBox;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers;
using Kreta.BusinessLogic.Security;
using Kreta.Core;
using Kreta.Enums.ManualEnums;
using Kreta.Framework;
using Kreta.Framework.Entities;
using Kreta.Resources;
using Kreta.Web.Areas.Hianyzas.Helpers;
using Kreta.Web.Areas.Hianyzas.Models;
using Kreta.Web.Areas.Hianyzas.Models.Mulasztasok;
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.Hianyzas.ApiControllers
{
[ApiRoleClaimsAuthorize(true)]
[ApiRolePackageAuthorize(KretaClaimPackages.Osztalyfonok.ClaimValue, KretaClaimPackages.SzuperOsztalyfonok.ClaimValue,
KretaClaimPackages.Evfolyamfelelos.ClaimValue, KretaClaimPackages.Naplo.ClaimValue)]
public class BaseMulasztasokApiController : ApiController
{
public JsonResult<List<ComboBoxListItem>> GetTanoraList(string cascadeFilter)
{
DateTime? datumInput;
DateTime temp;
if (DateTime.TryParse(cascadeFilter, out temp))
{
datumInput = temp;
}
else
{
throw new Exception();
}
IDictionary<string, string> tanorak;
var result = new List<ComboBoxListItem>();
var helper = new TanoraHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
tanorak = helper.GetMegtartottOraByDatumAndOsztalyFonok(datumInput.Value, ClaimData.FelhasznaloId);
foreach (var item in tanorak)
{
var sli = new ComboBoxListItem { Text = item.Value, Value = item.Key };
result.Add(sli);
}
return Json(result);
}
public JsonResult<List<ComboBoxListItem>> GetIgazoltList()
{
var result = new List<ComboBoxListItem>
{
new ComboBoxListItem
{
Value = ((int) IgazoltSearchEnum.Igazolt).ToString(),
Text = StringResourcesUtil.GetString(2568)
},
new ComboBoxListItem
{
Value = ((int) IgazoltSearchEnum.Igazolatlan).ToString(),
Text = StringResourcesUtil.GetString(2800)
},
new ComboBoxListItem
{
Value = ((int) IgazoltSearchEnum.NemEllenorzott).ToString(),
Text = StringResourcesUtil.GetString(4571)
}
};
//Igazolt
//Igazolatlan
//Nem ellenőrzött
return Json(result);
}
[HttpPost]
[ApiValidateAjaxAntiForgeryToken]
public HttpResponseMessage DeleteMulasztas([FromBody] int id)
{
CheckMulasztas(id);
try
{
var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
helper.DeleteMulasztasById(id);
return new HttpResponseMessage(HttpStatusCode.OK);
}
catch (EntityDeleteFailedException)
{
throw new StatusError(HttpStatusCode.BadRequest,
string.Format(StringResourcesUtil.GetString(5490),
StringResourcesUtil.GetString(500) /*,
e.ConnectionErrorMessage*/)
/*A(z) mulasztás nem törölhető, mert egy vagy több kapcsolódása van (kapcsolatok: {1})!*/);
}
}
[NonAction]
public HttpResponseMessage SaveMulasztasList(List<MulasztasokSaveModel> list, int? szervezetTipusId = null)
{
var helper = new MulasztasHelper(ConnectionTypeExtensions.GetSessionConnectionType());
foreach (var item in list)
{
if (item.ID != 0 && (item.Visszavonhato.Value || item.Igazolt != null))
{
if (!string.IsNullOrWhiteSpace(item.Megjegyzes) && item.Megjegyzes.Length > 255)
{
throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.AMegjegyzesMax255KarakterLehet);
}
if(!szervezetTipusId.HasValue)
{
CheckMulasztas(item.ID.Value);
}
MulasztasokCo co = MulasztasokHelper.ConvertNaploNezetMulasztasokSaveModelToCo(item);
var mulasztasNotificaton = helper.SaveOrUpdateMulasztas(co);
}
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
[NonAction]
public HttpResponseMessage SaveNaploNezetMulasztasList(MulasztasokNaploNezetSaveModel model, int? szervezetTipusId = null)
{
var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
foreach (var mulasztas in model.Mulasztasok)
{
if (!string.IsNullOrWhiteSpace(mulasztas.Megjegyzes) && mulasztas.Megjegyzes.Length > 255)
{
throw new StatusError(HttpStatusCode.BadRequest, ErrorResource.AMegjegyzesMax255KarakterLehet);
}
if (!mulasztas.ID.HasValue)
{
var mulasztasDbId = helper.GetMulasztasId(mulasztas.TanuloId, mulasztas.TanitasiOraId);
if (mulasztasDbId.IsEntityId())
{
mulasztas.ID = mulasztasDbId;
}
}
if (mulasztas.ID.HasValue)
{
CheckMulasztas(mulasztas.ID.Value);
}
CheckTanulo(mulasztas.TanuloId);
}
CheckUtkozes(helper, model, szervezetTipusId);
var sikertelenMulasztasMentesek = new List<string>();
foreach (var mulasztas in model.Mulasztasok)
{
var co = MulasztasokHelper.ConvertNaploNezetMulasztasokSaveModelToCo(mulasztas);
try
{
_ = helper.SaveOrUpdateNaplonezetMulasztas(co);
}
catch (Exception ex)
{
sikertelenMulasztasMentesek.Add(ex.Message);
}
}
if (sikertelenMulasztasMentesek.Count > 0)
{
throw new StatusError(HttpStatusCode.BadRequest, string.Join("<br/>", sikertelenMulasztasMentesek.Distinct()));
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
private void CheckUtkozes(MulasztasHelper mulasztasHelper, MulasztasokNaploNezetSaveModel model, int? szervezetTipusId = null)
{
if (!model.Mulasztasok.Any(m => m.MulasztasTipus == (int)Enums.MulasztasTipusEnum.hianyzas))
{
return;
}
var naploNezetGridDs = mulasztasHelper.GetMulasztasokNaploNezetGrid(model.OsztalyCsoportId, model.NaploNezetDatum, IsCsoportVezeto(), szervezetTipusId);
var oraColumnPrefixes = Enumerable.Range(Core.Constants.Mulasztas.OraSorszamMinValue, Core.Constants.Mulasztas.OraSorszamMaxValue - Core.Constants.Mulasztas.OraSorszamMinValue + 1)
.Select(i => "Ora" + (i < 0 ? "Minusz" + Math.Abs(i) : i.ToString()));
var foglalkozasColumnPrefixes = Enumerable.Range(1, Core.Constants.Mulasztas.FoglalkozasCount)
.Select(i => "Foglalkozas" + i.ToString());
var columnPrefixes = oraColumnPrefixes.Concat(foglalkozasColumnPrefixes);
var tanitasiOraIdHashSet = new HashSet<int>();
foreach (DataRow dataRow in naploNezetGridDs.Tables[0].AsEnumerable())
{
foreach (var columnPrefix in columnPrefixes)
{
var tanitasiOraId = dataRow.Field<int?>(columnPrefix + "TanitasiOraId");
if (tanitasiOraId.HasValue)
{
tanitasiOraIdHashSet.Add(tanitasiOraId.Value);
}
}
}
var tanitasiOraKezdeteVegeList = mulasztasHelper.ListTanitasiOraKezdeteVege(tanitasiOraIdHashSet);
var errorMessages = new List<string>();
var mulasztasokGroupByTanulo = model.Mulasztasok.Where(m => m.MulasztasTipus == (int)Enums.MulasztasTipusEnum.hianyzas).GroupBy(x => x.TanuloId);
foreach (var mulasztasokGroup in mulasztasokGroupByTanulo)
{
var tanuloRow = naploNezetGridDs.Tables[0].AsEnumerable().First(r => r.Field<int>("TanuloId") == mulasztasokGroup.Key);
var tanitasiOraIdListByTanuloHianyzas = mulasztasokGroup.Select(m => m.TanitasiOraId).ToList();
foreach (var columnPrefix in columnPrefixes)
{
var mulasztasTipus = tanuloRow.Field<string>(columnPrefix + "MulasztasTipus");
if (!string.IsNullOrWhiteSpace(mulasztasTipus) && int.Parse(mulasztasTipus) == (int)Enums.MulasztasTipusEnum.hianyzas)
{
var tanitasiOraId = tanuloRow.Field<int>(columnPrefix + "TanitasiOraId");
tanitasiOraIdListByTanuloHianyzas.Add(tanitasiOraId);
}
}
var tanitasiOraKezdeteVegeListByTanuloHianyzas = tanitasiOraKezdeteVegeList.Where(t => tanitasiOraIdListByTanuloHianyzas.Contains(t.Id));
var utkozoGroups = GetUtkozoGroups(tanitasiOraKezdeteVegeListByTanuloHianyzas);
foreach (var utkozoGroup in utkozoGroups.Where(g => g.Count > 1))
{
var errorMessage = string.Format(MulasztasResource.HianyzasUtkozesError,
string.Join(MulasztasResource.EsAz,
utkozoGroup.Select(g => g.Oraszam.HasValue
? string.Format(MulasztasResource._0Ora, g.Oraszam)
: string.Format(MulasztasResource._0korKezdodoOra, g.OraKezdete.ToString(Core.Constants.ToStringPattern.HungarianTime)))));
errorMessages.Add(errorMessage);
}
}
if (errorMessages.Any())
{
throw new StatusError(HttpStatusCode.BadRequest, string.Join(Constants.General.DoubleBr, errorMessages));
}
}
private IEnumerable<IList<TanitasiOraCo>> GetUtkozoGroups(IEnumerable<TanitasiOraCo> tanitasiOraList)
{
var result = new List<List<TanitasiOraCo>>();
foreach (var tanitasiOra in tanitasiOraList)
{
var group = result.FirstOrDefault(r => r.Any(x => x.OraKezdete < tanitasiOra.OraVege && tanitasiOra.OraKezdete < x.OraVege));
if (group != null)
{
group.Add(tanitasiOra);
}
else
{
result.Add(new List<TanitasiOraCo> { tanitasiOra });
}
}
return result;
}
public JsonResult<bool> VaneMarIgazolt(int tipusId, int tanuloId, int oraId)
{
var helper = new MulasztasHelper(ConnectionTypeExtensions.GetActiveSessionConnectionType());
return Json(helper.VaneMarIgazolt(tipusId, tanuloId, oraId));
}
public void CheckOsztalyCsoport(int osztalyCsoportId)
{
var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
if (!authorization.IsValidOsztalyCsoport(osztalyCsoportId))
{
throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
}
}
public void CheckCsoport(int csoportId)
{
var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
if (!authorization.IsValidCsoport(csoportId))
{
throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
}
}
public void CheckTanulo(int tanuloId, bool lehetTTF = false)
{
var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
if (!authorization.IsValidTanulo(tanuloId, lehetTTF))
{
throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
}
}
private void CheckMulasztas(int mulasztasId)
{
var authorization = (IKretaAuthorization)Request.GetDependencyScope().GetService(typeof(IKretaAuthorization));
if (!authorization.IsValidMulasztas(mulasztasId))
{
throw new StatusError(HttpStatusCode.Forbidden, ErrorResource.AFelhasznalonakNincsMegfeleloJogosultsagaAFunkcioHasznalatahoz);
}
}
public bool IsCsoportVezeto()
{
return ClaimData.FelhasznaloSzerepCsomagok.Contains(KretaClaimPackages.CsoportVezeto.ClaimValue)
&& !ClaimData.FelhasznaloSzerepCsomagok.Contains(KretaClaimPackages.Osztalyfonok.ClaimValue)
&& !ClaimData.FelhasznaloSzerepCsomagok.Contains(KretaClaimPackages.SzuperOsztalyfonok.ClaimValue)
&& !ClaimData.FelhasznaloSzerepCsomagok.Contains(KretaClaimPackages.Evfolyamfelelos.ClaimValue);
}
}
}