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 GetSystemSettings(bool isVegyes, List feladatKategoriak, bool isSzirIntezmeny) { var letiltottakListaja = new List { 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 { 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(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 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 feladatKategoriak) { var list = new List(); var systemSettingsValue = GetSystemSettingValue(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(); var systemSettingsValue = GetSystemSettingValue>(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 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(); 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(), 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; } /// /// Visszaadja a rendszer beállítás Control objectett. /// /// SystemSettingControlType /// /// private string GetSystemSettingControlObjectJson(RendszerBeallitasTipusEnum beallitasTipus) { var setting = SystemSettingsManager.GetSystemSetting(beallitasTipus, IntezmenyAzonosito, TanevId); return setting.Json; } /// /// Visszaadja az adotr rendszerbeállítás értékét. /// /// Enum, String, int, bool, List, List List /// /// /// 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. /// public T GetSystemSettingValue(RendszerBeallitasTipusEnum beallitasTipus) { return SystemSettingsManager.GetSystemSettingValue(beallitasTipus, IntezmenyAzonosito, TanevId); } public bool ResetSystemSettings(List exceptSystemSettings) { return SystemSettingsManager.ResetSystemSettings(IntezmenyAzonosito, IntezmenyId, TanevId, exceptSystemSettings); } public void SetSystemSettings(Dictionary 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)newSettings[item.BeallitasTipus].ToObject>(); item.Json = JsonConvert.SerializeObject(GetOsztalyok()); } if (item.BeallitasTipus == RendszerBeallitasTipusEnum.Ertekelesek_megjelenese_az_ellenorzo_modulban) { TantargyiAtlagCache tantargyiAtlagCache = KretaServer.KretaServer.Instance.CacheManager.AquireCacheMobile(); var cacheEnabledAndNotNull = DependencyResolver.Current.GetService().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(RendszerBeallitasTipusEnum.igazolasok_naplozarasa); return naplozaras.AddDays(-igazolasNaplozarasNapokSzama); } private void UpdateOsszefuggoSzakGyakosOrakErvenyessegiIdo(IDalHandler h, Dictionary newSettings) { var szakGyakKezdoDatum = GetSystemSettingValue(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum); var szakGyakVegDatum = GetSystemSettingValue(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(settingObject); checkBoxGroup.Options.ForEach(x => x.Selected = false); var values = newValue.ToObject>(); // 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(settingObject, new SystemSettingDateConverter()); DateTime newDate; if (DateTime.TryParse(newValue, out newDate)) { datePicker.Date = newDate; } return datePicker; case SystemSettingsControlTypeEnum.TimePicker: var timePicker = JsonConvert.DeserializeObject(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(settingObject, settings); double newDouble; if (double.TryParse(newValue, out newDouble)) { numericTextBox.Value = newDouble; } return numericTextBox; case SystemSettingsControlTypeEnum.DropDownList: var dropDownList = JsonConvert.DeserializeObject(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(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(settingObject); switchButton.Value = newValue; return switchButton; case SystemSettingsControlTypeEnum.MultiSelect: var multiSelect = JsonConvert.DeserializeObject(settingObject); multiSelect.Options.ForEach(x => x.Selected = false); var multiSelectValues = newValue.ToObject>(); // 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; } } } }