< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.WalletService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/WalletService.cs
Covered lines:46
Uncovered lines:11
Coverable lines:57
Total lines:124
Line coverage:80.7% (46 of 57)
Covered branches:22
Total branches:56
Branch coverage:39.2% (22 of 56)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
CreateWalletTransaction()0%0%
GetTransactions()100%50%
GetTransaction()100%100%
GetTransactionStatus()0%0%
GetTransactionStatuses()0%100%
Update()0%100%
FilterQuery(...)100%100%
PrepareQuery()100%100%
Sort(...)100%43.47%

File(s)

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

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Microsoft.Extensions.Logging;
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6using System.Text;
 7using System.Threading.Tasks;
 8using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 9using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 10using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 11using WinSolutions.Sveta.Server.Domain;
 12using WinSolutions.Sveta.Server.Services.Interfaces;
 13using WinSolutions.Sveta.Common;
 14
 15namespace WinSolutions.Sveta.Server.Services.Implements
 16{
 17    public class WalletService : SvetaServiceBase, IWalletService
 18    {
 19        private readonly ILogger<WalletService> _logger;
 20        private readonly SvetaDbContext _db;
 21        public WalletService(SvetaDbContext db, ILogger<WalletService> logger, IAuthenticationService authenticationServ
 8622            : base(authenticationService)
 8623        {
 8624            _db = db;
 8625            _logger = logger;
 8626        }
 27
 28        public async Task CreateWalletTransaction(WalletTransaction transaction)
 029        {
 030            await _db.WalletTransactions.AddAsync(transaction);
 031            await _db.SaveChangesAsync(CurrentUserId);
 032        }
 33
 34        /// <summary>
 35        /// Возвращает список траназакций
 36        /// </summary>
 37        /// <param name="movementId">Идентификатор документа</param>
 38        /// <param name="buyerId"></param>
 39        /// <param name="transactionStatus">Идентификатор статуса транзакции</param>
 40        /// <param name="dateFrom">Дата начала отбора</param>
 41        /// <param name="dateTo">Дата окончания отбора</param>
 42        /// <param name="page">Страница отбора</param>
 43        /// <param name="limit">Лимит отбора</param>
 44        /// <param name="sort">сортировка по умолчанию по id - id|desc,created_on,created_on|descstatus,status|desc,cust
 45        /// <returns></returns>
 46        public async Task<PaginatedData<List<WalletTransaction>>> GetTransactions(long movementId = 0, long buyerId = 0,
 1347        {
 1348            var list = PrepareQuery();
 1349            int totalCount = await FilterQuery(list, movementId, 0, 0, DateTime.MinValue, DateTime.MinValue).CountAsync(
 1350            list = FilterQuery(list, movementId, buyerId, transactionStatus, dateFrom, dateTo);
 1351            list = Sort(list, sort?.ToLower());
 1352            int totalFilteredCount = await list.CountAsync();
 1353            return new PaginatedData<List<WalletTransaction>>
 1354            {
 1355                TotalCount = totalCount,
 1356                TotalFilteredCount = totalFilteredCount,
 1357                Result = await list.Skip((page < 2 ? 0 : page -1 ) * limit).Take(limit).ToListAsync()
 1358            };
 1359        }
 60
 61        /// <summary>
 62        /// Получение транзакции по id документа и статусу
 63        /// </summary>
 64        /// <param name="movementId"></param>
 65        /// <param name="transactionStatusId"></param>
 66        /// <returns></returns>
 2967        public async Task<WalletTransaction> GetTransaction(long movementId, long transactionStatusId) => await PrepareQ
 2968            .FirstOrDefaultAsync(d => d.Movement.Id == movementId && d.Status.Id == transactionStatusId);
 69
 70        /// <summary>
 71        /// Получение статусе по идентификатору
 72        /// </summary>
 73        /// <param name="id"></param>
 74        /// <returns></returns>
 075        public async Task<WalletTransactionStatus> GetTransactionStatus(long id) => await _db.refWalletTransactionStatus
 076            .FindAsync(id);
 77
 078        public async Task<List<WalletTransactionStatus>> GetTransactionStatuses() => await _db.refWalletTransactionStatu
 79
 80        public async Task Update(WalletTransaction walletTransaction)
 081        {
 082            _db.WalletTransactions.Update(walletTransaction);
 083            await _db.SaveChangesAsync(CurrentUserId);
 084        }
 85
 86        private IQueryable<WalletTransaction> FilterQuery(IQueryable<WalletTransaction> preparedList, long movementId, l
 2687            preparedList.Where(d => movementId == 0 || d.Movement.Id == movementId)
 2688            .Where(d => buyerId == 0 || d.Movement.Customer.Id == buyerId)
 2689            .Where(d => transactionStatus == 0 || d.Status.Id == transactionStatus)
 2690            .Where(d => dateFrom == DateTime.MinValue || d.CreationDateTime >= dateFrom)
 2691            .Where(d => dateTo == DateTime.MinValue || d.CreationDateTime < dateTo);
 92
 93
 4294        private IQueryable<WalletTransaction> PrepareQuery() => _db.WalletTransactions
 4295            .Include(d => d.Movement)
 4296                .ThenInclude(Movement => Movement.Customer)
 4297            .Include(d => d.Movement)
 4298                .ThenInclude(Movement => Movement.Supplier)
 4299            .Include(d => d.Status)
 42100            .Where(d => !d.IsDeleted)
 42101            .AsQueryable();
 102
 103        /// <summary>
 104        /// Сортирует по полям
 105        /// </summary>
 106        /// <param name="movements"></param>
 107        /// <param name="sort">сортировка по умолчанию по id - id|desc,created_on,created_on|descstatus,status|desc,cust
 108        /// <returns></returns>
 13109        private IQueryable<WalletTransaction> Sort(IQueryable<WalletTransaction> transactions, string sort = default) =>
 13110        {
 13111            "created_on" => transactions.OrderBy(d => d.CreationDateTime),
 13112            "created_on|desc" => transactions.OrderByDescending(d => d.CreationDateTime),
 13113            "status" => transactions.OrderBy(d => d.Status.Id),
 13114            "status|desc" => transactions.OrderByDescending(d => d.Status.Id),
 13115            "customer" => transactions.OrderBy(d => d.Movement.Customer),
 13116            "customer|desc" => transactions.OrderByDescending(d => d.Movement.Customer),
 13117            "supplier" => transactions.OrderBy(d => d.Movement.Supplier),
 13118            "supplier|desc" => transactions.OrderByDescending(d => d.Movement.Supplier),
 13119            "id|desc" => transactions.OrderByDescending(d => d.Id),
 13120            _ => transactions.OrderBy(d => d.Id),
 13121        };
 122    }
 123
 124}