< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Studio2_Views_CancelledTransaction_CreateCancelledTransaction
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/CancelledTransaction/CreateCancelledTransaction.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 11
Coverable lines: 11
Total lines: 255
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 32
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%702260%
<ExecuteAsync()0%4260%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/CancelledTransaction/CreateCancelledTransaction.cshtml

#LineLine coverage
 1@using OzonDomains.Models
 2@using OzonOrdersWeb.ViewModels.OrderViewModels
 3
 4@model MultiplayEditOrderViewModel
 5
 6@{
 07    var ordersCount = Model?.Orders?.Count ?? 0;
 08    var orders = Model?.Orders ?? new List<OzonDomains.Models.Order>();
 09    ViewData["Title"] = $"Отмененный заказ ({ordersCount} заказов)";
 010    Layout = "~/Views/Shared/_Layout.cshtml";
 11}
 12
 13<partial name="~/Areas/Studio2/Views/Partials/Transaction/_TransactionPageStyles.cshtml"/>
 14<script src="~/js/Studio2/Orders/CreateOrderToSupplierTransactionV2/generateInfoRow.js"></script>
 15
 16<div id="loadingSpinner" class="spinner-overlay" style="display: none; background-color: inherit;">
 17    <div class="spinner-border text-primary" role="status">
 18        <span class="sr-only"></span>
 19    </div>
 20</div>
 21
 22<div id="messageContainer" class="position-fixed top-0 end-0 p-3" style="z-index: 1050;">
 23    <div id="flashMessage" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
 24        <div class="toast-header">
 25            <strong class="me-auto">Сообщение</strong>
 26            <button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
 27        </div>
 28        <div class="toast-body">
 29            <span id="flashMessageText"></span>
 30        </div>
 31    </div>
 32</div>
 33
 34<div class="modal fade" id="cartModal" tabindex="-1" aria-labelledby="cartModalLabel" aria-hidden="true">
 35    <div class="modal-dialog modal-lg modal-dialog-scrollable">
 36        <div class="modal-content rounded-3 shadow">
 37            <div class="modal-header">
 38                <h5 class="modal-title" id="cartModalLabel">Корзина</h5>
 39                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
 40            </div>
 41            <div class="modal-body" id="cartModalBody">
 42                <!-- Контент корзины будет вставлен сюда -->
 43            </div>
 44            <div class="modal-footer">
 45                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
 46            </div>
 47        </div>
 48    </div>
 49</div>
 50
 051@if (orders.Count > 0)
 52{
 53    <form asp-area="Studio2" asp-controller="CancelledTransaction" asp-action="CreateCancelledTransaction"
 54          id="createOrderForm">
 55        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
 56        <input type="hidden" asp-for="RedirectPage"/>
 57        <input type="hidden" asp-for="TrackingKey"/>
 58
 059        @await Html.PartialAsync("_TransactionTable", Model)
 60
 61        <div class="tx-page-footer">
 62            <div class="input-group">
 63                <span class="input-group-btn">
 64                    <input type="submit" value="Сохранить" class="btn btn-primary"
 65                           data-bs-target="#staticBackdrop"/>
 66                </span>
 67            </div>
 68        </div>
 69    </form>
 70}
 71else
 72{
 073    @await Html.PartialAsync("_TransactionErrorPanel")
 74}
 75
 76<div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"
 77     aria-labelledby="staticBackdropLabel" aria-hidden="true">
 78    <div class="modal-dialog">
 79        <div class="modal-content orders-modal orders-modal--primary">
 80            <div class="modal-header">
 81                <h5 class="modal-title" id="staticBackdropLabel">Создание журнала документов</h5>
 82                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
 83            </div>
 84            <div class="modal-body">
 85                <div class="d-flex justify-content-center">
 86                    <div class="spinner-border text-primary" role="status">
 87                        <span class="sr-only">.</span>
 88                    </div>
 89                </div>
 90            </div>
 91        </div>
 92    </div>
 93</div>
 94
 95<div>
 96    <a asp-action="Index" class="tx-page-back-link">← К списку заказов</a>
 97</div>
 98
 99<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
 100    <div class="modal-dialog" role="document">
 101        <div class="modal-content orders-modal orders-modal--warning">
 102            <div class="modal-header">
 103                <h4 class="modal-title" id="myModalLabel">Поля не заполнены</h4>
 104            </div>
 105            <div class="modal-body">
 106                Одно или несколько полей не заполнены. Пожалуйста, заполните все поля перед отправкой формы.
 107            </div>
 108        </div>
 109    </div>
 110</div>
 111
 112<!-- Модальное окно для отображения увеличенного изображения -->
 113<div class="modal fade" id="imageModal" tabindex="-1" aria-labelledby="imageModalLabel" aria-hidden="true">
 114    <div class="modal-dialog modal-dialog-centered">
 115        <div class="modal-content">
 116            <div class="modal-header">
 117                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
 118            </div>
 119            <div class="modal-body text-center">
 120                <img id="modalImage" src="" alt="Full Image" class="img-fluid rounded border">
 121            </div>
 122        </div>
 123    </div>
 124</div>
 125
 126<input type="hidden" id="deletedOrders" name="deletedOrders"/>
 127@* Скрипты таблицы нужны только когда она отрисована; на панели ошибки они падали на пустом DOM *@
 0128@if (orders.Count > 0)
 129{
 0130@await Html.PartialAsync("_TransactionScript", Model)
 131
 132<script>
 133    // Блокируем все поля на странице транзакции "Отменен",
 134    // кроме номера заказа поставщику (OrderNumberToSupplier)
 135    document.addEventListener('DOMContentLoaded', function () {
 136        var table = document.getElementById('shipmentTable');
 137        if (!table) return;
 138
 139        var inputs = table.querySelectorAll('input, select, textarea');
 140
 141        inputs.forEach(function (el) {
 142            // Разрешаем поле поставщика, блок Ozon-отмены и скрытые поля
 143            if (el.classList.contains('orderNumberToSupplie-field') ||
 144                el.classList.contains('ozon-cancel-checkbox') ||
 145                el.classList.contains('ozon-cancel-reason-select') ||
 146                el.classList.contains('ozon-cancel-message') ||
 147                el.classList.contains('ozon-cancel-reason-title') ||
 148                el.type === 'hidden') {
 149                return;
 150            }
 151
 152            el.classList.add('locked-field');
 153
 154            // Для input/textarea используем readOnly, чтобы значение отправлялось в модель
 155            var tag = el.tagName.toLowerCase();
 156            if (tag === 'input' || tag === 'textarea') {
 157                el.readOnly = true;
 158            }
 159
 160            // Для select блокируем взаимодействие, но не отключаем элемент,
 161            // чтобы текущее значение продолжало поститься в модель
 162            if (tag === 'select') {
 163                ['mousedown', 'click', 'keydown', 'focus'].forEach(function (evt) {
 164                    el.addEventListener(evt, function (e) {
 165                        e.preventDefault();
 166                        el.blur();
 167                    }, {capture: true});
 168                });
 169            }
 170        });
 171    });
 172
 173    // Функции работы с панелью "Отменить в Ozon" (toggleOzonCancelFields, validateOzonCancelSelections и т.д.)
 174    // подключены глобально через _TransactionTable → wwwroot/js/Studio2/Transactions/ozonCancelPanel.js
 175</script>
 176
 177<script>
 178    $('#createOrderForm').on('submit', function (e) {
 179        e.preventDefault();
 180
 181        var fieldsFilled = true;
 182        $('.purchase-price-field').each(function () {
 183            // Получаем ID заказа из поля цены
 184            var orderId = this.id.split('_')[1];
 185            var statusSelect = document.getElementById('AppStatusId_' + orderId);
 186
 187            // Проверяем, не является ли статус "Отменен"
 188            var selectedStatusText = statusSelect?.options[statusSelect.selectedIndex]?.text?.trim() ?? '';
 189            if (selectedStatusText !== "Отменен") {
 190                if ($(this).val() === '') {
 191                    fieldsFilled = false;
 192                    // Можно добавить визуальное выделение незаполненных полей
 193                    $(this).addClass('is-invalid');
 194                } else {
 195                    $(this).removeClass('is-invalid');
 196                }
 197            }
 198        });
 199
 200        $('.supplier-select').each(function () {
 201            // Получаем ID заказа из селекта поставщика
 202            var orderId = this.id.split('_')[1];
 203            var statusSelect = document.getElementById('AppStatusId_' + orderId);
 204
 205            // Проверяем, не является ли статус "Отменен"
 206            var selectedStatusText = statusSelect?.options[statusSelect.selectedIndex]?.text?.trim() ?? '';
 207            if (selectedStatusText !== "Отменен") {
 208                if ($(this).val() === '' || $(this).val() === '1') {
 209                    fieldsFilled = false;
 210                    $(this).addClass('is-invalid');
 211                } else {
 212                    $(this).removeClass('is-invalid');
 213                }
 214            }
 215        });
 216
 217        if (!fieldsFilled) {
 218            $('#myModal').modal('show');
 219            return;
 220        }
 221
 222        if (!validateOzonCancelSelections()) {
 223            return;
 224        }
 225
 226        {
 227            $('#staticBackdrop').modal('show');
 228            var formData = $(this).serialize();
 229
 0230            formData += '&userName=' + '@(User.Identity?.Name ?? "")' + '&comment=' + encodeURIComponent(txGetCommentFie
 231
 232            $.ajax({
 0233                url: '@Url.Action("CreateCancelledTransaction", "CancelledTransaction")',
 234                type: 'POST',
 235                data: formData,
 236                success: function (result) {
 237                    $('#staticBackdrop').modal('hide');
 238                    if (result.error) {
 239                        alert(result.error.replace(/<br\s*\/?>/gi, '\n'));
 240                        return;
 241                    }
 242                    if (result.redirectTo) {
 243                        window.location.href = result.redirectTo;
 244                    } else {
 245                        alert('Произошла ошибка: не удалось получить URL для перенаправления.');
 246                    }
 247                },
 248                error: function (xhr, status, error) {
 249                    showFriendlyRequestError(xhr, status, error, 'Ошибка при отправке формы');
 250                }
 251            });
 252        }
 253    });
 254</script>
 255}

Methods/Properties

ExecuteAsync()
<ExecuteAsync()