Files
boc/backups/2026-07-12-1023/landvex-prod/inspection-report.html
T

853 lines
39 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="sv">
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Inspektionsrapport — LandveX</title>
<style>
/*
LANDVEX INSPECTION REPORT — Light Mode, Print-ready
PDF-optimerat: A4, inga bakgrunder i tryck
*/
:root {
--brand: #0A84FF;
--brand-dark: #0060C0;
--text-primary: #1C1C1E;
--text-secondary:#636366;
--text-tertiary: #AEAEB2;
--border: #D1D1D6;
--border-light: #E5E5EA;
--bg: #F2F2F7;
--surface: #FFFFFF;
--surface-2: #F2F2F7;
--green: #34C759;
--orange: #FF9500;
--red: #FF3B30;
--yellow: #FFCC00;
--indigo: #5856D6;
--score-good: #34C759;
--score-fair: #FF9500;
--score-poor: #FF3B30;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, 'SF Pro Text', 'Helvetica Neue', Arial, sans-serif;
background: var(--bg);
color: var(--text-primary);
-webkit-font-smoothing: antialiased;
font-size: 14px;
line-height: 1.5;
}
/* Screen toolbar */
.screen-toolbar {
position: sticky; top: 0; z-index: 100;
background: rgba(0,0,0,0.92);
backdrop-filter: saturate(180%) blur(20px);
border-bottom: 1px solid var(--border);
padding: 12px 24px;
display: flex; align-items: center; justify-content: space-between;
gap: 12px;
}
@media print { .screen-toolbar { display: none !important; } }
.toolbar-brand {
display: flex; align-items: center; gap: 8px;
font-size: 16px; font-weight: 800; color: var(--brand);
text-decoration: none;
}
.toolbar-brand span { color: var(--text-primary); }
.toolbar-actions { display: flex; gap: 10px; }
.btn {
padding: 8px 18px; border-radius: var(--radius-md); border: none;
font-family: inherit; font-size: 14px; font-weight: 600;
cursor: pointer; transition: opacity 0.15s;
}
.btn:active { opacity: 0.7; }
.btn-primary { background: var(--brand); color: #1d1d1f; }
.btn-secondary { background: var(--surface-2); color: var(--text-primary); border: 1px solid var(--border); }
/* Main container */
.report-container {
max-width: 900px; margin: 24px auto; padding: 0 24px;
}
@media print {
body { background: #fff; }
.report-container { max-width: 100%; margin: 0; padding: 0; }
}
/* Report page */
.report-page {
background: var(--surface);
border-radius: var(--radius-lg);
border: 1px solid var(--border);
overflow: hidden;
margin-bottom: 20px;
}
@media print {
.report-page { border: none; border-radius: 0; box-shadow: none; margin: 0; page-break-after: always; }
.report-page:last-child { page-break-after: auto; }
}
/* Report header */
.report-header {
background: linear-gradient(135deg, var(--brand-dark) 0%, var(--brand) 100%);
color: #1d1d1f; padding: 32px 40px;
}
.report-header-top {
display: flex; align-items: flex-start; justify-content: space-between; gap: 24px;
margin-bottom: 24px;
}
.report-logo {
font-size: 22px; font-weight: 900; letter-spacing: -0.5px;
}
.report-logo span { opacity: 0.65; }
.report-badge {
background: rgba(0,0,0,0.2);
border: 1px solid rgba(0,0,0,0.3);
border-radius: var(--radius-md); padding: 4px 12px;
font-size: 12px; font-weight: 700;
text-transform: uppercase; letter-spacing: 0.5px;
}
.report-title {
font-size: 28px; font-weight: 800; letter-spacing: -0.8px;
line-height: 1.1; margin-bottom: 6px;
}
.report-subtitle {
font-size: 15px; opacity: 0.75;
}
.report-meta {
display: flex; gap: 32px; margin-top: 20px; flex-wrap: wrap;
}
.meta-item {}
.meta-label { font-size: 11px; opacity: 0.65; text-transform: uppercase; letter-spacing: 0.5px; }
.meta-value { font-size: 14px; font-weight: 600; margin-top: 2px; }
/* Risk score band */
.risk-band {
display: flex; align-items: center; justify-content: space-between;
padding: 20px 40px;
background: var(--surface-2);
border-bottom: 1px solid var(--border);
gap: 24px; flex-wrap: wrap;
}
.risk-score-block { display: flex; align-items: center; gap: 20px; }
.risk-gauge {
width: 80px; height: 80px; border-radius: var(--radius-full);
display: flex; flex-direction: column; align-items: center; justify-content: center;
font-family: -apple-system, sans-serif;
position: relative;
}
.risk-gauge-ring {
position: absolute; inset: 0;
border-radius: var(--radius-full);
border: 6px solid;
}
.risk-score-num { font-size: 28px; font-weight: 900; line-height: 1; }
.risk-score-max { font-size: 12px; color: var(--text-secondary); }
.risk-label { }
.risk-title { font-size: 18px; font-weight: 700; margin-bottom: 4px; }
.risk-desc { font-size: 13px; color: var(--text-secondary); max-width: 320px; line-height: 1.5; }
.risk-pills { display: flex; gap: 8px; flex-wrap: wrap; }
.risk-pill {
padding: 4px 12px; border-radius: var(--radius-xl); font-size: 12px; font-weight: 600;
border: 1px solid;
}
.pill-green { background: rgba(52,199,89,0.12); color: #1a7a3a; border-color: rgba(52,199,89,0.3); }
.pill-orange { background: rgba(255,149,0,0.12); color: #a05800; border-color: rgba(255,149,0,0.3); }
.pill-red { background: rgba(255,59,48,0.12); color: #c0160d; border-color: rgba(255,59,48,0.3); }
.pill-blue { background: rgba(10,132,255,0.12); color: #0055c0; border-color: rgba(10,132,255,0.3); }
/* Section layout */
.section { padding: 28px 40px; border-bottom: 1px solid var(--border-light); }
.section:last-child { border-bottom: none; }
.section-title {
font-size: 13px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.8px;
color: var(--text-secondary); margin-bottom: 16px;
display: flex; align-items: center; gap: 8px;
}
.section-title::after {
content: ''; flex: 1; height: 1px; background: var(--border-light);
}
/* Info grid */
.info-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 16px;
}
.info-cell { }
.info-cell-label { font-size: 11px; font-weight: 600; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: 0.5px; }
.info-cell-value { font-size: 15px; font-weight: 500; color: var(--text-primary); margin-top: 3px; }
.info-cell-value.highlight { color: var(--brand); font-weight: 700; }
/* Condition assessment */
.condition-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 14px;
}
.condition-card {
background: var(--surface-2); border-radius: var(--radius-md); padding: 16px;
border: 1px solid var(--border-light);
}
.condition-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.condition-label { font-size: 13px; font-weight: 600; }
.condition-grade {
font-size: 12px; font-weight: 700; padding: 2px 8px;
border-radius: var(--radius-sm);
}
.grade-a { background: rgba(52,199,89,0.15); color: #1a7a3a; }
.grade-b { background: rgba(52,199,89,0.1); color: #2a8a4a; }
.grade-c { background: rgba(255,204,0,0.15); color: #7a5e00; }
.grade-d { background: rgba(255,149,0,0.15); color: #a05800; }
.grade-e { background: rgba(255,59,48,0.15); color: #c0160d; }
.condition-bar { height: 4px; background: var(--border); border-radius: var(--radius-sm); overflow: hidden; margin-bottom: 6px; }
.condition-fill { height: 100%; border-radius: var(--radius-sm); }
.condition-note { font-size: 12px; color: var(--text-secondary); line-height: 1.4; }
/* Photo grid */
.photo-grid {
display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
}
.photo-cell {
aspect-ratio: 4/3; background: var(--surface-2);
border-radius: var(--radius-md); border: 1px dashed var(--border);
display: flex; flex-direction: column; align-items: center; justify-content: center;
gap: 6px; color: var(--text-tertiary);
font-size: 12px; text-align: center;
}
.photo-cell-icon { font-size: 28px; }
.photo-cell-label { font-weight: 500; }
.photo-cell-tag { font-size: 10px; color: var(--text-tertiary); }
/* Maintenance history */
.history-timeline { display: flex; flex-direction: column; gap: 0; }
.history-item {
display: flex; gap: 16px;
padding: 14px 0;
border-bottom: 1px solid var(--border-light);
position: relative;
}
.history-item:last-child { border-bottom: none; }
.history-dot-col {
display: flex; flex-direction: column; align-items: center; gap: 0;
width: 32px; flex-shrink: 0;
}
.history-dot {
width: 12px; height: 12px; border-radius: var(--radius-full);
border: 2px solid; flex-shrink: 0; margin-top: 3px;
}
.history-dot.done { background: var(--green); border-color: var(--green); }
.history-dot.planned { background: #fff; border-color: var(--brand); }
.history-dot.overdue { background: var(--red); border-color: var(--red); }
.history-line { flex: 1; width: 2px; background: var(--border-light); margin-top: 4px; }
.history-body { flex: 1; }
.history-date { font-size: 12px; color: var(--text-tertiary); font-weight: 500; }
.history-title { font-size: 14px; font-weight: 600; margin-top: 2px; }
.history-desc { font-size: 13px; color: var(--text-secondary); margin-top: 3px; line-height: 1.5; }
.history-cost { font-size: 13px; font-weight: 600; color: var(--text-primary); margin-top: 4px; }
.history-status {
font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: var(--radius-xl);
align-self: flex-start; margin-top: 2px;
}
.status-done { background: rgba(52,199,89,0.12); color: #1a7a3a; }
.status-planned { background: rgba(10,132,255,0.12); color: #0055c0; }
.status-overdue { background: rgba(255,59,48,0.12); color: #c0160d; }
/* Recommendations */
.rec-list { display: flex; flex-direction: column; gap: 14px; }
.rec-item {
display: flex; gap: 14px; align-items: flex-start;
padding: 16px; border-radius: var(--radius-md);
border: 1px solid;
}
.rec-item.rec-high { background: rgba(255,59,48,0.05); border-color: rgba(255,59,48,0.2); }
.rec-item.rec-medium { background: rgba(255,149,0,0.05); border-color: rgba(255,149,0,0.2); }
.rec-item.rec-low { background: rgba(52,199,89,0.05); border-color: rgba(52,199,89,0.2); }
.rec-priority {
font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.5px;
padding: 3px 10px; border-radius: var(--radius-sm); flex-shrink: 0; margin-top: 2px;
}
.pri-high { background: rgba(255,59,48,0.15); color: #c0160d; }
.pri-medium { background: rgba(255,149,0,0.15); color: #a05800; }
.pri-low { background: rgba(52,199,89,0.15); color: #1a7a3a; }
.rec-body { flex: 1; }
.rec-title { font-size: 14px; font-weight: 600; }
.rec-desc { font-size: 13px; color: var(--text-secondary); margin-top: 4px; line-height: 1.5; }
.rec-cost-eta { display: flex; gap: 20px; margin-top: 8px; flex-wrap: wrap; }
.rec-meta { font-size: 12px; }
.rec-meta strong { color: var(--text-primary); }
/* Signature block */
.signature-block {
display: grid; grid-template-columns: 1fr 1fr; gap: 32px;
}
.sig-field { border-top: 1px solid var(--text-primary); padding-top: 8px; margin-top: 48px; }
.sig-label { font-size: 12px; color: var(--text-secondary); }
/* Footer */
.report-footer {
padding: 16px 40px;
background: var(--surface-2); border-top: 1px solid var(--border);
display: flex; align-items: center; justify-content: space-between;
font-size: 11px; color: var(--text-tertiary);
}
@media print {
.report-footer { position: fixed; bottom: 0; left: 0; right: 0; }
}
@media print {
@page { size: A4; margin: 15mm 12mm; }
body { font-size: 12px; }
.report-header { padding: 20px 24px; }
.section { padding: 16px 24px; }
.risk-band { padding: 14px 24px; }
.report-footer { padding: 10px 24px; }
}
@media (max-width: 640px) {
.hero h1 { font-size: 2rem !important; }
.hero p { font-size: 1rem !important; }
.card { padding: 1.5rem !important; }
.grid { grid-template-columns: 1fr !important; }
.btn { padding: 0.75rem 1.5rem !important; font-size: 1rem !important; }
}
</style>
<style id="wcag-contrast-enforcement">
/* AAMOS GLOBAL CONTRAST ENFORCEMENT — WCAG AA (4.5:1 minimum) */
/* Regel: Ingen text under 70% opacity. Aldrig. */
body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
/* Fix common low-contrast patterns */
[style*="rgba(60,60,67,0.4)"] { color: rgba(60,60,67,0.65) !important; }
[style*="rgba(60,60,67,0.3)"] { color: rgba(60,60,67,0.65) !important; }
[style*="rgba(0,0,0,0.4)"] { color: rgba(0,0,0,0.72) !important; }
[style*="rgba(0,0,0,0.3)"] { color: rgba(0,0,0,0.72) !important; }
[style*="opacity: 0.4"] { opacity: 0.72 !important; }
[style*="opacity: 0.3"] { opacity: 0.72 !important; }
@media (max-width: 640px) {
.hero h1 { font-size: 2rem !important; }
.hero p { font-size: 1rem !important; }
.card { padding: 1.5rem !important; }
.grid { grid-template-columns: 1fr !important; }
.btn { padding: 0.75rem 1.5rem !important; font-size: 1rem !important; }
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": [
"Organization",
"Corporation"
],
"@id": "https://landvex.com/#organization",
"name": "Landvex",
"alternateName": [
"LandveX",
"Landvex AB",
"LandveX AB"
],
"url": "https://landvex.com",
"logo": {
"@type": "ImageObject",
"url": "https://landvex.com/apple-touch-icon.png",
"width": 180,
"height": 180
},
"foundingDate": "2024",
"foundingLocation": {
"@type": "Place",
"addressLocality": "Tyresö",
"addressRegion": "Stockholm",
"addressCountry": "SE"
},
"legalName": "Landvex Inc",
"address": {
"@type": "PostalAddress",
"addressLocality": "Houston",
"addressRegion": "TX",
"addressCountry": "US"
},
"location": [
{
"@type": "Place",
"name": "Houston, Texas, USA (US HQ)",
"address": {
"@type": "PostalAddress",
"addressLocality": "Houston",
"addressRegion": "TX",
"addressCountry": "US"
}
},
{
"@type": "Place",
"name": "Tyresö, Sweden (EU HQ)",
"address": {
"@type": "PostalAddress",
"addressLocality": "Tyresö",
"addressRegion": "Stockholm",
"addressCountry": "SE"
}
}
],
"taxID": "pending-EIN",
"description": "Landvex is a decision intelligence company that identifies contradictions between official narratives and observed physical reality. Using the quiXzoom field observation network and the AMOS AI analysis engine, Landvex delivers infrastructure risk indexes, urban intelligence scores, and contradiction reports to infrastructure owners, municipalities, enterprises, and investors globally.",
"disambiguatingDescription": "Landvex (LandveX) is a decision intelligence company with US headquarters in Houston, Texas (Landvex Inc.) and European headquarters in Tyresö, Sweden (Landvex AB, org.nr 559141-7042). Landvex delivers control intelligence — infrastructure risk scores, urban intelligence, and contradiction analysis — to municipalities, enterprises, infrastructure operators and investors. Landvex is not a UK meat wholesaler, food distributor, logistics company, package tracker, or land investment platform.",
"knowsAbout": [
"control intelligence",
"decision intelligence",
"infrastructure risk assessment",
"urban intelligence",
"field data collection",
"contradiction detection",
"physical world analytics",
"geospatial analytics"
],
"brand": {
"@type": "Brand",
"name": "Landvex",
"slogan": "Control intelligence for the physical world."
},
"sameAs": [
"https://landvex.com",
"https://www.linkedin.com/company/landvex",
"https://x.com/landvex",
"https://twitter.com/landvex",
"https://www.crunchbase.com/organization/landvex",
"https://github.com/landvex",
"https://www.instagram.com/landvex"
],
"contactPoint": {
"@type": "ContactPoint",
"email": "contact@landvex.com",
"contactType": "sales"
},
"slogan": "Where reported reality conflicts with observed reality."
}
</script>
</head>
<body>
<!-- Screen toolbar (hidden in print) -->
<div class="screen-toolbar">
<a class="toolbar-brand" href="index.html">LandveX <span>Inspection</span></a>
<div class="toolbar-actions">
<button class="btn btn-secondary" onclick="window.print()"> Skriv ut / PDF</button>
<button class="btn btn-primary" onclick="window.location.href='dashboard.html'">← Dashboard</button>
</div>
</div>
<div class="report-container">
<div class="report-page" id="report-main">
<!-- Header -->
<div class="report-header">
<div class="report-header-top">
<div class="report-logo">Land<span>ve</span>X</div>
<div class="report-badge">Inspektionsrapport</div>
</div>
<div class="report-title" id="r-title">Industrifastighet Stockholm</div>
<div class="report-subtitle" id="r-subtitle">Fastighets-ID: <span id="r-assetid">LVX-2024-0091</span></div>
<div class="report-meta">
<div class="meta-item">
<div class="meta-label">Inspektionstid</div>
<div class="meta-value" id="r-date">2026-05-20 09:30</div>
</div>
<div class="meta-item">
<div class="meta-label">Inspektör</div>
<div class="meta-value" id="r-inspector">Certified LandveX Inspector</div>
</div>
<div class="meta-item">
<div class="meta-label">Rapportnummer</div>
<div class="meta-value" id="r-num">RPT-2026-0520-001</div>
</div>
<div class="meta-item">
<div class="meta-label">Giltig t.o.m.</div>
<div class="meta-value" id="r-valid">2026-08-20</div>
</div>
</div>
</div>
<!-- Risk score -->
<div class="risk-band">
<div class="risk-score-block">
<div class="risk-gauge" id="gauge">
<div class="risk-gauge-ring" id="gauge-ring"></div>
<div class="risk-score-num" id="r-riskscore">72</div>
<div class="risk-score-max">/100</div>
</div>
<div class="risk-label">
<div class="risk-title" id="r-risklabel">Risknivå: Medel</div>
<div class="risk-desc" id="r-riskdesc">Fastigheten är i acceptabelt skick med några åtgärdspunkter som bör hanteras inom 12 månader för att behålla fastighetsvärdet.</div>
</div>
</div>
<div class="risk-pills" id="r-pills">
<span class="risk-pill pill-green">Brandskydd <svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
<span class="risk-pill pill-green">El <svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8L6.5 11.5L13 4.5" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
<span class="risk-pill pill-orange">Tak — åtgärd behövs</span>
<span class="risk-pill pill-orange">VVS — planera service</span>
<span class="risk-pill pill-blue">Energiklass C</span>
</div>
</div>
<!-- Asset info -->
<div class="section">
<div class="section-title">Fastighetsinformation</div>
<div class="info-grid">
<div class="info-cell">
<div class="info-cell-label">Adress</div>
<div class="info-cell-value" id="f-address">Industrigatan 45, Stockholm</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Fastighetstyp</div>
<div class="info-cell-value" id="f-type">Industri / Lager</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Byggnadsår</div>
<div class="info-cell-value" id="f-year">1987</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Total yta</div>
<div class="info-cell-value highlight" id="f-area">4 200 m²</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Antal plan</div>
<div class="info-cell-value" id="f-floors">2</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Taxeringsvärde</div>
<div class="info-cell-value highlight" id="f-tax">24 500 000 kr</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Energiklass</div>
<div class="info-cell-value" id="f-energy">C (97 kWh/m²/år)</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Ägare</div>
<div class="info-cell-value" id="f-owner">AB Nordisk Industri</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Förvaltare</div>
<div class="info-cell-value" id="f-manager">Nordic Property Mgmt</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Senaste inspektion</div>
<div class="info-cell-value" id="f-last-insp">2024-11-14</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Fastighetsbet.</div>
<div class="info-cell-value" id="f-beteckning">Solna Industri 3:14</div>
</div>
<div class="info-cell">
<div class="info-cell-label">Koordinater</div>
<div class="info-cell-value" id="f-coords">59.3589, 18.0049</div>
</div>
</div>
</div>
<!-- Condition assessment -->
<div class="section">
<div class="section-title">Skickundersökning</div>
<div class="condition-grid">
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">Stomme & Grundläggning</span>
<span class="condition-grade grade-a">A</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:95%;background:#34C759"></div></div>
<div class="condition-note">Betongstomme utan synliga sprickor. Grundläggning i gott skick. Inga sättningssprickor observerade.</div>
</div>
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">Yttertak</span>
<span class="condition-grade grade-d">D</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:40%;background:#FF9500"></div></div>
<div class="condition-note">Takpapp visar slitage och lokala bubblor. Tätskikt på 2 fläktar otillräckligt. Byte rekommenderas inom 18 månader.</div>
</div>
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">Fasad & Fönster</span>
<span class="condition-grade grade-b">B</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:80%;background:#30D158"></div></div>
<div class="condition-note">Tegelfasad i gott skick. Fogning renoverad 2021. 60% av fönstren är 3-glasfönster, resterande bör bytas ut.</div>
</div>
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">VVS-installation</span>
<span class="condition-grade grade-c">C</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:60%;background:#FFCC00"></div></div>
<div class="condition-note">Rörsystem från 1987. Hetvatten-ledningar nearing end-of-life. Värmepump service försenad.</div>
</div>
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">Elinstallation</span>
<span class="condition-grade grade-a">A</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:92%;background:#34C759"></div></div>
<div class="condition-note">Elcentral renoverad 2022. Säkringar och jordfelsbrytare uppdaterade. Godkänd elbesiktning 2025.</div>
</div>
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">Brandskydd</span>
<span class="condition-grade grade-a">A</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:95%;background:#34C759"></div></div>
<div class="condition-note">Sprinklersystem funktionellt. Brandvarnare och nödljus senast testade 2026-03. SBA-dokumentation uppdaterad.</div>
</div>
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">Hiss & Transporter</span>
<span class="condition-grade grade-b">B</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:75%;background:#30D158"></div></div>
<div class="condition-note">Godshiss 5T besiktigad 2025. Lastdocksportar i gott skick. En port med lagerfel — boka reparation.</div>
</div>
<div class="condition-card">
<div class="condition-header">
<span class="condition-label">Mark & Utemiljö</span>
<span class="condition-grade grade-b">B</span>
</div>
<div class="condition-bar"><div class="condition-fill" style="width:78%;background:#30D158"></div></div>
<div class="condition-note">Parkeringsyta i acceptabelt skick. Dagvattenavlopp fungerar. Viss erosion vid lastdockan — fyll igen.</div>
</div>
</div>
</div>
<!-- Photos -->
<div class="section">
<div class="section-title">Inspektionsfoton</div>
<div class="photo-grid">
<div class="photo-cell">
<div class="photo-cell-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="4" width="12" height="9" rx="2" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="8.5" r="2.5" stroke="#666" stroke-width="1.5"/><path d="M5 4L6 2H10L11 4" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="photo-cell-label">Fasad Norr</div>
<div class="photo-cell-tag">IMG_0001.jpg</div>
</div>
<div class="photo-cell">
<div class="photo-cell-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="4" width="12" height="9" rx="2" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="8.5" r="2.5" stroke="#666" stroke-width="1.5"/><path d="M5 4L6 2H10L11 4" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="photo-cell-label">Takyta — Skada</div>
<div class="photo-cell-tag">IMG_0002.jpg</div>
</div>
<div class="photo-cell">
<div class="photo-cell-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="4" width="12" height="9" rx="2" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="8.5" r="2.5" stroke="#666" stroke-width="1.5"/><path d="M5 4L6 2H10L11 4" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="photo-cell-label">Elcentral</div>
<div class="photo-cell-tag">IMG_0003.jpg</div>
</div>
<div class="photo-cell">
<div class="photo-cell-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="4" width="12" height="9" rx="2" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="8.5" r="2.5" stroke="#666" stroke-width="1.5"/><path d="M5 4L6 2H10L11 4" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="photo-cell-label">VVS — pannrum</div>
<div class="photo-cell-tag">IMG_0004.jpg</div>
</div>
<div class="photo-cell">
<div class="photo-cell-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="4" width="12" height="9" rx="2" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="8.5" r="2.5" stroke="#666" stroke-width="1.5"/><path d="M5 4L6 2H10L11 4" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="photo-cell-label">Lastdock</div>
<div class="photo-cell-tag">IMG_0005.jpg</div>
</div>
<div class="photo-cell">
<div class="photo-cell-icon"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="4" width="12" height="9" rx="2" stroke="#666" stroke-width="1.5"/><circle cx="8" cy="8.5" r="2.5" stroke="#666" stroke-width="1.5"/><path d="M5 4L6 2H10L11 4" stroke="#666" stroke-width="1.5"/></svg></div>
<div class="photo-cell-label">Sprinkler — hall</div>
<div class="photo-cell-tag">IMG_0006.jpg</div>
</div>
</div>
</div>
<!-- Maintenance history -->
<div class="section">
<div class="section-title">Underhållshistorik</div>
<div class="history-timeline">
<div class="history-item">
<div class="history-dot-col"><div class="history-dot done"></div><div class="history-line"></div></div>
<div class="history-body">
<div class="history-date">2026-03-10</div>
<div class="history-title">Brandskyddsbesiktning</div>
<div class="history-desc">Fullständig brandskyddsgenomgång: sprinklers, nödljus, utrymningsvägar. Samtliga godkändes utan anmärkning.</div>
<div class="history-cost">Kostnad: 18 500 kr</div>
</div>
<span class="history-status status-done">Utförd</span>
</div>
<div class="history-item">
<div class="history-dot-col"><div class="history-dot done"></div><div class="history-line"></div></div>
<div class="history-body">
<div class="history-date">2026-01-22</div>
<div class="history-title">Elbesiktning & Uppdatering</div>
<div class="history-desc">Byte av 3 automatsäkringar. Jordfelsbrytare testades och godkändes. Rapport tillgänglig.</div>
<div class="history-cost">Kostnad: 12 200 kr</div>
</div>
<span class="history-status status-done">Utförd</span>
</div>
<div class="history-item">
<div class="history-dot-col"><div class="history-dot done"></div><div class="history-line"></div></div>
<div class="history-body">
<div class="history-date">2025-11-05</div>
<div class="history-title">Hissbesiktning Godshiss 5T</div>
<div class="history-desc">Lagstadgad besiktning genomförd. Godkänd utan anmärkningar. Nästa besiktning 2027-11.</div>
<div class="history-cost">Kostnad: 8 500 kr</div>
</div>
<span class="history-status status-done">Utförd</span>
</div>
<div class="history-item">
<div class="history-dot-col"><div class="history-dot planned"></div><div class="history-line"></div></div>
<div class="history-body">
<div class="history-date">2026-08-01 (planerad)</div>
<div class="history-title">Takrenovering — Tätskiktsbyte</div>
<div class="history-desc">Byta takpapp på 1 200 m² + tätning kring fläkthuvar. Anbud inhämtat: 3 leverantörer.</div>
<div class="history-cost">Budget: 280 000 kr</div>
</div>
<span class="history-status status-planned">Planerad</span>
</div>
<div class="history-item">
<div class="history-dot-col"><div class="history-dot overdue"></div></div>
<div class="history-body">
<div class="history-date">2026-04-01 (försenad)</div>
<div class="history-title">Värmepump — Årsservice</div>
<div class="history-desc">Årsservice av värmepump försenad. Risk för minskad effektivitet och garanti-bortfall. Boka snarast.</div>
<div class="history-cost">Estimat: 6 500 kr</div>
</div>
<span class="history-status status-overdue">Försenad</span>
</div>
</div>
</div>
<!-- Recommendations -->
<div class="section">
<div class="section-title">Åtgärdsrekommendationer</div>
<div class="rec-list">
<div class="rec-item rec-medium">
<span class="rec-priority pri-medium">Medel</span>
<div class="rec-body">
<div class="rec-title">Boka värmepump-service omedelbart</div>
<div class="rec-desc">Årsservice är 7 veckor försenad. Risk för effektivitetsförlust 1015% och garanti-bortfall om service inte utförs inom 30 dagar.</div>
<div class="rec-cost-eta">
<div class="rec-meta">Estimerad kostnad: <strong>6 500 kr</strong></div>
<div class="rec-meta">Åtgärd senast: <strong>2026-06-20</strong></div>
</div>
</div>
</div>
<div class="rec-item rec-medium">
<span class="rec-priority pri-medium">Medel</span>
<div class="rec-body">
<div class="rec-title">Planera takrenovering — tätskiktsbyte</div>
<div class="rec-desc">Takpappen visar tydliga ålderstecken. Fortsatt fördröjning ökar risken för vattenintrång och ökade skadekostnader. Budgeterat arbete bör påbörjas aug 2026.</div>
<div class="rec-cost-eta">
<div class="rec-meta">Estimerad kostnad: <strong>280 000 kr</strong></div>
<div class="rec-meta">Åtgärd senast: <strong>2026-10-01</strong></div>
</div>
</div>
</div>
<div class="rec-item rec-low">
<span class="rec-priority pri-low">Låg</span>
<div class="rec-body">
<div class="rec-title">Reparera lastdockport — lagerfel</div>
<div class="rec-desc">Port nr 3 har lagerfel i lyftmekanism. Funktionellt men kräver manuell justering. Enkel reparation, låg kostnad.</div>
<div class="rec-cost-eta">
<div class="rec-meta">Estimerad kostnad: <strong>3 200 kr</strong></div>
<div class="rec-meta">Åtgärd senast: <strong>2026-07-01</strong></div>
</div>
</div>
</div>
<div class="rec-item rec-low">
<span class="rec-priority pri-low">Låg</span>
<div class="rec-body">
<div class="rec-title">Byt ut äldre 2-glasfönster (40%)</div>
<div class="rec-desc">Energibesparingspotential på ~12% vid fönsterbyte. Rekommenderas i nästa investeringsbudget för att förbättra energiklassen från C till B.</div>
<div class="rec-cost-eta">
<div class="rec-meta">Estimerad kostnad: <strong>85 000 kr</strong></div>
<div class="rec-meta">Åtgärd senast: <strong>2027-Q1</strong></div>
</div>
</div>
</div>
<div class="rec-item rec-low">
<span class="rec-priority pri-low">Låg</span>
<div class="rec-body">
<div class="rec-title">Åtgärda erosion vid lastdockan</div>
<div class="rec-desc">Viss markerosion vid lastdockens asfantkant. Fyll med grus och laga asfalt. Förebygg vattenproblem vid regn.</div>
<div class="rec-cost-eta">
<div class="rec-meta">Estimerad kostnad: <strong>4 500 kr</strong></div>
<div class="rec-meta">Åtgärd senast: <strong>2026-08-01</strong></div>
</div>
</div>
</div>
</div>
</div>
<!-- Signature -->
<div class="section">
<div class="section-title">Signering</div>
<div class="signature-block">
<div>
<div class="sig-field">
<div class="sig-label">Inspektörens underskrift & stämpel</div>
</div>
</div>
<div>
<div class="sig-field">
<div class="sig-label">Fastighetsägarens underskrift</div>
</div>
</div>
</div>
<div style="margin-top:20px; font-size:12px; color:var(--text-tertiary); line-height:1.6;">
Denna rapport är ett officiellt LandveX-inspektionsdokument. Inspektören är certifierad av LandveX
och ansvarar för de bedömningar som framgår av rapporten. Rapporten är giltig 90 dagar från inspektionsdatum.
För frågor: <a href="mailto:inspection@landvex.se" style="color:var(--brand);">inspection@landvex.se</a>
</div>
</div>
<!-- Footer -->
<div class="report-footer">
<span>LandveX Inspection System &copy; 2026 Wavult Group</span>
<span id="footer-assetid">Fastighets-ID: LVX-2024-0091</span>
<span>Sida 1 av 1</span>
</div>
</div><!-- /report-page -->
</div><!-- /report-container -->
<script>
// Parse assetId from URL and load data
const params = new URLSearchParams(window.location.search);
const assetId = params.get('assetId') || 'LVX-2024-0091';
// Update asset ID display
document.getElementById('r-assetid').textContent = assetId;
document.getElementById('footer-assetid').textContent = 'Fastighets-ID: ' + assetId;
document.getElementById('r-num').textContent = 'RPT-' + new Date().toISOString().slice(0,10).replace(/-/g,'') + '-001';
document.getElementById('r-date').textContent = new Date().toISOString().slice(0,16).replace('T',' ');
// Set risk gauge color
const score = 72;
const gaugeRing = document.getElementById('gauge-ring');
if (score >= 80) gaugeRing.style.borderColor = '#34C759';
else if (score >= 60) gaugeRing.style.borderColor = '#FF9500';
else gaugeRing.style.borderColor = '#FF3B30';
// Fetch real asset data (with fallback to demo)
fetch('/api/landvex/assets/' + encodeURIComponent(assetId))
.then(r => r.ok ? r.json() : null)
.then(data => {
if (!data || !data.asset) return; // keep demo data
const a = data.asset;
if (a.name) document.getElementById('r-title').textContent = a.name;
if (a.address) document.getElementById('f-address').textContent = a.address;
if (a.type) document.getElementById('f-type').textContent = a.type;
if (a.build_year) document.getElementById('f-year').textContent = a.build_year;
if (a.area_sqm) document.getElementById('f-area').textContent = a.area_sqm.toLocaleString('sv-SE') + ' m²';
if (a.owner) document.getElementById('f-owner').textContent = a.owner;
if (a.risk_score != null) {
document.getElementById('r-riskscore').textContent = a.risk_score;
if (a.risk_score >= 80) { gaugeRing.style.borderColor = '#34C759'; document.getElementById('r-risklabel').textContent = 'Risknivå: Låg'; }
else if (a.risk_score >= 60) { gaugeRing.style.borderColor = '#FF9500'; document.getElementById('r-risklabel').textContent = 'Risknivå: Medel'; }
else { gaugeRing.style.borderColor = '#FF3B30'; document.getElementById('r-risklabel').textContent = 'Risknivå: Hög'; }
}
})
.catch(() => {}); // keep demo data on error
</script>
</body>
</html>