< Summary

Information
Class: OzonOrdersWeb.Areas.OneCFresh.Controllers.CatalogController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/OneCFresh/Controllers/CatalogController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 152
Coverable lines: 152
Total lines: 248
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 30
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%
Counterparties()0%620%
Nomenclature()0%620%
Warehouses()0%620%
Organizations()100%210%
Contracts()0%2040%
VatRates()100%210%
EscapeOData(...)100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/OneCFresh/Controllers/CatalogController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using OzonOrdersWeb.Areas.OneCFresh.ViewModels;
 4using Services.ApiServices._1CApi.OData;
 5using Services.ApiServices._1CApi.OData.Models;
 6
 7namespace OzonOrdersWeb.Areas.OneCFresh.Controllers;
 8
 9[Authorize(Roles = "User,Admin")]
 10[Area("OneCFresh")]
 11[Route("OneCFresh/Catalog/[action]")]
 12public class CatalogController : Controller
 13{
 14    private readonly IOneCODataReferenceService _refService;
 15    private readonly IOneCODataClient _client;
 16
 017    public CatalogController(IOneCODataReferenceService refService, IOneCODataClient client)
 18    {
 019        _refService = refService;
 020        _client = client;
 021    }
 22
 23    [HttpGet]
 24    public async Task<IActionResult> Counterparties(string? search = null, int page = 1, int pageSize = 100)
 25    {
 026        ViewData["Title"] = "Контрагенты";
 27        try
 28        {
 029            var all = await _client.GetListAsync<ODataCounterpartyFull>(
 030                "Catalog_Контрагенты",
 031                new Dictionary<string, string>
 032                {
 033                    ["$select"] = "Ref_Key,Description,ИНН,КПП,DeletionMark,IsFolder",
 034                    ["$filter"] = "IsFolder eq false"
 035                });
 36
 037            if (!string.IsNullOrWhiteSpace(search))
 38            {
 039                var s = search.Trim();
 040                all = all.Where(c =>
 041                    (c.Description?.Contains(s, StringComparison.OrdinalIgnoreCase) ?? false) ||
 042                    (c.Inn?.Contains(s, StringComparison.OrdinalIgnoreCase) ?? false) ||
 043                    (c.Kpp?.Contains(s, StringComparison.OrdinalIgnoreCase) ?? false)).ToList();
 44            }
 45
 046            var total = all.Count;
 047            var items = all
 048                .OrderBy(c => c.Description)
 049                .Skip((page - 1) * pageSize)
 050                .Take(pageSize)
 051                .ToList();
 52
 053            return View(new CounterpartiesViewModel
 054            {
 055                Items = items,
 056                Search = search,
 057                TotalCount = total,
 058                Page = page,
 059                PageSize = pageSize
 060            });
 61        }
 062        catch (Exception ex)
 63        {
 064            TempData["Error"] = $"Ошибка загрузки контрагентов: {ex.Message}";
 065            return View(new CounterpartiesViewModel { Search = search });
 66        }
 067    }
 68
 69    [HttpGet]
 70    public async Task<IActionResult> Nomenclature(string? search = null, int page = 1, int pageSize = 100)
 71    {
 072        ViewData["Title"] = "Номенклатура";
 73        try
 74        {
 075            var queryParams = new Dictionary<string, string>
 076            {
 077                ["$select"] = "Ref_Key,Description,Артикул,IsFolder,DeletionMark",
 078                ["$filter"] = "IsFolder eq false and DeletionMark eq false"
 079            };
 80
 81            List<ODataNomenclatureFull> all;
 082            if (!string.IsNullOrWhiteSpace(search))
 83            {
 084                var filter = $"IsFolder eq false and DeletionMark eq false and (substringof('{EscapeOData(search.Trim())
 085                all = await _client.GetPageAsync<ODataNomenclatureFull>(
 086                    "Catalog_Номенклатура",
 087                    top: pageSize,
 088                    skip: (page - 1) * pageSize,
 089                    queryParams: new Dictionary<string, string>
 090                    {
 091                        ["$select"] = "Ref_Key,Description,Артикул,IsFolder,DeletionMark",
 092                        ["$filter"] = $"IsFolder eq false and DeletionMark eq false",
 093                        ["$orderby"] = "Description"
 094                    });
 095                all = all.Where(n =>
 096                    (n.Description?.Contains(search.Trim(), StringComparison.OrdinalIgnoreCase) ?? false) ||
 097                    (n.Article?.Contains(search.Trim(), StringComparison.OrdinalIgnoreCase) ?? false)).ToList();
 98            }
 99            else
 100            {
 0101                all = await _client.GetPageAsync<ODataNomenclatureFull>(
 0102                    "Catalog_Номенклатура",
 0103                    top: pageSize,
 0104                    skip: (page - 1) * pageSize,
 0105                    queryParams: new Dictionary<string, string>
 0106                    {
 0107                        ["$select"] = "Ref_Key,Description,Артикул,IsFolder,DeletionMark",
 0108                        ["$filter"] = "IsFolder eq false and DeletionMark eq false",
 0109                        ["$orderby"] = "Description"
 0110                    });
 111            }
 112
 0113            var total = await _client.GetCountAsync("Catalog_Номенклатура", "IsFolder eq false and DeletionMark eq false
 114
 0115            return View(new NomenclatureViewModel
 0116            {
 0117                Items = all,
 0118                Search = search,
 0119                TotalCount = total,
 0120                Page = page,
 0121                PageSize = pageSize
 0122            });
 123        }
 0124        catch (Exception ex)
 125        {
 0126            TempData["Error"] = $"Ошибка загрузки номенклатуры: {ex.Message}";
 0127            return View(new NomenclatureViewModel { Search = search });
 128        }
 0129    }
 130
 131    [HttpGet]
 132    public async Task<IActionResult> Warehouses(string? search = null)
 133    {
 0134        ViewData["Title"] = "Склады (Структурные единицы)";
 135        try
 136        {
 0137            var all = await _client.GetListAsync<ODataWarehouseFull>(
 0138                "Catalog_СтруктурныеЕдиницы",
 0139                new Dictionary<string, string>
 0140                {
 0141                    ["$select"] = "Ref_Key,Description,DeletionMark"
 0142                });
 143
 0144            if (!string.IsNullOrWhiteSpace(search))
 0145                all = all.Where(w => w.Description?.Contains(search.Trim(), StringComparison.OrdinalIgnoreCase) ?? false
 146
 0147            return View(new WarehousesViewModel
 0148            {
 0149                Items = all.OrderBy(w => w.Description).ToList(),
 0150                Search = search
 0151            });
 152        }
 0153        catch (Exception ex)
 154        {
 0155            TempData["Error"] = $"Ошибка загрузки складов: {ex.Message}";
 0156            return View(new WarehousesViewModel { Search = search });
 157        }
 0158    }
 159
 160    [HttpGet]
 161    public async Task<IActionResult> Organizations()
 162    {
 0163        ViewData["Title"] = "Организации";
 164        try
 165        {
 0166            var all = await _client.GetListAsync<ODataOrganizationFull>(
 0167                "Catalog_Организации",
 0168                new Dictionary<string, string>
 0169                {
 0170                    ["$select"] = "Ref_Key,Description,ИНН,КПП,DeletionMark"
 0171                });
 172
 0173            return View(new OrganizationsViewModel { Items = all });
 174        }
 0175        catch (Exception ex)
 176        {
 0177            TempData["Error"] = $"Ошибка загрузки организаций: {ex.Message}";
 0178            return View(new OrganizationsViewModel());
 179        }
 0180    }
 181
 182    [HttpGet]
 183    public async Task<IActionResult> Contracts(string? search = null, Guid? counterpartyGuid = null, int page = 1, int p
 184    {
 0185        ViewData["Title"] = "Договоры контрагентов";
 186        try
 187        {
 0188            var all = await _client.GetListAsync<ODataContractFull>(
 0189                "Catalog_ДоговорыКонтрагентов",
 0190                new Dictionary<string, string>
 0191                {
 0192                    ["$select"] = "Ref_Key,Description,Owner,DeletionMark",
 0193                    ["$orderby"] = "Ref_Key"
 0194                });
 195
 0196            if (counterpartyGuid.HasValue)
 0197                all = all.Where(c => c.Owner == counterpartyGuid.Value).ToList();
 198
 0199            if (!string.IsNullOrWhiteSpace(search))
 0200                all = all.Where(c => c.Description?.Contains(search.Trim(), StringComparison.OrdinalIgnoreCase) ?? false
 201
 0202            var counterparties = await _refService.GetCounterpartiesAsync();
 0203            var uniqueCounterparties = counterparties.DistinctBy(c => c.RefKey).OrderBy(c => c.Description).ToList();
 0204            var names = uniqueCounterparties.ToDictionary(c => c.RefKey, c => c.Description);
 205
 0206            var total = all.Count;
 0207            var items = all.Skip((page - 1) * pageSize).Take(pageSize).ToList();
 208
 0209            return View(new ContractsViewModel
 0210            {
 0211                Items = items,
 0212                CounterpartyNames = names,
 0213                AllCounterparties = uniqueCounterparties,
 0214                Search = search,
 0215                CounterpartyGuid = counterpartyGuid,
 0216                TotalCount = total,
 0217                Page = page,
 0218                PageSize = pageSize
 0219            });
 220        }
 0221        catch (Exception ex)
 222        {
 0223            TempData["Error"] = $"Ошибка загрузки договоров: {ex.Message}";
 0224            return View(new ContractsViewModel { Search = search });
 225        }
 0226    }
 227
 228    [HttpGet]
 229    public async Task<IActionResult> VatRates()
 230    {
 0231        ViewData["Title"] = "Ставки НДС";
 232        try
 233        {
 0234            var all = await _client.GetListAsync<ODataVatRate>(
 0235                "Catalog_СтавкиНДС",
 0236                new Dictionary<string, string> { ["$select"] = "Ref_Key,Description" });
 237
 0238            return View(new VatRatesViewModel { Items = all });
 239        }
 0240        catch (Exception ex)
 241        {
 0242            TempData["Error"] = $"Ошибка загрузки ставок НДС: {ex.Message}";
 0243            return View(new VatRatesViewModel());
 244        }
 0245    }
 246
 0247    private static string EscapeOData(string value) => value.Replace("'", "''");
 248}