public override void EditContactGroup(uint contactGroupId)
        {
            var contactGroup = ContactGroup.Find(contactGroupId);
            var payerOwners  = DbSession.Query <PayerOwnerContact>()
                               .Where(p => contactGroup.Contacts.Contains(p.Contact))
                               .Fetch(p => p.Payer)
                               .ToDictionary(k => k.Contact);

            foreach (var contact in contactGroup.Contacts)
            {
                if (payerOwners.Keys.Contains(contact))
                {
                    var payer = payerOwners[contact].Payer;
                    contact.PayerOwnerName = string.Format("[{0}] - \"{1}\"", payer.Id, payer.ShortName);
                }
            }
            PropertyBag["CurrentContactGroup"] = contactGroup;
        }
        protected void btnSaveContactGropup_Click(object sender, EventArgs e)
        {
            uint newGroupId;

            //попытка преобразовать выбранное значение в Id группы, если это получилось сделать, то установливаем новое значение
            if (uint.TryParse(ContactGroups.SelectedValue, out newGroupId))
            {
                var newGroup = ContactGroup.Find(newGroupId);
                using (new TransactionScope()) {
                    _generalReport.ContactGroup = newGroup;
                    _generalReport.Save();
                }

                lContactGroupName.Text = _generalReport.ContactGroup.Name;
                tbContactFind.Text     = String.Empty;
                btnRun.Enabled         = _currentTask.Enabled && (_currentTask.State != TaskState.Running);
            }

            ClearSearch();

            CloseTaskService();
        }
        public override void UpdateContactGroup(uint contactGroupId,
                                                [DataBind("Contacts")] Contact[] contacts)
        {
            var actualContactId = contacts.Select(c => c.Id).ToList();
            var oldContacts     = DbSession.Query <Contact>().Where(c => actualContactId.Contains(c.Id)).ToList().ToDictionary(c => c.Id);
            var mails           = contacts.Where(c => c.Id == 0 || oldContacts[c.Id].ContactText != c.ContactText).Select(c => c.ContactText).Distinct().ToList();
            var payerContacts   = DbSession.Query <PayerOwnerContact>().Where(c => mails.Contains(c.Contact.ContactText)).ToList();

            if (payerContacts.Count > 0)
            {
                var errorBuilder = new StringBuilder();
                foreach (var email in mails)
                {
                    var payers = payerContacts.Where(p => p.Contact.ContactText == email).GroupBy(g => g.Payer).ToList();
                    foreach (var payer in payers)
                    {
                        errorBuilder.AppendLine(string.Format("E-mail <b>{0}</b> уже зарегистрирован для плательщика <b>{1}</b>", email, payer.Key.ShortName));
                    }
                }
                if (errorBuilder.Length > 0)
                {
                    errorBuilder.AppendLine();
                    errorBuilder.AppendLine("Для добавления данных E-mail в список рассылки отчетов воспользуйтесь Л.К. любого Поставщика или Аптеки для этого Плательщика");
                    PropertyBag["Message"] = Message.Error(errorBuilder.ToString().Replace("\r\n", "<br/>"));
                }
                var contactGroup = ContactGroup.Find(contactGroupId);
                RenderInvalidGroup(contacts, contactGroup);
            }
            else
            {
                base.UpdateContactGroup(contactGroupId, contacts);
            }
            if (Response.StatusCode == 302)
            {
                RedirectToAction("CloseWindow");
            }
        }