f37adae2cb
CI - Test & Build / Lint & Type Check (push) Waiting to run
CI - Test & Build / Backend Unit Tests (push) Waiting to run
CI - Test & Build / Frontend Build (push) Waiting to run
CI - Test & Build / E2E Tests (Playwright) (push) Blocked by required conditions
CI - Test & Build / Security Scan (push) Waiting to run
CI - Test & Build / CI Summary (push) Blocked by required conditions
feat: deliver auditable Smart Pakke quote flow and free site geometry (#31)
* feat: move login credentials to a DB-backed users table with an admin management page

Replaces the hardcoded AUTH_USERNAME/AUTH_PASSWORD login check with a new
auth_accounts table (bcrypt-hashed passwords, admin/user roles). Adds
admin-only /api/users CRUD routes and a "Brugere" admin page in the
frontend for managing logins without redeploying. Removes the unused,
unmounted duplicate login route in src/routes/auth.js.

* docs: add architecture codemaps with diagrams for the whole system

Adds codemaps/architecture.md, backend.md, frontend.md, and data.md —
Mermaid-diagrammed design documentation verified against the live
codebase and database rather than assumed from CLAUDE.md. Covers the
unified-server.js request flow (mounted routers + ~183 inline routes),
68 backend services grouped by domain, the frontend's state-driven
view-switch (no React Router in practice despite BrowserRouter being
present), and the full 122-table DB schema with the auth_accounts vs
unrelated users table naming trap flagged explicitly. Links added from
the root README.

Co-Authored-By: Claude Sonnet 5 <[email protected]>

* feat: ship canonical roof quote workflow

* fix: keep migration dry-run idempotent

* [verified] feat: complete Smart Pakker management

* [verified] fix: ignore blank task dependencies

* [verified] fix: align package duplication with schema

* [verified] fix: enforce Discord status limits

* [verified] fix: link Smart Pakke materials safely

* [verified] fix: harden material link review

* [verified] feat: improve material matching

* fix: scope pitch validation to roof packages

* fix: support canonical snapshots on production schema

* [verified] fix: hide internal package metadata from PDF

* [verified] feat: deliver sales-ready customer PDF

* [verified] feat: ship sales-ready PDF with AI overview

* [verified] fix: authenticate project list requests

* [verified] fix: refresh project-list authentication

* [verified] fix: open existing project details

* [verified] fix: keep roof components searchable in builder

* [verified] fix: expose all Smart Package categories

* [verified] fix: authenticate project creation

* [verified] feat: make Smart Pakker the universal project flow

* [verified] feat: preview Smart Package contents

* [verified] test: keep generic release isolated from downpipe work

* feat: add first-class Smart Pakke rentals

* [verified] feat: add gutter and downpipe smart packages

* [verified] fix: prepare six-house gutter quote flow

* [verified] fix: open generic quotes without roof geometry

* [verified] fix: review generic quotes with authenticated APIs

* [verified] fix: calculate generic Smart Package quotes

* [verified] fix: return generic calculation breakdown

* feat: checkpoint generic signed snapshot validation with red-green tests

* feat: complete fail-closed generic quote approval and customer PDF flow

* feat: use generic signed snapshot in final review

* feat: redesign generic quote final review

* fix: harden generic review summaries

* feat: add auditable six-house package basis

* [verified] feat: finish auditable Smart Pakke UI

* [verified] fix: bind auditable quantity and price bases

* [verified] fix: keep six-house basis across package versions

* [verified] fix: complete smart package discovery management

* [verified] fix: simplify composition and generic scope

* [verified] test: keep explicit roof contracts fail closed

* [verified] fix: harden generic quote snapshots

* fix: make generic quote delivery customer safe

* [verified] fix: secure package catalog reads

* [verified] fix: close workspace provenance blockers

* fix: harden customer document language boundary

* [verified] fix: secure smart package internal reads

* fix: version package child mutations atomically

* feat: add generic customer quote text flow

* [verified] fix: allow manual customer numbers

* [verified] fix: expose optional roof geometry

* [verified] fix: rebase hydrated packages after geometry edits

* [verified] feat: add free editable site area map

* [verified] fix: harden map recovery and geocoding gate

* fix: bind map quantities to authoritative geometry

* fix: release geocoder lock before dispatch

* fix: separate roof and site geometry provenance

* fix: revoke stale admin authorization

* fix: migrate task geometry basis

* fix: make backend CI dependency-complete

* ci: seed isolated e2e login account

* fix: allow clean database bootstrap

* fix: skip indexes for optional tables

* test: use canonical mansard geometry in e2e

* [verified] fix(auth): enforce live operator boundary

* fix: fail close Ordrestyring offer transport

* fix(frontend): authenticate customer project requests

* fix: align canonical roof type contract

* [verified] fix: reconcile legacy package labor safely

* [verified] fix: audit site geometry deletion

* docs: add PR 31 reviewer guide

* docs: synchronize Obsidian vault

* docs: sync integrated reviewer guide to Obsidian

* ci: seed isolated auth account explicitly

* fix: close offer bootstrap and service readiness gaps

* fix: authenticate protected package callers

* fix: provision initial admin and disable generic send

* [verified] fix: close final quote release blockers

* [verified] fix: seed gutter packages before deployment

---------

Co-authored-by: alexpolo1 <[email protected]>
Co-authored-by: Claude Sonnet 5 <[email protected]>
2026-09-26 22:39:18 +02:00
2025-11-26 12:36:27 +00:00

Tilbudgivern - AI-baseret Tilbudsberegner

En AI-drevet tilbudsberegner for tømrerfaget, der hjælper med at generere detaljerede og professionelle tilbud baseret på projektbeskrivelser.

Funktioner

  • AI-genererede tilbud: Bruger OpenAI GPT-4 til at generere detaljerede tilbud
  • Smart Pakker: 15 forudkonfigurerede tømrerpakker til tagarbejde med auto-beregning
  • 7 Tagtyper: Sadeltag, Valmtag, Københavnertag, Fladtag, Pulttag, Tag med Kviste, Mansardtag
  • Ordrestyring Integration: GraphQL integration til kunder, sager, tilbud og kalender
  • Materialeimport: Bygma prisbog og Stark katalog import
  • PDF Generering: Professionelle tilbuds-PDF'er via Puppeteer
  • Real-time Updates: Socket.IO til live samarbejde
  • Struktureret Logging: JSON logs med correlation IDs

Teknologi Stack

Lag Teknologi
Frontend React 18, Material-UI 5, Socket.IO Client
Backend Node.js/Express (unified server)
Database MariaDB/MySQL
AI OpenAI GPT-4 API ($9/måned budget)
Process Manager PM2
Test Playwright, Jest, Selenium

Forudsætninger

  • Node.js 18+
  • MariaDB/MySQL database
  • OpenAI API nøgle

Quick Start

1. Installer afhængigheder

npm install
cd backend && npm install
cd ../frontend && npm install

2. Konfigurer environment

Opret backend/.env:

# Database
DB_HOST=127.0.0.1
DB_USER=tilbuduser
DB_PASSWORD=din-password
DB_NAME=tilbudgivern
DB_PORT=3306

# AI
OPENAI_API_KEY=<OPENAI_API_KEY>

# Server
PORT=4032

# Valgfri
ORDRESTYRING_API_TOKEN=din-ordrestyring-token

3. Start applikationen

Development:

npm run dev

Production:

npm run build          # Byg frontend
pm2 start ecosystem.config.js

Applikationen kører på http://localhost:4032

Kommandoer

Development

npm run dev                          # Start med hot reload
npm run build                        # Byg frontend til produktion

Production

pm2 restart tilbudgivern-unified     # Genstart server
pm2 logs tilbudgivern-unified        # Se logs
pm2 status                           # Check status

Test

npm run test:pw                      # Playwright E2E tests (produktion)
npm run test:pw:local                # Playwright tests (lokal)
npm run test:pw:headed               # Playwright med synlig browser
cd backend && npm test               # Backend unit tests (Jest)
npm run test:selenium                # Selenium UI tests

Arkitektur

Unified Server Pattern

Applikationen bruger en unified server (backend/unified-server.js) der:

  • Serverer React frontend fra frontend/build/
  • Leverer alle API endpoints på port 4032
  • Håndterer WebSocket via Socket.IO

Backend Services (40+)

backend/src/services/
├── openaiService.js                 # GPT-4 tilbudsgenerering
├── smartPackageManagementService.js # Smart pakke håndtering
├── ordrestyringSyncService.js       # Ordrestyring integration
├── roofGeometryService.js           # Tagberegninger
├── pdfGenerationService.js          # PDF generering
├── bygmaPrisbogImportService.js     # Bygma import
├── starkImportService.js            # Stark import
└── ...

Frontend Components

frontend/src/components/
├── ProjectFlow.js          # Projekt wizard
├── EnhancedGeometry.js     # Tag geometri med SVG
├── SmartPackagesEnhanced.js # Smart pakke konfiguration
├── FinalReview.js          # Tilbuds review
├── MaterialsManager.js     # Materiale valg
└── ...

Projektstruktur

tilbudgivern/
├── backend/
│   ├── unified-server.js      # Hoved server (~12,700 LOC)
│   ├── src/
│   │   ├── services/          # 40+ services
│   │   ├── routes/            # API routes
│   │   ├── middleware/        # Express middleware
│   │   └── graphql/           # Ordrestyring queries
│   └── migrations/            # Database migrations
├── frontend/
│   ├── src/
│   │   ├── components/        # 57+ React komponenter
│   │   ├── contexts/          # Auth context
│   │   └── services/          # Frontend services
│   └── build/                 # Produktion build
├── database/                  # Schema og seeds
├── tests/                     # Playwright & Selenium tests
├── docs/                      # Dokumentation
└── ecosystem.config.js        # PM2 konfiguration

API Endpoints

Tilbud

POST   /api/quotes/generate              # Generer tilbud
POST   /api/quotes/generate-ai           # AI-drevet generering
GET    /api/quotes/completed             # Liste fuldførte tilbud
POST   /api/quotes/:id/accept            # Accepter tilbud
DELETE /api/quotes/:id                   # Slet tilbud

Smart Pakker

GET    /api/smart-packages/              # Liste alle pakker
POST   /api/smart-packages/              # Opret pakke
GET    /api/smart-packages/:id           # Hent specifik pakke
PUT    /api/smart-packages/:id           # Opdater pakke

Projekter

POST   /api/projects                     # Opret projekt
GET    /api/projects                     # Liste projekter
GET    /api/projects/:id                 # Hent projekt
PUT    /api/projects/:id                 # Opdater projekt

Materialer & Priser

GET    /api/materials                    # Liste materialer
GET    /api/materials/search             # Søg materialer
POST   /api/pricing/bygma-prisbog        # Import Bygma prisbog
GET    /api/pricing/bygma-prices         # Hent Bygma priser

Analytics

GET    /api/analytics/kpis               # Key performance indicators
GET    /api/dashboard/noegletal          # Nøgletal dashboard
GET    /api/dashboard/economics          # Økonomisk overblik

Database

Primære Tabeller

Tabel Beskrivelse
project_quotes Genererede tilbud
customer_projects Projekt metadata
roof_geometry Tag dimensioner og typer
material_packages Smart pakke definitioner
smart_package_tasks Opgaver i pakker
project_materials Materiale valg
project_labor Arbejdstimer
system_logs Struktureret logging

Eksterne Integrationer

Ordrestyring API

  • GraphQL endpoint til ordre/kundestyring
  • Synkronisering af kunder, sager og tilbud
  • Kalender integration

OpenAI API

  • GPT-4 til intelligent tilbudsgenerering
  • Token tracking og budget overvågning
  • $9/måned budget (~160K tokens)

Bygma & Stark

  • Materiale prisbog import
  • Katalog synkronisering

Tagtyper (7 understøttede)

  1. Sadeltag - Standard sadeltag (default)
  2. Valmtag - Fire-sidet tag
  3. Københavnertag - Fladt tag med hældning
  4. Fladtag - Helt fladt tag
  5. Pulttag - Ensidigt skrå tag
  6. Tag med Kviste - Tag med kviste
  7. Mansardtag - Mansard stil

Sikkerhed

  • Rate limiting på API endpoints
  • Input validering med Joi
  • Helmet.js sikkerhedsheaders
  • JWT authentication
  • Parameteriserede SQL queries
  • CORS konfiguration

Dokumentation

Se /docs/ mappen for detaljeret dokumentation:

Se /codemaps/ for arkitektur-diagrammer og systemdesign, verificeret mod den faktiske kode og live database:

  • Systemarkitektur — proces, deployment, eksterne integrationer
  • Backend — routes, services, request flow, auth
  • Frontend — komponentstruktur, view-switch pattern
  • Data — databaseskema, tabeloversigt, migrationsmodel

Support

Ved spørgsmål eller problemer, opret et issue i projektets GitHub repository.

Licens

MIT License - se LICENSE fil for detaljer.

S
Description
No description provided
Readme
378 MiB
Languages
JavaScript 78.5%
Shell 10.7%
CSS 5.3%
Python 4.4%
HTML 0.9%
Other 0.2%