using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.Helpers.SystemSettings; using Kreta.BusinessLogic.Logic; using Kreta.Core; using Kreta.Core.ConnectionType; using Kreta.DataAccess.Interfaces; using Kreta.DataAccessManual; using Kreta.DataAccessManual.Interfaces; using Kreta.DataAccessManual.ParameterClasses; using Kreta.DataAccessManual.Util; using Kreta.Enums; using Kreta.Enums.ManualEnums; using Kreta.Resources; using OfficeOpenXml; namespace Kreta.BusinessLogic.Helpers { public class MulasztasHelper : LogicBase { public MulasztasHelper(IConnectionType connectionType) : base(connectionType) { } public int GetOraTanuloId(int id) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(); var entity = dal.Get(id); return entity.OraTanuloiId; }); } public TanuloMulasztasInfoCo GetMulasztasById(int id) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(); var entity = dal.Get(id); var mulasztas = new TanuloMulasztasInfoCo { OraId = entity.TanitasiOrakId, Datum = entity.TanitasiOrak.Datum, }; if (entity.TanitasiOrak != null) { mulasztas.Oraszam = entity.TanitasiOrak.Oraszam; if (entity.TanitasiOrak.TantargyId > 0) { mulasztas.TargyNev = entity.TanitasiOrak.Tantargy.Nev; } } mulasztas.MulTipNev = entity.Tipus.GetDisplayName(TanevId); if (entity.KesesPercben != null) { mulasztas.KesIdo = entity.KesesPercben; } if (entity.Igazolt != null) { mulasztas.Igazolt = entity.Igazolt; } if (entity.IgazolasTipusa != null) { mulasztas.IgazolasTipusNev = entity.IgazolasTipusa.GetDisplayName(TanevId); } mulasztas.Megjegyzes = entity.Megjegyzes; mulasztas.TanuloNev = entity.OraTanuloi.NyomtatasiNev; return mulasztas; }); } public DataSet GetHallgatoMulasztasai(MulasztasokCo co) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var pco = co.ToPco(TanevId); var ds = dal.GetHallgatoMulasztasaiDataSet(pco); return ds; }); } public DataSet GetMulasztasList(MulasztasokCo keresoProfil, bool igazoltEsIgazolatlan = false, bool fromSearchPanel = false, int? csoportVezetoId = null) { return Dal.CustomConnection.Run(ConnectionType, h => { List szervezetIdList = null; if (keresoProfil.SzervezetId.IsEntityId()) { szervezetIdList = h.SzervezetDal(GridParameters).GetLathatoSzervezetek(IntezmenyId, TanevId, keresoProfil.SzervezetId.Value, (int)SzervezetAdatokHalmazaEnum.SzervezetEsAlSzervezetek); } var result = h.MulasztasDal(GridParameters).GetMulasztasDataSet(keresoProfil.ToPco(TanevId, szervezetIdList), igazoltEsIgazolatlan, fromSearchPanel, csoportVezetoId); AddColumnsToDataSet(h, result, true, true, !fromSearchPanel); return result; }); } public List GetMulasztasokTanuloDetailGridItemCoList(MulasztasokCo keresoProfil, bool igazoltEsIgazolatlan = false, bool fromSearchPanel = false, int? csoportVezetoId = null) { var ds = GetMulasztasList(keresoProfil, igazoltEsIgazolatlan, fromSearchPanel, csoportVezetoId); var result = new List(); foreach (DataRow dataRow in ds.Tables[0].Rows) { var item = new MulasztasItemCo(dataRow); result.Add(item); } return result; } public DataSet GetMulasztasokDatumNezetDetailGrid(DateTime mulasztasDatuma, int osztalyCsoportId, bool isCsoportVezeto) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var ds = dal.GetMulasztasokDatumNezetDetailGrid(mulasztasDatuma, osztalyCsoportId, isCsoportVezeto); AddColumnsToDataSet(h, ds, true, false, false); return ds; }); } private void AddColumnsToDataSet(IDalHandler h, DataSet ds, bool szuletesiIdoFormattedColumn, bool datumFormatted, bool isMulasztasKezelheto) { var igazolasNaplozarasDatuma = new SystemSettingsHelper(new DalHandlerConnectionType(ConnectionType, h)).GetIgazolasokNaplozarasDatuma(); var dt = ds.Tables[0]; if (szuletesiIdoFormattedColumn) { dt.Columns.Add("SzuletesiIdoFormatted"); } if (datumFormatted) { dt.Columns.Add("DatumFormatted"); } if (isMulasztasKezelheto) { dt.Columns.Add("IsMulasztasKezelheto", typeof(bool)); } var rows = dt.Rows.Cast().ToList(); foreach (var row in rows) { if (szuletesiIdoFormattedColumn) { row["SzuletesiIdoFormatted"] = SDAConvert.ToDateTime(row["SzuletesiIdo"]).ToShortDateString(); } if (datumFormatted) { row["DatumFormatted"] = SDAConvert.ToDateTime(row["Datum"]).ToShortDateString(); } if (isMulasztasKezelheto) { row["IsMulasztasKezelheto"] = row.Field("Datum") > igazolasNaplozarasDatuma; } } } public MulasztasNotificatonCo SaveOrUpdateMulasztas(MulasztasokCo co) { return Dal.CustomConnection.Run(ConnectionType, h => { var (mulasztas, needJuttatasUpdate) = ConvertCoToEntity(h, co, true); SaveOrUpdateMulasztas(h, co, mulasztas); if ((mulasztas.Intezmeny.IntezmenyAdatok.SingleOrDefault(x => !x.Torolt && x.TanevId == mulasztas.TanevId)?.IsSzakkepzoJuttatas ?? false) && needJuttatasUpdate) { var dal = h.JuttatasDAL(); dal.UpdateTanulokSzakkepzesiJuttatasok(TanevId, FelhasznaloId, (int)JuttatasTipusEnum.szakkepzesi_juttatas, tanuloId: co.TanuloId); dal.UpdateTanulokSzakkepzesiJuttatasok(TanevId, FelhasznaloId, (int)JuttatasTipusEnum.apaczaiosztondij, tanuloId: co.TanuloId); } return new MulasztasNotificatonCo(mulasztas); }); } public MulasztasNotificatonCo SaveOrUpdateNaplonezetMulasztas(MulasztasokCo co) { return Dal.CustomConnection.Run(ConnectionType, h => { var (mulasztas, needJuttatasUpdate) = ConvertNaploNezetCoToEntity(h, co); if (mulasztas.TanitasiOrak.Torolt) { throw new ApplicationException(string.Format(HianyzasResource.MulasztasRogziteseNemLehetsegesMertToroltekANaplozast, mulasztas.TanitasiOrak.Datum.ToString(Constants.ToStringPattern.HungarianDateWithSpaces), mulasztas.TanitasiOrak.Oraszam)); } SaveOrUpdateMulasztas(h, co, mulasztas); if ((mulasztas.Intezmeny.IntezmenyAdatok.SingleOrDefault(x => !x.Torolt && x.TanevId == mulasztas.TanevId)?.IsSzakkepzoJuttatas ?? false) && needJuttatasUpdate) { var dal = h.JuttatasDAL(); dal.UpdateTanulokSzakkepzesiJuttatasok(mulasztas.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.szakkepzesi_juttatas, tanuloId: co.TanuloId); dal.UpdateTanulokSzakkepzesiJuttatasok(mulasztas.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.apaczaiosztondij, tanuloId: co.TanuloId); } return new MulasztasNotificatonCo(mulasztas); }); } private static void SaveOrUpdateMulasztas(IDalHandler h, MulasztasokCo co, ITanuloMulasztas mulasztas) { var dal = h.MulasztasDal(); if (co.ID.HasValue) { if (mulasztas.Tipus == (int)MulasztasTipusEnum.jelenlet) { dal.Delete(mulasztas); } else { if (!(mulasztas.Tipus == (int)MulasztasTipusEnum.keses || mulasztas.Tipus == (int)MulasztasTipusEnum.potlas)) { mulasztas.KesesPercben = null; } mulasztas.Megjegyzes = co.Megjegyzes; dal.FullUpdate(mulasztas); } } else if (mulasztas.Tipus != (int)MulasztasTipusEnum.jelenlet) { dal.Insert(mulasztas); } } public bool VaneMarIgazolt(int tipusId, int tanuloId, int oraId) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(); return dal.VaneMarIgazolt(tipusId, tanuloId, oraId); }); } internal (ITanuloMulasztas mulasztas, bool needJuttatasUpdate) ConvertCoToEntity(IDalHandler h, MulasztasokCo co, bool isMulasztasKezeles = false) { var dal = h.MulasztasDal(); var mulasztas = dal.Get(); var needJuttatasUpdate = false; if (isMulasztasKezeles) { mulasztas = dal.Get(co.ID.Value); needJuttatasUpdate = (mulasztas.Igazolt != co.Igazolt) && (co.Igazolt.HasValue && !co.Igazolt.Value); mulasztas.Igazolt = co.Igazolt; mulasztas.IgazolasTipusa = co.Igazolt.HasValue && co.Igazolt.Value && co.IgazolasTipus.HasValue && co.IgazolasTipus.Value > 0 ? (int?)co.IgazolasTipus.Value : null; if (!string.IsNullOrWhiteSpace(co.Megjegyzes)) { mulasztas.Megjegyzes = co.Megjegyzes; } } else { if (co.ID.HasValue) { mulasztas = dal.Get(co.ID.Value); } else { // új mulasztas.OraTanuloiId = co.TanuloId.Value; if (co.OraId.HasValue) { mulasztas.TanitasiOrakId = co.OraId.Value; } } if (co.MulTip.HasValue) { mulasztas.Tipus = co.MulTip.Value; } if (co.KesIdo.HasValue && co.KesIdo > 0) { mulasztas.KesesPercben = co.KesIdo.Value; } else { mulasztas.KesesPercben = null; } } if (mulasztas.TanitasiOrak != null) { var igazolasDataRow = new IgazolasHelper(new DalHandlerConnectionType(ConnectionType, h)).GetIgazolasByTanuloId(co.TanuloId.Value).Tables[0].Rows.Cast().FirstOrDefault(row => SDAConvert.ToDateTime(row["Kezdete"]).Value.Date <= mulasztas.TanitasiOrak.Datum.Date && SDAConvert.ToDateTime(row["Vege"]).Value.Date >= mulasztas.TanitasiOrak.Datum.Date); if (igazolasDataRow != null && (mulasztas.Tipus == (int)MulasztasTipusEnum.hianyzas || mulasztas.Tipus == (int)MulasztasTipusEnum.keses)) { mulasztas.Igazolt = true; mulasztas.IgazolasTipusa = SDAConvert.ToInt32(igazolasDataRow["IgazolasTipusa"]); } } return (mulasztas, needJuttatasUpdate); } private static (ITanuloMulasztas mulasztas, bool needJuttatasUpdate) ConvertNaploNezetCoToEntity(IDalHandler h, MulasztasokCo co) { var dal = h.MulasztasDal(); var mulasztas = dal.Get(); if (co.ID.HasValue) { mulasztas = dal.Get(co.ID.Value); } mulasztas.OraTanuloiId = co.TanuloId.Value; if (co.OraId.HasValue) { mulasztas.TanitasiOrakId = co.OraId.Value; } var needJuttatasUpdate = co.MulTip != mulasztas.Tipus && mulasztas.Igazolt.HasValue && !mulasztas.Igazolt.Value; if (co.MulTip.HasValue) { mulasztas.Tipus = co.MulTip.Value; } needJuttatasUpdate = needJuttatasUpdate | (mulasztas.Igazolt != co.Igazolt) && co.Igazolt.HasValue; mulasztas.Igazolt = co.Igazolt; mulasztas.IgazolasTipusa = co.Igazolt.HasValue && co.Igazolt.Value && co.IgazolasTipus.HasValue && co.IgazolasTipus.Value > 0 ? (int?)co.IgazolasTipus.Value : null; if (!string.IsNullOrWhiteSpace(co.Megjegyzes)) { mulasztas.Megjegyzes = co.Megjegyzes; } return (mulasztas, needJuttatasUpdate); } public void DeleteMulasztasById(int mulId) { Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(); var mul = dal.Get(mulId); var tanuloId = mul.OraTanuloiId; var needJuttatasUpdate = (mul.Intezmeny.IntezmenyAdatok.SingleOrDefault(x => !x.Torolt && x.TanevId == mul.TanevId)?.IsSzakkepzoJuttatas ?? false) && mul.Igazolt.HasValue && !mul.Igazolt.Value; dal.Delete(mulId); if (needJuttatasUpdate) { var juttatasDal = h.JuttatasDAL(); juttatasDal.UpdateTanulokSzakkepzesiJuttatasok(mul.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.szakkepzesi_juttatas, tanuloId); juttatasDal.UpdateTanulokSzakkepzesiJuttatasok(mul.TanevId, FelhasznaloId, (int)JuttatasTipusEnum.apaczaiosztondij, tanuloId); } }); } public DataSet GetTanuloMulasztasai(int tanuloId) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); return dal.GetTanuloMulasztasai(tanuloId); }); } public TanoraMulasztasaiCO GetTanoraMulasztasai(int? tanoraId) { if (!tanoraId.HasValue || tanoraId < 1) { return new TanoraMulasztasaiCO(); } return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.TanitasiOra(); var entity = dal.Get(tanoraId.Value); var result = new TanoraMulasztasaiCO(); foreach (var item in entity.OraTanuloi.Where(a => !a.Torolt)) { result.Add(new TanoraMulasztasCO { MulasztasId = item.ID, TanuloId = item.OraTanuloiId }); } return result; }); } public List GetTanuloIgazolatlanMulasztasIdoszakban(int tanuloId, DateTime kezdete, DateTime vege) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var ds = dal.GetTanuloIgazolatlanMulasztasIdoszakban(tanuloId, kezdete, vege); // Use GetIdList extension here var list = ds.Tables[0].AsEnumerable() .Select(r => r.Field("ID")) .ToList(); return list; }); } public List GetTanuloIgazoltMulasztasIdoszakban(int tanuloId, DateTime kezdete, DateTime vege, int tipus) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var ds = dal.GetTanuloIgazoltMulasztasIdoszakban(tanuloId, kezdete, vege, tipus); var list = ds.Tables[0].AsEnumerable() .Select(r => r.Field("ID")) .ToList(); return list; }); } /// INFO @DevKornel: Mobil használja public List ListParhuzamosOranNaplozottMulasztasTanuloId(DateTime kezdete, DateTime vege, int tanoraId) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(); var ds = dal.GetParhuzamosOraNaplozottMulasztasTanuloId(kezdete, vege, tanoraId); var list = ds.Tables[0].AsEnumerable() .Select(r => r.Field("TanuloId")) .ToList(); return list; }); } public string GetTanuloTanoraiMulasztasa(int tanuloId, int oraId) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var co = new MulasztasokCo { TanuloId = tanuloId, OraId = oraId }; var ds = dal.GetMulasztasDataSet(co.ToPco(TanevId)); if (ds.Tables[0].Rows.Count > 0) { var row = ds.Tables[0].Rows[0]; if (row["MulTip"] is int mulasztasTipus) { if (mulasztasTipus == (int)MulasztasTipusEnum.keses || mulasztasTipus == (int)MulasztasTipusEnum.potlas) { var igazolt = row["IgazolasTipus_DNAME"].ToString(); if (string.IsNullOrWhiteSpace(igazolt)) { return $"{row["MulTip_DNAME"]} ({row["KesesPerc"]})"; } return $"{row["MulTip_DNAME"]} ({row["KesesPerc"]}) ({igazolt})"; } if (mulasztasTipus == (int)MulasztasTipusEnum.hianyzas) { var igazolt = row["IgazolasTipus_DNAME"].ToString(); if (string.IsNullOrWhiteSpace(igazolt)) { return row["MulTip_DNAME"].ToString(); } return $"{row["MulTip_DNAME"]} ({igazolt})"; } } return string.Empty; } return string.Empty; }); } public DataSet GetDatumNezetDataByOsztalyCsoportId(int osztalyCsoportId, bool isCsoportVezeto) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); return dal.GetDatumNezetDataByOsztalyCsoportId(osztalyCsoportId, IntezmenyId, TanevId, isCsoportVezeto); }); } public DataSet GetTanulokMulasztasaiKesesei(int? osztalyCsoportId = null, int? tanuloId = null, bool isCsoportVezeto = false, int? szervezetTipusId = null) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var ds = dal.GetTanulokMulasztasaiKesesei(IntezmenyId, TanevId, osztalyCsoportId, tanuloId, isCsoportVezeto, szervezetTipusId); var dt = ds.Tables[0]; //Számított oszlopok hozzáadása a táblához dt.Columns.Add(new DataColumn("TanoraiHianyzasOsszes", typeof(string))); dt.Columns.Add(new DataColumn("TanoranKivuliHianyzasOsszes", typeof(string))); dt.Columns.Add(new DataColumn("TanoraiKesesOsszes", typeof(string))); dt.Columns.Add(new DataColumn("TanoraiKesesIgazolando", typeof(string))); dt.Columns.Add(new DataColumn("TanoraiKesesIgazolt", typeof(string))); dt.Columns.Add(new DataColumn("TanoraiKesesIgazolatlan", typeof(string))); dt.Columns.Add(new DataColumn("SzamitottKesesOsszes", typeof(string))); //Számított / formázott oszlopok feltöltése foreach (DataRow row in dt.Rows) { //Tanórai hiányzás összes row["TanoraiHianyzasOsszes"] = row.Field("TanoraiHianyzasIgazolando") + row.Field("TanoraiHianyzasIgazolt") + row.Field("TanoraiHianyzasIgazolatlan") + row.Field("Szabadsag") + row.Field("Tappenz") + row.Field("BetegSzabadsag"); //Tanórán kívüli hiányzás összes row["TanoranKivuliHianyzasOsszes"] = row.Field("TanoranKivuliHianyzasIgazolt") + row.Field("TanoranKivuliHianyzasIgazolando") + row.Field("TanoranKivuliHianyzasIgazolatlan"); //Tanórai késések száma (perc) row["TanoraiKesesOsszes"] = row.Field("TanoraiKesesDarabszamIgazolt") + row.Field("TanoraiKesesDarabszamIgazolatlan") + row.Field("TanoraiKesesDarabszamIgazolando") + " (" + (row.Field("TanoraiKesesIgazolandoPerc") + row.Field("TanoraiKesesIgazoltPerc") + +row.Field("TanoraiKesesIgazolatlanPerc")) + ")"; row["TanoraiKesesIgazolando"] = row.Field("TanoraiKesesDarabszamIgazolando") + " (" + row.Field("TanoraiKesesIgazolandoPerc") + ")"; row["TanoraiKesesIgazolt"] = row.Field("TanoraiKesesDarabszamIgazolt") + " (" + row.Field("TanoraiKesesIgazoltPerc") + ")"; row["TanoraiKesesIgazolatlan"] = row.Field("TanoraiKesesDarabszamIgazolatlan") + " (" + row.Field("TanoraiKesesIgazolatlanPerc") + ")"; //Számított késések összes row["SzamitottKesesOsszes"] = row.Field("SzamitottKesesIgazolando") + row.Field("SzamitottKesesIgazolt") + row.Field("SzamitottKesesIgazolatlan"); } AddColumnsToDataSet(h, ds, true, false, false); return ds; }); } public DataSet GetTanuloMulasztasaiGrid(int tanuloId, int aktualisTanevId, bool igazolandok, bool? isTanoraiCelu, int? csoportVezetoId, int osztalyCsoportId) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var pco = new MulasztasKeresesePCO { TanuloId = tanuloId, TanevId = aktualisTanevId, IsTanoraiCelu = isTanoraiCelu }; return dal.GetTanuloMulasztasaiGrid(pco, igazolandok, csoportVezetoId, osztalyCsoportId); }); } public DataSet GetTanuloMulasztasaiDetailGrid(MulasztasokCo keresoProfil, bool igazolando, bool? isTanoraiCelu, int? csoportVezetoId) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var pco = keresoProfil.ToPco(TanevId); pco.IsTanoraiCelu = isTanoraiCelu; return dal.GetTanuloMulasztasaiDetailGrid(pco, igazolando, csoportVezetoId); }); } public DataSet GetMulasztasokNaploNezetGrid(int osztalyCsoportId, DateTime datum, bool isCsoportVezeto, int? szervezetTipusId = null) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(); var naploNezetAdatok = dal.GetMulasztasokNaploNezetData(TanevId, IntezmenyId, osztalyCsoportId, datum, isCsoportVezeto, szervezetTipusId); var naplonezetGridData = new DataSet(); var dt = new DataTable(); dt.Columns.Add(new DataColumn("ID", typeof(int))); dt.Columns.Add(new DataColumn("TanuloId", typeof(int))); dt.Columns.Add(new DataColumn("TanuloNev", typeof(string))); dt.Columns.Add(new DataColumn("OsztalyNev", typeof(string))); dt.Columns.Add(new DataColumn("AnyjaNeve", typeof(string))); dt.Columns.Add(new DataColumn("SzuletesiIdo", typeof(DateTime))); var jelenletTipus = (int)MulasztasTipusEnum.jelenlet; for (var i = Constants.Mulasztas.OraSorszamMinValue; i <= Constants.Mulasztas.OraSorszamMaxValue; i++) { string oraSorszamString; if (i < 0) { oraSorszamString = "Minusz" + Math.Abs(i); } else { oraSorszamString = i.ToString(); } var isMegtartottColumn = new DataColumn("Ora" + oraSorszamString + "IsMegtartott", typeof(bool)); { isMegtartottColumn.DefaultValue = false; } dt.Columns.Add(isMegtartottColumn); var nevColumn = new DataColumn("Ora" + oraSorszamString + "Nev") { AllowDBNull = true }; dt.Columns.Add(nevColumn); dt.Columns.Add(new DataColumn("Ora" + oraSorszamString + "OsztalyCsoportNev", typeof(string))); dt.Columns.Add(new DataColumn("Ora" + oraSorszamString + "TantargyNev", typeof(string))); dt.Columns.Add(new DataColumn("Ora" + oraSorszamString + "TanarNev", typeof(string))); dt.Columns.Add(new DataColumn("Ora" + oraSorszamString + "TanitasiOraId", typeof(int))); var isHiddenColumn = new DataColumn("Ora" + oraSorszamString + "IsHiddenColumn") { DefaultValue = true }; dt.Columns.Add(isHiddenColumn); var mulasztasIdColumn = new DataColumn("Ora" + oraSorszamString + "MulasztasId") { AllowDBNull = true }; dt.Columns.Add(mulasztasIdColumn); var mulasztasTipusColumn = new DataColumn("Ora" + oraSorszamString + "MulasztasTipus") { AllowDBNull = true }; dt.Columns.Add(mulasztasTipusColumn); var kesesPercbenColumn = new DataColumn("Ora" + oraSorszamString + "KesesPercben") { AllowDBNull = true }; dt.Columns.Add(kesesPercbenColumn); var isIgazolt = new DataColumn("Ora" + oraSorszamString + "IsIgazolt") { AllowDBNull = true }; dt.Columns.Add(isIgazolt); var igazolasTipus = new DataColumn("Ora" + oraSorszamString + "IgazolasTipus") { AllowDBNull = true }; dt.Columns.Add(igazolasTipus); dt.Columns.Add(new DataColumn("Ora" + oraSorszamString + "IgazolasTipusText", typeof(string))); dt.Columns.Add(new DataColumn("Ora" + oraSorszamString + "Megjegyzes", typeof(string))); } for (var i = 1; i <= Constants.Mulasztas.FoglalkozasCount; i++) { var isMegtartottColumn = new DataColumn("Foglalkozas" + i + "IsMegtartott", typeof(bool)); { isMegtartottColumn.DefaultValue = false; } dt.Columns.Add(isMegtartottColumn); var nevColumn = new DataColumn("Foglalkozas" + i + "Nev") { AllowDBNull = true }; dt.Columns.Add(nevColumn); dt.Columns.Add(new DataColumn("Foglalkozas" + i + "OsztalyCsoportNev", typeof(string))); dt.Columns.Add(new DataColumn("Foglalkozas" + i + "TantargyNev", typeof(string))); dt.Columns.Add(new DataColumn("Foglalkozas" + i + "TanarNev", typeof(string))); dt.Columns.Add(new DataColumn("Foglalkozas" + i + "TanitasiOraId", typeof(int))); var isHiddenColumn = new DataColumn("Foglalkozas" + i + "IsHiddenColumn") { DefaultValue = true }; dt.Columns.Add(isHiddenColumn); var mulasztasIdColumn = new DataColumn("Foglalkozas" + i + "MulasztasId") { AllowDBNull = true }; dt.Columns.Add(mulasztasIdColumn); var mulasztasTipusColumn = new DataColumn("Foglalkozas" + i + "MulasztasTipus") { AllowDBNull = true }; dt.Columns.Add(mulasztasTipusColumn); var kesesPercbenColumn = new DataColumn("Foglalkozas" + i + "KesesPercben") { AllowDBNull = true }; dt.Columns.Add(kesesPercbenColumn); var isIgazolt = new DataColumn("Foglalkozas" + i + "IsIgazolt") { AllowDBNull = true }; dt.Columns.Add(isIgazolt); var igazolasTipus = new DataColumn("Foglalkozas" + i + "IgazolasTipus") { AllowDBNull = true }; dt.Columns.Add(igazolasTipus); dt.Columns.Add(new DataColumn("Foglalkozas" + i + "IgazolasTipusText", typeof(string))); dt.Columns.Add(new DataColumn("Foglalkozas" + i + "Megjegyzes", typeof(string))); } foreach (DataColumn column in dt.Columns) { column.AllowDBNull = true; } naplonezetGridData.Tables.Add(dt); var view = new DataView(naploNezetAdatok.Tables[0]); var tanuloIdList = view.ToTable(true, "TanuloId").AsEnumerable().Select(p => SDAConvert.ToInt32(p["TanuloId"])).ToList(); var orderedFoglalkozasKezdeteList = naploNezetAdatok .Tables[0] .AsEnumerable() .Where(r => SDAConvert.ToDateTime(r["OraKezdete"]) != null) .GroupBy(x => SDAConvert.ToDateTime(x["OraKezdete"])) .OrderBy(r => SDAConvert.ToDateTime(r.Key)) .Select(x => x.Key) .OfType() .ToList(); var foglalkozasColumnDictionary = new Dictionary(); var foglalkozasColumnDictionaryIndex = 1; foreach (var foglalkozasKezdete in orderedFoglalkozasKezdeteList) { var orakezdete = foglalkozasKezdete.ToString("HH:mm"); if (!foglalkozasColumnDictionary.ContainsKey(orakezdete)) { foglalkozasColumnDictionary.Add(orakezdete, foglalkozasColumnDictionaryIndex); foglalkozasColumnDictionaryIndex++; } } var visibleColumnList = new List(); foreach (var tanuloId in tanuloIdList) { var dr = naplonezetGridData.Tables[0].NewRow(); IEnumerable rows = naploNezetAdatok .Tables[0] .AsEnumerable() .Where(r => SDAConvert.ToInt32(r["TanuloId"]) == tanuloId) .ToList(); if (rows.Any()) { var firstRow = rows.First(); dr.SetField("ID", tanuloId); dr.SetField("TanuloId", tanuloId); dr.SetField("TanuloNev", SDAConvert.ToString(firstRow["TanuloNev"])); dr.SetField("OsztalyNev", SDAConvert.ToString(firstRow["OsztalyNev"])); dr.SetField("AnyjaNeve", SDAConvert.ToString(firstRow["AnyjaNeve"])); dr.SetField("SzuletesiIdo", SDAConvert.ToDateTime(firstRow["SzuletesiIdo"])); } IEnumerable oraRows = naploNezetAdatok .Tables[0] .AsEnumerable() .Where(r => SDAConvert.ToInt32(r["TanuloId"]) == tanuloId && SDAConvert.ToNullableInt32(r["OraSorszam"]) != null) .OrderBy(r => SDAConvert.ToNullableInt32(r["OraSorszam"])) .ToList(); oraRows = oraRows .GroupBy(x => SDAConvert.ToNullableInt32(x["OraSorszam"])) //NOTE: Az alábbi feltételeket alapján jelenítjük meg a tanítási órát // - Ahol már van mulasztás felvéve(MulasztasId.IsEntityId()) és a mulasztás típusa hiányzás vagy késés // - Ha nincs, akkor az osztály órája(IsOsztalyOraja) // - Ha nincs, akkor a tanórai célú csoport órája(IsTanoraiCelu) // - Ha nincs, akkor a tanórai célúnak jelölt csoport órája(IsTanoraiCelunakJelolt) // - Különben az első találatot(First()) .Select(x => x.FirstOrDefault(dataRow => SDAConvert.ToNullableInt32(dataRow["MulasztasId"]).IsEntityId() && (SDAConvert.ToNullableInt32(dataRow["MulasztasTipus"]) == (int)MulasztasTipusEnum.hianyzas || SDAConvert.ToNullableInt32(dataRow["MulasztasTipus"]) == (int)MulasztasTipusEnum.keses)) ?? x.FirstOrDefault(dataRow => SDAConvert.ToBoolean(dataRow["IsOsztalyOraja"])) ?? x.FirstOrDefault(dataRow => SDAConvert.ToBoolean(dataRow["IsTanoraiCelu"])) ?? x.FirstOrDefault(dataRow => SDAConvert.ToBoolean(dataRow["IsTanoraiCelunakJelolt"])) ?? x.First()) .ToList(); foreach (var oraRow in oraRows) { var oraColumnIndex = SDAConvert.ToNullableInt32(oraRow["OraSorszam"]); string oraSorszamString; if (oraColumnIndex < 0) { oraSorszamString = "Minusz" + Math.Abs(oraColumnIndex.Value); } else { //NOTE: A feljebb lévő Where miatt nem lehet null. oraSorszamString = oraColumnIndex.Value.ToString(); } dr.SetField("Ora" + oraSorszamString + "IsMegtartott", true); dr.SetField("Ora" + oraSorszamString + "OsztalyCsoportNev", SDAConvert.ToString(oraRow["OsztalyCsoportNev"])); dr.SetField("Ora" + oraSorszamString + "TantargyNev", SDAConvert.ToString(oraRow["TantargyNev"])); dr.SetField("Ora" + oraSorszamString + "TanarNev", SDAConvert.ToString(oraRow["TanarNev"])); dr.SetField("Ora" + oraSorszamString + "MulasztasId", SDAConvert.ToNullableInt32(oraRow["MulasztasId"])); var mulasztasTipus = SDAConvert.ToNullableInt32(oraRow["MulasztasTipus"]) != null ? SDAConvert.ToNullableInt32(oraRow["MulasztasTipus"]) : jelenletTipus; dr.SetField("Ora" + oraSorszamString + "MulasztasTipus", mulasztasTipus); dr.SetField("Ora" + oraSorszamString + "KesesPercben", SDAConvert.ToNullableInt32(oraRow["KesesPercben"])); dr.SetField("Ora" + oraSorszamString + "IsIgazolt", SDAConvert.ToNullableBoolean(oraRow["IsIgazolt_BOOL"])); dr.SetField("Ora" + oraSorszamString + "IgazolasTipus", SDAConvert.ToNullableInt32(oraRow["IgazolasTipus"])); dr.SetField("Ora" + oraSorszamString + "IgazolasTipusText", SDAConvert.ToString(oraRow["IgazolasTipus_DNAME"])); dr.SetField("Ora" + oraSorszamString + "Megjegyzes", FormatMulasztasMegjegyzes(SDAConvert.ToString(oraRow["Megjegyzes"]))); dr.SetField("Ora" + oraSorszamString + "TanitasiOraId", SDAConvert.ToNullableInt32(oraRow["TanitasiOraId"])); var isHiddenColumn = "Ora" + oraSorszamString + "IsHiddenColumn"; if (!visibleColumnList.Contains(isHiddenColumn)) { visibleColumnList.Add(isHiddenColumn); } } IEnumerable foglalkozasRows = naploNezetAdatok .Tables[0] .AsEnumerable() .Where(r => SDAConvert.ToInt32(r["TanuloId"]) == tanuloId && SDAConvert.ToDateTime(r["OraKezdete"]) != null) .OrderBy(r => SDAConvert.ToDateTime(r["OraKezdete"])) .ToList(); foglalkozasRows = foglalkozasRows .GroupBy(x => SDAConvert.ToDateTime(x["OraKezdete"])) //NOTE: Az alábbi feltételeket alapján jelenítjük meg a tanítási órát // - Ahol már van mulasztás felvéve(MulasztasId.IsEntityId()) és a mulasztás típusa hiányzás vagy késés // - Ha nincs, akkor az osztály órája(IsOsztalyOraja) // - Ha nincs, akkor a tanórai célú csoport órája(IsTanoraiCelu) // - Ha nincs, akkor a tanórai célúnak jelölt csoport órája(IsTanoraiCelunakJelolt) // - Különben az első találatot(First()) .Select(x => x.FirstOrDefault(dataRow => SDAConvert.ToNullableInt32(dataRow["MulasztasId"]).IsEntityId() && (SDAConvert.ToNullableInt32(dataRow["MulasztasTipus"]) == (int)MulasztasTipusEnum.hianyzas || SDAConvert.ToNullableInt32(dataRow["MulasztasTipus"]) == (int)MulasztasTipusEnum.keses)) ?? x.FirstOrDefault(dataRow => SDAConvert.ToBoolean(dataRow["IsOsztalyOraja"])) ?? x.FirstOrDefault(dataRow => SDAConvert.ToBoolean(dataRow["IsTanoraiCelu"])) ?? x.FirstOrDefault(dataRow => SDAConvert.ToBoolean(dataRow["IsTanoraiCelunakJelolt"])) ?? x.First()) .ToList(); foreach (var foglalkozasRow in foglalkozasRows) { var orakezdete = SDAConvert.ToDateTime(foglalkozasRow["OraKezdete"]).Value.ToString("HH:mm"); var foglalkozasColumnIndex = foglalkozasColumnDictionary[orakezdete]; dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "IsMegtartott", true); //NOTE: A feljebb lévő Where miatt nem lehet null. dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "OsztalyCsoportNev", SDAConvert.ToString(foglalkozasRow["OsztalyCsoportNev"])); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "TantargyNev", SDAConvert.ToString(foglalkozasRow["TantargyNev"])); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "TanarNev", SDAConvert.ToString(foglalkozasRow["TanarNev"])); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "MulasztasId", SDAConvert.ToNullableInt32(foglalkozasRow["MulasztasId"])); var mulasztasTipus = SDAConvert.ToNullableInt32(foglalkozasRow["MulasztasTipus"]) != null ? SDAConvert.ToNullableInt32(foglalkozasRow["MulasztasTipus"]) : jelenletTipus; dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "MulasztasTipus", mulasztasTipus); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "KesesPercben", SDAConvert.ToNullableInt32(foglalkozasRow["KesesPercben"])); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "IsIgazolt", SDAConvert.ToNullableBoolean(foglalkozasRow["IsIgazolt_BOOL"])); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "IgazolasTipus", SDAConvert.ToNullableInt32(foglalkozasRow["IgazolasTipus"])); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "IgazolasTipusText", SDAConvert.ToString(foglalkozasRow["IgazolasTipus_DNAME"])); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "Megjegyzes", FormatMulasztasMegjegyzes(SDAConvert.ToString(foglalkozasRow["Megjegyzes"]))); dr.SetField("Foglalkozas" + foglalkozasColumnIndex + "TanitasiOraId", SDAConvert.ToNullableInt32(foglalkozasRow["TanitasiOraId"])); var isHiddenColumn = "Foglalkozas" + foglalkozasColumnIndex + "IsHiddenColumn"; if (!visibleColumnList.Contains(isHiddenColumn)) { visibleColumnList.Add(isHiddenColumn); } } naplonezetGridData.Tables[0].Rows.Add(dr); } #region "Header helyett nulladik sor" //NOTE: "Ideiglenesen mivel a grid headerbe nincs lehetőség az összes oszlopérték beállítására egyszerre, ezért bekerül egy nulladik sor, amivel állítani lehet..." var editorRow = naplonezetGridData.Tables[0].NewRow(); editorRow["ID"] = 0; editorRow["TanuloId"] = 0; editorRow["TanuloNev"] = ""; naplonezetGridData.Tables[0].Rows.InsertAt(editorRow, 0); #endregion "Header helyett nulladik sor" foreach (var visibleColumn in visibleColumnList) { naplonezetGridData.Tables[0].Columns[visibleColumn].Expression = "False"; } for (var i = Constants.Mulasztas.OraSorszamMinValue; i <= Constants.Mulasztas.OraSorszamMaxValue; i++) { string oraSorszamString; if (i < 0) { oraSorszamString = "Minusz" + Math.Abs(i); } else { //NOTE: A feljebb lévő Where miatt nem lehet null. oraSorszamString = i.ToString(); } naplonezetGridData.Tables[0].Columns["Ora" + oraSorszamString + "Nev"].Expression = "'" + i + ". óra'"; } foreach (var foglalkozasColumn in foglalkozasColumnDictionary) { naplonezetGridData.Tables[0].Columns["Foglalkozas" + foglalkozasColumn.Value + "Nev"].Expression = "'" + foglalkozasColumn.Key + "'"; } AddColumnsToDataSet(h, naplonezetGridData, true, false, false); return naplonezetGridData; }); } public QuintupleList GetTanuloLegutobbiMulasztasai(int tanuloId) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(GridParameters); var result = new QuintupleList(); var mulasztasok = dal.GetTanuloLegutobbiMulasztasai(tanuloId).Tables[0].AsEnumerable(); foreach (var keses in mulasztasok.Where(r => (MulasztasTipusEnum)SDAConvert.ToInt32(r["C_TIPUS"]) == MulasztasTipusEnum.keses)) { var oraSzamVagyKezdeteVege = string.IsNullOrWhiteSpace(SDAConvert.ToString(keses["C_ORASZAM"])) ? keses["OraKezdeteVege"] : keses["C_ORASZAM"]; result.Add(SDAConvert.ToDateTime(keses["C_DATUM"]), MulasztasTipusEnum.keses.GetDisplayName(TanevId), SDAConvert.ToDateTime(keses["C_DATUM"])?.ToString("dddd"), $"{oraSzamVagyKezdeteVege}. óra ({keses["C_NEV"]})", keses["ID"].ToString()); } foreach (var grouping in mulasztasok.Where(r => (MulasztasTipusEnum)SDAConvert.ToInt32(r["C_TIPUS"]) == MulasztasTipusEnum.hianyzas).GroupBy(r => SDAConvert.ToDateTime(r["C_DATUM"]))) { var first = grouping.First(); var count = grouping.Count(); var oraSzamVagyKezdeteVege = string.IsNullOrWhiteSpace(SDAConvert.ToString(first["C_ORASZAM"])) ? first["OraKezdeteVege"] : first["C_ORASZAM"]; result.Add( grouping.Key, MulasztasTipusEnum.hianyzas.GetDisplayName(TanevId), grouping.Key?.ToString("dddd"), count > 1 ? $"{count} db tanóra" : $"{oraSzamVagyKezdeteVege}. óra ({first["C_NEV"]})", first["ID"].ToString()); } return new QuintupleList(result.OrderByDescending(r => r.Item1).Take(6).ToList()); }); } #region Export public MemoryStream GetTanulokTantargyaiEsPedagogusaiExcelExport(MulasztasokCo seachModel) { return Dal.CustomConnection.Run(ConnectionType, h => { var dataSet = h.Tanulo().GetTanulokMulasztasaiExcelExport(seachModel.ToPco(TanevId)); var dataTable = dataSet.Tables[0]; ExportLogic.TryCreateHeaderIfNotExist(dataTable); var stream = new MemoryStream(); using (var excel = new ExcelPackage(stream)) { var workSheet = excel.Workbook.Worksheets.Add(HianyzasResource.TanulokMulasztasai); workSheet.Cells[1, 1].LoadFromDataTable(dataTable, true); ExportLogic.SetHeaderStyles(workSheet.Cells[1, 1, 1, dataTable.Columns.Count]); workSheet.Cells.AutoFitColumns(); excel.Save(); } stream.Position = 0; return stream; }); } public MemoryStream GetTanorakonNemJelenlevokExcelExport(MulasztasokCo seachModel) { return Dal.CustomConnection.Run(ConnectionType, h => { var dataSet = h.Tanulo().GetTanorakonNemJelenlevokExcelExport(seachModel.ToPco(TanevId)); var dataTable = dataSet.Tables[0]; ExportLogic.TryCreateHeaderIfNotExist(dataTable); var stream = new MemoryStream(); using (var excel = new ExcelPackage(stream)) { var workSheet = excel.Workbook.Worksheets.Add(HianyzasResource.TanorakonNemJelenlevok); workSheet.Cells[1, 1].LoadFromDataTable(dataTable, true); ExportLogic.SetHeaderStyles(workSheet.Cells[1, 1, 1, dataTable.Columns.Count]); workSheet.Cells.AutoFitColumns(); excel.Save(); } stream.Position = 0; return stream; }); } public MemoryStream ExportTanuloKesesekHianyzasok(MulasztasokCo co) { return Dal.CustomConnection.Run(ConnectionType, h => { var dal = h.MulasztasDal(); var pco = co.ToPco(TanevId); var ds = dal.GetHallgatoMulasztasaiDataSet(pco); var dt = ds.DataSetSort("MulasztasDatum", false).Tables[0]; var mulasztasKesesColumn = dt.Columns.Add("Mulasztas_Keses", typeof(string)); foreach (DataRow row in dt.Rows) { var mulasztasKesesResult = row.Field("MulasztasTipus_DNAME"); var mulasztasTipus = row.Field("MulasztasTipus"); if (mulasztasTipus == (int)MulasztasTipusEnum.keses || mulasztasTipus == (int)MulasztasTipusEnum.potlas) { var keses = row.Field("Perc"); mulasztasKesesResult += $" ({keses} Perc)"; } row.SetField(mulasztasKesesColumn, mulasztasKesesResult); } var stream = new MemoryStream(); using (var excel = new ExcelPackage(stream)) { var workSheet = excel.Workbook.Worksheets.Add(HianyzasResource.KesesekHianyzasok); (string nameFrom, string nameTo, Type type)[] exportColumns = { ("MulasztasDatum", HianyzasResource.MulasztasDatuma, typeof(DateTime)), ("Oraszam", HianyzasResource.Ora, typeof(int)), ("Targy", HianyzasResource.Tantargy, typeof(string)), ("Tema", TantargyResource.Tema, typeof(string)), ("Mulasztas_Keses", HianyzasResource.MulasztasTipusa, typeof(string)), ("Igazolt_BNAME", HianyzasResource.IgazoltKerdojel, typeof(string)), ("TanoraiCeluMulasztas_BNAME", HianyzasResource.TanoraiCeluMulasztas, typeof(string)), ("IgazolasTipus_DNAME", HianyzasResource.IgazolasTipusa, typeof(string)), ("RogzitesDatum", HianyzasResource.RogzitesDatuma, typeof(DateTime)) }; ExportLogic.MapDataTable(dt, exportColumns, true); ExportLogic.FormatDateFields(exportColumns, workSheet); workSheet.Cells[1, 1].LoadFromDataTable(dt, true); ExportLogic.SetHeaderStyles(workSheet.Cells[1, 1, 1, exportColumns.Length]); workSheet.Cells.AutoFitColumns(); excel.Save(); } stream.Position = 0; return stream; }); } public List GetMulasztasCoList(MulasztasokCo mulasztasok, bool fromSearchPanel) { var coList = new List(); var ds = GetMulasztasList(mulasztasok, fromSearchPanel: fromSearchPanel); foreach (var row in ds.Tables[0].AsEnumerable()) { coList.Add(new MulasztasItemCo(row)); } return coList; } #endregion public List ListTanitasiOraKezdeteVege(IEnumerable tanitasiOraIdList) { return Dal.CustomConnection.Run(ConnectionType, h => { var tanitasiOraDal = h.TanitasiOra(); var tanitasiOraKezdeteVegeDs = tanitasiOraDal.ListTanitasiOraKezdeteVege(tanitasiOraIdList); var result = tanitasiOraKezdeteVegeDs.Tables[0].AsEnumerable().Select(r => new TanitasiOraCo { Id = r.Field("Id"), OraKezdete = r.Field("OraKezdete"), OraVege = r.Field("OraVege"), Oraszam = r.Field("Oraszam") }).ToList(); return result; }); } public int? GetMulasztasId(int tanuloId, int tanitasiOraId) { return Dal.CustomConnection.Run(ConnectionType, h => { var mulasztasDal = h.MulasztasDal(); var mulasztasDataSet = mulasztasDal.GetMulasztasDataSet(new MulasztasKeresesePCO() { TanevId = TanevId, TanuloId = tanuloId, TanitasiOraId = tanitasiOraId }, true); int? mulasztasId = null; if (mulasztasDataSet.Tables[0].Rows.Count == 1) { mulasztasId = Convert.ToInt32(mulasztasDataSet.Tables[0].Rows[0][0]); } return mulasztasId; }); } public int GetTanuloMulasztasaiHianyzasMiattCount(int tanuloId) { return Dal.CustomConnection.Run(ConnectionType, h => { var mulasztasDal = h.MulasztasDal(); var mulasztasDataSet = mulasztasDal.GetTanuloMulasztasaiData(TanevId, tanuloId, (int)MulasztasTipusEnum.hianyzas, false); return mulasztasDataSet.Tables.Count > 0 && mulasztasDataSet.Tables[0].Rows != null ? mulasztasDataSet.Tables[0].Rows.Count : 0; }); } private string FormatMulasztasMegjegyzes(string megjegyzes) { return megjegyzes?.Length > 30 ? $"{megjegyzes.Substring(0, 29)}…" : megjegyzes; } } }