Ejemplo n.º 1
0
 public void Message_on_status_change()
 {
     Assert.That(AuditRecord.StatusChange(new Client {
         Status = ClientStatus.Off
     }).Message,
                 Is.EqualTo("$$$Клиент отключен"));
     Assert.That(AuditRecord.StatusChange(new Client {
         Status = ClientStatus.On
     }).Message,
                 Is.EqualTo("$$$Клиент включен"));
 }
        public void MoveUserOrAddress(uint clientId, uint userId, uint addressId, uint legalEntityId, bool moveAddress)
        {
            var newClient = DbSession.Load <Client>(clientId);
            var address   = DbSession.Get <Address>(addressId);
            var user      = DbSession.Get <User>(userId);

            Client oldClient = null;

            if (user != null)
            {
                oldClient = user.Client;
            }
            if (address != null)
            {
                oldClient = address.Client;
            }

            var legalEntity = DbSession.Get <LegalEntity>(legalEntityId);

            if (legalEntity == null)
            {
                legalEntity = newClient.Orgs().Single();
            }

            // Если нужно перенести вместе с пользователем,
            // адрес привязан только к этому пользователю и у пользователя нет других адресов,
            // тогда переносим пользователя

            if ((user != null && user.AvaliableAddresses.Count > 1) ||
                (address != null && address.AvaliableForUsers.Count > 1))
            {
                if (moveAddress)
                {
                    Error("Адрес доставки не может быть перемещен, т.к. имеет доступ к нему подключены пользователи");
                    RedirectUsingRoute("deliveries", "Edit", new { id = address.Id });
                    return;
                }
                else
                {
                    Error("Пользователь не может быть перемещен т.к. имеет доступ к адресам доставки");
                    RedirectUsingRoute("users", "Edit", new { id = user.Id });
                    return;
                }
            }

            if (user != null && user.AvaliableAddresses.Any(a => a.AvaliableForUsers.Count > 1))
            {
                Error("Пользователь не может быть перемещен т.к. подключен к адресу который связан с другими пользователями");
                RedirectUsingRoute("users", "Edit", new { id = user.Id });
                return;
            }

            if (address != null)
            {
                user = address.AvaliableForUsers.SingleOrDefault();
            }
            if (user != null)
            {
                address = user.AvaliableAddresses.SingleOrDefault();
            }

            AuditRecord log   = null;
            var         query = new UpdateOrders(newClient, user, address);

            if (user != null)
            {
                log = user.MoveToAnotherClient(DbSession, newClient, legalEntity);
            }
            if (address != null)
            {
                log = address.MoveToAnotherClient(DbSession, newClient, legalEntity);
            }

            query.Execute(DbSession);
            DbSession.Save(log);

            if (address != null)
            {
                Mail().AddressMoved(address, oldClient, address.OldValue(a => a.LegalEntity));
            }

            if (user != null)
            {
                Mail().UserMoved(user, oldClient, user.OldValue(u => u.Payer));
            }

            if (moveAddress)
            {
                Notify("Адрес доставки успешно перемещен");
                RedirectUsingRoute("deliveries", "Edit", new { id = address.Id });
            }
            else
            {
                Notify("Пользователь успешно перемещен");
                RedirectUsingRoute("users", "Edit", new { id = user.Id });
            }

            //нужно сохранить изменения, иначе oldClient.Refresh(); не зафиксирует их
            DbSession.Flush();
            DbSession.Refresh(oldClient);
            if (oldClient.Users.Count == 0 &&
                oldClient.Addresses.Count == 0 &&
                oldClient.Enabled)
            {
                oldClient.Disabled = true;
                Mail().EnableChanged(oldClient);
                DbSession.Save(AuditRecord.StatusChange(oldClient));
            }
            DbSession.Save(oldClient);
        }