Files
boc/landvex-admin-v2/ui/dashboard-fortnox.html
T
Bernt 6989a98d75 feat: Passwordless cross-device authentication
- Arkitektur: docs/auth/passwordless-architecture.md
- Backend: iom/quixzoom-auth-service/ (FastAPI + Redis)
- Webb: quixzoom-market-pages/se/login/ (QR-kod + polling)
- App: iom/quixzoom-app/src/features/auth/ (push + deep links)

Flöde: QR-kod → app-godkännande → webb-inloggad
2026-07-07 07:11:50 +00:00

534 lines
19 KiB
HTML

<!DOCTYPE html>
<html lang="sv">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LandveX Kontrollpanel — Systemöversikt</title>
<style>
:root {
--primary: #0A9396;
--primary-dark: #005F73;
--danger: #E63946;
--warning: #F4A261;
--success: #2A9D8F;
--bg: #F8F9FA;
--card: #FFFFFF;
--text: #1D3557;
--text-muted: #6C757D;
--border: #DEE2E6;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.5;
}
.header {
background: var(--primary);
color: white;
padding: 1rem 2rem;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.header h1 { font-size: 1.5rem; font-weight: 600; }
.header .company {
font-size: 0.875rem;
opacity: 0.9;
}
.nav {
background: white;
border-bottom: 1px solid var(--border);
padding: 0 2rem;
display: flex;
gap: 0;
}
.nav a {
padding: 1rem 1.5rem;
text-decoration: none;
color: var(--text-muted);
font-weight: 500;
border-bottom: 3px solid transparent;
transition: all 0.2s;
}
.nav a:hover, .nav a.active {
color: var(--primary);
border-bottom-color: var(--primary);
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 2rem;
}
.alert {
background: #FFF3CD;
border: 1px solid #FFEAA7;
border-left: 4px solid var(--warning);
padding: 1rem 1.5rem;
border-radius: 8px;
margin-bottom: 2rem;
display: flex;
align-items: center;
gap: 1rem;
}
.alert.danger {
background: #F8D7DA;
border-color: #F5C6CB;
border-left-color: var(--danger);
}
.alert-icon { font-size: 1.5rem; }
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.card {
background: var(--card);
border-radius: 12px;
padding: 1.5rem;
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
border: 1px solid var(--border);
}
.card h2 {
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-muted);
margin-bottom: 1rem;
}
.big-number {
font-size: 2.5rem;
font-weight: 700;
color: var(--text);
}
.big-number.danger { color: var(--danger); }
.big-number.warning { color: var(--warning); }
.big-number.success { color: var(--success); }
.subtitle {
font-size: 0.875rem;
color: var(--text-muted);
margin-top: 0.25rem;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 0.875rem;
}
th, td {
text-align: left;
padding: 0.75rem;
border-bottom: 1px solid var(--border);
}
th {
font-weight: 600;
color: var(--text-muted);
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.05em;
}
.badge {
display: inline-block;
padding: 0.25rem 0.75rem;
border-radius: 9999px;
font-size: 0.75rem;
font-weight: 600;
}
.badge-danger { background: #F8D7DA; color: #721C24; }
.badge-warning { background: #FFF3CD; color: #856404; }
.badge-success { background: #D4EDDA; color: #155724; }
.badge-info { background: #D1ECF1; color: #0C5460; }
.section {
margin-bottom: 2rem;
}
.section h2 {
font-size: 1.25rem;
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
}
.status-dot.success { background: var(--success); }
.status-dot.warning { background: var(--warning); }
.status-dot.danger { background: var(--danger); }
.two-col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
}
@media (max-width: 768px) {
.two-col { grid-template-columns: 1fr; }
.grid { grid-template-columns: 1fr; }
.nav { overflow-x: auto; }
}
</style>
</head>
<body>
<header class="header">
<div>
<h1>🔁 LandveX Kontrollpanel</h1>
<div class="company">LandveX AB • 559141-7042 • Systemöversikt</div>
</div>
<div style="text-align: right;">
<div style="font-size: 0.875rem; opacity: 0.9;">2026-07-06</div>
<div style="font-size: 0.75rem; opacity: 0.7;">04:55 UTC</div>
</div>
</header>
<nav class="nav">
<a href="#overview" class="active">Översikt</a>
<a href="#cashflow">Kassa</a>
<a href="#accounting">Bokföring</a>
<a href="#services">Tjänster</a>
<a href="#tasks">Åtgärder</a>
</nav>
<main class="container">
<!-- AKUTA ALERTS -->
<div class="alert danger">
<span class="alert-icon">🚨</span>
<div>
<strong>AKUT:</strong> Momsdeklaration Q1+Q2 deadline 26 juli (20 dagar).
Belopp: ~442 000 kr. Kassa efter moms: ~57 000 kr. Prelskatt ~131 000 kr räcker INTE.
</div>
</div>
<div class="alert">
<span class="alert-icon">⚠️</span>
<div>
<strong>VARNING:</strong> Leon-kravbrev deadline 13 juli (7 dagar). Fordran: 197 922 kr.
Om utebliven betalning: Polisanmälan + inkasso.
</div>
</div>
<!-- KASSA ÖVERSIKT -->
<section class="section" id="overview">
<h2>💰 Kassa & Likviditet</h2>
<div class="grid">
<div class="card">
<h2>Totalt i kassa</h2>
<div class="big-number">276 504 kr</div>
<div class="subtitle">Per 2026-06-21</div>
</div>
<div class="card">
<h2>Kommande inbetalning</h2>
<div class="big-number success">+222 916 kr</div>
<div class="subtitle">Trygg Bil — juli 2026</div>
</div>
<div class="card">
<h2>Moms att betala</h2>
<div class="big-number danger">-442 000 kr</div>
<div class="subtitle">Q1+Q2, deadline 26 juli</div>
</div>
<div class="card">
<h2>Kvar efter moms</h2>
<div class="big-number warning">~57 000 kr</div>
<div class="subtitle">Prelskatt ~131 000 kr saknas</div>
</div>
</div>
</section>
<!-- BANKKONTON -->
<section class="section" id="cashflow">
<h2>🏦 Bankkonton</h2>
<div class="card">
<table>
<thead>
<tr>
<th>Konto</th>
<th>Bank</th>
<th>Saldo</th>
<th>Valuta</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>1930</td>
<td>Nordea</td>
<td><strong>193 701 kr</strong></td>
<td>SEK</td>
<td><span class="badge badge-success">Aktiv</span></td>
</tr>
<tr>
<td>1932</td>
<td>Revolut SEK</td>
<td><strong>80 682 kr</strong></td>
<td>SEK</td>
<td><span class="badge badge-success">Aktiv</span></td>
</tr>
<tr>
<td>1934</td>
<td>Revolut EUR</td>
<td>179,70 €</td>
<td>EUR</td>
<td><span class="badge badge-info">Aktiv</span></td>
</tr>
<tr>
<td>1935</td>
<td>Revolut USD</td>
<td>14,70 $</td>
<td>USD</td>
<td><span class="badge badge-info">Aktiv</span></td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- BOKFÖRING -->
<section class="section" id="accounting">
<h2>📊 Bokföring — Viktiga konton</h2>
<div class="two-col">
<div class="card">
<h2>Tillgångar</h2>
<table>
<thead>
<tr><th>Konto</th><th>Namn</th><th>Saldo</th></tr>
</thead>
<tbody>
<tr>
<td>1610</td>
<td>Fordringar anställda</td>
<td class="danger">+197 922 kr</td>
</tr>
<tr>
<td>1689</td>
<td>Observationskonto</td>
<td>+26 955 kr</td>
</tr>
<tr>
<td>1910</td>
<td>Kassa och bank</td>
<td class="success">+276 504 kr</td>
</tr>
</tbody>
</table>
</div>
<div class="card">
<h2>Skulder</h2>
<table>
<thead>
<tr><th>Konto</th><th>Namn</th><th>Saldo</th></tr>
</thead>
<tbody>
<tr>
<td>2611</td>
<td>Utgående moms 25%</td>
<td class="danger">-441 616 kr</td>
</tr>
<tr>
<td>2710</td>
<td>Personalskatt</td>
<td class="danger">-31 845 kr</td>
</tr>
<tr>
<td>2731</td>
<td>Arbetsgivaravgift</td>
<td class="danger">-23 442 kr</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="card" style="margin-top: 1.5rem;">
<h2>Intäkter H1 2026</h2>
<table>
<thead>
<tr>
<th>Konto</th>
<th>Kund</th>
<th>Netto</th>
<th>Moms</th>
</tr>
</thead>
<tbody>
<tr>
<td>3000</td>
<td>Elles Fastighets AB</td>
<td>1 173 465 kr</td>
<td>293 366 kr</td>
</tr>
<tr>
<td>3010</td>
<td>Trygg Bil Stockholm</td>
<td>375 000 kr</td>
<td>93 750 kr</td>
</tr>
<tr>
<td>3020</td>
<td>Trygg Bil (löpande)</td>
<td>169 999 kr</td>
<td>42 500 kr</td>
</tr>
<tr>
<td>3900</td>
<td>Övriga intäkter</td>
<td>58 000 kr</td>
<td>14 500 kr</td>
</tr>
<tr style="font-weight: 600; background: var(--bg);">
<td colspan="2">TOTALT</td>
<td>1 776 464 kr</td>
<td>444 116 kr</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- TJÄNSTER -->
<section class="section" id="services">
<h2>🖥️ Systemtjänster (24 aktiva)</h2>
<div class="card">
<table>
<thead>
<tr>
<th>Tjänst</th>
<th>Port</th>
<th>Språk</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>aamos-ledger</td>
<td>3250</td>
<td>Rust</td>
<td><span class="status-dot success"></span> Kör</td>
</tr>
<tr>
<td>quixzoom-api</td>
<td></td>
<td>Node.js</td>
<td><span class="status-dot success"></span> Kör</td>
</tr>
<tr>
<td>quixzoom-mission</td>
<td>7060</td>
<td></td>
<td><span class="status-dot success"></span> Kör</td>
</tr>
<tr>
<td>landvex-api</td>
<td>8081</td>
<td></td>
<td><span class="status-dot success"></span> Kör</td>
</tr>
<tr>
<td>aamos-command-center</td>
<td>7071</td>
<td>Rust</td>
<td><span class="status-dot success"></span> Kör</td>
</tr>
<tr>
<td>nginx</td>
<td>80/443</td>
<td></td>
<td><span class="status-dot success"></span> Kör</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- ÅTGÄRDER -->
<section class="section" id="tasks">
<h2>📋 Åtgärder som krävs</h2>
<div class="two-col">
<div class="card">
<h2>🔴 AKUT — Inom 7 dagar</h2>
<table>
<thead>
<tr><th>Åtgärd</th><th>Deadline</th></tr>
</thead>
<tbody>
<tr>
<td>Betala moms Q1+Q2 (~442 000 kr)</td>
<td class="danger">26 juli</td>
</tr>
<tr>
<td>Följa upp Leon-kravbrev (197 922 kr)</td>
<td class="danger">13 juli</td>
</tr>
<tr>
<td>Boka omvänd skattskyldighet</td>
<td class="danger">Omedelbart</td>
</tr>
</tbody>
</table>
</div>
<div class="card">
<h2>🟡 HÖG — Inom 30 dagar</h2>
<table>
<thead>
<tr><th>Åtgärd</th><th>Deadline</th></tr>
</thead>
<tbody>
<tr>
<td>Betala prelskatt (~131 000 kr)</td>
<td>12 juli</td>
</tr>
<tr>
<td>Skicka Winston-återkrav (~11 400 kr)</td>
<td>ASAP</td>
</tr>
<tr>
<td>Rensa observationskonto 1689</td>
<td>Juli</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- FOOTER -->
<footer style="text-align: center; padding: 2rem; color: var(--text-muted); font-size: 0.875rem;">
<p>LandveX AB • 559141-7042 • Systemöversikt genererad 2026-07-06</p>
<p style="margin-top: 0.5rem;">Datakällor: aamos-ledger, systemctl, MEMORY.md</p>
</footer>
</main>
</body>
</html>