Update time attendance export with Location Name including extra working hours (SP, PW, PT)

This commit is contained in:
2025-12-26 22:15:32 -05:00
parent a7e2a868f3
commit e1b65e3b5a
+34 -3
View File
@@ -8512,6 +8512,9 @@ def export_time_attendance_excel(records, project_name_for_filename, date_range_
else: else:
return None return None
# Import parse function at the beginning for work type detection
from working_hours_calculator import parse_employee_id_for_work_type
# Convert TimeAttendance records to format expected by calculator # Convert TimeAttendance records to format expected by calculator
converted_records = [] converted_records = []
for record in records: for record in records:
@@ -8525,12 +8528,24 @@ def export_time_attendance_excel(records, project_name_for_filename, date_range_
if 'out' in action_lower or 'checkout' in action_lower: if 'out' in action_lower or 'checkout' in action_lower:
record_type = 'check_out' record_type = 'check_out'
# Extract work type (PT, SP, PW) from employee_id for location display in Excel
_, work_type = parse_employee_id_for_work_type(str(record.employee_id))
# Create display location name with work type suffix if applicable
base_location_name = record.location_name
if work_type and work_type in ('PT', 'SP', 'PW'):
display_location_name = f"{base_location_name} ({work_type})"
else:
display_location_name = base_location_name
converted_record = type('Record', (), { converted_record = type('Record', (), {
'id': record.id, 'id': record.id,
'employee_id': str(record.employee_id), 'employee_id': str(record.employee_id),
'check_in_date': record.attendance_date, 'check_in_date': record.attendance_date,
'check_in_time': record.attendance_time, 'check_in_time': record.attendance_time,
'location_name': record.location_name, 'location_name': display_location_name, # Use display name with work type for Excel export
'original_location_name': base_location_name, # Keep original for internal grouping
'work_type': work_type, # Store work type for reference
'latitude': None, 'latitude': None,
'longitude': None, 'longitude': None,
'distance': distance_value, 'distance': distance_value,
@@ -8539,13 +8554,29 @@ def export_time_attendance_excel(records, project_name_for_filename, date_range_
'event_description': record.event_description or '', 'event_description': record.event_description or '',
'recorded_address': record.recorded_address or '', 'recorded_address': record.recorded_address or '',
'qr_code': type('QRCode', (), { 'qr_code': type('QRCode', (), {
'location': record.location_name, 'location': base_location_name, # Keep original for QR code matching
'location_address': record.recorded_address or '', 'location_address': record.recorded_address or '',
'project': None 'project': None
})() })()
})() })()
converted_records.append(converted_record) converted_records.append(converted_record)
# Log count of records with work types for audit trail
work_type_counts = {'PT': 0, 'SP': 0, 'PW': 0, 'Regular': 0}
for r in converted_records:
wt = getattr(r, 'work_type', None)
if wt in work_type_counts:
work_type_counts[wt] += 1
else:
work_type_counts['Regular'] += 1
if any(work_type_counts[wt] > 0 for wt in ['PT', 'SP', 'PW']):
logger_handler.logger.info(
f"Excel Export: Processing records with work types - "
f"Regular: {work_type_counts['Regular']}, PT: {work_type_counts['PT']}, "
f"SP: {work_type_counts['SP']}, PW: {work_type_counts['PW']}"
)
# Calculate working hours using SingleCheckInCalculator # Calculate working hours using SingleCheckInCalculator
calculator = WorkingHoursCalculator() calculator = WorkingHoursCalculator()
hours_data = calculator.calculate_all_employees_hours( hours_data = calculator.calculate_all_employees_hours(
@@ -9113,7 +9144,7 @@ def export_time_attendance_excel(records, project_name_for_filename, date_range_
# Write PT row if hours > 0 # Write PT row if hours > 0
if pt_hours > 0: if pt_hours > 0:
ws.cell(row=current_row, column=7, value='Part-Time (PT): ').font = Font(name='Arial', size=10, bold=True, italic=True) ws.cell(row=current_row, column=7, value='Project Team (PT): ').font = Font(name='Arial', size=10, bold=True, italic=True)
ws.cell(row=current_row, column=9, value=round(pt_hours, 2)).font = Font(name='Arial', size=10, bold=True, italic=True) ws.cell(row=current_row, column=9, value=round(pt_hours, 2)).font = Font(name='Arial', size=10, bold=True, italic=True)
# Log PT hours export # Log PT hours export
logger_handler.logger.info(f"Export: Employee {employee_id} PT hours: {pt_hours:.2f}") logger_handler.logger.info(f"Export: Employee {employee_id} PT hours: {pt_hours:.2f}")