public void RegisterSupplier( [DataBind("supplierContacts")] Contact[] supplierContacts, ulong homeRegion, [DataBind("regionSettings")] RegionSettings[] regionSettings, [DataBind("options")] AdditionalSettings options, [DataBind("payer")] Payer payer, uint?existingPayerId, [DataBind("userContacts")] Contact[] userContacts, [DataBind("userPersons")] Person[] userPersons, string additionalEmailsForSendingCard, string comment) { var supplier = new Supplier(); supplier.RegionMask = regionSettings.GetBrowseMask(); SetARDataBinder(AutoLoadBehavior.NewRootInstanceIfInvalidKey); BindObjectInstance(supplier, "supplier"); SetBinder(new DataBinder()); var currentPayer = RegisterPayer(options, payer, existingPayerId, supplier.Name, supplier.FullName); supplier.HomeRegion = DbSession.Load <Region>(homeRegion); supplier.Payer = currentPayer; supplier.Account = new SupplierAccount(supplier); supplier.ContactGroupOwner = new ContactGroupOwner(supplier.GetAditionalContactGroups()); supplier.Registration = new RegistrationInfo(Admin); var user = new User(supplier.Payer, supplier); BindObjectInstance(user, "user"); if (!IsValid(supplier, user, options)) { RegisterSupplier(); PropertyBag["options"] = options; PropertyBag["supplier"] = supplier; PropertyBag["user"] = user; PropertyBag["options"] = options; return; } var tokens = DbSession.Query <FederalSupplierToken>().ToList(); supplier.IsFederal = tokens.Select(x => x.Name) .Any(x => supplier.Name.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) >= 0 || supplier.FullName.IndexOf(x, StringComparison.CurrentCultureIgnoreCase) >= 0); supplier.ContactGroupOwner.AddContactGroup(new ContactGroup(ContactGroupType.MiniMails)); currentPayer.Suppliers.Add(supplier); currentPayer.UpdatePaymentSum(); AddContacts(supplier.ContactGroupOwner, supplierContacts); supplier.OrderRules.Add(new OrderSendRules(Defaults, supplier)); DbSession.Save(supplier); foreach (var group in supplier.ContactGroupOwner.ContactGroups) { var persons = BindObject <List <Person> >(group.Type + "Persons"); var contacts = BindObject <List <Contact> >(group.Type + "Contacts"); group.Persons = persons; group.Contacts = contacts; } var groups = BindObject <RegionalDeliveryGroup[]>("orderDeliveryGroup"); foreach (var group in groups) { group.Region = DbSession.Load <Region>(group.Region.Id); group.Name = "Доставка заказов " + group.Region.Name; group.ContactGroupOwner = supplier.ContactGroupOwner; supplier.ContactGroupOwner.ContactGroups.Add(group); //повторная валидация, тк когда производился binding валидация не прошла //тк не было заполнено поле Name Validator.IsValid(group); } foreach (var group in supplier.ContactGroupOwner.ContactGroups) { group.Adopt(); DbSession.Save(group); group.Persons.Each(p => DbSession.Save(p)); } DbSession.Flush(); DbSession.Query <Region>() .Where(r => (r.Id & supplier.RegionMask) > 0) .Each(r => supplier.AddRegion(r, DbSession)); CreateSupplier(supplier); Maintainer.MaintainIntersection(supplier, DbSession); user.UpdateContacts(userContacts); foreach (var person in userPersons) { user.AddContactPerson(person.Name); } user.AssignDefaultPermission(DbSession); user.Setup(DbSession); var password = user.CreateInAd(Session); supplier.AddBillingComment(comment); Mailer.SupplierRegistred(supplier, comment); //Создание директорий для поставщика на фтп supplier.CreateDirs(); var log = new PasswordChangeLogEntity(user.Login); if (options.SendRegistrationCard) { log = SendRegistrationCard(log, user, password.Password, additionalEmailsForSendingCard); } string smsLog = ""; if (options.SendSmsToUser) { var phonesForSendToUserArray = user.GetPhonesForSendingSms().Select(x => x.Number).ToArray(); smsLog = smsLog + " " + ReportHelper.SendSmsPasswordToUser(user, password.Password, phonesForSendToUserArray); } if (options.SendSmsToAdmin) { var phonesForSendToAdminArray = GetPhoneSupportByRegionForSms(user.RootService.HomeRegion.Id); smsLog = smsLog + " " + ReportHelper.SendSmsToRegionalAdmin(user, password.Password, phonesForSendToAdminArray); } log.SmsLog = smsLog; DbSession.Save(log); if (options.FillBillingInfo) { Redirect("Register", "RegisterPayer", new { id = supplier.Payer.Id, showRegistrationCard = options.ShowRegistrationCard, passwordId = password.PasswordId }); } else if (supplier.Users.Count > 0 && options.ShowRegistrationCard) { Redirect("main", "report", new { id = supplier.Users.First().Id, passwordId = password.PasswordId }); } else { Notify("Регистрация завершена успешно"); Redirect("Suppliers", "Show", new { id = supplier.Id }); } }