File size: 1,715 Bytes
1c7bc31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import yaml
from typing import Dict, Any

def estimate_costs(fused: Dict[str, Any], parts_yaml_path: str, top_k: int = 4) -> Dict[str, Any]:
    cfg = yaml.safe_load(open(parts_yaml_path, "r", encoding="utf-8"))
    labor_rate = float(cfg.get("labor_rate_per_hour", 1200.0))
    diagnostic_fee = float(cfg.get("diagnostic_fee", 500.0))
    parts_cfg = cfg.get("parts", {})
    items = []
    total = 0.0
    for i, (label, rec) in enumerate(fused.items()):
        if i >= top_k:
            break
        part_info = parts_cfg.get(label, {})
        hours = float(part_info.get("hours", 1.0))
        parts_list = part_info.get("parts_list", [])
        parts_cost = sum(float(p.get("cost", 0.0)) for p in parts_list)
        labor_cost = hours * labor_rate
        line_total = parts_cost + labor_cost
        items.append({
            "issue": label,
            "probability": round(float(rec["prob"]), 3),
            "severity": int(rec.get("severity", 3)),
            "labor_hours": hours,
            "labor_cost": round(labor_cost, 2),
            "parts": parts_list,
            "parts_cost": round(parts_cost, 2),
            "line_total": round(line_total, 2)
        })
        total += line_total
    if not items:
        items.append({
            "issue": "diagnostic_only",
            "probability": 0.3,
            "severity": 1,
            "labor_hours": 0.0,
            "labor_cost": 0.0,
            "parts": [],
            "parts_cost": 0.0,
            "line_total": diagnostic_fee
        })
        total += diagnostic_fee
    tax = round(0.18 * total, 2)
    grand = round(total + tax, 2)
    return {"items": items, "subtotal": round(total, 2), "tax": tax, "grand_total": grand}