< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.AnonymousMovementService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/AnonymousMovementService.cs
Covered lines:134
Uncovered lines:1
Coverable lines:135
Total lines:257
Line coverage:99.2% (134 of 135)
Covered branches:26
Total branches:42
Branch coverage:61.9% (26 of 42)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetAnonymMovements()100%68.75%
ExistsAnonymMovements()0%0%
GetAnonymMovement()100%100%
GetAnonymMovementForItems()100%100%
GetAnonymMovement()100%100%
CreateAnonymMovement()100%50%
UpdateAnonymMovement()100%100%
DeleteAnonymMovement()100%50%
DeleteAnonymMovements()100%100%
ClearMovement()100%50%
ClearMovement()100%50%
PrepareQuery(...)100%100%
GetSortType(...)100%66.66%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Linq.Expressions;
 5using System.Threading.Tasks;
 6using Microsoft.EntityFrameworkCore;
 7using Microsoft.EntityFrameworkCore.Internal;
 8using Microsoft.Extensions.Logging;
 9using Microsoft.VisualBasic;
 10using WinSolutions.Sveta.Common;
 11using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 12using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 13using WinSolutions.Sveta.Server.Domain;
 14using WinSolutions.Sveta.Server.Services.Interfaces;
 15
 16namespace WinSolutions.Sveta.Server.Services.Implements
 17{
 18    public class AnonymousMovementService: SvetaServiceBase, IAnonymousMovementService
 19    {
 20        private readonly SvetaDbContext _db;
 21        private readonly ILogger<AnonymousMovementService> _logger;
 22
 23        public AnonymousMovementService(SvetaDbContext db,
 24            ILogger<AnonymousMovementService> logger,
 25            IAuthenticationService authService
 12826            ): base (authService)
 12827        {
 12828            _db = db;
 12829            _logger = logger;
 12830        }
 31
 32        /// <summary>
 33        ///
 34        /// </summary>
 35        /// <param name="userId">Идентификатор анонимного пользователя - по умолчанию 0 - для всех</param>
 36        /// <param name="receiverId">идентификатор магазина - по умолчанияю 0 - для всех</param>
 37        /// <param name="supplierId">идентификатор поставщика по умолчанию 0 - для всех</param>
 38        /// <param name="senderId">идентификатор склада по умолчанию 0 - для всех</param>
 39        /// <param name="fromDate">Дата начала отбора</param>
 40        /// <param name="toDate">Дата окончания отбора</param>
 41        /// <param name="sort">сортировка по умолчанию по id - id|desc,created_on,created_on|desc,supplier,supplier|desc
 42        /// <param name="page">Страница отбора - 0 по умолчанию</param>
 43        /// <param name="limit">Количество для отбора - 10 по умолчанию</param>
 44        /// <returns></returns>
 45        public async Task<PaginatedData<List<AnonymousMovement>>> GetAnonymMovements(Guid userId = default, long receive
 46            long supplierId = 0, long senderId = 0, DateTime fromDate = default, DateTime toDate = default,
 47            string sort = default, int page = 0, int limit = 10)
 748        {
 749            var list = PrepareQuery();
 750            var total = userId == default ? await list.CountAsync() : await PrepareQuery(userId).CountAsync();
 751            if (total == 0)
 252                return new PaginatedData<List<AnonymousMovement>> {Result = new List<AnonymousMovement>()};
 553            var filtered = PrepareQuery(userId, receiverId, supplierId, senderId, fromDate, toDate);
 554            var totalFiltered = await filtered.CountAsync();
 55
 556            var sortExpression = GetSortType(sort);
 557            return new PaginatedData<List<AnonymousMovement>>
 558            {
 559                Result = (sort?.Split("|").ElementAtOrDefault(1) ?? "").ToLower() switch
 560                {
 561                    "desc" => await filtered.OrderByDescending(sortExpression).Skip((page < 2 ? 0 : page - 1) * limit)
 562                        .Take(limit).ToListAsync(),
 563                    _ => await filtered.OrderBy(sortExpression).Skip((page < 2 ? 0 : page - 1) * limit).Take(limit)
 564                        .ToListAsync()
 565                },
 566                TotalCount = total,
 567                TotalFilteredCount = totalFiltered
 568            };
 769        }
 70
 71        /// <summary>
 72        /// Проверяет наличие заявок по идентификатору пользователя
 73        /// </summary>
 74        /// <param name="userId">идентификатор анонимного пользователя</param>
 75        /// <returns></returns>
 076        public async Task<bool> ExistsAnonymMovements(Guid userId) => await PrepareQuery(userId)?.AnyAsync();
 77
 78        /// <summary>
 79        /// Возвращает запись по идентификатору
 80        /// </summary>
 81        /// <param name="id">Идентификатор записи</param>
 82        /// <returns></returns>
 83        public async Task<AnonymousMovement> GetAnonymMovement(long id) =>
 1284            await PrepareQuery().FirstOrDefaultAsync(d => d.Id == id);
 85
 86        /// <summary>
 87        /// Возвращает анонимную заявку для работы с заказанными товарами
 88        /// </summary>
 89        /// <param name="id">Идентификатор заявки</param>
 90        /// <returns></returns>
 1291        public async Task<AnonymousMovement> GetAnonymMovementForItems(long id) => await _db.AnonymousMovements
 1292            .Include(d => d.Items)
 1293            .ThenInclude(Item => Item.Good)
 1294            .ThenInclude(Good => Good.DepartmentGoodSettings)
 1295            .ThenInclude(DepartmentGoodSetting => DepartmentGoodSetting.Department)
 1296            .Include(d => d.Items)
 1297            .ThenInclude(Items => Items.Good)
 1298            .ThenInclude(x => x.Prices)
 1299            .ThenInclude(x => x.PriceTrend)
 12100            .ThenInclude(x => x.SupplierDepartment)
 12101            .Include(d => d.Items)
 12102            .ThenInclude(Items => Items.Good)
 12103            .ThenInclude(good => good.Category)
 12104            .ThenInclude(category => category.DepartmentCategoryRatios)
 12105            .Include(d => d.Items)
 12106            .ThenInclude(Item => Item.Good)
 12107            .ThenInclude(Good => Good.Photos)
 12108            .Include(d => d.Customer)
 12109            .ThenInclude(customer => customer.ContractsAsBuyer)
 12110            .ThenInclude(contract => contract.Seller)
 12111            .Include(d => d.Supplier)
 12112            .Include(d => d.Receiver)
 12113            .ThenInclude(receiver => receiver.Cluster)
 12114            .Include(d => d.RecState)
 12115            .Include(d => d.Sender)
 12116            .Include(d => d.Notes)
 12117            .Where(e => !e.IsDeleted)
 12118            .FirstOrDefaultAsync(d => d.Id == id);
 119
 120
 121        /// <summary>
 122        /// Возвращает документ по guid юзера и магазину
 123        /// </summary>
 124        /// <param name="userId">Guid анонимного пользователя</param>
 125        /// <param name="receiverId">Идентификатор магазина</param>
 126        /// <returns></returns>
 127        public async Task<AnonymousMovement> GetAnonymMovement(Guid userId, long receiverId) =>
 14128            await PrepareQuery(userId, receiverId).FirstOrDefaultAsync();
 129
 130        /// <summary>
 131        /// Создает анонимную заявку
 132        /// </summary>
 133        /// <param name="movement">Объект анонимной заявки</param>
 134        /// <returns></returns>
 135        public async Task CreateAnonymMovement(AnonymousMovement movement)
 34136        {
 34137            await _db.AnonymousMovements.AddAsync(movement);
 34138            await _db.SaveChangesAsync(CurrentUserId);
 34139            movement.DocumentNumber = "AR" + movement.Id.ToString("D8");
 34140            await _db.SaveChangesAsync(CurrentUserId);
 34141        }
 142
 143        /// <summary>
 144        /// Обновление записи
 145        /// </summary>
 146        /// <param name="movement">Сущность для обновления</param>
 147        /// <returns></returns>
 148        public async Task UpdateAnonymMovement(AnonymousMovement movement)
 16149        {
 16150            var inDb = _db.AnonymousMovements
 16151                .Include(d => d.Items)
 16152                .FirstOrDefault(d => d.Id == movement.Id);
 16153            inDb.Items = movement.Items;
 16154            inDb.PrepaimentSum = movement.PrepaimentSum;
 16155            _db.Update(inDb);
 16156            await _db.SaveChangesAsync(CurrentUserId);
 16157        }
 158
 159        /// <summary>
 160        /// Удаление записи
 161        /// </summary>
 162        /// <param name="id">Идентификатор записи для удаления</param>
 163        /// <returns></returns>
 164        public async Task DeleteAnonymMovement(long id)
 1165        {
 1166            var movement = await _db.AnonymousMovements.FindAsync(id);
 1167            movement.IsDeleted = true;
 1168            await _db.SaveChangesAsync(CurrentUserId);
 1169        }
 170
 171        /// <summary>
 172        /// Удаление списка анонимных заявок
 173        /// </summary>
 174        /// <param name="movements">Массив заявок</param>
 175        /// <returns></returns>
 176        public async Task DeleteAnonymMovements(IEnumerable<AnonymousMovement> movements)
 1177        {
 23178            foreach (var item in movements)
 10179            {
 10180                item.IsDeleted = true;
 10181            }
 1182            await _db.SaveChangesAsync(CurrentUserId);
 1183        }
 184
 185        /// <summary>
 186        /// Очищает заявку
 187        /// </summary>
 188        /// <param name="id">идентификатор документа</param>
 189        /// <returns></returns>
 190        public async Task ClearMovement(long id)
 1191        {
 1192            var movement = await PrepareQuery().FirstOrDefaultAsync(d => d.Id == id);
 1193            movement.Items = new List<MovementItem>();
 1194            await _db.SaveChangesAsync(CurrentUserId);
 1195        }
 196
 197        /// <summary>
 198        /// Очищает заявку
 199        /// </summary>
 200        /// <param name="userId">Идентификатор анонимного пользователя</param>
 201        /// <param name="receiverId">Идентификатор магазина</param>
 202        /// <returns></returns>
 203        public async Task ClearMovement(Guid userId, long receiverId)
 1204        {
 1205            var movement = await PrepareQuery(userId, receiverId).FirstOrDefaultAsync();
 1206            movement.Items = new List<MovementItem>();
 1207            await _db.SaveChangesAsync(CurrentUserId);
 1208        }
 209
 210
 211        private IQueryable<AnonymousMovement> PrepareQuery(Guid userId = default, long receiverId = 0,
 212            long supplierId = 0, long senderId = 0, DateTime fromDate = default, DateTime toDate = default) =>
 43213            _db.AnonymousMovements
 43214                .Include(d => d.Receiver)
 43215                .Include(d => d.Receiver)
 43216                .ThenInclude(r => r.Cluster)
 43217                .Include(d => d.Supplier)
 43218                .Include(d => d.Sender)
 43219                .Include(d => d.Customer)
 43220                .Include(d => d.Customer)
 43221                .ThenInclude(d => d.ContractsAsBuyer).ThenInclude(ContractsAsBuyer => ContractsAsBuyer.Seller)
 43222                .Include(d => d.Items)
 43223                .ThenInclude(Item => Item.Good)
 43224                .ThenInclude(Good => Good.DepartmentGoodSettings)
 43225                .ThenInclude(DepartmentGoodSetting => DepartmentGoodSetting.Department)
 43226                .Include(d => d.Items)
 43227                .ThenInclude(Items => Items.Good)
 43228                .ThenInclude(x => x.Prices)
 43229                .ThenInclude(x => x.PriceTrend)
 43230                .ThenInclude(x => x.SupplierDepartment)
 43231                .Include(d => d.Items)
 43232                .ThenInclude(Items => Items.Good)
 43233                .ThenInclude(good => good.Category)
 43234                .ThenInclude(category => category.DepartmentCategoryRatios)
 43235                .Include(d => d.Items)
 43236                .ThenInclude(Item => Item.Good)
 43237                .ThenInclude(Good => Good.Photos)
 43238                .Include(d => d.RecState)
 43239                .Where(d => !d.IsDeleted)
 43240                .Where(d => userId == default || d.AnonymousKey.Equals(userId))
 43241                .Where(d => receiverId == 0 || d.Receiver.Id == receiverId)
 43242                .Where(d => supplierId == 0 || d.Supplier.Id == supplierId)
 43243                .Where(d => senderId == 0 || d.Sender.Id == senderId)
 43244                .Where(d => fromDate == default || d.CreationDateTime >= fromDate)
 43245                .Where(d => toDate == default || d.CreationDateTime <= toDate)
 43246                .AsQueryable();
 247
 248        private Expression<Func<AnonymousMovement, object>> GetSortType(string sort) =>
 5249            (sort?.Split("|").ElementAtOrDefault(0) ?? "").ToLower() switch
 5250            {
 5251                "created_on" => e => e.CreationDateTime,
 5252                "supplier" => e => e.Supplier.Id,
 5253                "sum" => e => e.PrepaimentSum,
 5254                _ => e => e.Id
 5255            };
 256    }
 257}