public bool ExistTimeTable(IMT_TimeTables timetablesTable, long lTariff, long dayType, COPSDate dtOper, ref bool bBlockFound, bool bConsiderCloseInterval)
        {
            trace.Write(TraceLevel.Debug, "CiMD_Tariffs::ExistTimeTable");
            bool fnResult = true;

            try
            {
                bBlockFound = false;
                int minutes = dtOper.TimeToMinutes();

                trace.Write(TraceLevel.Info, $"QUERY : Which are the Time Table, Init Hour, End Hour for the Tariff({lTariff}) at this Hour({minutes / 60}:{minutes % 60}) for Day({dayType})?");

                int nTimIni = -1;
                int nTimEnd = -1;

                IEnumerable <Tariffs> tariffs = Data.Where(w =>
                                                           w.TAR_ID == lTariff &&
                                                           w.TAR_DDAY_ID == dayType &&
                                                           (w.TAR_INIDATE.GetStatus() == COPSDateStatus.Valid && w.TAR_INIDATE <= dtOper) &&
                                                           (w.TAR_ENDDATE.GetStatus() == COPSDateStatus.Valid && w.TAR_ENDDATE > dtOper)
                                                           );

                foreach (Tariffs tariff in tariffs)
                {
                    int nDummyTimIni = -1;
                    int nDummyTimEnd = -1;

                    Timetables foundTimeTable = timetablesTable.GetIniEndFromTimId(tariff.TAR_TIM_ID.Value);
                    trace.Write(TraceLevel.Info, $"Minutes ({minutes:D2}) TimTabIni ({foundTimeTable.TIM_INI:D2}) TimTabEnd ({foundTimeTable.TIM_END:D2})");

                    bool bGetTimetable = false;

                    if (bConsiderCloseInterval)
                    {
                        bGetTimetable = ((minutes <= nDummyTimEnd) && (minutes >= nDummyTimIni));
                    }
                    else
                    {
                        bGetTimetable = ((minutes < nDummyTimEnd) && (minutes >= nDummyTimIni));
                    }

                    if (bGetTimetable)
                    {
                        trace.Write(TraceLevel.Info, $"Interval Found Minutes {minutes / 60:D2}:{minutes % 60:D2} < {foundTimeTable.TIM_INI / 60:D2}:{foundTimeTable.TIM_INI % 60:D2}");

                        bBlockFound = true;
                        break;
                    }
                }
            }
            catch (Exception error)
            {
                trace.Write(TraceLevel.Error, error.ToLogString());
                fnResult = false;
            }

            return(fnResult);
        }
        public bool GetTariffTimeTable(long lTariff, long dayType, COPSDate dtOper, long numDaysPassed, IMT_TimeTables timetables, bool considerCloseInterval, out Tariffs outTariff, out Timetables outTimetable)
        {
            trace.Write(TraceLevel.Debug, "IMT_Tariffs::GetTariffTimeTable");
            bool fnResult = true;

            outTariff    = null;
            outTimetable = null;


            try
            {
                Guard.IsNull(dtOper, nameof(dtOper));


                int totalMinutes = dtOper.TimeToMinutes();

                trace.Write(TraceLevel.Info, $@"QUERY: Which are the Time Table, Init Hour, End Hour  for the Tariff({lTariff}) at this Hour({totalMinutes/60:D2}:{totalMinutes%60:D2}) for Day({dayType})?");

                IEnumerable <Tariffs> tariffs = Data.Where(w =>
                                                           w.TAR_ID == lTariff &&
                                                           w.TAR_DDAY_ID == dayType &&
                                                           (w.TAR_INIDATE.GetStatus() == COPSDateStatus.Valid && w.TAR_INIDATE <= dtOper) &&
                                                           (w.TAR_ENDDATE.GetStatus() == COPSDateStatus.Valid && w.TAR_ENDDATE > dtOper)
                                                           );

                bool timtableHasBeenFound = false;

                if (tariffs.Any())
                {
                    bool bApplyTariff = false;

                    foreach (Tariffs tariff in tariffs)
                    {
                        if (numDaysPassed != GlobalDefs.DEF_UNDEFINED_VALUE)
                        {
                            bApplyTariff = (tariff.TAR_NUMDAYS_PASSED.HasValue && tariff.TAR_NUMDAYS_PASSED.Value == numDaysPassed);
                        }
                        else
                        {
                            bApplyTariff = !tariff.TAR_NUMDAYS_PASSED.HasValue;
                        }

                        if (bApplyTariff)
                        {
                            Timetables foundTimeTable = timetables.GetIniEndFromTimId(tariff.TAR_TIM_ID.Value);
                            trace.Write(TraceLevel.Info, $"Minutes ({totalMinutes:D2}) TimTabIni ({foundTimeTable.TIM_INI:D2}) TimTabEnd ({foundTimeTable.TIM_END:D2})");

                            bool getTimetable = false;

                            if (considerCloseInterval)
                            {
                                getTimetable = totalMinutes <= foundTimeTable.TIM_END && totalMinutes >= foundTimeTable.TIM_INI;
                            }
                            else
                            {
                                getTimetable = totalMinutes < foundTimeTable.TIM_END && totalMinutes >= foundTimeTable.TIM_INI;
                            }

                            if (getTimetable)
                            {
                                trace.Write(TraceLevel.Info, $"Interval Found Minutes {totalMinutes/60:D2}:{totalMinutes%60:D2} < {foundTimeTable.TIM_INI/60:D2}:{foundTimeTable.TIM_INI % 60:D2}");

                                outTariff            = tariff;
                                outTimetable         = foundTimeTable;
                                timtableHasBeenFound = true;
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception error)
            {
                trace.Write(TraceLevel.Error, error.ToLogString());
                fnResult = false;
            }

            return(fnResult);
        }