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(); }