'array', 'started_at' => 'datetime', 'completed_at' => 'datetime' ]; public static function getRecent(\PDO $pdo, int $limit = 10): array { $stmt = $pdo->prepare(" SELECT sl.*, s.display_name as source_name FROM sync_logs sl JOIN sources s ON sl.source_id = s.id ORDER BY sl.created_at DESC LIMIT :limit "); $stmt->execute(['limit' => $limit]); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } public function source() { return new Source($this->pdo); } public function markAsStarted(): void { $this->update($this->id, [ 'status' => 'started', 'started_at' => date('Y-m-d H:i:s'), 'message' => null, 'errors' => null ]); } public function markAsCompleted(array $stats = []): void { $data = [ 'status' => 'completed', 'completed_at' => date('Y-m-d H:i:s') ]; if (!empty($stats)) { $data = array_merge($data, $stats); } $this->update($this->id, $data); } public function markAsFailed(string $errorMessage, array $errors = []): void { $this->update($this->id, [ 'status' => 'failed', 'completed_at' => date('Y-m-d H:i:s'), 'message' => $errorMessage, 'errors' => !empty($errors) ? json_encode($errors) : null ]); } public function updateProgress(int $processed, int $new = 0, int $updated = 0, int $deleted = 0): void { $this->update($this->id, [ 'processed_items' => $processed, 'new_items' => $new, 'updated_items' => $updated, 'deleted_items' => $deleted ]); } }