< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_OneCFresh_Views_Register_Stock
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/OneCFresh/Views/Register/Stock.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 37
Coverable lines: 37
Total lines: 148
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 104
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ExecuteAsync()0%5256720%
GetWarehouseName()0%2040%
GetNomName()0%2040%
GetNomArticle()0%2040%
FormatQty()100%210%
<ExecuteAsync()0%7280%
<ExecuteAsync()0%156120%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/OneCFresh/Views/Register/Stock.cshtml

#LineLine coverage
 1@model OzonOrdersWeb.Areas.OneCFresh.ViewModels.StockViewModel
 2@{
 03    ViewData["Title"] = "Запасы на складах";
 04    bool isLoaded = Model.Items.Any() || ViewBag.LoadedRecorders != null;
 05    int loadedCount = ViewBag.LoadedRecorders ?? 0;
 06    bool hasMore = ViewBag.HasMore ?? false;
 07    int nextSkip = ViewBag.NextSkip ?? 0;
 8
 9    string GetWarehouseName(Guid key)
 010        => Model.WarehouseNames.TryGetValue(key, out var n) ? (n ?? key.ToString().ToUpper()[..8] + "…") : key.ToString(
 11    string GetNomName(Guid key)
 012        => Model.NomenclatureNames.TryGetValue(key, out var n) ? (n ?? "—") : "—";
 13    string GetNomArticle(Guid key)
 014        => Model.NomenclatureArticles.TryGetValue(key, out var a) ? (a ?? "—") : "—";
 15    string FormatQty(decimal qty)
 016        => qty.ToString("0.####", System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
 17}
 18
 19<div class="d-flex align-items-center gap-2 mb-3">
 20    <h5 class="mb-0 fw-semibold">
 021        <i class="bi bi-bar-chart me-2 text-warning"></i>@ViewData["Title"]
 22    </h5>
 023    @if (isLoaded)
 24    {
 025        <span class="badge bg-secondary">@Model.Items.Count позиций</span>
 026        <span class="text-muted small">из @loadedCount загруженных регистраторов</span>
 27    }
 028    @if (Model.WarehouseFilter.HasValue && Model.WarehouseNames.TryGetValue(Model.WarehouseFilter.Value, out var whFilte
 29    {
 030        <span class="badge bg-info text-dark">Склад: @whFilterName</span>
 31        <a asp-area="OneCFresh" asp-controller="Register" asp-action="Stock"
 032           asp-route-search="@Model.Search" asp-route-load="true"
 33           class="btn btn-link btn-sm py-0 text-muted"><i class="bi bi-x-circle"></i></a>
 34    }
 35</div>
 36
 037@if (TempData["Error"] is string err)
 38{
 039    <div class="alert alert-danger py-2 small">@err</div>
 40}
 41
 042@if (!isLoaded)
 43{
 44    <div class="card border-warning mb-3" style="max-width:600px">
 45        <div class="card-body">
 46            <h6 class="card-title"><i class="bi bi-info-circle me-1 text-warning"></i>Загрузка остатков</h6>
 47            <p class="card-text small text-muted mb-3">
 48                Остатки рассчитываются из регистра накопления <strong>ЗапасыНаСкладах</strong>.
 49                Загружается по <strong>500 регистраторов</strong> за раз — нажмите кнопку для начала.
 50            </p>
 51            <a asp-area="OneCFresh" asp-controller="Register" asp-action="Stock"
 052               asp-route-load="true" asp-route-search="@Model.Search" asp-route-warehouseFilter="@Model.WarehouseFilter"
 53               class="btn btn-warning btn-sm">
 54                <i class="bi bi-bar-chart me-1"></i>Загрузить остатки
 55            </a>
 56        </div>
 57    </div>
 58
 59    <div class="mb-3" style="max-width:600px">
 60        <label class="form-label small mb-1">Фильтр по складу (загрузит только его данные)</label>
 61        <form method="get" asp-area="OneCFresh" asp-controller="Register" asp-action="Stock" class="d-flex gap-2">
 62            <input type="hidden" name="load" value="true" />
 63            <select class="form-select form-select-sm" name="warehouseFilter">
 64                <option value="">Все склады</option>
 065                @foreach (var wh in Model.WarehouseNames.OrderBy(kv => kv.Value))
 66                {
 067                    <option value="@wh.Key" selected="@(Model.WarehouseFilter == wh.Key)">@wh.Value</option>
 68                }
 69            </select>
 70            <button type="submit" class="btn btn-warning btn-sm text-nowrap">
 71                <i class="bi bi-bar-chart me-1"></i>Загрузить
 72            </button>
 73        </form>
 74    </div>
 75}
 76else
 77{
 78    <form method="get" asp-area="OneCFresh" asp-controller="Register" asp-action="Stock" class="row g-2 align-items-end 
 79        <input type="hidden" name="load" value="true" />
 80        <div class="col-12 col-md-4">
 81            <input class="form-control form-control-sm" name="search" value="@Model.Search" placeholder="Артикул или наи
 82        </div>
 83        <div class="col-md-3">
 84            <select class="form-select form-select-sm" name="warehouseFilter">
 85                <option value="">Все склады</option>
 086                @foreach (var wh in Model.WarehouseNames.OrderBy(kv => kv.Value))
 87                {
 088                    <option value="@wh.Key" selected="@(Model.WarehouseFilter == wh.Key)">@wh.Value</option>
 89                }
 90            </select>
 91        </div>
 92        <div class="col-auto d-flex gap-1">
 93            <button type="submit" class="btn btn-primary btn-sm"><i class="bi bi-search me-1"></i>Фильтр</button>
 94            <a asp-area="OneCFresh" asp-controller="Register" asp-action="Stock" asp-route-load="true"
 95               class="btn btn-outline-secondary btn-sm">Сброс</a>
 96        </div>
 97    </form>
 98
 99    <div class="table-responsive">
 100        <table class="table table-sm table-hover onec-table border">
 101            <thead class="table-light">
 102                <tr>
 103                    <th>Артикул</th>
 104                    <th>Наименование</th>
 105                    <th>Склад</th>
 106                    <th class="text-end">Остаток</th>
 107                    <th>Последнее движение</th>
 108                </tr>
 109            </thead>
 110            <tbody>
 0111                @foreach (var row in Model.Items)
 112                {
 0113                    var qty = row.Quantity;
 114                    <tr class="@(qty < 0 ? "table-danger" : "")">
 0115                        <td class="font-monospace fw-semibold">@GetNomArticle(row.NomenclatureKey)</td>
 0116                        <td>@GetNomName(row.NomenclatureKey)</td>
 117                        <td>
 0118                            <span class="badge bg-light text-dark border">@GetWarehouseName(row.WarehouseKey)</span>
 119                        </td>
 120                        <td class="text-end font-monospace @(qty < 0 ? "text-danger fw-bold" : "fw-semibold")">
 0121                            @FormatQty(qty)
 0122                            @if (qty < 0) { <i class="bi bi-exclamation-triangle text-danger ms-1"></i> }
 123                        </td>
 0124                        <td class="text-muted small">@row.LastMovement.ToString("dd.MM.yyyy HH:mm")</td>
 125                    </tr>
 126                }
 0127                @if (!Model.Items.Any())
 128                {
 129                    <tr class="st2-empty-state-row"><td colspan="5"><div class="st2-empty-state st2-empty-state--compact
 130                }
 131            </tbody>
 132        </table>
 133    </div>
 134
 0135    @if (hasMore)
 136    {
 137        <div class="alert alert-info small py-2 d-flex align-items-center gap-3">
 138            <i class="bi bi-arrow-repeat"></i>
 0139            <span>Загружено @loadedCount регистраторов (не весь регистр). Чтобы загрузить следующие 500:</span>
 140            <a asp-area="OneCFresh" asp-controller="Register" asp-action="Stock"
 0141               asp-route-load="true" asp-route-skip="@nextSkip"
 0142               asp-route-warehouseFilter="@Model.WarehouseFilter"
 143               class="btn btn-info btn-sm text-nowrap">
 144                <i class="bi bi-arrow-right me-1"></i>Следующие 500
 145            </a>
 146        </div>
 147    }
 148}