From 31f22b4d92941feaf5c1328651e6d7f7507286d8 Mon Sep 17 00:00:00 2001 From: solocla Date: Mon, 2 Feb 2026 17:25:47 +0100 Subject: [PATCH] matrix skills --- public/userarea/employees.php | 250 +++++++++++++++++++- public/userarea/skill_matrix.php | 393 +++++++++++++++++++++++++++++++ 2 files changed, 638 insertions(+), 5 deletions(-) create mode 100644 public/userarea/skill_matrix.php diff --git a/public/userarea/employees.php b/public/userarea/employees.php index a2f2307..1b15cea 100644 --- a/public/userarea/employees.php +++ b/public/userarea/employees.php @@ -8,7 +8,7 @@ $db = DBHandlerSelect::getInstance(); $pdo = $db->getConnection(); /* ========================================== - AJAX HANDLERS (ADD / EDIT / DELETE) + AJAX HANDLERS (ADD / EDIT / DELETE / SKILLS) ========================================== */ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['ajax'] == '1') { header('Content-Type: application/json'); @@ -17,6 +17,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj try { if ($action === 'add') { + // Codice originale per add $employee_code = trim($_POST['employee_code'] ?? ''); $first_name = trim($_POST['first_name'] ?? ''); $last_name = trim($_POST['last_name'] ?? ''); @@ -59,6 +60,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj } if ($action === 'edit') { + // Codice originale per edit $id = (int)($_POST['id'] ?? 0); $employee_code = trim($_POST['employee_code'] ?? ''); $first_name = trim($_POST['first_name'] ?? ''); @@ -115,6 +117,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj } if ($action === 'delete') { + // Codice originale per delete $id = (int)($_POST['id'] ?? 0); if ($id <= 0) { @@ -129,9 +132,52 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj exit; } + if ($action === 'get_employee_skills') { + $id = (int)$_POST['id']; + if ($id <= 0) { + echo json_encode(['success' => false, 'message' => 'Invalid ID']); + exit; + } + + $stmt = $pdo->prepare("SELECT skill_id, level FROM employee_skills WHERE employee_id = ?"); + $stmt->execute([$id]); + $skills = []; + while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { + $skills[$row['skill_id']] = $row['level']; + } + + echo json_encode(['success' => true, 'skills' => $skills]); + exit; + } + + if ($action === 'save_employee_skills') { + $id = (int)$_POST['id']; + $skills_json = $_POST['skills'] ?? ''; + $skills = json_decode($skills_json, true); + + if ($id <= 0 || !is_array($skills)) { + echo json_encode(['success' => false, 'message' => 'Invalid data']); + exit; + } + + $pdo->beginTransaction(); + $stmtDelete = $pdo->prepare("DELETE FROM employee_skills WHERE employee_id = ?"); + $stmtDelete->execute([$id]); + + $stmtInsert = $pdo->prepare("INSERT INTO employee_skills (employee_id, skill_id, level) VALUES (?, ?, ?)"); + foreach ($skills as $skill_id => $level) { + $stmtInsert->execute([$id, (int)$skill_id, $level]); + } + + $pdo->commit(); + echo json_encode(['success' => true]); + exit; + } + echo json_encode(['success' => false, 'message' => 'Unknown action.']); exit; } catch (Exception $e) { + if ($pdo->inTransaction()) $pdo->rollBack(); echo json_encode([ 'success' => false, 'message' => $e->getMessage() @@ -141,7 +187,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj } /* ========================================== - PAGE DATA (LIST + USERS LIST) + PAGE DATA (LIST + USERS LIST + SKILLS LIST) ========================================== */ // Employees list @@ -172,6 +218,16 @@ $sqlUsers = " "; $stmtUsers = $pdo->query($sqlUsers); $users = $stmtUsers->fetchAll(PDO::FETCH_ASSOC); + +// Skills list for JS +$sqlSkills = " + SELECT s.id, s.name, pl.name as line_name, pl.line_number + FROM skills s + LEFT JOIN production_lines pl ON s.production_line_id = pl.id + ORDER BY IFNULL(pl.line_number, 999), s.name +"; +$stmtSkills = $pdo->query($sqlSkills); +$allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC); ?> @@ -276,6 +332,21 @@ $users = $stmtUsers->fetchAll(PDO::FETCH_ASSOC); background-color: #fee2e2; color: #b91c1c; } + + .btn-matrix { + background-color: #198754; + color: #fff; + border-radius: 8px; + padding: 10px 20px; + font-weight: 500; + transition: all 0.2s ease-in-out; + margin-right: 10px; + } + + .btn-matrix:hover { + background-color: #157347; + transform: scale(1.02); + } @@ -297,9 +368,14 @@ $users = $stmtUsers->fetchAll(PDO::FETCH_ASSOC);
Elenco Completo
- +
+ + +
@@ -369,6 +445,13 @@ $users = $stmtUsers->fetchAll(PDO::FETCH_ASSOC); ✏️ Modifica + +
+ + + diff --git a/public/userarea/skill_matrix.php b/public/userarea/skill_matrix.php new file mode 100644 index 0000000..796d055 --- /dev/null +++ b/public/userarea/skill_matrix.php @@ -0,0 +1,393 @@ +getConnection(); + +// AJAX salvataggio singolo (ora gestisce anche testo libero) +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['ajax'] == '1') { + header('Content-Type: application/json'); + + if ($_POST['action'] === 'save_single_skill') { + $employee_id = (int)($_POST['employee_id'] ?? 0); + $skill_id = (int)($_POST['skill_id'] ?? 0); + $level = trim($_POST['level'] ?? ''); + + try { + $pdo->prepare("DELETE FROM employee_skills WHERE employee_id = ? AND skill_id = ?") + ->execute([$employee_id, $skill_id]); + + // Salva solo se c'è valore (non vuoto) + if ($level !== '') { + $pdo->prepare("INSERT INTO employee_skills (employee_id, skill_id, level) VALUES (?, ?, ?)") + ->execute([$employee_id, $skill_id, $level]); + } + + echo json_encode(['success' => true]); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => $e->getMessage()]); + } + exit; + } + + echo json_encode(['success' => false, 'message' => 'Azione non valida']); + exit; +} + +// DATI +$employees = $pdo->query(" + SELECT id, CONCAT(first_name, ' ', last_name) AS nome + FROM employees + ORDER BY id +")->fetchAll(PDO::FETCH_ASSOC); + +$skills = $pdo->query(" + SELECT + s.id, + s.name AS nome_completo, + COALESCE(s.abbreviato, SUBSTRING(s.name, 1, 12)) AS acronimo, + pl.line_number, + pl.name AS linea + FROM skills s + LEFT JOIN production_lines pl ON s.production_line_id = pl.id + ORDER BY s.ordinamento ASC, COALESCE(pl.line_number, 999), s.id +")->fetchAll(PDO::FETCH_ASSOC); + +$livelli = []; +$stmt = $pdo->query("SELECT employee_id, skill_id, level FROM employee_skills"); +while ($r = $stmt->fetch(PDO::FETCH_ASSOC)) { + $livelli[$r['employee_id']][$r['skill_id']] = $r['level']; +} +?> + + + + + + + + + Matrice Skills + + + + + + + + + + + + + +
+ + + +
+
+
+
+
Matrice Skills
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
DipendenteUHFBSFGerlach
+ +
+ + + + + + + +
+
+
+
+
+
+ + +
+ + + + + \ No newline at end of file