{"name":"AI Repair Estimate Generator","nodes":[{"id":"webhook","type":"n8n-nodes-base.webhook","name":"Estimate Request","position":[250,300],"parameters":{"path":"repair-estimate","method":"POST"}},{"id":"lookupVehicle","type":"n8n-nodes-base.httpRequest","name":"Lookup Vehicle Data","position":[450,300],"parameters":{"url":"={{$env.VEHICLE_DATA_API}}/decode","method":"GET","queryParameters":{"year":"={{$json.vehicle_year}}","make":"={{$json.vehicle_make}}","model":"={{$json.vehicle_model}}"}}},{"id":"aiEstimate","type":"n8n-nodes-base.openAi","name":"AI Generate Estimate","position":[650,300],"parameters":{"model":"gpt-4o","prompt":"You are an experienced auto repair estimator. Based on the customer complaint and vehicle info, generate a detailed repair estimate.\n\nVehicle: {{$json.vehicle_year}} {{$json.vehicle_make}} {{$json.vehicle_model}} ({{$json.mileage}} miles)\nCustomer complaint: {{$json.complaint}}\nVehicle data: {{JSON.stringify($json.vehicle_specs)}}\n\nReturn JSON: {\n  likely_diagnoses: [{diagnosis: string, probability: string, description: string}],\n  recommended_repairs: [{repair: string, parts: [{name: string, part_number: string, cost: number}], labor_hours: number, labor_cost: number, total: number}],\n  estimate_range: {low: number, mid: number, high: number},\n  additional_maintenance: [{service: string, reason: string, cost: number}],\n  customer_explanation: string\n}"}},{"id":"fetchPricing","type":"n8n-nodes-base.httpRequest","name":"Get Current Parts Pricing","position":[850,200],"parameters":{"url":"={{$env.PARTS_AGGREGATOR_API}}/pricing","method":"POST","body":{"parts":"={{$json.recommended_repairs.flatMap(r => r.parts.map(p => p.part_number))}}"}}},{"id":"formatEstimate","type":"n8n-nodes-base.code","name":"Format Estimate Document","position":[1050,300],"parameters":{"language":"javascript","code":"const est = $json;\nconst lines = est.recommended_repairs.map(r => `${r.repair}: Parts $${r.parts.reduce((s,p)=>s+p.cost,0).toFixed(2)} + Labor $${r.labor_cost.toFixed(2)} = $${r.total.toFixed(2)}`);\nreturn { json: { ...est, formatted_lines: lines.join(\"\\n\"), total_estimate: `$${est.estimate_range.low} - $${est.estimate_range.high}` } };"}},{"id":"sendEstimate","type":"n8n-nodes-base.sendGrid","name":"Email Estimate to Customer","position":[1250,200],"parameters":{"to":"={{$json.customer_email}}","subject":"Your Repair Estimate — {{$json.vehicle_year}} {{$json.vehicle_make}} {{$json.vehicle_model}}"}},{"id":"createPending","type":"n8n-nodes-base.httpRequest","name":"Create Pending Appointment","position":[1250,400],"parameters":{"url":"={{$env.SHOP_MGMT_API}}/appointments/pending","method":"POST","body":{"customer_id":"={{$json.customer_id}}","vehicle_id":"={{$json.vehicle_id}}","estimate_id":"={{$json.estimate_id}}","services":"={{$json.recommended_repairs}}"}}},{"id":"respond","type":"n8n-nodes-base.respondToWebhook","name":"Return Estimate","position":[1450,300],"parameters":{"body":"={{$json}}"}}],"connections":{"Estimate Request":{"main":[[{"node":"Lookup Vehicle Data","type":"main","index":0}]]},"Lookup Vehicle Data":{"main":[[{"node":"AI Generate Estimate","type":"main","index":0}]]},"AI Generate Estimate":{"main":[[{"node":"Get Current Parts Pricing","type":"main","index":0}]]},"Get Current Parts Pricing":{"main":[[{"node":"Format Estimate Document","type":"main","index":0}]]},"Format Estimate Document":{"main":[[{"node":"Email Estimate to Customer","type":"main","index":0},{"node":"Create Pending Appointment","type":"main","index":0}]]},"Email Estimate to Customer":{"main":[[{"node":"Return Estimate","type":"main","index":0}]]},"Create Pending Appointment":{"main":[[{"node":"Return Estimate","type":"main","index":0}]]}}}