CI - Test & Build / Lint & Type Check (push) Canceled after 0s
CI - Test & Build / Backend Unit Tests (push) Canceled after 0s
CI - Test & Build / Frontend Build (push) Canceled after 0s
CI - Test & Build / Security Scan (push) Canceled after 0s
CI - Test & Build / E2E Tests (Playwright) (push) Canceled after 0s
CI - Test & Build / CI Summary (push) Canceled after 0s
* 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]>
269 lines
7.9 KiB
Markdown
269 lines
7.9 KiB
Markdown
# 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
|
|
```bash
|
|
npm install
|
|
cd backend && npm install
|
|
cd ../frontend && npm install
|
|
```
|
|
|
|
### 2. Konfigurer environment
|
|
Opret `backend/.env`:
|
|
```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:**
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
**Production:**
|
|
```bash
|
|
npm run build # Byg frontend
|
|
pm2 start ecosystem.config.js
|
|
```
|
|
|
|
Applikationen kører på **http://localhost:4032**
|
|
|
|
## Kommandoer
|
|
|
|
### Development
|
|
```bash
|
|
npm run dev # Start med hot reload
|
|
npm run build # Byg frontend til produktion
|
|
```
|
|
|
|
### Production
|
|
```bash
|
|
pm2 restart tilbudgivern-unified # Genstart server
|
|
pm2 logs tilbudgivern-unified # Se logs
|
|
pm2 status # Check status
|
|
```
|
|
|
|
### Test
|
|
```bash
|
|
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:
|
|
- [API Dokumentation](docs/api/)
|
|
- [Feature Guides](docs/features/)
|
|
- [Deployment Guide](docs/deployment/)
|
|
- [Logging System](docs/LOGGING_SYSTEM.md)
|
|
|
|
Se `/codemaps/` for arkitektur-diagrammer og systemdesign, verificeret mod den faktiske kode og live database:
|
|
- [Systemarkitektur](codemaps/architecture.md) — proces, deployment, eksterne integrationer
|
|
- [Backend](codemaps/backend.md) — routes, services, request flow, auth
|
|
- [Frontend](codemaps/frontend.md) — komponentstruktur, view-switch pattern
|
|
- [Data](codemaps/data.md) — 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.
|