Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -235,9 +235,7 @@ def format_output(result):
|
|
| 235 |
f" • Project: {summary.get('Project', 'N/A')}",
|
| 236 |
f" • Usage Hours: {summary.get('Usage Hours', 0):.2f}",
|
| 237 |
f" • Idle Hours: {summary.get('Idle Hours', 0):.2f}",
|
| 238 |
-
f" • Cost per
|
| 239 |
-
|
| 240 |
-
Hour: {cost_str}",
|
| 241 |
f" • Last Maintenance: {summary.get('Last Maintenance', 'N/A')}"
|
| 242 |
]
|
| 243 |
return "\n".join(lines)
|
|
@@ -253,10 +251,43 @@ def manual_input(equipment, project, usage, idle, freq, cost, last, ai_suggestio
|
|
| 253 |
raise ValueError("Usage Hours must be a non-negative number.")
|
| 254 |
if idle is None or idle < 0 or np.isnan(idle):
|
| 255 |
raise ValueError("Idle Hours must be a non-negative number.")
|
| 256 |
-
if freq is None or
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
for col in NUMERIC_FIELDS:
|
| 258 |
if df[col].isna().any():
|
| 259 |
-
raise ValueError(f"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 260 |
for col in MACHINERY_FIELDS:
|
| 261 |
if col not in df.columns:
|
| 262 |
raise ValueError(f"Missing required column: {col}")
|
|
|
|
| 235 |
f" • Project: {summary.get('Project', 'N/A')}",
|
| 236 |
f" • Usage Hours: {summary.get('Usage Hours', 0):.2f}",
|
| 237 |
f" • Idle Hours: {summary.get('Idle Hours', 0):.2f}",
|
| 238 |
+
f" • Cost per Hour: {cost_str}",
|
|
|
|
|
|
|
| 239 |
f" • Last Maintenance: {summary.get('Last Maintenance', 'N/A')}"
|
| 240 |
]
|
| 241 |
return "\n".join(lines)
|
|
|
|
| 251 |
raise ValueError("Usage Hours must be a non-negative number.")
|
| 252 |
if idle is None or idle < 0 or np.isnan(idle):
|
| 253 |
raise ValueError("Idle Hours must be a non-negative number.")
|
| 254 |
+
if freq is None or freq < 0 or np.isnan(freq):
|
| 255 |
+
raise ValueError("Movement Frequency must be a non-negative number.")
|
| 256 |
+
if cost is None or cost < 0 or np.isnan(cost):
|
| 257 |
+
raise ValueError("Cost per Hour must be a non-negative number.")
|
| 258 |
+
|
| 259 |
+
last_val = last or "N/A"
|
| 260 |
+
res = process_equipment_utilization(equipment, project, usage, idle, freq, cost, last_val, ai_suggestion)
|
| 261 |
+
formatted = format_output(res)
|
| 262 |
+
return formatted, res.get("Report_File_Path"), res.get("CSV_Report_Link")
|
| 263 |
+
except Exception as e:
|
| 264 |
+
logger.error(f"Error in manual_input: {e}")
|
| 265 |
+
return f"Error: {str(e)}", None, None
|
| 266 |
+
|
| 267 |
+
def batch_upload(csv_file):
|
| 268 |
+
try:
|
| 269 |
+
if not csv_file:
|
| 270 |
+
raise ValueError("Please upload a CSV file.")
|
| 271 |
+
df = pd.read_csv(csv_file.name)
|
| 272 |
+
|
| 273 |
+
# Validate required columns
|
| 274 |
+
required_columns = ['equipment_name', 'project_name', 'usage_hours', 'idle_hours', 'movement_frequency', 'cost_per_hour']
|
| 275 |
+
missing_columns = [col for col in required_columns if col not in df.columns]
|
| 276 |
+
if missing_columns:
|
| 277 |
+
raise ValueError(f"CSV file is missing required columns: {', '.join(missing_columns)}")
|
| 278 |
+
|
| 279 |
+
# Validate numeric columns for NaN or non-numeric values
|
| 280 |
+
NUMERIC_FIELDS = ['usage_hours', 'idle_hours', 'movement_frequency', 'cost_per_hour']
|
| 281 |
for col in NUMERIC_FIELDS:
|
| 282 |
if df[col].isna().any():
|
| 283 |
+
raise ValueError(f"Column '{col}' contains missing or invalid values (e.g., NaN). Please ensure all values are valid numbers.")
|
| 284 |
+
try:
|
| 285 |
+
df[col] = df[col].astype(float)
|
| 286 |
+
except ValueError as e:
|
| 287 |
+
raise ValueError(f"Column '{col}' contains non-numeric values: {str(e)}")
|
| 288 |
+
|
| 289 |
+
# Validate equipment_name and project_name for missing values
|
| 290 |
+
MACHINERY_FIELDS = ['equipment_name', 'project_name']
|
| 291 |
for col in MACHINERY_FIELDS:
|
| 292 |
if col not in df.columns:
|
| 293 |
raise ValueError(f"Missing required column: {col}")
|