< Summary

Class:SVETA.Api.Controllers.SupplyContractsController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/SupplyContractsController.cs
Covered lines:0
Uncovered lines:153
Coverable lines:153
Total lines:380
Line coverage:0% (0 of 153)
Covered branches:0
Total branches:74
Branch coverage:0% (0 of 74)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
GetSupplyContracts()0%0%
GetSupplyContractsCount()0%100%
GetSupplyContract()0%0%
CreateSupplyContract()0%0%
UpdateSupplyContract()0%0%
DeleteSupplyContract()0%100%
ChangeTradeRatio()0%0%
DeactivateSupplyContract()0%0%
ActivateSupplyContract()0%0%
CreateAnonymContract()0%100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Threading.Tasks;
 5using Microsoft.AspNetCore.Mvc;
 6using Microsoft.Extensions.Logging;
 7using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 8using Microsoft.AspNetCore.Authorization;
 9using SVETA.Api.Data.Domain;
 10using WinSolutions.Sveta.Server.Services.Interfaces;
 11using SVETA.Api.Data.DTO;
 12using SVETA.Api.Helpers;
 13using SVETA.Api.Helpers.Authorize;
 14using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 15using Swashbuckle.AspNetCore.Annotations;
 16using WinSolutions.Sveta.Server.Domain;
 17using WinSolutions.Sveta.Common;
 18using WinSolutions.Sveta.Common.Extensions;
 19
 20namespace SVETA.Api.Controllers
 21{
 22    [Authorize]
 23    [Route("api/v1/SupplyContracts")]
 24    [ApiController]
 25    public class SupplyContractsController : SvetaController
 26    {
 27        const string _routeUrl = "api/v1/SupplyContracts";
 28        private readonly ISupplyContractService _service;
 29        private readonly ILogger<SupplyContractsController> _logger;
 30        private readonly IDirectoriesService _dirService;
 31        private readonly IContragentService _contrService;
 32        private readonly IUserService _userService;
 33        private readonly IAuthenticationService _authService;
 34
 35        public SupplyContractsController(ISupplyContractService service, IDirectoriesService dirService, IContragentServ
 036            IUserService userService, IAuthenticationService authService, ILogger<SupplyContractsController> logger) : b
 037        {
 038            _dirService = dirService;
 039            _authService = authService;
 040            _userService = userService;
 041            _contrService = contrService;
 042            _service = service;
 043            _logger = logger;
 044        }
 45
 46        /// <summary>
 47        /// Возвращает все договора с фильтром по значимым полям  и сортировкой
 48        /// </summary>
 49        /// <remarks>author i.rebenok</remarks>
 50        /// <param name="page">Любое значение ниже нуля изменится на 1, пагинация: номер страницы</param>
 51        /// <param name="limit">Любое значение ниже нуля изменится на 10, пагинация: размер страницы</param>
 52        /// <param name="filter">фильтр по значимым полям: номер контракта или короткое имя контрагента</param>
 53        /// <param name="sortByNameDesc">сортировать по имени DESC - true or false</param>
 54        /// <param name="contragentId">Если 0, то выводить все контракты, иначе по указанному контрагенту. По умолчанию 
 55        /// <param name="active">true, если выводить только активные договора. По умолчанию false</param>
 56        [HttpGet("")]
 57        [SwaggerResponse(200, "Успешно", typeof(IEnumerable<SupplyContractDTO_GET>))]
 58        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 59        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 60        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SystemOperator)]
 61        public async Task<IActionResult> GetSupplyContracts(int page = 1, int limit = 10, string filter = null, bool sor
 062        {
 063            filter = filter.NormalizeName();
 064            page = page < 1 ? 1 : page;
 065            limit = limit < 1 ? 10 : limit;
 066            var result = await _service.GetSupplyContracts(page - 1, limit, filter, sortByNameDesc, active, contragentId
 067            var param = $"sortByNameDesc={sortByNameDesc}";
 068            var response = new BaseResponseDTO<SupplyContractDTO_GET>(_routeUrl, page, limit, result.TotalFilteredCount,
 069            {
 070                Data = result.Result.Select(x => new SupplyContractDTO_GET(x)).ToList(),
 071            };
 072            return Ok(response);
 073        }
 74
 75        /// <summary>
 76        /// Возвращает количество всех  договоров с фильтром по значимым полям
 77        /// </summary>
 78        /// <remarks>author i.rebenok</remarks>
 79        /// <param name="filter">фильтр по значимым полям: номер контракта или короткое имя контрагента</param>
 80        /// <param name="contragentId">Если 0, то выводить все контракты, иначе по указанному контрагенту. По умолчанию 
 81        /// <param name="active">true, если выводить только активные договора. По умолчанию false</param>
 82        [HttpGet("Count")]
 83        [SwaggerResponse(200, "Успешно", typeof(CountDTO))]
 84        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 85        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 86        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SystemOperator)]
 87        public async Task<IActionResult> GetSupplyContractsCount(string filter = null, long contragentId = 0, bool activ
 088        {
 089            filter = filter.NormalizeName();
 090            int result = await Task.FromResult(_service.GetSupplyContracts(1, 1, filter, true, active, contragentId).Res
 091            return Ok(new CountDTO(result));
 092        }
 93
 94        /// <summary>
 95        /// Получить договор по ID
 96        /// </summary>
 97        /// <remarks>author i.rebenok</remarks>
 98        /// <param name="id">id котракта</param>
 99        [HttpGet("{id}")]
 100        [SwaggerResponse(200, "Успешно", typeof(SupplyContractDTO_GET))]
 101        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 102        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 103        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 104        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SystemOperator)]
 105        public async Task<IActionResult> GetSupplyContract([SwaggerParameter(Required = true)] long id)
 0106        {
 0107            var result = _authService.IsUserPlatform() ? await _service.GetSupplyContract(id) : await _service.GetSupply
 0108            if (result == null)
 0109                return NotFoundResult($"Контракт с id={id} не найден");
 0110            return Ok(new SupplyContractDTO_GET(result));
 0111        }
 112
 113        /// <summary>
 114        /// Получить все контракты контрагента на основе id склада
 115        /// </summary>
 116        /// <remarks>author i.rebenok</remarks>
 117        /// <param name="warehouseId">id склада</param>
 118        /// <param name="filter">Поиск по короткому имении контрагента, не обязательное поле</param>
 119        [HttpGet("ByWarehouse")]
 120        [SwaggerResponse(200, "Успешно", typeof(IEnumerable<SupplyContractDTO_GET>))]
 121        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 122        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 123        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SystemOperator)]
 124        public async Task<IActionResult> GetSupplyContractsByWarehouse([SwaggerParameter(Required = true)] long warehous
 125        {
 126            filter = filter.NormalizeName();
 127            var contragent = await _contrService.GetContragentByWareouse(warehouseId);
 128            if (!_authService.IsUserPlatform() && _authService.ContragentId != contragent?.Id)
 129                return ForbidResult();
 130            var contracts = await _service.GetSupplyContractsByContragent(contragent.Id, false, filter);
 0131            return Ok(contracts.Select(x => new SupplyContractDTO_GET(x)));
 132        }
 133
 134        /// <summary>
 135        /// Создает контракт и возвращает созданный объект
 136        /// </summary>
 137        /// <remarks>author i.rebenok</remarks>
 138        /// <param name="scDto">SupplyContractRequestDTO</param>
 139        [HttpPost("")]
 140        [SwaggerResponse(201, "Успешно создано", typeof(SupplyContractDTO_GET))]
 141        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 142        [SwaggerResponse(400, "Некорректные входные данные", typeof(ErrorDTO))]
 143        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 144        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 145        [Authorize(Roles =Role.SystemAdmin + "," + Role.SupplierOwner)]
 146        public async Task<IActionResult> CreateSupplyContract([FromBody][SwaggerParameter(Required = true)] SupplyContra
 0147        {
 0148            if (!ModelState.IsValid)
 0149                return BadRequestResult("Некорректные входные данные");
 0150            if (scDto.BeginDate.Date > scDto.EndDate.Date)
 0151            {
 0152                return BadRequestResult("Дата начала действия контракта не может быть позже даты его окончания");
 153            }
 0154            if (scDto.ConclusionDate.Date > scDto.BeginDate.Date)
 0155            {
 0156                return BadRequestResult("Дата начала действия контракта не может быть раньше даты его заключения");
 157            }
 0158            if (scDto.Buyer == scDto.Seller)
 0159                return BadRequestResult("Участники договора не могут совпадать");
 0160            if (scDto.Seller != _authService.ContragentId && !User.IsInRole(Role.SystemAdmin))
 0161                return BadRequestResult("Запрещено заключать контракт на чужого контрагента");
 162
 0163            var contract = new SupplyContract()
 0164            {
 0165                RecState = await _dirService.GetRecordState((int)RecordState.Active),
 0166                Buyer = await _contrService.GetContragent(scDto.Buyer),
 0167                Seller = await _contrService.GetContragent(scDto.Seller),
 0168                BeginDate = scDto.BeginDate.UtcDateTime,
 0169                EndDate = scDto.EndDate.UtcDateTime,
 0170                SignOffDate = scDto.ConclusionDate.Date,
 0171                DocumentNumber = "0",
 0172                PrepaimentPercent = scDto.PrepaimentPercent,
 0173                TradeRatio = scDto.TradeRatio
 0174            };
 0175            if (contract.Buyer == null )
 0176                return NotFoundResult($"Не найден покупатель с id={scDto.Buyer}");
 0177            if (contract.Seller == null)
 0178                return NotFoundResult($"Не найден продавец с id={scDto.Seller}");
 0179            if (contract.RecState == null)
 0180                return NotFoundResult("Служебный тип записи не найден");
 0181            await _service.Create(contract);
 182           /* var contract_ = await _service.GetSupplyContract(contract.Id);
 183            contract_.DocumentNumber = "CO" + DateTime.Now.ToString("yy") + "-" + contract_.Id;
 184            await _service.Update(contract_);*/
 0185            return CreatedAtAction("GetSupplyContract", new { id = contract.Id }, new SupplyContractDTO_GET(contract));
 0186        }
 187
 188        /// <summary>
 189        /// Обновляет данные контракта
 190        /// </summary>
 191        /// <remarks>author i.rebenok</remarks>
 192        /// <param name="id">id котракта</param>
 193        /// <param name="data">SupplyContractRequestDTO</param>
 194        [HttpPut("{id}")]
 195        [SwaggerResponse(200, "Успешно обновлено", typeof(SupplyContractDTO_GET))]
 196        [SwaggerResponse(400, "Некорректные входные данные", typeof(ErrorDTO))]
 197        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 198        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 199        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 200        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner)]
 201        public async Task<IActionResult> UpdateSupplyContract([SwaggerParameter(Required = true)] long id,[FromBody] [Sw
 0202        {
 0203            if (!ModelState.IsValid)
 0204                return BadRequestResult("Некорректные входные данные");
 0205            if (data.BeginDate.Date > data.EndDate.Date)
 0206            {
 0207                return BadRequestResult("Дата начала действия контракта не может быть позже даты его окончания");
 208            }
 0209            if (data.ConclusionDate.Date > data.BeginDate.Date)
 0210            {
 0211                return BadRequestResult("Дата начала действия контракта не может быть раньше даты его заключения");
 212            }
 0213            if (data.Buyer == data.Seller)
 0214                return BadRequestResult("Участники договора не могут совпадать");
 0215            if (data.Seller !=_authService.ContragentId && !User.IsInRole(Role.SystemAdmin))
 0216                return BadRequestResult("Запрещено заключать контракт на чужого контрагента");
 0217            var contract = User.IsInRole(Role.SystemAdmin) ? await _service.GetSupplyContract(id) : await _service.GetSu
 0218            if (contract == null)
 0219                return NotFoundResult($"Контракт с id={id} не найден");
 0220            if (contract.RecState.Id == (int)RecordState.Inactive)
 0221                return BadRequestResult("Запрещено изменять деактивированный договор");
 0222            if (contract.EndDate < DateTime.UtcNow)
 0223                return BadRequestResult("Запрещено изменять договор, у которого истек срок действия");
 0224            contract.Buyer = await _contrService.GetContragent(data.Buyer);
 0225            contract.Seller = await _contrService.GetContragent(data.Seller);
 0226            contract.BeginDate = data.BeginDate.UtcDateTime;
 0227            contract.EndDate = data.EndDate.UtcDateTime;
 0228            contract.SignOffDate = data.ConclusionDate.Date;
 0229            contract.TradeRatio = data.TradeRatio;
 0230            contract.PrepaimentPercent = data.PrepaimentPercent;
 0231            if (contract.Buyer == null)
 0232                return NotFoundResult($"Покупатель с id={data.Buyer} не найден");
 0233            if (contract.Seller == null)
 0234                return NotFoundResult($"Продавец с id={data.Seller} не найден");
 0235            await _service.Update(contract);
 0236            return Ok(new SupplyContractDTO_GET(contract));
 0237        }
 238
 239        /// <summary>
 240        /// Удаляет контракт по id
 241        /// </summary>
 242        /// <remarks>author i.rebenok</remarks>
 243        /// <param name="id">id контракта</param>
 244        [HttpDelete("{id}")]
 245        [SwaggerResponse(200, "Успешно удалено", typeof(EmptyResult))]
 246        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 247        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 248        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 249        [Authorize(Roles = Role.SystemAdmin)]
 250        public async Task<IActionResult> DeleteSupplyContract([SwaggerParameter(Required = true)] long id)
 0251        {
 0252            await _service.Delete(id);
 0253            return Ok();
 0254        }
 255
 256        /// <summary>
 257        /// Изменяет коэффициент наценки в договоре
 258        /// </summary>
 259        /// <remarks>author i.rebenok</remarks>
 260        /// <param name="id">id договора</param>
 261        /// <param name="tradeRatio">новая наценка</param>
 262        [HttpPatch("{id}")]
 263        [SwaggerResponse(200, "Успешно", typeof(EmptyResult))]
 264        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 265        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 266        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 267        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner)]
 268        public async Task<IActionResult> ChangeTradeRatio([SwaggerParameter(Required = true)] long id, [SwaggerParameter
 0269        {
 0270            var contract = User.IsInRole(Role.SystemAdmin) ? await _service.GetSupplyContract(id) : await _service.GetSu
 0271            if (contract == null)
 0272                return NotFoundResult($"Контракт с id={id} не найден");
 0273            contract.TradeRatio = tradeRatio;
 0274            await _service.Update(contract);
 0275            return Ok();
 0276        }
 277
 278        /// <summary>
 279        /// Деактивирует договор по id
 280        /// </summary>
 281        /// <remarks>author i.rebenok</remarks>
 282        /// <param name="id">id договора</param>
 283        [HttpPatch("{id}/Deactivate")]
 284        [SwaggerResponse(200, "Успешно", typeof(EmptyResult))]
 285        [SwaggerResponse(404, "Нет записей", typeof(EmptyResult))]
 286        [SwaggerResponse(403, "Не разрешено для этого пользователя")]
 287        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(string))]
 288        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner)]
 289        public async Task<IActionResult> DeactivateSupplyContract([SwaggerParameter(Required = true)] long id)
 0290        {
 0291            var contract = User.IsInRole(Role.SystemAdmin) ? await _service.GetSupplyContract(id) : await _service.GetSu
 0292            if (contract == null)
 0293                return NotFoundResult($"Контракт с id={id} не найден");
 0294            if (contract.RecState.Id != (int)RecordState.Inactive)
 0295            {
 0296                contract.RecState = await _dirService.GetRecordState((int)RecordState.Inactive);
 0297                await _service.Update(contract);
 0298            }
 0299            return Ok();
 0300        }
 301
 302        /// <summary>
 303        /// Активирует договор по id
 304        /// </summary>
 305        /// <remarks>author i.rebenok</remarks>
 306        /// <param name="id">id договора</param>
 307        [HttpPatch("{id}/Activate")]
 308        [SwaggerResponse(200, "Успешно", typeof(EmptyResult))]
 309        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 310        [SwaggerResponse(400, "Нельзя активировать договор, который ранее был деактивирован", typeof(ErrorDTO))]
 311        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 312        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 313        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner)]
 314        public async Task<IActionResult> ActivateSupplyContract([SwaggerParameter(Required = true)] long id)
 0315        {
 0316            var contract = User.IsInRole(Role.SystemAdmin) ? await _service.GetSupplyContract(id) : await _service.GetSu
 0317            if (contract == null)
 0318                return NotFoundResult($"Контракт с id={id} не найден");
 0319            if (contract.RecState.Id == (int)RecordState.Inactive)
 0320                return BadRequestResult("Нельзя активировать договор, который ранее был деактивирован");
 321            else
 0322            {
 0323                contract.RecState = await _dirService.GetRecordState((int)RecordState.Active);
 0324                await _service.Update(contract);
 0325            }
 0326            return Ok();
 0327        }
 328
 329        /// <summary>
 330        /// Проверяет договор на валидность. Если существует активный договор с указанными контрагентами и новый диапозо
 331        /// то возвращается существующий договор. Нужно юзеру предложить его деактивировать
 332        /// </summary>
 333        /// <remarks>author i.rebenok</remarks>
 334        /// <param name="buyerId">id контрагента Покупателя</param>
 335        /// <param name="sellerId">id контрагента Продавца</param>
 336        /// <param name="beginDate">Дата начала действия</param>
 337        /// <param name="endDate">Дата окончания действия</param>
 338        [HttpGet("ValidateContract")]
 339        [SwaggerResponse(200, "Успешно", typeof(SupplyContractDTO_GET))]
 340        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 341        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 342        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner + "," + Role.SystemOperator)]
 343        public async Task<IActionResult> CheckSupplyContractValid([SwaggerParameter(Required = true)] long buyerId, [Swa
 344            [SwaggerParameter(Required = true)] DateTimeOffset beginDate, [SwaggerParameter(Required = true)] DateTimeOf
 345        {
 346            if (!_authService.IsUserPlatform() && sellerId != _authService.ContragentId)
 347                return ForbidResult();
 348            var result = await _service.GetActiveContracts(buyerId, sellerId, beginDate.UtcDateTime, endDate.UtcDateTime
 0349            return Ok(result.Select(x => new SupplyContractDTO_GET(x)));
 350        }
 351
 352        /// <summary>
 353        /// Службеный метод. Создает контракт между указанным поставщиком и анонимным КА
 354        /// </summary>
 355        /// <remarks>author i.rebenok</remarks>
 356        /// <param name="sellerId">id продавца</param>
 357        [HttpPost("AnonymContract")]
 358        [SwaggerResponse(200, "Успешно", typeof(SupplyContractDTO_GET))]
 359        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 360        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 361        [Authorize(Roles = Role.SystemAdmin)]
 362        public async Task<IActionResult> CreateAnonymContract([SwaggerParameter(Required = true)] long sellerId)
 0363        {
 0364            var contract = new SupplyContract()
 0365            {
 0366                RecState = await _dirService.GetRecordState((int)RecordState.Active),
 0367                Buyer = await _contrService.GetContragent(-1), //аноним
 0368                Seller = await _contrService.GetContragent(sellerId),
 0369                BeginDate = DateTime.Now.Date,
 0370                EndDate = new DateTime(2029, 12, 31, 23, 59, 59),
 0371                SignOffDate = DateTime.Now.AddDays(-1),
 0372                DocumentNumber = "0",
 0373                PrepaimentPercent = 100,
 0374                TradeRatio = 100
 0375            };
 0376            await _service.Create(contract);
 0377            return CreatedAtAction("GetSupplyContract", new { id = contract.Id }, new SupplyContractDTO_GET(contract));
 0378        }
 379    }
 380}