protected virtual void AddForecastToDataSet(LLPDiskSheetDataSet destinationDataSet)
        {
            double avgUtilizationCycles = _forecast != null ? _forecast.ForecastDatas[0].AverageUtilization.Cycles : 0;
            double avgUtilizationHours  = _forecast != null ? _forecast.ForecastDatas[0].AverageUtilization.Hours : 0;
            string avgUtilizationType   = _forecast != null
                                            ? _forecast.ForecastDatas[0].AverageUtilization.SelectedInterval.ToString()
                                            : "";
            int forecastCycles = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastLifelength.Cycles != null
                    ? (int)_forecast.ForecastDatas[0].ForecastLifelength.Cycles
                    : 0
                : 0;
            int forecastHours = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastLifelength.Hours != null
                    ? (int)_forecast.ForecastDatas[0].ForecastLifelength.Hours
                    : 0
                : 0;
            int forecastDays = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastLifelength.Days != null
                    ? (int)_forecast.ForecastDatas[0].ForecastLifelength.Days
                    : 0
                : 0;
            string forecastDate = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString())
                : "";

            destinationDataSet.ForecastTable.AddForecastTableRow(avgUtilizationCycles,
                                                                 avgUtilizationHours,
                                                                 avgUtilizationType,
                                                                 forecastCycles,
                                                                 forecastHours,
                                                                 forecastDays,
                                                                 forecastDate);
        }
 /// <summary>
 /// Добавляется элемент в таблицу данных
 /// </summary>
 /// <param name="reportedComponent">Добавлямая директива</param>
 /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
 private void AddDirectiveToDataset(ComponentDirective reportedComponent, LLPDiskSheetDataSet destinationDataSet)
 {
     destinationDataSet.ItemsTable.AddItemsTableRow(reportedComponent.PartNumber,
                                                    reportedComponent.SerialNumber,
                                                    reportedComponent.Description,
                                                    GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength((BaseEntityObject)reportedComponent.ParentComponent).Cycles?.ToString(),
                                                    0,
                                                    0,
                                                    0,
                                                    0,
                                                    0,
                                                    0,
                                                    0,
                                                    0,
                                                    0,
                                                    reportedComponent.NextPerformance?.Remains?.Cycles ?? 0,
                                                    0,
                                                    0,
                                                    0,
                                                    reportedComponent.Condition.ToString(),
                                                    reportedComponent.ParentComponent.Position,
                                                    reportedComponent.Remarks,
                                                    reportedComponent.DirectiveType.FullName,
                                                    reportedComponent.FirstPerformanceSinceNew?.Cycles.ToString(),
                                                    reportedComponent.NextPerformance?.Remains?.Cycles?.ToString());
 }
 /// <summary>
 /// Добавление директив в таблицу данных
 /// </summary>
 /// <param name="dataset">Таблица, в которую добавляются данные</param>
 protected virtual void AddDirectivesToDataSet(LLPDiskSheetDataSet dataset)
 {
     foreach (var t in _reportedItems)
     {
         AddDirectiveToDataset(t, dataset);
     }
 }
        /// <summary>
        /// Добавление дополнительной информации
        /// </summary>
        /// <param name="destinationDateSet"></param>
        private void AddAdditionalDataToDataSet(LLPDiskSheetDataSet destinationDateSet)
        {
            var parentAircraft = GlobalObjects.AircraftsCore.GetAircraftById(_reportedBaseComponent.ParentAircraftId);

            string[] categoryNames = { "N/A", "N/A", "N/A", "N/A" };
            var      categories    = GlobalObjects.CasEnvironment.GetDictionary <LLPLifeLimitCategory>()
                                     .OfType <LLPLifeLimitCategory>()
                                     .Where(c => c.AircraftModel != null && c.AircraftModel.Equals(parentAircraft.Model))
                                     .ToList();

            for (int i = 0; i < categories.Count && i < 4; i++)
            {
                categoryNames[i] = categories[i].Category;
            }

            var    reportFooter         = new GlobalTermsProvider()["ReportFooter"].ToString();
            var    reportFooterPrepared = new GlobalTermsProvider()["ReportFooterPrepared"].ToString();
            var    reportFooterLink     = new GlobalTermsProvider()["ProductWebsite"].ToString();
            int    averageUtilizationHours;
            int    averageUtilizationCycles;
            string averageUtilizationType;

            if (_forecast == null)
            {
                var aircraftFrame      = GlobalObjects.ComponentCore.GetBaseComponentById(parentAircraft.AircraftFrameId);
                var averageUtilization = GlobalObjects.AverageUtilizationCore.GetAverageUtillization(aircraftFrame);

                //TODO:(Evgenii Babak) убрать повторяющийся код при использовании AverageUtilization
                averageUtilizationHours  = (int)averageUtilization.Hours;
                averageUtilizationCycles = (int)averageUtilization.Cycles;
                averageUtilizationType   = averageUtilization.SelectedInterval == UtilizationInterval.Dayly ? "Day" : "Month";
            }
            else
            {
                //TODO:(Evgenii Babak) убрать повторяющийся код при использовании AverageUtilization
                averageUtilizationHours  = (int)_forecast.ForecastDatas[0].AverageUtilization.Hours;
                averageUtilizationCycles = (int)_forecast.ForecastDatas[0].AverageUtilization.Cycles;
                averageUtilizationType   =
                    _forecast.ForecastDatas[0].AverageUtilization.SelectedInterval == UtilizationInterval.Dayly ? "Day" : "Month";
            }
            destinationDateSet.AdditionalDataTAble.AddAdditionalDataTAbleRow(_reportTitle,
                                                                             OperatorLogotype,
                                                                             _filterSelection,
                                                                             DateAsOf,
                                                                             reportFooter,
                                                                             reportFooterPrepared,
                                                                             reportFooterLink,
                                                                             categoryNames[0],
                                                                             categoryNames[1],
                                                                             categoryNames[2],
                                                                             categoryNames[3],
                                                                             averageUtilizationCycles,
                                                                             averageUtilizationHours,
                                                                             averageUtilizationType);
        }
        /// <summary>
        /// Построить источник данных (DataSet) для вывода в отчет
        /// </summary>
        /// <returns></returns>
        public virtual LLPDiskSheetDataSet GenerateDataSet()
        {
            var dataset = new LLPDiskSheetDataSet();

            AddAircraftToDataset(dataset);
            AddBaseDetailToDataset(dataset);
            AddDirectivesToDataSet(dataset);
            AddAdditionalDataToDataSet(dataset);
            AddForecastToDataSet(dataset);
            return(dataset);
        }
 /// <summary>
 /// Добавление директив в таблицу данных
 /// </summary>
 /// <param name="dataset">Таблица, в которую добавляются данные</param>
 protected virtual void AddDirectivesToDataSet(LLPDiskSheetDataSet dataset)
 {
     /* List<String> colors = new List<string>();
      * for (int i = 0; i < HighlightCollection.Instance.Count; i++ )
      * {
      *  colors.Add(HighlightCollection.Instance[i].Color.R.ToString()+" "+
      *              HighlightCollection.Instance[i].Color.G.ToString()+" "+
      *              HighlightCollection.Instance[i].Color.B.ToString());
      * }
      * MessageBox.Show(string.Join("\r\n",colors.ToArray()));*/
     foreach (Component t in _reportedItems)
     {
         AddDirectiveToDataset(t, dataset);
     }
 }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="reportedComponent">Добавлямая директива</param>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        private void AddDirectiveToDataset(Component reportedComponent, LLPDiskSheetDataSet destinationDataSet)
        {
            if (!reportedComponent.LLPMark || !reportedComponent.LLPCategories)
            {
                return;
            }
            ComponentLLPCategoryData[] llpData =
            {
                new ComponentLLPCategoryData(), new ComponentLLPCategoryData(),
                new ComponentLLPCategoryData(), new ComponentLLPCategoryData()
            };
            //var total = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(reportedComponent);

            int i = 0;


            foreach (var data in reportedComponent.LLPData.Where(l => l.ParentCategory != LLPLifeLimitCategory.Unknown).Take(4))
            {
                llpData[i] = data;
                i++;
            }

            var a = llpData[0].LLPCurrent?.Cycles ?? (llpData[0].LLPLifelengthCurrent.Cycles ?? llpData[0].LLPLifeLengthForDate.Cycles) ?? 0;
            var b = llpData[1].LLPCurrent?.Cycles ?? (llpData[1].LLPLifelengthCurrent.Cycles ?? llpData[1].LLPLifeLengthForDate.Cycles) ?? 0;
            var c = llpData[2].LLPCurrent?.Cycles ?? (llpData[2].LLPLifelengthCurrent.Cycles ?? llpData[2].LLPLifeLengthForDate.Cycles) ?? 0;
            var d = llpData[3].LLPCurrent?.Cycles ?? (llpData[3].LLPLifelengthCurrent.Cycles ?? llpData[3].LLPLifeLengthForDate.Cycles) ?? 0;

            var totalCycle = a + b + c + d;

            destinationDataSet.ItemsTable.AddItemsTableRow(reportedComponent.PartNumber,
                                                           reportedComponent.SerialNumber,
                                                           reportedComponent.Description,
                                                           "",
                                                           totalCycle,
                                                           llpData[0].LLPLifeLimit?.Cycles ?? 0,
                                                           llpData[1].LLPLifeLimit?.Cycles ?? 0,
                                                           llpData[2].LLPLifeLimit?.Cycles ?? 0,
                                                           llpData[3].LLPLifeLimit?.Cycles ?? 0,
                                                           a,
                                                           b,
                                                           c,
                                                           d,
                                                           llpData[0].Remain?.Cycles ?? 0,
                                                           llpData[1].Remain?.Cycles ?? 0,
                                                           llpData[2].Remain?.Cycles ?? 0,
                                                           llpData[3].Remain?.Cycles ?? 0,
                                                           reportedComponent.Condition.ToString(), "", "", "", "", "");
        }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        private void AddAircraftToDataset(LLPDiskSheetDataSet destinationDataSet)
        {
            if (_reportedAircraft == null)
            {
                return;
            }

            var reportAircraftLifeLenght = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_reportedAircraft);

            var    manufactureDate    = _reportedAircraft.ManufactureDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            var    serialNumber       = _reportedAircraft.SerialNumber;
            var    model              = _reportedAircraft.Model.ShortName;
            var    registrationNumber = _reportedAircraft.RegistrationNumber;
            int    averageUtilizationHours;
            int    averageUtilizationCycles;
            string averageUtilizationType;

            if (_forecast == null)
            {
                var aircraftFrame      = GlobalObjects.ComponentCore.GetBaseComponentById(_reportedAircraft.AircraftFrameId);
                var averageUtilization = GlobalObjects.AverageUtilizationCore.GetAverageUtillization(aircraftFrame);

                averageUtilizationHours  = (int)averageUtilization.Hours;
                averageUtilizationCycles = (int)averageUtilization.Cycles;
                averageUtilizationType   = averageUtilization.SelectedInterval == UtilizationInterval.Dayly ? "Day" : "Month";
            }
            else
            {
                averageUtilizationHours  = (int)_forecast.ForecastDatas[0].AverageUtilization.Hours;
                averageUtilizationCycles = (int)_forecast.ForecastDatas[0].AverageUtilization.Cycles;
                averageUtilizationType   =
                    _forecast.ForecastDatas[0].AverageUtilization.SelectedInterval == UtilizationInterval.Dayly ? "Day" : "Month";
            }

            var lineNumber     = _reportedAircraft.LineNumber;
            var variableNumber = _reportedAircraft.VariableNumber;

            destinationDataSet.AircraftDataTable.AddAircraftDataTableRow(serialNumber,
                                                                         manufactureDate,
                                                                         reportAircraftLifeLenght.ToHoursMinutesFormat(""),
                                                                         reportAircraftLifeLenght.Cycles != null && reportAircraftLifeLenght.Cycles != 0
                                                                            ? reportAircraftLifeLenght.Cycles.ToString()
                                                                            : "",
                                                                         registrationNumber, model, lineNumber, variableNumber,
                                                                         averageUtilizationHours, averageUtilizationCycles, averageUtilizationType);
        }
        protected virtual void AddForecastToDataSet(LLPDiskSheetDataSet destinationDataSet)
        {
            //string manufactureDate = UsefulMethods.NormalizeDate(ReportedBaseDetail.ManufactureDate);
            //string sinceNewHours = "";// LifelengthFormatter.GetHoursData(ReportedBaseDetail.Limitation.ResourceSinceNew.Hours).Trim() + " hrs";
            //string sinceNewCycles = "";//ReportedBaseDetail.Limitation.ResourceSinceNew.Cycles.ToString().Trim() + " cyc";
            //string sinceOverhaulHours = "";// LifelengthFormatter.GetHoursData(ReportedBaseDetail.Limitation.ResourceSinceOverhaul.Hours).Trim() + " hrs";
            //string sinceOverhaulCycles = "";//ReportedBaseDetail.Limitation.ResourceSinceOverhaul.Cycles.ToString().Trim() + " cyc";
            //string sinceHotSectionInspectionHours = "";//LifelengthFormatter.GetHoursData(ReportedBaseDetail.Limitation.ResourceSinceHotSectionInspection.Hours).Trim() + " hrs";
            //string sinceHotSectionInspectionCycles = "";//ReportedBaseDetail.Limitation.ResourceSinceHotSectionInspection.Cycles.ToString().Trim() + " cyc";
            //string baseDetailType = "";
            //if (ReportedBaseDetail.DetailType==DetailType.Engine)
            //    baseDetailType = "Engine";
            //else if (ReportedBaseDetail.DetailType == DetailType.Apu)
            //    baseDetailType = "APU";
            double avgUtilizationCycles = _forecast != null ? _forecast.ForecastDatas[0].AverageUtilization.Cycles : 0;
            double avgUtilizationHours  = _forecast != null ? _forecast.ForecastDatas[0].AverageUtilization.Hours : 0;
            string avgUtilizationType   = _forecast != null
                                            ? _forecast.ForecastDatas[0].AverageUtilization.SelectedInterval.ToString()
                                            : "";
            int forecastCycles = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastLifelength.Cycles != null
                    ? (int)_forecast.ForecastDatas[0].ForecastLifelength.Cycles
                    : 0
                : 0;
            int forecastHours = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastLifelength.Hours != null
                    ? (int)_forecast.ForecastDatas[0].ForecastLifelength.Hours
                    : 0
                : 0;
            int forecastDays = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastLifelength.Days != null
                    ? (int)_forecast.ForecastDatas[0].ForecastLifelength.Days
                    : 0
                : 0;
            string forecastDate = _forecast != null
                ? _forecast.ForecastDatas[0].ForecastDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString())
                : "";

            destinationDataSet.ForecastTable.AddForecastTableRow(avgUtilizationCycles,
                                                                 avgUtilizationHours,
                                                                 avgUtilizationType,
                                                                 forecastCycles,
                                                                 forecastHours,
                                                                 forecastDays,
                                                                 forecastDate);
        }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        private void AddBaseDetailToDataset(LLPDiskSheetDataSet destinationDataSet)
        {
            if (_reportedBaseComponent == null)
            {
                return;
            }

            var reportAircraftLifeLenght = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_reportedBaseComponent);

            var manufactureDate = _reportedBaseComponent.ManufactureDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            var deliveryDate    = _reportedBaseComponent.DeliveryDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            var status          = _reportedBaseComponent.Serviceable ? "Serviceable" : "Unserviceable";
            var sinceNewHours   = reportAircraftLifeLenght.Hours != null ? (int)reportAircraftLifeLenght.Hours : 0;
            var sinceNewCycles  = reportAircraftLifeLenght.Cycles != null ? (int)reportAircraftLifeLenght.Cycles : 0;
            var sinceNewDays    = reportAircraftLifeLenght.Days != null?reportAircraftLifeLenght.Days.ToString() : "";

            var lifeLimit      = _reportedBaseComponent.LifeLimit;
            var lifeLimitHours = lifeLimit.Hours != null?lifeLimit.Hours.ToString() : "";

            var lifeLimitCycles = lifeLimit.Cycles != null?lifeLimit.Cycles.ToString() : "";

            var lifeLimitDays = lifeLimit.Days != null?lifeLimit.Days.ToString() : "";

            var remain = new Lifelength(lifeLimit);

            remain.Substract(reportAircraftLifeLenght);
            var remainHours = remain.Hours != null?remain.Hours.ToString() : "";

            var remainCycles = remain.Cycles != null?remain.Cycles.ToString() : "";

            var remainDays = remain.Days != null?remain.Days.ToString() : "";

            var installationDate = _reportedBaseComponent.TransferRecords.GetLast().TransferDate;
            //TODO:(Evgenii Babak)  нужно брать наработку с записи о перемещении, а не пересчитывать заново
            var onInstall      = GlobalObjects.CasEnvironment.Calculator.GetFlightLifelengthOnEndOfDay(_reportedBaseComponent, installationDate);
            var onInstallDate  = installationDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            var onInstallHours = onInstall.Hours != null?onInstall.Hours.ToString() : "";

            var onInstallCycles = onInstall.Cycles != null?onInstall.Cycles.ToString() : "";

            var onInstallDays = onInstall.Days != null?onInstall.Days.ToString() : "";

            var sinceInstall = new Lifelength(reportAircraftLifeLenght);

            sinceInstall.Substract(onInstall);
            var sinceInstallHours = sinceInstall.Hours != null?sinceInstall.Hours.ToString() : "";

            var sinceInstallCycles = sinceInstall.Cycles != null?sinceInstall.Cycles.ToString() : "";

            var sinceInstallDays = sinceInstall.Days != null?sinceInstall.Days.ToString() : "";

            var warranty       = _reportedBaseComponent.Warranty;
            var warrantyRemain = new Lifelength(warranty);

            warrantyRemain.Substract(reportAircraftLifeLenght);
            warrantyRemain.Resemble(warranty);
            var warrantyHours = warranty.Hours != null?warranty.Hours.ToString() : "";

            var warrantyCycles = warranty.Cycles != null?warranty.Cycles.ToString() : "";

            var warrantyDays = warranty.Days != null?warranty.Days.ToString() : "";

            var warrantyRemainHours = warrantyRemain.Hours != null?warrantyRemain.Hours.ToString() : "";

            var warrantyRemainCycles = warrantyRemain.Cycles != null?warrantyRemain.Cycles.ToString() : "";

            var warrantyRemainDays = warrantyRemain.Days != null?warrantyRemain.Days.ToString() : "";

            var parentAircaft          = GlobalObjects.AircraftsCore.GetAircraftById(_reportedBaseComponent.ParentAircraftId);
            var aircraftFrame          = GlobalObjects.ComponentCore.GetBaseComponentById(parentAircaft.AircraftFrameId);
            var aircraftOnInstall      = GlobalObjects.CasEnvironment.Calculator.GetFlightLifelengthOnEndOfDay(aircraftFrame, installationDate);
            var aircraftOnInstallHours = aircraftOnInstall.Hours != null?aircraftOnInstall.Hours.ToString() : "";

            var aircraftOnInstallCycles = aircraftOnInstall.Cycles != null?aircraftOnInstall.Cycles.ToString() : "";

            var aircraftOnInstallDays = aircraftOnInstall.Days != null?aircraftOnInstall.Days.ToString() : "";

            var aircraftCurrent = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(parentAircaft);

            var sinceOverhaul          = Lifelength.Null;
            var lastOverhaulDate       = DateTime.MinValue;
            var lastOverhaulDateString = "";

            #region поиск последнего ремонта и расчет времени, прошедшего с него
            //поиск директив деталей
            List <ComponentDirective> directives = GlobalObjects.ComponentCore.GetComponentDirectives(_reportedBaseComponent, true);
            //поиск директивы ремонта
            List <ComponentDirective> overhauls = directives.Where(d => d.DirectiveType == ComponentRecordType.Overhaul).ToList();
            //поиск последнего ремонта
            ComponentDirective lastOverhaul = null;
            foreach (ComponentDirective d in directives)
            {
                if (d.LastPerformance == null || d.LastPerformance.RecordDate <= lastOverhaulDate)
                {
                    continue;
                }

                lastOverhaulDate = d.LastPerformance.RecordDate;
                lastOverhaul     = d;
            }

            if (lastOverhaul != null)
            {
                sinceOverhaul.Add(reportAircraftLifeLenght);
                sinceOverhaul.Substract(lastOverhaul.LastPerformance.OnLifelength);
                lastOverhaulDateString = lastOverhaul.LastPerformance.RecordDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            }

            #endregion

            destinationDataSet.BaseDetailTable.AddBaseDetailTableRow(_reportedBaseComponent.ATAChapter.ToString(),
                                                                     _reportedBaseComponent.AvionicsInventory.ToString(),
                                                                     _reportedBaseComponent.PartNumber,
                                                                     _reportedBaseComponent.SerialNumber,
                                                                     _reportedBaseComponent.Model != null ? _reportedBaseComponent.Model.FullName : "",
                                                                     _reportedBaseComponent.BaseComponentType.ToString(),
                                                                     _reportedBaseComponent.GetParentAircraftRegNumber(),
                                                                     _reportedBaseComponent.TransferRecords.GetLast().Position,
                                                                     _reportedBaseComponent.Thrust,
                                                                     manufactureDate,
                                                                     deliveryDate,
                                                                     _reportedBaseComponent.MPDItem,
                                                                     _reportedBaseComponent.Suppliers != null
                                                                        ? _reportedBaseComponent.Suppliers.ToString()
                                                                        : "",
                                                                     status,
                                                                     _reportedBaseComponent.Cost,
                                                                     _reportedBaseComponent.CostOverhaul,
                                                                     _reportedBaseComponent.CostServiceable,
                                                                     lifeLimitHours,
                                                                     lifeLimitCycles,
                                                                     lifeLimitDays,
                                                                     sinceNewHours,
                                                                     sinceNewCycles,
                                                                     sinceNewDays,
                                                                     reportAircraftLifeLenght.ToStrings(),
                                                                     remainCycles,
                                                                     remainHours,
                                                                     remainDays,
                                                                     onInstallDate,
                                                                     onInstallHours,
                                                                     onInstallCycles,
                                                                     onInstallDays,
                                                                     sinceInstallHours,
                                                                     sinceInstallCycles,
                                                                     sinceInstallDays,
                                                                     warrantyHours,
                                                                     warrantyCycles,
                                                                     warrantyDays,
                                                                     warrantyRemainHours,
                                                                     warrantyRemainCycles,
                                                                     warrantyRemainDays,
                                                                     aircraftOnInstallHours,
                                                                     aircraftOnInstallCycles,
                                                                     aircraftOnInstallDays,
                                                                     lastOverhaulDateString,
                                                                     sinceOverhaul.Hours ?? 0,
                                                                     sinceOverhaul.Cycles ?? 0,
                                                                     sinceOverhaul.ToStrings());
        }