< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.GoodSettingService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/GoodSettingService.cs
Covered lines:0
Uncovered lines:112
Coverable lines:112
Total lines:232
Line coverage:0% (0 of 112)
Covered branches:0
Total branches:64
Branch coverage:0% (0 of 64)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
PrepareGoodSettings()0%100%
Create()0%0%
Delete()0%0%
GetDepartmentGoodSetting()0%100%
GetDepartmentGoodSettings()0%100%
GetDepartmentGoodSetting()0%100%
GetDepartmentsGoodSettings()0%100%
GetDepartmentsGoodSettings()0%0%
DepartmentGoodSettingExists()0%100%
DepartmentGoodSettingExists()0%100%
Update()0%0%
Update()0%0%
Sort(...)0%0%

File(s)

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

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Microsoft.Extensions.Logging;
 3using System.Collections.Generic;
 4using System.Linq;
 5using System.Threading.Tasks;
 6using Clave.Expressionify;
 7using WinSolutions.Sveta.Common;
 8using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 9using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 10using WinSolutions.Sveta.Server.Domain;
 11using WinSolutions.Sveta.Server.Services.Interfaces;
 12using WinSolutions.Sveta.Server.Data.DataModel.Extensions;
 13using System;
 14
 15namespace WinSolutions.Sveta.Server.Services.Implements
 16{
 17    public class GoodSettingService : SvetaServiceBase, IGoodSettingService
 18    {
 19        private readonly SvetaDbContext _db;
 20        private readonly ILogger<GoodSettingService> _logger;
 21        private readonly IAuthenticationService _authenticationService;
 22
 23        public GoodSettingService(SvetaDbContext db, ILogger<GoodSettingService> logger, IAuthenticationService authenti
 024            : base(authenticationService)
 025        {
 026            _authenticationService = authenticationService;
 027            _db = db;
 028            _logger = logger;
 029        }
 30
 31        /// <summary>
 32        /// прдеварительная выборка
 33        /// </summary>
 34        /// <returns></returns>
 035        private IQueryable<DepartmentGoodSetting> PrepareGoodSettings() => _db.DepartmentGoodSetting
 036            .Include(d => d.Good).ThenInclude(d => d.GoodBarcodes).ThenInclude(b => b.BarCode)
 037             .Include(d => d.Good).ThenInclude(d => d.DefaultBarCode)
 038             .Include(d => d.Good).ThenInclude(Good => Good.Category)
 039             .Include(d => d.Good).ThenInclude(Good => Good.Photos)
 040             .Include(d => d.Department).ThenInclude(Department => Department.Contragent)
 041             .Include(d => d.RecState)
 042             .Include(d => d.GoodSettingsLabels).ThenInclude(GoodSettingsLabels => GoodSettingsLabels.GoodLabel)
 043             .Expressionify()
 044             .Where(x => !x.IsDeleted && !x.Good.IsDeleted && !x.Department.IsDeleted && !x.Department.Contragent.IsDele
 045             .AsQueryable();
 46
 47        /// <summary>
 48        /// создает запись
 49        /// </summary>
 50        /// <param name="data"> объект DepartmentGoodSetting </param>
 51        /// <returns></returns>
 52        public async Task<DepartmentGoodSetting> Create(DepartmentGoodSetting data)
 053        {
 054            var existing = await _db.DepartmentGoodSetting.FirstOrDefaultAsync(x => x.GoodId == data.Good.Id && x.Depart
 055            if(existing != null)
 056            {
 057                if (PrepareGoodSettings().Any(x => x.GetActualVendorCode().ToLower() == data.VendorCode.ToLower() && x.I
 058                    throw new ArgumentException($"Уже существует запись с кодом поставщика {data.VendorCode}");
 059                existing.MinQuantity = data.MinQuantity;
 060                existing.PickingQuantum = data.PickingQuantum;
 061                existing.VendorCode = data.VendorCode;
 062                existing.ShowcaseVisible = data.ShowcaseVisible;
 063                existing.IsDeleted = false;
 064            }
 65            else
 066            {
 067                _db.Entry(data.Good).State = EntityState.Unchanged;
 068                _db.Entry(data.Department).State = EntityState.Unchanged;
 069                await _db.DepartmentGoodSetting.AddAsync(data);
 070                existing = data;
 071            }
 072            await _db.SaveChangesAsync(CurrentUserId);
 73
 074            return existing;
 075        }
 76
 77        /// <summary>
 78        /// удаляет запись
 79        /// </summary>
 80        /// <param name="id">id записи</param>
 81        /// <returns></returns>
 82        public async Task Delete(long id)
 083        {
 084            var data = await _db.DepartmentGoodSetting.Where(e => !e.IsDeleted).FirstAsync(g => g.Id == id);
 085            if (data == null)
 086            {
 087                throw new KeyNotFoundException($"Настройки товара с id={id} не найдены");
 88            }
 089            data.IsDeleted = true;
 090            await _db.SaveChangesAsync(CurrentUserId);
 091        }
 92
 93        /// <summary>
 94        /// Получает запись
 95        /// </summary>
 96        /// <param name="id">id записи</param>
 97        /// <returns></returns>
 098        public async Task<DepartmentGoodSetting> GetDepartmentGoodSetting(long id) => await PrepareGoodSettings()
 099            .Where(x => x.Id == id)
 0100            .FirstOrDefaultAsync();
 101
 102        /// <summary>
 103        /// получате список записей
 104        /// </summary>
 105        /// <param name="departmentId">id склада. 0 - если все записи выводить</param>
 106        /// <returns></returns>
 0107        public async Task<List<DepartmentGoodSetting>> GetDepartmentGoodSettings(long departmentId) => await PrepareGood
 0108            .Where(x => departmentId == 0 || x.Department.Id == departmentId)
 0109            .ToListAsync();
 110
 111        /// <summary>
 112        /// получает запись
 113        /// </summary>
 114        /// <param name="departmentId">id склада</param>
 115        /// <param name="GoodId">id товара</param>
 116        /// <returns></returns>
 0117        public async Task<DepartmentGoodSetting> GetDepartmentGoodSetting(long departmentId, long GoodId) => await _db.D
 0118            .Include(d => d.Department)
 0119            .Include(d => d.Good)
 0120            .Where(x => x.Department.Id == departmentId)
 0121            .Where(c => c.Good.Id == GoodId)
 0122            .Where(e => !e.IsDeleted)
 0123            .Where(e => !e.Department.IsDeleted)
 0124            .Where(e => !e.Good.IsDeleted)
 0125            .FirstOrDefaultAsync();
 126
 127        /// <summary>
 128        /// получает список записей
 129        /// </summary>
 130        /// <param name="ids">список id записей</param>
 131        /// <returns></returns>
 0132        public async Task<List<DepartmentGoodSetting>> GetDepartmentsGoodSettings(List<long> ids) => await PrepareGoodSe
 133
 134        /// <summary>
 135        ///получает список записей с пагинацией, сортировкой и фильтрацией
 136        /// </summary>
 137        /// <param name="page">номер страницы</param>
 138        /// <param name="limit">Размер страницы</param>
 139        /// <param name="labelId">id ярылка</param>
 140        /// <param name="categoryId">id категории</param>
 141        /// <param name="departmentId">id склада</param>
 142        /// <param name="filter">фильтр по названию товара или вендоркоду</param>
 143        /// <param name="sort">сортировка</param>
 144        /// <returns></returns>
 145        public async Task<PaginatedData<List<DepartmentGoodSetting>>> GetDepartmentsGoodSettings(int page, int limit, lo
 0146        {
 0147            var settings = PrepareGoodSettings().AsNoTracking();
 148            // Тотал записей для смертных считаем после прмиенения ограничения роли
 0149            int total = await settings?.CountAsync(x => _authenticationService.IsUserPlatform() || x.Department.Id == de
 0150            settings = settings.Where(x => departmentId == 0 || x.Department.Id == departmentId)
 0151                .Where(x => categoryId == 0 || x.Good.Category.Id == categoryId)
 0152                .Where(x => labelId == 0 || x.GoodSettingsLabels.Any(p => p.GoodLabelId == labelId))
 0153                .Where(x => string.IsNullOrWhiteSpace(filter) || x.Good.Name.ToUpper().Contains(filter.ToUpper()) || x.G
 0154            settings = Sort(settings, sort?.ToLower());
 0155            int filtered = await settings?.CountAsync();
 0156            return new PaginatedData<List<DepartmentGoodSetting>>
 0157            {
 0158                Result = await settings.Skip(page * limit).Take(limit).ToListAsync(),
 0159                TotalCount = total,
 0160                TotalFilteredCount = filtered
 0161            };
 0162        }
 163
 164        /// <summary>
 165        /// проверяет существование записи
 166        /// </summary>
 167        /// <param name="id">id записи</param>
 168        /// <returns></returns>
 0169        public async Task<bool> DepartmentGoodSettingExists(long id) => await _db.DepartmentGoodSetting
 0170            .Where(e => e.Id == id)
 0171            .AnyAsync();
 172
 173        /// <summary>
 174        /// Проверяет наличие сеттинга с таким же кодом поставщика и другим id
 175        /// </summary>
 176        /// <param name="data">сеттинг</param>
 177        /// <param name="vendorCode">вендоркод</param>
 178        /// <returns></returns>
 0179        private async Task<bool> DepartmentGoodSettingExists(DepartmentGoodSetting data) => await PrepareGoodSettings()
 0180            .AnyAsync(x => !string.IsNullOrWhiteSpace(data.VendorCode) && x.GetActualVendorCode().ToLower() == data.Vend
 181
 182        /// <summary>
 183        /// обновляет запись
 184        /// </summary>
 185        /// <param name="data">объект DepartmentGoodSetting</param>
 186        /// <returns></returns>
 187        public async Task Update(DepartmentGoodSetting data)
 0188        {
 0189            if (await DepartmentGoodSettingExists(data))
 0190                throw new ArgumentException($"Уже существует запись с кодом поставщика {data.VendorCode}");
 0191            _db.DepartmentGoodSetting.Update(data);
 0192            await _db.SaveChangesAsync(CurrentUserId);
 0193        }
 194
 195        /// <summary>
 196        /// обнолвляет список записей
 197        /// </summary>
 198        /// <param name="data">список объектов DepartmentGoodSetting</param>
 199        /// <returns></returns>
 200        public async Task Update(List<DepartmentGoodSetting> data)
 0201        {
 0202            if (data?.Count == 0)
 0203                return;
 0204            var settings = PrepareGoodSettings();
 0205            foreach (var setting in data)
 0206            {
 0207                if (settings.Any(x => !string.IsNullOrWhiteSpace(setting.VendorCode) && x.GetActualVendorCode().ToLower(
 0208                    throw new ArgumentException($"Уже существует запись с кодом поставщика {setting.VendorCode}");
 0209            }
 0210            _db.DepartmentGoodSetting.UpdateRange(data);
 0211            await _db.SaveChangesAsync(CurrentUserId);
 0212        }
 213
 214        /// <summary>
 215        /// сортировка
 216        /// </summary>
 217        /// <param name="items">выборка записей для сортировки</param>
 218        /// <param name="sort">тип сортировки</param>
 219        /// <returns></returns>
 0220        private IQueryable<DepartmentGoodSetting> Sort(IQueryable<DepartmentGoodSetting> items, string sort = default) =
 0221        {
 0222            "pickQuant" => items.OrderBy(d => d.PickingQuantum),
 0223            "pickQuant|desc" => items.OrderByDescending(d => d.PickingQuantum),
 0224            "minQuant" => items.OrderBy(d => d.MinQuantity),
 0225            "minQuant|desc" => items.OrderByDescending(d => d.MinQuantity),
 0226            "vencode" => items.OrderBy(d => d.GetActualVendorCode()),
 0227            "vencode|desc" => items.OrderByDescending(d => d.GetActualVendorCode()),
 0228            "name|desc" => items.OrderByDescending(d => d.Good.Name),
 0229            _ => items.OrderBy(d => d.Good.Name),
 0230        };
 231    }
 232}