< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Studio2_Views_ShippedToClientTransaction_CreateShippedToClientTransaction
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/ShippedToClientTransaction/CreateShippedToClientTransaction.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 23
Coverable lines: 23
Total lines: 323
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 52
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%506220%
<ExecuteAsync()0%930300%
<ExecuteAsync()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/ShippedToClientTransaction/CreateShippedToClientTransaction.cshtml

#LineLine coverage
 1@using OzonDomains.Models
 2@using OzonOrdersWeb.ViewModels.OrderViewModels
 3@using OzonOrdersWeb.Areas.Studio2.ViewModels.ShippedToClientTransaction
 4@model CreateShippedToClientTransactionModel
 5
 6@{
 07    var viewModel = Model!;
 08    var orders = viewModel.Orders;
 09    var ordersCount = orders.Count;
 010    var oneCOperationDateLabel = viewModel.OneCOperationDate.ToString("dd.MM.yyyy HH:mm");
 011    ViewData["Title"] = $"Отгружен клиенту ({ordersCount} заказов)";
 012    Layout = "~/Views/Shared/_Layout.cshtml";
 13}
 14
 15<partial name="~/Areas/Studio2/Views/Partials/Transaction/_TransactionPageStyles.cshtml"/>
 16<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
 17
 18<script src="~/js/Studio2/Orders/CreateOrderToSupplierTransactionV2/generateInfoRow.js"></script>
 19
 20<div id="loadingSpinner" class="spinner-overlay" style="display: none; background-color: inherit;">
 21    <div class="spinner-border text-primary" role="status">
 22        <span class="sr-only"></span>
 23    </div>
 24</div>
 25
 26<div id="messageContainer" class="position-fixed top-0 end-0 p-3" style="z-index: 1050;">
 27    <div id="flashMessage" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
 28        <div class="toast-header">
 29            <strong class="me-auto">Сообщение</strong>
 30            <button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
 31        </div>
 32        <div class="toast-body">
 33            <span id="flashMessageText"></span>
 34        </div>
 35    </div>
 36</div>
 37
 38<div class="modal fade" id="cartModal" tabindex="-1" aria-labelledby="cartModalLabel" aria-hidden="true">
 39    <div class="modal-dialog modal-lg modal-dialog-scrollable">
 40        <div class="modal-content rounded-3 shadow">
 41            <div class="modal-header">
 42                <h5 class="modal-title" id="cartModalLabel">Корзина</h5>
 43                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
 44            </div>
 45            <div class="modal-body" id="cartModalBody">
 46                <!-- Контент корзины будет вставлен сюда -->
 47            </div>
 48            <div class="modal-footer">
 49                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
 50            </div>
 51        </div>
 52    </div>
 53</div>
 54
 055@if (!string.IsNullOrWhiteSpace(ViewData["TransactionWarningMessage"]?.ToString()))
 56{
 57    <div class="tx-page-alert tx-page-alert--warning" role="alert">
 58        <div class="fw-semibold mb-1">
 59            <i class="fas fa-triangle-exclamation me-2"></i>Некоторые заказы пропущены
 60        </div>
 061        <div>@Html.Raw(ViewData["TransactionWarningMessage"])</div>
 62    </div>
 63}
 64
 065@if (orders.Count > 0)
 66{
 67    <form asp-area="Studio2" asp-controller="ShippedToClientTransaction" asp-action="CreateShippedToClientTransaction"
 68          id="createOrderForm">
 69        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
 70        <input type="hidden" asp-for="RedirectPage"/>
 71        <input type="hidden" asp-for="TrackingKey"/>
 072        <input asp-for="OneCOperationDate" type="hidden" value="@Model.OneCOperationDate.ToString("yyyy-MM-ddTHH:mm")" /
 73
 074        @await Html.PartialAsync("_TransactionTable", Model)
 75
 76        <input type="hidden" name="stockItemsJson" id="stockItemsJson"/>
 77        <div class="tx-page-options">
 78            <div class="form-check mb-0">
 79                <input class="form-check-input" type="checkbox" id="processIn1C" name="processIn1C" value="true" checked
 80                <label class="form-check-label" for="processIn1C">
 81                    <i class="fas fa-database me-1"></i>
 82                    Провести в 1С
 83                </label>
 84            </div>
 085            @await Html.PartialAsync("_OneCOrgSelector", Model)
 86            <div class="one-c-date-inline">
 87                <span class="one-c-date-inline-label">Дата проведения:</span>
 088                <span class="one-c-date-inline-value">@oneCOperationDateLabel МСК</span>
 89            </div>
 90        </div>
 91
 92        <!-- ================== МОДАЛЬНОЕ ОКНО ================== -->
 93        <div class="modal fade" id="transactionModal" tabindex="-1" aria-labelledby="transactionModalLabel"
 94             aria-hidden="true">
 95            <div class="modal-dialog">
 96                <div class="modal-content">
 97                    <div class="modal-header bg-light">
 98                        <h5 class="modal-title" id="transactionModalLabel">Данные документа</h5>
 99                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
 100                    </div>
 101
 102                    <div class="modal-body">
 103                        <div class="mb-3">
 104                            <label for="ContractLink" class="form-label">Договор</label>
 105                            <select id="ContractLink" name="contractLink" class="form-select" required="">
 106                                <option value="">-- Выберите договор --</option>
 0107                                @if (Model.Treaties != null)
 108                                {
 0109                                    @foreach (var t in Model.Treaties)
 110                                    {
 0111                                        <option value="@t.Link">
 0112                                            @t.Name (@t.Partner)
 113                                        </option>
 114                                    }
 115                                }
 116                            </select>
 117                        </div>
 118
 119                        <div class="mb-3">
 120                            <label for="VatRate" class="form-label">НДС</label>
 121                            <select id="VatRate" name="vatRate" class="form-select">
 122                                <option value="">Не облагается НДС</option>
 123                                <option value="20">20%</option>
 124                                <option value="22" selected>22%</option>
 125                            </select>
 126                        </div>
 127
 128                        <div class="mb-3">
 129                            <label for="TransactionComment" class="form-label">Комментарий</label>
 130                            <textarea id="TransactionComment" name="transactionComment" class="form-control" rows="3"
 131                                      placeholder="Введите комментарий..."></textarea>
 132                        </div>
 133
 134                    </div>
 135
 136                    <div class="modal-footer">
 137                        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
 138                        <button type="button" id="confirmSubmit" class="btn btn-primary">Подтвердить и сохранить
 139                        </button>
 140                    </div>
 141                </div>
 142            </div>
 143        </div>
 144
 145        <div class="tx-page-footer">
 146            <div class="input-group">
 147                <span class="input-group-btn">
 148                    <input type="button" value="Сохранить" id="openModalBtn"
 149                           style="width: 170px;"
 150                           class="btn btn-primary"/>
 151                </span>
 152            </div>
 153        </div>
 154    </form>
 155}
 156else
 157{
 0158    @await Html.PartialAsync("_TransactionErrorPanel")
 159}
 160
 161<div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"
 162     aria-labelledby="staticBackdropLabel" aria-hidden="true">
 163    <div class="modal-dialog">
 164        <div class="modal-content orders-modal orders-modal--primary">
 165            <div class="modal-header">
 166                <h5 class="modal-title" id="staticBackdropLabel">Создание журнала документов</h5>
 167                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
 168            </div>
 169            <div class="modal-body">
 170                <div class="d-flex justify-content-center">
 171                    <div class="spinner-border text-primary" role="status">
 172                        <span class="sr-only">.</span>
 173                    </div>
 174                </div>
 175            </div>
 176        </div>
 177    </div>
 178</div>
 179
 180<div>
 181    <a asp-action="Index" class="tx-page-back-link">← К списку заказов</a>
 182</div>
 183
 184<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
 185    <div class="modal-dialog" role="document">
 186        <div class="modal-content orders-modal orders-modal--warning">
 187            <div class="modal-header">
 188                <h4 class="modal-title" id="myModalLabel">Поля не заполнены</h4>
 189            </div>
 190            <div class="modal-body">
 191                Одно или несколько полей не заполнены. Пожалуйста, заполните все поля перед отправкой формы.
 192            </div>
 193        </div>
 194    </div>
 195</div>
 196
 197
 198<!-- Модальное окно для отображения увеличенного изображения -->
 199<div class="modal fade" id="imageModal" tabindex="-1" aria-labelledby="imageModalLabel" aria-hidden="true">
 200    <div class="modal-dialog modal-dialog-centered">
 201        <div class="modal-content">
 202            <div class="modal-header">
 203                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
 204            </div>
 205            <div class="modal-body text-center">
 206                <img id="modalImage" src="" alt="Full Image" class="img-fluid rounded border">
 207            </div>
 208        </div>
 209    </div>
 210</div>
 211
 212<input type="hidden" id="deletedOrders" name="deletedOrders"/>
 213@* Скрипты таблицы нужны только когда она отрисована; на панели ошибки они падали на пустом DOM *@
 0214@if (orders.Count > 0)
 215{
 0216@await Html.PartialAsync("_TransactionScript", Model)
 217<script>
 218    document.addEventListener("DOMContentLoaded", function () {
 219        const openModalBtn = document.getElementById("openModalBtn");
 220        const processIn1CCheckbox = document.getElementById("processIn1C");
 221        const form = document.getElementById("createOrderForm");
 222
 223        const transactionModalEl = document.getElementById("transactionModal");
 224        const transactionModal = transactionModalEl ? new bootstrap.Modal(transactionModalEl) : null;
 225
 226        function validateOrderFields() {
 227            var fieldsFilled = true;
 228            document.querySelectorAll('.purchase-price-field').forEach(function (el) {
 229                var orderId = el.id.split('_')[1];
 230                var statusSelect = document.getElementById('AppStatusId_' + orderId);
 231                var selectedStatusText = statusSelect?.options[statusSelect.selectedIndex]?.text?.trim() ?? '';
 232                if (selectedStatusText !== "Отменен") {
 233                    if (!el.value) {
 234                        fieldsFilled = false;
 235                        el.classList.add('is-invalid');
 236                    } else {
 237                        el.classList.remove('is-invalid');
 238                    }
 239                }
 240            });
 241            document.querySelectorAll('.supplier-select').forEach(function (el) {
 242                var orderId = el.id.split('_')[1];
 243                var statusSelect = document.getElementById('AppStatusId_' + orderId);
 244                var selectedStatusText = statusSelect?.options[statusSelect.selectedIndex]?.text?.trim() ?? '';
 245                if (selectedStatusText !== "Отменен") {
 246                    if (!el.value || el.value === '1') {
 247                        fieldsFilled = false;
 248                        el.classList.add('is-invalid');
 249                    } else {
 250                        el.classList.remove('is-invalid');
 251                    }
 252                }
 253            });
 254            return fieldsFilled;
 255        }
 256
 257        function submitForm() {
 258            // Отправка идёт не через submit формы (кнопка type="button" + прямой $.ajax), поэтому
 259            // проверка остатков 1С вызывается здесь явно — перехватить событие тут нечего.
 260            if (window.txOneCStockGuard) {
 261                window.txOneCStockGuard(sendTransaction);
 262                return;
 263            }
 264            sendTransaction();
 265        }
 266
 267        function sendTransaction() {
 268            $('#staticBackdrop').modal('show');
 269            var formData = $(form).serialize();
 0270            formData += '&userName=' + '@(User.Identity?.Name ?? "")' + '&comment=' + encodeURIComponent(txGetCommentFie
 271
 272            $.ajax({
 0273                url: '@Url.Action("CreateShippedToClientTransaction", "ShippedToClientTransaction")',
 274                type: 'POST',
 275                data: formData,
 276                success: function (result) {
 277                    if (result.redirectTo) {
 278                        window.location.href = result.redirectTo;
 279                    } else {
 280                        alert('Произошла ошибка: не удалось получить URL для перенаправления.');
 281                    }
 282                },
 283                error: function (xhr, status, error) {
 284                    showFriendlyRequestError(xhr, status, error, 'Ошибка при отправке формы');
 285                }
 286            });
 287        }
 288
 289        if (openModalBtn) {
 290            openModalBtn.addEventListener("click", function (e) {
 291                e.preventDefault();
 292
 293                if (!validateOrderFields()) {
 294                    $('#myModal').modal('show');
 295                    return;
 296                }
 297
 298                if (processIn1CCheckbox && processIn1CCheckbox.checked && transactionModal) {
 299                    transactionModal.show();
 300                } else {
 301                    submitForm();
 302                }
 303            });
 304        }
 305
 306        // Подтверждение из модалки
 307        const confirmSubmitBtn = document.getElementById("confirmSubmit");
 308        if (confirmSubmitBtn) {
 309            confirmSubmitBtn.addEventListener("click", function () {
 310                const contract = document.getElementById("ContractLink").value.trim();
 311                if (!contract) {
 312                    alert("Пожалуйста, выберите договор.");
 313                    return;
 314                }
 315                if (transactionModal) transactionModal.hide();
 316                submitForm();
 317            });
 318        }
 319    });
 320</script>
 321
 0322@await Html.PartialAsync("_OneCStockCheckScript")
 323}