< Summary

Class:SVETA.Api.Controllers.ExchangeController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/ExchangeController.cs
/opt/dev/sveta_api_build/SVETA.Api/Controllers/ExchangeController.Tokens.cs
Covered lines:0
Uncovered lines:180
Coverable lines:180
Total lines:530
Line coverage:0% (0 of 180)
Covered branches:0
Total branches:98
Branch coverage:0% (0 of 98)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
GetShipments()0%0%
GetShipmentsStatus()0%100%
SupplierConfirm()0%100%
SupplierReject()0%0%
Ship()0%100%
Accept()0%100%
Delivery()0%100%
DraftCorrection()0%100%
Correction()0%0%
CreateGoods()0%0%
Price()0%0%
Rest()0%0%
CrmSyncUser()0%0%
CrmSyncContragent()0%0%
GetTokens()0%0%
GetToken()0%0%
CreateToken()0%100%
UpdateToken()0%0%
UpdateTokenDescription()0%0%
DeleteToken()0%100%
CreateMapper()0%0%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/Controllers/ExchangeController.cs

#LineLine coverage
 1using System;
 2using WinSolutions.Sveta.Common;
 3using System.Collections.Generic;
 4using System.Linq;
 5using System.Linq.Expressions;
 6using System.Threading.Tasks;
 7using AutoMapper;
 8using Microsoft.AspNetCore.Mvc;
 9using Microsoft.AspNetCore.Mvc.ModelBinding;
 10using Microsoft.AspNetCore.Routing;
 11using Microsoft.EntityFrameworkCore;
 12using Microsoft.Extensions.Logging;
 13using SVETA.Api.Data.DTO;
 14using SVETA.Api.Data.DTO.ExchangeToken;
 15using SVETA.Api.Data.DTO.Goods;
 16using SVETA.Api.Data.DTO.Movements;
 17using SVETA.Api.Data.DTO.Prices.PriceTrend;
 18using SVETA.Api.Data.DTO.Rest;
 19using SVETA.Api.Helpers;
 20using SVETA.Api.Helpers.Authorize;
 21using SVETA.Api.Services.Interfaces;
 22using Swashbuckle.AspNetCore.Annotations;
 23using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 24using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 25using WinSolutions.Sveta.Server.Services.Interfaces;
 26using System.IO;
 27using WinSolutions.Sveta.Server.Data.DataLoading.Loaders;
 28using SVETA.Api.Services.Implements;
 29using WinSolutions.Sveta.Server.Data.DataLoading.Records;
 30
 31namespace SVETA.Api.Controllers
 32{
 33    [Route("api/v1/Exchange")]
 34    public partial class ExchangeController: SvetaController
 35    {
 36        private readonly ILogger<ExchangeController> _logger;
 37        private readonly IMovementWorker _movementWorker;
 38        private readonly IExchangeTokenService _exchangeTokenService;
 39        private readonly IGoodWorker _goodWorker;
 40        private readonly IPriceWorker _priceWorker;
 41        private readonly ICrmSyncWorker _crmSyncWorker;
 42        private readonly IMovementStatusRouter _movementStatusRouter;
 43        public ExchangeController(ILogger<ExchangeController> logger,
 44            IMovementWorker movementWorker,
 45            IGoodWorker goodWorker,
 46            IPriceWorker priceWorker,
 47            IMovementStatusRouter movementStatusRouter,
 48            IExchangeTokenService exchangeTokenService,
 049            ICrmSyncWorker crmSyncWorker) : base(logger)
 050        {
 051            _movementWorker = movementWorker;
 052            _goodWorker = goodWorker;
 053            _priceWorker = priceWorker;
 054            _crmSyncWorker = crmSyncWorker;
 055            _logger = logger;
 056            _exchangeTokenService = exchangeTokenService;
 057            _movementStatusRouter = movementStatusRouter;
 058        }
 59
 60
 61
 62        /// <summary>
 63        /// Возвращает список отгрузок
 64        /// </summary>
 65        /// <param name="tnx">Токен в системе</param>
 66        /// <param name="from">Дата начала отбора</param>
 67        /// <param name="to">Дата окончания отбора</param>
 68        /// <returns></returns>
 69        [HttpGet("1C/Shipments")]
 70        [SwaggerResponse(200, "Успешно", typeof(IEnumerable<MovementExchnageResponseDto>))]
 71        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 72        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 73        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 74        public async Task<IActionResult> GetShipments([BindRequired, FromQuery] string tnx, [FromQuery] DateTime from = 
 75            [FromQuery] DateTime to = default )
 076        {
 077            from = from == default ? DateTime.Now.AddDays(-1) : from;
 078            to = to == default ? DateTime.Now.AddDays(1) : to;
 079            var result = await _movementWorker.GetMovementListToExchange(new Guid(tnx), from, to, MovementKind.Shipment)
 080            return Ok(result);
 081        }
 82
 83        /// <summary>
 84        /// Получение статусов отгрузок для 1С
 85        /// </summary>
 86        /// <param name="tnx">Токен контрагента в системе</param>
 87        /// <param name="from">Дата начала отбора - по умолчанию за все время</param>
 88        /// <param name="to">Дата окончания отбора - по умолчанию за все время</param>
 89        /// <param name="docGuid">Уникальный идентификатор документа в системе - по умолчанию пустой</param>
 90        /// <returns></returns>
 91        [HttpGet("1C/Shipments/ShipmentsStatus")]
 92        [SwaggerResponse(200, "Успешно", typeof(IEnumerable<ExchangeMovementStatus>))]
 93        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 94        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 95        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 96        public async Task<IActionResult> GetShipmentsStatus([BindRequired, FromQuery] string tnx,
 97            [FromQuery] DateTime from = default,
 98            [FromQuery] DateTime to = default, [FromQuery] Guid docGuid = default)
 099        {
 0100            var movements = await _movementWorker.GetShipmentStatusToExchange(new Guid(tnx), from, to, docGuid);
 0101            return Ok(movements);
 0102        }
 103
 104        /// <summary>
 105        /// Подтверждает отгрузку поставщиком, отгрузка переходит в статус ожидания оплаты
 106        /// </summary>
 107        /// <param name="id">Идентификатор документа</param>
 108        /// <param name="tnx">Токен в системе</param>
 109        /// <returns></returns>
 110        [HttpPost("1C/Shipments/{id}/SuppConfirm")]
 111        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 112        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 113        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 114        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 115        public async Task<IActionResult> SupplierConfirm(Guid id, [BindRequired, FromQuery] string tnx)
 0116        {
 0117            await _movementStatusRouter.SetNextExchangeStatus(id, new Guid(tnx), MovementStatusKeys.paymentReserve,
 0118                default);
 0119            return Ok();
 0120        }
 121
 122        /// <summary>
 123        /// Отказ поставщика от отгрузки, переводи отгрузку в статус отказ поставщика
 124        /// </summary>
 125        /// <param name="id">идентификатор документа</param>
 126        /// <param name="tnx">Токен в системе</param>
 127        /// <param name="requestDto">Объект с комментарием</param>
 128        /// <returns></returns>
 129        [HttpPost("1C/Shipments/{id}/SuppReject")]
 130        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 131        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 132        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 133        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 134        public async Task<IActionResult> SupplierReject(Guid id, [BindRequired, FromQuery] string tnx, [FromBody] Exchan
 0135        {
 0136            if (requestDto?.Comment == default || requestDto?.Comment?.Length == 0)
 0137                throw new ArgumentException("Комментарий при отказе обязательное поле");
 0138            await _movementStatusRouter.SetNextExchangeStatus(id, new Guid(tnx), MovementStatusKeys.supplierRejectShipme
 0139                requestDto?.Comment);
 0140            return Ok();
 0141        }
 142
 143        /// <summary>
 144        /// Выдача товара покупателю
 145        /// </summary>
 146        /// <param name="id">идентификатор документа</param>
 147        /// <param name="tnx">Токен в системе</param>
 148        /// <returns></returns>
 149        [HttpPost("1C/Shipments/{id}/Ship")]
 150        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 151        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 152        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 153        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 154        public async Task<IActionResult> Ship(Guid id, [BindRequired, FromQuery] string tnx)
 0155        {
 0156            await _movementStatusRouter.SetNextExchangeStatus(id, new Guid(tnx), MovementStatusKeys.ship, default);
 0157            return Ok();
 0158        }
 159
 160        /// <summary>
 161        /// Подтверждение выдачи товара покупателю
 162        /// </summary>
 163        /// <param name="id">идентификатор документа</param>
 164        /// <param name="tnx">Токен в системе</param>
 165        /// <returns></returns>
 166        [HttpPost("1C/Shipments/{id}/ReadyToShip")]
 167        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 168        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 169        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 170        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 171        public async Task<IActionResult> Accept(Guid id, [BindRequired, FromQuery] string tnx)
 0172        {
 0173            await _movementStatusRouter.SetNextExchangeStatus(id, new Guid(tnx), MovementStatusKeys.readyToShip, default
 0174            return Ok();
 0175        }
 176
 177        /// <summary>
 178        /// Доставка заказа покупателю при выборе ТПЗ - доставка
 179        /// </summary>
 180        /// <param name="id">идентификатор документа</param>
 181        /// <param name="tnx">Токен в системе</param>
 182        /// <returns></returns>
 183        [HttpPost("1C/Shipments/{id}/Delivery")]
 184        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 185        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 186        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 187        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 188        public async Task<IActionResult> Delivery(Guid id, [BindRequired, FromQuery] string tnx)
 0189        {
 0190            await _movementStatusRouter.SetNextExchangeStatus(id, new Guid(tnx), MovementStatusKeys.deliver, default);
 0191            return Ok();
 0192        }
 193
 194        /// <summary>
 195        /// Редактирование черновика отгрузки
 196        /// </summary>
 197        /// <param name="id">идентификатор документа</param>
 198        /// <param name="tnx">Токен в системе</param>
 199        /// <param name="request">Объект с позициями для обновления</param>
 200        /// <returns></returns>
 201        [HttpPut("1C/Shipments/{id}/DraftCorrection")]
 202        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 203        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 204        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 205        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 206        public async Task<IActionResult> DraftCorrection(Guid id, [BindRequired, FromQuery] string tnx, [FromBody] Excha
 0207        {
 0208            await _movementWorker.ExchangeCorretionShipment(id, new Guid(tnx), request);
 0209            return Ok();
 0210        }
 211
 212        /// <summary>
 213        /// Перевод отгрузки в корректировку
 214        /// </summary>
 215        /// <param name="id">идентификатор документа</param>
 216        /// <param name="tnx">Токен в системе</param>
 217        /// <param name="request">Объект с позициями для обновления</param>
 218        /// <returns></returns>
 219        [HttpPut("1C/Shipments/{id}/Correction")]
 220        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 221        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 222        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 223        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 224        public async Task<IActionResult> Correction(Guid id, [BindRequired, FromQuery] string tnx, [FromBody] ExchangeSh
 0225        {
 0226            await _movementStatusRouter.SetNextExchangeStatus(id, new Guid(tnx), MovementStatusKeys.correctionShipment, 
 0227            await _movementWorker.ExchangeCorretionShipment(id, new Guid(tnx), request);
 0228            return Ok();
 0229        }
 230
 231        /// <summary>
 232        /// Создание номенклатуры из 1С
 233        /// </summary>
 234        /// <param name="tnx">Токен в системе</param>
 235        /// <param name="goods">Список товаров</param>
 236        /// <returns></returns>
 237        [HttpPost("1C/Goods")]
 238        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 239        [SwaggerResponse(400, "Ошибка входных параметров", typeof(List<Dictionary<string, string>>))]
 240        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 241        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 242        public async Task<IActionResult> CreateGoods(Guid tnx, [FromBody] List<GoodExchangeDto> goods)
 0243        {
 0244            if (!ModelState.IsValid)
 0245                throw new ArgumentException("Ошибка валидации входных данных. Проверьте корректность данных в json");
 0246            var token = await _exchangeTokenService.GetToken(tnx);
 0247            if (token == null)
 0248                throw new ForbidException();
 0249            if (goods == null || goods?.Count == 0)
 0250                throw new ArgumentException($"Список для добавления пуст");
 0251            var result = await _goodWorker.CreateGoods(goods, token);
 0252            if (result.Count > 0)
 0253                return BadRequest(result);
 0254            return Ok();
 0255        }
 256
 257        /// <summary>
 258        /// Загрузка цен через 1С
 259        /// </summary>
 260        /// <param name="tnx">Токен в системе</param>
 261        /// <param name="requestDto">объект с ценами</param>
 262        /// <returns></returns>
 263        [HttpPost("1C/Price")]
 264        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 265        [SwaggerResponse(400, "Ошибка входных параметров", typeof(List<Dictionary<string, string>>))]
 266        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 267        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 268        public async Task<IActionResult> Price(Guid tnx, [FromBody] ExchangePriceTrendRequestDto requestDto)
 0269        {
 0270            if (!ModelState.IsValid)
 0271                throw new ArgumentException("Ошибка валидации входных данных. Проверьте корректность данных в json");
 0272            var token = await _exchangeTokenService.GetToken(tnx);
 0273            if (token == null)
 0274                throw new ForbidException();
 0275            var result = await _priceWorker.ExchangeLoadPrice(token.Department, requestDto);
 0276            if (result.Count > 0)
 0277                return BadRequest(result);
 0278            return Ok();
 0279        }
 280
 281        /// <summary>
 282        /// Загрузка остатков через 1С
 283        /// </summary>
 284        /// <param name="tnx">Токен в системе</param>
 285        /// <param name="rests">Объект с остатками</param>
 286        /// <returns></returns>
 287        /// <exception cref="ForbidException"></exception>
 288        [HttpPost("1C/Rest")]
 289        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 290        [SwaggerResponse(400, "Ошибка входных параметров", typeof(List<Dictionary<string, string>>))]
 291        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 292        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 293        public async Task<IActionResult> Rest(Guid tnx, [FromBody] List<ExchangeRestRequestDto> rests)
 0294        {
 0295            if (!ModelState.IsValid)
 0296                throw new ArgumentException("Ошибка валидации входных данных. Проверьте корректность данных в json");
 0297            var token = await _exchangeTokenService.GetToken(tnx);
 0298            if (token == null)
 0299                throw new ForbidException();
 0300            var result = await _goodWorker.ExchangeRests(token.Department, rests);
 0301            if (result.Count > 0)
 0302                return BadRequest(result);
 0303            return Ok();
 0304        }
 305
 306        /// <summary>
 307        /// Запускает синхронизацию юзера с CRM
 308        /// </summary>
 309        /// <param name="tnx">Токен в системе</param>
 310        /// <param name="tid">внешний идентификатор юзера</param>
 311        [HttpPost("CrmSync/User")]
 312        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 313        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 314        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 315        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 316        public async Task<IActionResult> CrmSyncUser([SwaggerParameter(Required = true)] Guid tnx, [SwaggerParameter(Req
 0317        {
 0318            _ = await _exchangeTokenService.GetToken(tnx) ?? throw new ForbidException();
 0319            await _crmSyncWorker.SyncWithCrm(tid, null, true);
 0320            return Ok();
 0321        }
 322
 323        /// <summary>
 324        /// Запускает синхронизацию контрагента с CRM
 325        /// </summary>
 326        /// <param name="tnx">Токен в системе</param>
 327        /// <param name="tid">внешний идентификатор контрагента</param>
 328        [HttpPost("CrmSync/Contragent")]
 329        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 330        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 331        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 332        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 333        public async Task<IActionResult> CrmSyncContragent([SwaggerParameter(Required = true)] Guid tnx, [SwaggerParamet
 0334        {
 0335            _ = await _exchangeTokenService.GetToken(tnx) ?? throw new ForbidException();
 0336            await _crmSyncWorker.SyncWithCrm(null, tid);
 0337            return Ok();
 0338        }
 339    }
 340}

/opt/dev/sveta_api_build/SVETA.Api/Controllers/ExchangeController.Tokens.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Linq.Expressions;
 5using System.Threading.Tasks;
 6using AutoMapper;
 7using Microsoft.AspNetCore.Authorization;
 8using Microsoft.AspNetCore.Mvc;
 9using Microsoft.EntityFrameworkCore;
 10using SVETA.Api.Data.DTO;
 11using SVETA.Api.Data.DTO.DepartmentDTO;
 12using SVETA.Api.Data.DTO.ExchangeToken;
 13using Swashbuckle.AspNetCore.Annotations;
 14using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 15using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 16
 17namespace SVETA.Api.Controllers
 18{
 19    public partial class ExchangeController : SvetaController
 20    {
 21        /// <summary>
 22        /// Возвращает все токены в системе
 23        /// </summary>
 24        /// <param name="departmentId">Идентификатор департамента - склада - по умолчанию для всех</param>
 25        /// <param name="sort">сортировка - по умолчанию id, id|desc, department, department|desc, contragent, contragen
 26        /// <param name="page">страница отбора - по умолчанию 1  меньше 1 будет 1</param>
 27        /// <param name="limit">количество для отбора - по умолчанию 10 меньше 1 будет 10</param>
 28        /// <returns></returns>
 29        [HttpGet("Token")]
 30        [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<ExchangeTokenResponseDto>))]
 31        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 32        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 33        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 34        [Authorize(Roles = Role.SystemAdmin+"," + Role.SystemOperator)]
 35         public async Task<IActionResult> GetTokens(long departmentId, string sort, int page = 1, int limit = 10)
 036        {
 037            limit = limit < 1 ? 10 : limit;
 038            string url = "api/v1/Exchange/Token";
 039            var tokens = _exchangeTokenService.GetTokens();
 040            int total = await tokens.CountAsync();
 041            if (departmentId != 0)
 042                tokens = tokens.Where(token => token.DepartmentId == departmentId);
 043            int totalFilteredCount = await tokens.CountAsync();
 44            string param()
 045            {
 046                string res = "";
 047                if (departmentId != 0)
 048                    res += $"departmentId={departmentId}";
 049                return res;
 050            }
 051            if (total == 0)
 052            {
 053                return Ok(new BaseResponseDTO<ExchangeTokenResponseDto>(url, page, limit,
 054                    totalFilteredCount, total, sort, default, param())
 055                {
 056                    Data = new List<ExchangeTokenResponseDto>()
 057                });
 58            }
 59
 060            Expression<Func<ExchangeToken, object>> sortExpression =
 061                (sort?.Split("|").ElementAtOrDefault(0) ?? "").ToLower() switch
 062                {
 063                    "department" => e => e.Department.Id,
 064                    "contragent" => e => e.Department.Contragent.Id,
 065                    _ => e => e.Id
 066                };
 67
 068            var finished = (sort?.Split("|").ElementAtOrDefault(1) ?? "").ToLower() switch
 069            {
 070                "desc" => tokens.OrderByDescending(sortExpression),
 071                _ => tokens.OrderBy(sortExpression)
 072            };
 73
 074            var mapper = CreateMapper();
 075            return Ok(new BaseItemResponseDto<List<ExchangeTokenResponseDto>>(url, page, limit, totalFilteredCount, tota
 076                sort, default, param())
 077            {
 078                Data = mapper.Map<List<ExchangeTokenResponseDto>>(await finished.Skip((page < 2 ? 0 : page - 1) * limit)
 079                    .Take(limit).ToListAsync())
 080            });
 081        }
 82
 83         /// <summary>
 84         /// Возвращает токен
 85         /// </summary>
 86         /// <param name="tokenId">Идентификатор токена</param>
 87         /// <returns></returns>
 88         [HttpGet("Token/{tokenId}")]
 89         [SwaggerResponse(200, "Успешно", typeof(ExchangeTokenResponseDto))]
 90         [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 91         [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 92         [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 93         [Authorize(Roles = Role.SystemAdmin+"," + Role.SystemOperator)]
 94        public async Task<IActionResult> GetToken(long tokenId)
 095        {
 096            var token = await _exchangeTokenService.GetToken(tokenId) ??
 097                        throw new ArgumentException($"Токен {tokenId} не найден");
 098            return Ok(CreateMapper().Map<ExchangeTokenResponseDto>(token));
 099        }
 100
 101        /// <summary>
 102        /// Создание токена для контрагента
 103        /// </summary>
 104        /// <param name="departmentId">Идентификатор департамента - склада</param>
 105        /// <returns></returns>
 106        [HttpPost("Token/{departmentId}/CreateToken")]
 107        [SwaggerResponse(200, "Успешно", typeof(ExchangeTokenResponseDto))]
 108        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 109        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 110        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 111        [Authorize(Roles = Role.SystemAdmin)]
 112        public async Task<IActionResult> CreateToken(long departmentId, [FromBody] ExchangeTokenDescriptionRequestDto de
 0113        {
 0114            var token = new ExchangeToken
 0115            {
 0116                DepartmentId = departmentId,
 0117                GUID = Guid.NewGuid(),
 0118                Description = descript.Description
 0119            };
 0120            await _exchangeTokenService.CreateToken(token);
 0121            return CreatedAtAction(nameof(GetToken), new {tokenId = token.Id},
 0122                CreateMapper().Map<ExchangeTokenResponseDto>(token));
 0123        }
 124
 125        /// <summary>
 126        /// Обновление токена в системе
 127        /// </summary>
 128        /// <param name="tokenId">Идентификатор токена</param>
 129        /// <returns></returns>
 130        [HttpPost("Token/{tokenId}")]
 131        [SwaggerResponse(200, "Успешно", typeof(ExchangeTokenResponseDto))]
 132        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 133        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 134        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 135        [Authorize(Roles = Role.SystemAdmin)]
 136        public async Task<IActionResult> UpdateToken(long tokenId)
 0137        {
 0138            var token = await _exchangeTokenService.GetToken(tokenId) ??
 0139                        throw new ArgumentException($"Токен {tokenId} не найден");
 0140            token.GUID = Guid.NewGuid();
 0141            await _exchangeTokenService.UpdateToken(token);
 0142            return Ok(CreateMapper().Map<ExchangeTokenResponseDto>(token));
 0143        }
 144        /// <summary>
 145        /// Обновление описания токена
 146        /// </summary>
 147        /// <param name="tokenId">Идентификатор токена</param>
 148        /// <returns></returns>
 149        [HttpPut("Token/{tokenId}")]
 150        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 151        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 152        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 153        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 154        [Authorize(Roles = Role.SystemAdmin)]
 155        public async Task<IActionResult> UpdateTokenDescription(long tokenId, [FromBody] ExchangeTokenDescriptionRequest
 0156        {
 0157            var token = await _exchangeTokenService.GetToken(tokenId) ??
 0158                        throw new ArgumentException($"Токен {tokenId} не найден");
 0159            token.Description = description.Description;
 0160            await _exchangeTokenService.UpdateToken(token);
 0161            return Ok();
 0162        }
 163
 164
 165        /// <summary>
 166        /// Удаление токена из системы
 167        /// </summary>
 168        /// <param name="tokenId">Идентификатор токена</param>
 169        /// <returns></returns>
 170        [HttpDelete("Token/{tokenId}")]
 171        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 172        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 173        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 174        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 175        [Authorize(Roles = Role.SystemAdmin)]
 176        public async Task<IActionResult> DeleteToken(long tokenId)
 0177        {
 0178            await _exchangeTokenService.DeleteToken(tokenId);
 0179            return Ok();
 0180        }
 181
 0182        private IMapper CreateMapper() => new MapperConfiguration(cfg =>
 0183        {
 0184            cfg.CreateMap<ExchangeToken, ExchangeTokenResponseDto>()
 0185                .ForMember(d => d.Active, s => s.MapFrom(
 0186                    e => e.RecState.Id == (long) RecordState.Active));
 0187            cfg.CreateMap<Department, DepartmentShortDTO>();
 0188        }).CreateMapper();
 189    }
 190}