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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file