From f7e97f55e90d5fae2d9e0e17829bf982736f645e Mon Sep 17 00:00:00 2001 From: "r.mubarakzyanov" Date: Tue, 26 May 2026 20:11:55 +0300 Subject: [PATCH] bulk operations for dpi --- .../ajax/employee_profile/save_bulk_ppe.php | 86 ++++++++ public/userarea/employees.php | 185 ++++++++++++++++++ 2 files changed, 271 insertions(+) create mode 100644 public/userarea/ajax/employee_profile/save_bulk_ppe.php diff --git a/public/userarea/ajax/employee_profile/save_bulk_ppe.php b/public/userarea/ajax/employee_profile/save_bulk_ppe.php new file mode 100644 index 0000000..044e1a2 --- /dev/null +++ b/public/userarea/ajax/employee_profile/save_bulk_ppe.php @@ -0,0 +1,86 @@ + false, 'message' => 'Metodo non consentito.']); + exit; +} + +// $pdo and $currentUserId from hr_auth_check.php + +$itemName = trim($_POST['item_name'] ?? ''); +$deliveryDate = trim($_POST['delivery_date'] ?? ''); +$deliveredBy = trim($_POST['delivered_by'] ?? ''); +$notes = trim($_POST['notes'] ?? ''); +$employeeIds = $_POST['employee_ids'] ?? []; + +if (!is_array($employeeIds)) { + $employeeIds = []; +} +$employeeIds = array_values(array_unique(array_filter(array_map('intval', $employeeIds), fn($v) => $v > 0))); + +if ($itemName === '') { + echo json_encode(['success' => false, 'message' => 'Il nome del DPI è obbligatorio.']); + exit; +} +if ($deliveryDate !== '' && !DateTime::createFromFormat('Y-m-d', $deliveryDate)) { + echo json_encode(['success' => false, 'message' => 'Data di consegna non valida.']); + exit; +} +if (empty($employeeIds)) { + echo json_encode(['success' => false, 'message' => 'Selezionare almeno un dipendente.']); + exit; +} + +$deliveryDate = $deliveryDate === '' ? null : $deliveryDate; +$deliveredBy = $deliveredBy !== '' ? $deliveredBy : null; +$notes = $notes !== '' ? $notes : null; + +try { + $pdo->beginTransaction(); + + // Only insert for employees that actually exist + $checkEmp = $pdo->prepare("SELECT id FROM employees WHERE id = :id"); + + $ins = $pdo->prepare(" + INSERT INTO employee_ppe + (employee_id, item_name, delivery_date, delivered_by, notes, created_by, created_at, updated_at) + VALUES + (:employee_id, :item_name, :delivery_date, :delivered_by, :notes, :created_by, NOW(), NOW()) + "); + + $created = 0; + foreach ($employeeIds as $eid) { + $checkEmp->execute(['id' => $eid]); + if (!$checkEmp->fetchColumn()) { + continue; + } + $ins->execute([ + 'employee_id' => $eid, + 'item_name' => $itemName, + 'delivery_date' => $deliveryDate, + 'delivered_by' => $deliveredBy, + 'notes' => $notes, + 'created_by' => $currentUserId, + ]); + $created++; + } + + $pdo->commit(); + echo json_encode([ + 'success' => true, + 'created' => $created, + 'message' => 'DPI assegnato a ' . $created . ' dipendent' . ($created === 1 ? 'e' : 'i') . '.', + ]); +} catch (Exception $e) { + if ($pdo->inTransaction()) $pdo->rollBack(); + echo json_encode(['success' => false, 'message' => $e->getMessage()]); +} diff --git a/public/userarea/employees.php b/public/userarea/employees.php index c80c278..d4506c7 100644 --- a/public/userarea/employees.php +++ b/public/userarea/employees.php @@ -260,6 +260,13 @@ $sql = " $stmtEmployees = $pdo->query($sql); $employees = $stmtEmployees->fetchAll(PDO::FETCH_ASSOC); +// Employees for the bulk-DPI multiselect (alphabetical, with department for the "whole department" shortcut) +$employeesForSelect = $pdo->query(" + SELECT id, first_name, last_name, employee_code, department_id + FROM employees + ORDER BY last_name, first_name +")->fetchAll(PDO::FETCH_ASSOC); + // Job roles for the dropdown $jobRoles = $pdo->query(" SELECT id, name FROM job_roles WHERE is_active = 1 ORDER BY sort_order, name @@ -463,6 +470,9 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC); + @@ -854,6 +864,75 @@ $allSkills = $stmtSkills->fetchAll(PDO::FETCH_ASSOC); + + +