< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Studio2_Views_JobLogs__TransactionExecutionsTab
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/JobLogs/_TransactionExecutionsTab.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 48
Coverable lines: 48
Total lines: 140
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 38
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%420200%
Warehouses()0%110100%
<ExecuteAsync()0%620%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/JobLogs/_TransactionExecutionsTab.cshtml

#LineLine coverage
 1@model OzonOrdersWeb.Areas.Studio2.ViewModels.TransactionJobs.BackgroundJobsExecutionsPageViewModel
 2@{
 3    // Списки из модели страницы → гриды (job-logs-grids.js); журнал запусков — серверный грид (grid/transactions).
 04    var lookup = Model.OrderLookup;
 5    string Warehouses(OzonOrdersWeb.Areas.Studio2.ViewModels.TransactionJobs.OrderExecutionLookupPostingViewModel p) =>
 06        !string.IsNullOrWhiteSpace(p.WarehouseSender) || !string.IsNullOrWhiteSpace(p.WarehouseRecipient)
 07            ? $"{(string.IsNullOrWhiteSpace(p.WarehouseSender) ? "?" : p.WarehouseSender)} → {(string.IsNullOrWhiteSpace
 08            : p.WarehouseName ?? "-";
 09    var localData = new Dictionary<string, object>
 010    {
 011        ["schedules"] = Model.Schedules.Select(s => new
 012        {
 013            s.Id, s.Name, ClientName = s.OzonClient?.Name, s.JobType, Cron = s.CronExpression, s.IsActive, s.LastRunTime
 014        })
 015    };
 016    if (lookup != null && !lookup.IsEmpty)
 17    {
 018        localData["lookupOrders"] = lookup.Orders.Select(o => new
 019        {
 020            o.OrderId, o.ShipmentNumber, o.Article, Status = o.AppStatusName ?? o.ClientStatusName, ClientName = o.OzonC
 021            WarehouseName = o.ShipmentWarehouseName, o.TransactionId,
 022            TransactionSummary = string.Join(", ", new[]
 023            {
 024                o.TransactionTypeName,
 025                o.TransactionCreatedAt.HasValue ? o.TransactionCreatedAt.Value.ToString("dd.MM.yyyy HH:mm") : null,
 026                o.TransactionCreateBy
 027            }.Where(x => !string.IsNullOrWhiteSpace(x)))
 028        });
 029        localData["lookupPostings"] = lookup.Postings.Select(p => new
 030        {
 031            p.PerformedAt, p.ExecutionId, p.JobType, p.ScheduleName, p.TransactionId, p.TransactionTypeName, p.Performed
 032            p.ShipmentNumber, p.OrderId, Warehouses = Warehouses(p), p.DocumentNumbers, p.IsPosted, p.Status, p.Comment,
 033        });
 034        localData["lookupMatches"] = lookup.Matches.Select(m => new
 035        {
 036            m.ExecutionId, m.JobType, m.ScheduleName, m.StartedAt, m.OrderNumber, m.Article, m.IsMatchedInDb, m.IsEligib
 037        });
 38    }
 39}
 040<script>window.jobLogsLocalData = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(localData, new System.Text.Json.Js
 41<div class="job-logs-intro">
 42    <i class="fas fa-circle-info"></i>
 43    <span>
 44        Запуск создаётся расписанием («Авто-транзакции Ozon») либо кнопкой «Выполнить сейчас».
 45        Статус <strong>«Частично успешно»</strong> значит, что часть заказов не провелась —
 46        детали ищите на вкладке «Проведения 1С» по номеру запуска.
 47    </span>
 48</div>
 49
 50<div class="job-logs-workflow">
 51    <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">1</span><div><strong>Срабатывает расписание<
 52    <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">2</span><div><strong>Отбираются заказы</stro
 53    <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">3</span><div><strong>Транзакция проводится в
 54    <div class="job-logs-workflow-step"><span class="job-logs-workflow-num">4</span><div><strong>Результат в журнале</st
 55</div>
 56
 57
 58<div class="job-logs-panel card mb-3">
 59    <div class="card-header bsx-grid-toolbar">
 60        <strong><i class="fas fa-search me-1 text-primary"></i>Поиск заказа по запускам</strong>
 61        <form method="get" action="/Studio2/JobLogs" class="d-flex gap-2 flex-grow-1 flex-wrap">
 62            <input type="hidden" name="tab" value="transactions"/>
 63            <div class="bsx-grid-search bsx-grid-search--wide">
 64                <i class="fas fa-box"></i>
 65                <input type="search" name="orderNumber" value="@Model.OrderNumber" placeholder="Номер отправления (можно
 66            </div>
 67            <button class="btn btn-sm btn-primary" type="submit">Найти</button>
 068            @if (lookup != null)
 69            {
 70                <a href="/Studio2/JobLogs?tab=transactions" class="btn btn-sm btn-outline-secondary"><i class="fas fa-ti
 71            }
 72        </form>
 73        <div class="bsx-grid-toolbar-end">
 74            <a href="@Url.Action("Index", "TransactionJobs", new { area = "Studio2" })" class="btn btn-sm btn-outline-se
 75                <i class="fas fa-calendar-alt me-1"></i>Расписания
 76            </a>
 77        </div>
 78    </div>
 79    <div class="card-body p-2">
 80        <div class="small bsx-muted mb-1">Поиск показывает, в каких транзакциях заказ проведён и почему фоновый запуск е
 81    </div>
 82</div>
 83
 084@if (lookup != null)
 85{
 86    <div class="job-logs-panel card mb-3 border-primary">
 087        <div class="card-header"><strong><i class="fas fa-search me-1 text-primary"></i>Поиск заказа: <code>@lookup.Quer
 88        <div class="card-body p-2">
 089            @if (lookup.IsEmpty)
 90            {
 91                <div class="alert alert-warning mb-0">
 92                    Заказ не найден ни в заказах, ни в отборах фоновых запусков.
 93                    Проверьте номер отправления — искать можно по части номера или по Id заказа.
 94                </div>
 95            }
 96            else
 97            {
 098                @if (lookup.Orders.Count > 0)
 99                {
 0100                    <div class="fw-semibold mb-1"><i class="fas fa-box me-1"></i>Заказы (@lookup.Orders.Count)</div>
 101                    <div id="jobLogsLookupOrdersGrid" class="bsx-grid bsx-grid--auto mb-3"></div>
 102                }
 103                <div class="fw-semibold mb-1">
 0104                    <i class="fas fa-file-invoice me-1"></i>Проведения заказа (@lookup.Postings.Count)
 105                    <span class="small bsx-muted ms-2">Фоновая задача — со ссылкой на запуск, остальное проведено вручну
 106                </div>
 107                <div id="jobLogsLookupPostingsGrid" class="bsx-grid bsx-grid--auto mb-3"></div>
 108                <div class="fw-semibold mb-1">
 0109                    <i class="fas fa-filter me-1"></i>Отбор в фоновых запусках (@lookup.Matches.Count)
 110                    <span class="small bsx-muted ms-2">Здесь видно, почему заказ не был проведён</span>
 111                </div>
 112                <div id="jobLogsLookupMatchesGrid" class="bsx-grid bsx-grid--auto"></div>
 113            }
 114        </div>
 115    </div>
 116}
 117
 0118@if (Model.HighlightExecutionId is > 0)
 119{
 120    <div class="alert alert-info d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
 0121        <span>Выбран запуск <strong>#@Model.HighlightExecutionId</strong> (подсвечен в журнале)</span>
 0122        <a asp-area="Studio2" asp-controller="TransactionJobs" asp-action="ExecutionDetails" asp-route-id="@Model.Highli
 123            <i class="fas fa-eye me-1"></i>Просмотр подробностей
 124        </a>
 125    </div>
 126}
 127
 0128@await Html.PartialAsync("_JobLogsGridPanel", new OzonOrdersWeb.Areas.Studio2.ViewModels.JobLogs.JobLogsGridPanelViewMod
 0129    "Запуски", "fa-play-circle", "Расписание, ошибка…",
 0130    "Двойной клик — подробности запуска. Фильтры по статусу, типу, расписанию и датам — в строке под заголовками; сортир
 131
 132<div class="job-logs-panel card mb-3">
 133    <div class="card-header d-flex justify-content-between align-items-center">
 134        <strong><i class="fas fa-calendar-check me-1"></i>Расписания</strong>
 0135        <span class="badge bg-secondary">@Model.Schedules.Count</span>
 136    </div>
 137    <div class="card-body p-2">
 138        <div id="jobLogsSchedulesGrid" class="bsx-grid bsx-grid--auto"></div>
 139    </div>
 140</div>