added depart,ments to employee and deadlines

This commit is contained in:
Claudio 2026-05-07 09:44:38 +02:00
parent 5728afa788
commit ac942dcdc8
2 changed files with 103 additions and 28 deletions

View File

@ -21,7 +21,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$employee_code = trim($_POST['employee_code'] ?? '');
$first_name = trim($_POST['first_name'] ?? '');
$last_name = trim($_POST['last_name'] ?? '');
$department = trim($_POST['department'] ?? '');
$department_id = $_POST['department_id'] !== '' ? (int)$_POST['department_id'] : null;
$position = trim($_POST['position'] ?? '');
$hire_date = trim($_POST['hire_date'] ?? '');
$status = trim($_POST['status'] ?? 'active');
@ -40,16 +40,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
}
$sql = "INSERT INTO employees
(auth_user_id, employee_code, first_name, last_name, department, position, hire_date, status, created_at, updated_at)
VALUES
(:auth_user_id, :employee_code, :first_name, :last_name, :department, :position, :hire_date, :status, NOW(), NOW())";
(auth_user_id, employee_code, first_name, last_name, department_id, position, hire_date, status, created_at, updated_at)
VALUES
(:auth_user_id, :employee_code, :first_name, :last_name, :department_id, :position, :hire_date, :status, NOW(), NOW())";
$stmt = $pdo->prepare($sql);
$stmt->execute([
'auth_user_id' => $auth_user_id,
'employee_code' => $employee_code !== '' ? $employee_code : null,
'first_name' => $first_name,
'last_name' => $last_name,
'department' => $department !== '' ? $department : null,
'department_id' => $department_id,
'position' => $position !== '' ? $position : null,
'hire_date' => $hire_date !== '' ? $hire_date : null,
'status' => $status
@ -65,7 +65,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$employee_code = trim($_POST['employee_code'] ?? '');
$first_name = trim($_POST['first_name'] ?? '');
$last_name = trim($_POST['last_name'] ?? '');
$department = trim($_POST['department'] ?? '');
$department_id = $_POST['department_id'] !== '' ? (int)$_POST['department_id'] : null;
$position = trim($_POST['position'] ?? '');
$hire_date = trim($_POST['hire_date'] ?? '');
$status = trim($_POST['status'] ?? 'active');
@ -93,7 +93,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
employee_code = :employee_code,
first_name = :first_name,
last_name = :last_name,
department = :department,
department_id = :department_id,
position = :position,
hire_date = :hire_date,
status = :status,
@ -105,7 +105,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
'employee_code' => $employee_code !== '' ? $employee_code : null,
'first_name' => $first_name,
'last_name' => $last_name,
'department' => $department !== '' ? $department : null,
'department_id' => $department_id,
'position' => $position !== '' ? $position : null,
'hire_date' => $hire_date !== '' ? $hire_date : null,
'status' => $status,
@ -193,9 +193,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
// Employees list
$sql = "
SELECT e.*,
d.name AS department_name,
d.color AS department_color,
au.email AS user_email,
CONCAT(COALESCE(au.first_name, ''), ' ', COALESCE(au.last_name, '')) AS user_fullname
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id
LEFT JOIN auth_users au ON e.auth_user_id = au.id
ORDER BY e.id DESC
";
@ -219,6 +222,16 @@ $sqlUsers = "
$stmtUsers = $pdo->query($sqlUsers);
$users = $stmtUsers->fetchAll(PDO::FETCH_ASSOC);
// Departments list for select
$sqlDepartments = "
SELECT id, name, code, color
FROM departments
WHERE is_active = 1
ORDER BY sort_order ASC, name ASC
";
$stmtDepartments = $pdo->query($sqlDepartments);
$departments = $stmtDepartments->fetchAll(PDO::FETCH_ASSOC);
// Skills list for JS
$sqlSkills = "
SELECT s.id, s.name, pl.name as line_name, pl.line_number
@ -347,6 +360,15 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
background-color: #157347;
transform: scale(1.02);
}
.department-badge {
display: inline-block;
color: #fff;
padding: 0.25rem 0.6rem;
border-radius: 999px;
font-size: 0.8rem;
font-weight: 600;
}
</style>
</head>
@ -421,7 +443,15 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
<td><?= (int)$row['id'] ?></td>
<td><?= htmlspecialchars($row['employee_code'] ?? '') ?></td>
<td><?= htmlspecialchars($fullName) ?></td>
<td><?= htmlspecialchars($row['department'] ?? '') ?></td>
<td>
<?php if (!empty($row['department_name'])): ?>
<span class="department-badge" style="background-color: <?= htmlspecialchars($row['department_color'] ?? '#6c757d', ENT_QUOTES) ?>;">
<?= htmlspecialchars($row['department_name']) ?>
</span>
<?php else: ?>
-
<?php endif; ?>
</td>
<td><?= htmlspecialchars($row['position'] ?? '') ?></td>
<td><?= $hireDate ?></td>
<td>
@ -437,7 +467,7 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
data-code="<?= htmlspecialchars($row['employee_code'] ?? '', ENT_QUOTES) ?>"
data-first_name="<?= htmlspecialchars($row['first_name'] ?? '', ENT_QUOTES) ?>"
data-last_name="<?= htmlspecialchars($row['last_name'] ?? '', ENT_QUOTES) ?>"
data-department="<?= htmlspecialchars($row['department'] ?? '', ENT_QUOTES) ?>"
data-department_id="<?= $row['department_id'] !== null ? (int)$row['department_id'] : '' ?>"
data-position="<?= htmlspecialchars($row['position'] ?? '', ENT_QUOTES) ?>"
data-hire_date="<?= htmlspecialchars($row['hire_date'] ?? '', ENT_QUOTES) ?>"
data-status="<?= htmlspecialchars($status, ENT_QUOTES) ?>"
@ -477,7 +507,7 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
<!-- MODALE AGGIUNTA DIPENDENTE -->
<div class="modal fade" id="addEmployeeModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header" style="background-color:#cfe3ff;">
<h5 class="modal-title">Aggiungi Nuovo Dipendente</h5>
@ -505,7 +535,15 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label fw-semibold">Department</label>
<input type="text" class="form-control" id="addDepartment" name="department" placeholder="e.g. Production">
<select class="form-select" id="addDepartmentId" name="department_id" style="width:100%;">
<option value="">-- Select Department --</option>
<?php foreach ($departments as $d): ?>
<option value="<?= (int)$d['id'] ?>">
<?= htmlspecialchars($d['name']) ?>
<?= !empty($d['code']) ? ' (' . htmlspecialchars($d['code']) . ')' : '' ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label fw-semibold">Position</label>
@ -552,7 +590,7 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
<!-- MODALE EDIT DIPENDENTE -->
<div class="modal fade" id="editEmployeeModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header" style="background-color:#cfe3ff;">
<h5 class="modal-title">Modifica Dipendente</h5>
@ -582,7 +620,15 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label fw-semibold">Department</label>
<input type="text" class="form-control" id="editDepartment" name="department">
<select class="form-select" id="editDepartmentId" name="department_id" style="width:100%;">
<option value="">-- Select Department --</option>
<?php foreach ($departments as $d): ?>
<option value="<?= (int)$d['id'] ?>">
<?= htmlspecialchars($d['name']) ?>
<?= !empty($d['code']) ? ' (' . htmlspecialchars($d['code']) . ')' : '' ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label fw-semibold">Position</label>
@ -669,7 +715,7 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
// Select2 on user selects
$('#addAuthUserId, #editAuthUserId').select2({
$('#addAuthUserId, #editAuthUserId, #addDepartmentId, #editDepartmentId').select2({
theme: 'bootstrap-5',
width: '100%'
});
@ -684,7 +730,7 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
payload.append('employee_code', $("#addEmployeeCode").val().trim());
payload.append('first_name', $("#addFirstName").val().trim());
payload.append('last_name', $("#addLastName").val().trim());
payload.append('department', $("#addDepartment").val().trim());
payload.append('department_id', $("#addDepartmentId").val() || '');
payload.append('position', $("#addPosition").val().trim());
payload.append('hire_date', $("#addHireDate").val());
payload.append('status', $("#addStatus").val());
@ -732,7 +778,7 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
$("#editEmployeeCode").val(btn.data("code"));
$("#editFirstName").val(btn.data("first_name"));
$("#editLastName").val(btn.data("last_name"));
$("#editDepartment").val(btn.data("department"));
$("#editDepartmentId").val(btn.data("department_id") ? String(btn.data("department_id")) : '').trigger('change');
$("#editPosition").val(btn.data("position"));
$("#editHireDate").val(btn.data("hire_date"));
$("#editStatus").val(btn.data("status"));
@ -754,7 +800,7 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC);
payload.append('employee_code', $("#editEmployeeCode").val().trim());
payload.append('first_name', $("#editFirstName").val().trim());
payload.append('last_name', $("#editLastName").val().trim());
payload.append('department', $("#editDepartment").val().trim());
payload.append('department_id', $("#editDepartmentId").val() || '');
payload.append('position', $("#editPosition").val().trim());
payload.append('hire_date', $("#editHireDate").val());
payload.append('status', $("#editStatus").val());

View File

@ -19,7 +19,13 @@ if ($filterSubjectId) {
$filterMy = !empty($_GET['filter_my']);
$filterMyEmployee = null;
if ($filterMy) {
$st = $pdo->prepare("SELECT id, department FROM employees WHERE auth_user_id = ? LIMIT 1");
$st = $pdo->prepare("
SELECT e.id, dep.name AS department_name
FROM employees e
LEFT JOIN departments dep ON dep.id = e.department_id
WHERE e.auth_user_id = ?
LIMIT 1
");
$st->execute([(int)$iduserlogin]);
$filterMyEmployee = $st->fetch(PDO::FETCH_ASSOC) ?: null;
if (!$filterMyEmployee) {
@ -32,13 +38,14 @@ $sql = "
s.name AS subject_name,
s.color AS subject_color,
GROUP_CONCAT(DISTINCT CONCAT(e.first_name, ' ', e.last_name) ORDER BY e.first_name SEPARATOR ', ') as responsabili,
GROUP_CONCAT(DISTINCT e.department ORDER BY e.department SEPARATOR ', ') as reparti_persone,
GROUP_CONCAT(DISTINCT dep.name ORDER BY dep.name SEPARATOR ', ') as reparti_persone,
d.departments as reparti_assegnati,
(SELECT COUNT(*) FROM scad_deadline_attachments att WHERE att.deadline_id = d.id) as attachment_count
FROM scad_deadlines d
LEFT JOIN scad_subjects s ON s.id = d.subject_id
LEFT JOIN scad_deadline_employee de ON de.deadline_id = d.id
LEFT JOIN employees e ON e.id = de.employee_id
LEFT JOIN departments dep ON dep.id = e.department_id
";
$where = [];
$params = [];
@ -50,8 +57,8 @@ if ($filterMy && $filterMyEmployee) {
$where[] = "(d.id IN (SELECT deadline_id FROM scad_deadline_employee WHERE employee_id = ?)"
. " OR (? <> '' AND FIND_IN_SET(?, REPLACE(d.departments, ', ', ',')) > 0))";
$params[] = (int)$filterMyEmployee['id'];
$params[] = (string)($filterMyEmployee['department'] ?? '');
$params[] = (string)($filterMyEmployee['department'] ?? '');
$params[] = (string)($filterMyEmployee['department_name'] ?? '');
$params[] = (string)($filterMyEmployee['department_name'] ?? '');
}
if (!empty($where)) {
$sql .= " WHERE " . implode(' AND ', $where);
@ -62,9 +69,25 @@ $stmt = $pdo->prepare($sql);
$stmt->execute($params);
$deadlines = $stmt->fetchAll(PDO::FETCH_ASSOC);
$employees = $pdo->query("SELECT id, first_name, last_name, department FROM employees WHERE status = 'active' ORDER BY first_name")->fetchAll(PDO::FETCH_ASSOC);
$employees = $pdo->query("
SELECT
e.id,
e.first_name,
e.last_name,
e.department_id,
dep.name AS department_name
FROM employees e
LEFT JOIN departments dep ON dep.id = e.department_id
WHERE e.status = 'active'
ORDER BY e.first_name, e.last_name
")->fetchAll(PDO::FETCH_ASSOC);
$departments = $pdo->query("SELECT DISTINCT department FROM employees WHERE department IS NOT NULL AND department != '' ORDER BY department")->fetchAll(PDO::FETCH_COLUMN);
$departments = $pdo->query("
SELECT id, name, code, color
FROM departments
WHERE is_active = 1
ORDER BY sort_order ASC, name ASC
")->fetchAll(PDO::FETCH_ASSOC);
$subjects = $pdo->query("SELECT id, name, color FROM scad_subjects ORDER BY name")->fetchAll(PDO::FETCH_ASSOC);
@ -678,7 +701,7 @@ function getContrastTextColor($hexColor)
<div>
<i class="fa-solid fa-user-check me-2"></i>
<strong>Le mie scadenze</strong>
<span class="text-muted ms-2">(assegnate a me o al reparto <?= htmlspecialchars($filterMyEmployee['department'] ?? '—', ENT_QUOTES, 'UTF-8') ?>)</span>
<span class="text-muted ms-2">(assegnate a me o al reparto <?= htmlspecialchars($filterMyEmployee['department_name'] ?? '—', ENT_QUOTES, 'UTF-8') ?>)</span>
</div>
<a href="scadenzario/index.php" class="btn btn-sm btn-light border">
<i class="fa-solid fa-xmark me-1"></i> Tutte le scadenze
@ -755,7 +778,10 @@ function getContrastTextColor($hexColor)
<select id="filterDepartment" class="form-select">
<option value="">Tutti</option>
<?php foreach ($departments as $dept): ?>
<option value="<?= htmlspecialchars($dept, ENT_QUOTES, 'UTF-8') ?>"><?= htmlspecialchars($dept, ENT_QUOTES, 'UTF-8') ?></option>
<option value="<?= htmlspecialchars($dept['name'], ENT_QUOTES, 'UTF-8') ?>">
<?= htmlspecialchars($dept['name'], ENT_QUOTES, 'UTF-8') ?>
<?= !empty($dept['code']) ? ' (' . htmlspecialchars($dept['code'], ENT_QUOTES, 'UTF-8') . ')' : '' ?>
</option>
<?php endforeach; ?>
</select>
</div>
@ -1108,7 +1134,10 @@ function getContrastTextColor($hexColor)
<label for="dlDepartments" class="form-label fw-semibold">Reparti</label>
<select class="form-select" id="dlDepartments" name="department_names[]" multiple>
<?php foreach ($departments as $dept): ?>
<option value="<?= htmlspecialchars($dept, ENT_QUOTES, 'UTF-8') ?>"><?= htmlspecialchars($dept, ENT_QUOTES, 'UTF-8') ?></option>
<option value="<?= htmlspecialchars($dept['name'], ENT_QUOTES, 'UTF-8') ?>">
<?= htmlspecialchars($dept['name'], ENT_QUOTES, 'UTF-8') ?>
<?= !empty($dept['code']) ? ' (' . htmlspecialchars($dept['code'], ENT_QUOTES, 'UTF-8') . ')' : '' ?>
</option>
<?php endforeach; ?>
</select>
<div class="form-text">Tutto il reparto sarà responsabile</div>
@ -1118,7 +1147,7 @@ function getContrastTextColor($hexColor)
<select class="form-select" id="dlEmployees" name="employee_ids[]" multiple>
<?php foreach ($employees as $emp): ?>
<option value="<?= (int)$emp['id'] ?>">
<?= htmlspecialchars($emp['first_name'] . ' ' . $emp['last_name'], ENT_QUOTES, 'UTF-8') ?><?php if ($emp['department']): ?> (<?= htmlspecialchars($emp['department'], ENT_QUOTES, 'UTF-8') ?>)<?php endif; ?>
<?= htmlspecialchars($emp['first_name'] . ' ' . $emp['last_name'], ENT_QUOTES, 'UTF-8') ?><?php if (!empty($emp['department_name'])): ?> (<?= htmlspecialchars($emp['department_name'], ENT_QUOTES, 'UTF-8') ?>)<?php endif; ?>
</option>
<?php endforeach; ?>
</select>