diff --git a/app.py b/app.py index a7d7bce..34b76d8 100644 --- a/app.py +++ b/app.py @@ -5879,10 +5879,15 @@ def edit_employee(employee_index): @admin_required @log_database_operations('employee_deletion') def delete_employee(employee_index): - """Delete employee (Admin only)""" + """Delete employee (Admin only) - Enhanced with better logging""" try: + print(f"🗑️ DELETE REQUEST: Employee index {employee_index}") + print(f"📋 Request method: {request.method}") + print(f"👤 User: {session.get('username', 'Unknown')}") + # Get employee by index (primary key) employee = Employee.query.get_or_404(employee_index) + print(f"✅ Found employee: {employee.firstName} {employee.lastName} (ID: {employee.id})") # Store employee data for logging before deletion employee_data = { @@ -5897,28 +5902,42 @@ def delete_employee(employee_index): # Check if employee has attendance records from models.attendance import AttendanceData attendance_count = AttendanceData.query.filter_by(employee_id=str(employee.id)).count() + print(f"📊 Attendance records found: {attendance_count}") if attendance_count > 0: - flash(f'Cannot delete employee "{employee.full_name}". Employee has {attendance_count} attendance records. Please contact system administrator.', 'error') + error_msg = f'Cannot delete employee "{employee.full_name}". Employee has {attendance_count} attendance records. Please contact system administrator.' + print(f"❌ DELETION BLOCKED: {error_msg}") + flash(error_msg, 'error') return redirect(url_for('employees')) + # Proceed with deletion + print(f"🗑️ Proceeding with deletion of employee: {employee_data['firstName']} {employee_data['lastName']}") + db.session.delete(employee) db.session.commit() + print("✅ Employee successfully deleted from database") # Log employee deletion try: logger_handler.logger.info(f"Admin user {session['username']} deleted employee: {employee_data['firstName']} {employee_data['lastName']} (ID: {employee_data['id']})") + print(f"📋 Deletion logged successfully") except Exception as log_error: print(f"⚠️ Logging error (non-critical): {log_error}") - flash(f'Employee "{employee_data["firstName"]} {employee_data["lastName"]}" deleted successfully.', 'success') + success_msg = f'Employee "{employee_data["firstName"]} {employee_data["lastName"]}" deleted successfully.' + flash(success_msg, 'success') + print(f"✅ SUCCESS: {success_msg}") + + return redirect(url_for('employees')) except Exception as e: db.session.rollback() logger_handler.log_database_error('employee_deletion', e) - flash('Error deleting employee. Please try again.', 'error') - - return redirect(url_for('employees')) + error_msg = f'Error deleting employee. Please try again.' + print(f"❌ ERROR in delete_employee: {e}") + print(f"❌ Exception type: {type(e)}") + flash(error_msg, 'error') + return redirect(url_for('employees')) @app.route('/api/employees/search') @login_required diff --git a/static/css/employees.css b/static/css/employees.css index 017af86..2a2a2e7 100644 --- a/static/css/employees.css +++ b/static/css/employees.css @@ -709,4 +709,115 @@ mark { .modal-footer { flex-direction: column; } -} \ No newline at end of file +} + +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.6); + z-index: 9999; + display: none; + justify-content: center; + align-items: center; + opacity: 0; + transition: opacity 0.3s ease-in-out; +} + +.modal.show { + opacity: 1; +} + +.modal-content { + background: #ffffff; + border-radius: 0.75rem; + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), + 0 10px 10px -5px rgba(0, 0, 0, 0.04); + max-width: 500px; + width: 90%; + max-height: 90vh; + overflow-y: auto; + transform: translateY(-20px); + transition: transform 0.3s ease-in-out; +} + +.modal.show .modal-content { + transform: translateY(0); +} + +.modal-header { + padding: 1.5rem 1.5rem 1rem; + border-bottom: 1px solid #e5e7eb; + display: flex; + justify-content: space-between; + align-items: center; +} + +.modal-header h3 { + margin: 0; + color: #dc2626; + font-size: 1.25rem; + font-weight: 600; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.modal-body { + padding: 1.5rem; +} + +.modal-footer { + padding: 1rem 1.5rem; + border-top: 1px solid #e5e7eb; + display: flex; + justify-content: flex-end; + gap: 0.75rem; +} + +.close-modal { + background: none; + border: none; + color: #6b7280; + cursor: pointer; + padding: 0.25rem; + border-radius: 0.375rem; + transition: all 0.2s ease-in-out; +} + +.close-modal:hover { + color: #374151; + background: #f3f4f6; +} + +.warning-text { + color: #dc2626; + font-size: 0.875rem; + margin-top: 0.75rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +/* Enhanced button styles for better interaction feedback */ +.btn-danger:hover { + background-color: #b91c1c; + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(220, 38, 38, 0.3); +} + +.delete-btn:hover { + background-color: #b91c1c !important; + transform: translateY(-1px); + box-shadow: 0 4px 8px rgba(220, 38, 38, 0.3); +} + +/* Loading state for delete button */ +.btn-danger:disabled { + background-color: #9ca3af; + cursor: not-allowed; + transform: none; + box-shadow: none; +} diff --git a/templates/employees.html b/templates/employees.html index 47fac99..987b98b 100644 --- a/templates/employees.html +++ b/templates/employees.html @@ -1,13 +1,11 @@ -{% extends "base_authenticated.html" %} -{% set page_title = "Employee Management" %} - -{% block title %}{{ page_title }}{% endblock %} - -{% block extra_head %} - -{% endblock %} - -{% block content %} +{% extends "base_authenticated.html" %} {% set page_title = "Employee +Management" %} {% block title %}{{ page_title }}{% endblock %} {% block +extra_head %} + +{% endblock %} {% block content %}
Manage employee records and view attendance statistics
Total Employees