< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.Directories.WarehouseController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Directories/WarehouseController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 82
Coverable lines: 82
Total lines: 183
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 24
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Index()100%210%
Create()0%620%
Create()0%2040%
DeleteConfirmed()0%110100%
Edit()0%620%
Edit()0%4260%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Directories/WarehouseController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Microsoft.EntityFrameworkCore;
 4using OzonDomains.Models;
 5using OzonOrdersWeb.ViewModels.WarehouseViewModels;
 6using OzonOrdersWeb.WebServices.Directories;
 7using Services.CacheServices.Cache.OzonOrdersCache;
 8using Services.DataServices;
 9using Services.CacheServices.Cache;
 10
 11namespace OzonOrdersWeb.Areas.Studio2.Controllers.Directories
 12{
 13    [Authorize(Roles = "User,Admin")]
 14    [Area("Studio2")]
 15    public class WarehouseController : Controller
 16    {
 17        private readonly WarehouseDataServices _servcies;
 18        private readonly OrdersDataServices _ordersDataServices;
 19        private readonly OrderCache _cache;
 20        private readonly CacheUpdater<Order> _cacheUpdater;
 21        private readonly WarehouseMappingDataServices _mappingServices;
 22
 023        public WarehouseController(WarehouseDataServices servcies,
 024            OrdersDataServices ordersDataServices,
 025            OrderCache orderCache,
 026            CacheUpdater<Order> cacheUpdater,
 027            WarehouseMappingDataServices mappingServices)
 28        {
 029            _servcies = servcies;
 030            _ordersDataServices = ordersDataServices;
 031            _cache = orderCache;
 032            _cacheUpdater = cacheUpdater;
 033            _mappingServices = mappingServices;
 034        }
 35
 36        /// <summary>Весь справочник складов со связями маппинга — для грида AG Grid (фильтры и сортировка на клиенте).<
 37        public async Task<IActionResult> Index()
 38        {
 039            var warehouses = (await _servcies.GetWarehouses()).OrderBy(w => w.Name).ToList();
 040            var mappings = await _mappingServices.GetWarehouseMappings();
 041            return View(DirectoryGridRows.BuildWarehouses(warehouses, mappings));
 042        }
 43
 44        public async Task<IActionResult> Create()
 45        {
 046            string? result = TempData["WarehouseResult"] as string;
 47
 048            var warehousesList = await _servcies.GetWarehouses();
 49
 050            var viewModel = new CreateWarehouseViewModel
 051            {
 052                WarehouseResult = result ?? string.Empty,
 053                WarehousesList = warehousesList
 054            };
 55
 056            return View(viewModel);
 057        }
 58
 59
 60        [HttpPost]
 61        [ValidateAntiForgeryToken]
 62        public async Task<IActionResult> Create(Warehouse warehouse)
 63        {
 064            if (warehouse != null)
 65            {
 066                var existingWarehouse = await _servcies.GetWarehouseAsync(warehouse);
 067                if (existingWarehouse != null)
 68                {
 069                    TempData["WarehouseResult"] = $"Не удалось добавить склад '{warehouse.Name}'";
 070                    return RedirectToAction(nameof(Create));
 71                }
 72
 073                await _servcies.AddWarehouse(warehouse);
 074                TempData["SuccessMessage"] = $"Склад «{warehouse.Name}» создан.";
 75            }
 76
 077            return RedirectToAction(nameof(Index));
 078        }
 79
 80        [HttpPost]
 81        [ActionName("Delete")]
 82        [ValidateAntiForgeryToken]
 83        public async Task<IActionResult> DeleteConfirmed(int id)
 84        {
 085            var warehouse = await _servcies.GetWarehouseAsync(id);
 086            if (warehouse != null)
 87            {
 88                // Проверяем, не пытаются ли удалить склад "Не указан"
 089                if (warehouse.Name == "Не указан")
 90                {
 091                    TempData["ErrorMessage"] = "Невозможно удалить склад 'Не указан'";
 092                    return RedirectToAction(nameof(Index));
 93                }
 94
 95                // Находим или создаём склад "Не указан"
 096                var defaultWarehouse = await _servcies.GetOrCreateAsync(new Warehouse { Name = "Не указан" });
 97
 098                var ordersWithDeletedWarehouse = await _ordersDataServices
 099                    .GetOrdersQueryable()
 0100                    .Where(o => o.ShipmentWarehouseId == id)
 0101                    .ToListAsync();
 102
 103                // Переносим все заказы на склад "Не указан"
 0104                if (ordersWithDeletedWarehouse.Any())
 105                {
 0106                    foreach (var order in ordersWithDeletedWarehouse)
 107                    {
 0108                        order.ShipmentWarehouseId = defaultWarehouse.Id;
 0109                        order.ShipmentWarehouse = defaultWarehouse;
 110                    }
 111
 0112                    await _ordersDataServices.UpdateOrders(ordersWithDeletedWarehouse);
 113                }
 114
 0115                await _servcies.DeleteWarehouse(warehouse);
 0116                TempData["SuccessMessage"] = $"Склад «{warehouse.Name}» удалён.";
 0117            }
 118
 0119            var previousPage = Request.Cookies["PreviousPageUrl"];
 0120            if (!string.IsNullOrEmpty(previousPage))
 121            {
 0122                return Redirect(previousPage);
 123            }
 124
 0125            return RedirectToAction(nameof(Index));
 0126        }
 127
 128        public async Task<IActionResult> Edit(int id)
 129        {
 0130            var warehouse = await _servcies.GetWarehouseAsync(id);
 0131            if (warehouse == null)
 132            {
 0133                return NotFound();
 134            }
 135
 0136            var viewModel = new EditWarehouseViewModel
 0137            {
 0138                Warehouse = warehouse
 0139            };
 140
 0141            return View(viewModel);
 0142        }
 143
 144
 145        [HttpPost]
 146        [ValidateAntiForgeryToken]
 147        public async Task<IActionResult> Edit(int id, Warehouse warehouse)
 148        {
 0149            if (id != warehouse.Id)
 150            {
 0151                return NotFound();
 152            }
 153
 0154            if (ModelState.IsValid)
 155            {
 156                try
 157                {
 0158                    await _servcies.UpdateWarehouse(warehouse);
 0159                    TempData["SuccessMessage"] = $"Склад «{warehouse.Name}» обновлён.";
 0160                }
 0161                catch (DbUpdateConcurrencyException)
 162                {
 0163                    if (await _servcies.GetWarehouseAsync(id) == null)
 164                    {
 0165                        return NotFound();
 166                    }
 167                    else
 168                    {
 0169                        throw;
 170                    }
 171                }
 172
 0173                return RedirectToAction(nameof(Index));
 174            }
 175
 0176            var viewModel = new EditWarehouseViewModel
 0177            {
 0178                Warehouse = warehouse
 0179            };
 0180            return View(viewModel);
 0181        }
 182    }
 183}