false, 'message' => 'Metodo non consentito.']); exit; } $pdo = DBHandlerSelect::getInstance()->getConnection(); $id = (int)($_POST['id'] ?? 0); $employeeId = (int)($_POST['employee_id'] ?? 0); $topicId = (int)($_POST['training_topic_id'] ?? 0); $completedDate = trim($_POST['completed_date'] ?? ''); $deliveredBy = trim($_POST['delivered_by'] ?? ''); $description = trim($_POST['description'] ?? ''); $trainingType = trim($_POST['training_type'] ?? 'initial'); $freqRaw = $_POST['update_frequency_months'] ?? ''; $remRaw = $_POST['reminder_days'] ?? ''; if ($employeeId <= 0) { echo json_encode(['success' => false, 'message' => 'ID dipendente non valido.']); exit; } if ($topicId <= 0) { echo json_encode(['success' => false, 'message' => 'Selezionare un corso.']); exit; } if ($completedDate === '') { echo json_encode(['success' => false, 'message' => 'La data di completamento รจ obbligatoria.']); exit; } if (!in_array($trainingType, ['initial', 'refresher'], true)) { $trainingType = 'initial'; } $topicStmt = $pdo->prepare("SELECT default_frequency_months, default_reminder_days FROM training_topics WHERE id = :id"); $topicStmt->execute(['id' => $topicId]); $topic = $topicStmt->fetch(PDO::FETCH_ASSOC); if (!$topic) { echo json_encode(['success' => false, 'message' => 'Corso non trovato.']); exit; } $freq = ($freqRaw === '' || $freqRaw === null) ? null : max(0, (int)$freqRaw); $rem = ($remRaw === '' || $remRaw === null) ? null : max(0, (int)$remRaw); /* Effective frequency for next_due_date: explicit override or topic default */ $effFreq = $freq !== null ? $freq : ($topic['default_frequency_months'] !== null ? (int)$topic['default_frequency_months'] : null); $nextDue = null; if ($effFreq !== null && $effFreq > 0) { $d = DateTime::createFromFormat('Y-m-d', $completedDate); if ($d) { $d->modify('+' . (int)$effFreq . ' months'); $nextDue = $d->format('Y-m-d'); } } $deliveredBy = $deliveredBy !== '' ? $deliveredBy : null; $description = $description !== '' ? $description : null; try { $pdo->beginTransaction(); if ($id > 0) { $old = $pdo->prepare("SELECT * FROM employee_trainings WHERE id = :id"); $old->execute(['id' => $id]); $oldRow = $old->fetch(PDO::FETCH_ASSOC); if (!$oldRow) { $pdo->rollBack(); echo json_encode(['success' => false, 'message' => 'Formazione non trovata.']); exit; } $upd = $pdo->prepare(" UPDATE employee_trainings SET training_topic_id = :topic_id, completed_date = :completed_date, delivered_by = :delivered_by, description = :description, training_type = :training_type, update_frequency_months = :freq, reminder_days = :rem, next_due_date = :next_due, updated_at = NOW() WHERE id = :id "); $upd->execute([ 'topic_id' => $topicId, 'completed_date' => $completedDate, 'delivered_by' => $deliveredBy, 'description' => $description, 'training_type' => $trainingType, 'freq' => $freq, 'rem' => $rem, 'next_due' => $nextDue, 'id' => $id, ]); $fields = [ 'training_topic_id' => $topicId, 'completed_date' => $completedDate, 'delivered_by' => $deliveredBy, 'description' => $description, 'training_type' => $trainingType, 'update_frequency_months' => $freq, 'reminder_days' => $rem, 'next_due_date' => $nextDue, ]; $logStmt = $pdo->prepare(" INSERT INTO employee_training_log (employee_id, training_id, action, field, old_value, new_value, changed_by, changed_at) VALUES (:eid, :tid, 'updated', :field, :old_v, :new_v, :cb, NOW()) "); foreach ($fields as $f => $newV) { $oldV = $oldRow[$f] ?? null; if ((string)$oldV !== (string)$newV) { $logStmt->execute([ 'eid' => $employeeId, 'tid' => $id, 'field' => $f, 'old_v' => $oldV, 'new_v' => $newV, 'cb' => $currentUserId, ]); } } $pdo->commit(); echo json_encode(['success' => true, 'id' => $id]); exit; } $ins = $pdo->prepare(" INSERT INTO employee_trainings (employee_id, training_topic_id, completed_date, delivered_by, description, training_type, update_frequency_months, reminder_days, next_due_date, created_by, created_at, updated_at) VALUES (:eid, :tid, :completed_date, :delivered_by, :description, :training_type, :freq, :rem, :next_due, :cb, NOW(), NOW()) "); $ins->execute([ 'eid' => $employeeId, 'tid' => $topicId, 'completed_date' => $completedDate, 'delivered_by' => $deliveredBy, 'description' => $description, 'training_type' => $trainingType, 'freq' => $freq, 'rem' => $rem, 'next_due' => $nextDue, 'cb' => $currentUserId, ]); $newId = (int)$pdo->lastInsertId(); $pdo->prepare(" INSERT INTO employee_training_log (employee_id, training_id, action, field, old_value, new_value, changed_by, changed_at) VALUES (:eid, :tid, 'created', NULL, NULL, NULL, :cb, NOW()) ")->execute(['eid' => $employeeId, 'tid' => $newId, 'cb' => $currentUserId]); $pdo->commit(); echo json_encode(['success' => true, 'id' => $newId]); } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); echo json_encode(['success' => false, 'message' => $e->getMessage()]); }