/// <summary>
 /// Добавление базовых агрегатов в таблицу данных
 /// </summary>
 /// <param name="dataset">Таблица, в которую добавляются данные</param>
 protected virtual void AddDetailsToDataset(DetailListDataSet dataset)
 {
     for (int i = 0; i < reportedDetails.Count; i++)
     {
         AddDetailToDataset(reportedDetails[i], i + 1, dataset);
     }
 }
 /// <summary>
 /// Добавление дополнительной информации
 /// </summary>
 /// <param name="destinationDateSet"></param>
 protected void AddAdditionalInformation(DetailListDataSet destinationDateSet)
 {
     destinationDateSet.AdditionalDataTable.AddAdditionalDataTableRow(0, ReportTitle, dateAsOfData,
                                                                      ProgramSettings.ReportFooter,
                                                                      ProgramSettings.ReportFooterPrepared,
                                                                      ProgramSettings.WebSite);
 }
        /// <summary>
        /// Добавление базовых агрегатов в таблицу данных
        /// </summary>
        /// <param name="dataset">Таблица, в которую добавляются данные</param>
        protected virtual void AddDetailsToDataset(DetailListDataSet dataset)
        {
            int number = 1;

            foreach (Component t in _reportedDetails)
            {
                AddDetailToDataset(t, ref number, dataset);
            }
        }
        /// <summary>
        /// Построить источник данных (DataSet) для вывода в отчет
        /// </summary>
        /// <returns></returns>
        public DetailListDataSet GenerateDataSet()
        {
            DetailListDataSet dataset = new DetailListDataSet();

            AddOperatorToDataset(dataset);
            AddAircraftToDataset(dataset);
            AddDetailsToDataset(dataset);
            AddAdditionalInformation(dataset);
            return(dataset);
        }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="detail">Добавляемый агрегат</param>
        /// <param name="number">Порядковый номер агрегата</param>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        protected virtual void AddDetailToDataset(Detail detail, int number, DetailListDataSet destinationDataSet)
        {
            if (!DefaultFilter.Acceptable(detail))
            {
                return;
            }
            int    aircraftId         = ReportedAircraft.ID;
            string atachapter         = detail.AtaChapter.ShortName;
            string componentNumber    = number.ToString();
            string atachapterfull     = detail.AtaChapter.FullName;
            string partNumber         = detail.PartNumber;
            string description        = detail.Description;
            string serialNumber       = detail.SerialNumber;
            string positionNumber     = detail.PositionNumber;
            string maintanceType      = detail.MaintenanceType.ShortName;
            string instalationDate    = detail.InstallationDate.ToString("MMM dd, yyyy");
            string complianceTSN      = "";
            string complianceDate     = "";
            string complianceWorkType = "";

            if (detail.Limitation.LastPerformance != null)
            {
                complianceTSN = lifelengthFormatter.GetData(detail.Limitation.LastPerformance.Lifelength, "h\r\n", "cyc\r\n", "");
                DateTime tempDateTime = new DateTime(detail.Limitation.LastPerformance.Lifelength.Calendar.Ticks);
                complianceDate     = tempDateTime.ToString("MMM dd, yyyy");
                complianceWorkType = detail.Limitation.LastPerformance.DetailRecordType.ShortName;
            }
            string nextTSN      = "";
            string nextDate     = "";
            string nextRemains  = "";
            string nextWorkType = "";

            if (detail.Limitation.NextPerformance != null)
            {
            }
            string condition = detail.LimitationCondition.GetHashCode().ToString();


            destinationDataSet.ItemsTable.AddItemsTableRow(detail.ID, aircraftId, componentNumber,
                                                           atachapter, atachapterfull, partNumber, description,
                                                           serialNumber, positionNumber,
                                                           maintanceType,
                                                           instalationDate,
                                                           complianceTSN,
                                                           complianceDate,
                                                           complianceWorkType, nextTSN,
                                                           nextDate,
                                                           nextRemains,
                                                           nextWorkType, condition);
        }
        /// <summary>
        /// Добавление дополнительной информации
        /// </summary>
        /// <param name="destinationDateSet"></param>
        /// <param name="addRegistrationNumber">Добавлять ли регистрационный номер ВС в название отчета</param>
        protected void AddAdditionalInformation(DetailListDataSet destinationDateSet, bool addRegistrationNumber)
        {
            string reportHeader = ReportTitle;

            if (addRegistrationNumber)
            {
                reportHeader = _reportedAircraft.RegistrationNumber + ". " + ReportTitle;
            }
            if (_isFiltered)
            {
                reportHeader += ". Filtered";
            }
            string reportFooter         = new GlobalTermsProvider()["ReportFooter"].ToString();
            string reportFooterPrepared = new GlobalTermsProvider()["ReportFooterPrepared"].ToString();
            string reportFooterLink     = new GlobalTermsProvider()["ReportFooterLink"].ToString();

            destinationDateSet.AdditionalDataTable.AddAdditionalDataTableRow(ReportType, reportHeader, _dateAsOfData, reportFooter,
                                                                             reportFooterPrepared, reportFooterLink);
        }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        protected virtual void AddAircraftToDataset(DetailListDataSet destinationDataSet)
        {
            int    operatorId          = destinationDataSet.OperatorInfomationTable.FindByOperatorId(reportedAircraft.Parent.ID).OperatorId;
            string registrationNumber  = reportedAircraft.RegistrationNumber;
            string serialNumber        = reportedAircraft.SerialNumber;
            string manufactureDate     = reportedAircraft.ManufactureDate.ToString("MMM dd, yyyy");
            string lineNumber          = "";
            string variableNumber      = "";
            string SinceNewHours       = lifelengthFormatter.GetHoursData(reportedAircraft.Limitation.ResourceSinceNew.Hours).Trim();
            int    sinceNewCycles      = reportedAircraft.Limitation.ResourceSinceNew.Cycles;
            string SinceOverhaulHours  = lifelengthFormatter.GetHoursData(reportedAircraft.Limitation.ResourceSinceOverhaul.Hours).Trim();
            int    sinceOverhaulCycles = reportedAircraft.Limitation.ResourceSinceOverhaul.Cycles;

            if (reportedAircraft is WestAircraft)
            {
                lineNumber     = ((WestAircraft)reportedAircraft).LineNumber;
                variableNumber = ((WestAircraft)reportedAircraft).VariableNumber;
            }
            string model = reportedAircraft.Model;

            destinationDataSet.AircraftInformationTable.AddAircraftInformationTableRow(reportedAircraft.ID, operatorId, registrationNumber, serialNumber,
                                                                                       manufactureDate, lineNumber, variableNumber, SinceNewHours, sinceNewCycles, SinceOverhaulHours, sinceOverhaulCycles, model);
        }
 /// <summary>
 /// Добавляется оператора в таблицу данных
 /// </summary>
 /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
 protected virtual void AddOperatorToDataset(DetailListDataSet destinationDataSet)
 {
     destinationDataSet.OperatorInfomationTable.AddOperatorInfomationTableRow(reportedOperator.ID, reportedOperator.Name, reportedOperator.ICAOCode);
 }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="componentобавляемый агрегат</param>
        /// <param name="previousNumber">Порядковый номер агрегата</param>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        protected virtual void AddDetailToDataset(Component component, ref int previousNumber, DetailListDataSet destinationDataSet)
        {
            string atachapter;
            string componentNumber;
            string atachapterfull;
            string partNumber;
            string description;
            string serialNumber;
            string positionNumber;
            string maintanceType;
            string instalationDate;

            AtaChapter ata = component.ATAChapter;

            atachapter      = ata.ShortName;
            componentNumber = (previousNumber++).ToString();
            atachapterfull  = ata.FullName;
            partNumber      = component.PartNumber;
            description     = component.Description;
            serialNumber    = component.SerialNumber;
            positionNumber  = component.TransferRecords.Count > 0
                ? component.TransferRecords.GetLast().Position : "";
            maintanceType   = "";//((Detail) detail).MaintenanceType.ShortName;
            instalationDate = component.TransferRecords.Count > 0
                ? UsefulMethods.NormalizeDate(component.TransferRecords.GetLast().TransferDate) : "";

            string complianceTSN      = "";
            string complianceDate     = "";
            string complianceWorkType = "";

            /*       if ((Deta)detail. != null)
             *     {
             *         complianceDate = UsefulMethods.NormalizeDate(detail.Limitation.LastPerformance.RecordDate);
             *         if (complianceDate != "")
             *             complianceTSN = lifelengthFormatter.GetHoursData(detail.Limitation.LastPerformance.Lifelength, " hrs\r\n") +
             *                             lifelengthFormatter.GetCyclesData(detail.Limitation.LastPerformance.Lifelength, " cyc\r\n");
             *         else
             *             complianceTSN = lifelengthFormatter.GetData(detail.Limitation.LastPerformance.Lifelength, " hrs\r\n", " cyc\r\n", " day");
             *         complianceWorkType = detail.Limitation.LastPerformance.RecordType.ShortName;
             *     }*/

            string nextTSN      = "";
            string nextDate     = "";
            string nextRemains  = "";
            string nextWorkType = "";

/*
 *          nextDate = UsefulMethods.NormalizeDate(detail.Limitation.NextDate);
 *          nextRemains = lifelengthFormatter.GetData(detail.Limitation.LeftTillNextPerformance, " hrs\r\n", " cyc\r\n", " day");
 *          if (detail.Limitation.NextPerformance != null)
 *          {
 *              if (nextDate != "")
 *                  nextTSN = lifelengthFormatter.GetHoursData(detail.Limitation.NextPerformance, " hrs\r\n") +
 *                            lifelengthFormatter.GetCyclesData(detail.Limitation.NextPerformance, " cyc\r\n");
 *              else
 *                  nextTSN = lifelengthFormatter.GetData(detail.Limitation.NextPerformance, " hrs\r\n", " cyc\r\n", " day");
 *          }
 *          if (detail.Limitation.NextWorkType != null)
 *          {
 *              nextWorkType = detail.Limitation.NextWorkType.ShortName;
 *          }
 */

            GlobalObjects.PerformanceCalculator.GetNextPerformance(component);

            string condition = component.Condition.GetHashCode().ToString();


            destinationDataSet.ItemsTable.AddItemsTableRow(componentNumber,
                                                           atachapter, atachapterfull, partNumber, description,
                                                           serialNumber, positionNumber,
                                                           maintanceType,
                                                           instalationDate,
                                                           complianceTSN,
                                                           complianceDate,
                                                           complianceWorkType, nextTSN,
                                                           nextDate,
                                                           nextRemains,
                                                           nextWorkType, condition, "", "", "", "", "", "", "", "", "", "");
        }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        protected void AddAircraftToDataset(DetailListDataSet destinationDataSet)
        {
            var    registrationNumber    = _reportedAircraft.RegistrationNumber;
            var    serialNumber          = _reportedAircraft.SerialNumber;
            var    manufactureDate       = _reportedAircraft.ManufactureDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            var    lineNumberCaption     = "";
            var    variableNumberCaption = "";
            var    lifelength            = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(_reportedAircraft);
            var    sinceNewHours         = lifelength.Hours.ToString();
            var    sinceNewCycles        = lifelength.Cycles.ToString().Trim();
            string averageUtilizationHours;
            string averageUtilizationCycles;
            string averageUtilizationHoursTitle;
            string averageUtilizationCyclesTitle;

            var aircraftFrame      = GlobalObjects.ComponentCore.GetBaseComponentById(_reportedAircraft.AircraftFrameId);
            var averageUtilization = GlobalObjects.AverageUtilizationCore.GetAverageUtillization(aircraftFrame);

            if (averageUtilization.SelectedInterval == UtilizationInterval.Dayly)
            {
                averageUtilizationHoursTitle  = "FH/DAY: ";
                averageUtilizationHours       = averageUtilization.Hours.ToString();
                averageUtilizationCyclesTitle = "FC/DAY: ";
                averageUtilizationCycles      = averageUtilization.Cycles.ToString();
            }
            else
            {
                averageUtilizationHoursTitle  = "FH/MONTH: ";
                averageUtilizationHours       = averageUtilization.Hours.ToString();
                averageUtilizationCyclesTitle = "FC/MONTH: ";
                averageUtilizationCycles      = averageUtilization.Cycles.ToString();
            }

            /*if (reportedAircraft is AircraftProxy)
             * {*/
            var lineNumber     = (_reportedAircraft).LineNumber;
            var variableNumber = (_reportedAircraft).VariableNumber;

            if (lineNumber != "")
            {
                lineNumberCaption = "L/N:";
            }
            if (variableNumber != "")
            {
                variableNumberCaption = "V/N:";
            }

            /* }
             * if (reportedAircraft is WestAircraft)
             * {
             *   lineNumber = ((WestAircraft)reportedAircraft).LineNumber;
             *   variableNumber = ((WestAircraft)reportedAircraft).VariableNumber;
             *   if (lineNumber != "")
             *       lineNumberCaption = "L/N:";
             *   if (variableNumber != "")
             *       variableNumberCaption = "V/N:";
             * }//todo что то надо сделать с этим...так не пойдет*/
            destinationDataSet.AircraftInformationTable.AddAircraftInformationTableRow(registrationNumber,
                                                                                       serialNumber,
                                                                                       manufactureDate,
                                                                                       lineNumberCaption,
                                                                                       variableNumberCaption,
                                                                                       lineNumber,
                                                                                       variableNumber,
                                                                                       sinceNewHours,
                                                                                       sinceNewCycles,
                                                                                       "",
                                                                                       "",
                                                                                       _reportedAircraft.Model.ToString(),
                                                                                       averageUtilizationHours,
                                                                                       averageUtilizationCycles,
                                                                                       averageUtilizationHoursTitle,
                                                                                       averageUtilizationCyclesTitle);
        }
 /// <summary>
 /// Добавляется оператора в таблицу данных
 /// </summary>
 /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
 protected virtual void AddOperatorToDataset(DetailListDataSet destinationDataSet)
 {
     destinationDataSet.OperatorInfomationTable.AddOperatorInfomationTableRow(_reportedOperator.Name, _reportedOperator.LogoTypeWhite);
 }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="componentобавляемый агрегат</param>
        /// <param name="previousNumber">Порядковый номер агрегата</param>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        protected override void AddDetailToDataset(Component component, ref int previousNumber, DetailListDataSet destinationDataSet)
        {
            var ata                    = component.ATAChapter;
            var atachapter             = ata.ShortName;
            var componentNumber        = (previousNumber++).ToString();
            var atachapterfull         = ata.FullName;
            var partNumber             = component.PartNumber;
            var description            = component.Description;
            var serialNumber           = component.SerialNumber;
            var lastTransferRecord     = component.TransferRecords.GetLast();
            var positionNumber         = lastTransferRecord.Position;
            var instalationDate        = UsefulMethods.NormalizeDate(lastTransferRecord.TransferDate);
            var installationLifelength = lastTransferRecord.OnLifelength;
            var remarks                = component.Remarks;

            GlobalObjects.PerformanceCalculator.GetNextPerformance(component);
            var current            = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength(component);
            var installationTsncsn = LifelengthFormatter.GetHoursData(installationLifelength, " hrs\r\n") +
                                     LifelengthFormatter.GetCyclesData(installationLifelength, " cyc\r\n");
            var currentTsncsn = LifelengthFormatter.GetHoursData(current, " hrs\r\n") +
                                LifelengthFormatter.GetCyclesData(current, " cyc\r\n");
            var condition = component.Condition.GetHashCode().ToString();
            var lifelengthAircraftTime = current;

            lifelengthAircraftTime.Substract(installationLifelength);
            var aircraftTime = LifelengthFormatter.GetHoursData(lifelengthAircraftTime, " hrs\r\n") +
                               LifelengthFormatter.GetCyclesData(lifelengthAircraftTime, " cyc\r\n");

            destinationDataSet.ItemsTable.AddItemsTableRow(componentNumber, atachapter, atachapterfull, partNumber, description, serialNumber, positionNumber, "",
                                                           instalationDate, "", "", "", "", "",
                                                           "", "", condition, aircraftTime, "", "", "", "", "", "",
                                                           installationTsncsn, remarks, currentTsncsn);
        }
        /// <summary>
        /// Добавляется элемент в таблицу данных
        /// </summary>
        /// <param name="componentобавляемый агрегат</param>
        /// <param name="previousNumber">Порядковый номер агрегата</param>
        /// <param name="destinationDataSet">Таблица, в которую добавляется элемент</param>
        protected override void AddDetailToDataset(Component component, ref int previousNumber, DetailListDataSet destinationDataSet)
        {
            Lifelength remainsLifelength;
            Lifelength current;
            DateTime?  nextDateTime;

            var ataChapter             = component.ATAChapter;
            var atachapter             = ataChapter.ShortName;
            var atachapterfull         = ataChapter.FullName;
            var partNumber             = component.PartNumber;
            var description            = component.Description;
            var serialNumber           = component.SerialNumber;
            var lastTransferRecord     = component.TransferRecords.GetLast();
            var positionNumber         = lastTransferRecord.Position;
            var instalationDateTime    = lastTransferRecord.TransferDate;
            var installationLifelength = lastTransferRecord.OnLifelength;
            var remarks          = component.Remarks;
            var lifeLimit        = component.LifeLimit;
            var mpdItem          = component.MPDItem;
            var detailDirectives = new List <ComponentDirective>(component.ComponentDirectives.ToArray());

            GlobalObjects.PerformanceCalculator.GetNextPerformance(component);
            current           = GlobalObjects.CasEnvironment.Calculator.GetCurrentFlightLifelength((BaseEntityObject)component);
            nextDateTime      = component.NextPerformanceDate;
            remainsLifelength = component.Remains;

            var instalationDate    = UsefulMethods.NormalizeDate(instalationDateTime);
            var installationTsncsn = LifelengthFormatter.GetHoursData(installationLifelength, " hrs\r\n") +
                                     LifelengthFormatter.GetCyclesData(installationLifelength, " cyc\r\n");
            var currentTsncsn = LifelengthFormatter.GetHoursData(current, " hrs\r\n") +
                                LifelengthFormatter.GetCyclesData(current, " cyc\r\n");
            var condition = UsefulMethods.GetColorName(component);
            var nextDate  = nextDateTime != null
                                  ? ((DateTime)nextDateTime).ToString(new GlobalTermsProvider()["DateFormat"].ToString())
                                  : "";
            var componentNumber = (previousNumber++).ToString();

            if (lifeLimit != Lifelength.Null)
            {
                var workType   = "RMV";
                var nextTsncsn = LifelengthFormatter.GetHoursData(lifeLimit, " hrs\r\n") +
                                 LifelengthFormatter.GetCyclesData(lifeLimit, " cyc\r\n");
                var remains = LifelengthFormatter.GetCalendarData(remainsLifelength, " d\r\n") +
                              LifelengthFormatter.GetHoursData(remainsLifelength, " h\r\n") +
                              LifelengthFormatter.GetCyclesData(remainsLifelength, " c\r\n");
                if (remains == "")
                {
                    nextDate   = "";
                    nextTsncsn = "";
                }
                destinationDataSet.ItemsTable.AddItemsTableRow(componentNumber, atachapter, atachapterfull, partNumber, description, serialNumber, positionNumber, "", instalationDate, "", "", workType, nextTsncsn, nextDate, remains, "", condition, "", "", "", "", "", "", mpdItem, installationTsncsn, remarks, currentTsncsn);
                foreach (ComponentDirective t in detailDirectives)
                {
                    AddDetailDirectiveToDatatSet("", "", "", "", "", "", "", "", "", t, ataChapter, destinationDataSet);
                }
            }
            else if (detailDirectives.Count > 0)
            {
                AddDetailDirectiveToDatatSet(componentNumber, mpdItem, partNumber, description, serialNumber, positionNumber, instalationDate, installationTsncsn, currentTsncsn, detailDirectives[0], ataChapter, destinationDataSet);
                for (int i = 1; i < detailDirectives.Count; i++)
                {
                    AddDetailDirectiveToDatatSet("", "", "", "", "", "", "", "", "", detailDirectives[i], ataChapter, destinationDataSet);
                }
            }
            else
            {
                destinationDataSet.ItemsTable.AddItemsTableRow(componentNumber, atachapter, atachapterfull, partNumber, description, serialNumber, positionNumber, "", instalationDate, "", "", "", "", "", "", "", condition, "", "", "", "", "", "", mpdItem, installationTsncsn, remarks, currentTsncsn);
            }
        }
        private void AddDetailDirectiveToDatatSet(string number, string mpdItem, string partNumber, string description, string serialNumber, string positionNumber, string installationDate, string installationTsncsn, string currentTsncsn, ComponentDirective directive, AtaChapter ataChapter, DetailListDataSet destinationDataSet)
        {
            var workType             = directive.DirectiveType.ShortName;
            var lastComplianceTsncsn = "";
            var lastComplianceDate   = "";
            var nextDate             = "";

            GlobalObjects.PerformanceCalculator.GetNextPerformance(directive);
            var nextTsncsn = LifelengthFormatter.GetHoursData(directive.NextPerformanceSource, " hrs\r\n") + LifelengthFormatter.GetCyclesData(directive.NextPerformanceSource, " cyc\r\n");

            if (directive.NextPerformanceDate != null)
            {
                nextDate = ((DateTime)directive.NextPerformanceDate).ToString(new GlobalTermsProvider()["DateFormat"].ToString());
            }
            var remains = LifelengthFormatter.GetCalendarData(directive.Remains, " d\r\n") + LifelengthFormatter.GetHoursData(directive.Remains, " h\r\n") + LifelengthFormatter.GetCyclesData(directive.Remains, " c\r\n");

            if (remains == "")
            {
                nextDate   = "";
                nextTsncsn = "";
            }
            var directiveRemarks = "";

            if (directive.LastPerformance != null)
            {
                var lastComplianceTsncsnlLifelength = directive.LastPerformance.OnLifelength;
                lastComplianceTsncsn = LifelengthFormatter.GetHoursData(lastComplianceTsncsnlLifelength, " hrs\r\n") + LifelengthFormatter.GetCyclesData(lastComplianceTsncsnlLifelength, " cyc\r\n");
                lastComplianceDate   = directive.LastPerformance.RecordDate.ToString(new GlobalTermsProvider()["DateFormat"].ToString());
                directiveRemarks     = directive.LastPerformance.Remarks;
            }

            var condition = directive.Condition.ToString();

            destinationDataSet.ItemsTable.AddItemsTableRow(number,
                                                           ataChapter.ShortName, ataChapter.FullName, partNumber, description,
                                                           serialNumber, positionNumber,
                                                           "",
                                                           installationDate,
                                                           lastComplianceTsncsn,
                                                           lastComplianceDate,
                                                           workType, nextTsncsn,
                                                           nextDate,
                                                           "",
                                                           "", condition, "", remains, "", "", "", "", mpdItem, installationTsncsn,
                                                           directiveRemarks, currentTsncsn);
        }