public CASExcelParserSubcontr()
 {
     FindTitleBehavior      = new FindExcelTitleSubcontr();
     FindPeriodListBehavior = new FindExcelPeriodListSubcontr();
     FindAllocMoneyBehavior = new FindExcelAllocMoneySubcontr();
 }
        /// <summary>
        /// метод нахождения периодов в Excel файле субподрядчика
        /// </summary>
        /// <param name="path"></param>
        public List <Period> FindPeriodList(object[,] array, int index)
        {
            if (this.array == null)
            {
                this.array = array;
                Cell leftTop = findLeftTopCell();
                leftTop.Row--;
                while (array[leftTop.Row - 1, leftTop.Column] == null)
                {
                    leftTop.Row--;
                }
                for (int i = leftTop.Row; i < array.Length / array.GetLength(1); i++)
                {
                    bool swt = false;
                    for (int j = 1; j <= array.GetLength(1); j++)
                    {
                        DateTime date = findDate(array[i, j]);
                        if (date.Year != 2)
                        {
                            leftTop.Row    = i;
                            leftTop.Column = j;
                            swt            = true;
                            break;
                        }
                    }
                    if (swt)
                    {
                        break;
                    }
                }
                DateTime lastDate = new DateTime();
                for (int i = leftTop.Column; i < array.GetLength(1); i++)
                {
                    DateTime newDate = findDate(array[leftTop.Row, i]);
                    if (newDate.Year != 2)
                    {
                        PeriodsList.Add(newDate);
                        ColumnsPeriodsList.Add(i);
                        lastDate = newDate;
                    }
                    else if (!topCell(leftTop.Row, i))
                    {
                        PeriodsList.Add(lastDate);
                        ColumnsPeriodsList.Add(i);
                    }
                }
                SupplementYears(PeriodsList);
            }

            for (int i = 1, j = 0; i < PeriodsList.Count; i++, j++)
            {
                if (PeriodsList[i].Month == PeriodsList[i - 1].Month)
                {
                    DeletedIndexes.Add(i - 1);
                    PeriodsList.RemoveAt(i - 1);
                    i--;
                }
            }

            FindExcelTitleSubcontr finder = new FindExcelTitleSubcontr();
            int            line           = CellOf(finder.FindTitle(array, index).Title).Row;
            List <decimal> moneys         = new List <decimal>();
            decimal        sum            = 0;

            for (int i = 0; i < ColumnsPeriodsList.Count; i++)
            {
                if (DeletedIndexes.Exists(x => x == i))
                {
                    if (array[line, ColumnsPeriodsList[i]] != null)
                    {
                        sum += decimal.Parse(array[line, ColumnsPeriodsList[i]].ToString());
                    }
                    DeletedIndexes.Remove(i);
                    ColumnsPeriodsList.RemoveAt(i);
                    i--;
                }
                else
                {
                    if (array[line, ColumnsPeriodsList[i]] != null)
                    {
                        moneys.Add(sum + decimal.Parse(array[line, ColumnsPeriodsList[i]].ToString()));
                    }
                    else
                    {
                        moneys.Add(sum);
                    }
                    sum = 0;
                }
            }

            List <Period> result = new List <Period>();

            for (int i = 0; i < PeriodsList.Count; i++)
            {
                Period newPeriod = new Period()
                {
                    Date  = PeriodsList[i],
                    Money = moneys[i]
                };
                result.Add(newPeriod);
            }

            return(result);
        }