public JsonResult AddClaimPosition(SpecificationPosition model)
 {
     var isComplete = false;
     try
     {
         var user = GetUser();
         model.State = 1;
         model.Author = user.Id;
         model.Currency = 1;
         var modelValid = true;
         if (string.IsNullOrEmpty(model.Name)) modelValid = false;
         if (modelValid)
         {
             var db = new DbEngine();
             isComplete = db.SaveSpecificationPosition(model);
             if (string.IsNullOrEmpty(model.CatalogNumber)) model.CatalogNumber = string.Empty;
             if (string.IsNullOrEmpty(model.Replace)) model.Replace = string.Empty;
             if (string.IsNullOrEmpty(model.Comment)) model.Comment = string.Empty;
         }
     }
     catch (Exception)
     {
         isComplete = false;
     }
     return Json(new { IsComplete = isComplete, Model = model });
 }
 //Проверка позиции на уникальность по отношению к переданому массиву позиций
 private bool IsPositionUnique(SpecificationPosition model, List<SpecificationPosition> list)
 {
     var isUnique = true;
     foreach (var position in list)
     {
         if (model.CatalogNumber == position.CatalogNumber &&
             model.Comment == position.Comment &&
             model.Name == position.Name &&
             model.Price.Equals(position.Price) &&
             model.ProductManager == position.ProductManager &&
             model.Replace == position.Replace &&
             model.RowNumber == position.RowNumber &&
             model.Sum.Equals(position.Sum) &&
             model.PriceTzr.Equals(position.PriceTzr) &&
             model.SumTzr.Equals(position.SumTzr) &&
             model.PriceNds.Equals(position.PriceNds) &&
             model.SumNds.Equals(position.SumNds) &&
             model.Unit == position.Unit &&
             model.Value == position.Value)
         {
             isUnique = false;
             break;
         }
     }
     return isUnique;
 }
 public JsonResult EditClaimPosition(SpecificationPosition model)
 {
     var isComplete = false;
     try
     {
         var user = GetUser();
         var db = new DbEngine();
         var claimStatus = db.LoadLastStatusHistoryForClaim(model.IdClaim);
         if (claimStatus == null || claimStatus.Status == null ||  claimStatus.Status.ToString() == "1")
             model.State = 1;
         else model.State = 5;
         model.Author = user.Id;
         var modelValid = true;
         if (string.IsNullOrEmpty(model.Name)) modelValid = false;
         if (modelValid)
         {
             isComplete = db.UpdateSpecificationPosition(model);
         }
     }
     catch (Exception)
     {
         isComplete = false;
     }
     return Json(new { IsComplete = isComplete });
 }
        public ActionResult UploadFileForm(HttpPostedFileBase file, int claimId)
        {
            var error = false;
            var message = string.Empty;
            XLWorkbook excBook = null;
            Stream inputStream = null;
            var positions = new List<SpecificationPosition>();
            try
            {
                if (file == null || !file.FileName.EndsWith(".xlsx"))
                {
                    error = true;
                    message = "Файл не предоставлен или имеет неверный формат";
                }
                else
                {
                    var productManagers = UserHelper.GetProductManagers();
                    inputStream = file.InputStream;
                    inputStream.Seek(0, SeekOrigin.Begin);
                    excBook = new XLWorkbook(inputStream);
                    //разбор файла
                    var workSheet = excBook.Worksheet("Лот");
                    if (workSheet != null)
                    {
                        var user = GetUser();
                        //<<<<<<<Номер строки - начало разбора инфы>>>>>>
                        var row = 5;
                        var errorStringBuilder = new StringBuilder();
                        var repeatRowCount = 0;
                        var db = new DbEngine();
                        //var currencies = db.LoadCurrencies();
                        //проход по всем строкам
                        while (true)
                        {
                            var rowValid = true;
                            var model = new SpecificationPosition()
                            {
                                CatalogNumber = string.Empty,
                                Comment = string.Empty,
                                Name = string.Empty,
                                ProductManager = new ProductManager() { Id = string.Empty, Name = string.Empty },
                                Replace = string.Empty,
                                IdClaim = claimId,
                                State = 1,
                                Author = user.Id,
                                Currency = 1,
                            };
                            //получение ячеек с инфой по позициям
                            var numberRange = workSheet.Cell(row, 1);
                            var catalogNumberRange = workSheet.Cell(row, 2);
                            var nameRange = workSheet.Cell(row, 3);
                            //var replaceRange = workSheet.Cell(row, 4);
                            var unitRange = workSheet.Cell(row, 4);
                            var valueRange = workSheet.Cell(row, 5);
                            var managerRange = workSheet.Cell(row, 6);
                            //var currencyRange = workSheet.Cell(row, 8);
                            //var priceRange = workSheet.Cell(row, 9);
                            //var sumRange = workSheet.Cell(row, 10);
                            //var priceTzrRange = workSheet.Cell(row, 11);
                            //var sumTzrRange = workSheet.Cell(row, 12);
                            //var priceNdsRange = workSheet.Cell(row, 13);
                            //var sumNdsRange = workSheet.Cell(row, 14);
                            var commentRange = workSheet.Cell(row, 7);
                            //наименование
                            if (nameRange != null && nameRange.Value != null)
                            {
                                string nameValue = nameRange.Value.ToString();
                                if (string.IsNullOrEmpty(nameValue))
                                {
                                    break;
                                }
                                model.Name = nameValue;
                            }
                            else
                            {
                                break;
                            }
                            //разбор инфы по Порядковый номер
                            if (numberRange != null && numberRange.Value != null)
                            {
                                string numberValue = numberRange.Value.ToString();
                                if (!string.IsNullOrEmpty(numberValue))
                                {
                                    int intValue;
                                    var isValidInt = int.TryParse(numberValue, out intValue);
                                    if (!isValidInt)
                                    {
                                        rowValid = false;
                                        errorStringBuilder.Append("Строка: " + row +
                                                                  ", значение '" + numberValue + "' в поле Порядковый номер не является целым числом<br/>");
                                    }
                                    else
                                    {
                                        model.RowNumber = intValue;
                                    }
                                }
                            }
                            //разбор инфы по Каталожный номер, Замена, Единицы
                            if (catalogNumberRange != null && catalogNumberRange.Value != null)
                            {
                                model.CatalogNumber = catalogNumberRange.Value.ToString();
                            }
                            //if (replaceRange != null && replaceRange.Value != null)
                            //{
                            //    model.Replace = replaceRange.Value.ToString();
                            //}
                            if (unitRange != null && unitRange.Value != null)
                            {
                                var value = unitRange.Value.ToString();
                                switch (value)
                                {
                                    case "шт":
                                        model.Unit = PositionUnit.Thing;
                                        break;
                                    case "упак":
                                        model.Unit = PositionUnit.Package;
                                        break;
                                    case "м":
                                        model.Unit = PositionUnit.Metr;
                                        break;
                                    default:
                                        model.Unit = PositionUnit.Thing;
                                        break;
                                }
                            }
                            else
                            {
                                model.Unit = PositionUnit.Thing;
                            }
                            //разбор инфы по Количество
                            if (valueRange != null)
                            {
                                if (valueRange.Value == null || string.IsNullOrEmpty(valueRange.Value.ToString()))
                                {
                                    rowValid = false;
                                    errorStringBuilder.Append("Строка: " + row +
                                                              ", не задано обязательное значение Количество<br/>");
                                }
                                else
                                {
                                    string valueValue = valueRange.Value.ToString();
                                    int intValue;
                                    var isValidInt = int.TryParse(valueValue, out intValue);
                                    if (!isValidInt)
                                    {
                                        rowValid = false;
                                        errorStringBuilder.Append("Строка: " + row +
                                                                  ", значение '" + valueValue + "' в поле Количество не является целым числом<br/>");
                                    }
                                    else
                                    {
                                        model.Value = intValue;
                                    }
                                }
                            }
                            //разбор инфы по Снабженец
                            if (managerRange == null || managerRange.Value == null || string.IsNullOrEmpty(managerRange.Value.ToString()))
                            {
                                rowValid = false;
                                errorStringBuilder.Append("Строка: " + row +
                                                          ", не задано обязательное значение Снабженец<br/>");
                            }
                            else
                            {
                                var managerFromAd =
                                    productManagers.FirstOrDefault(
                                        x => GetUniqueDisplayName(x) == managerRange.Value.ToString());
                                if (managerFromAd != null) model.ProductManager = managerFromAd;
                                else
                                {
                                    rowValid = false;
                                    errorStringBuilder.Append("Строка: " + row +
                                                              ", не найден Снабженец: " + managerRange.Value + "<br/>");
                                }
                            }
                            if (commentRange != null && commentRange.Value != null)
                            {
                                model.Comment = commentRange.Value.ToString();
                            }
                            //разбор инфы по Ценам и Суммам
                            //if (priceRange != null && priceRange.Value != null)
                            //{
                            //    string priceValue = priceRange.Value.ToString();
                            //    if (!string.IsNullOrEmpty(priceValue))
                            //    {
                            //        double doubleValue;
                            //        var isValidDouble = double.TryParse(priceValue, out doubleValue);
                            //        if (!isValidDouble)
                            //        {
                            //            rowValid = false;
                            //            errorStringBuilder.Append("Строка: " + row +
                            //                                      ", значение '" + priceValue + "' в поле Цена за единицу не является числом<br/>");
                            //        }
                            //        else
                            //        {
                            //            model.Price = doubleValue;
                            //        }
                            //    }
                            //}
                            //if (sumRange != null && sumRange.Value != null)
                            //{
                            //    string sumValue = sumRange.Value.ToString();
                            //    if (!string.IsNullOrEmpty(sumValue))
                            //    {
                            //        double doubleValue;
                            //        var isValidDouble = double.TryParse(sumValue, out doubleValue);
                            //        if (!isValidDouble)
                            //        {
                            //            rowValid = false;
                            //            errorStringBuilder.Append("Строка: " + row +
                            //                                      ", значение '" + sumValue + "' в поле Сумма не является числом<br/>");
                            //        }
                            //        else
                            //        {
                            //            model.Sum = doubleValue;
                            //        }
                            //    }
                            //}
                            //if (priceTzrRange != null && priceTzrRange.Value != null)
                            //{
                            //    string priceTzrValue = priceTzrRange.Value.ToString();
                            //    if (!string.IsNullOrEmpty(priceTzrValue))
                            //    {
                            //        double doubleValue;
                            //        var isValidDouble = double.TryParse(priceTzrValue, out doubleValue);
                            //        if (!isValidDouble)
                            //        {
                            //            rowValid = false;
                            //            errorStringBuilder.Append("Строка: " + row +
                            //                                      ", значение '" + priceTzrValue + "' в поле Цена с ТЗР не является числом<br/>");
                            //        }
                            //        else
                            //        {
                            //            model.PriceTzr = doubleValue;
                            //        }
                            //    }
                            //}
                            //if (sumTzrRange != null && sumTzrRange.Value != null)
                            //{
                            //    string sumTzrValue = sumTzrRange.Value.ToString();
                            //    if (!string.IsNullOrEmpty(sumTzrValue))
                            //    {
                            //        double doubleValue;
                            //        var isValidDouble = double.TryParse(sumTzrValue, out doubleValue);
                            //        if (!isValidDouble)
                            //        {
                            //            rowValid = false;
                            //            errorStringBuilder.Append("Строка: " + row +
                            //                                      ", значение '" + sumTzrValue + "' в поле Сумма с ТЗР не является числом<br/>");
                            //        }
                            //        else
                            //        {
                            //            model.SumTzr = doubleValue;
                            //        }
                            //    }
                            //}
                            //if (priceNdsRange != null && priceNdsRange.Value != null)
                            //{
                            //    string priceNdsValue = priceNdsRange.Value.ToString();
                            //    if (!string.IsNullOrEmpty(priceNdsValue))
                            //    {
                            //        double doubleValue;
                            //        var isValidDouble = double.TryParse(priceNdsValue, out doubleValue);
                            //        if (!isValidDouble)
                            //        {
                            //            rowValid = false;
                            //            errorStringBuilder.Append("Строка: " + row +
                            //                                      ", значение '" + priceNdsValue + "' в поле Цена с НДС не является числом<br/>");
                            //        }
                            //        else
                            //        {
                            //            model.PriceNds = doubleValue;
                            //        }
                            //    }
                            //}
                            //if (sumNdsRange != null && sumNdsRange.Value != null)
                            //{
                            //    string sumNdsValue = sumNdsRange.Value.ToString();
                            //    if (!string.IsNullOrEmpty(sumNdsValue))
                            //    {
                            //        double doubleValue;
                            //        var isValidDouble = double.TryParse(sumNdsValue, out doubleValue);
                            //        if (!isValidDouble)
                            //        {
                            //            rowValid = false;
                            //            errorStringBuilder.Append("Строка: " + row +
                            //                                      ", значение '" + sumNdsValue + "' в поле Сумма с НДС числом<br/>");
                            //        }
                            //        else
                            //        {
                            //            model.SumNds = doubleValue;
                            //        }
                            //    }
                            //}
                            //if (currencyRange != null && currencyRange.Value != null && !string.IsNullOrEmpty(currencyRange.Value.ToString()))
                            //{
                            //    var value = currencyRange.Value.ToString();
                            //    var currency = currencies.FirstOrDefault(x => x.Value == value);
                            //    if (currency != null)
                            //    {
                            //        model.Currency = currency.Id;
                            //    }
                            //    else
                            //    {
                            //        rowValid = false;
                            //        errorStringBuilder.Append("Строка: " + row +
                            //                              ", не найдена Валюта: " + value + "<br/>");
                            //    }
                            //}
                            //else
                            //{
                            //    if (!model.Sum.Equals(0) || !model.Price.Equals(0) || !model.PriceTzr.Equals(0) || !model.SumTzr.Equals(0) || !model.SumNds.Equals(0) || !model.PriceNds.Equals(0))
                            //    {
                            //        rowValid = false;
                            //        errorStringBuilder.Append("Строка: " + row +
                            //                                  ", не задано обязательное значение Валюта<br/>");
                            //    }
                            //    else
                            //    {
                            //        model.Currency = 1;
                            //    }
                            //}
                            if (rowValid)
                            {
                                var isUnique = IsPositionUnique(model, positions);
                                if (isUnique)
                                {
                                    isUnique = db.ExistsSpecificationPosition(model);
                                }
                                if (isUnique)
                                {
                                    positions.Add(model);
                                }
                                else
                                {
                                    repeatRowCount++;
                                }
                            }
                            row++;
                        }
                        //сохранение полученых позиций в БД

                        message = "Получено строк:    " + (row - 5);
                        if (repeatRowCount > 0)
                        {
                            message += "<br/>Из них повторных: " + repeatRowCount;
                        }
                        else
                        {
                            message += "<br/>Из них повторных: 0";
                        }
                        if (positions.Any())
                        {
                            message += "<br/>Сохранено строк:   " + positions.Count();
                        }
                        else
                        {
                            message += "<br/>Сохранено строк:   0";
                        }
                        var errorMessage = errorStringBuilder.ToString();
                        if (!string.IsNullOrEmpty(errorMessage))
                        {
                            message += "<br/>Ошибки:<br/>" + errorMessage;
                        }
                        else
                        {
                            message += "<br/>Ошибки:                   нет";
                        }
                    }
                    else
                    {
                        error = true;
                        message = "Не найден рабочий лист со спецификациями";
                    }
                    excBook.Dispose();
                    excBook = null;
                }
            }
            catch (Exception)
            {
                error = true;
                message = "Ошибка сервера";
            }
            finally
            {
                if (inputStream != null)
                {
                    inputStream.Dispose();
                }
                if (excBook != null)
                {
                    excBook.Dispose();
                }
            }
            ViewBag.FirstLoad = false;
            ViewBag.Error = error.ToString().ToLowerInvariant();
            ViewBag.Message = message;
            ViewBag.Positions = positions;
            ViewBag.IdClaim = claimId;
            return View();
        }
 public List<SpecificationPosition> LoadSpecificationPositionsForTenderClaimForProduct(int claimId, string product, int version)
 {
     var list = new List<SpecificationPosition>();
     using (var conn = new SqlConnection(_connectionString))
     {
         var cmd = conn.CreateCommand();
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = "LoadClaimPositionForTenderClaimForProduct";
         cmd.Parameters.AddWithValue("@id", claimId);
         cmd.Parameters.AddWithValue("@product", product);
         cmd.Parameters.AddWithValue("@calcVersion", version);
         conn.Open();
         var rd = cmd.ExecuteReader();
         if (rd.HasRows)
         {
             while (rd.Read())
             {
                 var model = new SpecificationPosition()
                 {
                     Id = rd.GetInt32(0),
                     RowNumber = rd.GetInt32(2),
                     CatalogNumber = rd.GetString(3),
                     Name = rd.GetString(4),
                     Replace = rd.GetString(5),
                     Unit = (PositionUnit)Enum.Parse(typeof(PositionUnit), rd.GetString(6)),
                     Value = rd.GetInt32(7),
                     ProductManager = new ProductManager() {Id = rd.GetString(8)},
                     Comment = rd.GetString(9),
                     Price = (double)rd.GetDecimal(10),
                     Sum = (double)rd.GetDecimal(11),
                     State = rd.GetInt32(12),
                     Author = rd.GetString(13),
                     Currency = rd.GetInt32(17),
                     PriceTzr = (double)rd.GetDecimal(18),
                     SumTzr = (double)rd.GetDecimal(19),
                     PriceNds = (double)rd.GetDecimal(20),
                     SumNds = (double)rd.GetDecimal(21),
                 };
                 if (model.Sum.Equals(-1)) model.Sum = 0;
                 if (model.Price.Equals(-1)) model.Price = 0;
                 if (model.PriceTzr.Equals(-1)) model.PriceTzr = 0;
                 if (model.SumTzr.Equals(-1)) model.SumTzr = 0;
                 if (model.PriceNds.Equals(-1)) model.PriceNds = 0;
                 if (model.SumNds.Equals(-1)) model.SumNds = 0;
                 if (model.RowNumber == -1) model.RowNumber = 0;
                 list.Add(model);
             }
         }
         rd.Dispose();
     }
     return list;
 }
 public bool ExistsSpecificationPosition(SpecificationPosition model)
 {
     var result = false;
     using (var conn = new SqlConnection(_connectionString))
     {
         var cmd = conn.CreateCommand();
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = "ExistsClaimPosition";
         if (!string.IsNullOrEmpty(model.Replace))
             cmd.Parameters.AddWithValue("@replaceValue", model.Replace);
         if (!string.IsNullOrEmpty(model.CatalogNumber))
             cmd.Parameters.AddWithValue("@catalogNumber", model.CatalogNumber);
         if (!model.Price.Equals(0)) cmd.Parameters.AddWithValue("@price", model.Price);
         if (!model.Sum.Equals(0)) cmd.Parameters.AddWithValue("@sumMax", model.Sum);
         if (!model.PriceTzr.Equals(0)) cmd.Parameters.AddWithValue("@priceTzr", model.PriceTzr);
         if (!model.SumTzr.Equals(0)) cmd.Parameters.AddWithValue("@sumTzr", model.SumTzr);
         if (!model.PriceNds.Equals(0)) cmd.Parameters.AddWithValue("@priceNds", model.PriceNds);
         if (!model.SumNds.Equals(0)) cmd.Parameters.AddWithValue("@sumNds", model.SumNds);
         if (model.RowNumber != 0) cmd.Parameters.AddWithValue("@rowNumber", model.RowNumber);
         cmd.Parameters.AddWithValue("@idClaim", model.IdClaim);
         cmd.Parameters.AddWithValue("@name", model.Name);
         cmd.Parameters.AddWithValue("@unit", model.Unit);
         cmd.Parameters.AddWithValue("@value", model.Value);
         cmd.Parameters.AddWithValue("@productManager", model.ProductManager.Id);
         cmd.Parameters.AddWithValue("@comment", model.Comment);
         cmd.Parameters.AddWithValue("@positionState", model.State);
         cmd.Parameters.AddWithValue("@currency", model.Currency);
         conn.Open();
         var rd = cmd.ExecuteReader();
         if (rd.HasRows)
         {
             rd.Read();
             result = rd.GetInt32(0) == 0;
         }
         rd.Dispose();
     }
     return result;
 }
 public bool UpdateSpecificationPosition(SpecificationPosition model)
 {
     var result = false;
     using (var conn = new SqlConnection(_connectionString))
     {
         var cmd = conn.CreateCommand();
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = "UpdateClaimPosition";
         if (!string.IsNullOrEmpty(model.Replace))
             cmd.Parameters.AddWithValue("@replaceValue", model.Replace);
         if (!string.IsNullOrEmpty(model.CatalogNumber))
             cmd.Parameters.AddWithValue("@catalogNumber", model.CatalogNumber);
         if (!model.Price.Equals(0)) cmd.Parameters.AddWithValue("@price", model.Price);
         if (!model.Sum.Equals(0)) cmd.Parameters.AddWithValue("@sumMax", model.Sum);
         if (!model.PriceTzr.Equals(0)) cmd.Parameters.AddWithValue("@priceTzr", model.PriceTzr);
         if (!model.SumTzr.Equals(0)) cmd.Parameters.AddWithValue("@sumTzr", model.SumTzr);
         if (!model.PriceNds.Equals(0)) cmd.Parameters.AddWithValue("@priceNds", model.PriceNds);
         if (!model.SumNds.Equals(0)) cmd.Parameters.AddWithValue("@sumNds", model.SumNds);
         if (model.RowNumber != 0) cmd.Parameters.AddWithValue("@rowNumber", model.RowNumber);
         cmd.Parameters.AddWithValue("@id", model.Id);
         cmd.Parameters.AddWithValue("@name", model.Name);
         cmd.Parameters.AddWithValue("@unit", model.Unit);
         cmd.Parameters.AddWithValue("@value", model.Value);
         cmd.Parameters.AddWithValue("@productManager", model.ProductManager.Id);
         cmd.Parameters.AddWithValue("@comment", model.Comment);
         cmd.Parameters.AddWithValue("@positionState", model.State);
         cmd.Parameters.AddWithValue("@author", model.Author);
         cmd.Parameters.AddWithValue("@currency", model.Currency);
         conn.Open();
         result = cmd.ExecuteNonQuery() > 0;
     }
     return result;
 }
        public ActionResult UploadFileForm(HttpPostedFileBase file, int claimId, int cv)
        {
            var error = false;
            var message = string.Empty;
            XLWorkbook excBook = null;
            Stream inputStream = null;
            var positions = new List<SpecificationPosition>();
            try
            {
                if (file == null || !file.FileName.EndsWith(".xlsx"))
                {
                    error = true;
                    message = "Файл не предоставлен или имеет неверный формат";
                }
                else
                {
                    inputStream = file.InputStream;
                    inputStream.Seek(0, SeekOrigin.Begin);
                    excBook = new XLWorkbook(inputStream);
                    var workSheet = excBook.Worksheet("Расчет");
                    //разбор полученного файла
                    if (workSheet != null)
                    {
                        var user = GetUser();
                        //<<<<<<<Номер строки - начало разбора инфы>>>>>>
                        var row = 5;
                        var errorStringBuilder = new StringBuilder();
                        var db = new DbEngine();
                        var emptyRowCount = 0;
                        SpecificationPosition model = null;
                        CalculateSpecificationPosition calculate = null;
                        var protectFacts = db.LoadProtectFacts();
                        var deliveryTimes = db.LoadDeliveryTimes();
                        var currencies = db.LoadCurrencies();
                        var adProductManagers = UserHelper.GetProductManagers();
                        int? idPos = null;
                        //проход по всем строкам
                        while (true)
                        {
                            var rowValid = true;
                            var controlCell = workSheet.Cell(row, 1);

                            //определение типа строки
                            var controlValue = controlCell.Value;
                            bool isCalcRow = false;
                            if (controlValue != null && String.IsNullOrEmpty(controlValue.ToString()) && controlCell.IsMerged() && idPos.HasValue)
                            {
                                controlValue = idPos.Value;
                                isCalcRow = true;
                            }

                            if (controlValue != null || isCalcRow)
                            {
                                if (!isCalcRow)
                                {
                                    var controlValueString = controlValue.ToString();
                                    if (string.IsNullOrEmpty(controlValueString))
                                    {
                                        //Если строка запроса пустая то Конец
                                        if (!workSheet.Cell(row, 3).IsMerged() &&
                                            String.IsNullOrEmpty(workSheet.Cell(row, 3).Value.ToString().Trim()))
                                        {
                                            break;
                                        }

                                        //строка расчета
                                        errorStringBuilder.Append("Не найден идентификатор позиции в строке: " + row + "<br/>");
                                        break;
                                    }
                                    else
                                    {

                                        int id;
                                        var converting = int.TryParse(controlValueString, out id);
                                        if (converting)
                                        {
                                            model = new SpecificationPosition()
                                            {
                                                Calculations = new List<CalculateSpecificationPosition>(),
                                                Author = user.Id
                                            };
                                            model.Id = id;
                                            idPos = id;
                                            positions.Add(model);
                                        }
                                        else
                                        {
                                            errorStringBuilder.Append("Ошибка разбора Id позиции в строке: " + row +
                                                                      "<br/>");
                                            break;
                                        }
                                    }
                                }
                            }

                            //разбор инфы по расчету к позиции

                            //Если строка расчета не пустая, то парсим ее
                            bool flag4Parse = false;
                            for (int i = 4; i <= 15; i++)
                            {
                                if (!String.IsNullOrEmpty(workSheet.Cell(row, i).Value.ToString().Trim()))
                                {
                                    flag4Parse = true;
                                    break;
                                }
                            }

                            if (flag4Parse)
                            {
                                calculate = new CalculateSpecificationPosition()
                                {
                                    IdSpecificationPosition = model.Id,
                                    IdTenderClaim = claimId,
                                    Author = user.Id
                                };

                                //получение значений расчета из ячеек
                                var catalogValue = workSheet.Cell(row, 6).Value;
                                var nameValue = workSheet.Cell(row, 7).Value;
                                var replaceValue = workSheet.Cell(row, 8).Value;
                                var priceUsd = workSheet.Cell(row, 9).Value;
                                var priceEur = workSheet.Cell(row, 10).Value;
                                var priceEurRicoh = workSheet.Cell(row, 11).Value;
                                var priceRubl = workSheet.Cell(row, 12).Value;
                                var providerValue = workSheet.Cell(row, 13).Value;
                                var deliveryTimeValue = workSheet.Cell(row, 14).Value;
                                var protectFactValue = workSheet.Cell(row, 15).Value;
                                var protectConditionValue = workSheet.Cell(row, 16).Value;
                                var commentValue = workSheet.Cell(row, 17).Value;

                                //Проверка
                                if (deliveryTimeValue != null && string.IsNullOrEmpty(deliveryTimeValue.ToString().Trim()))
                                {
                                    rowValid = false;
                                    errorStringBuilder.Append("Строка: " + row +
                                                          ", не задано обязательное значение Срок поставки<br/>");
                                }
                                if ((priceUsd != null && string.IsNullOrEmpty(priceUsd.ToString().Trim()))
                                    && (priceEur != null && string.IsNullOrEmpty(priceEur.ToString().Trim()))
                                    &&
                                    (priceEurRicoh != null && string.IsNullOrEmpty(priceEurRicoh.ToString().Trim()))
                                    && (priceRubl != null && string.IsNullOrEmpty(priceRubl.ToString().Trim())))
                                {
                                    rowValid = false;
                                    errorStringBuilder.Append("Строка: " + row +
                                                          ", не указано ни одной цены<br/>");
                                }

                                //Заполняем
                                calculate.CatalogNumber = catalogValue.ToString();
                                calculate.Name = nameValue.ToString();
                                calculate.Replace = replaceValue.ToString();

                                double prUsd;
                                if (!String.IsNullOrEmpty(priceUsd.ToString().Trim()) && double.TryParse(priceUsd.ToString().Trim(), out prUsd))
                                {
                                    calculate.PriceUsd = prUsd;
                                }

                                double prEur;
                                if (!String.IsNullOrEmpty(priceEur.ToString().Trim()) && double.TryParse(priceEur.ToString().Trim(), out prEur))
                                {
                                    calculate.PriceEur = prEur;
                                }

                                double prEurRicoh;
                                if (!String.IsNullOrEmpty(priceEurRicoh.ToString().Trim()) && double.TryParse(priceEurRicoh.ToString().Trim(), out prEurRicoh))
                                {
                                    calculate.PriceEurRicoh = prEurRicoh;
                                }

                                double prRubl;
                                if (!String.IsNullOrEmpty(priceRubl.ToString().Trim()) && double.TryParse(priceRubl.ToString().Trim(), out prRubl))
                                {
                                    calculate.PriceRubl = prRubl;
                                }

                                calculate.Provider = providerValue.ToString();

                                var delivertTimeValueString = deliveryTimeValue.ToString().Trim();
                                var possibleDelTimValues = deliveryTimes.Select(x => x.Value);
                                if (!possibleDelTimValues.Contains(delivertTimeValueString))
                                {
                                    rowValid = false;
                                    errorStringBuilder.Append("Строка: " + row +
                                                          ", Значение '" + delivertTimeValueString + "' не является допустимым для Срок поставки<br/>");
                                }
                                else
                                {
                                    var delTime = deliveryTimes.First(x => x.Value == delivertTimeValueString);
                                    calculate.DeliveryTime = delTime;
                                }

                                var protectFactValueString = protectFactValue.ToString().Trim();
                                var possibleValues = protectFacts.Select(x => x.Value);
                                if (!possibleValues.Contains(protectFactValueString))
                                {
                                    //rowValid = false;
                                    //errorStringBuilder.Append("Строка: " + row +
                                    //                      ", Значение '" + protectFactValueString + "' не является допустимым для Факт получ.защиты<br/>");
                                    calculate.ProtectFact = null;
                                }
                                else
                                {
                                    var fact = protectFacts.First(x => x.Value == protectFactValueString);
                                    calculate.ProtectFact = fact;
                                }

                                calculate.ProtectCondition = protectConditionValue.ToString();
                                calculate.Comment = commentValue.ToString();

                                //Если есть ошибки то не добавляем
                                if (rowValid)model.Calculations.Add(calculate);
                            }

                            row++;
                        }

                        //получение позиций для текущего юзера
                        var userPositions = new List<SpecificationPosition>();
                        if (UserHelper.IsController(user))
                        {
                            userPositions = db.LoadSpecificationPositionsForTenderClaim(claimId, cv);
                        }
                        else if (UserHelper.IsProductManager(user))
                        {
                            userPositions = db.LoadSpecificationPositionsForTenderClaimForProduct(claimId, user.Id, cv);
                        }
                        //позиции доступные для изменения
                        var possibleEditPosition = userPositions.Where(x => x.State == 1 || x.State == 3).ToList();
                        if (possibleEditPosition.Any())
                        {
                            //сохранение позиций и расчета к ним в БД
                            db.DeleteCalculateForPositions(claimId, possibleEditPosition);
                            var userPositionsId = possibleEditPosition.Select(x => x.Id).ToList();
                            var positionCalculate = 0;
                            var calculateCount = 0;
                            if (positions != null && positions.Any())
                            {
                                foreach (var position in positions)
                                {
                                    if (!userPositionsId.Contains(position.Id)) continue;
                                    if (position.Calculations.Any()) positionCalculate++;
                                    foreach (var calculatePosition in position.Calculations)
                                    {
                                        calculateCount++;
                                        calculatePosition.IdSpecificationPosition = position.Id;
                                        calculatePosition.IdTenderClaim = claimId;
                                        db.SaveCalculateSpecificationPosition(calculatePosition);
                                    }
                                }
                            }
                            var errorPart = errorStringBuilder.ToString().Trim();
                            if (string.IsNullOrEmpty(errorPart)) errorPart = "нет";
                            else errorPart = "<br/>" + errorPart;
                            message = "Позиций расчитано: " + positionCalculate + "<br/>Строк расчета: " +
                                      calculateCount + "<br/>Ошибки: " + errorPart;
                        }
                        else
                        {
                            var errorPart = errorStringBuilder.ToString().Trim();
                            if (string.IsNullOrEmpty(errorPart)) errorPart = "нет";
                            else errorPart = "<br/>" + errorPart;
                            message = "нет позиций для расчета<br/>Ошибки: " + errorPart;
                        }
                        //получение позиций и расчетов к ним для текущего юзера для передачи в ответ
                        var isController = UserHelper.IsController(user);
                        if (!isController)
                        {
                            positions = db.LoadSpecificationPositionsForTenderClaimForProduct(claimId,
                                user.Id, cv);
                        }
                        else
                        {
                            positions = db.LoadSpecificationPositionsForTenderClaim(claimId, cv);
                        }
                        var productManagers = positions.Select(x => x.ProductManager).ToList();
                        foreach (var productManager in productManagers)
                        {
                            var productManagerFromAd = adProductManagers.FirstOrDefault(x => x.Id == productManager.Id);
                            if (productManagerFromAd != null)
                            {
                                productManager.Name = productManagerFromAd.Name;
                            }
                        }
                        var calculations = db.LoadCalculateSpecificationPositionsForTenderClaim(claimId, cv);
                        if (calculations != null && calculations.Any())
                        {
                            foreach (var position in positions)
                            {
                                position.Calculations =
                                    calculations.Where(x => x.IdSpecificationPosition == position.Id).ToList();
                            }
                        }
                    }
                    else
                    {
                        error = true;
                        message = "Не найден рабочий лист с расчетом спецификаций";
                    }
                    excBook.Dispose();
                    excBook = null;
                }
            }
            catch (Exception)
            {
                error = true;
                message = "Ошибка сервера";
            }
            finally
            {
                if (inputStream != null)
                {
                    inputStream.Dispose();
                }
                if (excBook != null)
                {
                    excBook.Dispose();
                }
            }
            ViewBag.FirstLoad = false;
            ViewBag.Error = error.ToString().ToLowerInvariant();
            ViewBag.Message = message;
            ViewBag.Positions = positions;
            ViewBag.ClaimId = claimId;
            return View();
        }