< Summary

Class:SVETA.Api.Controllers.RestsController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/RestsController.cs
Covered lines:0
Uncovered lines:101
Coverable lines:101
Total lines:258
Line coverage:0% (0 of 101)
Covered branches:0
Total branches:62
Branch coverage:0% (0 of 62)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
GetRests()0%0%
GetSourceGoods()0%0%
CreateRest()0%0%
UpdateRest()0%0%
DeleteRest()0%0%
Export()0%0%

File(s)

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

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using WinSolutions.Sveta.Common.Extensions;
 3using Microsoft.AspNetCore.Mvc;
 4using Microsoft.Extensions.Logging;
 5using Microsoft.Extensions.Options;
 6using Newtonsoft.Json;
 7using SVETA.Api.Data.Domain;
 8using SVETA.Api.Data.DTO;
 9using SVETA.Api.Data.DTO.Rest;
 10using SVETA.Api.Helpers.Authorize;
 11using SVETA.Api.Services.Interfaces;
 12using Swashbuckle.AspNetCore.Annotations;
 13using System;
 14using System.Collections.Generic;
 15using System.IO;
 16using System.Linq;
 17using System.Threading.Tasks;
 18using WinSolutions.Sveta.Common;
 19using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 20using WinSolutions.Sveta.Server.Data.DataModel.Extensions;
 21using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 22using WinSolutions.Sveta.Server.Domain;
 23using WinSolutions.Sveta.Server.Services.Interfaces;
 24
 25namespace SVETA.Api.Controllers
 26{
 27    [Authorize]
 28    [Route("api/v1/Rests")]
 29    [ApiController]
 30    public class RestsController : SvetaController
 31    {
 32        const string _routeUrl = "api/v1/Rests";
 33        readonly IRestService _restService;
 34        readonly IGoodService _goodService;
 35        readonly IUploadWorker _uploadWorker;
 36        readonly IDepartmentService _departmentService;
 37        readonly IAuthenticationService _authUserService;
 38        readonly ILogger<RestsController> _logger;
 39        private readonly ImagesSettings _imageSettings;
 40        IDiskStorageService _diskStorage;
 41        readonly IGoodSettingService _serviceGoodSetting;
 42
 43        public RestsController(IRestService restService,
 44            IGoodService goodService,
 45            IDepartmentService departmentService,
 46            IAuthenticationService authUserService,
 47            IUploadWorker uploadWorker,
 48            IOptions<ImagesSettings> options,
 49            IDiskStorageService diskStorage,
 50            IGoodSettingService serviceGoodSetting,
 051            ILogger<RestsController> logger) : base(logger)
 052        {
 053            _uploadWorker = uploadWorker;
 054            _goodService = goodService;
 055            _departmentService = departmentService;
 056            _restService = restService;
 057            _logger = logger;
 058            _authUserService = authUserService;
 059            _imageSettings = options.Value;
 060            _diskStorage = diskStorage;
 061            _serviceGoodSetting = serviceGoodSetting;
 062        }
 63
 64        /// <summary>
 65        /// Получить все остатки всех подразделений
 66        /// </summary>
 67        /// <remarks>author i.rebenok</remarks>
 68        /// <param name="page">Любое значение ниже нуля изменится на 1, пагинация: номер страницы</param>
 69        /// <param name="limit">Любое значение ниже нуля изменится на 10, пагинация: размер страницы</param>
 70        /// <param name="filter">фильтр по значимым полям: артикул или название товара</param>
 71        /// <param name="categoryId">атегория товара. 0 - все категории (по-умолчанию), >0 - конкретная категория</param
 72        /// <param name="departmentId">Департамент. 0 - все департаменты (по-умолчанию), >0 - конкретный департамент</pa
 73        /// <param name="rest">Фильтр по остатку. -1 - выводить все остатки, 0 - только с нулевым остатком, 1 - больше 0
 74        /// <param name="sort">сортировка по одному из полей
 75        /// по vencode,vencode|desc, name,name|desc, quant,quant|desc. Сортировка по умолчанию по name</param>
 76        [HttpGet("")]
 77        [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<RestResponseDTO>))]
 78        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 79        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 80        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 81        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwner + "," + Role.Supplier
 82        public async Task<IActionResult> GetRests(int page = 1, int limit = 10, long categoryId = 0, long departmentId =
 083        {
 084            filter = filter.NormalizeName();
 085            page = page < 1 ? 1 : page;
 086            limit = limit < 1 ? 10 : limit;
 087            if (!_authUserService.IsUserPlatform() && await _departmentService.GetDepartment(departmentId, _authUserServ
 088                return NotFoundResult($"Не найдено подразделение с id={departmentId}");
 089            PaginatedData<List<Rest>> data = await _restService.GetRests(page - 1, limit, categoryId, departmentId, filt
 090            var param = $"sort={sort}&departmentId={departmentId}&categoryId={categoryId}";
 091            data.Result.ForEach(x => x.Good.Photos.SetPhotoUrl(_imageSettings));
 092            var response = new BaseResponseDTO<RestResponseDTO>(_routeUrl, page, (int)limit, data.TotalFilteredCount, da
 093            {
 094                Data = data.Result.Select(x => new RestResponseDTO(x)).ToList(),
 095            };
 096            return Ok(response);
 097        }
 98
 99        /// <summary>
 100        /// Список-источник товаров для добавления в остатки
 101        /// </summary>
 102        /// <remarks>author: i.rebenok</remarks>
 103        /// <param name="page">Любое значение ниже нуля изменится на 1, пагинация: номер страницы</param>
 104        /// <param name="limit">Любое значение ниже нуля изменится на 10, пагинация: размер страницы</param>
 105        /// <param name="filter">фильтр по названиям или коду товара</param>
 106        /// <param name="categoryId">0 - все категории, иначе конкретная. 0 по умолчанию</param>
 107        /// <param name="departmentId">id подразделения</param>
 108        /// <param name="sort">сортировка по одному из полей
 109        /// по code,code|desc, name,name|desc. Сортировка по умолчанию по name</param>
 110        [HttpGet("{departmentId}/SourceGoods")]
 111        [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<RestSourceGoodsResponseDTO>))]
 112        [SwaggerResponse(404, "Нет записей", typeof(EmptyResult))]
 113        [SwaggerResponse(403, "Не разрешено для этого пользователя")]
 114        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(string))]
 115        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwner + "," + Role.Supplier
 116        public async Task<IActionResult> GetSourceGoods(long departmentId, int page = 1, int limit = 10, long categoryId
 0117        {
 0118            filter = filter.NormalizeName();
 0119            if (!_authUserService.IsUserPlatform() && await _departmentService.GetDepartment(departmentId, _authUserServ
 0120                return NotFoundResult($"Не найдено подразделение с id={departmentId}");
 0121            var rests = await _restService.GetRests(departmentId);
 0122            if (rests == null)
 0123                return NotFoundResult($"Не найдено остатков для подразделения с id={departmentId}");
 0124            var goods = await _goodService.GetActiveGoods(page - 1, limit, departmentId, categoryId, sort, filter);
 0125            goods.Result.ForEach(x => x.Photos.SetPhotoUrl(_imageSettings));
 0126            var param = $"departmentId={departmentId}&categoryId={categoryId}&sort={sort}";
 0127            var response = new BaseResponseDTO<RestSourceGoodsResponseDTO>(_routeUrl + "/" + departmentId + "/SourceGood
 0128            {
 0129                Data = goods.Result.Select(x => new RestSourceGoodsResponseDTO()
 0130                {
 0131                    Id = x.Id,
 0132                    VendorCode = x.GetActualVendorCode(departmentId),
 0133                    Name = x.Name,
 0134                    UniqueCode = x.UniqueCode,
 0135                    IsInRest = (rests.Any(d => d.Good.Id == x.Id && !d.IsDeleted) ? true : false),
 0136                    RestId = rests.FirstOrDefault(d => d.Good.Id == x.Id)?.Id,
 0137                    Photo = (PhotoPrevDto)x.Photos.FirstOrDefault()
 0138                }).ToList(),
 0139            };
 0140            return Ok(response);
 0141        }
 142
 143        /// <summary>
 144        /// Создать остаток по товару
 145        /// </summary>
 146        /// <remarks>author i.rebenok</remarks>
 147        /// <param name="data">RestRequestDTO_POST</param>
 148        [HttpPost("")]
 149        [SwaggerResponse(201, "Успешно создано", typeof(RestResponseDTO))]
 150        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 151        [SwaggerResponse(400, "Некорректные входные данные", typeof(ErrorDTO))]
 152        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 153        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 154        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SupplierOperator)]
 155        public async Task<IActionResult> CreateRest([FromBody] [SwaggerParameter(Required = true)] RestRequestDTO_POST d
 0156        {
 0157            if (!ModelState.IsValid)
 0158            {
 0159                return BadRequestResult("");
 160            }
 161
 0162            var department = _authUserService.IsUserPlatform() ? await _departmentService.GetDepartment(data.DepartmentI
 0163                await _departmentService.GetDepartment(data.DepartmentId, _authUserService.ContragentId);
 0164            var good = await _goodService.GetGood(data.GoodId);
 165
 0166            if (department == null)
 0167                return NotFoundResult($"Подразделение с id={data.DepartmentId} не найдено");
 0168            if (good == null)
 0169                return NotFoundResult($"Товар с id={data.GoodId} не найден");
 170
 0171            var rest = new Rest
 0172            {
 0173                Department = department,
 0174                Good = good,
 0175                Quantity = 0
 0176            };
 0177            rest = await _restService.Create(rest);
 0178            return StatusCode(201, new RestResponseDTO(rest));
 0179        }
 180
 181        /// <summary>
 182        /// Обновление остатков по id записи
 183        /// </summary>
 184        /// <remarks>author i.rebenok</remarks>
 185        /// <param name="id">id записи </param>
 186        /// <param name="data">RestRequestDTO_PUT</param>
 187        [HttpPut("{id}")]
 188        [SwaggerResponse(200, "Успешно обновлено", typeof(RestResponseDTO))]
 189        [SwaggerResponse(400, "Некорректные входные данные", typeof(ErrorDTO))]
 190        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 191        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 192        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 193        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SupplierOperator)]
 194        public async Task<IActionResult> UpdateRest([SwaggerParameter(Required = true)]long id, [FromBody] [SwaggerParam
 0195        {
 0196            if (!ModelState.IsValid)
 0197            {
 0198                return BadRequestResult("Некорректные входные данные");
 199            }
 0200            var item = await _restService.GetRest(id);
 201
 0202            if (item == null || (item.Department.Contragent?.Id != _authUserService.ContragentId && !_authUserService.Is
 0203                return NotFoundResult($"Остаток с id={id} не найден");
 204
 0205            item.Quantity = data.Quantity;
 206
 0207            await _restService.Update(item);
 0208            return Ok(new RestResponseDTO(item));
 0209        }
 210
 211        /// <summary>
 212        /// Удаление записи по id
 213        /// </summary>
 214        /// <remarks>author i.rebenok</remarks>
 215        /// <param name="id">id удаляемой записи об остатках</param>
 216        [HttpDelete("{id}")]
 217        [SwaggerResponse(200, "Успешно удалено", typeof(EmptyResult))]
 218        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 219        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 220        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 221        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SupplierOperator)]
 222        public async Task<IActionResult> DeleteRest(long id)
 0223        {
 0224            var item = await _restService.GetRest(id);
 225
 0226            if (item == null || (item.Department.Contragent?.Id != _authUserService.ContragentId && !_authUserService.Is
 0227                return NotFoundResult($"Остаток с id={id} не найден");
 228
 0229            await _restService.Delete(id);
 0230            return Ok();
 0231        }
 232
 233        /// <summary>
 234        /// Экспортирует в файл остатки
 235        /// </summary>
 236        /// <param name="departmentId">id склада, 0 для всех</param>
 237        /// <returns></returns>
 238        [HttpGet("Export/{departmentId}")]
 239        [SwaggerResponse(200, "Успешно", typeof(File))]
 240        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 241        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 242        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwner + "," + Role.Supplier
 243        public async Task<IActionResult> Export(long departmentId)
 0244        {
 0245            if (!User.IsInRole(Role.SystemAdmin))
 0246            {
 0247                if (!_authUserService.IsUserPlatform() && await _departmentService.GetDepartment(departmentId, _authUser
 0248                {
 0249                    throw new KeyNotFoundException($"Подразделение с id={departmentId} не найдено");
 250                }
 0251            }
 252
 0253            var result = await _uploadWorker.DownloadRestsToFile(departmentId);
 0254            _diskStorage.SaveDownload("rests.xlsx", result, out string fileName);
 0255            return File(result, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", Path.GetFileName(fi
 0256        }
 257    }
 258}