Feb25 2026: fixed displaying employee name with extra work correctly in TA web and exported file

This commit is contained in:
2026-02-25 11:58:03 -05:00
parent 08960f29a7
commit 56630658c6
2 changed files with 45 additions and 4 deletions
+41
View File
@@ -9186,12 +9186,25 @@ def export_time_attendance_excel(records, project_name_for_filename, date_range_
) )
# Get employee names - map BASE employee IDs to names for consolidated display # Get employee names - map BASE employee IDs to names for consolidated display
# Look up from Employee table using the numeric base_id to get the correct name,
# regardless of what is stored in the employee_name column (which may contain
# work type characters such as 'Employee 3937SP' if imported with a decorated ID).
from working_hours_calculator import parse_employee_id_for_work_type from working_hours_calculator import parse_employee_id_for_work_type
employee_names = {} employee_names = {}
for record in records: for record in records:
base_id, _ = parse_employee_id_for_work_type(str(record.employee_id)) base_id, _ = parse_employee_id_for_work_type(str(record.employee_id))
if base_id not in employee_names: if base_id not in employee_names:
try:
emp = Employee.query.filter_by(id=int(base_id)).first()
if emp:
employee_names[base_id] = f"{emp.lastName}, {emp.firstName}"
else:
# Fallback: use stored name if Employee table lookup fails
employee_names[base_id] = record.employee_name employee_names[base_id] = record.employee_name
logger_handler.logger.warning(f"Employee ID {base_id} not found in employee table during export; using stored name.")
except Exception as e:
employee_names[base_id] = record.employee_name
logger_handler.logger.warning(f"Could not lookup employee name for ID {base_id} during export: {e}")
# Setup styles # Setup styles
# White bold text on black background for column header row (no border) # White bold text on black background for column header row (no border)
@@ -10001,11 +10014,24 @@ def export_time_attendance_by_building_excel(records, project_name_for_filename,
) )
# Get employee names map # Get employee names map
# Look up from Employee table using the numeric base_id to get the correct name,
# regardless of what is stored in the employee_name column (which may contain
# work type characters such as 'Employee 3937SP' if imported with a decorated ID).
employee_names = {} employee_names = {}
for record in records: for record in records:
base_id, _ = parse_employee_id_for_work_type(str(record.employee_id)) base_id, _ = parse_employee_id_for_work_type(str(record.employee_id))
if base_id not in employee_names: if base_id not in employee_names:
try:
emp = Employee.query.filter_by(id=int(base_id)).first()
if emp:
employee_names[base_id] = f"{emp.lastName}, {emp.firstName}"
else:
# Fallback: use stored name if Employee table lookup fails
employee_names[base_id] = record.employee_name employee_names[base_id] = record.employee_name
logger_handler.logger.warning(f"Employee ID {base_id} not found in employee table during export (by-building); using stored name.")
except Exception as e:
employee_names[base_id] = record.employee_name
logger_handler.logger.warning(f"Could not lookup employee name for ID {base_id} during export (by-building): {e}")
# Setup styles # Setup styles
header_font = Font(name='Arial', size=11, bold=True, color='FFFFFF') header_font = Font(name='Arial', size=11, bold=True, color='FFFFFF')
@@ -10475,6 +10501,21 @@ def time_attendance_records():
record.qr_address = None record.qr_address = None
record.location_accuracy = None record.location_accuracy = None
# Resolve employee name by stripping work type prefix/suffix (SP, PW, PT)
# from employee_id ONLY for the lookup. The original employee_id is kept intact.
# e.g. '3937SP', 'SP3937', 'PW3937' -> lookup by numeric '3937'
try:
import re as _re
numeric_only = _re.search(r'\d+', str(record.employee_id or ''))
if numeric_only:
emp = Employee.query.filter_by(id=int(numeric_only.group(0))).first()
record.resolved_employee_name = f"{emp.lastName}, {emp.firstName}" if emp else record.employee_name
else:
record.resolved_employee_name = record.employee_name
except Exception as e:
logger_handler.logger.warning(f"Could not resolve employee name for ID {record.employee_id}: {e}")
record.resolved_employee_name = record.employee_name
# Get unique employees and locations for filters # Get unique employees and locations for filters
unique_employees = TimeAttendance.get_unique_employees() unique_employees = TimeAttendance.get_unique_employees()
unique_locations = TimeAttendance.get_unique_locations() unique_locations = TimeAttendance.get_unique_locations()
+2 -2
View File
@@ -164,7 +164,7 @@
<!-- 2. Name --> <!-- 2. Name -->
<td> <td>
<div class="employee-name-cell"> <div class="employee-name-cell">
<span>{{ record.employee_name }}</span> <span>{{ record.resolved_employee_name }}</span>
</div> </div>
</td> </td>
@@ -231,7 +231,7 @@
</a> </a>
{% if session.role == 'admin' %} {% if session.role == 'admin' %}
<button class="action-btn delete" <button class="action-btn delete"
onclick="confirmDelete({{ record.id }}, '{{ record.employee_name }}', '{{ record.attendance_date }}')"> onclick="confirmDelete({{ record.id }}, '{{ record.resolved_employee_name }}', '{{ record.attendance_date }}')">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
Delete Delete
</button> </button>