| | | 1 | | using Microsoft.AspNetCore.Mvc; |
| | | 2 | | using WinSolutions.Sveta.Common.Extensions; |
| | | 3 | | using SVETA.Api.Data.DTO.Cluster; |
| | | 4 | | using Microsoft.Extensions.Logging; |
| | | 5 | | using SVETA.Api.Data.Domain; |
| | | 6 | | using SVETA.Api.Data.DTO; |
| | | 7 | | using SVETA.Api.Data.DTO.Movements; |
| | | 8 | | using SVETA.Api.Services.Interfaces; |
| | | 9 | | using Swashbuckle.AspNetCore.Annotations; |
| | | 10 | | using System; |
| | | 11 | | using System.Collections.Generic; |
| | | 12 | | using System.IO; |
| | | 13 | | using System.Threading; |
| | | 14 | | using System.Threading.Tasks; |
| | | 15 | | using ClosedXML.Excel; |
| | | 16 | | using Microsoft.AspNetCore.Authorization; |
| | | 17 | | using Microsoft.AspNetCore.Builder; |
| | | 18 | | using Microsoft.AspNetCore.Mvc.ModelBinding; |
| | | 19 | | using SVETA.Api.Helpers; |
| | | 20 | | using SVETA.Api.Helpers.Authorize; |
| | | 21 | | using WinSolutions.Sveta.Server.Data.DataModel.Entities; |
| | | 22 | | using WinSolutions.Sveta.Server.Data.DataModel.Kinds; |
| | | 23 | | using WinSolutions.Sveta.Server.Domain; |
| | | 24 | | using WinSolutions.Sveta.Server.Services.Interfaces; |
| | | 25 | | using WinSolutions.Sveta.Common; |
| | | 26 | | |
| | | 27 | | namespace SVETA.Api.Controllers |
| | | 28 | | { |
| | | 29 | | /// <summary> |
| | | 30 | | /// Контроллер обработки заявок от магазина |
| | | 31 | | /// </summary> |
| | | 32 | | /// <remarks>author: aabelentsov</remarks> |
| | | 33 | | [Authorize] |
| | | 34 | | [Route("api/v1/Orders")] |
| | | 35 | | [ApiController] |
| | | 36 | | public class OrdersController : SvetaController |
| | | 37 | | { |
| | | 38 | | const string _routeUrl = "api/v1/Orders"; |
| | | 39 | | private readonly IMovementWorker _movementWorker; |
| | | 40 | | private readonly ILogger<OrdersController> _logger; |
| | | 41 | | private readonly IMovementStatusRouter _movementStatusRouter; |
| | | 42 | | private readonly IAuthenticationService _authenticationService; |
| | | 43 | | |
| | | 44 | | public OrdersController( |
| | | 45 | | IAuthenticationService authUserService, |
| | | 46 | | IMovementWorker movementWorker, |
| | | 47 | | IMovementStatusRouter movementStatusRouter, |
| | 0 | 48 | | ILogger<OrdersController> logger) : base(logger) |
| | 0 | 49 | | { |
| | 0 | 50 | | _movementWorker = movementWorker; |
| | 0 | 51 | | _logger = logger; |
| | 0 | 52 | | _movementStatusRouter = movementStatusRouter; |
| | 0 | 53 | | _authenticationService = authUserService; |
| | 0 | 54 | | } |
| | | 55 | | |
| | | 56 | | /// <summary> |
| | | 57 | | /// Возвращает отфильтрованный и отсортированный список документов |
| | | 58 | | /// </summary> |
| | | 59 | | /// <remarks>author: aabelentsov, oboligatov</remarks> |
| | | 60 | | /// <param name="id">Идентификатор документа (0 для всех)</param> |
| | | 61 | | /// <param name="documentNumber">Номер документа (null для всех)</param> |
| | | 62 | | /// <param name="customerId">Идентификтор заказчика - (контрагент) (0 для всех)</param> |
| | | 63 | | /// <param name="receiverId">Идентификтор получателя - (магазин) (0 для всех)</param> |
| | | 64 | | /// <param name="supplierId">Идентификтор поставщика - (контрагент) (0 для всех)</param> |
| | | 65 | | /// <param name="senderId">Идентификатор склада отправителя - (склад) (0 для всех)</param> |
| | | 66 | | /// <param name="fromDate">Дата начала отбора (null для всех)</param> |
| | | 67 | | /// <param name="toDate">Дата окончания отбора (null для всех)</param> |
| | | 68 | | /// <param name="statusId">Статус документа - 0 для всех</param> |
| | | 69 | | /// <param name="stateId">Состояние документа - 0 для всех</param> |
| | | 70 | | /// <param name="page">Любое значение ниже нуля изменится на 1, Страница</param> |
| | | 71 | | /// <param name="limit">Любое значение ниже нуля изменится на 10, Количество для отбора - макс 100</param> |
| | | 72 | | /// <param name="sort">сортировка по умолчанию по id - id|desc,created_on,created_on|desc,state,state|desc,statu |
| | | 73 | | /// <param name="showAnonymous">отображение анонимных заявок - по умолчанию nonanonymous, anonymousonly - только |
| | | 74 | | /// <returns></returns> |
| | | 75 | | [HttpGet()] |
| | | 76 | | [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<MovementDTO>))] |
| | | 77 | | [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))] |
| | | 78 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 79 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 80 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.ShopSeller + "," + Role.SystemOpera |
| | | 81 | | public async Task<IActionResult> GetOrders(long id = 0, long customerId = 0, long receiverId = 0, long supplierI |
| | | 82 | | DateTimeOffset fromDate = default, DateTimeOffset toDate = default, int stateId = 0, int statusId = 0, strin |
| | | 83 | | string sort = null, int page = 1, int limit = 10, string showAnonymous = "nonanonymous") |
| | 0 | 84 | | { |
| | 0 | 85 | | documentNumber = documentNumber.NormalizeName(); |
| | 0 | 86 | | page = page < 1 ? 1 : page; |
| | 0 | 87 | | limit = limit < 1 ? 10 : limit; |
| | | 88 | | |
| | 0 | 89 | | var requestParam = new MovementParam(id, customerId, receiverId, supplierId,senderId, fromDate.GetStartOfDat |
| | 0 | 90 | | MovementKind.Order, stateId, statusId, documentNumber,page, limit, sort, default, showAnonymous); |
| | 0 | 91 | | PaginatedData<List<MovementDTO>> orders = await _movementWorker.GetMovements(requestParam); |
| | | 92 | | |
| | 0 | 93 | | var param = getResponseParamUrl(customerId, receiverId, supplierId, fromDate, |
| | 0 | 94 | | toDate, stateId, |
| | 0 | 95 | | statusId, senderId); |
| | 0 | 96 | | var response = new BaseResponseDTO<MovementDTO>(_routeUrl, page, limit, orders.TotalFilteredCount, |
| | 0 | 97 | | orders.TotalCount, sort, param: param) |
| | 0 | 98 | | { |
| | 0 | 99 | | Data = orders.Result ?? new List<MovementDTO>() |
| | 0 | 100 | | }; |
| | 0 | 101 | | return Ok(response); |
| | 0 | 102 | | } |
| | | 103 | | |
| | | 104 | | string getResponseParamUrl(long customerId, long receiverId, long supplierId, DateTimeOffset fromDate, DateTimeO |
| | 0 | 105 | | { |
| | 0 | 106 | | var param = ""; |
| | 0 | 107 | | if (customerId != 0) |
| | 0 | 108 | | param += $"customerId={customerId}"; |
| | 0 | 109 | | if (receiverId != 0) |
| | 0 | 110 | | param += $"&receiverId={receiverId}"; |
| | 0 | 111 | | if (supplierId != 0) |
| | 0 | 112 | | param += $"&supplierId={supplierId}"; |
| | 0 | 113 | | if (senderId != 0) |
| | 0 | 114 | | param += $"&senderId={senderId}"; |
| | | 115 | | //if (fromDate.HasValue) |
| | 0 | 116 | | param += $"&fromDate={fromDate.ToISOString()}"; |
| | | 117 | | //if (toDate.HasValue) |
| | 0 | 118 | | param += $"&toDate={toDate.ToISOString()}"; |
| | 0 | 119 | | if (stateId != 0) |
| | 0 | 120 | | param += $"&stateId={stateId}"; |
| | 0 | 121 | | if (statusId != 0) |
| | 0 | 122 | | param += $"&statusId={statusId}"; |
| | 0 | 123 | | if (param.StartsWith("&")) |
| | 0 | 124 | | param = param.Trim(new char[] { '&' }); |
| | 0 | 125 | | return param; |
| | 0 | 126 | | } |
| | | 127 | | |
| | | 128 | | /// <summary> |
| | | 129 | | /// Возвращает количество заказов |
| | | 130 | | /// </summary> |
| | | 131 | | /// <remarks>author: aabelentsov</remarks> |
| | | 132 | | /// <param name="documentNumber">Номер документа (null для всех)</param> |
| | | 133 | | /// <param name="customerId">Идентификтор заказчика - (контрагент) (0 для всех)</param> |
| | | 134 | | /// <param name="receiverId">Идентификтор получателя - (магазин) (0 для всех)</param> |
| | | 135 | | /// <param name="supplierId">Идентификтор поставщика - (контрагент) (0 для всех)</param> |
| | | 136 | | /// <param name="fromDate">Дата начала отбора (null для всех)</param> |
| | | 137 | | /// <param name="toDate">Дата окончания отбора (null для всех)</param> |
| | | 138 | | /// <param name="statusId">Статус документа - 0 для всех</param> |
| | | 139 | | /// <param name="stateId">Состояние документа - 0 для всех</param> |
| | | 140 | | /// <returns></returns> |
| | | 141 | | [HttpGet("Count")] |
| | | 142 | | [SwaggerResponse(200, "Успешно", typeof(CountDTO))] |
| | | 143 | | [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))] |
| | | 144 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 145 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 146 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.ShopSeller + "," + Role.SystemOpera |
| | | 147 | | public async Task<IActionResult> GetCountOrders(long customerId = 0, long receiverId = 0, long supplierId = 0, l |
| | | 148 | | DateTimeOffset fromDate = default, DateTimeOffset toDate = default, int stateId = 0, int statusId = 0, |
| | | 149 | | string documentNumber = null) |
| | 0 | 150 | | { |
| | 0 | 151 | | documentNumber = documentNumber.NormalizeName(); |
| | 0 | 152 | | var requestParam = new MovementParam(customerId, receiverId, supplierId,senderId, fromDate.GetStartOfDate(), |
| | 0 | 153 | | MovementKind.Order, stateId, statusId, documentNumber); |
| | 0 | 154 | | return Ok(new CountDTO(await _movementWorker.GetCountMovement(requestParam))); |
| | 0 | 155 | | } |
| | | 156 | | |
| | | 157 | | /// <summary> |
| | | 158 | | /// Возвращает отфильтрованный и отсортированный список документов |
| | | 159 | | /// </summary> |
| | | 160 | | /// <remarks>author: aabelentsov, oboligatov</remarks> |
| | | 161 | | /// <param name="id">Идентификатор документа (0 для всех)</param> |
| | | 162 | | /// <param name="documentNumber">Номер документа (null для всех)</param> |
| | | 163 | | /// <param name="customerId">Идентификтор заказчика - (контрагент) (0 для всех)</param> |
| | | 164 | | /// <param name="receiverId">Идентификтор получателя - (магазин) (0 для всех)</param> |
| | | 165 | | /// <param name="supplierId">Идентификтор поставщика - (контрагент) (0 для всех)</param> |
| | | 166 | | /// <param name="fromDate">Дата начала отбора (null для всех)</param> |
| | | 167 | | /// <param name="toDate">Дата окончания отбора (null для всех)</param> |
| | | 168 | | /// <param name="statusId">Статус документа - 0 для всех</param> |
| | | 169 | | /// <param name="stateId">Состояние документа - 0 для всех</param> |
| | | 170 | | /// <param name="sort">сортировка по умолчанию по id - id|desc,created_on,created_on|desc,state,state|desc,statu |
| | | 171 | | /// <param name="showAnonymous">отображение анонимных заявок - по умолчанию nonanonymous, anonymousonly - только |
| | | 172 | | /// <returns></returns> |
| | | 173 | | [HttpGet("ExcelOrders")] |
| | | 174 | | [SwaggerResponse(200, "Успешно", typeof(File))] |
| | | 175 | | [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))] |
| | | 176 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 177 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 178 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.ShopSeller + "," + Role.SystemOpera |
| | | 179 | | public async Task<IActionResult> GetOrdersExcel(long id = 0, long customerId = 0, long receiverId = 0, long supp |
| | | 180 | | DateTimeOffset fromDate = default, DateTimeOffset toDate = default, int stateId = 0, int statusId = 0, strin |
| | | 181 | | string sort = null, string showAnonymous = "nonanonymous") |
| | 0 | 182 | | { |
| | 0 | 183 | | documentNumber = documentNumber.NormalizeName(); |
| | | 184 | | |
| | 0 | 185 | | var requestParam = new MovementParam(id, customerId, receiverId, supplierId, senderId, fromDate.GetStartOfDa |
| | 0 | 186 | | toDate.GetEndOfDate(), MovementKind.Order, stateId, statusId, documentNumber,0, Int32.MaxValue, |
| | 0 | 187 | | sort, default, showAnonymous, true); |
| | 0 | 188 | | PaginatedData<List<MovementDTO>> orders = await _movementWorker.GetMovements(requestParam); |
| | 0 | 189 | | using var book = new XLWorkbook(); |
| | 0 | 190 | | var worksheet = book.Worksheets.Add("Report"); |
| | 0 | 191 | | var currentRow = 1; |
| | 0 | 192 | | worksheet.Cell(currentRow, 1).Value = "№п/п"; |
| | 0 | 193 | | worksheet.Cell(currentRow, 2).Value = "Дата создания"; |
| | 0 | 194 | | worksheet.Cell(currentRow, 3).Value = "Номер документа"; |
| | 0 | 195 | | worksheet.Cell(currentRow, 4).Value = "Заказчик"; |
| | 0 | 196 | | worksheet.Cell(currentRow, 5).Value = "Поставщик"; |
| | 0 | 197 | | worksheet.Cell(currentRow, 6).Value = "Получатель"; |
| | 0 | 198 | | worksheet.Cell(currentRow, 7).Value = "Отправитель"; |
| | 0 | 199 | | worksheet.Cell(currentRow, 8).Value = "Статус"; |
| | 0 | 200 | | worksheet.Cell(currentRow, 9).Value = "Сумма"; |
| | 0 | 201 | | worksheet.Cell(currentRow, 10).Value = "Количество позиций"; |
| | 0 | 202 | | worksheet.Cell(currentRow, 11).Value = "Получение заказа"; |
| | 0 | 203 | | int count = 1; |
| | 0 | 204 | | foreach (var order in orders.Result) |
| | 0 | 205 | | { |
| | 0 | 206 | | currentRow++; |
| | 0 | 207 | | worksheet.Cell(currentRow, 1).Value = count; |
| | 0 | 208 | | worksheet.Cell(currentRow, 2).Value = order.CreationDateTime; |
| | 0 | 209 | | worksheet.Cell(currentRow, 3).Value = order.DocumentNumber; |
| | 0 | 210 | | worksheet.Cell(currentRow, 4).Value = order.Customer.ShortName; |
| | 0 | 211 | | worksheet.Cell(currentRow, 5).Value = order.Supplier.ShortName; |
| | 0 | 212 | | worksheet.Cell(currentRow, 6).Value = order.Receiver.Name; |
| | 0 | 213 | | worksheet.Cell(currentRow, 7).Value = order.Sender.Name; |
| | 0 | 214 | | worksheet.Cell(currentRow, 8).Value = order.MovementStatus.Name; |
| | 0 | 215 | | worksheet.Cell(currentRow, 9).Value = order.Sum; |
| | 0 | 216 | | worksheet.Cell(currentRow, 10).Value = order.ItemsCount; |
| | 0 | 217 | | worksheet.Cell(currentRow, 11).Value = order.DeliveryType?.Name; |
| | 0 | 218 | | } |
| | 0 | 219 | | using var stream = new MemoryStream(); |
| | 0 | 220 | | book.SaveAs(stream); |
| | 0 | 221 | | var content = stream.ToArray(); |
| | 0 | 222 | | return File(content, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| | 0 | 223 | | "ordersList.xlsx"); |
| | 0 | 224 | | } |
| | | 225 | | |
| | | 226 | | /// <summary> |
| | | 227 | | /// Назначает заявке тип доставки |
| | | 228 | | /// </summary> |
| | | 229 | | /// <param name="id">id заявки</param> |
| | | 230 | | /// <param name="data">id типа доставки</param> |
| | | 231 | | /// <returns></returns> |
| | | 232 | | [HttpPatch("{id}/DeliveryType")] |
| | | 233 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 234 | | [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))] |
| | | 235 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 236 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 237 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser)] |
| | | 238 | | public async Task<IActionResult> SetDeliveryType(long id, [FromBody] DeliveryTypeOrderRequestDTO data) |
| | 0 | 239 | | { |
| | 0 | 240 | | await _movementWorker.SetDeliveryType(id, data.DeliveryTypeId); |
| | 0 | 241 | | return Ok(); |
| | 0 | 242 | | } |
| | | 243 | | |
| | | 244 | | /// <summary> |
| | | 245 | | /// Возвращает кол-во корзин анонима с указанием товарного состава, складов и возможных магазинов для слияния |
| | | 246 | | /// </summary> |
| | | 247 | | /// <returns></returns> |
| | | 248 | | [HttpGet("GetAnonymousCache")] |
| | | 249 | | [SwaggerResponse(200, "Успешно", typeof(AnonymousMovementMergeDto))] |
| | | 250 | | [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))] |
| | | 251 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 252 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 253 | | public async Task<IActionResult> GetAnonymousCaсhe() |
| | 0 | 254 | | { |
| | 0 | 255 | | if (_authenticationService.ContragentKindId != (long)ContragentKind.Retailer) |
| | 0 | 256 | | return Ok(new AnonymousMovementMergeDto { Cache = new List<AnonymousCache>() }); |
| | 0 | 257 | | return Ok(await _movementWorker.GetAnonymousCache()); |
| | 0 | 258 | | } |
| | | 259 | | |
| | | 260 | | /// <summary> |
| | | 261 | | /// Добавляет товар из анонимной заявки в заявку магазина. |
| | | 262 | | /// </summary> |
| | | 263 | | /// <param name="orderId">Идентификатор анонимной заявки</param> |
| | | 264 | | /// <param name="goodId">Идентификатор товара</param> |
| | | 265 | | /// <param name="request">Объект с идентификатором магазина для добавления</param> |
| | | 266 | | /// <returns>Строка с информацией об изменении цены товара</returns> |
| | | 267 | | [HttpPost("{orderId}/AddAnonymousGoodToOrder/{goodId}")] |
| | | 268 | | [SwaggerResponse(200, "Успешно", typeof(MessageDto))] |
| | | 269 | | [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))] |
| | | 270 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 271 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 272 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser)] |
| | | 273 | | public async Task<IActionResult> AddAnonymousGoodToOrder(long orderId, long goodId, |
| | | 274 | | [FromBody] MovementDepartmentRequestDto request) |
| | 0 | 275 | | { |
| | 0 | 276 | | return Ok(await _movementWorker.AddAnonymousGoodToOrder(orderId, goodId, request.DepartmentId)); |
| | 0 | 277 | | } |
| | | 278 | | |
| | | 279 | | /// <summary> |
| | | 280 | | /// Очищает анонимую заявку |
| | | 281 | | /// </summary> |
| | | 282 | | /// <param name="orderId"></param> |
| | | 283 | | /// <returns></returns> |
| | | 284 | | [HttpPost("ClearAnonymousCache/{orderId}")] |
| | | 285 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 286 | | [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))] |
| | | 287 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 288 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 289 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser)] |
| | | 290 | | public async Task<IActionResult> ClearAnonymousCaсhe(long orderId) |
| | 0 | 291 | | { |
| | 0 | 292 | | await _movementWorker.ClearAnonymousMovement(orderId); |
| | 0 | 293 | | return Ok(); |
| | 0 | 294 | | } |
| | | 295 | | |
| | | 296 | | /// <summary> |
| | | 297 | | /// Возвращает заказ магазина |
| | | 298 | | /// </summary> |
| | | 299 | | /// <remarks>author: aabelentsov</remarks> |
| | | 300 | | /// <param name="id">Идентификатор заказа</param> |
| | | 301 | | /// <param name="isAnonym"></param> |
| | | 302 | | /// <returns>Заказ магазина</returns> |
| | | 303 | | /// <response code="404">Не нашел заказ по id</response> |
| | | 304 | | /// <response code="200">Заказ</response> |
| | | 305 | | [HttpGet("{id}")] |
| | | 306 | | [SwaggerResponse(200, "Успешно", typeof(MovementDTO))] |
| | | 307 | | [SwaggerResponse(400, "Ошибка при подготовке документа к отдаче", typeof(ErrorDTO))] |
| | | 308 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 309 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 310 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 311 | | [AllowAnonymous] |
| | | 312 | | public async Task<IActionResult> GetOrder(long id, bool isAnonym = false) |
| | 0 | 313 | | { |
| | 0 | 314 | | isAnonym = isAnonym == false ? _authenticationService.IsAnonym() : isAnonym; |
| | 0 | 315 | | MovementDTO order = await _movementWorker.GetMovement(id, MovementKind.Order, isAnonym); |
| | 0 | 316 | | return Ok(order); |
| | 0 | 317 | | } |
| | | 318 | | |
| | | 319 | | /// <summary> |
| | | 320 | | /// Возвращает активный черновик для магазина |
| | | 321 | | /// </summary> |
| | | 322 | | /// <param name="departmentId">департамент - магазин</param> |
| | | 323 | | /// <returns></returns> |
| | | 324 | | [HttpGet("Draft")] |
| | | 325 | | [SwaggerResponse(200, "Успешно", typeof(MovementDTO))] |
| | | 326 | | [SwaggerResponse(400, "Ошибка при подготовке документа к отдаче", typeof(ErrorDTO))] |
| | | 327 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 328 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 329 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 330 | | [AllowAnonymous] |
| | | 331 | | public async Task<IActionResult> GetCurrentDraft(long departmentId) |
| | 0 | 332 | | { |
| | 0 | 333 | | MovementDTO order = _authenticationService.IsAnonym() ? await _movementWorker.CreateAnnonymMovement(_authent |
| | 0 | 334 | | : await _movementWorker.CreateEmptyMovement((long)MovementKind.Order, department |
| | 0 | 335 | | ?? throw new ArgumentException(); |
| | 0 | 336 | | return Ok(order); |
| | 0 | 337 | | } |
| | | 338 | | |
| | | 339 | | /// <summary> |
| | | 340 | | /// Создает заказ |
| | | 341 | | /// </summary> |
| | | 342 | | /// <remarks>author: aabelentsov</remarks> |
| | | 343 | | /// <param name="requestDto">Объект с идентификатором Подразделения на которое создается заявка</param> |
| | | 344 | | /// <returns> Id заказа</returns> |
| | | 345 | | [HttpPost()] |
| | | 346 | | [SwaggerResponse(201, "Успешно", typeof(MovementDTO))] |
| | | 347 | | [SwaggerResponse(400, "Документ невозможно создать", typeof(ErrorDTO))] |
| | | 348 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 349 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 350 | | [AllowAnonymous] |
| | | 351 | | public async Task<IActionResult> CreateOrder(MovementDepartmentRequestDto requestDto) |
| | 0 | 352 | | { |
| | 0 | 353 | | MovementDTO movementDto = _authenticationService.IsAnonym() |
| | 0 | 354 | | ? await _movementWorker.CreateAnnonymMovement(_authenticationService.AnonymousUuid, requestDto.Departmen |
| | 0 | 355 | | : await _movementWorker.CreateEmptyMovement((long) MovementKind.Order, requestDto.DepartmentId); |
| | 0 | 356 | | return CreatedAtAction("GetOrder", new { id = movementDto.Id }, movementDto); |
| | 0 | 357 | | } |
| | | 358 | | |
| | | 359 | | /// <summary> |
| | | 360 | | /// Создает заказа на базе отгрузки |
| | | 361 | | /// </summary> |
| | | 362 | | /// <param name="requestDto">Объект с документом основанием</param> |
| | | 363 | | /// <returns></returns> |
| | | 364 | | [HttpPost("CreateOnBase")] |
| | | 365 | | [SwaggerResponse(201, "Успешно", typeof(MovementDTO))] |
| | | 366 | | [SwaggerResponse(400, "Ошибка", typeof(ErrorDTO))] |
| | | 367 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 368 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 369 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 370 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser)] |
| | | 371 | | public async Task<IActionResult> CreateOnBaseShipment([FromBody] MovementCreateOnBaseDto requestDto) |
| | 0 | 372 | | { |
| | 0 | 373 | | MovementDTO mDto = await _movementWorker.CreateMovementOnBase(requestDto.MovementId, MovementKind.Order); |
| | 0 | 374 | | return CreatedAtAction("GetOrder", new { id = mDto.Id }, mDto); |
| | 0 | 375 | | } |
| | | 376 | | |
| | | 377 | | /// <summary> |
| | | 378 | | /// Клонирование заявки магазина в новую заявку |
| | | 379 | | /// </summary> |
| | | 380 | | /// <remarks>author: aabelentsov</remarks> |
| | | 381 | | /// <param name="id">Идентификтор заявки донора</param> |
| | | 382 | | /// <param name="departmentId">Идентификатор магазина</param> |
| | | 383 | | /// <param name="request">Объект с идентификтором подразделения в который копируется документ</param> |
| | | 384 | | /// <returns>Объект заявки</returns> |
| | | 385 | | [HttpPost("{id}/Clone")] |
| | | 386 | | [SwaggerResponse(201, "Успешно", typeof(MovementDTO))] |
| | | 387 | | [SwaggerResponse(400, "Документ невозможно создать", typeof(ErrorDTO))] |
| | | 388 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 389 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 390 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 391 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser)] |
| | | 392 | | public async Task<IActionResult> CloneOrder(long id, MovementDepartmentRequestDto request) |
| | 0 | 393 | | { |
| | 0 | 394 | | MovementDTO mDto = await _movementWorker.CloneMovement(id, request.DepartmentId); |
| | 0 | 395 | | return CreatedAtAction("GetOrder", new { id = mDto.Id }, mDto); |
| | 0 | 396 | | } |
| | | 397 | | |
| | | 398 | | /// <summary> |
| | | 399 | | /// Возвращает список товаров в заявке |
| | | 400 | | /// </summary> |
| | | 401 | | /// <param name="id">Идентификатор документа</param> |
| | | 402 | | /// <param name="filter">Строка фильтра по имени товара</param> |
| | | 403 | | /// <param name="sort">сортировка id - по умолчанию, id|desc, name, name|desc, created_on, created_on|desc, pric |
| | | 404 | | /// <param name="page">Номер страницы для отбора, 1 - по умолчанию, меньше или 0 - изменится на 1</param> |
| | | 405 | | /// <param name="limit">Лимит отбора, 10 - по умолчанию, меньше или 0 - изменится на 10</param> |
| | | 406 | | /// <returns></returns> |
| | | 407 | | [HttpGet("{id}/Items")] |
| | | 408 | | [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<MovementItemResponseDTO>))] |
| | | 409 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 410 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 411 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 412 | | //[Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.ShopSeller + "," + Role.SystemOpe |
| | | 413 | | [AllowAnonymous] |
| | | 414 | | public async Task<IActionResult> GetItems(long id, string filter, string sort, int page = 1, int limit = 10) |
| | 0 | 415 | | { |
| | 0 | 416 | | filter = filter.NormalizeName(); |
| | 0 | 417 | | page = page < 1 ? 1 : page; |
| | 0 | 418 | | limit = limit < 1 ? 10 : limit; |
| | 0 | 419 | | var result = await _movementWorker.GetMovementItems(id, MovementKind.Order, filter, sort, page, limit); |
| | | 420 | | |
| | 0 | 421 | | var response = new BaseResponseDTO<MovementItemResponseDTO>($"{_routeUrl}/{id}/Items", page, limit, |
| | 0 | 422 | | result.TotalFilteredCount, |
| | 0 | 423 | | result.TotalCount, sort, param: $"filter={filter}") |
| | 0 | 424 | | { |
| | 0 | 425 | | Data = result.Result |
| | 0 | 426 | | }; |
| | 0 | 427 | | return Ok(response); |
| | 0 | 428 | | } |
| | | 429 | | |
| | | 430 | | /// <summary> |
| | | 431 | | /// Добавляет позицию к заказу |
| | | 432 | | /// </summary> |
| | | 433 | | /// <remarks>author: aabelentsov</remarks> |
| | | 434 | | /// <param name="id">Идентификатор документа</param> |
| | | 435 | | /// <param name="mItemDto">Объект для добавления</param> |
| | | 436 | | /// <returns>NoContent</returns> |
| | | 437 | | [HttpPost("{id}/Items")] |
| | | 438 | | [SwaggerResponse(200, "Успешно", typeof(MovementItemResponseDTO))] |
| | | 439 | | [SwaggerResponse(400, "Не найден заказ, не найден товар", typeof(ErrorDTO))] |
| | | 440 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 441 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 442 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 443 | | [AllowAnonymous] |
| | | 444 | | public async Task<IActionResult> AddItemToOrder(long id, [FromBody] MovementItemRequestDTO mItemDto) |
| | 0 | 445 | | { |
| | 0 | 446 | | return Ok(await _movementWorker.AddItemToMovement(id, mItemDto)); |
| | 0 | 447 | | } |
| | | 448 | | |
| | | 449 | | /// <summary> |
| | | 450 | | /// Изменяет количество товара в заявке |
| | | 451 | | /// </summary> |
| | | 452 | | /// <remarks>author: aabelentsov</remarks> |
| | | 453 | | /// <param name="id">Идентификатор документа</param> |
| | | 454 | | /// <param name="itemId">Идентификтора позиции</param> |
| | | 455 | | /// <param name="request">Объект с изменениями</param> |
| | | 456 | | /// <returns>No Content</returns> |
| | | 457 | | /// <response code="204">Количество товара изменено</response> |
| | | 458 | | /// <response code="404">Не найден заказ, позиция заказа</response> |
| | | 459 | | /// <response code="400">Количество товара не соответствует требованиям</response> |
| | | 460 | | [HttpPut("{id}/Items/{itemId}")] |
| | | 461 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 462 | | [SwaggerResponse(400, "Количество товара не соответствует требованиям", typeof(ErrorDTO))] |
| | | 463 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 464 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 465 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 466 | | [AllowAnonymous] |
| | | 467 | | public async Task<IActionResult> ChangeQuantity(long id, long itemId, [FromBody] MovementChangeQuantityRequestDt |
| | 0 | 468 | | { |
| | 0 | 469 | | if (request.Quantity <= 0) |
| | 0 | 470 | | throw new ArgumentException("Количество товара в заказе должно быть больше 0"); |
| | | 471 | | |
| | 0 | 472 | | await _movementWorker.ChangeQuantityInMovement(id, itemId, request.Quantity.Value, null); |
| | 0 | 473 | | return Ok(); |
| | 0 | 474 | | } |
| | | 475 | | /// <summary> |
| | | 476 | | /// Удаляет позицию из заказа |
| | | 477 | | /// </summary> |
| | | 478 | | /// <remarks>author: aabelentsov</remarks> |
| | | 479 | | /// <param name="id">Идентификатор документа</param> |
| | | 480 | | /// <param name="itemId">Идентификатор позиции</param> |
| | | 481 | | /// <returns></returns> |
| | | 482 | | [HttpDelete("{id}/Items/{itemId}")] |
| | | 483 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 484 | | [SwaggerResponse(400, "Статус заказа отличен от черновика", typeof(ErrorDTO))] |
| | | 485 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 486 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 487 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 488 | | [AllowAnonymous] |
| | | 489 | | public async Task<IActionResult> RemoveItemFromOrder(long id, long itemId) |
| | 0 | 490 | | { |
| | 0 | 491 | | await _movementWorker.RemoveItemFromMovement(id, itemId); |
| | 0 | 492 | | return Ok(); |
| | 0 | 493 | | } |
| | | 494 | | |
| | | 495 | | /// <summary> |
| | | 496 | | /// Отправка заказа на выполнение |
| | | 497 | | /// </summary> |
| | | 498 | | /// <remarks>author: aabelentsov</remarks> |
| | | 499 | | /// <param name="id">Идентификатор документа</param> |
| | | 500 | | /// <returns>Переводит заказ в состояние Активен, в статус - В обработке</returns> |
| | | 501 | | /// <response code="404">Не найден заказ</response> |
| | | 502 | | /// <response code="400">В заказе есть ошибки</response> |
| | | 503 | | /// <response code="204">Заказ переведен в статус в Обработке</response> |
| | | 504 | | [HttpPost("{id}/Send")] |
| | | 505 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 506 | | [SwaggerResponse(400, "Статус заказа отличен от черновика", typeof(ErrorDTO))] |
| | | 507 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 508 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 509 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 510 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser)] |
| | | 511 | | public async Task<IActionResult> SendOrderToSupplier(long id) |
| | 0 | 512 | | { |
| | 0 | 513 | | await _movementStatusRouter.SetNextStatus(id, MovementStatusKeys.send); |
| | 0 | 514 | | return Ok(); |
| | 0 | 515 | | } |
| | | 516 | | |
| | | 517 | | |
| | | 518 | | /// <summary> |
| | | 519 | | /// Подтверждает заказ |
| | | 520 | | /// </summary> |
| | | 521 | | /// <remarks>author: aabelentsov</remarks> |
| | | 522 | | /// <param name="id">Идентификатор документа</param> |
| | | 523 | | /// <returns>Переводит заказ в статус В обработке</returns> |
| | | 524 | | [HttpPost("{id}/Confirm")] |
| | | 525 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 526 | | [SwaggerResponse(400, "Статус заказа не в обработке, стояние записи заказа не активна", typeof(ErrorDTO))] |
| | | 527 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 528 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 529 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 530 | | [Authorize(Roles = Role.SystemAdmin)] |
| | | 531 | | public async Task<IActionResult> ConfirmOrder(long id) |
| | 0 | 532 | | { |
| | | 533 | | |
| | 0 | 534 | | await _movementStatusRouter.SetNextStatus(id, MovementStatusKeys.confirm); |
| | | 535 | | |
| | 0 | 536 | | return Ok(); |
| | 0 | 537 | | } |
| | | 538 | | |
| | | 539 | | /// <summary> |
| | | 540 | | /// Отказ от заявки |
| | | 541 | | /// </summary> |
| | | 542 | | /// <remarks>author: aabelentsov</remarks> |
| | | 543 | | /// <param name="id">Идентификатор заявки</param> |
| | | 544 | | /// <param name="request">Причина отказа в исполнении заявки</param> |
| | | 545 | | /// <returns></returns> |
| | | 546 | | [HttpPost("{id}/Reject")] |
| | | 547 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 548 | | [SwaggerResponse(400, "Ошибка", typeof(ErrorDTO))] |
| | | 549 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 550 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 551 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 552 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.SystemAdmin)] |
| | | 553 | | public async Task<IActionResult> Reject(long id, [FromBody] MovementCommentRequestDto request) |
| | 0 | 554 | | { |
| | 0 | 555 | | await _movementStatusRouter.SetNextStatus(id, MovementStatusKeys.rejectOrder, request.Comment); |
| | 0 | 556 | | return Ok(); |
| | 0 | 557 | | } |
| | | 558 | | |
| | | 559 | | |
| | | 560 | | /// <summary> |
| | | 561 | | /// Удаление заказа |
| | | 562 | | /// </summary> |
| | | 563 | | /// <remarks>author: aabelentsov</remarks> |
| | | 564 | | /// <param name="id">Идентификатор документа</param> |
| | | 565 | | /// <returns></returns> |
| | | 566 | | [HttpDelete("{id}")] |
| | | 567 | | [SwaggerResponse(200, "Успешно", typeof(OkResult))] |
| | | 568 | | [SwaggerResponse(400, "Ошибка", typeof(ErrorDTO))] |
| | | 569 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 570 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 571 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 572 | | [Authorize(Roles = Role.ShopOwner)] |
| | | 573 | | public async Task<IActionResult> DeleteOrder(long id) |
| | 0 | 574 | | { |
| | 0 | 575 | | await _movementWorker.DeleteMovement(id); |
| | 0 | 576 | | return Ok(); |
| | 0 | 577 | | } |
| | | 578 | | |
| | | 579 | | /// <summary> |
| | | 580 | | /// Выгрузка документа в csv/excel |
| | | 581 | | /// </summary> |
| | | 582 | | /// <remarks>author: aabelentsov</remarks> |
| | | 583 | | /// <param name="id">Идентификатор документа</param> |
| | | 584 | | /// <param name="fileType">формат файла: excel или csv. По умолчанию csv</param> |
| | | 585 | | /// <returns></returns> |
| | | 586 | | [HttpGet("{id}/DownloadOrderToFile")] |
| | | 587 | | [SwaggerResponse(302, "Успешно", typeof(File))] |
| | | 588 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 589 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 590 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 591 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.ShopSeller + "," + Role.SystemAdmin |
| | | 592 | | public async Task<IActionResult> DownloadOrderToFile(long id, string fileType = "csv") |
| | 0 | 593 | | { |
| | 0 | 594 | | fileType = fileType.ToLower(); |
| | 0 | 595 | | string fileName = "OR" + id.ToString("D8") + "_" + DateTime.UtcNow.Ticks; |
| | 0 | 596 | | fileName += fileType == "csv" ? ".csv" : ".xlsx"; |
| | 0 | 597 | | var stream = await _movementWorker.GetFile(id, MovementKind.Order, fileType); |
| | 0 | 598 | | stream.Position = 0; |
| | 0 | 599 | | if (fileType == "csv") |
| | 0 | 600 | | return File(stream, "text/csv", fileName); |
| | | 601 | | else |
| | 0 | 602 | | { |
| | 0 | 603 | | return File(stream.ToArray(), |
| | 0 | 604 | | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| | 0 | 605 | | fileName); |
| | | 606 | | } |
| | 0 | 607 | | } |
| | | 608 | | /// <summary> |
| | | 609 | | /// Печать заказа по id документа в системе |
| | | 610 | | /// </summary> |
| | | 611 | | /// <remarks>author: oafadin + aabelentsov</remarks> |
| | | 612 | | /// <param name="id">Идентификатор заказа</param> |
| | | 613 | | /// <returns></returns> |
| | | 614 | | [HttpGet("{id}/Print")] |
| | | 615 | | [SwaggerResponse(200, "Файловый поток", typeof(FileStreamResult))] |
| | | 616 | | [SwaggerResponse(400, "Ошибка", typeof(ErrorDTO))] |
| | | 617 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 618 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 619 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 620 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.ShopSeller + "," + Role.SystemAdmin |
| | | 621 | | public async Task<IActionResult> PrintOrder(long id) |
| | 0 | 622 | | { |
| | 0 | 623 | | var pdfStream = await _movementWorker.PrintOrder(id, MovementKind.Order); |
| | 0 | 624 | | return new FileStreamResult(pdfStream, "application/pdf"); |
| | 0 | 625 | | } |
| | | 626 | | |
| | | 627 | | /// <summary> |
| | | 628 | | /// Отказ от заявки - Используй метод reject |
| | | 629 | | /// </summary> |
| | | 630 | | /// <remarks>author: aabelentsov</remarks> |
| | | 631 | | /// <param name="id">Идентификатор заявки</param> |
| | | 632 | | /// <param name="request">Причина отказа в исполнении заявки</param> |
| | | 633 | | /// <returns></returns> |
| | | 634 | | [HttpPost("{id}/PlatformReject")] |
| | | 635 | | [Obsolete] |
| | | 636 | | [SwaggerResponse(200, "Успешно", typeof(EmptyResult))] |
| | | 637 | | [SwaggerResponse(400, "Ошибка", typeof(ErrorDTO))] |
| | | 638 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 639 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 640 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 641 | | [Authorize(Roles = Role.SystemAdmin)] |
| | | 642 | | public async Task<IActionResult> PlatformReject(long id, [FromBody] MovementCommentRequestDto request) |
| | 0 | 643 | | { |
| | 0 | 644 | | await _movementStatusRouter.SetNextStatus(id, MovementStatusKeys.autoReject, request.Comment); |
| | 0 | 645 | | return Ok(); |
| | 0 | 646 | | } |
| | | 647 | | |
| | | 648 | | /// <summary> |
| | | 649 | | /// Возвращает историю по заявке |
| | | 650 | | /// </summary> |
| | | 651 | | /// <remarks>author: irebenok</remarks> |
| | | 652 | | /// <param name="id">Идентификатор заявки</param> |
| | | 653 | | /// <returns></returns> |
| | | 654 | | [HttpGet("{id}/History")] |
| | | 655 | | [SwaggerResponse(200, "Успешно", typeof(List<MovementHistoryResponseDTO>))] |
| | | 656 | | [SwaggerResponse(400, "Ошибка", typeof(ErrorDTO))] |
| | | 657 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 658 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 659 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 660 | | [Authorize(Roles = Role.SystemAdmin)] |
| | | 661 | | public async Task<IActionResult> GetMovementHistory(long id) |
| | 0 | 662 | | { |
| | 0 | 663 | | var result = await _movementWorker.GetMovementHistory(id); |
| | 0 | 664 | | return Ok(result); |
| | 0 | 665 | | } |
| | | 666 | | |
| | | 667 | | /// <summary> |
| | | 668 | | /// Возвращает тип доставки для заявки |
| | | 669 | | /// </summary> |
| | | 670 | | /// <remarks>author: irebenok</remarks> |
| | | 671 | | /// <param name="id">Идентификатор заявки</param> |
| | | 672 | | /// <returns></returns> |
| | | 673 | | [HttpGet("{id}/DeliveryTypes")] |
| | | 674 | | [SwaggerResponse(200, "Успешно", typeof(ClusterDeliveryTypesResponseDTO))] |
| | | 675 | | [SwaggerResponse(400, "Ошибка", typeof(ErrorDTO))] |
| | | 676 | | [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))] |
| | | 677 | | [SwaggerResponse(404, "Не найден документ", typeof(ErrorDTO))] |
| | | 678 | | [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))] |
| | | 679 | | [Authorize(Roles = Role.ShopOwner + "," + Role.ShopMerchandiser + "," + Role.ShopSeller + "," + Role.SystemAdmin |
| | | 680 | | public async Task<IActionResult> GetOrderDeliveryType(long id) |
| | 0 | 681 | | { |
| | 0 | 682 | | var result = await _movementWorker.GetOrderDeliveryTypes(id); |
| | 0 | 683 | | return Ok(result); |
| | 0 | 684 | | } |
| | | 685 | | } |
| | | 686 | | } |