void ValidateCreporderDetails_VM(CreporderDetails_VM model, ModelStateDictionary state)
        {
            state.Clear();

            //дата обнаружения неисправности
            //должна быть введена, должна иметь правильный формат, не должна быть позже текущей даты, не должна быть раньше 2-х лет
            DateTime tempDate;
            try
            {
                if (model.RevealedDate != null)
                {
                    tempDate = DateTime.Parse(model.RevealedDate); //если ввели некоректные данные, то не распарсит
                    if (tempDate>DateTime.Now)
                    {
                        state.AddModelError("", "Дата обнаружения неисправности позже текущей даты!");
                    }
                    else if(tempDate<DateTime.Now.AddYears(-2))
                    {
                        state.AddModelError("", "Неисправность не должна быть обнаружена более 2-х лет назад!");
                    }
                }
                else
                {
                    state.AddModelError("", "Пожалуйста введите дату обнаружения неисправности!");
                }
            }
            catch
            {
                //нераспарсил
                state.AddModelError("DateError", "Пожалуйста введить дату обнаружения неисправности в формате ДД.ММ.ГГГГ");
            }

            //описание неисправности: обязательно, не более 1000 символов
            if (model.ReporderDescription==null)
            {
                state.AddModelError("", "Пожалуйста введите описание неисправности!");
            }
            else if (model.ReporderDescription.Length>1000)
            {
                state.AddModelError("", "Описание неисправности слишком длинное!");
            }

            //адрес местонахождения: проверяем только если пользователь снял галку "установлен на тепловом пункте"
            //обязательно должен быть введен, должен быть не более 300 символов
            if(!model.Mounted)
            {
                if (model.EquipLocation==null)
                {
                    state.AddModelError("", "Пожалуйста укажите адрес местонахождения (или выберите 'находится в ТП')!");
                }
                else if(model.EquipLocation.Length>300)
                {
                    state.AddModelError("", "Адрес установки слишком длинный!");
                }
            }

            //срок выполнения работ, если введен, то должен быть не более 200 символов
            if(model.ExpectedRepairTerm!=null && model.ExpectedRepairTerm.Length>200)
            {
                state.AddModelError("", "Срок выполнения работ слишком длинный!");
            }

            //контакт: должен быть отмечен по крайней мере 1 контакт и не более 5;
            int count = 0;
            if(model.ContactsChoice!=null)
            {
                foreach (var contact in model.ContactsChoice)
                {
                    if (contact.Checked == true) count++;
                }
            }

            if (count==0)
            {
                state.AddModelError("", "Пожалуйста выберите контактных лиц!");
            }
            else if (count>5)
            {
                state.AddModelError("", "Пожалуйста выберите не более 5 контактных лиц!");
            }
        }
        public ActionResult EditCRepOrder(CreporderDetails_VM model)
        {
            // валидация введенных пользователем данных
            ValidateCreporderDetails_VM(model, ModelState);

            if (ModelState.IsValid)
            {
                //валидация успешна, пробуем сохранить изменения в БД
                //1.если одорудование не находится в ТП, то введенный пользователем адрес установки сохраним в БД
                if (!model.Mounted)
                {
                    UserSavedOption userOption = userRepository.GetUserOptions(System.Web.HttpContext.Current.User.Identity.Name);
                    userOption.USO_СLastEquipLocation = model.EquipLocation;
                    try
                    {
                        userRepository.SaveUserOptions(userOption);
                    }
                    catch (Exception e)
                    {
                        ModelState.AddModelError("", e.Message);
                    }
                }
            }

            if (ModelState.IsValid)
            {
                //валидация успешна, и сохранены настройки пользователя, контроллер смонтирован: добавим в БД новую заявку
                CRepOrder tempRepOrder = repairRepository.CRepOrders.SingleOrDefault(cro=>cro.CRO_ID==model.ID);

                tempRepOrder.CRO_description = model.ReporderDescription;
                tempRepOrder.CRO_equipLocation = model.Mounted ? tempRepOrder.Heat_Station.HS_adress : model.EquipLocation;
                tempRepOrder.CRO_expectedRepairTerm = model.ExpectedRepairTerm;
                tempRepOrder.CRO_revealedDate = DateTime.Parse(model.RevealedDate);

                //добавим контакты
                List<ContactWCheck> ContsForCRepOrder = model.ContactsChoice.Where(c => c.Checked == true).ToList();
                tempRepOrder.CRO_contact1 = ContsForCRepOrder[0].ContactID;
                if (ContsForCRepOrder.Count > 1) tempRepOrder.CRO_contact2 = ContsForCRepOrder[1].ContactID;
                    else tempRepOrder.CRO_contact2 = null;
                if (ContsForCRepOrder.Count > 2) tempRepOrder.CRO_contact3 = ContsForCRepOrder[2].ContactID;
                    else tempRepOrder.CRO_contact3 = null;
                if (ContsForCRepOrder.Count > 3) tempRepOrder.CRO_contact4 = ContsForCRepOrder[3].ContactID;
                    else tempRepOrder.CRO_contact4 = null;
                if (ContsForCRepOrder.Count > 4) tempRepOrder.CRO_contact5 = ContsForCRepOrder[4].ContactID;
                    else tempRepOrder.CRO_contact5 = null;

                try
                {
                    repairRepository.SaveCRepOrder(tempRepOrder);
                }
                catch (Exception e)
                {
                    ModelState.AddModelError("", e.Message);
                }

            }

            if (ModelState.IsValid)
            {
                //все операции успешны: переходим на окно просмотра карточки заявки
                return Redirect(model.ReturnURL);
            }
            else
            {
                //есть ошибки валидации - выведем их пользователю
                //добавим в модель недостающие данные
                if (model.ContactsChoice!=null)
                {
                    foreach (var contact in model.ContactsChoice)
                    {
                        contact.Contact = userRepository.Contacts.SingleOrDefault(c => c.Cont_ID == contact.ContactID);
                    }
                }
                else
                {
                    model.AllContacts = userRepository.Contacts.Where(c => c.Cont_enterprise == model.EnterpriseNo && c.Cont_deletedBy == null);
                }

                model.Controller = dataRepository.Controllers.SingleOrDefault(c => c.C_ID == model.CID);
                model.HeatStation = dataRepository.HeatStations.SingleOrDefault(hs => hs.HS_ID == model.HSID);
                return View(model);
            }
        }
        public ActionResult CreporderDetails(CreporderDetails_VM model)
        {
            // валидация введенных пользователем данных
            ValidateCreporderDetails_VM(model, ModelState);

            if (ModelState.IsValid)
            {
                //валидация успешна, пробуем сохранить изменения в БД
                //1.если одорудование не находится в ТП, то введенный пользователем адрес установки сохраним в БД
                if (!model.Mounted)
                {
                    UserSavedOption userOption = userRepository.GetUserOptions(System.Web.HttpContext.Current.User.Identity.Name);
                    userOption.USO_СLastEquipLocation = model.EquipLocation;
                    try
                    {
                        userRepository.SaveUserOptions(userOption);
                    }
                    catch (Exception e)
                    {
                        ModelState.AddModelError("", e.Message);
                    }
                }
            }

            //дополнительно убедимся, что контроллер смонтирован во избежание нулевых ссылок при создании
            model.Controller = dataRepository.Controllers.FirstOrDefault(c => c.C_ID == model.CID);
            if (!model.Controller.ASystems1.Any())
            {
                ModelState.AddModelError ("","Невозможно создать заявку: контроллер демонтирован с объекта!");
            }
            //дополнительно убедимся, что lдля контроллера указан год выпуска во избежание нулевых ссылок при создании
            if (model.Controller.C_prodDate==null)
            {
                ModelState.AddModelError("", "Невозможно создать заявку: для контроллера не указан год производства!");
            }

            int newOrderID = 0;
            if (ModelState.IsValid)
            {
                //валидация успешна, и сохранены настройки пользователя, контроллер смонтирован: добавим в БД новую заявку
                CRepOrder newRepOrder = new CRepOrder
                {
                    CRO_CID = model.CID,
                    CRO_CprodDate = model.Controller.C_prodDate.Value,
                    CRO_CmodelID = model.Controller.C_modelNo,
                    CRO_createdDate = DateTime.Now,
                    CRO_description = model.ReporderDescription,
                    CRO_equipLocation = model.Mounted ? model.Controller.ASystems1.First().Heat_Station.HS_adress : model.EquipLocation,
                    CRO_expectedRepairTerm = model.ExpectedRepairTerm,
                    CRO_HSID = model.Controller.ASystems1.First().AS_Heat_Station,
                    CRO_revealedDate = DateTime.Parse(model.RevealedDate)
                };

                //добавим контакты
                List<ContactWCheck> ContsForCRepOrder = model.ContactsChoice.Where(c => c.Checked == true).ToList();
                newRepOrder.CRO_contact1 = ContsForCRepOrder[0].ContactID;
                if (ContsForCRepOrder.Count > 1) newRepOrder.CRO_contact2 = ContsForCRepOrder[1].ContactID;
                if (ContsForCRepOrder.Count > 2) newRepOrder.CRO_contact3 = ContsForCRepOrder[2].ContactID;
                if (ContsForCRepOrder.Count > 3) newRepOrder.CRO_contact4 = ContsForCRepOrder[3].ContactID;
                if (ContsForCRepOrder.Count > 4) newRepOrder.CRO_contact5 = ContsForCRepOrder[4].ContactID;

                try
                {
                    newOrderID = repairRepository.SaveCRepOrder(newRepOrder);
                }
                catch (Exception e)
                {
                    ModelState.AddModelError("", e.Message);
                }

            }

            if (ModelState.IsValid)
            {
                //все операции успешны: переходим на окно просмотра карточки заявки
                return RedirectToAction("ViewCReporder", new { CRO_ID = newOrderID, returnURL = model.ReturnURL });

            }
            else
            {
                //есть ошибки валидации - выведем их пользователю
                //добавим в модель недостающие данные
                if (model.ContactsChoice!=null)
                {
                    foreach (var contact in model.ContactsChoice)
                    {
                        contact.Contact = userRepository.Contacts.SingleOrDefault(c => c.Cont_ID == contact.ContactID);
                    }
                }
                else
                {
                    model.AllContacts = userRepository.Contacts.Where(c => c.Cont_enterprise == model.EnterpriseNo && c.Cont_deletedBy == null);
                }

                return View(model);
            }
        }
        public ActionResult EditCRepOrder(int ID, string returnURL)
        {
            CRepOrder tempCRO = repairRepository.CRepOrders.SingleOrDefault(cro => cro.CRO_ID == ID);
            HSA.Domain.BD.Controller tempC = dataRepository.Controllers.FirstOrDefault(c => c.C_ID == tempCRO.CRO_CID);
            Heat_Station tempHS = dataRepository.HeatStations.SingleOrDefault(hs=>hs.HS_ID == tempCRO.CRO_HSID);

            //определим номер предприятия для которого создается заявка: нужно для правильного определения списка выводимых в представление контактов
            int reporderEntNo;
            if (userRepository.Users.SingleOrDefault(u => u.Name == System.Web.HttpContext.Current.User.Identity.Name).Enterprise != 0)
            {
                //если заяавку создает пользователь кокого либо предпряития ,то предприятияе определяем по пользователю
                reporderEntNo = userRepository.Users.SingleOrDefault(u => u.Name == System.Web.HttpContext.Current.User.Identity.Name).Enterprise;
            }
            else if (tempC.ASystems1.Any())
            {
                //заявку создает администратор и контроллер установлен на объекте - определяем по объекту
                reporderEntNo = tempC.ASystems1.First().Heat_Station.HS_Enterprise;
            }
            else
            {
                //заявку создает администратор и контроллер не установлен на объекте - определяем по контроллеру
                reporderEntNo = tempC.C_OwnerEnterprise.Value;
            }
            CreporderDetails_VM model = new CreporderDetails_VM
            {
                ID = tempCRO.CRO_ID,
                CID = tempCRO.CRO_CID,
                RevealedDate = tempCRO.CRO_revealedDate.ToShortDateString(),
                Controller = tempC,
                ReturnURL = returnURL,
                Mounted = string.Compare(tempCRO.CRO_equipLocation,tempHS.HS_adress)==0,
                EquipLocation = tempCRO.CRO_equipLocation,
                AllContacts = userRepository.Contacts.Where(c => c.Cont_enterprise == reporderEntNo && c.Cont_deletedBy == null),
                ReporderDescription = tempCRO.CRO_description,
                ExpectedRepairTerm = tempCRO.CRO_expectedRepairTerm,
                HeatStation = tempHS,
                HSID = tempHS.HS_ID,
                EnterpriseNo = reporderEntNo
            };

            //отметим галочками нужные контакты
            foreach (var cwc in model.ContactsChoice)
            {
                //если в зяявке указан этот контакт (поля contact1 - contact5) то контакт будет отображатся как отмеченный
                if(tempCRO.CRO_contact1==cwc.ContactID ||
                    tempCRO.CRO_contact2==cwc.ContactID ||
                    tempCRO.CRO_contact3==cwc.ContactID ||
                    tempCRO.CRO_contact4==cwc.ContactID ||
                    tempCRO.CRO_contact5==cwc.ContactID
                    )
                {
                    cwc.Checked=true;
                }
            }
            return View(model);
        }
        public ActionResult CreporderDetails(int cID, string returnURL)
        {
            HSA.Domain.BD.Controller tempC = dataRepository.Controllers.FirstOrDefault(c=>c.C_ID==cID);
            //определим номер предприятия для которого создается заявка: нужно для правильного определения списка выводимых в представление контактов
            int reporderEntNo;
            if (userRepository.Users.SingleOrDefault(u=>u.Name==System.Web.HttpContext.Current.User.Identity.Name).Enterprise!=0)
            {
                //если заяавку создает пользователь кокого либо предпряития ,то предприятияе определяем по пользователю
                reporderEntNo = userRepository.Users.SingleOrDefault(u => u.Name == System.Web.HttpContext.Current.User.Identity.Name).Enterprise;
            }
            else if (tempC.ASystems1.Any())
            {
                //заявку создает администратор и контроллер установлен на объекте - определяем по объекту
                reporderEntNo = tempC.ASystems1.First().Heat_Station.HS_Enterprise;
            }
            else
            {
                //заявку создает администратор и контроллер не установлен на объекте - определяем по контроллеру
                reporderEntNo = tempC.C_OwnerEnterprise.Value;
            }

            CreporderDetails_VM model = new CreporderDetails_VM
            {
                CID = cID,
                RevealedDate = DateTime.Now.ToShortDateString(),
                Controller = tempC,
                ReturnURL = returnURL,
                Mounted = true,
                EquipLocation = userRepository.GetUserOptions(System.Web.HttpContext.Current.User.Identity.Name).USO_СLastEquipLocation,
                AllContacts = userRepository.Contacts.Where(c=>c.Cont_enterprise==reporderEntNo && c.Cont_deletedBy==null),
                EnterpriseNo = reporderEntNo

            };
            return View(model);
        }