//Страница расчета позиций по заявке public ActionResult Index(int? claimId, int? cv) { var user = GetUser(); if (!UserHelper.IsController(user) && (UserHelper.IsManager(user) || UserHelper.IsOperator(user))) return RedirectToAction("Index", "Claim", new { claimId = claimId, cv = cv }); //проверка наличия доступа к странице if (user == null || !UserHelper.IsUserAccess(user)) { var dict = new RouteValueDictionary(); dict.Add("message", "У Вас нет доступа к приложению"); return RedirectToAction("ErrorPage", "Auth", dict); } if (claimId.HasValue && !cv.HasValue) { int lastVersion = DbEngine.GetCalcVersionList(claimId.Value).Last(); return RedirectToAction("Index", new { claimId = claimId, cv = lastVersion }); } ViewBag.UserName = user.Name; var isController = UserHelper.IsController(user); var isProduct = UserHelper.IsProductManager(user); if (!isController && !isProduct) { var dict = new RouteValueDictionary(); dict.Add("message", "У Вас нет доступа к этой странице"); return RedirectToAction("ErrorPage", "Auth", dict); } ViewBag.Error = false.ToString().ToLower(); ViewBag.DealType = string.Empty; ViewBag.Status = string.Empty; ViewBag.StatusHistory = new List<ClaimStatusHistory>(); var newClaim = true; if (!isController) newClaim = false; ViewBag.NewClaim = newClaim.ToString().ToLower(); try { //получение инфы по заявке и сопутствующих справочников var db = new DbEngine(); TenderClaim claim = null; var dealTypeString = string.Empty; var tenderStatus = string.Empty; ViewBag.ClaimStatus = db.LoadClaimStatus(); ViewBag.Currencies = db.LoadCurrencies(); ViewBag.DeliveryTimes = db.LoadDeliveryTimes(); if (claimId.HasValue) { claim = db.LoadTenderClaimById(claimId.Value); claim.Certs = db.LoadClaimCerts(claimId.Value); claim.Files = db.LoadTenderClaimFiles(claimId.Value); var adProductsManager = UserHelper.GetProductManagers(); if (claim != null) { //if (claim.ClaimStatus == 1) //{ // var dict = new RouteValueDictionary(); // dict.Add("message", "Статус заявки не позволяет производить расчет позиций"); // return RedirectToAction("ErrorPage", "Auth", dict); //} //позиции заявки, в зависимости от роли юзера if (!isController) { claim.Positions = db.LoadSpecificationPositionsForTenderClaimForProduct(claimId.Value, user.Id, cv.Value); } else { claim.Positions = db.LoadSpecificationPositionsForTenderClaim(claimId.Value, cv.Value); } if (claim.Positions != null && claim.Positions.Any()) { //изменение статуса в Работе если это первая загрузка для расчета по данной заявке if (claim.ClaimStatus == 2) { claim.ClaimStatus = 3; DbEngine.ChangeTenderClaimClaimStatus(claim); var statusHistory = new ClaimStatusHistory() { IdClaim = claim.Id, Date = DateTime.Now, Comment = string.Empty, Status = new ClaimStatus() { Id = claim.ClaimStatus }, IdUser = user.Id }; db.SaveClaimStatusHistory(statusHistory); } //менеджеры и снабженцы из ActiveDirectory var managerFromAd = UserHelper.GetUserById(claim.Manager.Id); claim.Manager.Name = managerFromAd.Name; claim.Manager.ShortName = managerFromAd.ShortName; claim.Manager.ChiefShortName = managerFromAd.ManagerName; //var managers = UserHelper.GetManagers(); //var managerFromAd = managers.FirstOrDefault(x => x.Id == claim.Manager.Id); //if (managerFromAd != null) //{ // claim.Manager.Name = managerFromAd.Name; // claim.Manager.ShortName = managerFromAd.ShortName; // claim.Manager.ChiefShortName = managerFromAd.ChiefShortName; //} var subordinateList = Employee.GetSubordinates(user.Id); var productManagers = claim.Positions.Select(x => x.ProductManager).ToList(); var prodManSelList = UserHelper.GetProductManagersSelectionList(); bool hasAccess = isController || claim.Positions.Any(x => x.ProductManager.Id == user.Id); foreach (var productManager in productManagers) { hasAccess = hasAccess || (subordinateList.Any() && Employee.UserIsSubordinate(subordinateList, productManager.Id));// subordinateList.ToList().Contains(productManager.Id); productManager.ShortName = prodManSelList.FirstOrDefault(x => x.Id == productManager.Id)?.ShortName; //var productUser = UserHelper.GetUserById(productManager.Id); //if (productUser != null) //{ // productManager.Name = productUser.Name; // productManager.ShortName = productUser.ShortName; //} //var productManagerFromAd = adProductsManager.First(x => x.Id == productManager.Id); //if (productManagerFromAd != null) //{ // productManager.Name = productManagerFromAd.Name; // productManager.ShortName = productManagerFromAd.ShortName; //} } if (!hasAccess) { var dict = new RouteValueDictionary(); dict.Add("message", "У Вас нет доступа к этой заявке, Вам не назначены позиции для расчета"); return RedirectToAction("ErrorPage", "Auth", dict); } //Расчет по позициям var calculations = db.LoadCalculateSpecificationPositionsForTenderClaim(claimId.Value, cv.Value); if (calculations != null && calculations.Any()) { foreach (var position in claim.Positions) { position.Calculations = calculations.Where(x => x.IdSpecificationPosition == position.Id).ToList(); position.Calculations.Reverse(); } } } else { if (isController) { var dict = new RouteValueDictionary(); dict.Add("message", "У заявки нет позиций"); return RedirectToAction("ErrorPage", "Auth", dict); } else { var dict = new RouteValueDictionary(); dict.Add("message", "У Вас нет доступа к этой заявке, Вам не назначены позиции для расчета"); return RedirectToAction("ErrorPage", "Auth", dict); } } var dealTypes = db.LoadDealTypes(); var dealType = dealTypes.FirstOrDefault(x => x.Id == claim.DealType); if (dealType != null) { dealTypeString = dealType.Value; } var tenderStatusList = db.LoadTenderStatus(); var status = tenderStatusList.FirstOrDefault(x => x.Id == claim.TenderStatus); if (status != null) { tenderStatus = status.Value; } ViewBag.StatusHistory = db.LoadStatusHistoryForClaim(claimId.Value); ViewBag.ProductManagers = adProductsManager; } } ViewBag.Claim = claim; ViewBag.DealType = dealTypeString; ViewBag.Status = tenderStatus; ViewBag.ProtectFacts = db.LoadProtectFacts(); } catch (Exception ex) { ViewBag.Error = true.ToString().ToLower(); } return View(); }
//форма заявки, если передан параметр idClaim, то загружается инфа по заявки с этим id public ActionResult Index(int? claimId, int? cv) { var user = GetUser(); if (!UserHelper.IsController(user) && UserHelper.IsProductManager(user)) return RedirectToAction("Index", "Calc", new {claimId = claimId, cv = cv}); if (user == null || !UserHelper.IsUserAccess(user)) { var dict = new RouteValueDictionary(); dict.Add("message", "У Вас нет доступа к приложению"); return RedirectToAction("ErrorPage", "Auth", dict); } if (claimId.HasValue && !cv.HasValue) { var verList = DbEngine.GetCalcVersionList(claimId.Value); if (verList.Any()) { int lastVersion = verList.Last(); return RedirectToAction("Index", new {claimId = claimId, cv = lastVersion}); } else { cv = 0; } } //получения текущего юзера и проверка наличия у него доступа к странице ViewBag.Error = false.ToString().ToLower(); TempData["tenderClaimFileFormats"] = WebConfigurationManager.AppSettings["FileFormat4TenderClaimFile"]; ViewBag.UserName = user.Name; var isController = UserHelper.IsController(user); var isManager = UserHelper.IsManager(user); var isOperator = UserHelper.IsOperator(user); if (!isController && !isManager && !isOperator) { var dict = new RouteValueDictionary(); dict.Add("message", "У Вас нет доступа к этой странице"); return RedirectToAction("ErrorPage", "Auth", dict); } try { //получение необходимой инфы из БД и ActiveDirectory var managers = UserHelper.GetManagers(); ViewBag.Managers = managers; ViewBag.DateStart = DateTime.Now.ToString("dd.MM.yyyy"); var db = new DbEngine(); ViewBag.NextDateMin = DateTime.Now.DayOfWeek == DayOfWeek.Friday ? DateTime.Now.AddDays(4).ToShortDateString() : DateTime.Now.AddDays(2).ToShortDateString(); ViewBag.DealTypes = db.LoadDealTypes(); ViewBag.ClaimStatus = db.LoadClaimStatus(); var adProductManagers = UserHelper.GetProductManagers(); ViewBag.ProductManagers = adProductManagers; ViewBag.StatusHistory = new List<ClaimStatusHistory>(); ViewBag.Facts = db.LoadProtectFacts(); ViewBag.DeliveryTimes = db.LoadDeliveryTimes(); ViewBag.HasTransmissedPosition = false.ToString().ToLower(); ViewBag.Currencies = db.LoadCurrencies(); TenderClaim claim = null; var dealTypeString = String.Empty; var tenderStatus = String.Empty; if (claimId.HasValue && cv.HasValue) { claim = db.LoadTenderClaimById(claimId.Value); if (claim != null) { var allPositions = db.LoadSpecificationPositionsForTenderClaim(claimId.Value, cv.Value); var editablePosIds = new List<int>(); foreach (var position in allPositions) { if (position.State == 5) editablePosIds.Add(position.Id); } ViewBag.EditablePositions = editablePosIds; ViewBag.HasTransmissedPosition = db.HasTenderClaimTransmissedPosition(claimId.Value, cv.Value).ToString().ToLower(); //проверка наличия доступа к данной заявке if (!isController) { if (claim.Manager.Id == user.Id || claim.Author.Id == user.Id) { } else if (isManager) { var subs = Employee.GetSubordinates(user.Id).ToList(); if (!Employee.UserIsSubordinate(subs, claim.Manager.Id) && !Employee.UserIsSubordinate(subs, claim.Author.Id)) { var dict = new RouteValueDictionary(); dict.Add("message", "У Вас нет доступа к этой странице"); return RedirectToAction("ErrorPage", "Auth", dict); } } } var managerFromAd = managers.FirstOrDefault(x => x.Id == claim.Manager.Id); if (managerFromAd != null) { claim.Manager.Name = managerFromAd.Name; claim.Manager.ShortName = managerFromAd.ShortName; claim.Manager.ChiefShortName = managerFromAd.ChiefShortName; } var dealTypes = db.LoadDealTypes(); var dealType = dealTypes.FirstOrDefault(x => x.Id == claim.DealType); if (dealType != null) { dealTypeString = dealType.Value; } var tenderStatusList = db.LoadTenderStatus(); var status = tenderStatusList.FirstOrDefault(x => x.Id == claim.TenderStatus); if (status != null) { tenderStatus = status.Value; } //получение позиций по заявке и расчета к ним claim.Certs = db.LoadClaimCerts(claimId.Value); claim.Files = db.LoadTenderClaimFiles(claimId.Value); claim.Positions = db.LoadSpecificationPositionsForTenderClaim(claimId.Value, cv.Value); if (claim.Positions != null && claim.Positions.Any()) { var productManagers = claim.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.Value, cv.Value); if (calculations != null && calculations.Any()) { foreach (var position in claim.Positions) { if (position.State == 1) continue; position.Calculations = calculations.Where(x => x.IdSpecificationPosition == position.Id).ToList(); position.Calculations.Reverse(); } } } ViewBag.StatusHistory = db.LoadStatusHistoryForClaim(claimId.Value); } } ViewBag.Claim = claim; ViewBag.DealType = dealTypeString; ViewBag.status = tenderStatus; } catch (Exception) { ViewBag.Error = true.ToString().ToLower(); } return View(); }
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(); }