pdo = $connection->getPdo(); } public function index(Request $request, Response $response): string { $search = $request->get('search', ''); $page = max(1, (int)$request->get('page', 1)); $perPage = 20; $offset = ($page - 1) * $perPage; $where = ['c.deleted_at IS NULL']; $params = []; if ($search) { $where[] = '(c.name LIKE ? OR c.email LIKE ? OR c.phone LIKE ?)'; $params[] = "%{$search}%"; $params[] = "%{$search}%"; $params[] = "%{$search}%"; } $whereClause = implode(' AND ', $where); $stmt = $this->pdo->prepare("SELECT COUNT(*) FROM contacts c WHERE {$whereClause}"); $stmt->execute($params); $total = (int)$stmt->fetchColumn(); $stmt = $this->pdo->prepare( "SELECT c.*, org.name as org_name, (SELECT COUNT(*) FROM interactions WHERE contact_id = c.id) as interaction_count FROM contacts c LEFT JOIN organizations org ON org.id = c.organization_id WHERE {$whereClause} ORDER BY c.updated_at DESC LIMIT ? OFFSET ?" ); $stmt->execute(array_merge($params, [$perPage, $offset])); $contacts = $stmt->fetchAll(); return $this->render('admin/contacts/index', [ 'contacts' => $contacts, 'total' => $total, 'page' => $page, 'perPage' => $perPage, 'search' => $search, ], 'admin'); } public function show(Request $request, Response $response, int $id): string { $stmt = $this->pdo->prepare( "SELECT c.*, org.name as org_name, org.id as org_id FROM contacts c LEFT JOIN organizations org ON org.id = c.organization_id WHERE c.id = ? AND c.deleted_at IS NULL" ); $stmt->execute([$id]); $contact = $stmt->fetch(); if (!$contact) { $response->redirect('/admin/contacts'); return ''; } $stmt = $this->pdo->prepare("SELECT * FROM interactions WHERE contact_id = ? ORDER BY created_at DESC"); $stmt->execute([$id]); $interactions = $stmt->fetchAll(); return $this->render('admin/contacts/show', [ 'contact' => $contact, 'interactions' => $interactions, ], 'admin'); } public function create(Request $request, Response $response): string { $orgId = $request->get('organization_id', ''); $orgs = $this->pdo->query("SELECT id, name FROM organizations WHERE deleted_at IS NULL ORDER BY name")->fetchAll(); return $this->render('admin/contacts/form', [ 'contact' => null, 'organizations' => $orgs, 'selectedOrgId' => $orgId, ], 'admin'); } public function edit(Request $request, Response $response, int $id): string { $stmt = $this->pdo->prepare("SELECT * FROM contacts WHERE id = ? AND deleted_at IS NULL"); $stmt->execute([$id]); $contact = $stmt->fetch(); if (!$contact) { $response->redirect('/admin/contacts'); return ''; } $orgs = $this->pdo->query("SELECT id, name FROM organizations WHERE deleted_at IS NULL ORDER BY name")->fetchAll(); return $this->render('admin/contacts/form', [ 'contact' => $contact, 'organizations' => $orgs, 'selectedOrgId' => $contact['organization_id'], ], 'admin'); } public function store(Request $request, Response $response): void { $id = $request->post('id', ''); $name = $request->post('name', ''); $email = $request->post('email', ''); $phone = $request->post('phone', ''); $position = $request->post('position', ''); $organizationId = $request->post('organization_id', ''); $notes = $request->post('notes', ''); try { if ($id) { $stmt = $this->pdo->prepare("UPDATE contacts SET name=?, email=?, phone=?, position=?, organization_id=?, notes=? WHERE id=?"); $stmt->execute([$name, $email ?: null, $phone ?: null, $position ?: null, $organizationId ?: null, $notes, $id]); } else { $stmt = $this->pdo->prepare("INSERT INTO contacts (name, email, phone, position, organization_id, notes) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$name, $email ?: null, $phone ?: null, $position ?: null, $organizationId ?: null, $notes]); $id = $this->pdo->lastInsertId(); } $this->session->setFlash('success', 'Contact saved.'); $response->redirect('/admin/contacts/' . $id); } catch (Throwable $e) { $this->session->setFlash('error', 'Error: ' . $e->getMessage()); $response->redirect('/admin/contacts'); } } public function delete(Request $request, Response $response, int $id): void { $this->pdo->prepare("UPDATE contacts SET deleted_at = NOW() WHERE id = ?")->execute([$id]); $this->session->setFlash('success', 'Contact deleted.'); $response->redirect('/admin/contacts'); } public function addInteraction(Request $request, Response $response, int $contactId): void { $type = $request->post('type', 'note'); $notes = $request->post('notes', ''); try { $stmt = $this->pdo->prepare("INSERT INTO interactions (contact_id, type, notes) VALUES (?, ?, ?)"); $stmt->execute([$contactId, $type, $notes]); $this->session->setFlash('success', 'Interaction logged.'); } catch (Throwable $e) { $this->session->setFlash('error', 'Error: ' . $e->getMessage()); } $response->redirect('/admin/contacts/' . $contactId); } }