< Summary

Information
Class: OzonRepositories.Data.TransactionRepository
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/TransactionRepository.cs
Line coverage
40%
Covered lines: 55
Uncovered lines: 82
Coverable lines: 137
Total lines: 211
Line coverage: 40.1%
Branch coverage
40%
Covered branches: 9
Total branches: 22
Branch coverage: 40.9%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Add()100%210%
Delete()100%210%
Get()100%11100%
GetAsync()100%44100%
GetAsync()0%2040%
Update()100%210%
UpdateComment()100%210%
GetTransactionsWithPagination(...)100%210%
GetTotalTransactionCount()100%210%
GetByIdsAsync()0%620%
LoadClientStatusColorsForOrders()41.66%381243.75%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/TransactionRepository.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains.Models;
 3using OzonRepositories.Context;
 4
 5namespace OzonRepositories.Data
 6{
 7    public class TransactionRepository : MainRepository
 8    {
 919        public TransactionRepository(ApplicationDbContext orderContext) : base(orderContext)
 10        {
 9111        }
 12
 13        public async Task Add(Transaction value)
 14        {
 015           await _context.Transactions.AddAsync(value);
 016        }
 17
 18        public async Task<int> Delete(Transaction value)
 19        {
 020            _context.Remove(value);
 021            return await _context.SaveChangesAsync();
 022        }
 23
 24        public IQueryable<Transaction> Get()
 25        {
 2426            return _context.Transactions
 2427                           .AsNoTracking()
 2428                           .AsSplitQuery()
 2429                           .Include(tr => tr.Orders)
 2430                               .ThenInclude(o => o.Сurrency)
 2431                           .Include(tr => tr.Orders)
 2432                               .ThenInclude(o => o.ShipmentWarehouse)
 2433                           .Include(tr => tr.Orders)
 2434                               .ThenInclude(o => o.ProductInfo)
 2435                           .Include(tr => tr.Orders)
 2436                               .ThenInclude(o => o.AppStatus)
 2437                           .Include(tr => tr.Orders)
 2438                               .ThenInclude(o => o.ClientStatus)
 2439                           .Include(tr => tr.Orders)
 2440                               .ThenInclude(o => o.Supplier)
 2441                           .Include(tr => tr.Orders)
 2442                               .ThenInclude(o => o.OzonClient)
 2443                           .Include(tr => tr.Orders)
 2444                               .ThenInclude(o => o.Manufacturer)
 2445                           .Include(tr => tr.Orders)
 2446                               .ThenInclude(o => o.EtProducer);
 47        }
 48
 49        public async Task<Transaction?> GetAsync(int id)
 50        {
 751            var transaction = await _context.Transactions
 752                .Include(tr => tr.Orders)
 753                .ThenInclude(o => o.Сurrency)
 754                .Include(tr => tr.Orders)
 755                .ThenInclude(o => o.ShipmentWarehouse)
 756                .Include(tr => tr.Orders)
 757                .ThenInclude(o => o.ProductInfo)
 758                .Include(tr => tr.Orders)
 759                .ThenInclude(o => o.AppStatus)
 760                .Include(tr => tr.Orders)
 761                .ThenInclude(o => o.ClientStatus)
 762                .Include(tr => tr.Orders)
 763                .ThenInclude(o => o.Supplier)
 764                .Include(tr => tr.Orders)
 765                .ThenInclude(o => o.OzonClient)
 766                .Include(tr => tr.Orders)
 767                .ThenInclude(o => o.Manufacturer)
 768                .Include(tr => tr.Orders)
 769                .ThenInclude(o => o.EtProducer)
 770                .FirstOrDefaultAsync(t => t.Id == id);
 71
 772            if (transaction != null && transaction.Orders != null)
 73            {
 274                await LoadClientStatusColorsForOrders(transaction.Orders.ToList());
 75            }
 76
 777            return transaction!;
 778        }
 79
 80        public async Task<Transaction?> GetAsync(Transaction value)
 81        {
 082            var transaction = await _context.Transactions
 083                .Include(tr => tr.Orders)
 084                .ThenInclude(o => o.Сurrency)
 085                .Include(tr => tr.Orders)
 086                .ThenInclude(o => o.ShipmentWarehouse)
 087                .Include(tr => tr.Orders)
 088                .ThenInclude(o => o.ProductInfo)
 089                .Include(tr => tr.Orders)
 090                .ThenInclude(o => o.AppStatus)
 091                .Include(tr => tr.Orders)
 092                .ThenInclude(o => o.ClientStatus)
 093                .Include(tr => tr.Orders)
 094                .ThenInclude(o => o.Supplier)
 095                .Include(tr => tr.Orders)
 096                .ThenInclude(o => o.OzonClient)
 097                .Include(tr => tr.Orders)
 098                .ThenInclude(o => o.Manufacturer)
 099                .Include(tr => tr.Orders)
 0100                .ThenInclude(o => o.EtProducer)
 0101                .FirstOrDefaultAsync(t => t.Id == value.Id);
 102
 0103            if (transaction != null && transaction.Orders != null)
 104            {
 0105                await LoadClientStatusColorsForOrders(transaction.Orders.ToList());
 106            }
 107
 0108            return transaction!;
 0109        }
 110
 111        public async Task<int> Update(Transaction value)
 112        {
 0113            _context.Update(value);
 0114            return await _context.SaveChangesAsync();
 0115        }
 116
 117        public async Task<int> UpdateComment(int transactionId, string comment)
 118        {
 0119            return await _context.Transactions
 0120                .Where(t => t.Id == transactionId)
 0121                .ExecuteUpdateAsync(s => s.SetProperty(t => t.Comment, comment));
 0122        }
 123
 124        public IQueryable<Transaction> GetTransactionsWithPagination(int skip, int take)
 125        {
 0126            return _context.Transactions
 0127                           .AsNoTracking()
 0128                           .AsSplitQuery()
 0129                           .Include(tr => tr.Orders)
 0130                               .ThenInclude(o => o.Сurrency)
 0131                           .Include(tr => tr.Orders)
 0132                               .ThenInclude(o => o.ShipmentWarehouse)
 0133                           .Include(tr => tr.Orders)
 0134                               .ThenInclude(o => o.ProductInfo)
 0135                           .Include(tr => tr.Orders)
 0136                               .ThenInclude(o => o.AppStatus)
 0137                           .Include(tr => tr.Orders)
 0138                               .ThenInclude(o => o.ClientStatus)
 0139                           .Include(tr => tr.Orders)
 0140                               .ThenInclude(o => o.Supplier)
 0141                           .Include(tr => tr.Orders)
 0142                               .ThenInclude(o => o.OzonClient)
 0143                           .Include(tr => tr.Orders)
 0144                               .ThenInclude(o => o.Manufacturer)
 0145                           .Include(tr => tr.Orders)
 0146                               .ThenInclude(o => o.EtProducer)
 0147                           .OrderByDescending(tr => tr.CreatedDateTime)
 0148                           .Skip(skip)
 0149                           .Take(take);
 150        }
 151
 152        public async Task<int> GetTotalTransactionCount()
 153        {
 0154            return await _context.Transactions.CountAsync();
 0155        }
 156
 157        /// <summary>
 158        /// Возвращает транзакции по списку ID (без загрузки заказов), по убыванию даты создания.
 159        /// </summary>
 160        public async Task<List<Transaction>> GetByIdsAsync(IEnumerable<int> ids)
 161        {
 0162            var idList = ids.Where(id => id > 0).Distinct().ToList();
 0163            if (idList.Count == 0)
 0164                return new List<Transaction>();
 165
 0166            return await _context.Transactions
 0167                .AsNoTracking()
 0168                .Where(t => idList.Contains(t.Id))
 0169                .OrderByDescending(t => t.CreatedDateTime)
 0170                .ToListAsync();
 0171        }
 172
 173        /// <summary>
 174        /// Загружает StatusColor для ClientStatus в заказах транзакций отдельным запросом (оптимизация производительнос
 175        /// </summary>
 176        public async Task LoadClientStatusColorsForOrders(List<Order> orders)
 177        {
 2178            if (orders == null || !orders.Any())
 1179                return;
 180
 181            // Загрузка StatusColor для ClientStatus отдельным запросом
 1182            var clientStatusIds = orders
 1183                .Where(order => order.ClientStatusId.HasValue)
 0184                .Select(order => order.ClientStatusId!.Value)
 1185                .Distinct()
 1186                .ToList();
 187
 1188            if (clientStatusIds.Any())
 189            {
 0190                var clientStatusesWithColors = await _context.ClientStatuses
 0191                    .Include(cs => cs.StatusColor)
 0192                    .Where(cs => clientStatusIds.Contains(cs.Id))
 0193                    .AsNoTracking()
 0194                    .ToListAsync();
 195
 0196                var clientStatusesById = clientStatusesWithColors
 0197                    .ToDictionary(cs => cs.Id, cs => cs);
 198
 0199                foreach (var order in orders)
 200                {
 0201                    if (order.ClientStatusId.HasValue && clientStatusesById.TryGetValue(order.ClientStatusId.Value, out 
 202                    {
 203                        // Заменяем ClientStatus полностью, чтобы гарантировать наличие StatusColor
 204                        // Это работает даже если ClientStatus был загружен без StatusColor в основном запросе
 0205                        order.ClientStatus = clientStatusWithColor;
 206                    }
 207                }
 208            }
 2209        }
 210    }
 211}