VaneshDev commited on
Commit
7388bc0
·
verified ·
1 Parent(s): b02145f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +36 -5
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 freqNUMERIC_FIELDS = ['usage_hours', 'idle_hours', 'movement_frequency', 'cost_per_hour']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  for col in NUMERIC_FIELDS:
258
  if df[col].isna().any():
259
- raise ValueError(f"ColumnACHINERY_FIELDS = ['equipment_name', 'project_name']
 
 
 
 
 
 
 
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}")