Update app.py
Browse files
app.py
CHANGED
|
@@ -41,14 +41,14 @@ def calculate_scores(vendor_log):
|
|
| 41 |
"""Calculate scores based on Vendor Log data."""
|
| 42 |
try:
|
| 43 |
# Timeliness Score: Based on Delay Days
|
| 44 |
-
delay_days = vendor_log['Delay_Days__c']
|
| 45 |
timeliness_score = 100.0 if delay_days <= 0 else 80.0 if delay_days <= 3 else 60.0 if delay_days <= 7 else 40.0
|
| 46 |
|
| 47 |
# Quality Score: Direct mapping from Quality Percentage
|
| 48 |
-
quality_score = float(vendor_log['Quality_Percentage__c'])
|
| 49 |
|
| 50 |
# Safety Score: Based on Incident Severity
|
| 51 |
-
incident_severity = vendor_log['Incident_Severity__c']
|
| 52 |
safety_score = {
|
| 53 |
'None': 100.0,
|
| 54 |
'Low': 80.0,
|
|
@@ -58,7 +58,7 @@ def calculate_scores(vendor_log):
|
|
| 58 |
}.get(incident_severity, 100.0)
|
| 59 |
|
| 60 |
# Communication Score: Based on Communication Count (scale 0-100)
|
| 61 |
-
comm_count = vendor_log['Communication_Count__c']
|
| 62 |
communication_score = min(100.0, comm_count * 10.0) # 10 communications = 100%
|
| 63 |
|
| 64 |
# Round scores
|
|
@@ -70,14 +70,14 @@ def calculate_scores(vendor_log):
|
|
| 70 |
}
|
| 71 |
return scores
|
| 72 |
except Exception as e:
|
| 73 |
-
logger.error(f"Error calculating scores for Vendor Log {vendor_log
|
| 74 |
raise
|
| 75 |
|
| 76 |
def generate_pdf(vendor_log, scores):
|
| 77 |
"""Generate a PDF report for the vendor."""
|
| 78 |
try:
|
| 79 |
-
vendor_id = vendor_log['Vendor__r']['Name']
|
| 80 |
-
vendor_name = vendor_log['Vendor__r']['Vendor_Name__c']
|
| 81 |
filename = f'report_{vendor_id}_{datetime.now().strftime("%Y%m%d_%H%M%S")}.pdf'
|
| 82 |
c = canvas.Canvas(filename, pagesize=letter)
|
| 83 |
c.setFont('Helvetica', 12)
|
|
@@ -102,7 +102,7 @@ def generate_pdf(vendor_log, scores):
|
|
| 102 |
|
| 103 |
return pdf_base64
|
| 104 |
except Exception as e:
|
| 105 |
-
logger.error(f"Error generating PDF for Vendor Log {vendor_log
|
| 106 |
raise
|
| 107 |
|
| 108 |
def fetch_and_process_logs():
|
|
@@ -127,6 +127,7 @@ def fetch_and_process_logs():
|
|
| 127 |
query = query.replace(':currentMonth', str(current_month)).replace(':currentYear', str(current_year))
|
| 128 |
result = sf.query(query)
|
| 129 |
vendor_logs = result['records']
|
|
|
|
| 130 |
|
| 131 |
subcontractor_scores = []
|
| 132 |
for log in vendor_logs:
|
|
@@ -168,7 +169,7 @@ def fetch_and_process_logs():
|
|
| 168 |
'scores': scores,
|
| 169 |
'pdf_link': pdf_link
|
| 170 |
})
|
| 171 |
-
logger.info(f"Processed {len(vendor_logs)} vendor logs.")
|
| 172 |
except Exception as e:
|
| 173 |
logger.error(f"Error processing vendor logs: {str(e)}")
|
| 174 |
raise
|
|
|
|
| 41 |
"""Calculate scores based on Vendor Log data."""
|
| 42 |
try:
|
| 43 |
# Timeliness Score: Based on Delay Days
|
| 44 |
+
delay_days = vendor_log['Delay_Days__c'] if vendor_log['Delay_Days__c'] is not None else 0
|
| 45 |
timeliness_score = 100.0 if delay_days <= 0 else 80.0 if delay_days <= 3 else 60.0 if delay_days <= 7 else 40.0
|
| 46 |
|
| 47 |
# Quality Score: Direct mapping from Quality Percentage
|
| 48 |
+
quality_score = float(vendor_log['Quality_Percentage__c']) if vendor_log['Quality_Percentage__c'] is not None else 0.0
|
| 49 |
|
| 50 |
# Safety Score: Based on Incident Severity
|
| 51 |
+
incident_severity = vendor_log['Incident_Severity__c'] if vendor_log['Incident_Severity__c'] is not None else 'None'
|
| 52 |
safety_score = {
|
| 53 |
'None': 100.0,
|
| 54 |
'Low': 80.0,
|
|
|
|
| 58 |
}.get(incident_severity, 100.0)
|
| 59 |
|
| 60 |
# Communication Score: Based on Communication Count (scale 0-100)
|
| 61 |
+
comm_count = vendor_log['Communication_Count__c'] if vendor_log['Communication_Count__c'] is not None else 0
|
| 62 |
communication_score = min(100.0, comm_count * 10.0) # 10 communications = 100%
|
| 63 |
|
| 64 |
# Round scores
|
|
|
|
| 70 |
}
|
| 71 |
return scores
|
| 72 |
except Exception as e:
|
| 73 |
+
logger.error(f"Error calculating scores for Vendor Log {vendor_log.get('Vendor_Log_ID__c', 'Unknown')}: {str(e)}")
|
| 74 |
raise
|
| 75 |
|
| 76 |
def generate_pdf(vendor_log, scores):
|
| 77 |
"""Generate a PDF report for the vendor."""
|
| 78 |
try:
|
| 79 |
+
vendor_id = vendor_log['Vendor__r']['Name'] if vendor_log['Vendor__r'] and vendor_log['Vendor__r']['Name'] else 'Unknown'
|
| 80 |
+
vendor_name = vendor_log['Vendor__r']['Vendor_Name__c'] if vendor_log['Vendor__r'] and vendor_log['Vendor__r']['Vendor_Name__c'] else 'Unknown'
|
| 81 |
filename = f'report_{vendor_id}_{datetime.now().strftime("%Y%m%d_%H%M%S")}.pdf'
|
| 82 |
c = canvas.Canvas(filename, pagesize=letter)
|
| 83 |
c.setFont('Helvetica', 12)
|
|
|
|
| 102 |
|
| 103 |
return pdf_base64
|
| 104 |
except Exception as e:
|
| 105 |
+
logger.error(f"Error generating PDF for Vendor Log {vendor_log.get('Vendor_Log_ID__c', 'Unknown')}: {str(e)}")
|
| 106 |
raise
|
| 107 |
|
| 108 |
def fetch_and_process_logs():
|
|
|
|
| 127 |
query = query.replace(':currentMonth', str(current_month)).replace(':currentYear', str(current_year))
|
| 128 |
result = sf.query(query)
|
| 129 |
vendor_logs = result['records']
|
| 130 |
+
logger.info(f"Fetched {len(vendor_logs)} Vendor Log records for {current_month}-{current_year}")
|
| 131 |
|
| 132 |
subcontractor_scores = []
|
| 133 |
for log in vendor_logs:
|
|
|
|
| 169 |
'scores': scores,
|
| 170 |
'pdf_link': pdf_link
|
| 171 |
})
|
| 172 |
+
logger.info(f"Processed {len(vendor_logs)} vendor logs and created {len(subcontractor_scores)} score records.")
|
| 173 |
except Exception as e:
|
| 174 |
logger.error(f"Error processing vendor logs: {str(e)}")
|
| 175 |
raise
|