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>
52 lines
1.2 KiB
JSON
52 lines
1.2 KiB
JSON
{
|
|
"quote_number": "TG-20251031-TEST",
|
|
"project": {
|
|
"customer_name": "Test Kunde A/S",
|
|
"customer_address": "Testvej 123, 4000 Roskilde",
|
|
"project_description": "udskiftning af tag på enfamiliehus"
|
|
},
|
|
"geometry": {
|
|
"total_area": 105.0,
|
|
"roof_type": "Komplet tagudskiftning med B7 eternit",
|
|
"roof_pitch": 35
|
|
},
|
|
"labor": {
|
|
"total_work_hours": 85.5,
|
|
"carpenter_count": 2,
|
|
"hourly_rate": 580.0
|
|
},
|
|
"materials": [
|
|
{
|
|
"material_category": "Eternit B7 tagplader 920x1320mm",
|
|
"quantity": 223,
|
|
"total_price": 54635.0
|
|
},
|
|
{
|
|
"material_category": "Lindab Rainline tagrende 125mm",
|
|
"quantity": 14,
|
|
"total_price": 3430.0
|
|
},
|
|
{
|
|
"material_category": "Trykimprægnerede lægter 30x50mm",
|
|
"quantity": 228,
|
|
"total_price": 4218.0
|
|
},
|
|
{
|
|
"material_category": "Eternit rygning inkl. elementer",
|
|
"quantity": 12,
|
|
"total_price": 2040.0
|
|
},
|
|
{
|
|
"material_category": "Lindab nedløb komplet system",
|
|
"quantity": 4,
|
|
"total_price": 2180.0
|
|
}
|
|
],
|
|
"calculation": {
|
|
"total_labor_cost": 49590.0,
|
|
"total_material_cost": 66503.0,
|
|
"overhead_percentage": 15.0,
|
|
"profit_percentage": 20.0,
|
|
"vat_percentage": 25.0
|
|
}
|
|
} |