feat(config): hard-delete employees instead of soft-deactivating
Updates DELETE /employees/<id> to nullify FK references, remove dependent rows (permissions/sessions), and delete the employee record. Owners remain protected.
This commit is contained in:
@@ -315,8 +315,9 @@ def update_employee(emp_id):
|
|||||||
@config_bp.route('/employees/<int:emp_id>', methods=['DELETE'])
|
@config_bp.route('/employees/<int:emp_id>', methods=['DELETE'])
|
||||||
@require_auth('config.edit')
|
@require_auth('config.edit')
|
||||||
def delete_employee(emp_id):
|
def delete_employee(emp_id):
|
||||||
"""Soft-delete (deactivate) an employee. Owners cannot be deleted via UI
|
"""Hard-delete an employee. Foreign-key references are nulled and
|
||||||
to prevent locking out the tenant; use direct DB access if really needed."""
|
dependent rows (permissions/sessions) are removed. Owners cannot be
|
||||||
|
deleted via UI to prevent locking out the tenant."""
|
||||||
conn = get_tenant_conn(g.tenant_id)
|
conn = get_tenant_conn(g.tenant_id)
|
||||||
cur = conn.cursor()
|
cur = conn.cursor()
|
||||||
|
|
||||||
@@ -330,15 +331,32 @@ def delete_employee(emp_id):
|
|||||||
cur.close(); conn.close()
|
cur.close(); conn.close()
|
||||||
return jsonify({'error': 'No se puede eliminar una cuenta de dueno'}), 403
|
return jsonify({'error': 'No se puede eliminar una cuenta de dueno'}), 403
|
||||||
|
|
||||||
cur.execute("UPDATE employees SET is_active = false WHERE id = %s", (emp_id,))
|
# Resolve every foreign-key column that points back to employees.
|
||||||
|
cur.execute("""
|
||||||
|
SELECT c.relname::text AS tbl, a.attname::text AS col
|
||||||
|
FROM pg_constraint con
|
||||||
|
JOIN pg_class c ON c.oid = con.conrelid
|
||||||
|
JOIN pg_attribute a ON a.attrelid = con.conrelid AND a.attnum = ANY(con.conkey)
|
||||||
|
WHERE con.confrelid = 'public.employees'::regclass
|
||||||
|
AND con.contype = 'f'
|
||||||
|
""")
|
||||||
|
refs = cur.fetchall()
|
||||||
|
|
||||||
|
for tbl, col in refs:
|
||||||
|
if tbl in ('employee_permissions', 'employee_sessions', 'notification_preferences'):
|
||||||
|
cur.execute(f"DELETE FROM \"{tbl}\" WHERE \"{col}\" = %s", (emp_id,))
|
||||||
|
else:
|
||||||
|
cur.execute(f"UPDATE \"{tbl}\" SET \"{col}\" = NULL WHERE \"{col}\" = %s", (emp_id,))
|
||||||
|
|
||||||
|
cur.execute("DELETE FROM employees WHERE id = %s", (emp_id,))
|
||||||
|
|
||||||
from services.audit import log_action
|
from services.audit import log_action
|
||||||
log_action(conn, 'EMPLOYEE_DEACTIVATE', 'employee', emp_id)
|
log_action(conn, 'EMPLOYEE_DELETE', 'employee', emp_id)
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
cur.close()
|
cur.close()
|
||||||
conn.close()
|
conn.close()
|
||||||
return jsonify({'ok': True, 'message': 'Employee deactivated'})
|
return jsonify({'ok': True, 'message': 'Empleado eliminado'})
|
||||||
|
|
||||||
|
|
||||||
@config_bp.route('/currency', methods=['GET'])
|
@config_bp.route('/currency', methods=['GET'])
|
||||||
|
|||||||
Reference in New Issue
Block a user