kreta/Kreta.BusinessLogic/Helpers/SystemSettings/SystemSettingsHelper.cs
2024-03-13 00:33:46 +01:00

504 lines
25 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web.Mvc;
using System.Xml.Linq;
using Kreta.BusinessLogic.Caching;
using Kreta.BusinessLogic.Classes;
using Kreta.Core;
using Kreta.Core.ConnectionType;
using Kreta.Core.FeatureToggle;
using Kreta.DataAccessManual;
using Kreta.DataAccessManual.Interfaces;
using Kreta.DataAccessManual.Util;
using Kreta.Enums;
using Kreta.Framework;
using Kreta.Framework.Util;
using Kreta.KretaServer.SystemSettings;
using Kreta.KretaServer.SystemSettings.SettingsTypes;
using Kreta.Resources;
using Newtonsoft.Json;
namespace Kreta.BusinessLogic.Helpers.SystemSettings
{
public class SystemSettingsHelper : LogicBase
{
public SystemSettingsHelper(IConnectionType connectionType) : base(connectionType) { }
public SortedList<int, SystemSettingGroup> GetSystemSettings(bool isVegyes, List<OktNevelesiKategoriaEnum> feladatKategoriak, bool isSzirIntezmeny)
{
var letiltottakListaja = new List<RendszerBeallitasTipusEnum>
{
RendszerBeallitasTipusEnum.A_felhasznalok_nem_valtoztathatjak_meg_a_jelszavukat_az_elektronikus_ellenorzoben,
RendszerBeallitasTipusEnum.A_tanulok_ertekeleseinel_az_ertekelesek_sulyszamainak_megjelenitese,
RendszerBeallitasTipusEnum.A_haladasi_naplo_csak_az_alabbiak_szerint_toltheto_ki_utolag_naplozni_,
RendszerBeallitasTipusEnum.A_haladasi_naploba_orankent_csak_egy_tanora_rogzitheto,
RendszerBeallitasTipusEnum.Szakszeru_helyettesites_eseten_az_elszamolt_oraszam,
RendszerBeallitasTipusEnum.Nem_szakszeru_felugyelet_helyettesites_eseten_az_elszamolt_oraszam,
RendszerBeallitasTipusEnum.Oraosszevonasos_helyettesites_eseten_az_elszamolt_oraszam,
RendszerBeallitasTipusEnum.Lehet_e_helyettesites_tulora,
RendszerBeallitasTipusEnum.Osztalyfonok_szamara_tiltott_a_mulasztasi_adatok_modositasa,
RendszerBeallitasTipusEnum.Ertesites_Tanev_rendi_valtoztatasrol_esetek,
RendszerBeallitasTipusEnum.Ertesites_Tanev_rendi_valtoztatasrol_idopont,
RendszerBeallitasTipusEnum.Erdemjegy_beiras_ertesites_kesleltetese,
RendszerBeallitasTipusEnum.Ertesites_hianyzo_orabeirasrol_kesleltetese,
RendszerBeallitasTipusEnum.Ertesites_bukasra_allo_tanulokrol,
RendszerBeallitasTipusEnum.Ertesites_bukasra_allo_vegzos_tanulokrol,
RendszerBeallitasTipusEnum.Ertesites_nyilt_naprol,
RendszerBeallitasTipusEnum.Ertesites_oralatogatasrol,
RendszerBeallitasTipusEnum.Adminisztrator_ertesitese_orarendi_tanulo_utkozesrol,
RendszerBeallitasTipusEnum.Osztalyfonok_ertekeles_osszes_targybol,
RendszerBeallitasTipusEnum.Ertekeles_datumanak_minimuma,
};
var szirIntezmenyLetiltottGroupNevek = new List<string>
{
StringResourcesUtil.GetString(5307), // Hozzáférés generálás beállítások
StringResourcesUtil.GetString(3404), // Az elektronikus napló korlátozásainak beállításai
StringResourcesUtil.GetString(3405), // Tanulói adatok kezelése
StringResourcesUtil.GetString(3406), // Értékelések és feljegyzések beállításai
StringResourcesUtil.GetString(3407) // Mulasztások, igazolások beállításai
};
var csoportvezetoAdatModositas = SystemSettingsManager.GetSystemSettingValue<bool>(RendszerBeallitasTipusEnum.Csoportvezeto_Tanulo_Adat_Modositas, IntezmenyAzonosito, TanevId);
if (!csoportvezetoAdatModositas)
{
letiltottakListaja.Add(RendszerBeallitasTipusEnum.Csoportvezeto_Tanora_Celu_Csoportok);
}
if (isSzirIntezmeny)
{
letiltottakListaja.Add(RendszerBeallitasTipusEnum.Csokkentett_gondviselok_kezelese);
}
var settingsInfo = SystemSettingsManager.GetSystemSettings(IntezmenyAzonosito, TanevId);
SortedList<int, SystemSettingGroup> settings = GetSystemSettingsTemplate();
if (!isVegyes)
{
var item = settingsInfo.FirstOrDefault(x => x.BeallitasTipus == RendszerBeallitasTipusEnum.Default_Feladat_Kategoria);
settingsInfo.Remove(item);
}
foreach (var group in settings.Values)
{
if (isSzirIntezmeny && szirIntezmenyLetiltottGroupNevek.Contains(group.Title))
{
group.Enabled = false;
}
foreach (var setting in group.Childs.Values)
{
var settingData = settingsInfo.FirstOrDefault(s => s.BeallitasTipus == setting.SettingType);
if (settingData == null)
continue;
setting.ControlType = settingData.Type;
if (setting.SettingType == RendszerBeallitasTipusEnum.Default_Feladat_Kategoria)
{
setting.Control = GetEllatottFeladatok(feladatKategoriak);
}
else if (setting.SettingType == RendszerBeallitasTipusEnum.lezart_osztalynaplok)
{
setting.Control = GetOsztalyok();
}
else
{
setting.Control = DeserializeControlObject(settingData.Json, setting.ControlType);
}
if (letiltottakListaja.Contains(setting.SettingType) || settingData.IsDisabled)
{
setting.Disabled = true;
}
}
}
return settings;
}
private SettingsDropDownList GetEllatottFeladatok(List<OktNevelesiKategoriaEnum> feladatKategoriak)
{
var list = new List<SelectListItem>();
var systemSettingsValue = GetSystemSettingValue<int>(RendszerBeallitasTipusEnum.Default_Feladat_Kategoria);
var itemList = feladatKategoriak;
foreach (var item in itemList)
{
var sl = new SelectListItem()
{
Value = item.AsInt().ToString(),
Text = item.GetDisplayName(TanevId),
Selected = systemSettingsValue == item.AsInt()
};
list.Add(sl);
}
var mindenItem = new SelectListItem()
{
Value = "0",
Text = CommonResource.Minden,
Selected = systemSettingsValue == 0
};
list.Add(mindenItem);
return new SettingsDropDownList() { Options = list, Id = RendszerBeallitasTipusEnum.Default_Feladat_Kategoria.ToString() };
}
private SettingsMultiSelect GetOsztalyok()
{
var options = new List<SelectListItem>();
var systemSettingsValue = GetSystemSettingValue<List<string>>(RendszerBeallitasTipusEnum.lezart_osztalynaplok);
var numberOrderRegex = new Regex(Constants.RegularExpressions.AkarhanySzammalKezdodo);
var osztalyok = new OsztalyHelper(ConnectionType).GetOsztalyCoList().OrderBy(x =>
{
var m = numberOrderRegex.Match(string.Join("", x.Nev.Take(9)));
return m.Value != "" ? int.Parse(m.Value) : int.MaxValue;
}).ThenBy(x => x.Nev).ToList();
foreach (var osztaly in osztalyok)
{
var sli = new SelectListItem
{
Text = osztaly.Nev,
Value = osztaly.Id.ToString(),
Selected = systemSettingsValue.Contains(osztaly.Id.ToString()),
};
options.Add(sli);
}
return new SettingsMultiSelect() { Id = RendszerBeallitasTipusEnum.lezart_osztalynaplok.ToString(), Options = options };
}
private object DeserializeControlObject(string json, SystemSettingsControlTypeEnum controlType)
{
Type typeinfo = null;
switch (controlType)
{
case SystemSettingsControlTypeEnum.CheckBox:
typeinfo = typeof(SettingsCheckBox);
break;
case SystemSettingsControlTypeEnum.CheckBoxGroup:
typeinfo = typeof(SettingsCheckBoxGroup);
break;
case SystemSettingsControlTypeEnum.DatePicker:
typeinfo = typeof(SettingsDatePicker);
break;
case SystemSettingsControlTypeEnum.TimePicker:
typeinfo = typeof(SettingsTimePicker);
break;
case SystemSettingsControlTypeEnum.NumericTextBox:
typeinfo = typeof(SettingsNumericTextBox);
break;
case SystemSettingsControlTypeEnum.DropDownList:
typeinfo = typeof(SettingsDropDownList);
break;
case SystemSettingsControlTypeEnum.RadioButtonGroup:
typeinfo = typeof(SettingsRadioButtonGroup);
break;
case SystemSettingsControlTypeEnum.TrueFalse:
typeinfo = typeof(SettingsSwitchButton);
break;
case SystemSettingsControlTypeEnum.MultiSelect:
typeinfo = typeof(SettingsMultiSelect);
break;
default:
break;
}
var settings = new JsonSerializerSettings() { Culture = new CultureInfo(Constants.General.HungarianCulture) { NumberFormat = { NumberDecimalSeparator = Constants.General.NumberDecimalSeparator } } };
settings.Converters.Add(new SystemSettingDateConverter());
var ret = JsonConvert.DeserializeObject(json, typeinfo, settings);
if (controlType == SystemSettingsControlTypeEnum.DatePicker)
{
var (kezdoNap, utolsoNap) = GetTanevElsoEsUtolsoNapja();
((SettingsDatePicker)ret).Min = kezdoNap;
((SettingsDatePicker)ret).Max = utolsoNap;
}
return ret;
}
private SortedList<int, SystemSettingGroup> GetSystemSettingsTemplate()
{
var SystemSettingsTemplatePath = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "SystemSettingsTemplate.xml", SearchOption.AllDirectories);
if (SystemSettingsTemplatePath.Length == 0)
throw new Exception("SystemSettingsTemplate.xml file is missing!");
XDocument settingsXml = XDocument.Load(SystemSettingsTemplatePath[0]);
var settings = new SortedList<int, SystemSettingGroup>();
foreach (var groupNode in settingsXml.Root.Descendants("Csoport"))
{
var group = new SystemSettingGroup
{
Order = (int)groupNode.Attribute("Order"),
Title = StringResourcesUtil.GetString(SDAConvert.ToInt32(groupNode.Attribute("CsoportId").Value))
};
foreach (var settingNode in groupNode.Descendants("Beallitas"))
{
var order = SDAConvert.ToInt32(settingNode.Attribute("Order").Value);
group.Childs.Add(order, new SystemSettingControlInfo
{
Order = order,
SettingType = settingNode.Attribute("RendszerBeallitasTipus").Value.EnumParse<RendszerBeallitasTipusEnum>(),
Title = StringResourcesUtil.GetString(SDAConvert.ToInt32(settingNode.Attribute("CimkeId").Value)),
Description = StringResourcesUtil.GetString(SDAConvert.ToInt32(settingNode.Attribute("LeirasId").Value))
});
}
settings.Add(group.Order, group);
}
return settings;
}
/// <summary>
/// Visszaadja a rendszer beállítás Control objectett.
/// </summary>
/// <typeparam name="T">SystemSettingControlType</typeparam>
/// <param name="beallitasTipus"></param>
/// <returns></returns>
private string GetSystemSettingControlObjectJson(RendszerBeallitasTipusEnum beallitasTipus)
{
var setting = SystemSettingsManager.GetSystemSetting(beallitasTipus, IntezmenyAzonosito, TanevId);
return setting.Json;
}
/// <summary>
/// Visszaadja az adotr rendszerbeállítás értékét.
/// </summary>
/// <typeparam name="T">Enum, String, int, bool, List<int>, List<string> List<Enum></typeparam>
/// <param name="beallitasTipus"></param>
/// <returns>
/// Az adott beállítás értéke a megadott típusba vagy a megadott tipus alap értéke ha nincs érték PL: CheckBoxGroup.
/// </returns>
public T GetSystemSettingValue<T>(RendszerBeallitasTipusEnum beallitasTipus)
{
return SystemSettingsManager.GetSystemSettingValue<T>(beallitasTipus, IntezmenyAzonosito, TanevId);
}
public bool ResetSystemSettings(List<int> exceptSystemSettings)
{
return SystemSettingsManager.ResetSystemSettings(IntezmenyAzonosito, IntezmenyId, TanevId, exceptSystemSettings);
}
public void SetSystemSettings(Dictionary<RendszerBeallitasTipusEnum, dynamic> newSettings, int? kovTanevId)
{
Dal.CustomConnection.Run(ConnectionType, h =>
{
var oraSorszamozasValtozas = false;
UpdateOsszefuggoSzakGyakosOrakErvenyessegiIdo(h, newSettings);
var settings = SystemSettingsManager.GetSystemSettings(IntezmenyAzonosito, TanevId).Where(x => !x.IsDisabled);
foreach (var item in settings)
{
if (item != null && newSettings.ContainsKey(item.BeallitasTipus))
{
if (item.BeallitasTipus == RendszerBeallitasTipusEnum.lezart_osztalynaplok)
{
var settingsOsztalyIdList = (List<string>)newSettings[item.BeallitasTipus].ToObject<List<string>>();
item.Json = JsonConvert.SerializeObject(GetOsztalyok());
}
if (item.BeallitasTipus == RendszerBeallitasTipusEnum.Ertekelesek_megjelenese_az_ellenorzo_modulban)
{
TantargyiAtlagCache tantargyiAtlagCache = KretaServer.KretaServer.Instance.CacheManager.AquireCacheMobile<TantargyiAtlagCache>();
var cacheEnabledAndNotNull = DependencyResolver.Current.GetService<IFeatureContext>().IsEnabled(Constants.FeatureName.MobileEllenorzoApiCache) && tantargyiAtlagCache != null;
if (cacheEnabledAndNotNull)
{
tantargyiAtlagCache.ClearTantargyiAtlagRegion(IntezmenyAzonosito);
}
}
SystemSettingsManager.SetSystemSettings(item.BeallitasTipus, IntezmenyAzonosito, TanevId, CreateNewSettingsControlObject(item.Type, newSettings[item.BeallitasTipus], item.Json), kovTanevId);
if (item.BeallitasTipus == RendszerBeallitasTipusEnum.Foglalkozasok_Rogzitese_Hetvegere)
{
var oldVal = GetSystemSettingControlObjectJson(RendszerBeallitasTipusEnum.Foglalkozasok_Rogzitese_Hetvegere);
if (!string.Equals(oldVal, item.Json, StringComparison.OrdinalIgnoreCase))
{
var adatszotarDal = h.AdatszotarDAL();
adatszotarDal.GenerateNaptariNapok(IntezmenyId, TanevId);
if (kovTanevId.IsEntityId())
{
if (h.TanevDal().Get(kovTanevId.Value).IsKivalaszthato)
{
adatszotarDal.GenerateNaptariNapok(IntezmenyId, kovTanevId.Value);
}
}
}
}
if (!oraSorszamozasValtozas && (item.BeallitasTipus == RendszerBeallitasTipusEnum.TanitasiOra_sorszamozas_mod || item.BeallitasTipus == RendszerBeallitasTipusEnum.tanitasiOra_sorszamozas_csoportbontas))
{
var oldVal = GetSystemSettingControlObjectJson(item.BeallitasTipus);
if (!string.Equals(oldVal, item.Json, StringComparison.OrdinalIgnoreCase))
{
oraSorszamozasValtozas = true;
}
}
}
}
if (oraSorszamozasValtozas)
{
new TanoraHelper(new DalHandlerConnectionType(ConnectionType, h)).UpdateTanitasiOraEvesSorszamTeljesTanev();
}
});
}
public (DateTime kezdoNap, DateTime utolsoNap) GetTanevElsoEsUtolsoNapja()
{
var tanevHelper = new TanevHelper(ConnectionType);
var tanev = tanevHelper.GetTanevInfo();
return (kezdoNap: tanev.KezdoNap, utolsoNap: tanev.UtolsoNap);
}
public DateTime GetIgazolasokNaplozarasDatuma()
{
var naplozaras = new OrarendHelper(ConnectionType).GetNaplozarasDate(startDate: null);
var igazolasNaplozarasNapokSzama = GetSystemSettingValue<int>(RendszerBeallitasTipusEnum.igazolasok_naplozarasa);
return naplozaras.AddDays(-igazolasNaplozarasNapokSzama);
}
private void UpdateOsszefuggoSzakGyakosOrakErvenyessegiIdo(IDalHandler h, Dictionary<RendszerBeallitasTipusEnum, dynamic> newSettings)
{
var szakGyakKezdoDatum = GetSystemSettingValue<DateTime?>(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum);
var szakGyakVegDatum = GetSystemSettingValue<DateTime?>(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_veg_datum);
DateTime? newSzakGyakKezdoDatum = SDAConvert.ToDateTime(newSettings.SingleOrDefault(x => x.Key == RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum).Value);
DateTime? newSzakGyakVegDatum = SDAConvert.ToDateTime(newSettings.SingleOrDefault(x => x.Key == RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_veg_datum).Value);
if (newSzakGyakVegDatum.HasValue && newSzakGyakKezdoDatum.HasValue && (szakGyakKezdoDatum != newSzakGyakKezdoDatum || szakGyakVegDatum != newSzakGyakVegDatum))
{
UpdateNaptariNapok(h, newSzakGyakKezdoDatum.Value, newSzakGyakVegDatum.Value);
var helper = new OrarendiOraHelper(new DalHandlerConnectionType(ConnectionType, h));
if (szakGyakKezdoDatum != newSzakGyakKezdoDatum)
{
helper.UpdateOsszefuggoSzakGyakosOrakErvenyessegKezdete(newSzakGyakKezdoDatum.Value);
}
if (szakGyakVegDatum != newSzakGyakVegDatum)
{
helper.UpdateOsszefuggoSzakGyakosOrakErvenyessegVege(newSzakGyakVegDatum.Value);
}
}
}
private void UpdateNaptariNapok(IDalHandler h, DateTime newSzakGyakKezdoDatum, DateTime newSzakGyakVegDatum)
{
h.NaptariNap().UpdateNaptariNapokForOsszefuggoSzakGyak(newSzakGyakKezdoDatum, newSzakGyakVegDatum, TanevId);
}
private object CreateNewSettingsControlObject(SystemSettingsControlTypeEnum type, dynamic newValue, string settingObject)
{
if (newValue == null || (newValue.GetType() == typeof(string) && string.IsNullOrWhiteSpace(newValue)))
{
throw new ArgumentNullException("System setting new value is null");
}
switch (type)
{
case SystemSettingsControlTypeEnum.CheckBox:
throw new NotImplementedException();
case SystemSettingsControlTypeEnum.CheckBoxGroup:
var checkBoxGroup = JsonConvert.DeserializeObject<SettingsCheckBoxGroup>(settingObject);
checkBoxGroup.Options.ForEach(x => x.Selected = false);
var values = newValue.ToObject<List<string>>(); // a newValue egy Newtonsoft.Json.Linq.JArray
foreach (var item in checkBoxGroup.Options)
{
if (values.Contains(item.Value))
{
item.Selected = true;
}
}
return checkBoxGroup;
case SystemSettingsControlTypeEnum.DatePicker:
var datePicker = JsonConvert.DeserializeObject<SettingsDatePicker>(settingObject, new SystemSettingDateConverter());
DateTime newDate;
if (DateTime.TryParse(newValue, out newDate))
{
datePicker.Date = newDate;
}
return datePicker;
case SystemSettingsControlTypeEnum.TimePicker:
var timePicker = JsonConvert.DeserializeObject<SettingsTimePicker>(settingObject);
TimeSpan newTime;
if (TimeSpan.TryParse(newValue, out newTime))
{
timePicker.Time = newTime;
}
return timePicker;
case SystemSettingsControlTypeEnum.NumericTextBox:
var settings = new JsonSerializerSettings() { Culture = new CultureInfo(Constants.General.HungarianCulture) { NumberFormat = { NumberDecimalSeparator = Constants.General.NumberDecimalSeparator } } };
var numericTextBox = JsonConvert.DeserializeObject<SettingsNumericTextBox>(settingObject, settings);
double newDouble;
if (double.TryParse(newValue, out newDouble))
{
numericTextBox.Value = newDouble;
}
return numericTextBox;
case SystemSettingsControlTypeEnum.DropDownList:
var dropDownList = JsonConvert.DeserializeObject<SettingsDropDownList>(settingObject);
if (dropDownList.Options.Any(x => x.Value.Equals(newValue)))
{
dropDownList.Options.ForEach(x => x.Selected = false);
dropDownList.Options.First(x => x.Value.Equals(newValue)).Selected = true;
dropDownList.Options.First(x => x.Value.Equals(newValue)).Value = newValue;
return dropDownList;
}
throw new InvalidDataException("Wrong Value The given value is not in the settings list!");
case SystemSettingsControlTypeEnum.RadioButtonGroup:
var radioButtonGroup = JsonConvert.DeserializeObject<SettingsRadioButtonGroup>(settingObject);
if (radioButtonGroup.Options.Any(x => x.Value.Equals(newValue)))
{
radioButtonGroup.Options.ForEach(x => x.Selected = false);
radioButtonGroup.Options.First(x => x.Value.Equals(newValue)).Selected = true;
radioButtonGroup.Options.First(x => x.Value.Equals(newValue)).Value = newValue;
return radioButtonGroup;
}
return settingObject;
case SystemSettingsControlTypeEnum.TrueFalse:
var switchButton = JsonConvert.DeserializeObject<SettingsSwitchButton>(settingObject);
switchButton.Value = newValue;
return switchButton;
case SystemSettingsControlTypeEnum.MultiSelect:
var multiSelect = JsonConvert.DeserializeObject<SettingsMultiSelect>(settingObject);
multiSelect.Options.ForEach(x => x.Selected = false);
var multiSelectValues = newValue.ToObject<List<string>>(); // a newValue egy Newtonsoft.Json.Linq.JArray
foreach (var item in multiSelect.Options)
{
if (multiSelectValues.Contains(item.Value))
{
item.Selected = true;
}
}
return multiSelect;
default:
return settingObject;
}
}
}
}