false, 'message' => 'ID non valido.']); exit; } $id = (int)$_GET['id']; $db = DBHandlerSelect::getInstance(); $pdo = $db->getConnection(); $stmt = $pdo->prepare("SELECT * FROM scad_deadlines WHERE id = ? AND status = 'active'"); $stmt->execute([$id]); $deadline = $stmt->fetch(PDO::FETCH_ASSOC); if (!$deadline) { echo json_encode(['success' => false, 'message' => 'Scadenza non trovata o giĆ  completata.']); exit; } $pdo->beginTransaction(); // Mark as completed $pdo->prepare("UPDATE scad_deadlines SET status = 'completed', completed_at = NOW(), completed_by = ? WHERE id = ?") ->execute([$currentUserId, $id]); // History $pdo->prepare("INSERT INTO scad_deadline_histories (deadline_id, user_id, action) VALUES (?, ?, 'completed')") ->execute([$id, $currentUserId]); $newId = null; // If recurring, create next deadline if ($deadline['recurrence_type'] !== 'once') { $dueDate = new DateTime($deadline['due_date']); $checkDate = $deadline['check_date'] ? new DateTime($deadline['check_date']) : null; switch ($deadline['recurrence_type']) { case 'monthly': $interval = new DateInterval('P1M'); break; case 'quarterly': $interval = new DateInterval('P3M'); break; case 'semiannual': $interval = new DateInterval('P6M'); break; case 'annual': $interval = new DateInterval('P1Y'); break; case 'biennial': $interval = new DateInterval('P2Y'); break; case 'triennial': $interval = new DateInterval('P3Y'); break; case 'quadriennial': $interval = new DateInterval('P4Y'); break; case 'quinquennial': $interval = new DateInterval('P5Y'); break; case 'decennial': $interval = new DateInterval('P10Y'); break; case 'quindecennial': $interval = new DateInterval('P15Y'); break; default: $interval = null; } if ($interval) { $dueDate->add($interval); if ($checkDate) $checkDate->add($interval); $ins = $pdo->prepare(" INSERT INTO scad_deadlines (subject_id, topic, law_regulation, recurrence_type, due_date, check_date, document_date, notification_days, storage_location, notes, created_by, departments) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "); $ins->execute([ $deadline['subject_id'], $deadline['topic'], $deadline['law_regulation'], $deadline['recurrence_type'], $dueDate->format('Y-m-d'), $checkDate ? $checkDate->format('Y-m-d') : null, $deadline['document_date'], $deadline['notification_days'], $deadline['storage_location'], $deadline['notes'], $deadline['created_by'], $deadline['departments'] ]); $newId = $pdo->lastInsertId(); // Copy employee assignments $empStmt = $pdo->prepare("SELECT employee_id FROM scad_deadline_employee WHERE deadline_id = ?"); $empStmt->execute([$id]); $empIds = $empStmt->fetchAll(PDO::FETCH_COLUMN); if (!empty($empIds)) { $insertEmp = $pdo->prepare("INSERT INTO scad_deadline_employee (deadline_id, employee_id) VALUES (?, ?)"); foreach ($empIds as $empId) { $insertEmp->execute([$newId, $empId]); } } // History for new $pdo->prepare("INSERT INTO scad_deadline_histories (deadline_id, user_id, action, notes) VALUES (?, ?, 'created', ?)") ->execute([$newId, $currentUserId, 'Creata automaticamente dalla scadenza #' . $id]); } } $pdo->commit(); $msg = 'Scadenza completata con successo.'; if ($newId) { $msg .= ' Nuova scadenza creata con data ' . $dueDate->format('d/m/Y') . '.'; } echo json_encode(['success' => true, 'message' => $msg, 'new_id' => $newId]); } catch (Exception $e) { if (isset($pdo) && $pdo->inTransaction()) { $pdo->rollBack(); } echo json_encode(['success' => false, 'message' => 'Errore: ' . $e->getMessage()]); }