feat(boc): Complete Business Operations Center v1.0

- Go backend API with full CRUD for all modules (CRM, Sales, Finance, HR, Legal, Marketing, Support, Purchase, Inventory, Projects, Automation, Analytics)
- Rust analytics service with parallel report generation
- C runtime with POSIX shared memory IPC
- PostgreSQL schema with 30+ tables, full migrations
- Redis cache, sessions, pub/sub
- Kafka event streaming with Zookeeper
- WebSocket hub for real-time updates
- Automation engine with cron jobs, workflows, event triggers
- JWT authentication, multi-tenant from start
- Docker Compose with all services
- Nginx reverse proxy with rate limiting
- Integration tests passing
- Feature gap analysis against Fortnox/Odoo/Visma

Refs: BOC-001
This commit is contained in:
Bernt
2026-07-12 12:41:35 +00:00
parent 4789a7fb48
commit 58ca4e68db
26666 changed files with 575891 additions and 2074516 deletions
+260
View File
@@ -0,0 +1,260 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AAMOS Modules — Enterprise APIs | AAMOS</title>
<meta name="description" content="Production-grade enterprise modules from AAMOS — Incident Management and AI Image Deviation Engine. Battle-tested at scale. Available as REST APIs.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--navy: #0A2540; --blue: #635BFF; --blue-light: #7B74FF;
--gray-50: #F8FAFC; --gray-100: #F1F5F9; --gray-200: #E2E8F0;
--gray-400: #94A3B8; --gray-600: #475569; --gray-800: #1E293B; --white: #FFFFFF;
--font: 'Inter', system-ui, -apple-system, sans-serif;
}
body { font-family: var(--font); background: var(--white); color: var(--gray-800); line-height: 1.6; }
a { color: inherit; text-decoration: none; }
nav {
position: sticky; top: 0; z-index: 100;
background: rgba(255,255,255,0.95); backdrop-filter: blur(8px);
border-bottom: 1px solid var(--gray-200);
padding: 0 24px; height: 60px;
display: flex; align-items: center; justify-content: space-between;
}
.nav-logo { font-size: 18px; font-weight: 700; color: var(--navy); }
.nav-logo span { color: var(--blue); }
.nav-back { font-size: 14px; color: var(--gray-600); }
.btn-nav { background: var(--navy); color: var(--white); padding: 8px 16px; border-radius: 8px; font-weight: 600; font-size: 14px; }
.hero {
background: linear-gradient(135deg, #0d1f3c 0%, #1a3a60 100%);
color: var(--white); padding: 72px 24px 64px; text-align: center;
}
.hero-badge {
display: inline-block; background: rgba(99,91,255,0.25); color: #a5b4fc;
border: 1px solid rgba(99,91,255,0.4); border-radius: 100px;
padding: 4px 14px; font-size: 12px; font-weight: 600;
letter-spacing: 0.05em; text-transform: uppercase; margin-bottom: 20px;
}
.hero h1 { font-size: clamp(28px, 5vw, 46px); font-weight: 700; letter-spacing: -1px; line-height: 1.1; margin-bottom: 16px; }
.hero p { font-size: 17px; color: rgba(255,255,255,0.75); max-width: 540px; margin: 0 auto 32px; }
.origin-strip {
display: inline-flex; align-items: center; gap: 10px;
background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.12);
border-radius: 10px; padding: 12px 20px; margin-top: 28px;
font-size: 13px; color: rgba(255,255,255,0.65); max-width: 480px;
}
.origin-dot { width: 8px; height: 8px; border-radius: 50%; background: #4ade80; flex-shrink: 0; }
.btn-primary { background: var(--blue); color: var(--white); padding: 14px 28px; border-radius: 10px; font-size: 15px; font-weight: 600; display: inline-block; transition: background 0.15s; }
.btn-primary:hover { background: var(--blue-light); }
.content { max-width: 860px; margin: 0 auto; padding: 64px 24px; }
.block { margin-bottom: 60px; }
.block-label { font-size: 12px; font-weight: 700; color: var(--blue); letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 12px; }
.block h2 { font-size: clamp(22px, 3.5vw, 30px); font-weight: 700; letter-spacing: -0.5px; color: var(--navy); margin-bottom: 24px; }
.module-cards { display: grid; gap: 20px; }
.module-card {
border: 1px solid var(--gray-200); border-radius: 16px; padding: 28px 24px;
background: var(--white);
}
.module-header { display: flex; align-items: center; gap: 16px; margin-bottom: 16px; }
.module-icon {
width: 44px; height: 44px; border-radius: 12px; flex-shrink: 0;
background: linear-gradient(135deg, var(--blue) 0%, #4f46e5 100%);
display: flex; align-items: center; justify-content: center;
}
.module-icon svg { width: 22px; height: 22px; fill: none; stroke: white; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.module-name { font-size: 18px; font-weight: 700; color: var(--navy); }
.module-tag { font-size: 11px; font-weight: 600; color: var(--blue); background: rgba(99,91,255,0.08); border-radius: 4px; padding: 2px 8px; }
.module-desc { font-size: 15px; color: var(--gray-600); margin-bottom: 20px; }
.module-features { list-style: none; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }
.module-features li { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 8px; }
.module-features li::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.code-block {
background: var(--navy); border-radius: 14px; padding: 24px;
font-family: 'SF Mono', 'Fira Code', monospace; font-size: 13px;
line-height: 1.75; color: rgba(255,255,255,0.85); overflow-x: auto;
margin-top: 20px;
}
.code-block .kw { color: #a5b4fc; }
.code-block .str { color: #86efac; }
.code-block .cm { color: rgba(255,255,255,0.4); }
.code-block .num { color: #fcd34d; }
.pricing-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; }
.price-card { border: 1px solid var(--gray-200); border-radius: 16px; padding: 28px 24px; display: flex; flex-direction: column; }
.price-card.featured { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(99,91,255,0.1); }
.price-tier { font-size: 13px; font-weight: 700; color: var(--blue); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; }
.price-amount { font-size: 32px; font-weight: 700; color: var(--navy); letter-spacing: -1px; }
.price-amount span { font-size: 15px; font-weight: 500; color: var(--gray-400); }
.price-desc { font-size: 13px; color: var(--gray-400); margin-top: 4px; margin-bottom: 20px; }
.price-features { list-style: none; display: flex; flex-direction: column; gap: 10px; flex: 1; margin-bottom: 24px; }
.price-features li { font-size: 14px; color: var(--gray-600); display: flex; align-items: center; gap: 8px; }
.price-features li::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--blue); flex-shrink: 0; }
.btn-outline { border: 1px solid var(--gray-200); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: var(--navy); text-align: center; display: block; transition: border-color 0.15s; }
.btn-outline:hover { border-color: var(--blue); }
.btn-filled { background: var(--blue); border-radius: 8px; padding: 10px 16px; font-size: 14px; font-weight: 600; color: white; text-align: center; display: block; }
.cta-bottom { background: var(--navy); color: var(--white); padding: 64px 24px; text-align: center; }
.cta-bottom h2 { font-size: clamp(22px, 4vw, 32px); font-weight: 700; letter-spacing: -0.5px; margin-bottom: 14px; }
.cta-bottom p { color: rgba(255,255,255,0.7); font-size: 16px; margin-bottom: 28px; max-width: 440px; margin-left: auto; margin-right: auto; }
footer { border-top: 1px solid var(--gray-200); padding: 24px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; font-size: 13px; color: var(--gray-400); }
footer a { color: var(--gray-400); }
.footer-links { display: flex; gap: 20px; }
</style>
</head>
<body>
<nav>
<a href="/" class="nav-logo">A<span>AMOS</span></a>
<a href="/" class="nav-back">← All products</a>
<a href="#" class="btn-nav">Get API key</a>
</nav>
<section class="hero">
<div class="hero-badge">Enterprise</div>
<h1>AAMOS Modules</h1>
<p>Enterprise-grade modules from our own production stack. Battle-tested across 300+ microservices. Available as clean REST APIs.</p>
<a href="#" class="btn-primary">Get API key — free tier included</a>
<div>
<div class="origin-strip">
<div class="origin-dot"></div>
These modules run Landvex's own operations. You're buying the same infrastructure we run on.
</div>
</div>
</section>
<div class="content">
<div class="block">
<div class="block-label">Available modules</div>
<h2>Two modules. Production-ready today.</h2>
<div class="module-cards">
<div class="module-card">
<div class="module-header">
<div class="module-icon">
<svg viewBox="0 0 24 24"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
</div>
<div>
<div class="module-tag">Incident Management</div>
<div class="module-name">Incident API</div>
</div>
</div>
<p class="module-desc">Structured incident lifecycle management — from detection to resolution. Full API with webhook events, priority queuing, assignment, and audit trail.</p>
<ul class="module-features">
<li>Create and track incidents</li>
<li>Priority levels + SLA timers</li>
<li>Assignment and ownership</li>
<li>Status transitions + webhooks</li>
<li>Comment threads</li>
<li>Full audit log</li>
<li>Integrates with any ticketing system</li>
<li>REST + webhook delivery</li>
</ul>
<div class="code-block">
<span class="cm"># Create an incident</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/incident/incidents \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer ***"</span> \<br>
&nbsp;&nbsp;-d '{<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"title"</span>: <span class="str">"Water leak detected — Block 4B"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"priority"</span>: <span class="str">"high"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"source"</span>: <span class="str">"vims-api"</span>,<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"assignee_group"</span>: <span class="str">"maintenance-east"</span><br>
&nbsp;&nbsp;}'<br><br>
{ <span class="str">"incident_id"</span>: <span class="str">"inc_7f3a9b"</span>, <span class="str">"status"</span>: <span class="str">"open"</span>, <span class="str">"sla_deadline"</span>: <span class="str">"..."</span> }
</div>
</div>
<div class="module-card">
<div class="module-header">
<div class="module-icon">
<svg viewBox="0 0 24 24"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 21V9"/></svg>
</div>
<div>
<div class="module-tag">Vision AI</div>
<div class="module-name">AI Image Deviation Engine</div>
</div>
</div>
<p class="module-desc">Submit any image against a stored baseline — get back a structured deviation report. Pixel-level and semantic analysis. Designed for quality control, inspection workflows, and asset monitoring.</p>
<ul class="module-features">
<li>Baseline storage per asset ID</li>
<li>Deviation score (01)</li>
<li>Semantic change classification</li>
<li>Region-of-interest masks</li>
<li>Batch processing</li>
<li>Confidence thresholds</li>
<li>Works on any image type</li>
<li>Integrates with VIMS API</li>
</ul>
<div class="code-block">
<span class="cm"># Compare image to stored baseline</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/deviation/compare \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer ***"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"image=@current.jpg"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"asset_id=warehouse-roof-7"</span><br><br>
{<br>
&nbsp;&nbsp;<span class="str">"asset_id"</span>: <span class="str">"warehouse-roof-7"</span>,<br>
&nbsp;&nbsp;<span class="str">"deviation_score"</span>: <span class="num">0.63</span>,<br>
&nbsp;&nbsp;<span class="str">"change_type"</span>: <span class="str">"structural"</span>,<br>
&nbsp;&nbsp;<span class="str">"regions"</span>: [{ <span class="str">"label"</span>: <span class="str">"crack"</span>, <span class="str">"area_pct"</span>: <span class="num">4.2</span> }],<br>
&nbsp;&nbsp;<span class="str">"recommend_action"</span>: <span class="str">"schedule_inspection"</span><br>
}
</div>
</div>
</div>
</div>
<div class="block">
<div class="block-label">Pricing</div>
<h2>One plan. Both modules included.</h2>
<div class="pricing-grid">
<div class="price-card">
<div class="price-tier">Starter</div>
<div class="price-amount">$199 <span>/mo</span></div>
<div class="price-desc">Both modules included</div>
<ul class="price-features">
<li>500 incidents / month</li>
<li>1,000 deviation analyses / month</li>
<li>Webhook events</li>
<li>Email support</li>
</ul>
<a href="#" class="btn-outline">Get started</a>
</div>
<div class="price-card featured">
<div class="price-tier">Pro</div>
<div class="price-amount">$799 <span>/mo</span></div>
<div class="price-desc">High volume + SLA</div>
<ul class="price-features">
<li>Unlimited incidents</li>
<li>50,000 deviation analyses / month</li>
<li>Custom asset models</li>
<li>Priority support</li>
<li>99.9% SLA</li>
<li>Audit export</li>
</ul>
<a href="#" class="btn-filled">Get started</a>
</div>
<div class="price-card">
<div class="price-tier">Enterprise</div>
<div class="price-amount">Custom</div>
<div class="price-desc">Volume + dedicated infra</div>
<ul class="price-features">
<li>Unlimited everything</li>
<li>On-premise option</li>
<li>Custom model training</li>
<li>SLA to 99.99%</li>
<li>Dedicated account manager</li>
</ul>
<a href="mailto:sales@aamos.ai" class="btn-outline">Contact sales</a>
</div>
</div>
</div>
</div>
<section class="cta-bottom">
<h2>Ready to integrate enterprise-grade modules?</h2>
<p>Start with Starter. We're running these in production — so you don't have to prove they work.</p>
<a href="#" class="btn-primary">Get API key</a>
</section>
<footer>
<span>© 2026 AAMOS / Landvex AB</span>
<div class="footer-links"><a href="#">Privacy</a><a href="#">Terms</a><a href="/">Home</a></div>
</footer>
</body>
</html>