'That contact no longer exists.']); exit; } $client_id = intval($contact_row['contact_client_id']); enforceClientAccess(); $can_edit = lookupUserPermission('module_client') >= 2; $can_credentials = lookupUserPermission('module_credential') >= 1; $can_support = lookupUserPermission('module_support') >= 1; $contact_name = escapeHtml($contact_row['contact_name']); $contact_email = escapeHtml($contact_row['contact_email']); $contact_pin = escapeHtml($contact_row['contact_pin']); $contact_notes = escapeHtml($contact_row['contact_notes']); $contact_archived = !empty($contact_row['contact_archived_at']); $contact_role_line = implode(' · ', array_filter([escapeHtml($contact_row['contact_title']), escapeHtml($contact_row['contact_department'])])); $contact_phone_link = contactPhoneLink($contact_row['contact_phone'], $contact_row['contact_phone_country_code'], $contact_row['contact_extension']); $contact_mobile_link = contactPhoneLink($contact_row['contact_mobile'], $contact_row['contact_mobile_country_code']); $contact_phone_copy = escapeHtml(formatPhoneNumber($contact_row['contact_phone'], $contact_row['contact_phone_country_code'])); $contact_mobile_copy = escapeHtml(formatPhoneNumber($contact_row['contact_mobile'], $contact_row['contact_mobile_country_code'])); $contact_portal = contactPortalAccess($contact_row['contact_user_id'], $contact_row['user_auth_method']); $contact_tags_display = tagPills('contact', $contact_id, tagsForRecord('contact', $contact_id), "contacts.php?client_id=$client_id&"); // Assets assigned to them $sql_related_assets = mysqli_query($mysqli, "SELECT asset_id, asset_name, asset_type, asset_make, asset_model, asset_status, interface_ip FROM assets LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1 WHERE asset_contact_id = $contact_id AND asset_archived_at IS NULL ORDER BY asset_name ASC" ); $asset_count = mysqli_num_rows($sql_related_assets); // Credentials - only for agents who may see them $related_credentials = $can_credentials ? credentialRows("credential_contact_id = $contact_id AND credential_client_id = $client_id") : []; $credential_count = count($related_credentials); // Tickets - open ones first; the most recent few here, the rest on the contact page $quick_ticket_limit = 8; $related_tickets = []; $ticket_count = $ticket_open_count = 0; if ($can_support) { [$ticket_count, $ticket_open_count] = ticketCounts("tickets.ticket_contact_id = $contact_id"); $related_tickets = ticketRows("tickets.ticket_contact_id = $contact_id", $quick_ticket_limit); } // Recurring tickets $recurring_ticket_count = 0; if ($can_support) { $sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT recurring_ticket_subject, recurring_ticket_frequency, recurring_ticket_next_run FROM recurring_tickets WHERE recurring_ticket_contact_id = $contact_id ORDER BY recurring_ticket_next_run ASC" ); $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); } // Licenses they hold a seat on, with the key they were given $held_software = $can_support ? softwareHeldBy('contact', $contact_id) : []; $software_count = count($held_software); // Documents $linked_documents = linkedRecords('contact', $contact_id, 'document'); $document_count = count($linked_documents); // Files $linked_files = linkedRecords('contact', $contact_id, 'file'); $file_count = count($linked_files); // Notes $sql_related_notes = mysqli_query($mysqli, "SELECT contact_note, contact_note_created_at, contact_note_type, user_name FROM contact_notes LEFT JOIN users ON contact_note_created_by = user_id WHERE contact_note_contact_id = $contact_id AND contact_note_archived_at IS NULL ORDER BY contact_note_created_at DESC" ); $note_count = mysqli_num_rows($sql_related_notes); $note_type_icons = []; $sql_note_type_icons = mysqli_query($mysqli, "SELECT category_name, category_icon FROM categories WHERE category_type = 'contact_note_type'"); while ($row = mysqli_fetch_assoc($sql_note_type_icons)) { $note_type_icons[$row['category_name']] = escapeHtml($row['category_icon']); } // Only the tabs with something in them - same order as the contact page $quick_tabs = array_filter([ 'assets' => ['label' => 'Assets', 'count' => $asset_count], 'credentials' => ['label' => 'Credentials', 'count' => $credential_count], 'tickets' => ['label' => 'Tickets', 'count' => $ticket_count, 'badge' => $ticket_open_count], 'recurring' => ['label' => 'Recurring', 'count' => $recurring_ticket_count], 'licenses' => ['label' => 'Licenses', 'count' => $software_count], 'documents' => ['label' => 'Documents', 'count' => $document_count], 'files' => ['label' => 'Files', 'count' => $file_count], 'notes' => ['label' => 'Notes', 'count' => $note_count], ], function ($tab) { return $tab['count'] > 0; }); $first_tab = array_key_first($quick_tabs); $has_reach = $contact_phone_link || $contact_mobile_link || $contact_email; ob_start(); ?>