public JsonResult AddCommentToClaim(string comment, int idClaim, int cv)
 {
     var isComplete = false;
     ClaimStatusHistory statusHistory = null;
     try
     {
         var user = GetUser();
         var db = new DbEngine();
         statusHistory = db.LoadLastStatusHistoryForClaim(idClaim);
         statusHistory.Date = DateTime.Now;
         statusHistory.IdUser = user.Id;
         statusHistory.Comment = comment;
         statusHistory.DateString = statusHistory.Date.ToString("dd.MM.yyyy HH:mm");
         isComplete = db.SaveClaimStatusHistory(statusHistory);
         if (isComplete)
         {
             var productManagers = db.LoadProductManagersForClaim(idClaim, cv);
             var productManagersFromAd = UserHelper.GetProductManagers();
             var productInClaim =
                     productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id)).ToList();
             var claim = db.LoadTenderClaimById(idClaim);
             var host = ConfigurationManager.AppSettings["AppHost"];
             var messageMail = new StringBuilder();
             messageMail.Append("Добрый день!");
             messageMail.Append("<br/>");
             messageMail.Append("В заявке № " + idClaim + ", где Вам назначены позиции для расчета, пользователь ");
             messageMail.Append(user.ShortName);
             messageMail.Append(" создал комментарий: <br />" + comment);
             messageMail.Append("<br/>");
             //messageMail.Append(GetClaimInfo(claim));
             //messageMail.Append("<br/><br/>");
             messageMail.Append("Ссылка на заявку: ");
             messageMail.Append("<a href='" + host + "/Calc/Index?claimId=" + claim.Id + "'>" + host +
                            "/Calc/Index?claimId=" + claim.Id + "</a>");
             //messageMail.Append("<br/>Сообщение от системы Спец расчет");
             Notification.SendNotification(productInClaim, messageMail.ToString(),
                 String.Format("{0} - {1} - Комментарий к заявке СпецРасчет", claim.TenderNumber, claim.Customer));
         }
     }
     catch (Exception)
     {
         isComplete = false;
     }
     return Json(new { IsComplete = isComplete, Model = statusHistory }, JsonRequestBehavior.AllowGet);
 }
        public JsonResult SetClaimOnWork(int id, int? cv)
        {
            cv = cv ?? 0;
            var isComplete = false;
            var message = string.Empty;
            ClaimStatusHistory model = null;
            try
            {
                var db = new DbEngine();
                var hasPosition = db.HasClaimPosition(id);
                if (hasPosition)
                {
                    isComplete = DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim() { Id = id, ClaimStatus = 2 });
                    var productManagers = db.LoadProductManagersForClaim(id, cv.Value);
                    if (productManagers != null && productManagers.Any())
                    {
                        var productManagersFromAd = UserHelper.GetProductManagers();
                        foreach (var productManager in productManagers)
                        {
                            var productManagerFromAd =
                                productManagersFromAd.FirstOrDefault(x => x.Id == productManager.Id);
                            if (productManagerFromAd != null)
                            {
                                productManager.ShortName = productManagerFromAd.ShortName;
                            }
                        }
                        //истроия изменения статуса заявки
                        var user = GetUser();
                        var comment = "Продакты/снабженцы:<br />";
                        comment += string.Join("<br />", productManagers.Select(x => x.ShortName));
                        comment += "<br />Автор: " + user.ShortName;
                        model = new ClaimStatusHistory()
                        {
                            Date = DateTime.Now,
                            IdClaim = id,
                            IdUser = user.Id,
                            Status = new ClaimStatus() { Id = 2 },
                            Comment = comment
                        };
                        db.SaveClaimStatusHistory(model);
                        model.DateString = model.Date.ToString("dd.MM.yyyy HH:mm");
                        //>>>>Уведомления
                        var claimPositions = db.LoadSpecificationPositionsForTenderClaim(id, cv.Value);
                        var productInClaim =
                            productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id)).ToList();
                        var claim = db.LoadTenderClaimById(id);
                        var host = ConfigurationManager.AppSettings["AppHost"];
                        foreach (var productManager in productInClaim)
                        {
                            var positionCount = claimPositions.Count(x => x.ProductManager.Id == productManager.Id);
                            var messageMail = new StringBuilder();
                            messageMail.Append("Добрый день!");
                            messageMail.Append(String.Format("<br/>На имя {0} назначена заявка в системе СпецРасчет.", productManager.ShortName));
                            //messageMail.Append("<br/>Пользователь ");
                            //messageMail.Append(user.Name);
                            //messageMail.Append(
                            //    " создал заявку где Вам назначены позиции для расчета. Количество назначенных позиций: " +
                            //    positionCount + "<br/>");
                            messageMail.Append("<br/><br />");
                            messageMail.Append(GetClaimInfo(claim));
                            messageMail.Append("<br />Ссылка на заявку: ");
                            messageMail.Append("<a href='" + host + "/Calc/Index?claimId=" + claim.Id + "'>" + host +
                                           "/Calc/Index?claimId=" + claim.Id + "</a>");
                            //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                            Notification.SendNotification(new[] { productManager }, messageMail.ToString(),
                                String.Format("{0} - {1} - Новая заявка СпецРасчет", claim.TenderNumber, claim.Customer));
                        }
                    }
                }
                else
                {
                    message = "Невозможно передать заявку в работу без позиций спецификаций";
                }

            }
            catch (Exception)
            {
                isComplete = false;
            }
            return Json(new { IsComplete = isComplete, Message = message, Model = model }, JsonRequestBehavior.AllowGet);
        }
        public JsonResult SetClaimStopped(ClaimStatusHistory model)
        {
            var isComplete = false;
            try
            {
                var db = new DbEngine();
                isComplete = DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim() { Id = model.IdClaim, ClaimStatus = 4 });
                if (isComplete)
                {
                    model.Date = DateTime.Now;
                    model.IdUser = GetUser().Id;
                    model.Status = new ClaimStatus() { Id = 4 };

                    db.SaveClaimStatusHistory(model);
                    model.DateString = model.Date.ToString("dd.MM.yyyy HH:mm");
                    //>>>>Уведомления
                    var claim = db.LoadTenderClaimById(model.IdClaim);
                    var productManagers = db.LoadProductManagersForClaim(model.IdClaim, model.Version);
                    if (productManagers != null && productManagers.Any())
                    {
                        var productManagersFromAd = UserHelper.GetProductManagers();
                        var user = GetUser();
                        var productInClaim =
                            productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id)).ToList();
                        var host = ConfigurationManager.AppSettings["AppHost"];
                        var messageMail = new StringBuilder();
                        messageMail.Append("Добрый день!");
                        messageMail.Append("<br/>Пользователь ");
                        messageMail.Append(user.Name);
                        messageMail.Append(" приостановил заявку где Вам назначены позиции для расчета.");
                        //messageMail.Append("<br/><br />");
                        //messageMail.Append(GetClaimInfo(claim));
                        messageMail.Append("<br/><br />");
                        messageMail.Append("Ссылка на заявку: ");
                        messageMail.Append("<a href='" + host + "/Calc/Index?claimId=" + claim.Id + "'>" + host +
                                       "/Calc/Index?claimId=" + claim.Id + "</a>");
                        //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                        Notification.SendNotification(productInClaim, messageMail.ToString(),
                            String.Format("{0} - {1} - Приостановка заявки СпецРасчет", claim.TenderNumber, claim.Customer));
                    }
                }
            }
            catch (Exception ex)
            {
                isComplete = false;
            }
            return Json(new { IsComplete = isComplete, Model = model });
        }
 public JsonResult SetClaimContinued(ClaimStatusHistory model)
 {
     var isComplete = false;
     try
     {
         var db = new DbEngine();
         var statusHistory = db.LoadStatusHistoryForClaim(model.IdClaim);
         if (statusHistory.Count() > 1)
         {
             //var lastValueValid = statusHistory.Last().Status.Id;
             //if (lastValueValid == 4 || lastValueValid == 5)
             //{
                 var actualStatus = new ClaimStatusHistory() {Status = new ClaimStatus(){Id = 3}};//statusHistory[statusHistory.Count() - 2];
                 isComplete = DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim() { Id = model.IdClaim, ClaimStatus = actualStatus.Status.Id });
                 if (isComplete)
                 {
                     model.Date = DateTime.Now;
                     model.IdUser = GetUser().Id;
                     model.Status = new ClaimStatus() { Id = actualStatus.Status.Id };
                     if (string.IsNullOrEmpty(model.Comment)) model.Comment = "Возобновление заявки" + "<br />Автор: " + GetUser().ShortName;
                     db.SaveClaimStatusHistory(model);
                     model.DateString = model.Date.ToString("dd.MM.yyyy HH:mm");
                     //>>>>Уведомления
                     var claim = db.LoadTenderClaimById(model.IdClaim);
                     var productManagers = db.LoadProductManagersForClaim(model.IdClaim, model.Version);
                     if (productManagers != null && productManagers.Any())
                     {
                         var productManagersFromAd = UserHelper.GetProductManagers();
                         var user = GetUser();
                         var productInClaim =
                             productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id)).ToList();
                         var host = ConfigurationManager.AppSettings["AppHost"];
                         var messageMail = new StringBuilder();
                         messageMail.Append("Добрый день!");
                         messageMail.Append("<br/>Пользователь ");
                         messageMail.Append(user.Name);
                         messageMail.Append(" возобновил заявку для работы где Вам назначены позиции для расчета.");
                         messageMail.Append("<br/><br/>");
                         //messageMail.Append(GetClaimInfo(claim));
                         messageMail.Append("Ссылка на заявку: ");
                         messageMail.Append("<a href='" + host + "/Calc/Index?claimId=" + claim.Id + "'>" + host +
                                        "/Calc/Index?claimId=" + claim.Id + "</a>");
                         //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                         Notification.SendNotification(productInClaim, messageMail.ToString(),
                             String.Format("{0} - {1} - Возобновление заявки СпецРасчет", claim.TenderNumber, claim.Customer));
                     }
                 }
             //}
         }
     }
     catch (Exception ex)
     {
         isComplete = false;
     }
     return Json(new { IsComplete = isComplete, Model = model });
 }
        public JsonResult AskPositionReject(List<int> posIds, int idClaim, int cv)
        {
            var isComplete = false;
            var message = string.Empty;
            ClaimStatusHistory model = null;
            var user = GetUser();
            var db = new DbEngine();
            var positions = new List<SpecificationPosition>();

            var positionIds = new List<int>();
            if (posIds.Any())
            {
                positionIds = posIds;
            }

            isComplete = db.ChangePositionsState(positionIds, 7);
            if (!isComplete) message = "Запрос не отправлен";
            else
            {
                var allPositions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
                var isAllRejected = allPositions.Count() ==
                                     allPositions.Count(x => x.State == 7);
                var lastClaimStatus = db.LoadLastStatusHistoryForClaim(idClaim).Status.Id;
                var claimStatus = lastClaimStatus;
                //Изменение статуса заявки и истроии изменения статусов
                if (lastClaimStatus != claimStatus)
                {
                    DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim()
                    {
                        Id = idClaim,
                        ClaimStatus = claimStatus
                    });
                    var statusHistory = new ClaimStatusHistory()
                    {
                        Date = DateTime.Now,
                        Comment = String.Format("Пользователь {0} запросил отклонение {1} из {2} позиций.<br/>", user.ShortName, positionIds.Count, allPositions.Count),
                        IdClaim = idClaim,
                        IdUser = user.Id,
                        Status = new ClaimStatus() { Id = claimStatus }
                    };
                    db.SaveClaimStatusHistory(statusHistory);
                    statusHistory.DateString = statusHistory.Date.ToString("dd.MM.yyyy HH:mm");
                    model = statusHistory;
                }
                else
                {
                    var statusHistory = new ClaimStatusHistory()
                    {
                        Date = DateTime.Now,
                        Comment = String.Format("Пользователь {0} запросил отклонение {1} из {2} позиций.<br/>", user.ShortName, positionIds.Count, allPositions.Count),
                        IdClaim = idClaim,
                        IdUser = user.Id,
                        Status = new ClaimStatus() { Id = lastClaimStatus }
                    };
                    db.SaveClaimStatusHistory(statusHistory);
                    statusHistory.DateString = statusHistory.Date.ToString("dd.MM.yyyy HH:mm");
                    model = statusHistory;
                }
                //инфа для уведомления
                var claim = db.LoadTenderClaimById(idClaim);
                var host = ConfigurationManager.AppSettings["AppHost"];
                var productManagersFromAd = UserHelper.GetProductManagers();
                var productManagers = db.LoadProductManagersForClaim(claim.Id, cv);
                var productInClaim =
                    productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id))
                        .ToList();
                var manager = UserHelper.GetUserById(claim.Manager.Id);
                var author = UserHelper.GetUserById(claim.Author.Id);
                var to = new List<UserBase>();
                to.Add(manager);
                if (author.Id != manager.Id)
                {
                    to.Add(author);
                }
                //>>>>Уведомления
                if (isAllRejected)
                {
                    var messageMail = new StringBuilder();
                    messageMail.Append("Добрый день!<br/>");
                    messageMail.Append("Запрос на отклонение позиций в заявке №" + claim.Id + " пльзователем " + user.Name + ".<br/>");
                    //messageMail.Append("Комментарий:<br/>");
                    //messageMail.Append(comment + "<br/>");
                    //messageMail.Append("Продакты/Снабженцы: <br/>");
                    //foreach (var productManager in productInClaim)
                    //{
                    //    messageMail.Append(productManager.Name + "<br/>");
                    //}
                    messageMail.Append("Ссылка на заявку: ");
                    messageMail.Append("<a href='" + host + "/Claim/Index?claimId=" + claim.Id + "'>" + host +
                                       "/Claim/Index?claimId=" + claim.Id + "</a>");
                    //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                    Notification.SendNotification(to, messageMail.ToString(),
                        String.Format("{0} - {1} - Запрос на отклонение позиций заявки СпецРасчет", claim.TenderNumber,
                            claim.Customer));
                }
                //>>>>Уведомления
                if (!isAllRejected)
                {
                    var noneRejectedPositionManagers =
                        allPositions.Where(x => x.State == 1 || x.State == 3)
                            .Select(x => x.ProductManager)
                            .ToList();
                    if (noneRejectedPositionManagers.Any())
                    {
                        var products =
                            productManagersFromAd.Where(
                                x => noneRejectedPositionManagers.Select(y => y.Id).Contains(x.Id))
                                .ToList();
                        var messageMail = new StringBuilder();
                        messageMail.Append("Добрый день!<br/>");
                        messageMail.Append("Запрос на отклонение позиций в заявке №" + claim.Id + " пльзователем " + user.Name + ".<br/>");
                        messageMail.Append("Отклонено позиций " + allPositions.Count(x => x.State == 5) + " из " + allPositions.Count + ".<br/>");

                        //messageMail.Append("<br/>");
                        //messageMail.Append(GetClaimInfo(claim));
                        //messageMail.Append("<br/>");

                        messageMail.Append("Ссылка на заявку: ");
                        messageMail.Append("<a href='" + host + "/Claim/Index?claimId=" + claim.Id + "'>" +
                                           host +
                                           "/Claim/Index?claimId=" + claim.Id + "</a>");
                        //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                        Notification.SendNotification(to, messageMail.ToString(),
                            String.Format("{0} - {1} - Запрос на отклонение позиций заявки СпецРасчет",
                                claim.TenderNumber, claim.Customer));
                    }
                }
            }

            return Json(new { IsComplete = isComplete, Message = message, Model = model }, JsonRequestBehavior.AllowGet);
        }
        public ActionResult GoActual(int claimId, int cv, int[] selIds)
        {
            if (claimId <= 0)throw new ArgumentException("Не указана заявка");
            if (cv<= 0) throw new ArgumentException("Не указана верия для актулизации");

            int newClaimState = 10;
            bool isComplete = DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim() { Id = claimId, ClaimStatus = newClaimState });
            int newVersion = DbEngine.CopyPositionsForNewVersion(claimId, cv, GetUser().Id, selIds);

            var db = new DbEngine();

            var productManagers = db.LoadProductManagersForClaim(claimId, newVersion, getActualize:true);
            if (productManagers != null && productManagers.Any())
            {
                var productManagersFromAd = UserHelper.GetProductManagers();
                foreach (var productManager in productManagers)
                {
                    var productManagerFromAd =
                        productManagersFromAd.FirstOrDefault(x => x.Id == productManager.Id);
                    if (productManagerFromAd != null)
                    {
                        productManager.ShortName = productManagerFromAd.ShortName;
                    }
                }
                //истроия изменения статуса заявки
                var user = GetUser();
                var comment = "Продакты/снабженцы:<br />";
                comment += string.Join("<br />", productManagers.Select(x => x.ShortName));
                comment += "<br />Автор: " + user.ShortName;
                ClaimStatusHistory model = new ClaimStatusHistory()
                {
                    Date = DateTime.Now,
                    IdClaim = claimId,
                    IdUser = user.Id,
                    Status = new ClaimStatus() {Id = newClaimState },
                    Comment = comment
                };
                db.SaveClaimStatusHistory(model);
                model.DateString = model.Date.ToString("dd.MM.yyyy HH:mm");
                //>>>>Уведомления
                var claimPositions = db.LoadSpecificationPositionsForTenderClaim(claimId, newVersion);
                var productInClaim =
                    productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id)).ToList();
                var claim = db.LoadTenderClaimById(claimId);
                var host = ConfigurationManager.AppSettings["AppHost"];
                foreach (var productManager in productInClaim)
                {
                    var positionCount = claimPositions.Count(x => x.ProductManager.Id == productManager.Id);
                    var messageMail = new StringBuilder();
                    messageMail.Append("Добрый день!");
                    messageMail.Append(String.Format("<br/>На имя {0} назначена Актуализация расчета по заявке в системе СпецРасчет.",
                        productManager.ShortName));
                    //messageMail.Append("<br/>Пользователь ");
                    //messageMail.Append(user.Name);
                    //messageMail.Append(
                    //    " создал заявку где Вам назначены позиции для расчета. Количество назначенных позиций: " +
                    //    positionCount + "<br/>");
                    messageMail.Append("<br/><br />");
                    messageMail.Append(GetClaimInfo(claim));
                    messageMail.Append("<br />Ссылка на заявку: ");
                    messageMail.Append("<a href='" + host + "/Calc/Index?claimId=" + claim.Id + "'>" + host +
                                       "/Calc/Index?claimId=" + claim.Id + "&cv=" + newVersion + "</a>");
                    //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                    Notification.SendNotification(new[] {productManager}, messageMail.ToString(),
                        String.Format("{0} - {1} - Актуализация расчета заявки СпецРасчет", claim.TenderNumber, claim.Customer));
                }
            }

            return Json(new { claimId = claimId, newVersion = newVersion });
            //return RedirectToAction("Index", new {claimId = claimId, cv= newVersion });
        }
        public JsonResult SetPositionRejected(List<int> posIds, int idClaim, string comment, int cv)
        {
            var isComplete = false;
            var message = string.Empty;
            ClaimStatusHistory model = null;
               /* try
            {*/
                var user = GetUser();
                var db = new DbEngine();
                //получение позиций для текущего юзера
                var positions = new List<SpecificationPosition>();
                if (UserHelper.IsController(user))
                {
                    positions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
                }
                else
                {
                    if (UserHelper.IsProductManager(user))
                    {
                        positions = db.LoadSpecificationPositionsForTenderClaimForProduct(idClaim, user.Id, cv);
                    }
                }
                var positionIds = new List<int>();
                //if (positions.Any())
                if (posIds.Any())
                {
                    //Переделано для частичной передачи расчета
                    positionIds = posIds;
                }
                //изменения статуса позиций на - отправлено
                else
                {
                    foreach (var position in positions)
                    {
                        positionIds.Add(position.Id);
                    }
                }

                isComplete = db.ChangePositionsState(positionIds,5);
                if (!isComplete) message = "Позиции не отклонены";
                else
                        {
                            var allPositions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
                            var isAllRejected = allPositions.Count() ==
                                                 allPositions.Count(x => x.State == 5);
                            var lastClaimStatus = db.LoadLastStatusHistoryForClaim(idClaim).Status.Id;
                    var claimStatus = isAllRejected ? 9 : lastClaimStatus;
                            //Изменение статуса заявки и истроии изменения статусов
                            if (lastClaimStatus != claimStatus)
                            {
                    DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim()
                                {
                                    Id = idClaim,
                                    ClaimStatus = claimStatus
                                });
                                var statusHistory = new ClaimStatusHistory()
                                {
                                    Date = DateTime.Now,
                                    Comment = String.Format("Пользователь {0} отклонил {2} из {3} позиций.<br/>Комментарий: {1} ",user.ShortName,comment,positionIds.Count,allPositions.Count),
                                    IdClaim = idClaim,
                                    IdUser = user.Id,
                                    Status = new ClaimStatus() { Id = claimStatus }
                                };
                                db.SaveClaimStatusHistory(statusHistory);
                                statusHistory.DateString = statusHistory.Date.ToString("dd.MM.yyyy HH:mm");
                                model = statusHistory;
                            }
                            else
                            {
                                var statusHistory = new ClaimStatusHistory()
                                {
                                    Date = DateTime.Now,
                                    Comment = String.Format("Пользователь {0} отклонил {2} из {3} позиций.<br/>Комментарий: {1} ", user.ShortName, comment, positionIds.Count, allPositions.Count),
                                    IdClaim = idClaim,
                                    IdUser = user.Id,
                                    Status = new ClaimStatus() { Id = lastClaimStatus }
                                };
                                db.SaveClaimStatusHistory(statusHistory);
                                statusHistory.DateString = statusHistory.Date.ToString("dd.MM.yyyy HH:mm");
                                model = statusHistory;
                            }
                            //инфа для уведомления
                            var claim = db.LoadTenderClaimById(idClaim);
                            var host = ConfigurationManager.AppSettings["AppHost"];
                            var productManagersFromAd = UserHelper.GetProductManagers();
                            var productManagers = db.LoadProductManagersForClaim(claim.Id, cv);
                            var productInClaim =
                                productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id))
                                    .ToList();
                            var manager = UserHelper.GetUserById(claim.Manager.Id);
                            var author = UserHelper.GetUserById(claim.Author.Id);
                            var to = new List<UserBase>();
                            to.Add(manager);
                            if (author.Id != manager.Id)
                            {
                                to.Add(author);
                            }
                            //>>>>Уведомления
                            if (claimStatus == 9)
                            {
                                var messageMail = new StringBuilder();
                                messageMail.Append("Добрый день!<br/>");
                                messageMail.Append("Позиции в заявке № " + claim.Id + " отклонены пользователем " + user.Name + ".<br/>");
                                messageMail.Append("Отклонены все позиции.<br/>");
                                messageMail.Append("Комментарий:<br/>");
                                messageMail.Append(comment+"<br/>");
                                //messageMail.Append("Продакты/Снабженцы: <br/>");
                                //foreach (var productManager in productInClaim)
                                //{
                                //    messageMail.Append(productManager.Name + "<br/>");
                                //}
                                messageMail.Append("Ссылка на заявку: ");
                                messageMail.Append("<a href='" + host + "/Claim/Index?claimId=" + claim.Id + "'>" + host +
                                                   "/Claim/Index?claimId=" + claim.Id + "</a>");
                                //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                                Notification.SendNotification(to, messageMail.ToString(),
                                    String.Format("{0} - {1} - Полное отклонение заявки СпецРасчет", claim.TenderNumber,
                                        claim.Customer));
                            }
                            //>>>>Уведомления
                            if (claimStatus == lastClaimStatus)
                            {
                                var noneRejectedPositionManagers =
                                    allPositions.Where(x => x.State == 1 || x.State == 3)
                                        .Select(x => x.ProductManager)
                                        .ToList();
                                if (noneRejectedPositionManagers.Any())
                                {
                                    var products =
                                        productManagersFromAd.Where(
                                            x => noneRejectedPositionManagers.Select(y => y.Id).Contains(x.Id))
                                            .ToList();
                                    var messageMail = new StringBuilder();
                                    messageMail.Append("Добрый день!<br/>");
                                    messageMail.Append("Позиции в заявке №" + claim.Id + " отклонены пльзователем "+             user.Name+".<br/>");
                                    messageMail.Append("Отклонено позиций "+allPositions.Count(x => x.State==5)+" из "+allPositions.Count+".<br/>");

                                    //messageMail.Append("<br/>");
                                    //messageMail.Append(GetClaimInfo(claim));
                                    //messageMail.Append("<br/>");

                                    messageMail.Append("Ссылка на заявку: ");
                                    messageMail.Append("<a href='" + host + "/Claim/Index?claimId=" + claim.Id + "'>" +
                                                       host +
                                                       "/Claim/Index?claimId=" + claim.Id + "</a>");
                                    //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                                    Notification.SendNotification(to, messageMail.ToString(),
                                        String.Format("{0} - {1} - Частичное отклонение заявки СпецРасчет",
                                            claim.TenderNumber, claim.Customer));
                                }
                            }
                        }
                  /*   }
                    else
                    {
                        message = "Невозможно отправить позиции на подтверждение\rНе все позиции имеют расчет";
                   }
              }
                else
                {
                    message = "Выберите хотябы одну позицию!";
                }*/
              /*      }
            catch (Exception)
            {
                isComplete = false;
                message = "Ошибка сервера";
            }*/
            return Json(new { IsComplete = isComplete, Message = message, Model = model }, JsonRequestBehavior.AllowGet);
        }
        public JsonResult SetPositionToConfirm(List<int> posIds, int idClaim, string comment, int cv)
        {
            var isComplete = false;
            var message = string.Empty;
            ClaimStatusHistory model = null;
            try
            {
                var user = GetUser();
                var db = new DbEngine();
                //получение позиций для текущего юзера
                var positions = new List<SpecificationPosition>();
                if (UserHelper.IsController(user))
                {
                    positions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
                }
                else
                {
                    if (UserHelper.IsProductManager(user))
                    {
                        positions = db.LoadSpecificationPositionsForTenderClaimForProduct(idClaim, user.Id, cv);
                    }
                }
                //if (positions.Any())
                if (posIds.Any())
                {
                    //Переделано для частичной передачи расчета
                    positions = new List<SpecificationPosition>();
                    foreach (int p in posIds)
                    {
                        positions.Add(new SpecificationPosition(){Id=p});
                    }
                    // /> частичная передача

                    //проверка наличия у позиций строк расчета
                    var isReady = db.IsPositionsReadyToConfirm(positions);
                    if (isReady)
                    {
                        //изменения статуса позиций на - отправлено
                        isComplete = db.SetPositionsToConfirm(positions);
                        if (!isComplete) message = "Позиции не отправлены";
                        else
                        {
                            var allPositions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
                            var isAllCalculate = allPositions.Count() ==
                                                 allPositions.Count(x => x.State == 2 || x.State == 4);
                            var claimStatus = isAllCalculate ? 7 : 6;
                            //Изменение статуса заявки и истроии изменения статусов
                            var status = db.LoadLastStatusHistoryForClaim(idClaim).Status.Id;
                            if (status != claimStatus)
                            {
                                DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim()
                                {
                                    Id = idClaim,
                                    ClaimStatus = claimStatus
                                });
                                var statusHistory = new ClaimStatusHistory()
                                {
                                    Date = DateTime.Now,
                                    Comment = comment,
                                    IdClaim = idClaim,
                                    IdUser = user.Id,
                                    Status = new ClaimStatus() {Id = claimStatus}
                                };
                                db.SaveClaimStatusHistory(statusHistory);
                                statusHistory.DateString = statusHistory.Date.ToString("dd.MM.yyyy HH:mm");
                                model = statusHistory;
                            }
                            else
                            {
                                var statusHistory = new ClaimStatusHistory()
                                {
                                    Date = DateTime.Now,
                                    Comment = comment,
                                    IdClaim = idClaim,
                                    IdUser = user.Id,
                                    Status = new ClaimStatus() {Id = status}
                                };
                                db.SaveClaimStatusHistory(statusHistory);
                                statusHistory.DateString = statusHistory.Date.ToString("dd.MM.yyyy HH:mm");
                                model = statusHistory;
                            }
                            //инфа для уведомления
                            var claim = db.LoadTenderClaimById(idClaim);
                            var host = ConfigurationManager.AppSettings["AppHost"];
                            var productManagersFromAd = UserHelper.GetProductManagers();
                            var productManagers = db.LoadProductManagersForClaim(claim.Id, cv);
                            var productInClaim =
                                productManagersFromAd.Where(x => productManagers.Select(y => y.Id).Contains(x.Id))
                                    .ToList();
                            var manager = UserHelper.GetUserById(claim.Manager.Id);
                            var author = UserHelper.GetUserById(claim.Author.Id);
                            var to = new List<UserBase>();
                            to.Add(manager);
                            if (author.Id != manager.Id)
                            {
                                to.Add(author);
                            }
                            //>>>>Уведомления
                            if (claimStatus == 7)
                            {
                                var messageMail = new StringBuilder();
                                messageMail.Append("Добрый день!");
                                messageMail.Append("<br/>");
                                messageMail.Append("Заявка №" + claim.Id + " - версия " + cv + " - полностью расчитана.");
                                //messageMail.Append("<br/><br />");
                                //messageMail.Append(GetClaimInfo(claim));
                                messageMail.Append("<br/>");
                                //messageMail.Append("Продакты/Снабженцы: <br/>");
                                //foreach (var productManager in productInClaim)
                                //{
                                //    messageMail.Append(productManager.Name + "<br/>");
                                //}
                                messageMail.Append("Ссылка на заявку: ");
                                messageMail.Append("<a href='" + host + "/Claim/Index?claimId=" + claim.Id + "'>" + host +
                                                   "/Claim/Index?claimId=" + claim.Id + "</a>");
                                //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                                Notification.SendNotification(to, messageMail.ToString(),
                                    String.Format("{0} - версия {2} - {1} - Полный расчет заявки СпецРасчет", claim.TenderNumber,
                                        claim.Customer, cv));
                            }
                            //>>>>Уведомления
                            if (claimStatus == 6)
                            {
                                var noneCalculatePositionManagers =
                                    allPositions.Where(x => x.State == 1 || x.State == 3)
                                        .Select(x => x.ProductManager)
                                        .ToList();
                                if (noneCalculatePositionManagers.Any())
                                {
                                    var products =
                                        productManagersFromAd.Where(
                                            x => noneCalculatePositionManagers.Select(y => y.Id).Contains(x.Id))
                                            .ToList();
                                    var messageMail = new StringBuilder();
                                    messageMail.Append("Добрый день!");
                                    messageMail.Append("<br/>");
                                    messageMail.Append("Заявка №" + claim.Id + " частично расчитана.");
                                    messageMail.Append("Продакты/Снабженцы, у которых расчет еще в работе: <br/>");
                                    foreach (var productManager in products)
                                    {
                                        messageMail.Append(productManager.Name + "<br/>");
                                    }
                                    //messageMail.Append("<br/>");
                                    //messageMail.Append(GetClaimInfo(claim));
                                    //messageMail.Append("<br/>");

                                    messageMail.Append("Ссылка на заявку: ");
                                    messageMail.Append("<a href='" + host + "/Claim/Index?claimId=" + claim.Id + "'>" +
                                                       host +
                                                       "/Claim/Index?claimId=" + claim.Id + "</a>");
                                    //messageMail.Append("<br/>Сообщение от системы Спец расчет");
                                    Notification.SendNotification(to, messageMail.ToString(),
                                        String.Format("{0} - {1} - Частичный расчет заявки СпецРасчет",
                                            claim.TenderNumber, claim.Customer));
                                }
                            }
                        }
                    }
                    else
                    {
                        message = "Невозможно отправить позиции на подтверждение\rНе все позиции имеют расчет";
                    }
                }
                else
                {
                    message = "Выберите хотябы одну позицию!";
                }
            }
            catch (Exception)
            {
                isComplete = false;
                message = "Ошибка сервера";
            }
            return Json(new { IsComplete = isComplete, Message = message, Model = model }, JsonRequestBehavior.AllowGet);
        }