< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.SupplyContractService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/SupplyContractService.cs
Covered lines:38
Uncovered lines:55
Coverable lines:93
Total lines:220
Line coverage:40.8% (38 of 93)
Covered branches:6
Total branches:22
Branch coverage:27.2% (6 of 22)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetSupplyContracts()0%0%
GetSupplyContracts()100%100%
GetSupplyContractsByContragent()0%100%
GetSupplyContract()100%100%
PrepeareContracts()100%100%
Create()100%50%
Delete()0%0%
GetSupplyContract()0%100%
GetSupplyContract()0%100%
SupplyContractExists()100%100%
Update()71.42%50%
ValidateContractDate()0%100%
GetActiveContracts()0%100%

File(s)

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

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Microsoft.Extensions.Logging;
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6using System.Threading.Tasks;
 7using Microsoft.Extensions.Configuration;
 8using WinSolutions.Sveta.Server.Domain;
 9using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 10using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 11using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 12using WinSolutions.Sveta.Server.Services.Interfaces;
 13using WinSolutions.Sveta.Common;
 14
 15namespace WinSolutions.Sveta.Server.Services.Implements
 16{
 17    public class SupplyContractService : SvetaServiceBase, ISupplyContractService
 18    {
 19        private readonly SvetaDbContext _db;
 20        private readonly ILogger<SupplyContractService> _logger;
 21        private readonly IAuthenticationService _authenticationService;
 22
 23        public SupplyContractService(SvetaDbContext db, ILogger<SupplyContractService> logger, IAuthenticationService au
 18624            : base(authenticationService)
 18625        {
 18626            _db = db;
 18627            _authenticationService = authenticationService;
 18628            _logger = logger;
 18629        }
 30
 31        /// <summary>
 32        /// Возвращает договора по фильтру и сортировке
 33        /// </summary>
 34        /// <param name="page">пагинация: номер страницы</param>
 35        /// <param name="limit">пагинация: размер страницы</param>
 36        /// <param name="filter">фильтр по значимым полям</param>
 37        /// <param name="sortByNameDesc">сортировать по имени DESC</param>
 38        /// <param name="activeOnly">возвращать только активные договора, иначе активные + неактивные</param>
 39        /// <param name="contragentId">возвращать договора по определенному контрагенту. 0 - возвращать все</param>
 40        public async Task<PaginatedData<List<SupplyContract>>> GetSupplyContracts(int page, int limit, string filter, bo
 041        {
 042            var contracts = PrepeareContracts().AsNoTracking();
 43            //Тотал записей для смертных считаем после прмиенения ограничения роли
 044            int total = await contracts?.CountAsync(x => _authenticationService.IsUserPlatform() || x.Seller.Id == _auth
 045            contracts = contracts.Where(x => _authenticationService.IsUserPlatform() || x.Seller.Id == _authenticationSe
 046                .Where(x => contragentId == 0 || x.Seller.Id == contragentId || x.Buyer.Id == contragentId)
 047                .Where(x => !activeOnly || x.RecState.Id == (int)RecordState.Active && x.EndDate > DateTime.UtcNow)
 048                .Where(x => string.IsNullOrWhiteSpace(filter) || x.DocumentNumber.ToUpper().Contains(filter.ToUpper())
 049                || x.Seller.ShortName.ToUpper().Contains(filter.ToUpper())
 050                || x.Buyer.ShortName.ToUpper().Contains(filter.ToUpper()));
 051            contracts = !sortByNameDesc ? contracts.OrderBy(x => x.DocumentNumber) : contracts.OrderByDescending(x => x.
 052            int filtered = await contracts?.CountAsync();
 053            return new PaginatedData<List<SupplyContract>>
 054            {
 055                Result = await contracts.Skip(page * limit).Take(limit).ToListAsync(),
 056                TotalCount = total,
 057                TotalFilteredCount = filtered
 058            };
 059        }
 60
 61        /// <summary>
 62        /// Получить список записей
 63        /// </summary>
 64        /// <param name="buyerId">id контрагента покупателя</param>
 65        /// <param name="activeOnly">true, если только активные</param>
 66        /// <returns></returns>
 67        public async Task<List<SupplyContract>> GetSupplyContracts(long buyerId, bool activeOnly) =>
 44868            await PrepeareContracts()
 44869                .Where(d => !d.IsDeleted)
 44870                .Where(d => !activeOnly || d.RecState.Id == (int) RecordState.Active)
 44871                .Where(d => d.Buyer.Id == buyerId)
 44872                .ToListAsync();
 73
 74        /// <summary>
 75        /// выводит контракты с партнерами переданного КА
 76        /// </summary>
 77        /// <param name="contragentId">id котрагента</param>
 78        /// <param name="active">активный или неактивный договор</param>
 79        /// <param name="filter">Поиск по короткому имени контрагента</param>
 80        /// <returns></returns>
 081        public async Task<List<SupplyContract>> GetSupplyContractsByContragent(long contragentId, bool active, string fi
 082            .Where(x => x.Seller.Id == contragentId || x.Buyer.Id == contragentId)
 083            .Where(x => string.IsNullOrWhiteSpace(filter) || x.Seller.ShortName.ToUpper().Contains(filter.ToUpper()) || 
 084            .Where(x => !active || x.RecState.Id == (int)RecordState.Active)
 085            .ToListAsync();
 86
 87        /// <summary>
 88        /// Получить запись
 89        /// </summary>
 90        /// <param name="buyerId">id контрагента покупателя</param>
 91        /// <param name="sellerId">id контрагента продавца</param>
 92        /// <param name="activeOnly">true, если только активные</param>
 93        /// <returns></returns>
 21994        public async Task<SupplyContract> GetSupplyContract(long buyerId, long sellerId, bool activeOnly) => await Prepe
 21995            .Where(d => !activeOnly || d.RecState.Id == (int)RecordState.Active)
 21996            .FirstOrDefaultAsync(d => d.Buyer.Id == buyerId && d.Seller.Id == sellerId);
 97
 98        /// <summary>
 99        /// предварительная выборка записей
 100        /// </summary>
 101        /// <returns></returns>
 667102        private IQueryable<SupplyContract> PrepeareContracts() => _db.SupplyContract
 667103            .Include(e => e.Seller)
 667104            .Include(e => e.RecState)
 667105            .Include(e => e.Buyer)
 667106            .Where(e => !e.IsDeleted)
 667107            .AsQueryable();
 108
 109        /// <summary>
 110        /// создает запись
 111        /// </summary>
 112        /// <param name="data">объект SupplyContract</param>
 113        /// <returns></returns>
 114        public async Task Create(SupplyContract data)
 557115        {
 557116            _db.Entry(data.Seller).State = data.Seller.Id == 0 ? EntityState.Detached : EntityState.Unchanged;
 557117            _db.Entry(data.Buyer).State = data.Buyer.Id == 0 ? EntityState.Detached : EntityState.Unchanged;
 557118            _db.Entry(data.RecState).State = data.RecState.Id == 0 ? EntityState.Detached : EntityState.Unchanged;
 557119            await _db.SupplyContract.AddAsync(data);
 557120            await _db.SaveChangesAsync(CurrentUserId);
 557121            data.DocumentNumber = "CO" + DateTime.Now.ToString("yy") + "-" + data.Id;
 557122            await Update(data);
 557123        }
 124
 125        /// <summary>
 126        /// удаляет запись
 127        /// </summary>
 128        /// <param name="id">id записи</param>
 129        /// <returns></returns>
 130        public async Task Delete(long id)
 0131        {
 0132            var data = await _db.SupplyContract
 0133                .Where(d => !d.IsDeleted)
 0134                .FirstOrDefaultAsync(s=>s.Id == id);
 0135            if (data == null)
 0136            {
 0137                throw new KeyNotFoundException($"Контракт с id={id} не найден");
 138            }
 0139            data.IsDeleted = true;
 0140            await _db.SaveChangesAsync(CurrentUserId);
 0141        }
 142
 143        /// <summary>
 144        /// получить запись
 145        /// </summary>
 146        /// <param name="id">id записи</param>
 147        /// <returns></returns>
 0148        public async Task<SupplyContract> GetSupplyContract(long id) => await PrepeareContracts().Where(x => x.Id == id)
 149
 150        /// <summary>
 151        /// получить запись
 152        /// </summary>
 153        /// <param name="id">id записи</param>
 154        /// <param name="contragentId">id контрагента продавца</param>
 155        /// <returns></returns>
 0156        public async Task<SupplyContract> GetSupplyContract(long id, long contragentId) => await PrepeareContracts().Whe
 157
 158        /// <summary>
 159        /// проверяет существование записи
 160        /// </summary>
 161        /// <param name="id">id записи</param>
 162        /// <returns></returns>
 557163        public async Task<bool> SupplyContractExists(long id) => await _db.SupplyContract
 557164            .Where(e => e.Id == id)
 557165            .Where(d => !d.IsDeleted)
 557166            .AnyAsync();
 167
 168        /// <summary>
 169        /// обновляет запись
 170        /// </summary>
 171        /// <param name="data">объект SupplyContract</param>
 172        /// <returns></returns>
 173        public async Task Update(SupplyContract data)
 557174        {
 557175            if (!(await SupplyContractExists(data.Id)))
 0176            {
 0177                throw new ArgumentException($"Контракт с id={data.Id} не найден");
 178            }
 557179            _db.SupplyContract.Update(data);
 557180            await _db.SaveChangesAsync(CurrentUserId);
 557181        }
 182
 183        /// <summary>
 184        /// Проверяет дату на валидность. Если существует активный договор с указанными контрагентами и переданная дата 
 185        /// </summary>
 186        /// <remarks>author i.rebenok</remarks>
 187        /// <param name="buyerId">id контрагента Покупателя</param>
 188        /// <param name="sellerId">id контрагента Продавца</param>
 189        /// <param name="checkDate">Дата, которую надо проверить</param>
 190        public async Task<bool> ValidateContractDate(long buyerId, long sellerId, DateTime checkdate)
 0191        {
 0192            return await _db.SupplyContract
 0193            .Include(e => e.Seller)
 0194            .Include(e => e.Buyer)
 0195            .Include(e => e.RecState)
 0196            .AsNoTracking()
 0197            .AnyAsync(e => !e.IsDeleted && e.RecState.Id == (long)RecordState.Active && e.Buyer.Id == buyerId && e.Selle
 0198        }
 199
 200        /// <summary>
 201        /// получает список активных контрактов с указанными покупателем и продавцом и дата начала и окончания действия 
 202        /// </summary>
 203        /// <param name="buyerId">id контрагента Покупателя</param>
 204        /// <param name="sellerId">id контрагента Продавца</param>
 205        /// <param name="beginDate">дата с</param>
 206        /// <param name="endDate">дата по</param>
 207        /// <returns></returns>
 208        public async Task<List<SupplyContract>> GetActiveContracts(long buyerId, long sellerId, DateTime beginDate, Date
 0209        {
 0210            return await _db.SupplyContract
 0211            .Include(e => e.Seller)
 0212            .Include(e => e.Buyer)
 0213            .Include(e => e.RecState)
 0214            .AsNoTracking()
 0215            .Where(e => !e.IsDeleted && e.RecState.Id == (long)RecordState.Active && e.Buyer.Id == buyerId && e.Seller.I
 0216            ((beginDate >= e.BeginDate && beginDate <= e.EndDate) || (endDate >= e.BeginDate && endDate <= e.EndDate)))
 0217            .ToListAsync();
 0218        }
 219    }
 220}