zov-tech/miniapp/index.html
wasrusgen 02f8dba469 feat: expeditor cabinet, electronic signature (OTP+canvas), invoice room picker
New modules:
- expeditor_dashboard.js: route list (date-grouped) + act detail + signature screen
- invoice.js: 3-col chip room picker, 2500₽ base + 1000₽ extra logic
- act4.js, measurer_dashboard.js, finance_summary.js, client_timeline.js, feedback.js, staff_roster.js

Backend:
- /api/expeditor_inbox: filtered assembly list for expeditor role
- /api/act4_request_otp: 6-digit OTP via Telegram, 10-min expiry
- /api/act4_verify_otp: validates code, marks act as signed
- /api/act4_save_signature: saves base64 canvas signature
- Act4s sheet: added signature_b64, otp_code, otp_expires_at columns

Tests:
- tests/expeditor_scenarios.md: 11 manual test scenarios

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 14:11:20 +03:00

73 lines
4.1 KiB
HTML

<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, user-scalable=no">
<meta name="theme-color" content="#2C3E50">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>WASRUSGEN1 · Кабинет</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700&family=Inter:wght@400;500;600;700;800&family=Geist:wght@400;500;600&family=Manrope:wght@400;500;600;700&family=Newsreader:ital,wght@0,400..600;1,400..600&family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@400;500&family=Cormorant+Garamond:ital,wght@1,400;1,500;1,600&family=Caveat:wght@500;700&display=swap">
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<link rel="stylesheet" href="assets/styles.css?v=20260518o">
<link rel="stylesheet" href="assets/podbor.css?v=20260519c">
</head>
<body>
<!-- Splash — лого @wasrusgen1 + опилки (16) + вращающийся диск -->
<div class="loader splash" id="splash">
<div class="brand-logo-wrap">
<img class="brand-logo" src="assets/wasrusgen-logo.svg?v=20260516d" alt="@wasrusgen1">
<div class="splash-dust" aria-hidden="true">
<span class="dust d1"></span> <span class="dust d2"></span>
<span class="dust d3"></span> <span class="dust d4"></span>
<span class="dust d5"></span> <span class="dust d6"></span>
<span class="dust d7"></span> <span class="dust d8"></span>
<span class="dust d9"></span> <span class="dust d10"></span>
<span class="dust d11"></span> <span class="dust d12"></span>
<span class="dust d13"></span> <span class="dust d14"></span>
<span class="dust d15"></span> <span class="dust d16"></span>
</div>
</div>
<div class="loader-bar"></div>
<div class="brand-tagline-gold">CRM</div>
</div>
<main id="app"></main>
<script src="assets/platform.js?v=20260518n"></script>
<script src="assets/icons.js?v=20260516h"></script>
<script src="assets/podbor.config.js?v=20260516h"></script>
<script src="assets/podbor.picts.js?v=20260516h"></script>
<script src="assets/podbor.js?v=20260519c"></script>
<script src="assets/clients.js?v=20260518e"></script>
<script src="assets/zamer-picts.js?v=20260516h"></script>
<script src="assets/measurements.js?v=20260518f"></script>
<script src="assets/request.js?v=20260519f"></script>
<script src="assets/assembly.js?v=20260518f"></script>
<script src="assets/proposals.js?v=20260518f"></script>
<script src="assets/me.js?v=20260519a"></script>
<script src="assets/inbox.js?v=20260518i"></script>
<script src="assets/cabinet.js?v=20260518j"></script>
<script src="assets/selfmeasure.js?v=20260518k"></script>
<script src="assets/orders.js?v=20260518l"></script>
<script src="assets/master_tools.js?v=20260518p"></script>
<script src="assets/signrequest.js?v=20260518o"></script>
<script src="assets/admin_rates.js?v=20260519a"></script>
<script src="assets/assembler_analytics.js?v=20260519a"></script>
<script src="assets/assembler_dashboard.js?v=20260519b"></script>
<script src="assets/staff_clients.js?v=20260519c"></script>
<script src="assets/assembly_detail.js?v=20260519o"></script>
<script src="assets/staff_roster.js?v=20260519b"></script>
<script src="assets/client_timeline.js?v=20260519a"></script>
<script src="assets/finance_summary.js?v=20260519a"></script>
<script src="assets/contracts.js?v=20260519a"></script>
<script src="assets/invoice.js?v=20260521d"></script>
<script src="assets/measurer_dashboard.js?v=20260519a"></script>
<script src="assets/act4.js?v=20260519a"></script>
<script src="assets/feedback.js?v=20260519a"></script>
<script src="assets/expeditor_dashboard.js?v=20260521b"></script>
<script src="assets/app.js?v=20260521c"></script>
</body>
</html>