using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using Kreta.BusinessLogic.Classes;
using Kreta.BusinessLogic.HelperClasses;
using Kreta.BusinessLogic.Helpers.Models;
using Kreta.BusinessLogic.Helpers.SystemSettings;
using Kreta.Core;
using Kreta.Core.ConnectionType;
using Kreta.Core.Exceptions;
using Kreta.Core.FeatureToggle;
using Kreta.Core.FeatureToggle.Configuration;
using Kreta.DataAccess.Interfaces;
using Kreta.DataAccessManual;
using Kreta.DataAccessManual.Interfaces;
using Kreta.DataAccessManual.Util;
using Kreta.Enums;
using Kreta.Enums.ManualEnums;
using Kreta.Job.Tasks.Cache;
using Kreta.Resources;
using Newtonsoft.Json;

namespace Kreta.BusinessLogic.Helpers
{
    public class OrarendiOraHelper : LogicBase
    {
        public OrarendiOraHelper(IConnectionType connectionType) : base(connectionType)
        {
        }

        public bool HasHazifeladatOrHelyettesitesOrSzamonkeresForOrarendiOra(OraValidationCo co)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                OrarendiOraValidationCo oraValidationCo = SetErvenyessegDatumok(h, co.OrarendiOraValidationCo);
                IOrarendiOra entity = h.OrarendiOra().Get(oraValidationCo.Id.Value);
                if (new DktFeladatHelper(new DalHandlerConnectionType(ConnectionType, h)).HasOrarendiOraKapcsolodoHazifeladatot(entity.OrarendiOraGroupId, oraValidationCo.OraErvenyessegKezdete, oraValidationCo.OraErvenyessegVege.Date, idoszakonKivul: false))
                {
                    return true;
                }

                if (entity.HelyettesTanarok.Any(x => !x.Torolt && (x.HelyettesitesNapja >= oraValidationCo.OraErvenyessegKezdete || x.HelyettesitesNapja <= oraValidationCo.OraErvenyessegVege.Date)))
                {
                    return true;
                }

                if (entity.OrarendiOraGroupId.IsEntityId())
                {
                    return h.SzamonkeresElorejelzes().HasSzamonkeresByIdoszak(TanevId, entity.OrarendiOraGroupId.Value, oraValidationCo.OraErvenyessegKezdete, oraValidationCo.OraErvenyessegVege.Date, idoszakonKivul: false);
                }

                return false;
            });
        }

        public bool HasHazifeladatOrHelyettesitesOrSzamonkeresNotInIdoszak(OraValidationCo co)
        {
            bool result;
            result = Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                OrarendiOraValidationCo oraValidationCo = SetErvenyessegDatumok(h, co.OrarendiOraValidationCo);
                IOrarendiOra entity = h.OrarendiOra().Get(oraValidationCo.Id.Value);
                if (new DktFeladatHelper(new DalHandlerConnectionType(ConnectionType, h)).HasOrarendiOraKapcsolodoHazifeladatot(entity.OrarendiOraGroupId, oraValidationCo.OraErvenyessegKezdete, oraValidationCo.OraErvenyessegVege, idoszakonKivul: true))
                {
                    return true;
                }

                if (entity.HelyettesTanarok.Any(x => !x.Torolt && (x.HelyettesitesNapja < oraValidationCo.OraErvenyessegKezdete || x.HelyettesitesNapja > oraValidationCo.OraErvenyessegVege)))
                {
                    return true;
                }

                if (entity.OrarendiOraGroupId.IsEntityId())
                {
                    return h.SzamonkeresElorejelzes().HasSzamonkeresByIdoszak(TanevId, entity.OrarendiOraGroupId.Value, oraValidationCo.OraErvenyessegKezdete, oraValidationCo.OraErvenyessegVege, idoszakonKivul: true);
                }

                return false;
            });

            return result;
        }

        public bool CheckUtkozesValidation(OraValidationCo validationCo, string errMsgOraData = null, bool isPrevalidation = false, bool isThrowExceptionOnCollision = true, bool isCheckKozponti = false, bool isForDelete = false, bool isTeremutkozesFigyelese = true)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                return CheckUtkozesValidation(h, validationCo, errMsgOraData, isPrevalidation, isThrowExceptionOnCollision, isCheckKozponti, isForDelete, isTeremutkozesFigyelese);
            });
        }

        private bool CheckUtkozesValidation(IDalHandler dalHandler, OraValidationCo validationCo, string errMsgOraData = null, bool isPrevalidation = false, bool isThrowExceptionOnCollision = true, bool isCheckKozponti = false, bool isForDelete = false, bool isTeremutkozesFigyelese = true)
        {
            OraValidationCo EredetiOraValidationCo = new OraValidationCo();
            OraValidationCo OraValidationCoForCheck = new OraValidationCo();
            validationCo.OrarendiOraValidationCo = SetErvenyessegDatumok(dalHandler, validationCo.OrarendiOraValidationCo);
            bool isErvenyessegModositasTeljesIdoszakra = false;
            //osszehasonlitjuk az eredeti orarendioraval - ha nincs modositas nem validalunk es nem mentunk
            if (validationCo.OrarendiOraValidationCo.Id.HasValue)
            {
                EredetiOraValidationCo.OrarendiOraValidationCo = ConvertToOrarendiOraValidationCo(dalHandler.OrarendiOra().Get(validationCo.OrarendiOraValidationCo.Id.Value));
                EredetiOraValidationCo.OrarendiOraValidationCo.IsFromSzervezet = validationCo.OrarendiOraValidationCo.IsFromSzervezet;
                EredetiOraValidationCo.OrarendiOraValidationCo.IsMentorOra = validationCo.OrarendiOraValidationCo.IsMentorOra;
                isErvenyessegModositasTeljesIdoszakra =
                    validationCo.OrarendiOraValidationCo.IsModification
                    && validationCo.OrarendiOraValidationCo.ModositasiIdoszakTipus == (int)OraModositasiIdoszakTipus.TeljesIdoszak
                    && (validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete != EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete
                        || validationCo.OrarendiOraValidationCo.OraErvenyessegVege != EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege);
                EredetiOraValidationCo.OrarendiOraValidationCo.TeremutkozesSystemSetting = validationCo.OrarendiOraValidationCo.TeremutkozesSystemSetting;
                EredetiOraValidationCo.OrarendiOraValidationCo.ModositasiIdoszakTipus = validationCo.OrarendiOraValidationCo.ModositasiIdoszakTipus;
                EredetiOraValidationCo.OrarendiOraValidationCo.IsModification = validationCo.OrarendiOraValidationCo.IsModification;
                EredetiOraValidationCo.OrarendiOraValidationCo.JSHelperNev = validationCo.OrarendiOraValidationCo.JSHelperNev;
                EredetiOraValidationCo.OrarendiOraValidationCo.ModificationDate = validationCo.OrarendiOraValidationCo.ModificationDate;
                EredetiOraValidationCo.OrarendiOraValidationCo.OraKezdete = validationCo.OrarendiOraValidationCo.OraKezdete.Date.Add(EredetiOraValidationCo.OrarendiOraValidationCo.OraKezdete.TimeOfDay);
                EredetiOraValidationCo.OrarendiOraValidationCo.OraVege = validationCo.OrarendiOraValidationCo.OraVege.Date.Add(EredetiOraValidationCo.OrarendiOraValidationCo.OraVege.TimeOfDay);
                EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete = EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete.Date.Add(validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete.TimeOfDay);
                EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege = EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege.Date.Add(validationCo.OrarendiOraValidationCo.OraErvenyessegVege.TimeOfDay);
            }

            OraValidationCoForCheck = JsonConvert.DeserializeObject<OraValidationCo>(JsonConvert.SerializeObject(validationCo));//CloneObject
            OraValidationCoForCheck.OrarendiOraValidationCo.GroupId = EredetiOraValidationCo.OrarendiOraValidationCo.GroupId;
            OraValidationCoForCheck.OrarendiOraValidationCo.OraErvenyessegKezdete = EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete;
            OraValidationCoForCheck.OrarendiOraValidationCo.OraErvenyessegVege = EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege;
            validationCo.IsChanged = isErvenyessegModositasTeljesIdoszakra || !OraValidationCoForCheck.OrarendiOraValidationCo.IsEqualTo(EredetiOraValidationCo.OrarendiOraValidationCo);
            validationCo.OsztalyTanarTantargyModosult = validationCo.OrarendiOraValidationCo.OsztalyId != EredetiOraValidationCo.OrarendiOraValidationCo.OsztalyId
                || validationCo.OrarendiOraValidationCo.TanarId != EredetiOraValidationCo.OrarendiOraValidationCo.TanarId
                || validationCo.OrarendiOraValidationCo.TantargyId != EredetiOraValidationCo.OrarendiOraValidationCo.TantargyId
                || validationCo.OrarendiOraValidationCo.Oraszam != EredetiOraValidationCo.OrarendiOraValidationCo.Oraszam;
            if (validationCo.IsChanged || isForDelete)
            {
                //egynapos orak miatt es az sp_getorarend zart datum intervalumra szűr
                var ervenyessegvege = validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete.Date == validationCo.OrarendiOraValidationCo.OraErvenyessegVege.Date ?
                    validationCo.OrarendiOraValidationCo.OraErvenyessegVege : validationCo.OrarendiOraValidationCo.OraErvenyessegVege.AddDays(-1);

                var aktualisHetirendek = GetAktualisHetirendek(dalHandler);

                DateTime bovitettIntervallumKezdete;
                DateTime bovitettIntervallumVege;

                if (EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete != default)
                {
                    bovitettIntervallumKezdete = EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete < validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete ? EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete : validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete;
                }
                else
                {
                    bovitettIntervallumKezdete = validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete;
                }

                if (EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege != default)
                {
                    bovitettIntervallumVege = EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege < ervenyessegvege ? ervenyessegvege : EredetiOraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege;
                }
                else
                {
                    bovitettIntervallumVege = ervenyessegvege;
                }

                //lekerjuk az adatokat --> sp_GetOrarend
                List<OrarendiOraTanitasiOraCo> bovitettOraLista = GetOrarendiOrakUtkozesValidaciohoz(dalHandler,
                    bovitettIntervallumKezdete,
                    bovitettIntervallumVege,
                    validationCo.OrarendiOraValidationCo.HetNapjaId,
                    validationCo.OrarendiOraValidationCo.OraKezdete,
                    validationCo.OrarendiOraValidationCo.OraVege
                    ).Where(x => (validationCo.OrarendiOraValidationCo.HetirendId == (int)HetiRendTipusEnum.MindegyikHet ? aktualisHetirendek.Contains(x.HetirendTipusId) : x.HetirendTipusId == validationCo.OrarendiOraValidationCo.HetirendId) && x.IsEgyediNap == validationCo.OrarendiOraValidationCo.IsEgyediNap).ToList();
                List<OrarendiOraTanitasiOraCo> OraListaOraSzamModositas = new List<OrarendiOraTanitasiOraCo>();
                var oraszamModosult = validationCo.OrarendiOraValidationCo.IsModification &&
                    (validationCo.OrarendiOraValidationCo.OraKezdete != EredetiOraValidationCo.OrarendiOraValidationCo.OraKezdete
                    || validationCo.OrarendiOraValidationCo.OraVege != EredetiOraValidationCo.OrarendiOraValidationCo.OraVege);
                if (oraszamModosult)
                {
                    OraListaOraSzamModositas = GetOrarendiOrakUtkozesValidaciohoz(dalHandler,
                        bovitettIntervallumKezdete,
                        bovitettIntervallumVege,
                        validationCo.OrarendiOraValidationCo.HetNapjaId,
                        EredetiOraValidationCo.OrarendiOraValidationCo.OraKezdete,
                        EredetiOraValidationCo.OrarendiOraValidationCo.OraVege
                        ).Where(x => (validationCo.OrarendiOraValidationCo.HetirendId == (int)HetiRendTipusEnum.MindegyikHet ? aktualisHetirendek.Contains(x.HetirendTipusId) : x.HetirendTipusId == validationCo.OrarendiOraValidationCo.HetirendId) && x.IsEgyediNap == validationCo.OrarendiOraValidationCo.IsEgyediNap).ToList();
                }

                List<OrarendiOraTanitasiOraCo> oraLista = bovitettOraLista.Where(x => x.Datum >= validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete.Date && x.Datum <= ervenyessegvege.Date).ToList();

                if (!isForDelete)
                {
                    if (isTeremutkozesFigyelese && !validationCo.OrarendiOraValidationCo.IsFromSzervezet)
                    {
                        var teremutkozesSystemSetting = GetTeremutkozesFigyelesSystemSettingValue(dalHandler);
                        validationCo.OrarendiOraValidationCo.TeremutkozesSystemSetting = teremutkozesSystemSetting;

                        //OrarendHelper.OrarendiOraTeremUtkozesEllenorzes helyett
                        List<OrarendiOraTanitasiOraCo> teremUtkozoOraLista = TeremUtkozesValidation(oraLista, validationCo.OrarendiOraValidationCo);

                        if (teremUtkozoOraLista.Count > 0 && teremutkozesSystemSetting != 3) //1 - nem lehet ütközés, 2 - figyelmeztetés, 3 - ütközés lehetséges
                        {
                            if (teremutkozesSystemSetting == 1)
                            {
                                var msg = OrarendResource.EbbenAzIdopontbanATeremFoglalt;

                                if (!string.IsNullOrWhiteSpace(errMsgOraData))
                                {
                                    msg = $@"{errMsgOraData}
                            {msg}";
                                }

                                if (isThrowExceptionOnCollision)
                                {
                                    throw new BlException(msg);
                                }
                            }
                            validationCo.OrarendiOraValidationCo.HasTeremutkozes = true;
                            validationCo.Msg.AppendFormat("{0}<br />", OrarendResource.EbbenAzIdopontbanATeremFoglalt);
                        }
                    }
                    //CheckAzonosOraFelvitel helyett
                    List<OrarendiOraTanitasiOraCo> azonosMentettOraLista = GetAzonosOraFelvitel(dalHandler, oraLista, validationCo.OrarendiOraValidationCo);

                    if (!isPrevalidation)
                    {
                        if (azonosMentettOraLista.Count > 0)
                        {
                            if (!isCheckKozponti)
                            {
                                foreach (OrarendiOraTanitasiOraCo azonosMentettOra in azonosMentettOraLista)
                                {
                                    if (azonosMentettOra.IsEgyediNap == validationCo.OrarendiOraValidationCo.IsEgyediNap)
                                    {
                                        DeletOrarendiOra(dalHandler, azonosMentettOra.OrarendiOraId.Value, (int)OraModositasiIdoszakTipus.TeljesIdoszak, validationCo.OrarendiOraValidationCo.ModificationDate);
                                    }
                                }
                            }
                            else
                            {
                                validationCo.IsKozpontiDuplicate = azonosMentettOraLista.Any(o => o.KozpontiOraGroupId.HasValue || o.KozpontilagToroltOraGroupId.HasValue);
                            }

                            validationCo.GroupId = azonosMentettOraLista[0].GroupId;
                        }
                    }
                    else
                    {
                        if (azonosMentettOraLista.Count > 0)
                        {
                            OrarendiOraTanitasiOraCo elsoAzonosMentettOra = azonosMentettOraLista[0];
                            if (isThrowExceptionOnCollision)
                            {
                                if (validationCo.OrarendiOraValidationCo.IsNapirend)
                                {
                                    throw new BlException(OrarendResource.AzonosOraFelvitelNemLehetseges + $" { elsoAzonosMentettOra.OraErvenyessegKezdete.ToShortDateString() } - { elsoAzonosMentettOra.OraErvenyessegVege.ToShortDateString() } ({ elsoAzonosMentettOra.HetNapjaTipusId.GetDisplayName<HetNapjaTipusEnum>(TanevId) })");
                                }

                                throw new BlException(OrarendResource.AzonosOraFelvitelNemLehetseges +
                                    $" { elsoAzonosMentettOra.OraErvenyessegKezdete.ToShortDateString() } - { elsoAzonosMentettOra.OraErvenyessegVege.ToShortDateString() } " +
                                    $"({  elsoAzonosMentettOra.HetNapjaTipusId.GetDisplayName<HetNapjaTipusEnum>(TanevId) } { elsoAzonosMentettOra.OraKezdete.Value.TimeOfDay:hh\\:mm} - { elsoAzonosMentettOra.OraVege.Value.TimeOfDay:hh\\:mm})");
                            }
                        }
                        else
                        {
                            if (!validationCo.OrarendiOraValidationCo.IsFromSzervezet)
                            {
                                var tevekenysegUtkozesSystemSettings = GetTevekenysegFigyelesSystemSettingValue(dalHandler);

                                //OrarendiOraUtkozesEllenorzes - OrarendiOraUtkozesTipusEnum.Tanar -  helyett
                                List<OrarendiOraTanitasiOraCo> tanarUtkozoOraLista = TanarUtkozesValidation(oraLista, validationCo.OrarendiOraValidationCo);
                                if (tanarUtkozoOraLista.Count > 0)
                                {
                                    if (tevekenysegUtkozesSystemSettings == (int)TevekenysegUtkozesEnum.UtkozesNemLehetseges)  //1 - nem lehet ütközés, 2 - figyelmeztetés
                                    {
                                        if (isThrowExceptionOnCollision)
                                        {
                                            throw new BlException(OrarendResource.AKivalasztottTanarnakFoglalkozasaVanEbbenAzIdopontban);
                                        }
                                    }
                                    else if (tevekenysegUtkozesSystemSettings == (int)TevekenysegUtkozesEnum.UtkozeskorFigyelmeztetes)
                                    {
                                        validationCo.Msg.AppendFormat("{0}<br />", OrarendResource.AKivalasztottTanarnakFoglalkozasaVanEbbenAzIdopontban);
                                    }
                                }

                                //OrarendiOraUtkozesEllenorzes - OrarendiOraUtkozesTipusEnum.OsztalyCsoport -  helyett
                                List<OrarendiOraTanitasiOraCo> osztalyUtkozoOraLista = OsztalyCsoportUtkozesValidation(oraLista, validationCo.OrarendiOraValidationCo);
                                if (osztalyUtkozoOraLista.Count > 0)
                                {
                                    if (tevekenysegUtkozesSystemSettings == (int)TevekenysegUtkozesEnum.UtkozesNemLehetseges)  //1 - nem lehet ütközés, 2 - figyelmeztetés
                                    {
                                        if (isThrowExceptionOnCollision)
                                        {
                                            throw new BlException(OrarendResource.AKivalasztottOsztalynakcsoportnakOrajaVanEbbenAzIdopontban);
                                        }
                                    }
                                    else if (tevekenysegUtkozesSystemSettings == (int)TevekenysegUtkozesEnum.UtkozeskorFigyelmeztetes)
                                    {
                                        validationCo.Msg.AppendFormat("{0}<br />", OrarendResource.AKivalasztottOsztalynakcsoportnakOrajaVanEbbenAzIdopontban);
                                    }
                                }

                                if (validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete.Date == validationCo.OrarendiOraValidationCo.OraErvenyessegVege.Date)
                                {
                                    var tanevRendjeMaxOraszam = TanevRendjeOraszamValidation(dalHandler, validationCo.OrarendiOraValidationCo.OsztalyId.Value, validationCo.OrarendiOraValidationCo.OraErvenyessegKezdete);
                                    if (validationCo.OrarendiOraValidationCo.Oraszam > tanevRendjeMaxOraszam)
                                        validationCo.ErrorMsg.AppendFormat("{0}<br />", string.Format(OrarendResource.AKivalasztottOsztalynakcsoportnakMaxNapiOraszama, tanevRendjeMaxOraszam));
                                }
                            }
                        }
                    }

                    if (!validationCo.OrarendiOraValidationCo.IsFromSzervezet && KapacitasUtkozesValidation(dalHandler, validationCo.OrarendiOraValidationCo))
                    {
                        validationCo.Msg.AppendFormat("{0}<br />", OrarendResource.ATeremBefogadokepessegeKisebbMintAzOsztalyCsoportLetszamaSzeretneFolytatni);
                    }

                    if (validationCo.OrarendiOraValidationCo.Oraszam.HasValue && validationCo.OrarendiOraValidationCo.CsengetesiRendId.HasValue)
                    {
                        var orarendiOraOraszamIdopontMsg = CheckOrarendiOraOraszamIdopont(dalHandler, validationCo.OrarendiOraValidationCo.CsengetesiRendId.Value, validationCo.OrarendiOraValidationCo.Oraszam.Value, validationCo.OrarendiOraValidationCo.OraKezdete, validationCo.OrarendiOraValidationCo.OraVege);
                        if (orarendiOraOraszamIdopontMsg.Length > 0)
                        {
                            validationCo.Msg.AppendFormat("{0}<br />", orarendiOraOraszamIdopontMsg);
                        }
                    }
                }

                //megvizsgájuk, vannak-e törlendő helyettesítések
                List<OrarendiOraTanitasiOraCo> torlendoHelyettesitesek = validationCo.OrarendiOraValidationCo.Id.HasValue ? GetTorlendoHelyettesitesek(oraszamModosult ? OraListaOraSzamModositas : bovitettOraLista, validationCo.OrarendiOraValidationCo, isForDelete, isErvenyessegModositasTeljesIdoszakra, isOraszamModosult: oraszamModosult) : new List<OrarendiOraTanitasiOraCo>();
                validationCo.TorlendoHelyettesitesek = torlendoHelyettesitesek;

                if (!validationCo.OrarendiOraValidationCo.IsFromSzervezet && torlendoHelyettesitesek.Count > 0)
                {
                    validationCo.Msg.AppendFormat(OrarendResource.ModositasiidoszakraLetezikHelyettesites, Constants.General.Sortores);
                }

                //megvizsgájuk, vannak-e törlendő előre bejelentett számonkérések
                if (EredetiOraValidationCo.OrarendiOraValidationCo.GroupId.HasValue)
                {
                    var eloreJelzettSzamonkeresek = dalHandler.SzamonkeresElorejelzes().GetSzamonkeresForOrarendiOraGroupId(TanevId, EredetiOraValidationCo.OrarendiOraValidationCo.GroupId.Value);
                    List<BejelentettSzamonkeresekItemCo> torlendoSzamonkeresElorejelzesek = GetTorlendoSzamonkeresElorejelzesek(eloreJelzettSzamonkeresek, EredetiOraValidationCo.OrarendiOraValidationCo, validationCo.OrarendiOraValidationCo, isForDelete, isErvenyessegModositasTeljesIdoszakra);
                    validationCo.TorlendoSzamonkeresElorejelzesek = torlendoSzamonkeresElorejelzesek;

                    if (!validationCo.OrarendiOraValidationCo.IsFromSzervezet && torlendoSzamonkeresElorejelzesek.Count > 0)
                    {
                        validationCo.Msg.AppendFormat(OrarendResource.ModositasiidoszakraLetezikSzamonkeres, Constants.General.Sortores);
                    }
                }

                return true;
            }

            return false;
        }

        private int GetTeremutkozesFigyelesSystemSettingValue(IDalHandler h)
        {
            return new SystemSettingsHelper(new DalHandlerConnectionType(ConnectionType, h)).GetSystemSettingValue<int>(RendszerBeallitasTipusEnum.Teremutkozes_figyeles);
        }

        private bool KapacitasUtkozesValidation(IDalHandler dalHandler, OrarendiOraValidationCo co)
        {
            var sysNaplozas_terem_befogadokepesseg = new SystemSettingsHelper(new DalHandlerConnectionType(ConnectionType, dalHandler)).GetSystemSettingValue<bool>(RendszerBeallitasTipusEnum.Naplozas_terem_befogadokepesseg);

            if (!sysNaplozas_terem_befogadokepesseg)
                return false;

            var result = OrarendiOraTeremKapacitasEllenorzes(dalHandler, co.TeremId, co.OsztalyId.Value);

            return result;
        }

        private List<OrarendiOraTanitasiOraCo> GetAzonosOraFelvitel(IDalHandler dalHandler, List<OrarendiOraTanitasiOraCo> orarendiOraLista, OrarendiOraValidationCo co)
        {
            var aktualisHetirendek = GetAktualisHetirendek(dalHandler);

            return orarendiOraLista.Where(x => x.TanarId == co.TanarId
                && x.TantargyId == co.TantargyId
                && x.OsztalyCsoportId == co.OsztalyId
                && (co.HetirendId == (int)HetiRendTipusEnum.MindegyikHet ? aktualisHetirendek.Contains(x.HetirendTipusId) : x.HetirendTipusId == co.HetirendId)
                && x.IsEgyediNap == co.IsEgyediNap
                && (!co.Id.HasValue || (x.OrarendiOraId != co.Id.Value))).ToList();
        }

        private static List<OrarendiOraTanitasiOraCo> TeremUtkozesValidation(List<OrarendiOraTanitasiOraCo> orarendiOraLista, OrarendiOraValidationCo co)
        {
            return orarendiOraLista.Where(
                x => x.TeremId == co.TeremId
                && !x.IsTeremTobbOratLehetTartani
                && (!co.Id.HasValue || co.Id.Value != x.OrarendiOraId)).ToList();
        }

        private static List<OrarendiOraTanitasiOraCo> TanarUtkozesValidation(List<OrarendiOraTanitasiOraCo> orarendiOraLista, OrarendiOraValidationCo co)
        {
            return orarendiOraLista.Where(x => x.TanarId == co.TanarId && (!co.Id.HasValue || co.Id.Value != x.OrarendiOraId)).ToList();
        }

        private static List<OrarendiOraTanitasiOraCo> OsztalyCsoportUtkozesValidation(List<OrarendiOraTanitasiOraCo> orarendiOraLista, OrarendiOraValidationCo co)
        {
            return orarendiOraLista.Where(x => x.OsztalyCsoportId == co.OsztalyId && (!co.Id.HasValue || co.Id.Value != x.OrarendiOraId)).ToList();
        }

        private static List<OrarendiOraTanitasiOraCo> GetTorlendoHelyettesitesek(List<OrarendiOraTanitasiOraCo> oraLista, OrarendiOraValidationCo co, bool isForDelete = false, bool isErvenyessegModositasTeljesIdoszakra = false, bool isOraszamModosult = false)
        {
            return oraLista.Where
                (x => x.OrarendiOraId == co.Id.Value //azonos orarendiora elemek
                    && x.HelyettesitesId.HasValue // van helyettesites
                    && ((isErvenyessegModositasTeljesIdoszakra && (x.Datum < co.OraErvenyessegKezdete || x.Datum > co.OraErvenyessegVege)) //a torlendo vagy modositando orarendiora ervenyessegi idointervalumon kivul esok
                    || (x.Datum >= co.OraErvenyessegKezdete && x.Datum <= co.OraErvenyessegVege //a torlendo vagy modositando orarendiora ervenyessegi idointervalum kozotti
                            && (isForDelete
                                || x.TanarId != co.TanarId
                                || x.TantargyId != co.TantargyId
                                || x.OsztalyCsoportId != co.OsztalyId
                                || isOraszamModosult
                            )
                        ))

                ).ToList();
        }

        private static List<BejelentettSzamonkeresekItemCo> GetTorlendoSzamonkeresElorejelzesek(DataSet bejelentettSzamonkeresek, OrarendiOraValidationCo eredetiOraCo, OrarendiOraValidationCo co, bool isForDelete = false, bool isErvenyessegModositasTeljesIdoszakra = false)
        {
            List<BejelentettSzamonkeresekItemCo> bejelentettSzamonkeresekItemCo = new List<BejelentettSzamonkeresekItemCo>();

            if (bejelentettSzamonkeresek.Tables.Count > 0 && bejelentettSzamonkeresek.Tables[0].Rows.Count > 0)
            {
                foreach (DataRow row in bejelentettSzamonkeresek.Tables[0].Rows)
                {
                    var item = new BejelentettSzamonkeresekItemCo();
                    item.Id = SDAConvert.ToInt32(row["ID"]);
                    item.OrarendiOraGroupId = SDAConvert.ToInt32(row["OrarendiOraGroupId"]);
                    item.SzamonkeresDatuma = SDAConvert.ToDateTime(row["C_SZAMONKERESDATUMA"]).Value;
                    if (eredetiOraCo.OraErvenyessegKezdete <= item.SzamonkeresDatuma && eredetiOraCo.OraErvenyessegVege >= item.SzamonkeresDatuma)
                    {//a splittelesek miatt szukseges szurni csak az adott orarendiora intervalumra
                        bejelentettSzamonkeresekItemCo.Add(item);
                    }
                }
            }

            return bejelentettSzamonkeresekItemCo.Where
                (x => x.OrarendiOraGroupId == eredetiOraCo.GroupId.Value //azonos orarendiora elemek
                    && (isErvenyessegModositasTeljesIdoszakra && (x.SzamonkeresDatuma < co.OraErvenyessegKezdete || x.SzamonkeresDatuma > co.OraErvenyessegVege)) //a torlendo vagy modositando orarendiora ervenyessegi idointervalumon kivul esok
                    || (x.SzamonkeresDatuma >= co.OraErvenyessegKezdete && x.SzamonkeresDatuma <= co.OraErvenyessegVege //a torlendo vagy modositando orarendiora ervenyessegi idointervalum kozotti
                            && (isForDelete
                                || eredetiOraCo.TanarId != co.TanarId
                                || eredetiOraCo.TantargyId != co.TantargyId
                                || eredetiOraCo.OsztalyId != co.OsztalyId
                                || eredetiOraCo.Oraszam != co.Oraszam
                            )
                        )

                ).ToList();
        }

        public bool CheckUtkozesValidationAndSaveOrUpdateOrarendiOrak(OraValidationCo co, int modifier)
        {
            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                return CheckUtkozesValidation(h, co, null, false)
                && SaveOrUpdateOrarendiOrak(h, co, modifier);
            });
        }

        public bool HandleSaveKozpontiOraRequest(DateTime start, List<int> orarendiOrakTorlesre, List<OraValidationCo> kozpontiOrakList)
        {
            Guid kozpontiOraId = Guid.NewGuid();

            return Dal.CustomConnection.Run(ConnectionType, h =>
            {
                // Delete orarendi orak
                bool sikeres = DeleteOrarendiOrakKozpontilag(h, orarendiOrakTorlesre, kozpontiOraId, start);

                if (!sikeres)
                {
                    return false;
                }

                // Save kozponti orak
                if (kozpontiOrakList?.Count > 0)
                {
                    foreach (OraValidationCo item in kozpontiOrakList)
                    {
                        item.OrarendiOraValidationCo.KozpontiOraGroupId = kozpontiOraId;
                        bool insertSikeres = SaveOrUpdateOrarendiOrak(h, item, FelhasznaloId);

                        if (!insertSikeres)
                        {
                            return false;
                        }
                    }
                }

                return true;
            });
        }

        public bool DeleteOrarendiOrakKozpontilag(List<int> orarendiOrakTorlesre, DateTime start)
        {
            Guid kozpontiOraId = Guid.NewGuid();

            return Dal.CustomConnection.Run(ConnectionType, h => DeleteOrarendiOrakKozpontilag(h, orarendiOrakTorlesre, kozpontiOraId, start));
        }

        private bool DeleteOrarendiOrakKozpontilag(IDalHandler dalHandler, List<int> orarendiOrakTorlesre, Guid kozpontiOraId, DateTime start)
        {
            foreach (int orarendiOraId in orarendiOrakTorlesre)
            {
                IOrarendiOra orarendiOra = dalHandler.OrarendiOra().Get(orarendiOraId);
                bool isEgyediOra = orarendiOra.OraErvenyessegKezdete.Date == orarendiOra.OraErvenyessegVege.Value.Date;

                if (isEgyediOra)
                {
                    orarendiOra.KozpontilagToroltOraGroupID = kozpontiOraId;
                    dalHandler.OrarendiOra().Update(orarendiOra);
                }

                bool torlesSikeres = DeletOrarendiOra(dalHandler, orarendiOraId, (int)OraModositasiIdoszakTipus.EgyOra, start);

                if (!torlesSikeres)
                {
                    return false;
                }

                if (!isEgyediOra)
                {
                    // Insert new orarendi orak as deleted
                    DateTime oraErvenyessegenekKezdete = new DateTime(start.Year, start.Month, start.Day);
                    orarendiOra.OraErvenyessegKezdete = oraErvenyessegenekKezdete;
                    orarendiOra.OraErvenyessegVege = oraErvenyessegenekKezdete;
                    orarendiOra.Torolt = true;
                    orarendiOra.KozpontilagToroltOraGroupID = kozpontiOraId;

                    OraValidationCo oraValidationCo = new OraValidationCo();
                    oraValidationCo.OrarendiOraValidationCo = ConvertToOrarendiOraValidationCo(orarendiOra);
                    oraValidationCo.OrarendiOraValidationCo.Id = null;
                    oraValidationCo.IsChanged = true; //Központi óra miatt itt muszáj mentenünk

                    SaveOrUpdateOrarendiOrak(dalHandler, oraValidationCo, FelhasznaloId);
                }
            }

            return true;
        }

        private bool SaveOrUpdateOrarendiOrak(IDalHandler dalHandler, OraValidationCo co, int modifier)
        {
            if (!co.IsChanged)//ha nem volt feluleten modositas akkor nem mentunk semmit
            {
                return true;
            }
            var tanevInfo = new TanevHelper(new DalHandlerConnectionType(ConnectionType, dalHandler)).GetTanevInfo();
            if (co.OrarendiOraValidationCo.OraErvenyessegKezdete.Date == co.OrarendiOraValidationCo.OraErvenyessegVege.Date)
            {
                TanevrendHelper tanevrendjeHelper = new TanevrendHelper(new DalHandlerConnectionType(ConnectionType, dalHandler));
                if (!tanevrendjeHelper.IsOrarendiNap(co.OrarendiOraValidationCo.OraErvenyessegKezdete.Date, co.OrarendiOraValidationCo.OsztalyId, co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra))
                {
                    throw new BlException(OrarendResource.NemOrarendiNapHibaUzenet);
                }
            }

            ValidateCo(co.OrarendiOraValidationCo);
            var oraDal = dalHandler.OrarendiOra();
            var helyettesitesDAL = dalHandler.HelyettesitesDAL();
            var oOra = co.OrarendiOraValidationCo.Id.HasValue ? oraDal.Get(co.OrarendiOraValidationCo.Id.Value) : oraDal.Get();

            //csak a Date rész a fontos (majd Date típus kellene a DB-ben is)
            co.OrarendiOraValidationCo.OraErvenyessegKezdete = co.OrarendiOraValidationCo.OraErvenyessegKezdete.Date;
            co.OrarendiOraValidationCo.OraErvenyessegVege = co.OrarendiOraValidationCo.OraErvenyessegVege.Date;

            if (!co.OrarendiOraValidationCo.Id.HasValue || !co.OrarendiOraValidationCo.IsModification)
            {
                if (co.OrarendiOraValidationCo.IsMentorOra && (co.OrarendiOraValidationCo.ModositasiIdoszakTipus == (int)OraModositasiIdoszakTipus.TeljesIdoszak || co.OrarendiOraValidationCo.ModositasiIdoszakTipus == (int)OraModositasiIdoszakTipus.AdottNaptol))
                {
                    co.OrarendiOraValidationCo.OraErvenyessegVege = tanevInfo.UtolsoNap.AddDays(1);
                }
                co.OrarendiOraValidationCo.Id = AddNewOrarendiOra(co.OrarendiOraValidationCo, oOra, oraDal, helyettesitesDAL, groupId: null, regiOraIdHelyettesitesekUpdate: null);
                SaveOrUpdateOrarendiOraTulajdonsag(oraDal, co.OrarendiOraValidationCo);
                OrarendValtozasCacheMentes(co.OrarendiOraValidationCo.Id, oraKezdete: oOra.OraKezdete);
                return true;
            }
            var eredetiGroupId = oOra.OrarendiOraGroupId;

            if (co.TorlendoHelyettesitesek.Count > 0)
            {// Helyettesitesek torlese
                foreach (OrarendiOraTanitasiOraCo item in co.TorlendoHelyettesitesek)
                {
                    int tanitasiOaID = item.Id;
                    if (tanitasiOaID != 0 && item.OraTipus != nameof(CalendarOraTypeEnum.OrarendiOra))
                    {
                        var tanitasiOraDAL = dalHandler.TanitasiOra();
                        var tanitasiOra = tanitasiOraDAL.Get(tanitasiOaID);
                        tanitasiOra.OrarendiOraGroupId = null;
                        tanitasiOraDAL.Update(tanitasiOra);
                    }
                    helyettesitesDAL.Delete(item.HelyettesitesId.Value);
                }
            }

            if (co.TorlendoSzamonkeresElorejelzesek.Count > 0)
            {// Helyettesitesek torlese
                var szamonkeresElorejelzesDAL = dalHandler.SzamonkeresElorejelzes();
                foreach (BejelentettSzamonkeresekItemCo item in co.TorlendoSzamonkeresElorejelzesek)
                {
                    szamonkeresElorejelzesDAL.Delete(item.Id);
                }
            }

            if (co.OrarendiOraValidationCo.OsztalyId != oOra.OsztalyCsoportId ||
                co.OrarendiOraValidationCo.TanarId != oOra.TanarId ||
                co.OrarendiOraValidationCo.TantargyId != oOra.TantargyId ||
                co.OrarendiOraValidationCo.Oraszam != oOra.Oraszam ||
                co.OrarendiOraValidationCo.OraKezdete != oOra.OraKezdete ||
                co.OrarendiOraValidationCo.OraVege != oOra.OraVege)
            {
                dalHandler.TanitasiOra().UpdateOrarendiOraGroupIds(oOra.ID, oOra.OrarendiOraGroupId, co.OrarendiOraValidationCo.OraErvenyessegKezdete, co.OrarendiOraValidationCo.OraErvenyessegVege, co.OrarendiOraValidationCo.ModificationDate, co.OrarendiOraValidationCo.ModositasiIdoszakTipus, modifier);
            }
            var eredetiKezdete = oOra.OraErvenyessegKezdete;
            var eredetiVege = oOra.OraErvenyessegVege.Value;
            var modositottGroupId = co.OsztalyTanarTantargyModosult ? (int?)null : co.GroupId.HasValue ? co.GroupId : eredetiGroupId;
            switch (co.OrarendiOraValidationCo.ModositasiIdoszakTipus)
            {
                default:
                case (int)OraModositasiIdoszakTipus.TeljesIdoszak:
                    UpdateOrarendiOraTeljesIdoszak(co.OrarendiOraValidationCo, oOra, oraDal);
                    SaveOrUpdateOrarendiOraTulajdonsag(oraDal, co.OrarendiOraValidationCo);
                    break;
                case (int)OraModositasiIdoszakTipus.AdottNapig:
                    // bal oldal (új óra)
                    co.OrarendiOraValidationCo.OraErvenyessegKezdete = eredetiKezdete;
                    co.OrarendiOraValidationCo.OraErvenyessegVege = co.OrarendiOraValidationCo.ModificationDate.Date.AddDays(1);

                    var newOra_napig = oraDal.Get();
                    if (co.OrarendiOraValidationCo.OraErvenyessegKezdete <= co.OrarendiOraValidationCo.OraErvenyessegVege)
                    {
                        co.OrarendiOraValidationCo.Id = AddNewOrarendiOra(co.OrarendiOraValidationCo, newOra_napig, oraDal, helyettesitesDAL, modositottGroupId, regiOraIdHelyettesitesekUpdate: oOra.ID);
                        SaveOrUpdateOrarendiOraTulajdonsag(oraDal, co.OrarendiOraValidationCo);
                    }

                    // jobb oldal (eredeti óra)
                    oOra.OraErvenyessegKezdete = co.OrarendiOraValidationCo.ModificationDate.Date.AddDays(1);
                    if (oOra.OraErvenyessegKezdete <= oOra.OraErvenyessegVege)
                    {
                        oraDal.FullUpdate(oOra, co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra);
                    }
                    else
                    {
                        oraDal.Delete(oOra, co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra);
                    }

                    break;
                case (int)OraModositasiIdoszakTipus.AdottNaptol:
                    // jobb oldal (új óra)
                    co.OrarendiOraValidationCo.OraErvenyessegKezdete = co.OrarendiOraValidationCo.ModificationDate.Date;

                    var utolsoTanitasiNap = tanevInfo.UtolsoTanitasiNap;
                    if (eredetiVege.Date.AddDays(1) <= utolsoTanitasiNap)
                    {
                        co.OrarendiOraValidationCo.OraErvenyessegVege = eredetiVege.Date.AddDays(1);
                    }
                    else
                    {
                        co.OrarendiOraValidationCo.OraErvenyessegVege = eredetiVege.Date;
                    }

                    var newOra_naptol = oraDal.Get();
                    if (co.OrarendiOraValidationCo.OraErvenyessegKezdete < co.OrarendiOraValidationCo.OraErvenyessegVege)
                    {
                        co.OrarendiOraValidationCo.Id = AddNewOrarendiOra(co.OrarendiOraValidationCo, newOra_naptol, oraDal, helyettesitesDAL, modositottGroupId, regiOraIdHelyettesitesekUpdate: oOra.ID);
                        SaveOrUpdateOrarendiOraTulajdonsag(oraDal, co.OrarendiOraValidationCo);
                    }

                    // bal oldal (eredeti óra)
                    oOra.OraErvenyessegVege = co.OrarendiOraValidationCo.ModificationDate.Date;
                    if (eredetiKezdete == eredetiVege.Date.AddDays(1) || oOra.OraErvenyessegKezdete < oOra.OraErvenyessegVege)
                    {
                        oraDal.FullUpdate(oOra, co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra);
                    }
                    else
                    {
                        oraDal.Delete(oOra, co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra);
                    }
                    break;
                case (int)OraModositasiIdoszakTipus.EgyOra:
                    // jobb oldal (eredeti óra)
                    var newOra_egynap = oraDal.Get();
                    var newOra_egynapCO = ConvertToOrarendiOraValidationCo(oOra);
                    newOra_egynapCO.IsFromSzervezet = co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra;
                    if (co.OrarendiOraValidationCo.ModificationDate.Date.AddDays(1) < eredetiVege)
                    {
                        newOra_egynapCO.OraErvenyessegKezdete = co.OrarendiOraValidationCo.ModificationDate.Date.AddDays(1);
                        newOra_egynapCO.OraErvenyessegVege = eredetiVege;
                        newOra_egynapCO.Id = 0;
                        var newOraId = AddNewOrarendiOra(newOra_egynapCO, newOra_egynap, oraDal, helyettesitesDAL, eredetiGroupId, regiOraIdHelyettesitesekUpdate: oOra.ID);
                        DuplicateOrarendiOraTulajdonsag(eredetiGroupId.Value, newOraId);
                    }

                    // új
                    co.OrarendiOraValidationCo.OraErvenyessegKezdete = co.OrarendiOraValidationCo.ModificationDate.Date;
                    co.OrarendiOraValidationCo.OraErvenyessegVege = co.OrarendiOraValidationCo.ModificationDate.Date;
                    var newOra_egynap2 = oraDal.Get();
                    co.OrarendiOraValidationCo.Id = AddNewOrarendiOra(co.OrarendiOraValidationCo, newOra_egynap2, oraDal, helyettesitesDAL, modositottGroupId, regiOraIdHelyettesitesekUpdate: oOra.ID);
                    SaveOrUpdateOrarendiOraTulajdonsag(oraDal, co.OrarendiOraValidationCo);

                    // bal oldal (eredeti óra)
                    oOra.OraErvenyessegVege = co.OrarendiOraValidationCo.ModificationDate.Date;
                    if (oOra.OraErvenyessegKezdete < oOra.OraErvenyessegVege)
                    {
                        oraDal.FullUpdate(oOra, co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra);
                    }
                    else
                    {
                        oraDal.Delete(oOra, co.OrarendiOraValidationCo.IsFromSzervezet || co.OrarendiOraValidationCo.IsMentorOra);
                    }

                    break;
            }

            dalHandler.OrarendiOra().GenerateTeljesOrarend(IntezmenyId, TanevId);

            return true;
        }

        public DataSet GetOrarendiOrakByTantargyId(int tantargyId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra(GridParameters);
                return dal.GetOrarendiOrakByTantargyId(tantargyId, TanevId);
            });
        }

        public ElozoOraAdataiCO GetElozoOraAdatai(int tantargyId, int osztalyCsoportId, int tanarId, DateTime oraKezdete)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra(GridParameters);
                var ds = dal.GetElozoOraAdatai(tantargyId, osztalyCsoportId, tanarId, oraKezdete, IntezmenyId, TanevId);
                var result = new ElozoOraAdataiCO();

                if (ds.Tables[0].Rows.Count > 0)
                {
                    var row = ds.Tables[0].Rows[0];

                    if (!SDAConvert.ToNullableInt32(row["Id"]).HasValue)
                    {
                        return null;
                    }

                    result.ElozoOraTemaja = SDAConvert.ToString(row["Tema"]);

                    DateTime? datum = SDAConvert.ToDateTime(row["Datum"]);
                    string elozoOraDatuma = datum.HasValue ? datum.Value.ToString("yyyy.MM.dd.") : string.Empty;

                    int? evesSorszam = SDAConvert.ToNullableInt32(row["EvesSorszam"]);
                    result.ElozoOraEvesSorszama = evesSorszam.HasValue ? evesSorszam.ToString() : OrarendResource.NemSzamozott;

                    string helyettes = string.Empty;

                    string helyettesNev = SDAConvert.ToString(row["HelyettesNev"]);
                    if (!string.IsNullOrWhiteSpace(helyettesNev))
                    {
                        helyettes = $"{OrarendResource.Helyettesitett}: {helyettesNev}";
                    }
                    result.ElozoOraAdatai = $"{result.ElozoOraTemaja}, {elozoOraDatuma} {OrarendResource.EvesSorszama}: {result.ElozoOraEvesSorszama}. {helyettes}";


                    return result;
                }

                return null;
            });
        }

        public ElozoOraAdataiCO GetElozoOraAdataiMobile(int tantargyId, int osztalyCsoportId, int tanarId, DateTime oraKezdete)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra(GridParameters);
                var ds = dal.GetElozoOraAdatai(tantargyId, osztalyCsoportId, tanarId, oraKezdete, IntezmenyId, TanevId);
                var result = new ElozoOraAdataiCO();

                if (ds.Tables[0].Rows.Count > 0)
                {
                    var row = ds.Tables[0].Rows[0];

                    if (!SDAConvert.ToNullableInt32(row["Id"]).HasValue)
                    {
                        return null;
                    }

                    var datum = SDAConvert.ToDateTime(row["Datum"]);
                    string elozoOraDatuma = datum.HasValue ? datum.Value.ToString("yyyy.MM.dd.") : string.Empty;
                    int? evesSorszam = SDAConvert.ToNullableInt32(row["EvesSorszam"]);

                    result.ElozoOraTemaja = SDAConvert.ToString(row["Tema"]);
                    result.ElozoOraEvesSorszama = evesSorszam.HasValue ? evesSorszam.ToString() : null;
                    result.ElozoOraAdatai = $"{elozoOraDatuma} {result.ElozoOraTemaja}";

                    return result;
                }

                return null;
            });
        }

        public int GetHetirend(int orarendioraId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var oOra = h.OrarendiOra().Get(orarendioraId);

                return oOra.Hetirend;
            });
        }

        public OrarendiOraCO GetOrarendiOraById(int orarendioraId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var oOra = h.OrarendiOra().Get(orarendioraId);
                var result = new OrarendiOraCO
                {
                    ID = orarendioraId,
                    Bontott = oOra.Bontott,
                    CsengetesiRendOraID = oOra.CsengetesirendOraId.HasValue ? oOra.CsengetesirendOraId.Value : -1,
                    CsengetesiRendID = oOra.CsengetesirendId,
                    Differencialt = oOra.Differencialt,
                    Drama = oOra.Drama,
                    FoglalkozasID = oOra.FoglalkozasId > 0 ? oOra.FoglalkozasId : (int?)null,
                    Hetirend = oOra.Hetirend,
                    HetNapja = oOra.HetNapja,
                    IKTTanora = oOra.IKTTanora,
                    IPRTanora = oOra.IPRTanora,
                    Kooperativ = oOra.Kooperativ,
                    Meres = oOra.Meres,
                    MindennaposTestneveles = oOra.MindennaposTestneveles,
                    NemSzakrendszeruOra = oOra.NemSzakrendszeruOra,
                    NemzetisegiOra = oOra.NemzetisegiOra,
                    IsFelnottoktatasiSzerzodes = oOra.IsFelnottoktatasiSzerzodes,
                    OraErvenyessegKezdete = oOra.OraErvenyessegKezdete,
                    OraErvenyessegVege = oOra.OraErvenyessegVege.Value,
                    OraKezdete = oOra.OraKezdete.Value,
                    OraVege = oOra.OraVege.Value,
                    Oraszam = oOra.Oraszam,
                    OsztalyCsoportId = oOra.OsztalyCsoportId,
                    ParhuzamosOra = oOra.ParhuzamosOra,
                    Sorszamozando = oOra.Sorszamozando,
                    TAMOPOra = oOra.TAMOPOra,
                    KIPOra = oOra.KIPOra,
                    VEKOP73317 = oOra.VEKOP73317,
                    KAPOra = oOra.KAPOra,
                    TantargyId = oOra.TantargyId,
                    TeremID = oOra.TeremId,
                    TanarId = oOra.TanarId,
                    Tiop = oOra.TIOP12,
                    Tulora = oOra.Tulora,
                    Multikulturalis = oOra.MultikulturalisOra,
                    EFOP32317 = oOra.EFOP32317,
                    KomplexOra = oOra.KomplexOra,
                    GINOP623 = oOra.GINOP623,
                    EFOP31716EselyteremtesAKoznevelesben = oOra.EFOP31716,
                    EFOP33717 = oOra.EFOP33717,
                    TIOP11112120120001 = oOra.TIOP1111212012001,
                    DFHT = oOra.IsDfhtOra,
                    Rahangolodas = oOra.IsRahangolodas,
                    Testmozgas = oOra.IsTestmozgasAlapuAlprogram,
                    Muveszet = oOra.IsMuveszetAlapuAlprogram,
                    Eletgyakorlat = oOra.IsEletgyakorlatAlapuAlprogram,
                    Logika = oOra.IsLogikaAlapuAlprogram,
                    TeOrad = oOra.IsTeorad,
                    DigitalisAlapProgram = oOra.IsDigitalisAlapuAlprogram,
                    TeremNev = oOra.Terem.Nev,
                    HetNapjaNev = oOra.HetNapja.GetDisplayName<HetNapjaTipusEnum>(TanevId),
                    OsztalyCsoportNev = oOra.OsztalyCsoport.Nev,
                    TanarNev = oOra.OraTulajdonos?.NyomtatasiNev,
                    TanarAlkalmazottNev = oOra.Tanar?.NyomtatasiNev,
                    TantargyNev = oOra.Tantargy.Nev,
                    HetirendNev = oOra.Hetirend.GetDisplayName<HetiRendTipusEnum>(TanevId),
                    TanoranKivuliFoglalkozas = !oOra.CsengetesirendId.HasValue,
                    EFOP23517201700038Miapalya = oOra.EFOP23517,
                };

                //GetOrarendiOraTulajdonsagok(result, oOra.OrarendiOraGroupId.HasValue ? oOra.OrarendiOraGroupId.Value : orarendioraId);
                GetOrarendiOraTulajdonsagok(result, orarendioraId);

                if (!oOra.Oraszam.HasValue)
                {
                    result.OraIdopont = $"{result.OraKezdete.ToShortTimeString()} - {result.OraVege.ToShortTimeString()}";
                }

                if (oOra.FoglalkozasId.IsEntityId())
                {
                    IFoglalkozas foglalkozas = GetFoglalkozas(h.Foglalkozas(), oOra.FoglalkozasId);
                    result.FoglalkozasNev = foglalkozas != null ? oOra.Foglalkozas.Nev : string.Empty;
                }

                if (oOra.CsengetesirendId.IsEntityId())
                {
                    ICsengetesiRend csengetesiRend = GetCsengetesiRend(h.CsengetesiRend(), oOra.CsengetesirendId ?? 0);
                    result.CsengetesiRendNev = csengetesiRend != null ? csengetesiRend.Nev : string.Empty;
                }

                return result;
            });
        }

        public void GetOrarendiOraTulajdonsagok(OrarendiOraCO orarendiOraCO, int orarendioraId)
        {
            var ds = GetOrarendiOraTulajdonsag(orarendioraId);

            if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                foreach (DataRow row in ds.Tables[0].Rows)
                {
                    var oraTulajdonsagId = SDAConvert.ToInt32(row["OraTulajdonsagId"]);
                    var oraTulajdonsagTipusEnum = (OraTulajdonsagTipusEnum)oraTulajdonsagId;
                    var ertek = SDAConvert.ToBooleanFromTF(row["Ertek"]);

                    switch (oraTulajdonsagTipusEnum)
                    {
                        case OraTulajdonsagTipusEnum.online_ora:
                            orarendiOraCO.OnlineOra = ertek;
                            break;
                        case OraTulajdonsagTipusEnum._2019_2020_as_tanev_tananyaganak_ismetlese:
                            orarendiOraCO.TanevTananyaganakIsmetlese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum._2019_2020_as_tanev_tananyaganak_kiegeszitese:
                            orarendiOraCO.TanevTananyaganakKiegeszitese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_digitalis_keszsegfejlesztese:
                            orarendiOraCO.TanulokDigitalisKeszsegfejlesztese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.projektmunka:
                            orarendiOraCO.Projektmunka = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_kompenzacios_iraskeszseg_fejlesztese:
                            orarendiOraCO.TanulokKompenzaciosIraskeszsegFejlesztese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_kompenzacios_olvasasi_kepesseg_fejlesztese:
                            orarendiOraCO.TanulokKompenzaciosOlvasasiKepessegFejlesztese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_matematikai_gondolkodasi_kepessegenek_kompenzacios_fejlesztese:
                            orarendiOraCO.TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_nyelvi_kepessegenek_kompenzacios_fejlesztese:
                            orarendiOraCO.TanulokNyelviKepessegenekKompenzaciosFejlesztese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_onmegismeresenek_segitese:
                            orarendiOraCO.TanulokOnmegismeresenekSegitese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_onallosagra_nevelese:
                            orarendiOraCO.TanulokOnallosagraNevelese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_tanulasszervezesi_kompenzacios_technikajanak_erositese:
                            orarendiOraCO.TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_orientacios_tamogatasa:
                            orarendiOraCO.TanulokOrientaciosTamogatasa = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_szocialitasanak_fejlesztese:
                            orarendiOraCO.TanulokSzocialitasanakFejlesztese = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.a_tanulok_tovabbhaladasat_elokeszito_tevekenysegek:
                            orarendiOraCO.TanulokTovabbhaladasatElokeszitoTevekenysegek = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.pedagogus_altal_jelzett_egyeni_esetkezeles:
                            orarendiOraCO.PedagogusAltalJelzettEgyeniEsetkezeles = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.projektmunka_tamogatasa:
                            orarendiOraCO.ProjektmunkaTamogatasa = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.digitalis_keszsegfejlesztes:
                            orarendiOraCO.DigitalisKeszsegfejlesztes = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.kozossegi_munka_tamogatasa:
                            orarendiOraCO.KozossegiMunkaTamogatasa = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.tanora_elokeszitesenek_tamogatasa:
                            orarendiOraCO.TanoraElokeszitesenekTamogatasa = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.tanora_lebonyolitasanak_tamogatasa:
                            orarendiOraCO.TanoraLebonyolitasanakTamogatasa = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.napkozis_tevekenyseg_kereteben_egyeni_fejlesztes:
                            orarendiOraCO.NapkozisTevekenysegKeretebenEgyeniFejlesztes = ertek;
                            break;
                        case OraTulajdonsagTipusEnum.egybefuggo_szakmai_gyakorlat:
                            orarendiOraCO.IsEgybefuggoGyakorlat = ertek;
                            break;
                        default:
                            break;
                    }
                }
            }
        }

        private DataSet GetOrarendiOraTulajdonsag(int orarendiOraId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra();
                return dal.GetOrarendiOraTulajdonsag(orarendiOraId, TanevId);
            });
        }

        private void SaveOrUpdateOrarendiOraTulajdonsag(IOrarendiOraDal orarendiOraDal, OrarendiOraValidationCo co)
        {
            var oraTulajdonsagok = GetOraTulajdonsagok(co);

            if (co.Id.IsEntityId())
            {
                orarendiOraDal.SaveOrUpdateOrarendiOraTulajdonsag(oraTulajdonsagok, co.Id.Value, IntezmenyId, TanevId);
            }
        }

        private void DuplicateOrarendiOraTulajdonsag(int oldOrarendiOraId, int newOrarendiOraId)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                h.OrarendiOra().DuplicateOrarendiOraTulajdonsag(oldOrarendiOraId, newOrarendiOraId);
            });
        }

        private Dictionary<int, bool> GetOraTulajdonsagok(OrarendiOraValidationCo co)
        {
            var oraTulajdonsagok = new Dictionary<int, bool>();

            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.online_ora, co.OnlineOra);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum._2019_2020_as_tanev_tananyaganak_ismetlese, co.TanevTananyaganakIsmetlese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum._2019_2020_as_tanev_tananyaganak_kiegeszitese, co.TanevTananyaganakKiegeszitese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_digitalis_keszsegfejlesztese, co.TanulokDigitalisKeszsegfejlesztese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.projektmunka, co.Projektmunka);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_kompenzacios_iraskeszseg_fejlesztese, co.TanulokKompenzaciosIraskeszsegFejlesztese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_kompenzacios_olvasasi_kepesseg_fejlesztese, co.TanulokKompenzaciosOlvasasiKepessegFejlesztese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_matematikai_gondolkodasi_kepessegenek_kompenzacios_fejlesztese, co.TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_nyelvi_kepessegenek_kompenzacios_fejlesztese, co.TanulokNyelviKepessegenekKompenzaciosFejlesztese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_onmegismeresenek_segitese, co.TanulokOnmegismeresenekSegitese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_onallosagra_nevelese, co.TanulokOnallosagraNevelese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_tanulasszervezesi_kompenzacios_technikajanak_erositese, co.TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_orientacios_tamogatasa, co.TanulokOrientaciosTamogatasa);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_szocialitasanak_fejlesztese, co.TanulokSzocialitasanakFejlesztese);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.a_tanulok_tovabbhaladasat_elokeszito_tevekenysegek, co.TanulokTovabbhaladasatElokeszitoTevekenysegek);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.pedagogus_altal_jelzett_egyeni_esetkezeles, co.PedagogusAltalJelzettEgyeniEsetkezeles);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.projektmunka_tamogatasa, co.ProjektmunkaTamogatasa);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.digitalis_keszsegfejlesztes, co.DigitalisKeszsegfejlesztes);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.kozossegi_munka_tamogatasa, co.KozossegiMunkaTamogatasa);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.tanora_elokeszitesenek_tamogatasa, co.TanoraElokeszitesenekTamogatasa);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.tanora_lebonyolitasanak_tamogatasa, co.TanoraLebonyolitasanakTamogatasa);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.napkozis_tevekenyseg_kereteben_egyeni_fejlesztes, co.NapkozisTevekenysegKeretebenEgyeniFejlesztes);
            oraTulajdonsagok.Add((int)OraTulajdonsagTipusEnum.egybefuggo_szakmai_gyakorlat, co.IsEgybefuggoGyakorlat);

            return oraTulajdonsagok;
        }

        private OrarendiOraValidationCo ConvertToOrarendiOraValidationCo(IOrarendiOra oOra)
        {
            return new OrarendiOraValidationCo
            {
                Id = oOra.ID,
                Bontott = oOra.Bontott,
                CsengetesiRendOraId = oOra.CsengetesirendOraId.HasValue ? oOra.CsengetesirendOraId.Value : -1,
                CsengetesiRendId = oOra.CsengetesirendId,
                Differencialt = oOra.Differencialt,
                Drama = oOra.Drama,
                FoglalkozasID = oOra.FoglalkozasId > 0 ? oOra.FoglalkozasId : (int?)null,
                HetirendId = oOra.Hetirend,
                HetNapjaId = oOra.HetNapja,
                IKTTanora = oOra.IKTTanora,
                IPRTanora = oOra.IPRTanora,
                Kooperativ = oOra.Kooperativ,
                Meres = oOra.Meres,
                MindennaposTestneveles = oOra.MindennaposTestneveles,
                NemSzakrendszeruOra = oOra.NemSzakrendszeruOra,
                NemzetisegiOra = oOra.NemzetisegiOra,
                IsFelnottoktatasiSzerzodes = oOra.IsFelnottoktatasiSzerzodes,
                OraErvenyessegKezdete = oOra.OraErvenyessegKezdete,
                OraErvenyessegVege = oOra.OraErvenyessegVege.Value,
                OraKezdete = oOra.OraKezdete.Value,
                OraVege = oOra.OraVege.Value,
                Oraszam = oOra.Oraszam,
                OsztalyId = oOra.OsztalyCsoportId,
                ParhuzamosOra = oOra.ParhuzamosOra,
                Sorszamozando = oOra.Sorszamozando,
                TAMOPOra = oOra.TAMOPOra,
                KIPOra = oOra.KIPOra,
                VEKOP73317 = oOra.VEKOP73317,
                KAPOra = oOra.KAPOra,
                TantargyId = oOra.TantargyId,
                TeremId = oOra.TeremId,
                TanarId = oOra.TanarId,
                Tiop = oOra.TIOP12,
                Tulora = oOra.Tulora,
                Multikulturalis = oOra.MultikulturalisOra,
                EFOP32317 = oOra.EFOP32317,
                KomplexOra = oOra.KomplexOra,
                GINOP623 = oOra.GINOP623,
                EFOP31716EselyteremtesAKoznevelesben = oOra.EFOP31716,
                EFOP33717 = oOra.EFOP33717,
                TIOP11112120120001 = oOra.TIOP1111212012001,
                DFHT = oOra.IsDfhtOra,
                Rahangolodas = oOra.IsRahangolodas,
                Testmozgas = oOra.IsTestmozgasAlapuAlprogram,
                Muveszet = oOra.IsMuveszetAlapuAlprogram,
                Eletgyakorlat = oOra.IsEletgyakorlatAlapuAlprogram,
                Logika = oOra.IsLogikaAlapuAlprogram,
                TeOrad = oOra.IsTeorad,
                DigitalisAlapProgram = oOra.IsDigitalisAlapuAlprogram,
                IsEgyediNap = oOra.EgyediNap,
                KozpontiOraGroupId = oOra.KozpontiOraGroupId,
                KozpontilagToroltOraGroupId = oOra.KozpontilagToroltOraGroupID,
                Torolt = oOra.Torolt,
                EFOP23517201700038Miapalya = oOra.EFOP23517,
                GroupId = oOra.OrarendiOraGroupId,
                OnlineOra = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.online_ora),
                DigitalisKeszsegfejlesztes = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.digitalis_keszsegfejlesztes),
                KozossegiMunkaTamogatasa = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.kozossegi_munka_tamogatasa),
                NapkozisTevekenysegKeretebenEgyeniFejlesztes = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.napkozis_tevekenyseg_kereteben_egyeni_fejlesztes),
                PedagogusAltalJelzettEgyeniEsetkezeles = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.pedagogus_altal_jelzett_egyeni_esetkezeles),
                Projektmunka = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.projektmunka),
                ProjektmunkaTamogatasa = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.projektmunka_tamogatasa),
                TanevTananyaganakIsmetlese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum._2019_2020_as_tanev_tananyaganak_ismetlese),
                TanevTananyaganakKiegeszitese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum._2019_2020_as_tanev_tananyaganak_kiegeszitese),
                TanoraElokeszitesenekTamogatasa = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.tanora_elokeszitesenek_tamogatasa),
                TanoraLebonyolitasanakTamogatasa = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.tanora_lebonyolitasanak_tamogatasa),
                TanulokDigitalisKeszsegfejlesztese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_digitalis_keszsegfejlesztese),
                TanulokKompenzaciosIraskeszsegFejlesztese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_kompenzacios_iraskeszseg_fejlesztese),
                TanulokKompenzaciosOlvasasiKepessegFejlesztese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_kompenzacios_olvasasi_kepesseg_fejlesztese),
                TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_matematikai_gondolkodasi_kepessegenek_kompenzacios_fejlesztese),
                TanulokNyelviKepessegenekKompenzaciosFejlesztese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_nyelvi_kepessegenek_kompenzacios_fejlesztese),
                TanulokOnallosagraNevelese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_onallosagra_nevelese),
                TanulokOnmegismeresenekSegitese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_onmegismeresenek_segitese),
                TanulokOrientaciosTamogatasa = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_orientacios_tamogatasa),
                TanulokSzocialitasanakFejlesztese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_szocialitasanak_fejlesztese),
                TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_tanulasszervezesi_kompenzacios_technikajanak_erositese),
                TanulokTovabbhaladasatElokeszitoTevekenysegek = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.a_tanulok_tovabbhaladasat_elokeszito_tevekenysegek),
                IsEgybefuggoGyakorlat = GetOrarendiOraTulajdonsagValue(oOra, OraTulajdonsagTipusEnum.egybefuggo_szakmai_gyakorlat),
            };
        }

        private bool GetOrarendiOraTulajdonsagValue(IOrarendiOra oOra, OraTulajdonsagTipusEnum oraTulajdonsagTipusEnum)
        {
            return oOra.OrarendiOraTulajdonsag?.FirstOrDefault(x => x.OraTulajdonsagId == (int)oraTulajdonsagTipusEnum && !x.Torolt)?.BoolErtek ?? false;
        }

        private IFoglalkozas GetFoglalkozas(IFoglalkozasDal foglalkozasDal, int foglalkozasId)
        {
            try
            {
                return foglalkozasDal.Get(foglalkozasId);
            }
            catch
            {
                return null;
            }
        }

        private ICsengetesiRend GetCsengetesiRend(ICsengetesiRendDal csengetesiRendDal, int csengetesiRendId)
        {
            try
            {
                return csengetesiRendDal.Get(csengetesiRendId);
            }
            catch
            {
                return null;
            }
        }

        public int GetTanarIdByOrarendiOra(int orarendioraId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var oOra = h.OrarendiOra().Get(orarendioraId);
                if (oOra.TanarId > 0)
                {
                    return oOra.TanarId;
                }

                var oFoglalkozas = h.Foglalkozas().Get(oOra.FoglalkozasId);

                return oFoglalkozas.TanarId;
            });
        }

        private List<OrarendiOraTanitasiOraCo> GetOrarendiOrakUtkozesValidaciohoz(IDalHandler dalHandler, DateTime ervenyessegKezdete, DateTime ervenyessegVege, int hetNapja, DateTime? oraKezdete, DateTime? oraVege)
        {
            List<OrarendiOraTanitasiOraCo> oraList = new List<OrarendiOraTanitasiOraCo>();

            var dal = dalHandler.OrarendiOra();
            DataSet ds = dal.GetOrarend(IntezmenyId, TanevId, ervenyessegKezdete, ervenyessegVege.AddDays(1), null, null, null, true, OrarendTipusEnum.Minden, null, null, false, null, oraKezdete, oraVege, hetNapja);
            if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
            {
                oraList = OrarendiOraTanitasiOraCo.MapOrarendiOraTanitasiOraCoListFromDataTable(ds.Tables[0]).ToList();
            }
            return oraList;
        }

        public List<AdminKozpontiOrakOrarendiOraCo> GetGroupedKozpontiOrakForSpecificTime(DateTime ervenyessegKezdete, DateTime ervenyessegVege, DateTime? oraKezdete, DateTime? oraVege, int hanyadikOra)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var kozpontiOrak = GetOrarendiOrakForSpecificTime(h, ervenyessegKezdete, ervenyessegVege, oraKezdete, oraVege, hanyadikOra, true);
                List<AdminKozpontiOrakOrarendiOraCo> kozpontiOraList = new List<AdminKozpontiOrakOrarendiOraCo>();

                foreach (IGrouping<Guid?, AdminKozpontiOrakOrarendiOraCo> kozpontiOra in kozpontiOrak.GroupBy(i => i.KozpontiOraGroupId))
                {
                    var oraNevek = new List<string>();

                    foreach (AdminKozpontiOrakOrarendiOraCo orarendiOra in kozpontiOra)
                    {
                        oraNevek.Add(orarendiOra.OsztalyNev);
                    }

                    kozpontiOraList.Add(new AdminKozpontiOrakOrarendiOraCo
                    {
                        KozpontiOraGroupId = kozpontiOra.Key,
                        OsztalyNev = string.Join(", ", oraNevek),
                        OraKezdete = kozpontiOra.FirstOrDefault()?.OraKezdete,
                        OraVege = kozpontiOra.FirstOrDefault()?.OraVege,
                        OraSorszam = kozpontiOra.FirstOrDefault()?.OraSorszam
                    });
                }

                return kozpontiOraList;
            });
        }

        public List<AdminKozpontiOrakOrarendiOraCo> GetOrarendiOrakForSpecificTime(DateTime ervenyessegKezdete, DateTime ervenyessegVege, DateTime? oraKezdete, DateTime? oraVege, int hanyadikOra, bool onlyKozpontiOrak = false, Guid? kozpontiOraId = null)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) => GetOrarendiOrakForSpecificTime(h, ervenyessegKezdete, ervenyessegVege, oraKezdete, oraVege, hanyadikOra, onlyKozpontiOrak, kozpontiOraId));
        }

        private List<AdminKozpontiOrakOrarendiOraCo> GetOrarendiOrakForSpecificTime(IDalHandler h, DateTime ervenyessegKezdete, DateTime ervenyessegVege, DateTime? oraKezdete, DateTime? oraVege, int hanyadikOra, bool onlyKozpontiOrak = false, Guid? kozpontiOraId = null)
        {
            var dal = h.OrarendiOra();
            DataSet ds = dal.GetOrarend(IntezmenyId, TanevId, ervenyessegKezdete, ervenyessegVege.AddDays(1), null, null, null, true, OrarendTipusEnum.Minden, null, null, false, null, oraKezdete, oraVege, null);
            List<AdminKozpontiOrakOrarendiOraCo> oraList = AdminKozpontiOrakOrarendiOraCo.MapGridModelFromOrarendiOraTanitasiOraCoList(ds.Tables[0]).ToList();

            return oraList.Where(i => i.OraSorszam.HasValue && i.OraSorszam.Value == hanyadikOra && (!onlyKozpontiOrak || i.KozpontiOraGroupId != null) && (kozpontiOraId == null || i.KozpontiOraGroupId == kozpontiOraId)).ToList();
        }

        public void DeleteAllKozpontiOraByGroupId(Guid kozpontiOraGroupId, DateTime start, DateTime end, int hanyadikOra)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                List<AdminKozpontiOrakOrarendiOraCo> kozpontiOraList = GetOrarendiOrakForSpecificTime(h, start, end, start, end, hanyadikOra, true, kozpontiOraGroupId);

                foreach (AdminKozpontiOrakOrarendiOraCo kozpontiOra in kozpontiOraList)
                {
                    DeletOrarendiOra(h, kozpontiOra.Id, (int)OraModositasiIdoszakTipus.EgyOra, DateTime.Now);
                }
            });
        }

        public List<AdminKozpontiOrakOrarendiOraCo> GetOrarendiOrakUtkozesKozpontiOraValidaciohoz(DateTime ervenyessegKezdete, DateTime ervenyessegVege, int hanyadikOra, List<AdminSelectedKozpontiOraCo> kozpontiOraList, bool onlyUtkozoOrak)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra();
                DataSet ds = dal.GetOrarend(IntezmenyId, TanevId, ervenyessegKezdete, ervenyessegVege.AddDays(1), null, null, null, true, OrarendTipusEnum.Minden, null, null, false, null, null, null, null);
                List<AdminKozpontiOrakOrarendiOraCo> filteredOraList = new List<AdminKozpontiOrakOrarendiOraCo>();

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    List<AdminKozpontiOrakOrarendiOraCo> oraList = AdminKozpontiOrakOrarendiOraCo.MapGridModelFromOrarendiOraTanitasiOraCoList(ds.Tables[0]).Where(o => o.OraSorszam == hanyadikOra).ToList();

                    foreach (AdminKozpontiOrakOrarendiOraCo orarendiOra in oraList)
                    {
                        bool partialConflict = false;
                        bool fullConflict = false;
                        bool noConflict = false;

                        foreach (AdminSelectedKozpontiOraCo kozpontiOra in kozpontiOraList)
                        {
                            if ((kozpontiOra.OsztalyId == orarendiOra.OsztalyCsoportId || kozpontiOra.OsztalyId == orarendiOra.OsztalyBontasId) &&
                                kozpontiOra.TanarId == orarendiOra.TanarId &&
                                kozpontiOra.TeremId == orarendiOra.TeremId &&
                                kozpontiOra.OraSzam == orarendiOra.OraSorszam)
                            {
                                fullConflict = true;

                                break;
                            }

                            if (kozpontiOra.OraSzam == orarendiOra.OraSorszam &&
                                ((kozpontiOra.OsztalyId == orarendiOra.OsztalyCsoportId || kozpontiOra.OsztalyId == orarendiOra.OsztalyBontasId) || kozpontiOra.TanarId == orarendiOra.TanarId))
                            {
                                partialConflict = true;
                            }
                            else if (kozpontiOra.OraSzam == orarendiOra.OraSorszam &&
                                     kozpontiOra.OsztalyId != orarendiOra.OsztalyCsoportId &&
                                     kozpontiOra.OsztalyId != orarendiOra.OsztalyBontasId &&
                                     kozpontiOra.TanarId != orarendiOra.TanarId)
                            {
                                noConflict = true;
                            }
                        }

                        if (onlyUtkozoOrak && (fullConflict || partialConflict))
                        {
                            orarendiOra.MustBeDeleted = fullConflict;
                            filteredOraList.Add(orarendiOra);
                        }

                        if (!onlyUtkozoOrak && noConflict && !partialConflict && !fullConflict)
                        {
                            filteredOraList.Add(orarendiOra);
                        }
                    }
                }

                return filteredOraList;
            });
        }

        private int TanevRendjeOraszamValidation(IDalHandler h, int osztaycsoportId, DateTime datum)
        {
            var dal = h.OrarendiOra();
            return dal.TanevRendjeOraszamValidation(osztaycsoportId, datum, TanevId);
        }

        private bool OrarendiOraTeremKapacitasEllenorzes(IDalHandler h, int teremId, int osztCsopId)
        {
            var t = h.Terem().Get(teremId);
            var dal = h.Tanulo();
            var ds = dal.GetCsoportTanuloi(osztCsopId, TanevId);

            int letszam = ds.Tables[0].Rows.Count;
            if (letszam > t.Kapacitas && t.Kapacitas > 0)
            {
                return true;
            }

            return false;
        }

        public DataSet GetOsztalyCsoportOrarendiOrai(int id, bool isFromSzervezet)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra(GridParameters);
                return dal.GetOsztalyCsoportOrarendiOrai(id, TanevId, isFromSzervezet);
            });
        }

        public DataSet GetOsztalyCsoportMegtartottOrai(int id)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.TanitasiOra(GridParameters);
                return dal.GetOsztalyCsoportMegtartottOrai(id, TanevId, IntezmenyId);
            });
        }

        public DataSet GetOrarendiOrakForTerem(int teremId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra(GridParameters);
                return dal.GetOrarendiOrakByTeremId(teremId, TanevId);
            });
        }

        public void DeleteOrarendiElem(int orarendiOraId)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra();
                dal.Delete(orarendiOraId);
            });
        }

        public bool DeletOrarendiOra(int orarendiOraId, int tipus, DateTime torlesDate)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                return DeletOrarendiOra(h, orarendiOraId, tipus, torlesDate);
            });
        }

        private bool DeletOrarendiOra(IDalHandler dalHandler, int orarendiOraId, int tipus, DateTime torlesDate)
        {
            var dal = dalHandler.OrarendiOra();
            var helyettesitesdal = dalHandler.HelyettesitesDAL();

            var ora = dal.Get(orarendiOraId);
            bool returnValue = false;
            try
            {
                var helyettesitesHelper = new HelyettesitesHelper(new DalHandlerConnectionType(ConnectionType, dalHandler));

                switch (tipus)
                {
                    case (int)OraModositasiIdoszakTipus.EgyOra:
                        var originOraErvenyyessegVege = ora.OraErvenyessegVege.Value.Date;
                        helyettesitesHelper.DeleteHelyettesitesek(orarendiOraId, torlesDate.Date, torlesDate.Date);
                        if (ora.OrarendiOraGroupId.HasValue)
                        {
                            dalHandler.SzamonkeresElorejelzes().DeleteAllByOraGroupIdAndIdoszak(TanevId, ora.OrarendiOraGroupId.Value, torlesDate.Date, torlesDate.Date);
                        }

                        if (ora.OraErvenyessegKezdete.Date == ora.OraErvenyessegVege.Value.Date)
                        //Ha csak egy óra volt, akkor törlés, nincs dátum állítás és nem kell új órarendi óra sem
                        {
                            OrarendValtozasCacheMentes(orarendiOraId, torlesDate);
                            dal.Delete(ora, false);
                            returnValue = true;
                        }
                        else
                        {
                            if (ora.OraErvenyessegKezdete == torlesDate.Date)
                            // NOTE: ha a sorozat első elemét akarja törölni, akkor a meglevő óra érvényesség kezdetét növeljük egy nappal,
                            //          és nincs szeletelés
                            {
                                ora.OraErvenyessegKezdete = torlesDate.AddDays(1).Date;
                            }
                            else
                            {
                                ora.OraErvenyessegVege = torlesDate.Date;
                                TanevCO tanevNapjaiAdatok;
                                TanevHelper helper = new TanevHelper(new DalHandlerConnectionType(ConnectionType, dalHandler));
                                tanevNapjaiAdatok = helper.GetTanevInfo();
                                if (torlesDate.AddDays(1).Date <= originOraErvenyyessegVege.Date && tanevNapjaiAdatok.KezdoNap.Date <= torlesDate.Date && torlesDate.Date < tanevNapjaiAdatok.UtolsoNap.Date)
                                {
                                    var newOra = dal.Get();
                                    var validationCo = ConvertToOrarendiOraValidationCo(ora);
                                    validationCo.OraErvenyessegKezdete = torlesDate.AddDays(1).Date;
                                    validationCo.OraErvenyessegVege = originOraErvenyyessegVege.Date;
                                    validationCo.IsFromSzervezet = false;
                                    newOra.ID = AddNewOrarendiOra(validationCo, newOra, dal, helyettesitesdal, ora.OrarendiOraGroupId, regiOraIdHelyettesitesekUpdate: orarendiOraId);

                                    OrarendiOraCO co = new OrarendiOraCO();
                                    GetOrarendiOraTulajdonsagok(co, orarendiOraId);
                                    SaveOrUpdateOrarendiOraTulajdonsag(dal, new OrarendiOraValidationCo
                                    {
                                        Id = newOra.ID,
                                        TanevTananyaganakIsmetlese = co.TanevTananyaganakIsmetlese,
                                        TanevTananyaganakKiegeszitese = co.TanevTananyaganakKiegeszitese,
                                        TanulokDigitalisKeszsegfejlesztese = co.TanulokDigitalisKeszsegfejlesztese,
                                        Projektmunka = co.Projektmunka,
                                        TanulokKompenzaciosIraskeszsegFejlesztese = co.TanulokKompenzaciosIraskeszsegFejlesztese,
                                        TanulokKompenzaciosOlvasasiKepessegFejlesztese = co.TanulokKompenzaciosOlvasasiKepessegFejlesztese,
                                        TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese = co.TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese,
                                        TanulokNyelviKepessegenekKompenzaciosFejlesztese = co.TanulokNyelviKepessegenekKompenzaciosFejlesztese,
                                        TanulokOnmegismeresenekSegitese = co.TanulokOnmegismeresenekSegitese,
                                        TanulokOnallosagraNevelese = co.TanulokOnallosagraNevelese,
                                        TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese = co.TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese,
                                        TanulokOrientaciosTamogatasa = co.TanulokOrientaciosTamogatasa,
                                        TanulokSzocialitasanakFejlesztese = co.TanulokSzocialitasanakFejlesztese,
                                        TanulokTovabbhaladasatElokeszitoTevekenysegek = co.TanulokTovabbhaladasatElokeszitoTevekenysegek,
                                        PedagogusAltalJelzettEgyeniEsetkezeles = co.PedagogusAltalJelzettEgyeniEsetkezeles,
                                        ProjektmunkaTamogatasa = co.ProjektmunkaTamogatasa,
                                        DigitalisKeszsegfejlesztes = co.DigitalisKeszsegfejlesztes,
                                        KozossegiMunkaTamogatasa = co.KozossegiMunkaTamogatasa,
                                        TanoraElokeszitesenekTamogatasa = co.TanoraElokeszitesenekTamogatasa,
                                        TanoraLebonyolitasanakTamogatasa = co.TanoraLebonyolitasanakTamogatasa,
                                        NapkozisTevekenysegKeretebenEgyeniFejlesztes = co.NapkozisTevekenysegKeretebenEgyeniFejlesztes,
                                        IsEgybefuggoGyakorlat = co.IsEgybefuggoGyakorlat
                                    });
                                }
                            }
                            if (ora.OraErvenyessegKezdete.Date > ora.OraErvenyessegVege.Value.Date)
                            {
                                dal.Delete(ora, false);
                            }
                            else
                            {
                                dal.Update(ora, false);
                            }

                            returnValue = true;
                            OrarendValtozasCacheMentes(orarendiOraId, torlesDate);
                        }

                        break;
                    case (int)OraModositasiIdoszakTipus.AdottNaptol:
                        OrarendValtozasCacheMentes(orarendiOraId, oraKezdete: ora.OraKezdete);
                        helyettesitesHelper.DeleteHelyettesitesek(orarendiOraId, torlesDate.Date, ora.OraErvenyessegVege.Value.Date);
                        if (ora.OrarendiOraGroupId.HasValue)
                        {
                            dalHandler.SzamonkeresElorejelzes().DeleteAllByOraGroupIdAndIdoszak(TanevId, ora.OrarendiOraGroupId.Value, torlesDate.Date, ora.OraErvenyessegVege.Value.Date);
                        }

                        if (torlesDate.Date <= ora.OraErvenyessegKezdete.Date)
                        {
                            dal.Delete(ora, false);
                            returnValue = true;
                        }
                        else
                        {
                            ora.OraErvenyessegVege = torlesDate.Date;
                            ora.OraErvenyessegKezdete = ora.OraErvenyessegKezdete.Date;
                            dal.Update(ora, false);
                            returnValue = true;
                        }

                        break;
                    case (int)OraModositasiIdoszakTipus.AdottNapig:
                        OrarendValtozasCacheMentes(orarendiOraId, oraKezdete: ora.OraKezdete);
                        helyettesitesHelper.DeleteHelyettesitesek(orarendiOraId, ora.OraErvenyessegKezdete.Date, torlesDate.AddDays(1).Date);
                        if (ora.OrarendiOraGroupId.HasValue)
                        {
                            dalHandler.SzamonkeresElorejelzes().DeleteAllByOraGroupIdAndIdoszak(TanevId, ora.OrarendiOraGroupId.Value, ora.OraErvenyessegKezdete.Date, torlesDate.AddDays(1).Date);
                        }

                        if (torlesDate.AddDays(1).Date >= ora.OraErvenyessegVege.Value.Date)
                        {
                            dal.Delete(ora, false);

                            returnValue = true;
                        }
                        else
                        {
                            ora.OraErvenyessegKezdete = torlesDate.AddDays(1).Date;
                            ora.OraErvenyessegVege = ora.OraErvenyessegVege.Value.Date;
                            dal.Update(ora, false);

                            returnValue = true;
                        }

                        break;
                    case (int)OraModositasiIdoszakTipus.TeljesIdoszak:
                        OrarendValtozasCacheMentes(orarendiOraId, oraKezdete: ora.OraKezdete);
                        helyettesitesHelper.DeleteHelyettesitesek(orarendiOraId, ora.OraErvenyessegKezdete.Date, ora.OraErvenyessegVege.Value.Date);
                        if (ora.OrarendiOraGroupId.HasValue)
                        {
                            dalHandler.SzamonkeresElorejelzes().DeleteAllByOraGroupIdAndIdoszak(TanevId, ora.OrarendiOraGroupId.Value, ora.OraErvenyessegKezdete.Date, ora.OraErvenyessegVege.Value.Date);
                        }

                        dal.Delete(ora, false);
                        returnValue = true;

                        break;
                }

                dalHandler.OrarendiOra().GenerateTeljesOrarend(IntezmenyId, TanevId);
            }
            catch (Framework.Entities.EntityDeleteFailedException)
            {
                return false;
            }

            return returnValue;
        }

        private bool DeletOrarendiOraCsere(IDalHandler dalHandler, int orarendiOraId, DateTime torlesDate)
        {
            return DeletOrarendiOra(dalHandler, orarendiOraId, (int)OraModositasiIdoszakTipus.EgyOra, torlesDate);
        }

        private bool SaveOrarendiOraCsere(IDalHandler dalHandler, OraValidationCo oraValidationCo, int modifier, DateTime saveDate)
        {
            oraValidationCo.OrarendiOraValidationCo.ModositasiIdoszakTipus = (int)OraModositasiIdoszakTipus.EgyOra;
            oraValidationCo.OrarendiOraValidationCo.Id = null;
            oraValidationCo.OrarendiOraValidationCo.ModificationDate = saveDate;
            oraValidationCo.OrarendiOraValidationCo.OraErvenyessegKezdete = saveDate;
            oraValidationCo.OrarendiOraValidationCo.OraErvenyessegVege = saveDate;
            return SaveOrUpdateOrarendiOrak(dalHandler, oraValidationCo, modifier);
        }

        public int GetOraszamByOrarendiOra(int id, CalendarOraTypeEnum calendarEnum)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var csengetesiRendOraDal = h.CsengetesiRendOrak();
                var orarendiOraDal = h.OrarendiOra();
                if (calendarEnum == CalendarOraTypeEnum.UresOra)
                {
                    var csRend = csengetesiRendOraDal.Get(id);
                    return csRend.Oraszam;
                }

                if (calendarEnum == CalendarOraTypeEnum.OrarendiOra)
                {
                    var oOra = orarendiOraDal.Get(id);
                    return oOra.Oraszam.Value;
                }

                return 0;
            });
        }

        public bool NemkotottMunkaidoUtkozesEllenorzes(int tanarId, DateTime kezdet, DateTime veg, DateTime datum, int? hetirendId, string nemKotottMunkaIdoGroupId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra();
                return dal.NemkotottMunkaidoUtkozesEllenorzes(IntezmenyId, TanevId, tanarId, kezdet, veg, datum, (int)HetiRendTipusEnum.MindegyikHet, hetirendId, nemKotottMunkaIdoGroupId);
            });
        }

        public List<int> GetElozoOranHianyzottTanulo(int tantargyId, int osztalycsoportId, DateTime datum)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra();
                return dal.GetElozoOranHianyzottTanulo(tantargyId, osztalycsoportId, datum, TanevId, IntezmenyId);
            });
        }

        private string CheckOrarendiOraOraszamIdopont(IDalHandler h, int csengetesiRendId, int oraszam, DateTime kezdet, DateTime vege)
        {
            var dal = h.CsengetesiRendOrak();
            var ds = dal.CheckOrarendiOraOraszamIdopont(IntezmenyId, TanevId, csengetesiRendId, oraszam);

            if (ds.Tables[0].Rows.Count > 0)
            {
                DataRow row = ds.Tables[0].Rows[0];

                if (new DateTime(2000, 01, 01, kezdet.Hour, kezdet.Minute, 0) != new DateTime(2000, 01, 01, row.Field<DateTime>("Kezdet").Hour, row.Field<DateTime>("Kezdet").Minute, 0)
                    || new DateTime(2000, 01, 01, vege.Hour, vege.Minute, 0) != new DateTime(2000, 01, 01, row.Field<DateTime>("Vege").Hour, row.Field<DateTime>("Vege").Minute, 0))
                {
                    return $"{OrarendResource.OrarendiOraOraszamIdopont} ( {oraszam}.{OrarendResource.Ora} {row.Field<DateTime>("Kezdet"):HH:mm}-{row.Field<DateTime>("Vege"):HH:mm} )";
                }

                return string.Empty;
            }

            return string.Empty;
        }

        public string CheckOrarendiOraOraszamIdopont(int csengetesiRendId, int oraszam, DateTime kezdet, DateTime vege)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) => CheckOrarendiOraOraszamIdopont(h, csengetesiRendId, oraszam, kezdet, vege));
        }

        public void UpdateOsszefuggoSzakGyakosOrakErvenyessegKezdete(DateTime newSzakGyakKezdoDatum)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                h.OrarendiOra().UpdateOsszefuggoSzakGyakosOrakErvenyessegKezdete(newSzakGyakKezdoDatum, TanevId);
            });
        }

        public void UpdateOsszefuggoSzakGyakosOrakErvenyessegVege(DateTime newSzakGyakVegDatum)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                h.OrarendiOra().UpdateOsszefuggoSzakGyakosOrakErvenyessegVege(newSzakGyakVegDatum, TanevId);
            });
        }

        public int GetNemNaplozottTanorakCount(DateTime tanevKezdDatum, int? tanarSrc)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var ds = h.OrarendiOra().GetNemNaplozottOrarendiOrak(new DataAccessManual.ParameterClasses.NemNaplozottOrakPCO
                {
                    IntezmenyId = IntezmenyId,
                    TanevId = TanevId,
                    Start = tanevKezdDatum,
                    End = DateTime.Now.Date,
                    TanarId = tanarSrc
                });

                return ds.Tables[0].Rows.Count;
            });
        }

        private static void UpdateOrarendiOraTeljesIdoszak(OrarendiOraValidationCo co, IOrarendiOra oOra, IOrarendiOraDal oraDal)
        {
            /*Todo: óra szeletelés megbeszélése mostmár lehetne*/
            oOra.Hetirend = co.HetirendId;
            oOra.HetNapja = co.HetNapjaId;
            oOra.IKTTanora = co.IKTTanora;
            oOra.IPRTanora = co.IPRTanora;
            oOra.Kooperativ = co.Kooperativ;
            oOra.Meres = co.Meres;
            oOra.MindennaposTestneveles = co.MindennaposTestneveles;
            oOra.NemSzakrendszeruOra = co.NemSzakrendszeruOra;
            oOra.NemzetisegiOra = co.NemzetisegiOra;
            oOra.IsFelnottoktatasiSzerzodes = co.IsFelnottoktatasiSzerzodes;

            /*Egy óra érvényesség dátum módosítás miatt szükséges*/
            if (co.OraErvenyessegKezdete == co.OraErvenyessegVege)
            {
                oOra.OraErvenyessegKezdete = co.OraErvenyessegKezdete;
                oOra.OraErvenyessegVege = co.OraErvenyessegVege;
                oOra.HetNapja = oraDal.GetHetNapjaByDate(co.OraErvenyessegKezdete);
            }
            else
            {
                if (oOra.OraErvenyessegKezdete == oOra.OraErvenyessegVege)
                {
                    oOra.OraErvenyessegKezdete = co.OraErvenyessegKezdete;
                    oOra.OraErvenyessegVege = co.OraErvenyessegVege.AddDays(1);
                }
                else
                {
                    oOra.OraErvenyessegKezdete = co.OraErvenyessegKezdete;
                    oOra.OraErvenyessegVege = co.OraErvenyessegVege;
                }
            }

            oOra.CsengetesirendId = co.CsengetesiRendId;
            oOra.OraKezdete = co.OraKezdete;
            oOra.OraVege = co.OraVege;

            if (co.Oraszam.HasValue)
            {
                oOra.Oraszam = co.Oraszam.Value;
            }

            if (co.CsengetesiRendOraId > 0)
            {
                oOra.CsengetesirendOraId = co.CsengetesiRendOraId;
            }

            if (co.FoglalkozasID.HasValue)
            {
                oOra.FoglalkozasId = co.FoglalkozasID.Value;
            }
            else
            {
                oOra.FoglalkozasId = -1;
            }

            if (co.OsztalyId.HasValue)
            {
                oOra.OsztalyCsoportId = co.OsztalyId.Value;
            }

            if (co.TantargyId.HasValue)
            {
                oOra.TantargyId = co.TantargyId.Value;
            }

            if (co.TanarId.HasValue)
            {
                oOra.TanarId = co.TanarId.Value;
            }

            oOra.Drama = co.Drama;
            oOra.ParhuzamosOra = co.ParhuzamosOra;
            oOra.Sorszamozando = co.Sorszamozando;
            oOra.TAMOPOra = co.TAMOPOra;
            oOra.KIPOra = co.KIPOra;
            oOra.VEKOP73317 = co.VEKOP73317;
            oOra.KAPOra = co.KAPOra;
            oOra.TeremId = co.TeremId;
            oOra.TIOP12 = co.Tiop;
            oOra.Tulora = co.Tulora;
            oOra.Bontott = co.Bontott;
            oOra.Differencialt = co.Differencialt;
            oOra.MultikulturalisOra = co.Multikulturalis;
            oOra.EFOP32317 = co.EFOP32317;
            oOra.KomplexOra = co.KomplexOra;
            oOra.GINOP623 = co.GINOP623;
            oOra.EFOP33717 = co.EFOP33717;
            oOra.EFOP31716 = co.EFOP31716EselyteremtesAKoznevelesben;
            oOra.TIOP1111212012001 = co.TIOP11112120120001;
            oOra.IsDfhtOra = co.DFHT;
            oOra.IsRahangolodas = co.Rahangolodas;
            oOra.IsTestmozgasAlapuAlprogram = co.Testmozgas;
            oOra.IsMuveszetAlapuAlprogram = co.Muveszet;
            oOra.IsEletgyakorlatAlapuAlprogram = co.Eletgyakorlat;
            oOra.IsLogikaAlapuAlprogram = co.Logika;
            oOra.IsTeorad = co.TeOrad;
            oOra.IsDigitalisAlapuAlprogram = co.DigitalisAlapProgram;
            oOra.EFOP23517 = co.EFOP23517201700038Miapalya;

            oraDal.FullUpdate(oOra, co.IsFromSzervezet || co.IsMentorOra);
        }

        private int AddNewOrarendiOra(OrarendiOraValidationCo co, IOrarendiOra oOra, IOrarendiOraDal oraDal, IHelyettesitesDAL helyettesitesDAL, int? groupId, int? regiOraIdHelyettesitesekUpdate = null)
        {
            oOra.Hetirend = co.HetirendId;
            oOra.HetNapja = co.HetNapjaId;
            oOra.IKTTanora = co.IKTTanora;
            oOra.IPRTanora = co.IPRTanora;
            oOra.Kooperativ = co.Kooperativ;
            oOra.Meres = co.Meres;
            oOra.MindennaposTestneveles = co.MindennaposTestneveles;
            oOra.NemSzakrendszeruOra = co.NemSzakrendszeruOra;
            oOra.NemzetisegiOra = co.NemzetisegiOra;
            oOra.IsFelnottoktatasiSzerzodes = co.IsFelnottoktatasiSzerzodes;
            oOra.OraErvenyessegKezdete = co.OraErvenyessegKezdete;
            oOra.OraErvenyessegVege = co.OraErvenyessegVege;
            oOra.OraKezdete = co.OraKezdete;
            oOra.OraVege = co.OraVege;

            if (groupId.HasValue)
            {
                oOra.OrarendiOraGroupId = groupId.Value;
            }
            else
            {
                oOra.OrarendiOraGroupId = null;
            }

            if (co.CsengetesiRendOraId > 0)
            {
                oOra.Oraszam = co.Oraszam;
                oOra.CsengetesirendOraId = co.CsengetesiRendOraId;
                oOra.CsengetesirendId = co.CsengetesiRendId;
            }
            else
            {
                oOra.Oraszam = null;
                oOra.CsengetesirendId = null;
                oOra.CsengetesirendOraId = null;
            }

            oOra.OraTulajdonosId = FelhasznaloId;

            if (co.FoglalkozasID.HasValue)
            {
                oOra.FoglalkozasId = co.FoglalkozasID.Value;
            }

            if (co.OsztalyId.HasValue)
            {
                oOra.OsztalyCsoportId = co.OsztalyId.Value;
            }

            if (co.TantargyId.HasValue)
            {
                oOra.TantargyId = co.TantargyId.Value;
            }

            if (co.TanarId.HasValue)
            {
                oOra.TanarId = co.TanarId.Value;
            }

            oOra.Drama = co.Drama;
            oOra.ParhuzamosOra = co.ParhuzamosOra;
            oOra.Sorszamozando = co.Sorszamozando;
            oOra.TAMOPOra = co.TAMOPOra;
            oOra.KIPOra = co.KIPOra;
            oOra.VEKOP73317 = co.VEKOP73317;
            oOra.KAPOra = co.KAPOra;
            oOra.TeremId = co.TeremId;
            oOra.TIOP12 = co.Tiop;
            oOra.MultikulturalisOra = co.Multikulturalis;
            oOra.EFOP32317 = co.EFOP32317;
            oOra.KomplexOra = co.KomplexOra;
            oOra.GINOP623 = co.GINOP623;
            oOra.EFOP33717 = co.EFOP33717;
            oOra.EFOP31716 = co.EFOP31716EselyteremtesAKoznevelesben;
            oOra.TIOP1111212012001 = co.TIOP11112120120001;
            oOra.IsDfhtOra = co.DFHT;
            oOra.IsRahangolodas = co.Rahangolodas;
            oOra.IsTestmozgasAlapuAlprogram = co.Testmozgas;
            oOra.IsMuveszetAlapuAlprogram = co.Muveszet;
            oOra.IsEletgyakorlatAlapuAlprogram = co.Eletgyakorlat;
            oOra.IsLogikaAlapuAlprogram = co.Logika;
            oOra.IsTeorad = co.TeOrad;
            oOra.IsDigitalisAlapuAlprogram = co.DigitalisAlapProgram;
            oOra.Tulora = co.Tulora;
            oOra.Bontott = co.Bontott;
            oOra.Differencialt = co.Differencialt;
            oOra.TanevId = TanevId;
            oOra.EgyediNap = co.IsEgyediNap;
            oOra.IsKezzelFelvettegyediNap = co.IsEgyediNap;
            oOra.KozpontiOraGroupId = co.KozpontiOraGroupId;
            oOra.KozpontilagToroltOraGroupID = co.KozpontilagToroltOraGroupId;
            oOra.EFOP23517 = co.EFOP23517201700038Miapalya;
            oOra.Torolt = co.Torolt;

            oraDal.Insert(oOra, co.IsFromSzervezet || co.IsMentorOra);

            if (regiOraIdHelyettesitesekUpdate.HasValue)
            {
                helyettesitesekUpdate(helyettesitesDAL, oOra, regiOraIdHelyettesitesekUpdate.Value, groupId);
            }

            return oOra.ID;
        }

        private void helyettesitesekUpdate(IHelyettesitesDAL helyettesitesDAL, IOrarendiOra oOra, int regiOraIdHelyettesitesekUpdate, int? groupId)
        {
            helyettesitesDAL.UpdateHelyettesitekUjOrarendiOraIdByDate(oOra.OraErvenyessegKezdete, oOra.OraErvenyessegVege, oOra.ID, regiOraIdHelyettesitesekUpdate, TanevId);
        }

        private void ValidateCo(OrarendiOraValidationCo co)
        {
            if (co.HetirendId == 0)
            {
                throw new ArgumentNullException("Hetirend");
            }

            if (co.HetNapjaId == 0)
            {
                throw new ArgumentNullException("HetNapja");
            }

            if (co.OraErvenyessegKezdete == default(DateTime))
            {
                throw new ArgumentNullException("OraErvenyessegKezdete");
            }

            if (co.TeremId == 0)
            {
                throw new ArgumentNullException("TeremID");
            }

            if (co.OraErvenyessegKezdete > co.OraErvenyessegVege)
            {
                throw new ArgumentNullException("OraErvenyessegKezdete");
            }

            if (co.OraKezdete >= co.OraVege)
            {
                throw new ArgumentException("OraKezdete");
            }
        }

        private OrarendiOraValidationCo SetErvenyessegDatumok(IDalHandler dalHandler, OrarendiOraValidationCo co)
        {
            var saveType = co.Id.HasValue ? OraModositasTipus.OraModositas : OraModositasTipus.UjOra;
            DateTime elsoNap, utolsoNap;
            var tanevHelper = new TanevHelper(new DalHandlerConnectionType(ConnectionType, dalHandler));
            var tanev = tanevHelper.GetTanevInfo();
            elsoNap = tanev.OraFelvetelKezdete;
            utolsoNap = tanev.UtolsoTanitasiNap.AddDays(1);

            if (saveType == OraModositasTipus.UjOra)
            {
                if (new CsoportHelper(new DalHandlerConnectionType(ConnectionType, dalHandler)).IsNyariSzakmaiGyakorlatos(co.OsztalyId.Value))
                {
                    SystemSettingsHelper helper = new SystemSettingsHelper(new DalHandlerConnectionType(ConnectionType, dalHandler));
                    elsoNap = helper.GetSystemSettingValue<DateTime?>(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_kezd_datum).Value;
                    utolsoNap = helper.GetSystemSettingValue<DateTime?>(RendszerBeallitasTipusEnum.Osszefuggo_gyakorlat_veg_datum).Value.AddDays(1);
                }
                else if (co.IsMentorOra)
                {
                    utolsoNap = tanev.UtolsoNap.AddDays(1);
                }
            }
            else if (saveType == OraModositasTipus.OraModositas)
            {
                var oraDal = dalHandler.OrarendiOra();
                var oOra = oraDal.Get(co.Id.Value);
                elsoNap = oOra.OraErvenyessegKezdete;
                utolsoNap = oOra.OraErvenyessegVege.Value;
            }

            switch (co.ModositasiIdoszakTipus)
            {
                case (int)OraModositasiIdoszakTipus.EgyOra:
                    if (saveType == OraModositasTipus.OraModositas)
                    {
                        co.OraErvenyessegKezdete = co.ModificationDate.Date;
                        co.OraErvenyessegVege = co.ModificationDate.Date;
                    }
                    break;
                case (int)OraModositasiIdoszakTipus.AdottNaptol:
                    if (saveType == OraModositasTipus.OraModositas)
                    {
                        co.OraErvenyessegKezdete = co.ModificationDate.Date;
                    }
                    else
                    {
                        co.OraErvenyessegKezdete = co.OraErvenyessegKezdete.Date;
                        co.OraErvenyessegVege = utolsoNap;
                    }
                    break;
                case (int)OraModositasiIdoszakTipus.AdottNapig:

                    if (saveType == OraModositasTipus.UjOra)
                    {
                        co.OraErvenyessegKezdete = elsoNap;
                        co.OraErvenyessegVege = co.OraErvenyessegVege.AddDays(1).Date;
                    }
                    else
                    {
                        co.OraErvenyessegVege = co.ModificationDate.AddDays(1).Date;
                    }
                    break;
                default:
                case (int)OraModositasiIdoszakTipus.TeljesIdoszak:
                    if (saveType == OraModositasTipus.UjOra && !co.IsOraCopy && !co.IsFromSzervezet && !co.IsMentorOra)
                    {
                        co.OraErvenyessegKezdete = elsoNap.Date;
                        co.OraErvenyessegVege = utolsoNap.Date;
                    }
                    break;
            }
            return co;
        }

        public IEnumerable<DataRow> GetTanarNapiOrarendjeOracserehez(int tanarId, DateTime start)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var ds = h.OrarendiOra().GetOrarend(IntezmenyId, TanevId, start, start.AddDays(1), tanarId, null, null, false, OrarendTipusEnum.Minden, null, null, true, null);

                return ds.Tables[0].AsEnumerable().Where(x => x.Field<string>("OraTipus") == "OrarendiOra");
            });
        }

        public OracsereValidationCO SaveOracsere(int? oracsereOrarendiOraId, DateTime? oracsereOrarendiOraDatum, int calendarOrarendiOraId, DateTime? calendarOrarendiOraDatum, int modifier, bool isPrevalidation, bool isTeremcsere)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                OracsereValidationCO oracsereValidationCO;
                if (isPrevalidation)
                {
                    oracsereValidationCO = ValidateOracsere(h, oracsereOrarendiOraId, oracsereOrarendiOraDatum, calendarOrarendiOraId, calendarOrarendiOraDatum, isPrevalidation, isThrowExceptionOnCollision: false, isTeremcsere);

                    if (string.IsNullOrWhiteSpace(oracsereValidationCO.WarningMessage))
                    {
                        SaveOracsereOrak(h, oracsereValidationCO.OracsereOrarendiOra, oracsereValidationCO.CalendarOrarendiOra, modifier);
                        OrarendValtozasCacheMentes(oracsereOrarendiOraId, calendarOrarendiOraDatum);
                        OrarendValtozasCacheMentes(calendarOrarendiOraId, oracsereOrarendiOraDatum);
                    }
                }
                else
                {
                    oracsereValidationCO = ValidateOracsere(h, oracsereOrarendiOraId, oracsereOrarendiOraDatum, calendarOrarendiOraId, calendarOrarendiOraDatum, isPrevalidation, isThrowExceptionOnCollision: false, isTeremcsere);

                    if (oracsereValidationCO.OracsereOrarendiOra.ErrorMsg.Length == 0 && oracsereValidationCO.CalendarOrarendiOra.ErrorMsg.Length == 0)
                    {
                        SaveOracsereOrak(h, oracsereValidationCO.OracsereOrarendiOra, oracsereValidationCO.CalendarOrarendiOra, modifier);
                        OrarendValtozasCacheMentes(oracsereOrarendiOraId, calendarOrarendiOraDatum);
                        OrarendValtozasCacheMentes(calendarOrarendiOraId, oracsereOrarendiOraDatum);
                    }
                }

                return oracsereValidationCO;
            });
        }

        private void SaveOracsereOrak(IDalHandler h, OraValidationCo oracsereOrarendiOra, OraValidationCo calendarOrarendiOra, int modifier)
        {
            DeletOrarendiOraCsere(h, oracsereOrarendiOra.OrarendiOraValidationCo.Id.Value, oracsereOrarendiOra.OrarendiOraValidationCo.ModificationDate);
            DeletOrarendiOraCsere(h, calendarOrarendiOra.OrarendiOraValidationCo.Id.Value, calendarOrarendiOra.OrarendiOraValidationCo.ModificationDate);

            DateTime calendarOrarendiOraDate = GetNewDateTimeFromExisting(calendarOrarendiOra.OrarendiOraValidationCo.ModificationDate);
            DateTime oracsereOrarendiOraDate = GetNewDateTimeFromExisting(oracsereOrarendiOra.OrarendiOraValidationCo.ModificationDate);

            SaveOrarendiOraCsere(h, oracsereOrarendiOra, modifier, calendarOrarendiOraDate);
            SaveOrarendiOraCsere(h, calendarOrarendiOra, modifier, oracsereOrarendiOraDate);
        }

        private OracsereValidationCO ValidateOracsere(IDalHandler h, int? oracsereOrarendiOraId, DateTime? oracsereOrarendiOraDatum, int calendarOrarendiOraId, DateTime? calendarOrarendiOraDatum, bool isPrevalidation, bool isThrowExceptionOnCollision, bool isTeremcsere)
        {
            OracsereValidationCO oracsereValidationCO = new OracsereValidationCO();
            if (oracsereOrarendiOraId.HasValue)
            {
                var orarendiOraDal = h.OrarendiOra();

                var oracsereOra = orarendiOraDal.Get(oracsereOrarendiOraId.Value);
                var oracsereOraCalendar = orarendiOraDal.Get(calendarOrarendiOraId);

                if ((oracsereOra.CsengetesirendOraId.HasValue && !oracsereOraCalendar.CsengetesirendOraId.HasValue) ||
                    (!oracsereOra.CsengetesirendOraId.HasValue && oracsereOraCalendar.CsengetesirendOraId.HasValue))
                {
                    throw new BlException(OrarendResource.CsengetesiRendhezKotottOratNemLehetNapirenddekCserelni);
                }

                IdoponthozKapcsolodoAdatokFelcserelese(oracsereOra, oracsereOraCalendar);

                if (isTeremcsere)
                {
                    var oracsereOraTeremId = oracsereOra.TeremId;
                    oracsereOra.TeremId = oracsereOraCalendar.TeremId;
                    oracsereOraCalendar.TeremId = oracsereOraTeremId;
                }

                string errMsgOraData1 = $"{oracsereOra.Tanar.NyomtatasiNev} - {oracsereOra.OsztalyCsoport.Nev} - {oracsereOra.Tantargy.Nev} - {oracsereOra.Terem.Nev} - {oracsereOrarendiOraDatum.Value} ";
                string errMsgOraData2 = $"{oracsereOraCalendar.Tanar.NyomtatasiNev} - {oracsereOraCalendar.OsztalyCsoport.Nev} - {oracsereOraCalendar.Tantargy.Nev} - {oracsereOraCalendar.Terem.Nev} - {calendarOrarendiOraDatum.Value} ";

                oracsereValidationCO.OracsereOrarendiOra = ConvertOrarendiOraToOraValidationCo(oracsereOra, oracsereOrarendiOraDatum);
                oracsereValidationCO.CalendarOrarendiOra = ConvertOrarendiOraToOraValidationCo(oracsereOraCalendar, calendarOrarendiOraDatum);

                if (CheckUtkozesValidation(h, oracsereValidationCO.OracsereOrarendiOra, errMsgOraData1, isPrevalidation: isPrevalidation, isThrowExceptionOnCollision)
                    && CheckUtkozesValidation(h, oracsereValidationCO.CalendarOrarendiOra, errMsgOraData2, isPrevalidation: isPrevalidation, isThrowExceptionOnCollision))
                {
                    oracsereValidationCO.WarningMessage = CreateWarningMessageAndThrowError(h, oracsereOra, oracsereOraCalendar, oracsereValidationCO.OracsereOrarendiOra, oracsereValidationCO.CalendarOrarendiOra, oracsereOrarendiOraDatum, calendarOrarendiOraDatum);

                    oracsereValidationCO.IsOracsereTeremcsereNelkulAktiv = !((oracsereValidationCO.OracsereOrarendiOra.OrarendiOraValidationCo.HasTeremutkozes && oracsereValidationCO.OracsereOrarendiOra.OrarendiOraValidationCo.TeremutkozesSystemSetting == 1) ||
                    (oracsereValidationCO.CalendarOrarendiOra.OrarendiOraValidationCo.HasTeremutkozes && oracsereValidationCO.CalendarOrarendiOra.OrarendiOraValidationCo.TeremutkozesSystemSetting == 1));
                }
                return oracsereValidationCO;
            }

            throw new BlException(OrarendResource.TanarOracserereValaszthatoOraiKotelezo);
        }

        private string CreateWarningMessageAndThrowError(IDalHandler h, IOrarendiOra oracsereOra, IOrarendiOra oracsereOraCalendar, OraValidationCo validationCoOracsere, OraValidationCo validationCoCalendar, DateTime? oracsereOrarendiOraDatum, DateTime? calendarOrarendiOraDatum)
        {
            StringBuilder warningMessage = new StringBuilder();
            var orarendioraDal = h.OrarendiOra();

            if (validationCoOracsere.Msg.Length != 0 || validationCoOracsere.ErrorMsg.Length != 0)
            {
                var oracsereOraData = orarendioraDal.Get(oracsereOra.ID);
                var oracsereOraLeiras = $"{oracsereOraData.Tanar.NyomtatasiNev} - {oracsereOraData.OsztalyCsoport.Nev} - {oracsereOraData.Tantargy.Nev} - {oracsereOraData.Terem.Nev} - {calendarOrarendiOraDatum.Value} {Constants.General.Sortores}";

                if (validationCoOracsere.ErrorMsg.Length != 0)
                {
                    throw new BlException(oracsereOraLeiras + Constants.General.Sortores + validationCoOracsere.ErrorMsg.ToString());
                }

                warningMessage.Append(oracsereOraLeiras);
                warningMessage.Append(validationCoOracsere.Msg + Constants.General.Sortores);
            }

            if (validationCoCalendar.Msg.Length != 0 || validationCoCalendar.ErrorMsg.Length != 0)
            {
                var oracsereOraCalendarData = orarendioraDal.Get(oracsereOraCalendar.ID);
                var oracsereOraCalendarLeiras = $"{oracsereOraCalendarData.Tanar.NyomtatasiNev} - {oracsereOraCalendarData.OsztalyCsoport.Nev} - {oracsereOraCalendarData.Tantargy.Nev} - {oracsereOraCalendarData.Terem.Nev} - {oracsereOrarendiOraDatum.Value} {Constants.General.Sortores}";

                if (validationCoCalendar.ErrorMsg.Length != 0)
                {
                    throw new BlException(oracsereOraCalendarLeiras + Constants.General.Sortores + validationCoCalendar.ErrorMsg.ToString());
                }

                warningMessage.Append(oracsereOraCalendarLeiras);
                warningMessage.Append(validationCoCalendar.Msg + Constants.General.Sortores);
            }

            return warningMessage.ToString();
        }

        private OraValidationCo ConvertOrarendiOraToOraValidationCo(IOrarendiOra oracsereOra, DateTime? oracsereDatum)
        {
            OrarendiOraCO co = new OrarendiOraCO();
            OraValidationCo validationCo = new OraValidationCo();

            GetOrarendiOraTulajdonsagok(co, oracsereOra.ID);

            validationCo.OrarendiOraValidationCo = new OrarendiOraValidationCo()
            {
                CsengetesiRendId = oracsereOra.CsengetesirendId,
                HetirendId = oracsereOra.Hetirend,
                Id = oracsereOra.ID,
                IsEgyediNap = oracsereOra.EgyediNap,
                CsengetesiRendOraId = oracsereOra.CsengetesirendOraId ?? -1,
                HetNapjaId = oracsereOra.HetNapja,
                OraErvenyessegKezdete = oracsereOra.OraErvenyessegKezdete,
                OraErvenyessegVege = oracsereOra.OraErvenyessegVege.Value,
                OraKezdete = oracsereOra.OraKezdete.Value,
                OraVege = oracsereOra.OraVege.Value,
                Oraszam = oracsereOra.Oraszam,
                OsztalyId = oracsereOra.OsztalyCsoportId,
                TanarId = oracsereOra.TanarId,
                TeremId = oracsereOra.TeremId,
                TantargyId = oracsereOra.TantargyId,
                IsNapirend = oracsereOra.CsengetesirendOraId.HasValue,
                ModositasiIdoszakTipus = (int)OraModositasiIdoszakTipus.EgyOra,
                IsModification = true,
                ModificationDate = oracsereDatum.Value,

                IKTTanora = oracsereOra.IKTTanora,
                Bontott = oracsereOra.Bontott,
                IsFelnottoktatasiSzerzodes = oracsereOra.IsFelnottoktatasiSzerzodes,
                NemzetisegiOra = oracsereOra.NemzetisegiOra,
                MindennaposTestneveles = oracsereOra.MindennaposTestneveles,
                IPRTanora = oracsereOra.IPRTanora,
                Differencialt = oracsereOra.Differencialt,
                Kooperativ = oracsereOra.Kooperativ,
                Meres = oracsereOra.Meres,
                Drama = oracsereOra.Drama,
                Tiop = oracsereOra.TIOP12,
                ParhuzamosOra = oracsereOra.ParhuzamosOra,
                NemSzakrendszeruOra = oracsereOra.NemSzakrendszeruOra,
                TAMOPOra = oracsereOra.TAMOPOra,
                KIPOra = oracsereOra.KIPOra,
                VEKOP73317 = oracsereOra.VEKOP73317,
                KAPOra = oracsereOra.KAPOra,
                Tulora = oracsereOra.Tulora,
                Multikulturalis = oracsereOra.MultikulturalisOra,
                EFOP32317 = oracsereOra.EFOP32317,
                KomplexOra = oracsereOra.KomplexOra,
                GINOP623 = oracsereOra.GINOP623,
                EFOP31716EselyteremtesAKoznevelesben = oracsereOra.EFOP31716,
                EFOP33717 = oracsereOra.EFOP33717,
                TIOP11112120120001 = oracsereOra.TIOP1111212012001,
                DFHT = oracsereOra.IsDfhtOra,
                Rahangolodas = oracsereOra.IsRahangolodas,
                Testmozgas = oracsereOra.IsTestmozgasAlapuAlprogram,
                Muveszet = oracsereOra.IsMuveszetAlapuAlprogram,
                Eletgyakorlat = oracsereOra.IsEletgyakorlatAlapuAlprogram,
                Logika = oracsereOra.IsLogikaAlapuAlprogram,
                TeOrad = oracsereOra.IsTeorad,
                Sorszamozando = oracsereOra.Sorszamozando,
                DigitalisAlapProgram = oracsereOra.IsDigitalisAlapuAlprogram,
                EFOP23517201700038Miapalya = oracsereOra.EFOP23517,

                TanevTananyaganakIsmetlese = co.TanevTananyaganakIsmetlese,
                TanevTananyaganakKiegeszitese = co.TanevTananyaganakKiegeszitese,
                TanulokDigitalisKeszsegfejlesztese = co.TanulokDigitalisKeszsegfejlesztese,
                Projektmunka = co.Projektmunka,
                TanulokKompenzaciosIraskeszsegFejlesztese = co.TanulokKompenzaciosIraskeszsegFejlesztese,
                TanulokKompenzaciosOlvasasiKepessegFejlesztese = co.TanulokKompenzaciosOlvasasiKepessegFejlesztese,
                TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese = co.TanulokMatematikaiGondolkodasiKepessegenekKompenzaciosFejlesztese,
                TanulokNyelviKepessegenekKompenzaciosFejlesztese = co.TanulokNyelviKepessegenekKompenzaciosFejlesztese,
                TanulokOnmegismeresenekSegitese = co.TanulokOnmegismeresenekSegitese,
                TanulokOnallosagraNevelese = co.TanulokOnallosagraNevelese,
                TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese = co.TanulokTanulasszervezesiKompenzaciosTechnikajanakErositese,
                TanulokOrientaciosTamogatasa = co.TanulokOrientaciosTamogatasa,
                TanulokSzocialitasanakFejlesztese = co.TanulokSzocialitasanakFejlesztese,
                TanulokTovabbhaladasatElokeszitoTevekenysegek = co.TanulokTovabbhaladasatElokeszitoTevekenysegek,
                PedagogusAltalJelzettEgyeniEsetkezeles = co.PedagogusAltalJelzettEgyeniEsetkezeles,
                ProjektmunkaTamogatasa = co.ProjektmunkaTamogatasa,
                DigitalisKeszsegfejlesztes = co.DigitalisKeszsegfejlesztes,
                KozossegiMunkaTamogatasa = co.KozossegiMunkaTamogatasa,
                TanoraElokeszitesenekTamogatasa = co.TanoraElokeszitesenekTamogatasa,
                TanoraLebonyolitasanakTamogatasa = co.TanoraLebonyolitasanakTamogatasa,
                NapkozisTevekenysegKeretebenEgyeniFejlesztes = co.NapkozisTevekenysegKeretebenEgyeniFejlesztes,
                IsEgybefuggoGyakorlat = co.IsEgybefuggoGyakorlat
            };

            return validationCo;
        }

        private void IdoponthozKapcsolodoAdatokFelcserelese(IOrarendiOra oracsereOra1, IOrarendiOra oracsereOra2)
        {
            var oraErvenyessegKezdete = GetNewDateTimeFromExisting(oracsereOra1.OraErvenyessegKezdete);
            var oraErvenyessegVege = GetNewDateTimeFromExisting(oracsereOra1.OraErvenyessegVege.Value);
            var hetNapjaId = oracsereOra1.HetNapja;
            var oraKezdete = GetNewDateTimeFromExisting(oracsereOra1.OraKezdete.Value);
            var oraVege = GetNewDateTimeFromExisting(oracsereOra1.OraVege.Value);
            var oraSzam = oracsereOra1.Oraszam;
            var hetirend = oracsereOra1.Hetirend;
            var csengetesirendId = oracsereOra1.CsengetesirendId;
            var csengetesirendOraId = oracsereOra1.CsengetesirendOraId;

            oracsereOra1.OraErvenyessegKezdete = oracsereOra2.OraErvenyessegKezdete;
            oracsereOra1.OraErvenyessegVege = oracsereOra2.OraErvenyessegVege;
            oracsereOra1.HetNapja = oracsereOra2.HetNapja;
            oracsereOra1.OraKezdete = oracsereOra2.OraKezdete;
            oracsereOra1.OraVege = oracsereOra2.OraVege;
            oracsereOra1.Oraszam = oracsereOra2.Oraszam;
            oracsereOra1.Hetirend = oracsereOra2.Hetirend;
            oracsereOra1.CsengetesirendId = oracsereOra2.CsengetesirendId;
            oracsereOra1.CsengetesirendOraId = oracsereOra2.CsengetesirendOraId;

            oracsereOra2.OraErvenyessegKezdete = oraErvenyessegKezdete;
            oracsereOra2.OraErvenyessegVege = oraErvenyessegVege;
            oracsereOra2.HetNapja = hetNapjaId;
            oracsereOra2.OraKezdete = oraKezdete;
            oracsereOra2.OraVege = oraVege;
            oracsereOra2.Oraszam = oraSzam;
            oracsereOra2.Hetirend = hetirend;
            oracsereOra2.CsengetesirendId = csengetesirendId;
            oracsereOra2.CsengetesirendOraId = csengetesirendOraId;
        }

        private DateTime GetNewDateTimeFromExisting(DateTime dateTime)
        {
            return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second);
        }

        private List<int> GetAktualisHetirendek(IDalHandler h)
        {
            var hetirendek = new List<int>();
            var tanevrendHelper = new TanevrendHelper(new DalHandlerConnectionType(ConnectionType, h));
            var hetirendekDictionary = tanevrendHelper.GetTanevHetirendTipusok();

            foreach (var hetirend in hetirendekDictionary)
            {
                hetirendek.Add(int.Parse(hetirend.Key));
            }

            //A mindegyik hét kell mindig a listába
            hetirendek.Add((int)HetiRendTipusEnum.MindegyikHet);
            return hetirendek;
        }

        private int GetTevekenysegFigyelesSystemSettingValue(IDalHandler h)
        {
            return new SystemSettingsHelper(new DalHandlerConnectionType(ConnectionType, h)).GetSystemSettingValue<int>(RendszerBeallitasTipusEnum.Napirend_felvitelel_utkozes_figyeles);
        }

        public List<NemElerhetoOrarendiElemItemCo> GetNemElerhetoOrarendiElemekCoList(AdminNemElerhetoOrarendiElemCO searchCo)
        {
            var ds = Dal.CustomConnection.Run(ConnectionType, h => h.OrarendiOra().GetNemElerhetoOrarendiElemekDataSet(TanevId));
            var result = new List<NemElerhetoOrarendiElemItemCo>();
            foreach (var dataRow in ds.Tables[0].AsEnumerable())
            {
                result.Add(new NemElerhetoOrarendiElemItemCo(dataRow));
            }
            return FilterNemElerhetoOrarendiElemItemCoList(result, searchCo);
        }

        private List<NemElerhetoOrarendiElemItemCo> FilterNemElerhetoOrarendiElemItemCoList(List<NemElerhetoOrarendiElemItemCo> coList, AdminNemElerhetoOrarendiElemCO searchCo)
        {
            if (searchCo == null)
            {
                return coList;
            }

            IEnumerable<NemElerhetoOrarendiElemItemCo> result = coList;

            if (searchCo.TanarId.HasValue)
            {
                result = result.Where(x => x.TanarId == searchCo.TanarId.Value);
            }

            if (searchCo.NapId.HasValue)
            {
                result = result.Where(x => x.NapId == searchCo.NapId.Value);
            }

            if (searchCo.HetirendId.HasValue)
            {
                result = result.Where(x => x.HetirendId == searchCo.HetirendId.Value);
            }

            if (searchCo.TantargyId.HasValue)
            {
                result = result.Where(x => x.TantargyId == searchCo.TantargyId.Value);
            }

            if (searchCo.TeremId.HasValue)
            {
                result = result.Where(x => x.TeremId == searchCo.TeremId.Value);
            }

            if (searchCo.OsztalyCsoportId.HasValue)
            {
                result = result.Where(x => x.OsztalyCsoportId == searchCo.OsztalyCsoportId.Value);
            }

            if (searchCo.ErvenyessegKezdeteTol.HasValue && !searchCo.ErvenyessegKezdeteIg.HasValue)
            {
                result = result.Where(x => x.ErvenyessegKezdete >= searchCo.ErvenyessegKezdeteTol.Value);
            }

            if (searchCo.ErvenyessegKezdeteIg.HasValue && !searchCo.ErvenyessegKezdeteTol.HasValue)
            {
                result = result.Where(x => x.ErvenyessegKezdete <= searchCo.ErvenyessegKezdeteIg.Value);
            }

            if (searchCo.ErvenyessegKezdeteTol.HasValue && searchCo.ErvenyessegKezdeteIg.HasValue)
            {
                result = result.Where(x => x.ErvenyessegKezdete >= searchCo.ErvenyessegKezdeteTol.Value && x.ErvenyessegKezdete <= searchCo.ErvenyessegKezdeteIg.Value);
            }

            if (searchCo.ErvenyessegVegeTol.HasValue && !searchCo.ErvenyessegVegeIg.HasValue)
            {
                result = result.Where(x => x.ErvenyessegVege >= searchCo.ErvenyessegVegeTol.Value);
            }

            if (searchCo.ErvenyessegVegeIg.HasValue && !searchCo.ErvenyessegVegeTol.HasValue)
            {
                result = result.Where(x => x.ErvenyessegVege <= searchCo.ErvenyessegVegeIg.Value);
            }

            if (searchCo.ErvenyessegVegeTol.HasValue && searchCo.ErvenyessegVegeIg.HasValue)
            {
                result = result.Where(x => x.ErvenyessegVege >= searchCo.ErvenyessegVegeTol.Value && x.ErvenyessegVege <= searchCo.ErvenyessegVegeIg.Value);
            }

            return result.ToList();
        }

        public void OrarendValtozasCacheMentes(int? orarendiOraId = null, DateTime? datum = null, DateTime? oraKezdete = null)
        {
            var sendOrarendValtozasNotificationFeature = new SendOrarendValtozasNotificationFeature((FeatureConfigurationSection)ConfigurationManager.GetSection(Constants.ConfigurationSectionNames.FeatureConfig));
            if (sendOrarendValtozasNotificationFeature.IsEnabled && orarendiOraId.IsEntityId())
            {
                var oraTanuloiDataSet = GetOraTanuloi(orarendiOraId.Value);
                var elsoOrarendiOraDatumaDataSet = GetElsoOrarendiOraDatuma(orarendiOraId.Value);
                if (oraTanuloiDataSet.Tables.Count > 0 && oraTanuloiDataSet.Tables[0].Rows.Count > 0 &&
                    elsoOrarendiOraDatumaDataSet.Tables.Count > 0 && elsoOrarendiOraDatumaDataSet.Tables[0].Rows.Count > 0)
                {
                    var tanulok = oraTanuloiDataSet.Tables[0].Rows.Cast<DataRow>().Select(dataRow =>
                        new Tuple<int, Guid, string>(dataRow.Field<int>("TanuloId"), dataRow.Field<Guid>("IdpUniqueId"), dataRow.Field<string>("TanuloNev"))
                        ).ToList();
                    var elsoOrarendiOraDatuma = elsoOrarendiOraDatumaDataSet.Tables[0].Rows[0].Field<DateTime>("Datum");
                    var kuldendoDatum = datum.HasValue ? datum.Value : oraKezdete.HasValue ? elsoOrarendiOraDatuma.AddHours(oraKezdete.Value.Hour).AddMinutes(oraKezdete.Value.Minute) : elsoOrarendiOraDatuma;

                    OrarendValtozasCache orarendValtozasCache = KretaServer.KretaServer.Instance.CacheManager.AquireCacheMobile<OrarendValtozasCache>();
                    var cacheEnabledAndNotNull = FeatureContext.Instance.IsEnabled(Constants.FeatureName.MobileEllenorzoApiCache, IntezmenyAzonosito) && orarendValtozasCache != null;
                    if (cacheEnabledAndNotNull)
                    {
                        var orarendValtozasok = orarendValtozasCache.GetOrarendValtozasok(IntezmenyAzonosito);
                        tanulok.ForEach(t => orarendValtozasok.Add(new OrarendValtozasModel
                        {
                            IntezmenyAzonosito = IntezmenyAzonosito,
                            UserId = t.Item1,
                            IdpUniqueId = t.Item2,
                            UserNev = t.Item3,
                            OrarendiOraId = orarendiOraId.Value,
                            Nap = Job.Tasks.Helpers.Utility.Extensions.GetHetnapja(kuldendoDatum, TanevId, IntezmenyAzonosito),
                            Datum = kuldendoDatum
                        }));
                        orarendValtozasCache.AddOrUpdateOrarendValtozas(orarendValtozasok, IntezmenyAzonosito);
                    }
                }
            }
        }

        private DataSet GetOraTanuloi(int orarendiOraId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra();
                return dal.GetOraTanuloi(orarendiOraId);
            });
        }

        private DataSet GetElsoOrarendiOraDatuma(int orarendiOraId)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var dal = h.OrarendiOra();
                return dal.GetElsoOrarendiOraDatuma(orarendiOraId);
            });
        }

        public void UpdateOrarend(DateTime? idoszakKezdete = null, DateTime? idoszakVege = null, int? orarendioraId = null, int? osztalyCsoportId = null)
        {
            Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                h.OrarendiOra().UpdateOrarend(IntezmenyId, TanevId, idoszakKezdete, idoszakVege, orarendioraId, osztalyCsoportId);
            });
        }

        public List<ElozoOraAdataiCO> GetElozoOrakAdatai(string orakAdatai)
        {
            return Dal.CustomConnection.Run(ConnectionType, (h) =>
            {
                var elozoOrakAdatai = new List<ElozoOraAdataiCO>();
                var elozoOrakAdataiDataSet = h.OrarendiOra().GetElozoOrakAdatai(orakAdatai, IntezmenyId, TanevId);

                for (int i = 0; i < elozoOrakAdataiDataSet.Tables.Count; i++)
                {
                    foreach (var row in elozoOrakAdataiDataSet.Tables[i].Rows.Cast<DataRow>())
                    {
                        if (!SDAConvert.ToNullableInt32(row["Id"]).HasValue)
                        {
                            continue;
                        }

                        var datum = SDAConvert.ToDateTime(row["Datum"]);
                        var elozoOraDatuma = datum.HasValue ? datum.Value.ToString("yyyy.MM.dd.") : string.Empty;
                        var evesSorszam = SDAConvert.ToNullableInt32(row["EvesSorszam"]);
                        var elozoOraEvesSorszama = evesSorszam.HasValue ? evesSorszam.ToString() : null;
                        var elozoOraTemaja = SDAConvert.ToString(row["Tema"]);

                        elozoOrakAdatai.Add(new ElozoOraAdataiCO
                        {
                            ElozoOraTemaja = elozoOraTemaja,
                            ElozoOraEvesSorszama = elozoOraEvesSorszama,
                            ElozoOraAdatai = $"{elozoOraDatuma} {elozoOraTemaja}",
                            ElozoOraDatuma = datum,
                            TantargyId = SDAConvert.ToInt32(row["TantargyId"]),
                            OsztalyCsoportId = SDAConvert.ToInt32(row["OsztalyCsoportId"]),
                            TanarId = SDAConvert.ToInt32(row["TanarId"]),
                            OraKezdete = Convert.ToDateTime(row["OraKezdete"])
                        });
                    }
                }

                return elozoOrakAdatai;
            });
        }
    }
}