Spaces:
Sleeping
Sleeping
| 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} | |