public JsonResult SetPositonRejected(List<int> positionsId, string comment, int idClaim, int cv)
 {
     var isComplete = false;
     ClaimStatusHistory model = null;
     try
     {
         var user = GetUser();
         var db = new DbEngine();
         isComplete = db.ChangePositionsState(positionsId, 3);
         var allPositions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
         int claimStatus = 3;
         bool isSameCalculate = allPositions.Any(x => x.State == 2 || x.State == 4);
         if (isSameCalculate) claimStatus = 6;
         var status = db.LoadLastStatusHistoryForClaim(idClaim).Status.Id;
         //изменение статуса заявки и истроиии изменения статусов
         if (status != claimStatus)
         {
             var changeStatusComplete = DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim() { Id = idClaim, ClaimStatus = claimStatus });
             if (changeStatusComplete)
             {
                 model = new ClaimStatusHistory()
                 {
                     Date = DateTime.Now,
                     IdUser = user.Id,
                     IdClaim = idClaim,
                     Comment = comment,
                     Status = new ClaimStatus() { Id = claimStatus }
                 };
                 if (string.IsNullOrEmpty(model.Comment)) model.Comment = string.Empty;
                 db.SaveClaimStatusHistory(model);
                 model.DateString = model.Date.ToString("dd.MM.yyyy HH:mm");
             }
         }
         if (isComplete)
         {
             //>>>>Уведомления
             var claim = db.LoadTenderClaimById(idClaim);
             var productManagers =
                 allPositions.Where(x => positionsId.Contains(x.Id)).Select(x => x.ProductManager).ToList();
             if (productManagers.Any())
             {
                 var productManagersFromAd = UserHelper.GetProductManagers();
                 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("Пользователь ");
                 messageMail.Append(user.ShortName);
                 messageMail.Append(" отклонил Ваш расчет позиции по заявке № " + claim.Id + "<br/>");
                 if (!string.IsNullOrEmpty(comment)) messageMail.Append("Комментарий: " + comment);
                 messageMail.Append("<br/><br/>");
                 //messageMail.Append(GetClaimInfo(claim));
                 //messageMail.Append("<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 = model });
 }
        //>>>>Уведомления
        //подтверждение позиций по заявке
        public JsonResult SetClaimAllPositonConfirmed(int idClaim, int cv)
        {
            var isComplete = false;
            ClaimStatusHistory model = null;
            var message = string.Empty;
            try
            {
                var user = GetUser();
                var db = new DbEngine();
                var positions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
                if (positions.Any())
                {
                    //все ли позиции имеют расчет
                    var isReady = db.IsPositionsReadyToConfirm(positions);
                    if (isReady)
                    {
                        //изменение статуса позиций, заявки и истории изменения статусов
                        isComplete = db.ChangePositionsState(positions.Select(x => x.Id).ToList(), 4);
                        if (isComplete)
                        {
                            DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim() { Id = idClaim, ClaimStatus = 8 });
                            model = new ClaimStatusHistory()
                            {
                                Date = DateTime.Now,
                                IdUser = user.Id,
                                IdClaim = idClaim,
                                Comment = string.Empty,
                                Status = new ClaimStatus() { Id = 8 }
                            };
                            db.SaveClaimStatusHistory(model);
                            model.DateString = model.Date.ToString("dd.MM.yyyy HH:mm");
                            //>>>>Уведомления
                            var claim = db.LoadTenderClaimById(idClaim);
                            var productManagers = positions.Select(x => x.ProductManager).ToList();
                            if (productManagers.Any())
                            {
                                var productManagersFromAd = UserHelper.GetProductManagers();
                                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("Пользователь ");
                                messageMail.Append(user.ShortName);
                                messageMail.Append(" подтвердил Ваш расчет позиции по заявке № " + claim.Id + " - версия " + cv);
                                messageMail.Append("<br/><br/>");
                                //messageMail.Append(GetClaimInfo(claim));
                                //messageMail.Append("<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} - версия {2} - {1} - Подтверждение расчета позиций заявки СпецРасчет", claim.TenderNumber, claim.Customer, cv));
                            }
                        }

                    }
                    else
                    {
                        message = "Невозможно отправить позиции на подтверждение\rНе все позиции имеют расчет";
                    }
                }
                else
                {
                    message = "Невозможно отправить позиции на подтверждение\rВ заявке нет позиций";
                }
            }
            catch (Exception)
            {
                isComplete = false;
            }
            return Json(new { IsComplete = isComplete, Model = model, Message = message }, JsonRequestBehavior.AllowGet);
        }
        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 JsonResult SendPositonOnWork(List<int> positionsId, string comment, int idClaim, int cv)
        {
            var isComplete = false;
            ClaimStatusHistory model = null;
            try
            {
                var user = GetUser();
                var db = new DbEngine();
                isComplete = db.ChangePositionsState(positionsId, 1);
                var lastStatus = db.LoadLastStatusHistoryForClaim(idClaim);
                int claimStatus; var allPositions = db.LoadSpecificationPositionsForTenderClaim(idClaim, cv);
                if (lastStatus.Status.Id == 9) claimStatus = 2;
                else claimStatus = lastStatus.Status.Id;
                var productManagers =
                        allPositions.Where(x => positionsId.Contains(x.Id)).Select(x => x.ProductManager).ToList();
                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 status = db.LoadLastStatusHistoryForClaim(idClaim).Status.Id;
                //изменение статуса заявки и истроиии изменения статусов
                var changeStatusComplete = true;
                if (lastStatus.Status.Id == 9) changeStatusComplete = DbEngine.ChangeTenderClaimClaimStatus(new TenderClaim() { Id = idClaim, ClaimStatus = 2 });
               if (changeStatusComplete)
                    {
                        model = new ClaimStatusHistory()
                        {
                            Date = DateTime.Now,
                            IdUser = user.Id,
                            IdClaim = idClaim,
                            Comment = "Переданы позиции для повторного расчета для:<br />"
                    +string.Join("<br />", productManagers.Select(x => x.ShortName))+"<br /><br />",

                            Status = new ClaimStatus() { Id = claimStatus}
                        };
                        if (!string.IsNullOrEmpty(comment)) model.Comment += "Комментарий: " + comment + "<br />";
                        model.Comment += "Автор: " + user.ShortName;
                        db.SaveClaimStatusHistory(model);
                        model.DateString = model.Date.ToString("dd.MM.yyyy HH:mm");
                    }

                if (isComplete)
                {
                    //>>>>Уведомления
                    var claim = db.LoadTenderClaimById(idClaim);
                     productManagers =
                        allPositions.Where(x => positionsId.Contains(x.Id)).Select(x => x.ProductManager).ToList();
                    if (productManagers.Any())
                    {
                        var productManagersFromAd = UserHelper.GetProductManagers();
                        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("Добрый день!<br/>");
                        messageMail.Append("В заявке № " + claim.Id + " вам вновь переданы позиции для расчета пользователем " + user.Name +"<br/>");
                        if (!string.IsNullOrEmpty(comment)) messageMail.Append("Комментарий: " + comment+"<br/>");
                        messageMail.Append("<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 = model });
        }
        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);
        }