work-license-server 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/assets/admin.js +572 -0
- package/assets/landing.css +72 -1
- package/assets/landing.js +315 -332
- package/bin/server.mjs +5 -2
- package/package.json +1 -1
- package/src/admin.js +319 -0
- package/src/agent.js +71 -5
- package/src/catalog.js +141 -8
- package/src/crypto.js +251 -17
- package/src/index.js +22 -1
- package/src/landing.js +94 -171
- package/src/server.js +229 -24
- package/src/store.js +693 -47
- package/src/yookassa.js +22 -8
package/src/landing.js
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
FRANCHISE_PROGRAM,
|
|
17
17
|
REGIONS_CATALOG,
|
|
18
18
|
PARTNER_TRAINING_TRACKS,
|
|
19
|
+
PUBLIC_OFERTA,
|
|
19
20
|
} from './catalog.js';
|
|
20
21
|
|
|
21
22
|
const ICON_PATHS = {
|
|
@@ -50,6 +51,7 @@ const ICON_PATHS = {
|
|
|
50
51
|
image: 'M4 5h16v14H4z M4 16l5-5 4 4 3-3 4 4 M15 9h.01',
|
|
51
52
|
search: 'M11 4a7 7 0 1 0 0 14a7 7 0 1 0 0-14 M20 20l-4-4',
|
|
52
53
|
key: 'M8 14a4 4 0 1 0 0-8a4 4 0 1 0 0 8 M11 10h10 M17 10v4 M20 10v3',
|
|
54
|
+
cart: 'M4 5h2l2.4 9.5a2 2 0 0 0 2 1.5h7.2a2 2 0 0 0 1.9-1.4L21 8H7 M9 20a1 1 0 1 0 0-2a1 1 0 1 0 0 2 M18 20a1 1 0 1 0 0-2a1 1 0 1 0 0 2',
|
|
53
55
|
};
|
|
54
56
|
|
|
55
57
|
export function icon(name) {
|
|
@@ -139,6 +141,7 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
139
141
|
districts: FEDERAL_DISTRICTS,
|
|
140
142
|
ai: AI_PLATFORM,
|
|
141
143
|
vendor: VENDOR_CONTACTS,
|
|
144
|
+
oferta: PUBLIC_OFERTA,
|
|
142
145
|
icons: ICON_PATHS,
|
|
143
146
|
initialStage,
|
|
144
147
|
};
|
|
@@ -188,8 +191,8 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
188
191
|
|
|
189
192
|
<div class="top-actions">
|
|
190
193
|
<button class="icon-btn" id="btnTheme" onclick="toggleTheme()" title="Светлая / тёмная тема" aria-label="Переключить тему">${icon('sun')}</button>
|
|
191
|
-
<button class="btn btn-ghost btn-sm"
|
|
192
|
-
<button class="btn btn-ghost btn-sm" id="btnAuth" data-action="auth">${icon('user')}<span id="btnAuthText"
|
|
194
|
+
<button class="btn btn-ghost btn-sm" data-action="open-oferta" title="Публичный договор-оферта ODANT-WORK">${icon('docs')}<span>Оферта</span></button>
|
|
195
|
+
<button class="btn btn-ghost btn-sm" id="btnAuth" data-action="auth">${icon('user')}<span id="btnAuthText">Войти / Регистрация</span></button>
|
|
193
196
|
<button class="btn btn-primary btn-sm" data-stage="order">Заказать</button>
|
|
194
197
|
</div>
|
|
195
198
|
</header>
|
|
@@ -361,8 +364,16 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
361
364
|
<div><span class="kicker">Заказ</span><h2 class="h2">Программно-аппаратный комплекс ODANT-WORK</h2></div>
|
|
362
365
|
<p>Сервер AMD Ryzen™ AI Max+ PRO 495 · 192 ГБ · 4 ТБ с установленной платформой, вечной лицензией на ${P.baseSeats} мест и 1 годом поддержки Enterprise (дальше — по желанию). Оплата через ЮKassa с чеком по 54-ФЗ.</p>
|
|
363
366
|
</div>
|
|
367
|
+
<div class="card oferta-banner" data-oferta-banner></div>
|
|
364
368
|
<div class="split">
|
|
365
369
|
<div class="card">
|
|
370
|
+
<div class="field">
|
|
371
|
+
<label>Вариант базовой поставки</label>
|
|
372
|
+
<div class="seg" id="segPakVariant">
|
|
373
|
+
<button data-variant="pak" class="on">Комплект с машиной<small>${rub(P.basePriceRub)} · железо + 10 мест</small></button>
|
|
374
|
+
<button data-variant="license_only">Базовая лицензия без железа<small>${rub(P.baseLicensePriceRub || 4_000_000)} · 10 вечных мест</small></button>
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
366
377
|
<div class="row2">
|
|
367
378
|
<div class="field"><label for="inpPakOrg">Организация</label><input type="text" id="inpPakOrg" value="ООО «Маслоторг»"></div>
|
|
368
379
|
<div class="field"><label for="inpPakInn">ИНН</label><input type="text" id="inpPakInn" value="7701234567" inputmode="numeric"></div>
|
|
@@ -376,24 +387,35 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
376
387
|
<label>Уровень поддержки дополнительных мест</label>
|
|
377
388
|
<div class="seg" id="segPakTier">${Object.values(SLA_TIERS).map(t => `<button data-tier="${t.id}" class="${t.id === 'business' ? 'on' : ''}">${esc(t.name)}<small>${rub(t.pricePerUserYearRub)}/год</small></button>`).join('')}</div>
|
|
378
389
|
</div>
|
|
379
|
-
<p class="note muted" style="margin:6px 0 0">Уже есть комплекс? <a href="#" data-action="addons">Войдите в
|
|
390
|
+
<p class="note muted" style="margin:6px 0 0">Уже есть комплекс? <a href="#" data-action="addons">Войдите в кабинет и подпишите оферту</a>, чтобы докупить места со скидкой или получить токен привязки.</p>
|
|
380
391
|
</div>
|
|
381
392
|
<div class="card summary card-glow">
|
|
382
393
|
<span class="kicker">Итого</span>
|
|
383
394
|
<div class="sum-total" id="lblPakTotal">${rub(P.basePriceRub)}</div>
|
|
384
395
|
<div class="sum-lines" id="lblPakBreakdown"></div>
|
|
385
396
|
<button class="btn btn-primary btn-lg" style="width:100%" data-action="order-pak">Оформить и оплатить через ЮKassa</button>
|
|
397
|
+
<button class="btn btn-ghost btn-sm" style="width:100%;margin-top:8px" data-action="order-pak-invoice">Выставить счёт-договор (для юр. лиц)</button>
|
|
386
398
|
<div class="status" id="pakOrderStatus"></div>
|
|
387
399
|
</div>
|
|
388
400
|
</div>
|
|
389
401
|
</section>
|
|
390
402
|
|
|
391
|
-
<!-- ============ ДОКУПКА ЛИЦЕНЗИЙ (только после входа) ============ -->
|
|
403
|
+
<!-- ============ ДОКУПКА ЛИЦЕНЗИЙ И ЛИЧНЫЙ КАБИНЕТ (только после входа и подписания оферты) ============ -->
|
|
392
404
|
<section class="stage" id="stage-addons">
|
|
393
405
|
<div class="sec-head">
|
|
394
|
-
<div><span class="kicker">Личный
|
|
406
|
+
<div><span class="kicker">Личный кабинет владельца</span><h2 class="h2">Токен привязки локальной системы и покупка лицензий</h2></div>
|
|
395
407
|
<p id="userBadgeBox"></p>
|
|
396
408
|
</div>
|
|
409
|
+
<div class="card oferta-banner" data-oferta-banner></div>
|
|
410
|
+
<div class="card" style="margin-bottom:20px">
|
|
411
|
+
<span class="kicker">Ключ доступа для локального сервера WORK</span>
|
|
412
|
+
<h3 class="h3" style="margin:4px 0 8px">Токен владельца (содержит URL сервера поддержки и ключ синхронизации лицензий)</h3>
|
|
413
|
+
<p class="small" style="margin:0 0 10px">Скопируйте этот токен и вставьте его в раздел «Лицензирование» вашей локальной системы ODANT-WORK. Система автоматически привяжется к личному кабинету и загрузит файлы лицензий в папку <code>#system</code>.</p>
|
|
414
|
+
<div style="display:flex;gap:10px;flex-wrap:wrap;align-items:center">
|
|
415
|
+
<input type="text" id="inpCabinetHubToken" readonly placeholder="owk1..." style="flex:1;min-width:260px;font-family:monospace">
|
|
416
|
+
<button class="btn btn-ghost btn-sm" data-action="gen-hub-token">Сгенерировать / Обновить токен</button>
|
|
417
|
+
</div>
|
|
418
|
+
</div>
|
|
397
419
|
<div class="split">
|
|
398
420
|
<div class="card">
|
|
399
421
|
<div class="field">
|
|
@@ -408,7 +430,7 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
408
430
|
<div class="seg" id="segTier">${Object.values(SLA_TIERS).map(t => `<button data-tier="${t.id}" class="${t.id === 'business' ? 'on' : ''}">${esc(t.name)}<small>${rub(t.pricePerUserYearRub)} · ${esc(t.reactionLabel)}</small></button>`).join('')}</div>
|
|
409
431
|
</div>
|
|
410
432
|
<div class="row2">
|
|
411
|
-
<div class="field"><label for="inpYears">Срок,
|
|
433
|
+
<div class="field"><label for="inpYears">Срок, лет (кратно годам)</label><input type="number" id="inpYears" min="1" max="5" value="1"></div>
|
|
412
434
|
<div class="field"><label for="inpLicId">Лицензия комплекса</label><input type="text" id="inpLicId" readonly></div>
|
|
413
435
|
</div>
|
|
414
436
|
<div class="field" style="margin-top:6px"><label>Скидка от количества</label>${renderLadder('ladderAddons')}</div>
|
|
@@ -419,6 +441,7 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
419
441
|
<div class="small" id="lblDiscountBadge" style="color:var(--ok);font-weight:650"></div>
|
|
420
442
|
<div class="sum-lines" id="lblBreakdown"></div>
|
|
421
443
|
<button class="btn btn-primary btn-lg" style="width:100%" data-action="order-addons">Оплатить через ЮKassa</button>
|
|
444
|
+
<button class="btn btn-ghost btn-sm" style="width:100%;margin-top:8px" data-action="order-addons-invoice">Выставить счёт-договор (для юр. лиц)</button>
|
|
422
445
|
<div class="status" id="orderStatus"></div>
|
|
423
446
|
</div>
|
|
424
447
|
</div>
|
|
@@ -430,6 +453,7 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
430
453
|
<div><span class="kicker">Партнёрская программа</span><h2 class="h2">Региональная франшиза ODANT-WORK</h2></div>
|
|
431
454
|
<p>Число франшиз в субъекте пропорционально населению, паушальный взнос — экономике региона. Резерв закрепляется сразу после невозвратного залога ${rub(FRANCHISE_PROGRAM.reservationDepositRub)}, полная оплата паушального взноса — в течение 1 года.</p>
|
|
432
455
|
</div>
|
|
456
|
+
<div class="card oferta-banner" data-oferta-banner></div>
|
|
433
457
|
<div class="stats">
|
|
434
458
|
<div class="stat"><b id="statVacant">${totalVacant}</b><span>вакантных франшиз</span></div>
|
|
435
459
|
<div class="stat"><b>${visibleRegions.length}</b><span>субъектов РФ</span></div>
|
|
@@ -567,14 +591,13 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
567
591
|
</div>
|
|
568
592
|
<div class="card">
|
|
569
593
|
<div style="display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap">
|
|
570
|
-
<h3 class="h3" style="margin:0"
|
|
594
|
+
<h3 class="h3" style="margin:0">Ваша лицензия и привязка мессенджеров</h3>
|
|
571
595
|
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
|
572
|
-
<button class="btn btn-ghost btn-sm" data-action="
|
|
573
|
-
<button class="btn btn-
|
|
574
|
-
<button class="btn btn-primary btn-sm" data-stage="admin">Открыть админку →</button>
|
|
596
|
+
<button class="btn btn-ghost btn-sm" data-action="auth">Личный кабинет</button>
|
|
597
|
+
<button class="btn btn-ghost btn-sm" data-action="open-oferta">Договор-оферта</button>
|
|
575
598
|
</div>
|
|
576
599
|
</div>
|
|
577
|
-
<div class="console" id="
|
|
600
|
+
<div class="console" id="clientLicenseBox" style="margin-top:14px">Войдите в личный кабинет и подпишите договор-оферту, чтобы получить код привязки вашего комплекса к ботам MAX, Telegram и VK.</div>
|
|
578
601
|
</div>
|
|
579
602
|
</div>
|
|
580
603
|
<div class="card">
|
|
@@ -593,155 +616,6 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
593
616
|
</div>
|
|
594
617
|
</section>
|
|
595
618
|
|
|
596
|
-
<!-- ============ АДМИНКА СЕРВЕРА ЛИЦЕНЗИЙ (/admin) ============ -->
|
|
597
|
-
<section class="stage" id="stage-admin">
|
|
598
|
-
<div class="sec-head">
|
|
599
|
-
<div>
|
|
600
|
-
<span class="kicker">Центр сертификации и биллинга · /admin</span>
|
|
601
|
-
<h2 class="h2">Админ-панель сервера лицензий ODANT-WORK</h2>
|
|
602
|
-
</div>
|
|
603
|
-
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
|
604
|
-
<button class="btn btn-ghost btn-sm" data-action="registry">Обновить реестр</button>
|
|
605
|
-
<button class="btn btn-ok btn-sm" data-action="demo-pak">+ Демо-лицензия ПАК</button>
|
|
606
|
-
</div>
|
|
607
|
-
</div>
|
|
608
|
-
|
|
609
|
-
<div class="stats">
|
|
610
|
-
<div class="stat"><b id="admStatLic">0</b><span id="admStatLicSub">лицензий ПАК · 0 мест</span></div>
|
|
611
|
-
<div class="stat"><b id="admStatPaid">0 ₽</b><span id="admStatPaidSub">оплачено заказов: 0</span></div>
|
|
612
|
-
<div class="stat"><b id="admStatPending">0 ₽</b><span id="admStatPendingSub">ожидают оплаты: 0</span></div>
|
|
613
|
-
<div class="stat"><b id="admStatPartners">0 / 0</b><span>партнёров / резервов франшиз</span></div>
|
|
614
|
-
<div class="stat"><b id="admStatTickets">0</b><span id="admStatTicketsSub">открытых тикетов SLA</span></div>
|
|
615
|
-
</div>
|
|
616
|
-
|
|
617
|
-
<div class="admin-workspace" id="adminWorkspace">
|
|
618
|
-
<!-- Левая вкладка ИИ-агента и навигации админки -->
|
|
619
|
-
<aside class="admin-left">
|
|
620
|
-
<nav class="admin-nav" aria-label="Вкладки админ-панели">
|
|
621
|
-
<button class="adm-tab on" data-adm-tab="all">${icon('ai')}<span>ИИ-агент + Все разделы</span><i class="live-dot"></i></button>
|
|
622
|
-
<button class="adm-tab" data-adm-tab="agent">${icon('agents')}<span>Только ИИ-агент</span></button>
|
|
623
|
-
<button class="adm-tab" data-adm-tab="licenses">${icon('key')}<span>Лицензии (${P.baseSeats} вечн. + доп.)</span></button>
|
|
624
|
-
<button class="adm-tab" data-adm-tab="orders">${icon('cart')}<span>Заказы ЮKassa</span></button>
|
|
625
|
-
<button class="adm-tab" data-adm-tab="partners">${icon('map')}<span>Франшизы и партнёры</span></button>
|
|
626
|
-
<button class="adm-tab" data-adm-tab="tickets">${icon('chat')}<span>Тикеты SLA (MAX·TG·VK)</span></button>
|
|
627
|
-
</nav>
|
|
628
|
-
|
|
629
|
-
<div class="card adm-agent-card" id="admAgentCard">
|
|
630
|
-
<div class="ai-head" style="padding:0 0 12px;margin-bottom:10px">
|
|
631
|
-
<img src="/assets/odant-logo.png" alt="">
|
|
632
|
-
<div>
|
|
633
|
-
<b>ИИ-агент администратора</b>
|
|
634
|
-
<span>● управление реестром · в сети</span>
|
|
635
|
-
</div>
|
|
636
|
-
</div>
|
|
637
|
-
<div class="ai-msgs adm-ai-msgs" id="admAiMessages">
|
|
638
|
-
<div class="msg bot">Здравствуйте! Я ИИ-агент панели администратора ODANT-WORK. Помогу проанализировать реестр лицензий (${P.baseSeats} вечных мест + 1 год Enterprise), выпустить сертификат Ed25519, провести оплату заказов ЮKassa или проверить квоты франшиз по регионам РФ.</div>
|
|
639
|
-
</div>
|
|
640
|
-
<div class="ai-sugg" style="padding:8px 0;border-top:1px solid var(--line)">
|
|
641
|
-
<button data-adm-ask="Сводка по серверу лицензий">Сводка реестра</button>
|
|
642
|
-
<button data-adm-ask="Выпусти базовую лицензию для ООО «АгроТех» ИНН 6234001122">+ Выпустить лицензию</button>
|
|
643
|
-
<button data-adm-ask="Проведи оплату ожидающих заказов">Провести оплаты</button>
|
|
644
|
-
<button data-adm-ask="Сколько вакантных франшиз в Татарстане?">Квота Татарстана</button>
|
|
645
|
-
<button data-adm-ask="Какие модели входят в комплекс и как подключить мощные ИИ по API?">Модели и API</button>
|
|
646
|
-
</div>
|
|
647
|
-
<div class="ai-input" style="padding:10px 0 0">
|
|
648
|
-
<input type="text" id="admAiInput" placeholder="Команда или вопрос ИИ-агенту админки…" autocomplete="off">
|
|
649
|
-
<button class="btn btn-primary" data-action="adm-ai-send" aria-label="Отправить">${icon('send')}</button>
|
|
650
|
-
</div>
|
|
651
|
-
</div>
|
|
652
|
-
</aside>
|
|
653
|
-
|
|
654
|
-
<!-- Правая область разделов админки -->
|
|
655
|
-
<div class="admin-main" id="adminMain">
|
|
656
|
-
<div class="card" data-adm-sec="licenses">
|
|
657
|
-
<div class="sec-head" style="margin-bottom:14px">
|
|
658
|
-
<div>
|
|
659
|
-
<span class="kicker">Выпуск сертификата Ed25519</span>
|
|
660
|
-
<h3 class="h3" style="margin:4px 0 0">Выпустить базовую лицензию комплекса (${P.baseSeats} вечных лицензий + 1 год поддержки Enterprise, далее — по желанию)</h3>
|
|
661
|
-
</div>
|
|
662
|
-
</div>
|
|
663
|
-
<div class="grid g4" style="align-items:end">
|
|
664
|
-
<div class="field" style="margin:0"><label for="admLicOrg">Организация</label><input type="text" id="admLicOrg" value="АО «РязаньАгроПром»"></div>
|
|
665
|
-
<div class="field" style="margin:0"><label for="admLicInn">ИНН</label><input type="text" id="admLicInn" value="6234109876"></div>
|
|
666
|
-
<div class="field" style="margin:0"><label for="admLicEmail">Email клиента</label><input type="email" id="admLicEmail" value="it@ryazan-agro.ru"></div>
|
|
667
|
-
<div class="field" style="margin:0"><label for="admLicHwid">HWID комплекса (необязательно)</label><input type="text" id="admLicHwid" placeholder="WORK-HWID-..."></div>
|
|
668
|
-
</div>
|
|
669
|
-
<div style="display:flex;align-items:center;gap:14px;margin-top:14px;flex-wrap:wrap">
|
|
670
|
-
<button class="btn btn-primary btn-sm" data-action="adm-issue-lic">${icon('key')} Выпустить и подписать сертификат</button>
|
|
671
|
-
<span class="small muted" id="admIssueStatus"></span>
|
|
672
|
-
</div>
|
|
673
|
-
</div>
|
|
674
|
-
|
|
675
|
-
<div class="card" data-adm-sec="licenses">
|
|
676
|
-
<h3 class="h3" style="margin:0 0 12px">Выпущенные лицензии комплексов ODANT-WORK</h3>
|
|
677
|
-
<div class="table-wrap">
|
|
678
|
-
<table class="t">
|
|
679
|
-
<thead><tr>
|
|
680
|
-
<th>Лицензия / Код бота</th>
|
|
681
|
-
<th>Организация / ИНН</th>
|
|
682
|
-
<th>Привязка оборудования</th>
|
|
683
|
-
<th class="num">Сессии (вечные + доп.)</th>
|
|
684
|
-
<th>SLA и срок</th>
|
|
685
|
-
<th>Сертификат</th>
|
|
686
|
-
</tr></thead>
|
|
687
|
-
<tbody id="admLicensesBody"><tr><td colspan="6" class="muted">Загрузка…</td></tr></tbody>
|
|
688
|
-
</table>
|
|
689
|
-
</div>
|
|
690
|
-
</div>
|
|
691
|
-
|
|
692
|
-
<div class="card" data-adm-sec="orders">
|
|
693
|
-
<h3 class="h3" style="margin:0 0 12px">Заказы и платежи ЮKassa</h3>
|
|
694
|
-
<div class="table-wrap">
|
|
695
|
-
<table class="t">
|
|
696
|
-
<thead><tr>
|
|
697
|
-
<th>Заказ / Платёж</th>
|
|
698
|
-
<th>Назначение</th>
|
|
699
|
-
<th>Плательщик</th>
|
|
700
|
-
<th class="num">Сумма</th>
|
|
701
|
-
<th>Статус</th>
|
|
702
|
-
<th>Действия</th>
|
|
703
|
-
</tr></thead>
|
|
704
|
-
<tbody id="admOrdersBody"><tr><td colspan="6" class="muted">Загрузка…</td></tr></tbody>
|
|
705
|
-
</table>
|
|
706
|
-
</div>
|
|
707
|
-
</div>
|
|
708
|
-
|
|
709
|
-
<div class="card" data-adm-sec="partners">
|
|
710
|
-
<h3 class="h3" style="margin:0 0 12px">Резервы региональных франшиз и действующие партнёры</h3>
|
|
711
|
-
<div class="table-wrap">
|
|
712
|
-
<table class="t">
|
|
713
|
-
<thead><tr>
|
|
714
|
-
<th>ID / Тип</th>
|
|
715
|
-
<th>Субъект РФ</th>
|
|
716
|
-
<th>Компания / ИНН</th>
|
|
717
|
-
<th>Условия / Скидка</th>
|
|
718
|
-
<th>Статус</th>
|
|
719
|
-
<th>Действия</th>
|
|
720
|
-
</tr></thead>
|
|
721
|
-
<tbody id="admPartnersBody"><tr><td colspan="6" class="muted">Загрузка…</td></tr></tbody>
|
|
722
|
-
</table>
|
|
723
|
-
</div>
|
|
724
|
-
</div>
|
|
725
|
-
|
|
726
|
-
<div class="card" data-adm-sec="tickets">
|
|
727
|
-
<h3 class="h3" style="margin:0 0 12px">Обращения техподдержки (MAX · Telegram · VK)</h3>
|
|
728
|
-
<div class="table-wrap">
|
|
729
|
-
<table class="t">
|
|
730
|
-
<thead><tr>
|
|
731
|
-
<th>Тикет / Канал</th>
|
|
732
|
-
<th>Клиент / Лицензия</th>
|
|
733
|
-
<th>SLA</th>
|
|
734
|
-
<th>Переписка</th>
|
|
735
|
-
<th>Ответ инженера</th>
|
|
736
|
-
</tr></thead>
|
|
737
|
-
<tbody id="admTicketsBody"><tr><td colspan="5" class="muted">Загрузка…</td></tr></tbody>
|
|
738
|
-
</table>
|
|
739
|
-
</div>
|
|
740
|
-
</div>
|
|
741
|
-
</div>
|
|
742
|
-
</div>
|
|
743
|
-
</section>
|
|
744
|
-
|
|
745
619
|
<footer>
|
|
746
620
|
<div class="footer">
|
|
747
621
|
<div>
|
|
@@ -758,7 +632,7 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
758
632
|
<h4>${esc(VENDOR_CONTACTS.company)}</h4>
|
|
759
633
|
<p>${esc(VENDOR_CONTACTS.address)}</p>
|
|
760
634
|
<p>${VENDOR_CONTACTS.phones.map(esc).join(', ')}</p>
|
|
761
|
-
<p><a href="${esc(VENDOR_CONTACTS.site)}" target="_blank" rel="noopener">${esc(VENDOR_CONTACTS.site.replace(/^https?:\/\//, ''))}</a></p>
|
|
635
|
+
<p><a href="${esc(VENDOR_CONTACTS.site)}" target="_blank" rel="noopener">${esc(VENDOR_CONTACTS.site.replace(/^https?:\/\//, ''))}</a> · <a href="#" data-action="open-oferta">Публичная оферта</a></p>
|
|
762
636
|
</div>
|
|
763
637
|
</div>
|
|
764
638
|
<div class="footer-bottom">
|
|
@@ -768,19 +642,68 @@ export function renderLandingPage({ publicKey = '', regions = null, assetVersion
|
|
|
768
642
|
</footer>
|
|
769
643
|
</div>
|
|
770
644
|
|
|
771
|
-
<!-- Вход в кабинет -->
|
|
645
|
+
<!-- Регистрация / Вход в кабинет и подписание публичной оферты ПЭП -->
|
|
772
646
|
<div class="modal" id="authModal" role="dialog" aria-modal="true" aria-labelledby="authTitle">
|
|
773
|
-
<div class="card">
|
|
647
|
+
<div class="card" style="max-width:540px">
|
|
774
648
|
<div class="modal-head">
|
|
775
649
|
<img src="/assets/odant-logo.png" alt="">
|
|
776
|
-
<div
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
<div
|
|
782
|
-
<
|
|
783
|
-
<
|
|
650
|
+
<div>
|
|
651
|
+
<h3 class="h3" id="authTitle" style="margin:0">Регистрация и подписание оферты</h3>
|
|
652
|
+
<div class="small muted" id="authSub">Заказ комплекса, докупка лицензий и резервирование франшизы доступны после регистрации и акцепта оферты (ПЭП)</div>
|
|
653
|
+
</div>
|
|
654
|
+
</div>
|
|
655
|
+
<div class="row2">
|
|
656
|
+
<div class="field"><label for="authEmail">Корпоративный email *</label><input type="email" id="authEmail" value="admin@maslotorg.ru" required></div>
|
|
657
|
+
<div class="field"><label for="authInn">ИНН организации *</label><input type="text" id="authInn" value="7701234567" inputmode="numeric" required></div>
|
|
658
|
+
</div>
|
|
659
|
+
<div class="row2">
|
|
660
|
+
<div class="field"><label for="authCompany">Наименование организации *</label><input type="text" id="authCompany" value="ООО «Маслоторг»" required></div>
|
|
661
|
+
<div class="field"><label for="authSigner">ФИО и должность подписанта *</label><input type="text" id="authSigner" value="Перепелкин Р.А., Генеральный директор" required></div>
|
|
662
|
+
</div>
|
|
663
|
+
<div class="field"><label for="authLicId">Номер лицензии ПАК (если уже выдан)</label><input type="text" id="authLicId" placeholder="Будет привязан или выпущен автоматически"></div>
|
|
664
|
+
|
|
665
|
+
<div class="oferta-check-box">
|
|
666
|
+
<label class="oferta-check-label">
|
|
667
|
+
<input type="checkbox" id="authOfertaCheck" checked>
|
|
668
|
+
<span>
|
|
669
|
+
Я ознакомился с условиями <a href="#" data-action="open-oferta">Публичного договора-оферты ODANT-WORK (${esc(PUBLIC_OFERTA.version)})</a> и подписываю его простой электронной подписью (ПЭП) от имени указанной организации.
|
|
670
|
+
</span>
|
|
671
|
+
</label>
|
|
672
|
+
</div>
|
|
673
|
+
<div class="status" id="authErrorMsg" style="color:var(--danger);min-height:18px;margin-top:6px"></div>
|
|
674
|
+
<div style="display:flex;gap:10px;margin-top:10px;flex-wrap:wrap">
|
|
675
|
+
<button class="btn btn-primary" style="flex:1" data-action="login">${icon('check')} Зарегистрироваться и подписать оферту</button>
|
|
676
|
+
<button class="btn btn-ghost" id="btnLogoutModal" data-action="logout" style="display:none">Выйти</button>
|
|
677
|
+
<button class="btn btn-ghost" data-action="auth-close">Закрыть</button>
|
|
678
|
+
</div>
|
|
679
|
+
</div>
|
|
680
|
+
</div>
|
|
681
|
+
|
|
682
|
+
<!-- Полный текст Публичного договора-оферты ODANT-WORK -->
|
|
683
|
+
<div class="modal" id="ofertaModal" role="dialog" aria-modal="true" aria-labelledby="ofertaTitle">
|
|
684
|
+
<div class="card" style="max-width:760px">
|
|
685
|
+
<div class="modal-head">
|
|
686
|
+
<img src="/assets/odant-logo.png" alt="">
|
|
687
|
+
<div>
|
|
688
|
+
<span class="kicker">Редакция ${esc(PUBLIC_OFERTA.version)} от ${esc(PUBLIC_OFERTA.updatedAt)}</span>
|
|
689
|
+
<h3 class="h3" id="ofertaTitle" style="margin:2px 0 0">${esc(PUBLIC_OFERTA.title)}</h3>
|
|
690
|
+
</div>
|
|
691
|
+
</div>
|
|
692
|
+
<div class="oferta-scroll">
|
|
693
|
+
${PUBLIC_OFERTA.sections.map(s => `
|
|
694
|
+
<div class="oferta-sec">
|
|
695
|
+
<h4>${esc(s.number)}. ${esc(s.title)}</h4>
|
|
696
|
+
<p>${esc(s.text)}</p>
|
|
697
|
+
</div>
|
|
698
|
+
`).join('')}
|
|
699
|
+
<div class="oferta-sec">
|
|
700
|
+
<h4>7. Реквизиты Правообладателя</h4>
|
|
701
|
+
<p><b>${esc(VENDOR_CONTACTS.company)}</b> · Адрес: ${esc(VENDOR_CONTACTS.address)} · Тел.: ${VENDOR_CONTACTS.phones.map(esc).join(', ')} · Сайт: ${esc(VENDOR_CONTACTS.site)}</p>
|
|
702
|
+
</div>
|
|
703
|
+
</div>
|
|
704
|
+
<div style="display:flex;gap:10px;margin-top:14px;justify-content:flex-end;flex-wrap:wrap">
|
|
705
|
+
<button class="btn btn-primary" data-action="accept-from-oferta">${icon('check')} Принять условия и перейти к подписанию ПЭП</button>
|
|
706
|
+
<button class="btn btn-ghost" data-action="oferta-close">Закрыть</button>
|
|
784
707
|
</div>
|
|
785
708
|
</div>
|
|
786
709
|
</div>
|