< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.ClusterService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/ClusterService.cs
Covered lines:71
Uncovered lines:2
Coverable lines:73
Total lines:194
Line coverage:97.2% (71 of 73)
Covered branches:9
Total branches:16
Branch coverage:56.2% (9 of 16)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetClusters()100%50%
GetCluster()100%100%
GetCluster()100%100%
GetCluster()100%100%
PrepeareClusters()100%100%
GetClusterUsers()100%100%
CreateCluster()100%50%
UpdateCluster()71.42%50%
ClusterExists()100%100%
GetClustersByName(...)100%100%
GetClustersByWarehouse()100%100%

File(s)

/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/ClusterService.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using System.Threading.Tasks;
 4using Microsoft.EntityFrameworkCore;
 5using Microsoft.Extensions.Logging;
 6using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 7using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 8using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 9using WinSolutions.Sveta.Server.Domain;
 10using WinSolutions.Sveta.Server.Services.Interfaces;
 11using WinSolutions.Sveta.Common;
 12using System;
 13using WinSolutions.Sveta.Common.Extensions;
 14
 15namespace WinSolutions.Sveta.Server.Services.Implements
 16{
 17    public class ClusterService : SvetaServiceBase, IClusterService
 18    {
 19        private readonly SvetaDbContext _db;
 20        private readonly ILogger<ClusterService> _logger;
 21        private readonly IContragentService _contrService;
 22        private readonly IAuthenticationService _authService;
 23
 24        public ClusterService(SvetaDbContext db, ILogger<ClusterService> logger, IContragentService contrService, IAuthe
 18625            : base(authenticationService)
 18626        {
 18627            _db = db;
 18628            _authService = authenticationService;
 18629            _logger = logger;
 18630            _contrService = contrService;
 18631        }
 32
 33        /// <summary>
 34        /// Возвращает все кластера
 35        /// </summary>
 36        /// <remarks>author i.rebenok</remarks>
 37        /// <param name="page"> пагинация: номер страницы</param>
 38        /// <param name="limit"> пагинация: размер страницы</param>
 39        /// <param name="filter">фильтр по значимым полям: имя кластера</param>
 40        /// <param name="sortByNameDesc">сортировать по имени DESC - true or false</param>
 41        /// <param name = "contragentId" > id контрагента.Если 0, то все кластера выводить, если >0, то только по этому 
 42        /// <param name="warehouseId">id склада владельца. Если 0, то все кластера выводить в рамках КА, если >0,то толь
 43        /// <param name="activeOnly">true, если выводить только активные кластера. По умолчанию false</param>
 44        public async Task<PaginatedData<List<Cluster>>> GetClusters(int page, int limit, string filter, bool sortByNameD
 245        {
 246            var clusters = PrepeareClusters().AsNoTracking();
 47            // Тотал записей для смертных считаем после прмиенения ограничения роли
 248            int total = await clusters?.CountAsync(x => _authService.IsUserPlatform() || x.Warehouse.Contragent.Id == co
 249            clusters = clusters.Where(x => contragentId == 0 || x.Warehouse.Contragent.Id == contragentId)
 250                .Where(x => warehouseId == 0 || x.Warehouse.Id == warehouseId)
 251                .Where(x => !activeOnly || x.RecState.Id == (int)RecordState.Active)
 252                .Where(x => string.IsNullOrWhiteSpace(filter) || x.Name.ToUpper().Contains(filter.ToUpper()));
 253            clusters = !sortByNameDesc ? clusters.OrderBy(x => x.Name) : clusters.OrderByDescending(x => x.Name);
 254            int filtered = await clusters?.CountAsync();
 255            return new PaginatedData<List<Cluster>>
 256            {
 257                Result = await clusters.Skip(page * limit).Take(limit).ToListAsync(),
 258                TotalCount = total,
 259                TotalFilteredCount = filtered
 260            };
 261        }
 62
 63        /// <summary>
 64        /// получает кластер по id контрагента, к которому относится владелец-склад и по вхождению магазина
 65        /// </summary>
 66        /// <param name="ownerId">id контрагента</param>
 67        /// <param name="departmentContains">магазин, который доджен входить в кластер</param>
 68        /// <returns>кластер</returns>
 169        public async Task<Cluster> GetCluster(long ownerId, Department departmentContains) => await PrepeareClusters()
 170            .Where(d => d.RecState.Id == (int)RecordState.Active)
 171            .Where(d => d.Warehouse.Contragent.Id == ownerId)
 172            .Where(d => d.Departments.Contains(departmentContains))
 173            .FirstOrDefaultAsync();
 74
 75        /// <summary>
 76        /// получает кластер по id
 77        /// </summary>
 78        /// <param name="clusterId">id кластера</param>
 79        /// <returns>кластер</returns>
 5080        public async Task<Cluster> GetCluster(long clusterId) => await PrepeareClusters().Where(x => x.Id == clusterId).
 81
 82        /// <summary>
 83        /// получает кластер по id и id контрагента, к которому принадлежит  склад-владелец кластера
 84        /// </summary>
 85        /// <param name="clusterId">id кластера</param>
 86        /// <param name="contragentId">id контрагента</param>
 87        /// <returns>кластер</returns>
 188        public async Task<Cluster> GetCluster(long clusterId, long contragentId) => await PrepeareClusters()
 189            .Where(x => x.Id == clusterId && x.Warehouse.Contragent.Id == contragentId).FirstOrDefaultAsync();
 90        /* .Where(x => x.Warehouse.Kind.Id == (int)DepartmentKind.Warehouse &&
 91             x.Warehouse.UsersDepartments.Any(d => d.UserId == userId)).FirstOrDefaultAsync();*/
 92
 93        /// <summary>
 94        /// Предварительная выборка кластеров
 95        /// </summary>
 96        /// <returns></returns>
 43097        private IQueryable<Cluster> PrepeareClusters() => _db.Clusters
 43098            .Include(e => e.Warehouse)
 43099            .ThenInclude(Warehouse => Warehouse.UsersDepartments)
 430100            .Include(e => e.Warehouse)
 430101            .ThenInclude(Warehouse => Warehouse.Contragent)
 430102            .Include(e => e.Warehouse)
 430103            .ThenInclude(Warehouse => Warehouse.Kind)
 430104            .Include(e => e.RecState)
 430105            .Include(e => e.Departments)
 430106            .ThenInclude(Departments => Departments.ActualAddress)
 430107            .Include(d => d.ClusterDeliveryTypes)
 430108            .ThenInclude(delivery => delivery.DeliveryType)
 430109            .ThenInclude(typ => typ.DeliveryCostTypes)
 430110            .Where(e => !e.IsDeleted)
 430111            .AsQueryable();
 112
 113        /// <summary>
 114        /// Получает кластер с привязками всех юзеров, которые привязаны к магазинам из кластера
 115        /// </summary>
 116        /// <param name="clusterId">id кластера</param>
 117        /// <returns>кластер</returns>
 1118        public async Task<Cluster> GetClusterUsers(long clusterId) => await _db.Clusters
 1119            .Include(e => e.Departments)
 1120            .ThenInclude(Departments => Departments.UsersDepartments).ThenInclude(UsersDepartments => UsersDepartments.U
 1121            .Where(e => !e.IsDeleted)
 1122            .FirstOrDefaultAsync(e => e.Id == clusterId);
 123
 124        /// <summary>
 125        /// Создает кластер
 126        /// </summary>
 127        /// <param name="clusterIn">кластер</param>
 128        /// <returns></returns>
 129        public async Task CreateCluster(Cluster clusterIn)
 375130        {
 375131            _db.Entry(clusterIn.Warehouse).State =  EntityState.Unchanged;
 375132            _db.Entry(clusterIn.RecState).State =  EntityState.Unchanged;
 375133            await _db.Clusters.AddAsync(clusterIn);
 375134            await _db.SaveChangesAsync(CurrentUserId);
 375135        }
 136
 137        /// <summary>
 138        /// Обновляет кластер
 139        /// </summary>
 140        /// <param name="clusterIn">кластер</param>
 141        /// <returns></returns>
 142        public async Task UpdateCluster(Cluster clusterIn)
 375143        {
 375144            if (!(await ClusterExists(clusterIn.Id)))
 0145            {
 0146                throw new ArgumentException($"Кластер с названием {clusterIn.Name} не найден");
 147            }
 375148            _db.Clusters.Update(clusterIn);
 375149            await _db.SaveChangesAsync(CurrentUserId);
 375150        }
 151
 152        /// <summary>
 153        /// удаляет кластер по id
 154        /// </summary>
 155        /// <param name="id">id кластера</param>
 156        /// <returns></returns>
 157        public async Task DeleteCluster(long id)
 158        {
 159            Cluster rec = await _db.Clusters.FindAsync(id);
 160            if (rec == null)
 161                throw new KeyNotFoundException($"Кластер с id={id} не найден");
 2162            rec.Departments.RemoveAll(x => x.Cluster != null);
 163            rec.IsDeleted = true;
 164            await _db.SaveChangesAsync(CurrentUserId);
 165        }
 166
 167        /// <summary>
 168        /// Проверяет существование кластера по id
 169        /// </summary>
 170        /// <param name="clusterId">id кластера</param>
 171        /// <returns>значение true/false</returns>
 376172        public async Task<bool> ClusterExists(long clusterId) => await _db.Clusters.AsNoTracking().Where(e => e.Id == cl
 173
 174        /// <summary>
 175        /// получает выборку кластеров по имени кластера
 176        /// </summary>
 177        /// <param name="name">имя кластера</param>
 178        /// <returns>Выборка кластеров</returns>
 1179        public IQueryable<Cluster> GetClustersByName(string name) => PrepeareClusters()
 1180            .AsNoTracking()
 1181            .Where(e => !e.IsDeleted && e.Name.ToUpper().Equals(name.NormalizeName().ToUpper()));
 182
 183        /// <summary>
 184        /// получает кластера, принадлежащие к переданному складу
 185        /// </summary>
 186        /// <param name="departmnetId">id склада</param>
 187        /// <returns></returns>
 375188        public async Task<List<Cluster>> GetClustersByWarehouse(long departmnetId) => await PrepeareClusters()
 375189           // .AsNoTracking()
 375190            .Where(e => !e.IsDeleted && e.Warehouse.Id == departmnetId)
 375191            .ToListAsync();
 192    }
 193
 194}