< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Studio2_Views_WarehouseMapping_Create
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/WarehouseMapping/Create.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 17
Coverable lines: 17
Total lines: 441
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 174
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%600240%
<ExecuteAsync()0%113421060%
<ExecuteAsync()0%506220%
<ExecuteAsync()0%506220%
<ExecuteAsync()100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Views/WarehouseMapping/Create.cshtml

#LineLine coverage
 1@model OzonDomains.Models.WarehouseMapping
 2@using Microsoft.AspNetCore.Mvc.Rendering
 3@{
 04    ViewData["Title"] = "Создание связи складов";
 05    Layout = "~/Views/Shared/_Layout.cshtml";
 6}
 7
 8<style>
 9    .card {
 10        border: none;
 11        box-shadow: 0 0.125rem 0.25rem rgba(var(--og-shadow-rgb), 0.075);
 12        border-radius: 0.5rem;
 13        margin-bottom: 1.5rem;
 14    }
 15
 16    .card-header {
 17        background-color: var(--og-surface-2);
 18        border-bottom: 1px solid var(--og-surface-3);
 19        padding: 1.25rem 1.5rem;
 20    }
 21
 22    .card-body {
 23        padding: 1.5rem;
 24    }
 25
 26    .form-group {
 27        margin-bottom: 1rem;
 28    }
 29
 30    .form-label {
 31        font-weight: 600;
 32        color: var(--og-text-2);
 33        margin-bottom: 0.25rem;
 34        display: block;
 35        font-size: 0.9rem;
 36    }
 37
 38    .form-control, .form-select {
 39        border: 1px solid var(--og-surface-3);
 40        border-radius: 0.25rem;
 41        padding: 0.5rem 0.75rem;
 42        font-size: 0.9rem;
 43        transition: border-color 0.15s ease-in-out;
 44    }
 45
 46    .form-control:focus, .form-select:focus {
 47        border-color: var(--og-accent);
 48        box-shadow: 0 0 0 0.2rem rgba(var(--og-accent-rgb), 0.25);
 49    }
 50
 51    .btn-success {
 52        background-color: var(--og-success-text);
 53        border-color: var(--og-success-text);
 54        padding: 0.5rem 1rem;
 55        font-size: 0.9rem;
 56    }
 57
 58    .btn-secondary {
 59        background-color: var(--og-text-3);
 60        border-color: var(--og-text-3);
 61        padding: 0.5rem 1rem;
 62        font-size: 0.9rem;
 63    }
 64
 65    .connection-visual {
 66        display: flex;
 67        align-items: center;
 68        justify-content: center;
 69        height: 100%;
 70        color: var(--og-accent);
 71    }
 72
 73    .text-muted-small {
 74        font-size: 0.8rem;
 75        color: var(--og-text-3);
 76    }
 77
 78    .form-grid {
 79        display: grid;
 80        grid-template-columns: 1fr auto 1fr;
 81        gap: 1rem;
 82        align-items: end;
 83        margin-bottom: 1.5rem;
 84    }
 85
 86    .section-title {
 87        color: var(--og-text-2);
 88        font-size: 1rem;
 89        margin-bottom: 1rem;
 90        padding-bottom: 0.5rem;
 91        border-bottom: 1px solid var(--og-surface-3);
 92    }
 93
 94    .back-link {
 95        color: var(--og-accent);
 96        text-decoration: none;
 97        font-size: 0.9rem;
 98    }
 99
 100    .back-link:hover {
 101        color: var(--og-accent);
 102        text-decoration: underline;
 103    }
 104
 105    .invalid-feedback {
 106        display: block;
 107        width: 100%;
 108        margin-top: 0.25rem;
 109        font-size: 0.875em;
 110        color: var(--og-danger);
 111    }
 112
 113    .is-invalid {
 114        border-color: var(--og-danger);
 115        padding-right: calc(1.5em + 0.75rem);
 116        background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='1
 117        background-repeat: no-repeat;
 118        background-position: right calc(0.375em + 0.1875rem) center;
 119        background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
 120    }
 121
 122    .alert-warning {
 123        background-color: var(--og-warning-bg);
 124        border-color: var(--og-warning-bg);
 125        color: var(--og-warning-text);
 126    }
 127
 128    .wm-intro {
 129        display: flex;
 130        gap: 0.75rem;
 131        padding: 0.9rem 1.1rem;
 132        background: var(--og-accent-bg);
 133        border: 1px solid var(--og-accent-border);
 134        border-radius: 0.5rem;
 135        margin-bottom: 1.5rem;
 136    }
 137
 138    .wm-intro i.fa-circle-info {
 139        color: var(--og-accent);
 140        font-size: 1.1rem;
 141        margin-top: 0.1rem;
 142        flex-shrink: 0;
 143    }
 144
 145    .wm-intro-text {
 146        font-size: 13px;
 147        color: var(--og-text);
 148        line-height: 1.5;
 149    }
 150</style>
 151
 0152@await Html.PartialAsync("_BsxGridShell")
 153
 154<div class="container bsx-surface">
 155    <div class="row">
 156        <div class="col-12">
 157            <div class="card">
 158                <div class="card-header">
 159                    <h2 style="margin: 0; font-size: 1.5rem;">Создание новой связи складов</h2>
 160                </div>
 161                <div class="card-body">
 162                    <div class="wm-intro">
 163                        <i class="fas fa-circle-info"></i>
 164                        <div class="wm-intro-text">
 165                            Название склада в Ozon и в 1С обычно не совпадает — эта связь говорит системе
 166                            «отгрузка с этого склада Ozon — это физически вот этот склад 1С» для конкретного клиента.
 167                            Она используется при создании документов в 1С (резолвинг склада получателя) и при
 168                            синхронизации остатков Ozon ↔ Bitrix24. Если для одного склада Ozon у клиента заведено
 169                            несколько связей с разными складами 1С — система возьмёт запись с наименьшим <strong>приорит
 170                        </div>
 171                    </div>
 172                    <div asp-validation-summary="ModelOnly" class="alert alert-danger"></div>
 0173                    @if (ViewBag.BitrixWarehouses == null || ViewBag.Warehouses == null)
 174                    {
 175                        <div class="alert alert-warning" role="alert">
 176                            <i class="fas fa-exclamation-triangle me-2"></i>
 177                            <strong>Внимание!</strong> Не удалось загрузить списки складов. Пожалуйста, обновите
 178                            страницу или обратитесь к администратору.
 179                        </div>
 180                    }
 181
 182                    <form asp-area="Studio2" asp-controller="WarehouseMapping" asp-action="Create" method="post"
 183                          id="createForm">
 0184                        @Html.AntiForgeryToken()
 185
 186                        <!-- Выбор клиента -->
 187                        <div class="form-group">
 188                            <h5 class="section-title">
 189                                <i class="fas fa-user me-2"></i>Основные настройки
 190                            </h5>
 191
 192                            <div class="row">
 193                                <div class="col-md-6">
 194                                    <label asp-for="OzonClientId" class="form-label">Клиент</label>
 195                                    <select asp-for="OzonClientId" asp-items="ViewBag.Clients" class="form-select"
 196                                            required>
 197                                        <option value="">-- Выберите клиента --</option>
 198                                    </select>
 199                                    <span asp-validation-for="OzonClientId" class="text-danger small"></span>
 200                                </div>
 201                                <div class="col-md-6">
 202                                    <label asp-for="SupplierId" class="form-label">Поставщик <span class="text-muted">(н
 203                                    <select asp-for="SupplierId" asp-items="ViewBag.Suppliers" class="form-select">
 204                                        <option value="">-- Не указан (универсальная связь) --</option>
 205                                    </select>
 206                                    <div class="text-muted-small mt-1">
 207                                        Связь без поставщика применяется как универсальная запись.
 208                                    </div>
 209                                    <span asp-validation-for="SupplierId" class="text-danger small"></span>
 210                                </div>
 211                                <div class="col-md-6">
 212                                    <label asp-for="DeliveryType" class="form-label">Тип доставки</label>
 213                                    <input asp-for="DeliveryType" class="form-control"
 214                                           placeholder="Например: KBID, KBIA" required/>
 215                                    <div class="text-muted-small mt-1">
 216                                        <i class="fas fa-info-circle me-1"></i>Код типа доставки из имени файла при авто
 217                                        загрузке заказов. Если склад не указан явно в сопоставлении столбцов файла — сис
 218                                        найдёт склад Ozon по этому коду.
 219                                    </div>
 220                                    <span asp-validation-for="DeliveryType" class="text-danger small"></span>
 221                                </div>
 222                            </div>
 223                        </div>
 224
 225                        <!-- Связь складов -->
 226                        <div class="form-group">
 227                            <h5 class="section-title">
 228                                <i class="fas fa-warehouse me-2"></i>Связь складов
 229                            </h5>
 230
 231                            <div class="form-grid">
 232                                <!-- Bitrix склад -->
 233                                <div class="form-group">
 234                                    <label asp-for="BitrixWarehouseName" class="form-label">Склад Bitrix</label>
 235                                    <select asp-for="BitrixWarehouseName" class="form-select" id="BitrixWarehouseSelect"
 236                                            required>
 237                                        <option value="">-- Выберите склад Bitrix --</option>
 0238                                        @if (ViewBag.BitrixWarehouses != null)
 239                                        {
 0240                                            foreach (SelectListItem wh in ViewBag.BitrixWarehouses)
 241                                            {
 0242                                                if (!string.IsNullOrEmpty(wh.Text))
 243                                                {
 0244                                                    <option value="@wh.Text">@wh.Text</option>
 245                                                }
 246                                            }
 247                                        }
 248                                    </select>
 0249                                    @if (ViewBag.BitrixWarehouses == null)
 250                                    {
 251                                        <div class="text-danger small mt-1">
 252                                            <i class="fas fa-exclamation-circle me-1"></i>Список складов Bitrix
 253                                            недоступен
 254                                        </div>
 255                                    }
 256                                    <span asp-validation-for="BitrixWarehouseName" class="text-danger small"></span>
 257                                </div>
 258
 259                                <div class="form-group">
 260                                    <label asp-for="ReturnBitrixWarehouseName" class="form-label">Склад возврата (1С)</l
 261                                    <select asp-for="ReturnBitrixWarehouseName" asp-items="ViewBag.BitrixWarehouses" cla
 262                                        <option value="">-- Не указан --</option>
 263                                    </select>
 264                                    <div class="text-muted-small mt-1">Склад 1С, на который оформляется возврат по этой 
 265                                    <span asp-validation-for="ReturnBitrixWarehouseName" class="text-danger small"></spa
 266                                </div>
 267
 268                                <div class="form-group">
 269                                    <label asp-for="TransitBitrixWarehouseName" class="form-label">Транзитный склад (1С)
 270                                    <select asp-for="TransitBitrixWarehouseName" asp-items="ViewBag.BitrixWarehouses" cl
 271                                        <option value="">-- Не указан --</option>
 272                                    </select>
 273                                    <div class="text-muted-small mt-1">Используется в транзакции «Утерян реализатором» в
 274                                    <span asp-validation-for="TransitBitrixWarehouseName" class="text-danger small"></sp
 275                                </div>
 276
 277                                <!-- Стрелка связи -->
 278                                <div class="connection-visual">
 279                                    <i class="fas fa-arrow-right fa-2x"></i>
 280                                </div>
 281
 282                                <!-- Ozon склад -->
 283                                <div class="form-group">
 284                                    <label asp-for="OzonWarehouseName" class="form-label">Склад Ozon</label>
 285                                    <select asp-for="OzonWarehouseName" class="form-select" id="OzonWarehouseSelect"
 286                                            required>
 287                                        <option value="">-- Выберите склад Ozon --</option>
 0288                                        @if (ViewBag.Warehouses != null)
 289                                        {
 0290                                            foreach (SelectListItem wh in ViewBag.Warehouses)
 291                                            {
 0292                                                if (!string.IsNullOrEmpty(wh.Text))
 293                                                {
 0294                                                    <option value="@wh.Text">@wh.Text</option>
 295                                                }
 296                                            }
 297                                        }
 298                                    </select>
 0299                                    @if (ViewBag.Warehouses == null)
 300                                    {
 301                                        <div class="text-danger small mt-1">
 302                                            <i class="fas fa-exclamation-circle me-1"></i>Список складов Ozon недоступен
 303                                        </div>
 304                                    }
 305                                    <span asp-validation-for="OzonWarehouseName" class="text-danger small"></span>
 306                                </div>
 307                                    <!-- ID склада Ozon -->
 308                                    <div class="form-group mt-2">
 309                                        <label asp-for="OzonWarehouseId" class="form-label">ID склада Ozon</label>
 310                                        <input asp-for="OzonWarehouseId" class="form-control" placeholder="Необязательно
 311                                        <div class="text-muted-small mt-1">
 312                                            <i class="fas fa-info-circle me-1"></i>Числовой ID склада из Ozon Seller API
 313                                            для обратной синхронизации остатков (Bitrix → Ozon), чтобы найти нужный скла
 314                                            offer_id. Название склада для документов 1С не требует этого поля.
 315                                        </div>
 316                                        <span asp-validation-for="OzonWarehouseId" class="text-danger small"></span>
 317                                    </div>
 318                            </div>
 319                        </div>
 320
 321                        <!-- Приоритет -->
 322                        <div class="form-group">
 323                            <div class="row">
 324                                <div class="col-md-3">
 325                                    <label asp-for="Priority" class="form-label">Приоритет</label>
 326                                    <input asp-for="Priority" type="number" min="0" class="form-control" />
 327                                    <div class="text-muted-small mt-1">
 328                                        <i class="fas fa-info-circle me-1"></i>0 — наивысший приоритет. Имеет значение, 
 329                                        для одного и того же склада Ozon у этого клиента заведено несколько связей с раз
 330                                        складами 1С — тогда система возьмёт запись с наименьшим приоритетом (при равенст
 331                                    </div>
 332                                    <span asp-validation-for="Priority" class="text-danger small"></span>
 333                                </div>
 334                            </div>
 335                        </div>
 336
 337                        <!-- Кнопки действий -->
 338                        <div class="form-group mt-4 pt-3 border-top">
 339                            <div class="d-flex gap-2">
 340                                <button type="submit" class="btn btn-success"
 0341                                        @(ViewBag.BitrixWarehouses == null || ViewBag.Warehouses == null ? "disabled" : 
 342                                    <i class="fas fa-plus-circle me-1"></i>Создать связь
 343                                </button>
 344                                <a asp-area="Studio2" asp-controller="WarehouseMapping" asp-action="Index"
 345                                   class="btn btn-secondary">
 346                                    <i class="fas fa-arrow-left me-1"></i>Отмена
 347                                </a>
 348                            </div>
 349                        </div>
 350                    </form>
 351
 352                    <div class="mt-3">
 353                        <a asp-area="Studio2" asp-controller="WarehouseMapping" asp-action="Index" class="back-link">
 354                            <i class="fas fa-arrow-left me-1"></i>Назад к списку связей
 355                        </a>
 356                    </div>
 357                </div>
 358            </div>
 359        </div>
 360    </div>
 361</div>
 362
 363@section Scripts {
 0364    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
 365
 366    <script>
 367        document.addEventListener('DOMContentLoaded', function () {
 368            const form = document.getElementById('createForm');
 369            const bitrixSelect = document.getElementById('BitrixWarehouseSelect');
 370            const ozonSelect = document.getElementById('OzonWarehouseSelect');
 371
 372            // Функция для поиска опции по значению
 373            function findOptionByValue(selectElement, value) {
 374                for (let i = 0; i < selectElement.options.length; i++) {
 375                    if (selectElement.options[i].value === value) {
 376                        return selectElement.options[i];
 377                    }
 378                }
 379                return null;
 380            }
 381
 382            // Валидация выбора складов
 383            function validateWarehouseSelections() {
 384                let isValid = true;
 385
 386                // Проверка Bitrix склада
 387                if (bitrixSelect.value === "") {
 388                    bitrixSelect.classList.add('is-invalid');
 389                    isValid = false;
 390                } else {
 391                    bitrixSelect.classList.remove('is-invalid');
 392                }
 393
 394                // Проверка Ozon склада
 395                if (ozonSelect.value === "") {
 396                    ozonSelect.classList.add('is-invalid');
 397                    isValid = false;
 398                } else {
 399                    ozonSelect.classList.remove('is-invalid');
 400                }
 401
 402                return isValid;
 403            }
 404
 405            // Обработчик отправки формы
 406            form.addEventListener('submit', function (event) {
 407                if (!validateWarehouseSelections()) {
 408                    event.preventDefault();
 409                    event.stopPropagation();
 410
 411                    // Показываем сообщения об ошибках
 412                    const errorDivs = form.querySelectorAll('.invalid-feedback');
 413                    errorDivs.forEach(div => {
 414                        if (div.parentElement.querySelector('.form-select.is-invalid')) {
 415                            div.style.display = 'block';
 416                        }
 417                    });
 418                }
 419
 420                form.classList.add('was-validated');
 421            }, false);
 422
 423            // Обработчики изменения выбора
 424            if (bitrixSelect) {
 425                bitrixSelect.addEventListener('change', function () {
 426                    if (this.value !== "") {
 427                        this.classList.remove('is-invalid');
 428                    }
 429                });
 430            }
 431
 432            if (ozonSelect) {
 433                ozonSelect.addEventListener('change', function () {
 434                    if (this.value !== "") {
 435                        this.classList.remove('is-invalid');
 436                    }
 437                });
 438            }
 439        });
 440    </script>
 441}