FEATURES IMPLEMENTED: ✅ Full GraphQL integration with Ordrestyring API ✅ Automatic offer creation from Tilbudsgiveren quotes ✅ Customer management (find existing or create new) ✅ Task/Opgave management with full quote description ✅ Material lines (tilbudslinjer) with pricing ✅ Internal notes in bemærkninger field ✅ Department assignment (Tømrer = ID 2) ✅ Status management (Tilbudsgiver Oprettet Tilbud) KEY COMPONENTS: 1. OrdrestyringQuoteService (backend/src/services/ordrestyringQuoteService.js) - generateDetailedQuoteDescription(): Creates formatted quote text - findOrCreateCustomer(): Handles customer, contact, delivery address - createOfferLines(): Updates default task & adds material lines - sendQuoteToOrdrestyring(): Main orchestration method - getOfferWithTasks(): Query offers with task details 2. Smart Task Management: - Finds and updates existing default 'Opgave 1' task - Renames to 'Tilbudsgivertekst' for clarity - Adds full 2000+ character quote description - Creates material lines under the task - Fallback: Creates new task if none exists 3. GraphQL Mutations & Queries: - createOffer: Creates offer with customer, status, department - updateOfferTask: Updates existing task with description - createOfferTask: Fallback for new task creation - createOfferLine: Adds material lines with pricing - Proper error handling and logging throughout 4. Database Integration: - Migration: add_ordrestyring_columns.sql - Tracks ordrestyring_offer_id, ordrestyring_offer_number - Status synchronization with ordrestyring_status - Timestamp tracking with ordrestyring_sent_at 5. Route Updates (backend/routes/ordrestyring.js): - POST /api/ordrestyring/send-quote-graphql - Optional customerId parameter (uses existing or creates new) - Validation for projectId and calculationId - Returns complete offer details TECHNICAL HIGHLIGHTS: • GraphQL Client: graphql-request v7.3.1 • API Endpoint: https://graphql.ordrestyring.dk/graphql • Authentication: Bearer token in headers • Error Handling: Graceful fallbacks, detailed logging • Field Discovery: Used introspection to find correct types - UpdateOfferTaskInput (not OfferTaskInput) - Task fields: header & text (not name & description) - productNumber required for offer lines TESTING: • Test scripts: test_roesevangen_ordrestyring.py • Verification: test_check_offer.js • Live testing with Project 22 (Røsevangen 44) • Confirmed: Single task with full description • Confirmed: 10 material lines with correct pricing • Confirmed: Department, status, and internal notes working RESULT: Complete end-to-end integration from Tilbudsgiveren → Ordrestyring - Creates professional offers with all data - Single 'Tilbudsgivertekst' task (not duplicate Opgave 1) - Full quote description visible in task - Material lines with quantities and prices - Ready for production use Co-authored-by: AI Assistant <copilot@github.com>
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
- Interaktiv feedback: Mulighed for at justere tilbud baseret på feedback
- Prisdatabase: Indbygget database med erfaringspriser for tømrerarbejde
- Responsivt design: Fungerer på desktop og mobil
- Audit trail: Gemmer alle tilbud og feedback for analyse
🛠 Teknologi Stack
- Frontend: React med Material-UI
- Backend: Node.js med Express
- Database: PostgreSQL
- AI: OpenAI GPT-4 API
- Containerization: Docker
📋 Forudsætninger
- Node.js 18+
- Docker og Docker Compose
- OpenAI API nøgle
🏃♂️ Quick Start
1. Klon projektet
```bash cd /home/alex/git/tilbudgivern ```
2. Installer afhængigheder
```bash
Root projekt
npm install
Backend
cd backend npm install
Frontend
cd ../frontend npm install cd .. ```
3. Start database
```bash docker-compose up -d ```
4. Konfigurer environment
Rediger `backend/.env` og tilføj din OpenAI API nøgle: ``` OPENAI_API_KEY=sk-your-actual-openai-api-key-here ```
5. Start applikationen
```bash npm run dev ```
Dette starter både backend (port 3001) og frontend (port 3000).
⚡ Deployment Scripts
For hurtig udvikling er der lavet praktiske deployment scripts i roden:
Fuld Test & Deploy (./test-build-deploy.sh)
Kører komplet test, build og deployment med fejlhåndtering:
./test-build-deploy.sh
Scriptet gør følgende:
- ✅ Tester backend syntax og database forbindelse
- 🏗️ Bygger frontend med fejltjek
- 🔄 Genstarter PM2 server
- 📊 Viser status og eventuelle fejl
Quick Deploy (./quick-deploy.sh)
Hurtig version til små ændringer:
./quick-deploy.sh
Tip: Brug altid disse scripts efter kode-ændringer - de sikrer at alt fungerer korrekt!
🧪 Test Applikationen
Uden OpenAI API nøgle (lokal test):
- Åbn browser på http://localhost:3000
- Udfyld projektbeskrivelse, f.eks.: "Lægning af 25 m² klikgulv i stue og gang"
- Vælg projekttype og areal
- Klik "Generer tilbud"
- Du vil få en fejl om OpenAI API nøgle - dette er forventet
Med gyldig OpenAI API nøgle:
- Tilføj din rigtige OpenAI API nøgle i
backend/.env:OPENAI_API_KEY=sk-din-rigtige-api-noegle-her - Genstart serveren med
npm run dev - Test tilbudsgenerering med rigtige AI-svar
- Test feedback funktionen ved at justere tilbuddet
Test backend API direkte:
# Health check
curl http://localhost:3001/health
# Se prisdata for gulv
curl http://localhost:3001/api/quotes/prices/gulv
# Kør automatiske tests
cd backend && npm test
✅ Status
Applikationen er fuldt funktionel og klar til brug:
- ✅ Backend server kører på port 3001
- ✅ Frontend React app kører på port 3000
- ✅ PostgreSQL database er forbundet og initialiseret
- ✅ Prisdatabase er populeret med tømrer-erfaringspriser
- ✅ API endpoints virker korrekt
- ✅ Frontend kommunikerer med backend
- ✅ Rate limiting og sikkerhed implementeret
- ✅ Error handling og logging funktionerer
- ✅ Database audit trail gemmer alle tilbud og feedback
- 🔑 Kræver kun gyldig OpenAI API nøgle for AI-funktionalitet
Test Gennemført:
- Database initialisering ✅
- API endpoints ✅
- Frontend-backend kommunikation ✅
- Formularer og validering ✅
- Error handling ✅
- Logging ✅
- Rate limiting ✅
📁 Projektstruktur
``` tilbudgivern/ ├── backend/ # Node.js backend │ ├── src/ │ │ ├── routes/ # API routes │ │ ├── services/ # Business logic │ │ ├── middleware/ # Express middleware │ │ └── utils/ # Utilities │ └── package.json ├── frontend/ # React frontend │ ├── src/ │ │ ├── App.js # Main app component │ │ └── index.css # Styling │ └── package.json ├── infra/ # Infrastructure kode (fremtidig Azure deployment) ├── docker-compose.yml # Database setup └── package.json # Root projekt ```
🔧 API Endpoints
- `POST /api/quotes/generate` - Generer nyt tilbud
- `POST /api/quotes/feedback` - Submit feedback og få justeret tilbud
- `GET /api/quotes/:id` - Hent specifikt tilbud
- `GET /api/quotes/prices/:category` - Hent prisdata
- `GET /health` - Health check
🗄 Database Schema
Prices Table
Indeholder erfaringspriser for forskellige typer tømrerarbejde.
Quotes Table
Gemmer alle genererede tilbud med metadata.
Quote Feedback Table
Gemmer feedback og justerede tilbud.
🔒 Sikkerhed
- Rate limiting på API endpoints
- Input validering med Joi
- Helmet.js sikkerhedsheaders
- CORS konfiguration
- Environment variabel protection
🚀 Deployment til Azure
Infrastructure koden til Azure deployment findes i `infra/` mappen og vil blive udviklet i næste fase.
Planlagte Azure services:
- Azure App Service (frontend + backend)
- Azure Database for PostgreSQL
- Azure OpenAI Service
- Azure Application Insights
🤝 Bidrag
- Fork projektet
- Opret feature branch
- Commit ændringer
- Push til branch
- Opret Pull Request
📄 Licens
MIT License - se LICENSE fil for detaljer.
📞 Support
Ved spørgsmål eller problemer, opret et issue i projektets GitHub repository.