MaheshP98 commited on
Commit
08e167c
·
verified ·
1 Parent(s): 1a2206d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -15
app.py CHANGED
@@ -7,9 +7,17 @@ from PIL import Image
7
  import csv
8
  import os
9
  import requests
10
- from simple_salesforce import Salesforce
 
 
 
 
11
  from dotenv import load_dotenv
12
 
 
 
 
 
13
  # Load environment variables for Salesforce credentials
14
  load_dotenv()
15
  SF_USERNAME = os.getenv("SF_USERNAME")
@@ -19,6 +27,7 @@ SF_INSTANCE_URL = "https://login.salesforce.com" # Use https://test.salesforce.
19
 
20
  def connect_to_salesforce():
21
  """Establish connection to Salesforce."""
 
22
  try:
23
  sf = Salesforce(
24
  username=SF_USERNAME,
@@ -26,8 +35,10 @@ def connect_to_salesforce():
26
  security_token=SF_SECURITY_TOKEN,
27
  instance_url=SF_INSTANCE_URL
28
  )
 
29
  return sf
30
  except Exception as e:
 
31
  return f"Error connecting to Salesforce: {str(e)}"
32
 
33
  def fetch_usd_inr_rate():
@@ -41,12 +52,16 @@ def fetch_usd_inr_rate():
41
  return None
42
 
43
  def predict_overrun(planned_cost, actual_spend, category, cement_index, labor_index, project_phase):
 
 
 
44
  try:
45
  planned_cost = float(planned_cost)
46
  actual_spend = float(actual_spend)
47
  cement_index = float(cement_index)
48
  labor_index = float(labor_index)
49
  except ValueError:
 
50
  return "**Error:** Inputs must be numeric.", None, None, None
51
 
52
  # Risk calculation logic
@@ -64,6 +79,7 @@ def predict_overrun(planned_cost, actual_spend, category, cement_index, labor_in
64
 
65
  forecast_cost = planned_cost * (1 + total_risk)
66
  insights = "High risk of overrun" if total_risk > 0.3 else "Risk within acceptable range"
 
67
 
68
  # Chart
69
  fig, ax = plt.subplots()
@@ -95,26 +111,37 @@ def predict_overrun(planned_cost, actual_spend, category, cement_index, labor_in
95
  writer.writerow(["Planned Cost", "Actual Spend", "Risk Score", "Forecasted Cost", "Insights"])
96
  writer.writerow([planned_cost, actual_spend, round(total_risk * 100, 2), round(forecast_cost, 2), insights])
97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  # Save to Salesforce
99
  sf = connect_to_salesforce()
100
  if isinstance(sf, str):
101
  salesforce_status = sf # Error message
 
102
  else:
103
  try:
104
- sf.Project_Budget_Risk__c.create({
105
- "Planned_Cost__c": planned_cost,
106
- "Actual_Spend__c": actual_spend,
107
- "Category__c": category,
108
- "Cement_Index__c": cement_index,
109
- "Labor_Index__c": labor_index,
110
- "Project_Phase__c": project_phase,
111
- "Risk_Score__c": round(total_risk * 100, 2),
112
- "Forecasted_Cost__c": round(forecast_cost, 2),
113
- "Insights__c": insights
114
- })
115
- salesforce_status = "Successfully saved to Salesforce."
116
  except Exception as e:
117
- salesforce_status = f"Error saving to Salesforce: {str(e)}"
 
118
 
119
  usd_inr = fetch_usd_inr_rate()
120
  fx_note = f"\n**USD to INR Rate:** ₹{usd_inr:.2f}" if usd_inr else "\n(Exchange rate unavailable)"
@@ -145,7 +172,7 @@ interface = gr.Interface(
145
  gr.File(label="Download PDF"),
146
  gr.File(label="Download CSV")
147
  ],
148
- title="Budget Overrun Risk Estimator"
149
  )
150
 
151
  if __name__ == "__main__":
 
7
  import csv
8
  import os
9
  import requests
10
+ import logging
11
+ try:
12
+ from simple_salesforce import Salesforce
13
+ except ImportError:
14
+ raise ImportError("The 'simple-salesforce' library is not installed. Run 'pip install simple-salesforce' to install it.")
15
  from dotenv import load_dotenv
16
 
17
+ # Set up logging
18
+ logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
19
+ logger = logging.getLogger(__name__)
20
+
21
  # Load environment variables for Salesforce credentials
22
  load_dotenv()
23
  SF_USERNAME = os.getenv("SF_USERNAME")
 
27
 
28
  def connect_to_salesforce():
29
  """Establish connection to Salesforce."""
30
+ logger.debug("Attempting to connect to Salesforce...")
31
  try:
32
  sf = Salesforce(
33
  username=SF_USERNAME,
 
35
  security_token=SF_SECURITY_TOKEN,
36
  instance_url=SF_INSTANCE_URL
37
  )
38
+ logger.debug("Successfully connected to Salesforce.")
39
  return sf
40
  except Exception as e:
41
+ logger.error(f"Error connecting to Salesforce: {str(e)}")
42
  return f"Error connecting to Salesforce: {str(e)}"
43
 
44
  def fetch_usd_inr_rate():
 
52
  return None
53
 
54
  def predict_overrun(planned_cost, actual_spend, category, cement_index, labor_index, project_phase):
55
+ logger.debug("Starting prediction with inputs: planned_cost=%s, actual_spend=%s, category=%s, cement_index=%s, labor_index=%s, project_phase=%s",
56
+ planned_cost, actual_spend, category, cement_index, labor_index, project_phase)
57
+
58
  try:
59
  planned_cost = float(planned_cost)
60
  actual_spend = float(actual_spend)
61
  cement_index = float(cement_index)
62
  labor_index = float(labor_index)
63
  except ValueError:
64
+ logger.error("Invalid input: Inputs must be numeric.")
65
  return "**Error:** Inputs must be numeric.", None, None, None
66
 
67
  # Risk calculation logic
 
79
 
80
  forecast_cost = planned_cost * (1 + total_risk)
81
  insights = "High risk of overrun" if total_risk > 0.3 else "Risk within acceptable range"
82
+ logger.debug("Calculation results: total_risk=%s, forecast_cost=%s, insights=%s", total_risk, forecast_cost, insights)
83
 
84
  # Chart
85
  fig, ax = plt.subplots()
 
111
  writer.writerow(["Planned Cost", "Actual Spend", "Risk Score", "Forecasted Cost", "Insights"])
112
  writer.writerow([planned_cost, actual_spend, round(total_risk * 100, 2), round(forecast_cost, 2), insights])
113
 
114
+ # Prepare data for Salesforce
115
+ sf_data = {
116
+ "Planned_Cost__c": planned_cost,
117
+ "Actual_Spend__c": actual_spend,
118
+ "Category__c": category,
119
+ "Cement_Index__c": cement_index,
120
+ "Labor_Index__c": labor_index,
121
+ "Project_Phase__c": project_phase,
122
+ "Risk_Score__c": round(total_risk * 100, 2),
123
+ "Forecasted_Cost__c": round(forecast_cost, 2),
124
+ "Insights__c": insights
125
+ }
126
+ logger.debug("Data prepared for Salesforce: %s", sf_data)
127
+
128
  # Save to Salesforce
129
  sf = connect_to_salesforce()
130
  if isinstance(sf, str):
131
  salesforce_status = sf # Error message
132
+ logger.error("Salesforce connection failed: %s", salesforce_status)
133
  else:
134
  try:
135
+ result = sf.Project_Budget_Risk__c.create(sf_data)
136
+ logger.debug("Salesforce create result: %s", result)
137
+ if result.get('success'):
138
+ salesforce_status = f"Successfully saved to Salesforce. Record ID: {result['id']}"
139
+ else:
140
+ salesforce_status = f"Failed to save to Salesforce: {result.get('errors')}"
141
+ logger.error(salesforce_status)
 
 
 
 
 
142
  except Exception as e:
143
+ salesforce_status = f"Error saving to Salesforce: {str(e)}\nData sent: {sf_data}"
144
+ logger.error(salesforce_status)
145
 
146
  usd_inr = fetch_usd_inr_rate()
147
  fx_note = f"\n**USD to INR Rate:** ₹{usd_inr:.2f}" if usd_inr else "\n(Exchange rate unavailable)"
 
172
  gr.File(label="Download PDF"),
173
  gr.File(label="Download CSV")
174
  ],
175
+ title="🧮 Budget Overrun Risk Estimator with Salesforce Integration"
176
  )
177
 
178
  if __name__ == "__main__":