| | | 1 | | @model OzonOrdersWeb.Areas.Studio2.ViewModels.Bitrix.RemainingStockViewModel |
| | | 2 | | @{ |
| | 0 | 3 | | var warehouseStockUrl = Url.Action("Index", "WarehouseStock", new { area = "Studio2" })!; |
| | 0 | 4 | | var mappingUrl = Url.Action("Index", "WarehouseMapping", new { area = "Studio2" })!; |
| | 0 | 5 | | var syncSubTab = (ViewBag.SyncSubTab as string) ?? "pipeline"; |
| | 0 | 6 | | var isPipelineSubTab = string.Equals(syncSubTab, "pipeline", StringComparison.OrdinalIgnoreCase); |
| | 0 | 7 | | var pipelineUrl = Url.Action("Index", "BitrixStock", new { area = "Studio2", tab = "sync", syncSubTab = "pipeline" } |
| | 0 | 8 | | var automationUrl = Url.Action("Index", "BitrixStock", new { area = "Studio2", tab = "sync", syncSubTab = "google-au |
| | 0 | 9 | | var bsxRowsUrl = Url.Action("GetSyncReportGridRows", "BitrixStock", new { area = "Studio2", reportId = "__REPORTID__ |
| | 0 | 10 | | var bsxFacetsUrl = Url.Action("GetSyncReportGridFacets", "BitrixStock", new { area = "Studio2", reportId = "__REPORT |
| | 0 | 11 | | var bsxNamesUrl = Url.Action("GetSyncReportProductNames", "BitrixStock", new { area = "Studio2", reportId = "__REPOR |
| | | 12 | | } |
| | | 13 | | |
| | | 14 | | @* Гриды вкладки — модули поверх общей оболочки Shared/_BsxGridShell (Index.cshtml). *@ |
| | | 15 | | <script> |
| | | 16 | | Object.assign(window.bsxGridConfig, { |
| | 0 | 17 | | runsUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Url.Action("GetSyncRunsGrid", "BitrixStock", new { |
| | 0 | 18 | | reportRowsUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(bsxRowsUrl)), |
| | 0 | 19 | | reportFacetsUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(bsxFacetsUrl)), |
| | 0 | 20 | | productNamesUrl: @Html.Raw(System.Text.Json.JsonSerializer.Serialize(bsxNamesUrl)) |
| | | 21 | | }); |
| | | 22 | | </script> |
| | | 23 | | <script src="~/js/Studio2/BitrixStock/SyncGrid/bsx-sync-runs.js" asp-append-version="true"></script> |
| | | 24 | | <script src="~/js/Studio2/BitrixStock/SyncGrid/bsx-sync-report.js" asp-append-version="true"></script> |
| | | 25 | | <script src="~/js/Studio2/BitrixStock/SyncGrid/bsx-sync-view.js" asp-append-version="true"></script> |
| | | 26 | | |
| | | 27 | | <ul class="nav bsx-subtabs mb-3"> |
| | | 28 | | <li class="nav-item"> |
| | | 29 | | <a class="nav-link @(isPipelineSubTab ? "active" : "")" href="@pipelineUrl"> |
| | | 30 | | <i class="fas fa-project-diagram me-1"></i>Пайплайн синхронизации |
| | | 31 | | </a> |
| | | 32 | | </li> |
| | | 33 | | <li class="nav-item"> |
| | | 34 | | <a class="nav-link @(!isPipelineSubTab ? "active" : "")" href="@automationUrl"> |
| | | 35 | | <i class="fas fa-clock me-1"></i>Автозапуск Google Sync |
| | | 36 | | </a> |
| | | 37 | | </li> |
| | | 38 | | </ul> |
| | | 39 | | |
| | 0 | 40 | | @if (isPipelineSubTab) |
| | | 41 | | { |
| | | 42 | | <div class="bsx-intro-card"> |
| | | 43 | | <h6>Как запустить отчёт</h6> |
| | | 44 | | <ol class="mb-2 small ps-3"> |
| | | 45 | | <li>Убедитесь, что актуален snapshot остатков на странице |
| | | 46 | | <a href="@warehouseStockUrl" target="_blank">WarehouseStock</a> (источник данных 1С). |
| | | 47 | | </li> |
| | | 48 | | <li>Проверьте <a href="@mappingUrl" target="_blank">связи складов</a> 1С ↔ Ozon для выбранного клиента.</li> |
| | | 49 | | <li>Выберите клиента Ozon и склады 1С (B1, B2, M1, M2, M3), при необходимости — артикул для ограничения snap |
| | | 50 | | <li>Нажмите <strong>Сформировать отчёт</strong> — задание уйдёт в Hangfire; запуск сохраняется в <code>Bitri |
| | | 51 | | <li>В таблице <strong>История обработок</strong> откройте любой завершённый отчёт кнопкой «Открыть».</li> |
| | | 52 | | <li>В отчёт попадают все товары snapshot; отдельно помечаются «не найден в Ozon» для клиента. Фильтры — над |
| | | 53 | | <li><strong>Этап 2:</strong> после отчёта — «Выполнить синхронизацию в Ozon» (выбор ↑/↓/⊘, лимит строк). Усп |
| | | 54 | | <li>Строки отчёта: ↑ накатить, ↓ уменьшить, ⊘ обнулить, ✓ без изменений. |
| | | 55 | | <span class="text-muted">В Ozon остатки не меняются (dry-run).</span> |
| | | 56 | | </li> |
| | | 57 | | </ol> |
| | | 58 | | <p class="mb-0 small text-muted"> |
| | | 59 | | URL вкладки: <code>/Studio2/BitrixStock?tab=sync</code> |
| | | 60 | | </p> |
| | | 61 | | </div> |
| | | 62 | | |
| | 0 | 63 | | @await Html.PartialAsync("_SyncReportCard", Model) |
| | | 64 | | } |
| | | 65 | | else |
| | | 66 | | { |
| | 0 | 67 | | @await Html.PartialAsync("_SyncGoogleAutomationTab", Model) |
| | | 68 | | } |
| | | 69 | | |
| | | 70 | | @* Скрипт исключений нужен на sync-табе для кнопки ban на карточках пресетов *@ |
| | | 71 | | <script> |
| | 0 | 72 | | window.excOzonClients = @Html.Raw(System.Text.Json.JsonSerializer.Serialize( |
| | 0 | 73 | | Model.OzonClients.Select(c => new { id = c.Id, name = c.Name ?? $"ID {c.Id}" }).ToList() |
| | 0 | 74 | | )); |
| | | 75 | | window.bitrixStockExceptionsApi = { |
| | 0 | 76 | | articles: '@Url.Action("GetExceptionArticles", "BitrixStock", new { area = "Studio2" })', |
| | 0 | 77 | | prices: '@Url.Action("GetClientPrices", "BitrixStock", new { area = "Studio2" })', |
| | 0 | 78 | | stockRules: '@Url.Action("GetStockRules", "BitrixStock", new { area = "Studio2" })' |
| | | 79 | | }; |
| | | 80 | | </script> |
| | | 81 | | <script src="~/js/Studio2/BitrixStock/bitrix-stock-exceptions.js" asp-append-version="true"></script> |
| | | 82 | | <script src="~/js/st2-channel-task.js" asp-append-version="true"></script> |