< Summary

Class:SVETA.Api.Controllers.WorkSchedulesController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/WorkSchedulesController.cs
Covered lines:0
Uncovered lines:88
Coverable lines:88
Total lines:200
Line coverage:0% (0 of 88)
Covered branches:0
Total branches:58
Branch coverage:0% (0 of 58)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
GetSchedules()0%0%
GetSchedule()0%0%
CreateSchedule()0%0%
UpdateSchedule()0%0%
DeleteSchedule()0%0%

File(s)

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

#LineLine coverage
 1using System;
 2using System.IO;
 3using System.Collections.Generic;
 4using System.Linq;
 5using System.Threading.Tasks;
 6using Microsoft.AspNetCore.Mvc;
 7using Microsoft.Extensions.Logging;
 8using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 9using Microsoft.AspNetCore.Authorization;
 10using SVETA.Api.Data.Domain;
 11using WinSolutions.Sveta.Server.Services.Interfaces;
 12using SVETA.Api.Data.DTO;
 13using SVETA.Api.Helpers;
 14using SVETA.Api.Helpers.Authorize;
 15using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 16using Swashbuckle.AspNetCore.Annotations;
 17using WinSolutions.Sveta.Server.Domain;
 18using WinSolutions.Sveta.Common;
 19using SVETA.Api.Services.Interfaces;
 20
 21namespace SVETA.Api.Controllers
 22{
 23    [Authorize]
 24    [Route("api/v1/WorkSchedule")]
 25    [ApiController]
 26    public class WorkSchedulesController : SvetaController
 27    {
 28        const string _routeUrl = "api/v1/WorkSchedule";
 29        readonly IWorkScheduleService _service;
 30        readonly IDepartmentService _departmentService;
 31        readonly IAuthenticationService _authUserService;
 32        readonly IDirectoriesService _dirService;
 33        readonly IDiskStorageService _diskStorage;
 34        readonly ILogger<WorkSchedulesController> _logger;
 35        public WorkSchedulesController(IWorkScheduleService service, IDirectoriesService dirService, ILogger<WorkSchedul
 036            IDiskStorageService diskStorage) : base(logger)
 037        {
 038            _diskStorage = diskStorage;
 039            _dirService = dirService;
 040            _authUserService = authUserService;
 041            _departmentService = departmentService;
 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="sortByDateDesc">сортировать по дате начала DESC - true or false, по умолчанию false</param>
 53        /// <param name="date">Поиск по дате. Не обязательный параметр</param>
 54        /// <param name="workingDay">true - выводить только рабочие дни. по умолчанию false</param>
 55        /// <param name="departmentId">по какому складу выводить расписание. 0 - по всем, иначе по указанному. По умолча
 56        [HttpGet("")]
 57        [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<WorkScheduleResponseDTO>))]
 58        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 59        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 60        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwner)]
 61        public async Task<IActionResult> GetSchedules(int page = 1, int limit = 10, long departmentId=0, DateTimeOffset 
 062        {
 063            page = page < 1 ? 1 : page;
 064            limit = limit < 1 ? 10 : limit;
 065            if (!_authUserService.IsUserPlatform() && await _departmentService.GetDepartment(departmentId, _authUserServ
 066                return NotFoundResult($"Не найдено подразделение с id={departmentId}");
 067            var result = await _service.GetSchedules(page - 1, limit, date.GetDate(), workingDay, sortByDateDesc, depart
 068            var param = $"sortByNameDesc={sortByDateDesc}&date={date.ToISOString()}&workingDay={workingDay}&departmentId
 069            var response = new BaseResponseDTO<WorkScheduleResponseDTO>(_routeUrl, page, limit, result.TotalFilteredCoun
 070            {
 071                Data = result.Result.Select(x => new WorkScheduleResponseDTO(x)).ToList(),
 072            };
 073            return Ok(response);
 074        }
 75
 76        /// <summary>
 77        /// Получить расписание по ID
 78        /// </summary>
 79        /// <remarks>author i.rebenok</remarks>
 80        /// <param name="id">id расписания</param>
 81        [HttpGet("{id}")]
 82        [SwaggerResponse(200, "Успешно", typeof(WorkScheduleResponseDTO))]
 83        [SwaggerResponse(404, "Нет записей", typeof(EmptyResult))]
 84        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 85        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 86        [Authorize(Roles = Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwner)]
 87        public async Task<IActionResult> GetSchedule([SwaggerParameter(Required = true)] long id)
 088        {
 089            var result = await _service.GetSchedule(id);
 090            if (result == null)
 091                return NotFoundResult($"Расписание с id={id} не найдено");
 092            if (!_authUserService.IsUserPlatform() && result.Warehouse.Contragent.Id != _authUserService.ContragentId)
 093                return ForbidResult($"Не разрешено для данного пользователя ");
 094            return Ok(new WorkScheduleResponseDTO(result));
 095        }
 96
 97        /// <summary>
 98        /// Создает расписание
 99        /// </summary>
 100        /// <remarks>author i.rebenok</remarks>
 101        /// <param name="data">WorkScheduleRequestDTO</param>
 102        [HttpPost("")]
 103        [SwaggerResponse(201, "Успешно создано", typeof(WorkScheduleResponseDTO))]
 104        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 105        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 106        [SwaggerResponse(400, "Некорректные входные данные", typeof(ErrorDTO))]
 107        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 108        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner)]
 109        public async Task<IActionResult> CreateSchedule([FromBody] [SwaggerParameter(Required = true)] WorkScheduleReque
 0110        {
 0111            if (!ModelState.IsValid)
 0112                return BadRequestResult("Некорректные входные данные");
 113           /* if (data.BeginTime.Date != data.EndTime.Date)
 114                return BadRequestResult("Дата начала и дата окончания должны быть одним днем");*/
 0115            if (data.BeginTime > data.EndTime)
 0116                return BadRequestResult("Дата начала не может быть больше даты окончания");
 0117            if (data.EndTime.Subtract(data.BeginTime).TotalHours < 1)
 0118                return BadRequestResult("Длительность рабочего дня не может быть меньше 1 часа");
 0119            if (data.EndTime.Subtract(data.BeginTime).TotalHours > 24)
 0120                return BadRequestResult("Длительность рабочего дня не может превышать 24 часа");
 0121            var warehouse = (_authUserService.IsUserPlatform() ? await _departmentService.GetDepartment(data.WarehouseId
 0122            if (warehouse == null)
 0123                return NotFoundResult($"Департамент с {data.WarehouseId} не найден");
 0124            var schedule = new WorkSchedule()
 0125            {
 0126                RecState = await _dirService.GetRecordState((int)RecordState.Empty),
 0127                BeginTime = data.BeginTime.UtcDateTime,
 0128                EndTime = data.EndTime.UtcDateTime,
 0129                IsWorkingDay = data.IsWorkingDay,
 0130                Warehouse = warehouse
 0131            };
 0132            if (schedule.RecState == null)
 0133                return NotFoundResult("Служебный тип записи не найден");
 0134            await _service.Create(schedule);
 0135            return CreatedAtAction("GetSchedule", new { id = schedule.Id }, new WorkScheduleResponseDTO(schedule));
 0136        }
 137
 138        /// <summary>
 139        /// Обновляет расписание
 140        /// </summary>
 141        /// <remarks>author i.rebenok</remarks>
 142        /// <param name="id">id расписания</param>
 143        /// <param name="data">WorkScheduleRequestDTO</param>
 144        [HttpPut("{id}")]
 145        [SwaggerResponse(201, "Успешно обновлено", typeof(WorkScheduleResponseDTO))]
 146        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 147        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 148        [SwaggerResponse(400, "Некорректные входные данные", typeof(ErrorDTO))]
 149        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 150        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner)]
 151        public async Task<IActionResult> UpdateSchedule([SwaggerParameter(Required = true)] long id, [FromBody] [Swagger
 0152        {
 0153            if (!ModelState.IsValid)
 0154                return BadRequestResult("Некорректные входные данные");
 0155            if (data.BeginTime > data.EndTime)
 0156                return BadRequestResult("Дата начала не может быть больше даты окончания");
 0157            if (data.EndTime.Subtract(data.BeginTime).TotalHours < 1)
 0158                return BadRequestResult("Длительность смены не может быть меньше 1 часа");
 0159            if (data.EndTime.Subtract(data.BeginTime).TotalHours > 24)
 0160                return BadRequestResult("Длительность смены не может превышать 24 часа");
 0161            var schedule = await _service.GetSchedule(id);
 0162            if (schedule == null)
 0163                return NotFoundResult($"Расписание с id={id} не найдено");
 0164            if (!_authUserService.IsUserPlatform() && schedule.Warehouse.Contragent.Id != _authUserService.ContragentId)
 0165                return ForbidResult($"Не разрешено для данного пользователя ");
 0166            var warehouse = (_authUserService.IsUserPlatform() ? await _departmentService.GetDepartment(data.WarehouseId
 0167            if (warehouse == null)
 0168                return NotFoundResult($"Департамент с {data.WarehouseId} не найден");
 0169            schedule.BeginTime = data.BeginTime.UtcDateTime;
 0170            schedule.EndTime = data.EndTime.UtcDateTime;
 0171            schedule.IsWorkingDay = data.IsWorkingDay;
 0172            schedule.Warehouse = warehouse;
 0173            await _service.Update(schedule);
 0174            return Ok(new WorkScheduleResponseDTO(schedule));
 0175        }
 176
 177        /// <summary>
 178        /// Удаляет расписание по id
 179        /// </summary>
 180        /// <remarks>author i.rebenok</remarks>
 181        /// <param name="id">id расписания</param>
 182        [HttpDelete("{id}")]
 183        [SwaggerResponse(200, "Успешно удалено", typeof(EmptyResult))]
 184        [SwaggerResponse(404, "Нет записей", typeof(ErrorDTO))]
 185        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 186        [SwaggerResponse(403, "Не разрешено для этого пользователя", typeof(ErrorDTO))]
 187        [Authorize(Roles = Role.SystemAdmin + "," + Role.SupplierOwner)]
 188        public async Task<IActionResult> DeleteSchedule([SwaggerParameter(Required = true)] long id)
 0189        {
 0190            var schedule = await _service.GetSchedule(id);
 0191            if (schedule == null)
 0192                return NotFoundResult($"Расписание с id={id} не найдено");
 0193            if (!_authUserService.IsUserPlatform() && schedule.Warehouse.Contragent.Id != _authUserService.ContragentId)
 0194                return ForbidResult($"Не разрешено для данного пользователя ");
 0195            await _service.Delete(id);
 0196            return Ok();
 0197        }
 198
 199    }
 200}