Files
tilbudgivern/docs
alexpolo1 80632c996b feat: Complete Ordrestyring GraphQL integration with automatic offer creation
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>
2025-10-31 21:19:00 +00:00
..
2025-10-30 18:28:58 +00:00
2025-10-30 18:28:58 +00:00
2025-10-30 18:28:58 +00:00
2025-10-30 18:28:58 +00:00
2025-10-30 18:28:58 +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
  • 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):

  1. Åbn browser på http://localhost:3000
  2. Udfyld projektbeskrivelse, f.eks.: "Lægning af 25 m² klikgulv i stue og gang"
  3. Vælg projekttype og areal
  4. Klik "Generer tilbud"
  5. Du vil få en fejl om OpenAI API nøgle - dette er forventet

Med gyldig OpenAI API nøgle:

  1. Tilføj din rigtige OpenAI API nøgle i backend/.env:
    OPENAI_API_KEY=sk-din-rigtige-api-noegle-her
    
  2. Genstart serveren med npm run dev
  3. Test tilbudsgenerering med rigtige AI-svar
  4. 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

  1. Fork projektet
  2. Opret feature branch
  3. Commit ændringer
  4. Push til branch
  5. 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.