< Summary

Class:SVETA.Api.Controllers.ContragentController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/ContragentController.cs
Covered lines:0
Uncovered lines:103
Coverable lines:103
Total lines:330
Line coverage:0% (0 of 103)
Covered branches:0
Total branches:68
Branch coverage:0% (0 of 68)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
GetContragents()0%0%
GetDistributorContragents()0%0%
GetRetailContragents()0%0%
GetManufacturerContragents()0%0%
GetContragent()0%0%
GetShortContragent()0%0%
GetShortContragents()0%0%
ToShortDtoMapper()0%0%
ToDtoMapper()0%0%

File(s)

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

#LineLine coverage
 1using WinSolutions.Sveta.Common.Extensions;
 2using AutoMapper;
 3using Microsoft.AspNetCore.Authorization;
 4using Microsoft.AspNetCore.Mvc;
 5using Microsoft.Extensions.Logging;
 6using SVETA.Api.Data.DTO;
 7using SVETA.Api.Data.DTO.AddressDTO;
 8using SVETA.Api.Data.DTO.BankAccount;
 9using SVETA.Api.Data.DTO.ContragentDTO;
 10using SVETA.Api.Data.DTO.TaxSystem;
 11using SVETA.Api.Helpers.Authorize;
 12using Swashbuckle.AspNetCore.Annotations;
 13using System;
 14using System.Collections.Generic;
 15using System.Threading.Tasks;
 16using WinSolutions.Sveta.Common;
 17using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 18using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 19using WinSolutions.Sveta.Server.Services.Interfaces;
 20using System.Linq;
 21
 22namespace SVETA.Api.Controllers
 23{
 24    [Authorize]
 25    [Route("api/v1/Contragents")]
 26    [ApiController]
 27    public class ContragentController : SvetaController
 28    {
 29        readonly IContragentService _contragentService;
 30        readonly IAddressService _addressService;
 31        readonly ISupplyContractService _contractService;
 32        readonly IDirectoriesService _dirService;
 33        private readonly ITaxSystemService _taxSystemService;
 34        private readonly IEventService _eventService;
 35        readonly ILogger<ContragentController> _logger;
 36        readonly IUserService _userService;
 37        private readonly IAuthenticationService _authUserService;
 38        public ContragentController(
 39            IContragentService contragentService,
 40            IAddressService addressService,
 41            IDirectoriesService dirService,
 42            ITaxSystemService taxSystemService,
 43            IEventService eventService,
 44            IAuthenticationService authUserService,
 45            ISupplyContractService contractService,
 46        IUserService userService,
 047            ILogger<ContragentController> logger) : base(logger)
 048        {
 049            _authUserService = authUserService;
 050            _dirService = dirService;
 051            _contragentService = contragentService;
 052            _addressService = addressService;
 053            _taxSystemService = taxSystemService;
 054            _logger = logger;
 055            _contractService = contractService;
 056            _eventService = eventService;
 057            _userService = userService;
 058        }
 59
 60        /// <summary>
 61        /// Возвращает список контрагентов с полным набором полей
 62        /// </summary>
 63        /// <remarks>author Obo\IPod\IPod</remarks>
 64        /// <param name="page">Любое значение ниже нуля изменится на 1, пейджинг: номер страницы</param>
 65        /// <param name="limit">Любое значение ниже нуля изменится на 10, пейджинг: размер страницы. ЕСЛИ значение равно
 66        /// <param name="filter">фильтр по значимым полям FullName / ShortName</param>
 67        /// <param name="sort">сортировка по умолчанию по id - id|desc, created_on,created_on|desc, state,state|desc, st
 68        /// <returns>List of contragents</returns>
 69        [HttpGet("")]
 70        [SwaggerResponse(200, "Успешно", typeof(List<ContragentResponseDTO>))]
 71        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 72        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 73            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 74        public async Task<IActionResult> GetContragents(int page = 1, int? limit = null, string filter = null, string so
 075        {
 076            filter = filter.NormalizeName();
 077            if (limit == null)
 078                page = 1;
 079            else if (page < 1 || limit < 1)
 080            {
 081                page = page < 1 ? 1 : page;
 082                limit = limit < 1 ? 10 : limit;
 083            }
 084            var result = await _contragentService.GetContragents(page - 1, limit, filter, sort);
 085            return Ok(ToDtoMapper().Map<List<ContragentResponseDTO>>(result));
 086        }
 87        /// <summary>
 88        /// Возвращает список контрагентов, отфильтрованных по типу Поставщик
 89        /// </summary>
 90        /// <remarks>author Obo\IPod\IPod</remarks>
 91        /// <param name="page">Любое значение ниже нуля изменится на 1, Страница</param>
 92        /// <param name="limit">Любое значение ниже нуля изменится на 10, Количество для отбора</param>
 93        /// <param name="filter">фильтр по значимым полям FullName / ShortName</param>
 94        /// <param name="sort">сортировка по умолчанию по id - id|desc, created_on,created_on|desc, state,state|desc, st
 95        /// <returns>Список контрагентов</returns>
 96        [HttpGet("Distributors")]
 97        [SwaggerResponse(200, "Успешно", typeof(List<ContragentShortDTO>))]
 98        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 99        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 100            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 101        public async Task<IActionResult> GetDistributorContragents(int page = 1, int limit = 10, string filter = null, s
 0102        {
 0103            filter = filter.NormalizeName();
 0104            if (_authUserService.IsUserRetailer() || _authUserService.IsUserManufacturer())
 0105                return ForbidResult("Нет прав на выполнение этого действия");
 0106            page = page < 1 ? 1 : page;
 0107            limit = limit < 1 ? 10 : limit;
 0108            var contragents = await _contragentService.GetContragentsByKind(page - 1, limit, ContragentKind.Wholesaler, 
 109
 0110            return Ok(ToShortDtoMapper().Map<List<ContragentShortDTO>>(contragents));
 0111        }
 112
 113        /// <summary>
 114        /// Выводит список уникальных КА поставщиков, которые встречаются в заявках/отгрузках для текущего КА.
 115        /// </summary>
 116        /// <param name="movementType">тип документов, для которых используется фильтр. Если заявки, то передаем orders,
 117        /// <remarks>author i.rebenok</remarks>
 118        [HttpGet("ListByMovementSupplier")]
 119        [SwaggerResponse(200, "Успешно удалено", typeof(IdNameDTO))]
 120        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 121        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 122        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 123        [Authorize]
 124        public async Task<IActionResult> GetFilterListByMovementSupplier(string movementType = "orders")
 125        {
 126            var contragentId = _authUserService.IsUserPlatform() ? 0 : _authUserService.ContragentId;
 127            var result = await _contragentService.GetFilteredListByMovementSupplier(contragentId, movementType == "order
 128            return Ok(result.Select(x => new IdNameDTO(x.Id, x.ShortName)));
 129        }
 130
 131        /// <summary>
 132        /// Выводит список уникальных КА покупателей, которые встречаются в заявках/отгрузках для текущего КА.
 133        /// </summary>
 134        /// <param name="movementType">тип документов, для которых используется фильтр. Если заявки, то передаем orders,
 135        /// <remarks>author i.rebenok</remarks>
 136        [HttpGet("ListByMovementCustomer")]
 137        [SwaggerResponse(200, "Успешно удалено", typeof(IdNameDTO))]
 138        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 139        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 140        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 141        [Authorize]
 142        public async Task<IActionResult> GetFilterListByMovementCustomer(string movementType = "orders")
 143        {
 144            var contragentId = _authUserService.IsUserPlatform() ? 0 : _authUserService.ContragentId;
 145            var result = await _contragentService.GetFilteredListByMovementCustomer(contragentId, movementType == "order
 146            return Ok(result.Select(x => new IdNameDTO(x.Id, x.ShortName)));
 147        }
 148
 149        /// <summary>
 150        /// Возвращает список контрагентов, отфильтрованных по типу Розница
 151        /// </summary>
 152        /// <remarks>author Obo\IPod\IPod</remarks>
 153        /// <param name="page">Любое значение ниже нуля изменится на 1, Страница</param>
 154        /// <param name="limit">Любое значение ниже нуля изменится на 10, Количество для отбора</param>
 155        /// <param name="filter">фильтр по значимым полям FullName / ShortName</param>
 156        /// <param name="sort">сортировка по умолчанию по id - id|desc, created_on,created_on|desc, state,state|desc, st
 157        /// <returns>Список розничных контрагентов </returns>
 158        [HttpGet("Retails")]
 159        [SwaggerResponse(200, "Успешно", typeof(IEnumerable<ClusterDTO_GET>))]
 160        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 161        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 162            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 163        public async Task<IActionResult> GetRetailContragents(int page = 1, int limit = 10, string filter = null, string
 0164        {
 0165            filter = filter.NormalizeName();
 0166            page = page < 1 ? 1 : page;
 0167            limit = limit < 1 ? 10 : limit;
 0168            var contragents = await _contragentService.GetContragentsByKind(page - 1, limit, ContragentKind.Retailer, fi
 0169            return Ok(ToShortDtoMapper().Map<List<ContragentShortDTO>>(contragents));
 0170        }
 171
 172        /// <summary>
 173        /// Возвращает список контрагентов, отфильтрованных по типу Производитель
 174        /// </summary>
 175        /// <remarks>author Obo\IPod\IPod</remarks>
 176        /// <param name="page">Любое значение ниже нуля изменится на 1, Страница</param>
 177        /// <param name="limit">Любое значение ниже нуля изменится на 10, Количество для отбора</param>
 178        /// <param name="filter">фильтр по значимым полям FullName / ShortName</param>
 179        /// <param name="sort">сортировка по умолчанию по id - id|desc, created_on,created_on|desc, state,state|desc, st
 180        /// <returns>Список контрагентов</returns>
 181        [HttpGet("Manufacturers")]
 182        [SwaggerResponse(200, "Успешно", typeof(List<ContragentShortDTO>))]
 183        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 184        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 185            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 186        public async Task<IActionResult> GetManufacturerContragents(int page = 1, int limit = 10, string filter = null, 
 0187        {
 0188            filter = filter.NormalizeName();
 0189            if (_authUserService.IsUserRetailer() || _authUserService.IsUserWholesaler())
 0190                return ForbidResult("Нет прав на выполнение этого действия");
 0191            page = page < 1 ? 1 : page;
 0192            limit = limit < 1 ? 10 : limit;
 0193            var contragents = await _contragentService.GetContragentsByKind(page - 1, limit, ContragentKind.Manufacturer
 0194            return Ok(ToShortDtoMapper().Map<List<ContragentShortDTO>>(contragents));
 0195        }
 196
 197        /// <summary>
 198        /// Возвращает список контрагентов-партнеров (партнерство определяется наличие контракта)
 199        /// </summary>
 200        /// <remarks>author i.rebenok</remarks>
 201        /// <param name="id">id контрагента</param>
 202        /// <param name="activeOnly">true - искать только по активным контрактам, false - по всем. По умолчанию true</pa
 203        /// <param name="filter">Поиск по короткому имени контрагента. Необязательное поле</param>
 204        /// <returns>Список контрагентов</returns>
 205        [HttpGet("{id}/Partners")]
 206        [SwaggerResponse(200, "Успешно", typeof(List<ContragentPartners>))]
 207        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 208        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 209            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 210        public async Task<IActionResult> GetPartners([SwaggerParameter(Required = true)] long id, bool activeOnly = true
 211        {
 212            filter = filter.NormalizeName();
 213            if (!_authUserService.IsUserPlatform() && _authUserService.ContragentId != id)
 214                return ForbidResult("Нет прав на выполнение этого действия");
 215            var contracts = await _contractService.GetSupplyContractsByContragent(id, activeOnly, filter);
 216
 217            List<ContragentPartners> partners = new List<ContragentPartners>() { };
 218            //находим все котнракты где учатсвует переданный контрагент. и выводим его партнеров
 219            foreach (var item in contracts)
 220            {
 0221                if (item.Seller.Id != id && !partners.Exists(x=> x.ContragentId == item.Seller.Id)) partners.Add(new Con
 0222                if (item.Buyer.Id != id && !partners.Exists(x => x.ContragentId == item.Buyer.Id)) partners.Add(new Cont
 223            }
 224            return Ok(partners);
 225        }
 226
 227        /// <summary>
 228        /// Возвращет контрагента по ID с полным набором полей
 229        /// </summary>
 230        /// <remarks>author Obo\IPod\IPod</remarks>
 231        /// <param name="contragentId">id записи контрагента</param>
 232        /// <returns></returns>
 233        [HttpGet("{contragentId}")]
 234        [SwaggerResponse(200, "Успешно", typeof(ContragentResponseDTO))]
 235        [SwaggerResponse(404, "Контрагент с таким id не найден", typeof(ErrorDTO))]
 236        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 237        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 238            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 239        public async Task<IActionResult> GetContragent(long contragentId)
 0240        {
 0241            if (!_authUserService.IsUserPlatform() && _authUserService.ContragentId != contragentId)
 0242                return ForbidResult("Нет прав на выполнение этого действия");
 0243            Contragent contragent = await _contragentService.GetContragent(contragentId);
 0244            if (contragent == null)
 0245            {
 0246                return NotFoundResult($"Контрагент с id={contragentId} не найден");
 247            }
 0248            return Ok(ToDtoMapper().Map<ContragentResponseDTO>(contragent));
 0249        }
 250        /// <summary>
 251        /// Возвращает контрагента по ID с сокращенным набором полей
 252        /// </summary>
 253        /// <remarks>author Obo\IPod\IPod</remarks>
 254        /// <param name="contragentId">id записи контрагента</param>
 255        /// <returns></returns>
 256        [HttpGet("Shorts/{contragentId}")]
 257        [SwaggerResponse(200, "Успешно", typeof(ContragentShortDTO))]
 258        [SwaggerResponse(404, "Контрагент с таким id не найден", typeof(ErrorDTO))]
 259        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 260        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 261            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 262        public async Task<IActionResult> GetShortContragent(long contragentId)
 0263        {
 0264            if (!_authUserService.IsUserPlatform() && _authUserService.ContragentId != contragentId && !_authUserService
 0265                return ForbidResult("Нет прав на выполнение этого действия");
 0266            _logger.LogDebug("Get contragent with short DTO");
 0267            Contragent contragent = await _contragentService.GetContragent(contragentId);
 0268            if (contragent != null)
 0269            {
 0270                IMapper mapper = ToShortDtoMapper();
 0271                return Ok(mapper.Map<Contragent, ContragentShortDTO>(contragent));
 272            }
 0273            return NotFoundResult($"Контрагент с id={contragentId} не найден");
 0274        }
 275
 276        /// <summary>
 277        /// Возвращает список контрагентов с сокращенным набором полей с пагинацией и фильтрами
 278        /// </summary>
 279        /// <remarks>author Obo\IPod</remarks>
 280        /// <param name="page">Любое значение ниже нуля изменится на 1, </param>
 281        /// <param name="limit">Любое значение ниже нуля изменится на 10, </param>
 282        /// <param name="filter">фильтр по значимым полям FullName / ShortName</param>
 283        /// <param name="sort">сортировка по умолчанию по id - id|desc, created_on,created_on|desc, state,state|desc, st
 284        /// <returns>List of ContragentShortDTO</returns>
 285        [HttpGet("Shorts")]
 286        [SwaggerResponse(200, "Успешно", typeof(List<ContragentShortDTO>))]
 287        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 288        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.ShopOwner + "," + Role.SupplierOwne
 289            + "," + Role.ShopSeller + "," + Role.SupplierSpec)]
 290        public async Task<IActionResult> GetShortContragents(int page = 1, int limit = 10, string filter = null, string 
 0291        {
 0292            filter = filter.NormalizeName();
 0293            page = page < 1 ? 1 : page;
 0294            limit = limit < 1 ? 10 : limit;
 0295            _logger.LogDebug("Get contragents list with short DTO");
 0296            List<Contragent> contragents = null;
 0297            if (_authUserService.IsUserPlatform())
 0298                contragents = await _contragentService.GetContragents(page - 1, limit, filter, sort);
 299            else
 0300                contragents = await _contragentService.GetShortContragents(page - 1, limit, filter, sort, User.IsInRole(
 0301            return Ok(ToShortDtoMapper().Map<List<ContragentShortDTO>>(contragents));
 0302        }
 303
 304        private static IMapper ToShortDtoMapper()
 0305        {
 0306            var config = new MapperConfiguration(cfg =>
 0307            {
 0308                cfg.CreateMap<Contragent, ContragentShortDTO>()
 0309                    .ForMember(d => d.KindId, e => e.MapFrom(s => (int)s.ContragentsKind.Id));
 0310            });
 0311            IMapper mapper = config.CreateMapper();
 0312            return mapper;
 0313        }
 314
 315        private static IMapper ToDtoMapper()
 0316        {
 0317            var config = new MapperConfiguration(cfg =>
 0318            {
 0319                cfg.CreateMap<Contragent, ContragentResponseDTO>()
 0320                    .ForMember(d => d.KindId, e => e.MapFrom(s => (int)s.ContragentsKind.Id));
 0321                cfg.CreateMap<Address, AddressRequestDTO>();
 0322                cfg.CreateMap<TaxSystem, TaxSystemResponseShortDTO>();
 0323                cfg.CreateMap<BankAccount, BankAccountResponseDTO>();
 0324            });
 0325            IMapper mapper = config.CreateMapper();
 0326            return mapper;
 0327        }
 328
 329    }
 330}