diff --git a/agent/asset.php b/agent/asset.php index b42b91178..4a68bc74c 100644 --- a/agent/asset.php +++ b/agent/asset.php @@ -1,5 +1,18 @@

Nothing to see here

Go Back"; + +} else { + + $row = mysqli_fetch_assoc($sql); + $client_id = intval($row['client_id']); + $client_name = escapeHtml($row['client_name']); + $asset_id = intval($row['asset_id']); + $asset_type = escapeHtml($row['asset_type']); + $asset_name = escapeHtml($row['asset_name']); + $asset_description = escapeHtml($row['asset_description']); + $asset_make_model = escapeHtml(trim($row['asset_make'] . ' ' . $row['asset_model'])); + $asset_serial = escapeHtml($row['asset_serial']); + $asset_os = escapeHtml($row['asset_os']); + $asset_os_icon = assetOsIcon($row['asset_os']); + $asset_links = assetLinks($row['asset_uri'], $row['asset_uri_2'], $row['asset_uri_client']); + $asset_status_pill = assetStatusPill($row['asset_status']); + $asset_purchase_reference = escapeHtml($row['asset_purchase_reference']); + $asset_purchase_date = escapeHtml($row['asset_purchase_date']); + $asset_purchase_age = assetAge($row['asset_purchase_date']); + $asset_install_date = escapeHtml($row['asset_install_date']); + $asset_install_age = assetAge($row['asset_install_date']); + $asset_warranty = assetWarranty($row['asset_warranty_expire']); + $asset_photo = escapeHtml($row['asset_photo']); + $asset_physical_location = escapeHtml($row['asset_physical_location']); + $asset_notes = escapeHtml($row['asset_notes']); + $asset_favorite = intval($row['asset_favorite']); + $asset_created_at = escapeHtml($row['asset_created_at']); + $asset_archived_at = escapeHtml($row['asset_archived_at']); + $asset_vendor_id = intval($row['asset_vendor_id']); + $asset_contact_id = intval($row['asset_contact_id']); + $asset_tone = assetTypeTone($row['asset_type']); + $device_icon = getAssetIcon($row['asset_type']); + + $asset_ip = escapeHtml($row['interface_ip']); + $asset_ipv6 = escapeHtml($row['interface_ipv6']); + $asset_nat_ip = escapeHtml($row['interface_nat_ip']); + $asset_mac = escapeHtml($row['interface_mac']); + $asset_network_id = intval($row['interface_network_id']); + $network_name = escapeHtml($row['network_name']); + $vendor_name = escapeHtml($row['vendor_name']); + + $contact_name = escapeHtml($row['contact_name']); + $contact_email = escapeHtml($row['contact_email']); + $contact_phone = escapeHtml(formatPhoneNumber($row['contact_phone'], $row['contact_phone_country_code'])); + $contact_extension = escapeHtml($row['contact_extension']); + $contact_mobile = escapeHtml(formatPhoneNumber($row['contact_mobile'], $row['contact_mobile_country_code'])); + $contact_archived = !empty($row['contact_archived_at']); + $location_name = escapeHtml($row['location_name']); + $location_archived = !empty($row['location_archived_at']); + + $can_edit = lookupUserPermission('module_support') >= 2; + $can_delete = lookupUserPermission('module_support') >= 3; + $can_credentials = lookupUserPermission('module_credential') >= 1; + + // The rack it sits in, if any + $asset_rack = rackPositionForAsset($asset_id); + if ($asset_rack) { + $asset_rack_id = intval($asset_rack['rack_id']); + $asset_rack_name = escapeHtml($asset_rack['rack_name']); + $asset_rack_position = rackPositionLabel($asset_rack['unit_start_number'], $asset_rack['unit_end_number']) . ', ' . ($asset_rack['unit_face'] === 'rear' ? 'rear' : 'front'); + } + + // Override Tab Title // No Sanitizing needed as this var will opnly be used in the tab title + $page_title = $row['asset_name']; + + // Tags - functions/tags.php + $asset_tags_display = tagPills('asset', $asset_id, tagsForRecord('asset', $asset_id), "assets.php?client_id=$client_id&"); + + // Tickets - linked as the ticket's asset or as one of its additional assets + $sql_related_tickets = mysqli_query($mysqli, " + SELECT tickets.ticket_id, ticket_prefix, ticket_number, ticket_subject, ticket_priority, ticket_created_at, + ticket_updated_at, ticket_resolved_at, ticket_closed_at, ticket_assigned_to, + user_name, user_avatar, ticket_status_id, ticket_status_name, ticket_status_color + FROM tickets + LEFT JOIN users ON ticket_assigned_to = user_id + LEFT JOIN ticket_statuses ON ticket_status_id = ticket_status + LEFT JOIN ticket_assets ON tickets.ticket_id = ticket_assets.ticket_id + WHERE ticket_asset_id = $asset_id OR ticket_assets.asset_id = $asset_id + GROUP BY tickets.ticket_id + ORDER BY (ticket_resolved_at IS NULL AND ticket_closed_at IS NULL) DESC, ticket_number DESC "); - - if (mysqli_num_rows($sql) == 0) { - echo "

Nothing to see here

Go Back
"; - - } else { - - $row = mysqli_fetch_assoc($sql); - $client_id = intval($row['client_id']); - $client_name = escapeHtml($row['client_name']); - $asset_id = intval($row['asset_id']); - $asset_type = escapeHtml($row['asset_type']); - $asset_name = escapeHtml($row['asset_name']); - $asset_description = escapeHtml($row['asset_description']); - $asset_make = escapeHtml($row['asset_make']); - $asset_model = escapeHtml($row['asset_model']); - $asset_serial = escapeHtml($row['asset_serial']); - $asset_os = escapeHtml($row['asset_os']); - $asset_uri = escapeUrl($row['asset_uri']); - $asset_uri_2 = escapeUrl($row['asset_uri_2']); - $asset_uri_client = escapeUrl($row['asset_uri_client']); - $asset_status = escapeHtml($row['asset_status']); - $asset_purchase_reference = escapeHtml($row['asset_purchase_reference']); - $asset_purchase_date = escapeHtml($row['asset_purchase_date']); - $asset_warranty_expire = escapeHtml($row['asset_warranty_expire']); - $asset_install_date = escapeHtml($row['asset_install_date']); - $asset_photo = escapeHtml($row['asset_photo']); - $asset_physical_location = escapeHtml($row['asset_physical_location']); - $asset_notes = escapeHtml($row['asset_notes']); - $asset_favorite = intval($row['asset_favorite']); - $asset_created_at = escapeHtml($row['asset_created_at']); - $asset_vendor_id = intval($row['asset_vendor_id']); - $asset_location_id = intval($row['asset_location_id']); - $asset_contact_id = intval($row['asset_contact_id']); - - $asset_ip = escapeHtml($row['interface_ip']); - $asset_ipv6 = escapeHtml($row['interface_ipv6']); - $asset_nat_ip = escapeHtml($row['interface_nat_ip']); - $asset_mac = escapeHtml($row['interface_mac']); - $asset_network_id = intval($row['interface_network_id']); - - $device_icon = getAssetIcon($asset_type); - - $contact_name = escapeHtml($row['contact_name']); - $contact_email = escapeHtml($row['contact_email']); - $contact_phone_country_code = escapeHtml($row['contact_phone_country_code']); - $contact_phone = escapeHtml(formatPhoneNumber($row['contact_phone'], $contact_phone_country_code)); - $contact_extension = escapeHtml($row['contact_extension']); - $contact_mobile_country_code = escapeHtml($row['contact_mobile_country_code']); - $contact_mobile = escapeHtml(formatPhoneNumber($row['contact_mobile'], $contact_mobile_country_code)); - $contact_archived_at = escapeHtml($row['contact_archived_at']); - if ($contact_archived_at) { - $contact_name_display = "$contact_name"; - } else { - $contact_name_display = $contact_name; - } - $location_name = escapeHtml($row['location_name']); - if (empty($location_name)) { - $location_name = "-"; - } - $location_archived_at = escapeHtml($row['location_archived_at']); - if ($location_archived_at) { - $location_name_display = "$location_name"; - } else { - $location_name_display = $location_name; + $ticket_count = mysqli_num_rows($sql_related_tickets); + $ticket_open_count = 0; + $related_tickets = []; + while ($row = mysqli_fetch_assoc($sql_related_tickets)) { + $related_tickets[] = $row; + if (empty($row['ticket_resolved_at']) && empty($row['ticket_closed_at'])) { + $ticket_open_count++; } + } - // The rack it sits in, if any - $asset_rack = rackPositionForAsset($asset_id); - if ($asset_rack) { - $asset_rack_id = intval($asset_rack['rack_id']); - $asset_rack_name = escapeHtml($asset_rack['rack_name']); - $asset_rack_position = rackPositionLabel($asset_rack['unit_start_number'], $asset_rack['unit_end_number']) . ', ' . ($asset_rack['unit_face'] === 'rear' ? 'rear' : 'front'); - } + // Recurring tickets + $sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT recurring_tickets.recurring_ticket_id, recurring_ticket_subject, + recurring_ticket_priority, recurring_ticket_frequency, recurring_ticket_next_run + FROM recurring_tickets + LEFT JOIN recurring_ticket_assets ON recurring_tickets.recurring_ticket_id = recurring_ticket_assets.recurring_ticket_id + WHERE recurring_ticket_asset_id = $asset_id OR recurring_ticket_assets.asset_id = $asset_id + GROUP BY recurring_tickets.recurring_ticket_id + ORDER BY recurring_ticket_next_run ASC" + ); + $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); - // Override Tab Title // No Sanitizing needed as this var will opnly be used in the tab title - $page_title = $row['asset_name']; + // Network interfaces, and what each one is plugged into + $sql_related_interfaces = mysqli_query($mysqli, " + SELECT + ai.interface_id, + ai.interface_name, + ai.interface_description, + ai.interface_type, + ai.interface_mac, + ai.interface_ip, + ai.interface_nat_ip, + ai.interface_ipv6, + ai.interface_primary, + n.network_name, + n.network_id, + connected_interfaces.interface_name AS connected_interface_name, + connected_assets.asset_name AS connected_asset_name, + connected_assets.asset_id AS connected_asset_id, + connected_assets.asset_type AS connected_asset_type + FROM asset_interfaces AS ai + LEFT JOIN networks AS n + ON n.network_id = ai.interface_network_id + LEFT JOIN asset_interface_links AS ail + ON (ail.interface_a_id = ai.interface_id OR ail.interface_b_id = ai.interface_id) + LEFT JOIN asset_interfaces AS connected_interfaces + ON ( + (ail.interface_a_id = ai.interface_id AND ail.interface_b_id = connected_interfaces.interface_id) + OR + (ail.interface_b_id = ai.interface_id AND ail.interface_a_id = connected_interfaces.interface_id) + ) + LEFT JOIN assets AS connected_assets + ON connected_assets.asset_id = connected_interfaces.interface_asset_id + WHERE + ai.interface_asset_id = $asset_id + AND ai.interface_archived_at IS NULL + ORDER BY ai.interface_primary DESC, ai.interface_name ASC + "); + $interface_count = mysqli_num_rows($sql_related_interfaces); - $sql_related_tickets = mysqli_query($mysqli, " - SELECT tickets.*, users.*, ticket_statuses.* - FROM tickets - LEFT JOIN users ON ticket_assigned_to = user_id - LEFT JOIN ticket_statuses ON ticket_status_id = ticket_status - LEFT JOIN ticket_assets ON tickets.ticket_id = ticket_assets.ticket_id - WHERE ticket_asset_id = $asset_id OR ticket_assets.asset_id = $asset_id - GROUP BY tickets.ticket_id - ORDER BY ticket_number DESC - "); - $ticket_count = mysqli_num_rows($sql_related_tickets); + // Files + $sql_related_files = mysqli_query($mysqli, "SELECT file_created_at, file_description, file_ext, files.file_id, file_name FROM asset_files + LEFT JOIN files ON asset_files.file_id = files.file_id + WHERE asset_files.asset_id = $asset_id + AND file_archived_at IS NULL + ORDER BY file_name ASC" + ); + $files_count = mysqli_num_rows($sql_related_files); - // Related Recurring Tickets Query - $sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT recurring_tickets.* FROM recurring_tickets - LEFT JOIN recurring_ticket_assets ON recurring_tickets.recurring_ticket_id = recurring_ticket_assets.recurring_ticket_id - WHERE recurring_ticket_asset_id = $asset_id OR recurring_ticket_assets.asset_id = $asset_id - GROUP BY recurring_tickets.recurring_ticket_id - ORDER BY recurring_ticket_next_run DESC" - ); - $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); + // Documents + $sql_related_documents = mysqli_query($mysqli, "SELECT document_created_at, document_description, documents.document_id, document_name, + document_updated_at, user_name FROM asset_documents, documents + LEFT JOIN users ON document_created_by = user_id + WHERE asset_documents.asset_id = $asset_id + AND asset_documents.document_id = documents.document_id + AND document_archived_at IS NULL + ORDER BY document_name ASC" + ); + $document_count = mysqli_num_rows($sql_related_documents); - // Related Documents - $sql_related_documents = mysqli_query($mysqli, "SELECT 1 FROM asset_documents - LEFT JOIN documents ON asset_documents.document_id = documents.document_id - WHERE asset_documents.asset_id = $asset_id - AND document_archived_at IS NULL - ORDER BY document_name DESC" - ); - $document_count = mysqli_num_rows($sql_related_documents); - - // Tags - many to many relationship - // Tags - functions/tags.php - $asset_tags_display = tagPills('asset', $asset_id, tagsForRecord('asset', $asset_id), "assets.php?client_id=$client_id&"); - - // Network Interfaces - $sql_related_interfaces = mysqli_query($mysqli, " - SELECT - ai.interface_id, - ai.interface_name, - ai.interface_description, - ai.interface_type, - ai.interface_mac, - ai.interface_ip, - ai.interface_nat_ip, - ai.interface_ipv6, - ai.interface_primary, - ai.interface_notes, - n.network_name, - n.network_id, - connected_interfaces.interface_id AS connected_interface_id, - connected_interfaces.interface_name AS connected_interface_name, - connected_assets.asset_name AS connected_asset_name, - connected_assets.asset_id AS connected_asset_id, - connected_assets.asset_type AS connected_asset_type - FROM asset_interfaces AS ai - LEFT JOIN networks AS n - ON n.network_id = ai.interface_network_id - LEFT JOIN asset_interface_links AS ail - ON (ail.interface_a_id = ai.interface_id OR ail.interface_b_id = ai.interface_id) - LEFT JOIN asset_interfaces AS connected_interfaces - ON ( - (ail.interface_a_id = ai.interface_id AND ail.interface_b_id = connected_interfaces.interface_id) - OR - (ail.interface_b_id = ai.interface_id AND ail.interface_a_id = connected_interfaces.interface_id) - ) - LEFT JOIN assets AS connected_assets - ON connected_assets.asset_id = connected_interfaces.interface_asset_id - WHERE - ai.interface_asset_id = $asset_id - AND ai.interface_archived_at IS NULL - ORDER BY ai.interface_name ASC - "); - - $interface_count = mysqli_num_rows($sql_related_interfaces); - - // Related Files - $sql_related_files = mysqli_query($mysqli, "SELECT file_created_at, file_description, file_ext, files.file_id, file_name FROM asset_files - LEFT JOIN files ON asset_files.file_id = files.file_id - WHERE asset_files.asset_id = $asset_id - AND file_archived_at IS NULL - ORDER BY file_name DESC" - ); - $files_count = mysqli_num_rows($sql_related_files); - // View Mode -- 0 List, 1 Thumbnail - if (!empty($_GET['view'])) { - $view = intval($_GET['view']); - } else { - $view = 0; - } - if ($view == 1) { - $query_images = "AND (file_ext LIKE 'JPG' OR file_ext LIKE 'jpg' OR file_ext LIKE 'JPEG' OR file_ext LIKE 'jpeg' OR file_ext LIKE 'png' OR file_ext LIKE 'PNG' OR file_ext LIKE 'webp' OR file_ext LIKE 'WEBP')"; - } else { - $query_images = ''; - } - - // Related Documents - $sql_related_documents = mysqli_query($mysqli, "SELECT document_created_at, document_description, documents.document_id, document_name, - document_updated_at, user_name FROM asset_documents, documents - LEFT JOIN users ON document_created_by = user_id - WHERE asset_documents.asset_id = $asset_id - AND asset_documents.document_id = documents.document_id - AND document_archived_at IS NULL - ORDER BY document_name ASC" - ); - $document_count = mysqli_num_rows($sql_related_documents); - - - // Related Credentials Query + // Credentials + $credential_count = 0; + if ($can_credentials) { $sql_related_credentials = mysqli_query($mysqli, " - SELECT - credentials.credential_id AS credential_id, - credentials.credential_name, - credentials.credential_description, - credentials.credential_uri, - credentials.credential_username, - credentials.credential_password, - credentials.credential_otp_secret, - credentials.credential_note, - credentials.credential_favorite, - credentials.credential_contact_id, - credentials.credential_asset_id + SELECT credential_id, credential_name, credential_description, credential_uri, + credential_username, credential_otp_secret FROM credentials - LEFT JOIN credential_tags ON credential_tags.credential_id = credentials.credential_id - LEFT JOIN tags ON tags.tag_id = credential_tags.tag_id WHERE credential_asset_id = $asset_id AND credential_archived_at IS NULL - GROUP BY credentials.credential_id - ORDER BY credential_name DESC + ORDER BY credential_name ASC "); $credential_count = mysqli_num_rows($sql_related_credentials); + } - // Related Software Query - $sql_related_software = mysqli_query( - $mysqli, - "SELECT software_expire, software_assets.software_id, software_key, software_license_type, - software_name, software_notes, software_purchase, software_seats, software_type, - software_version FROM software_assets - LEFT JOIN software ON software_assets.software_id = software.software_id - WHERE software_assets.asset_id = $asset_id - AND software_archived_at IS NULL - ORDER BY software_name DESC" - ); + // Licenses, with seats in use counted in the same query instead of two queries per license + $sql_related_software = mysqli_query( + $mysqli, + "SELECT software_expire, software_assets.software_id, software_license_type, + software_name, software_seats, software_type, software_version, + (SELECT COUNT(*) FROM software_assets AS sa WHERE sa.software_id = software.software_id) + + (SELECT COUNT(*) FROM software_contacts AS sc WHERE sc.software_id = software.software_id) AS seats_used + FROM software_assets + LEFT JOIN software ON software_assets.software_id = software.software_id + WHERE software_assets.asset_id = $asset_id + AND software_archived_at IS NULL + ORDER BY software_name ASC" + ); + $software_count = mysqli_num_rows($sql_related_software); - $software_count = mysqli_num_rows($sql_related_software); + // Linked services + $sql_linked_services = mysqli_query($mysqli, "SELECT service_category, service_description, service_assets.service_id, service_importance, + service_name FROM service_assets, services + WHERE service_assets.asset_id = $asset_id + AND service_assets.service_id = services.service_id + ORDER BY service_name ASC" + ); + $service_count = mysqli_num_rows($sql_linked_services); - // Linked Services - $sql_linked_services = mysqli_query($mysqli, "SELECT service_category, service_description, service_assets.service_id, service_importance, - service_name FROM service_assets, services - WHERE service_assets.asset_id = $asset_id - AND service_assets.service_id = services.service_id - ORDER BY service_name ASC" - ); - $service_count = mysqli_num_rows($sql_linked_services); + // Notes - 1 to many relationship + $sql_related_notes = mysqli_query($mysqli, "SELECT asset_note, asset_note_created_at, asset_note_id, asset_note_type, user_name FROM asset_notes + LEFT JOIN users ON asset_note_created_by = user_id + WHERE asset_note_asset_id = $asset_id + AND asset_note_archived_at IS NULL + ORDER BY asset_note_created_at DESC" + ); + $note_count = mysqli_num_rows($sql_related_notes); - $linked_services = array(); + // Note type icons, read from the categories list so the seeded icons + // stay the single source of truth + $note_type_icons = array(); + $sql_note_type_icons = mysqli_query($mysqli, "SELECT category_name, category_icon FROM categories WHERE category_type = 'asset_note_type'"); + while ($row = mysqli_fetch_assoc($sql_note_type_icons)) { + $note_type_icons[escapeHtml($row['category_name'])] = escapeHtml($row['category_icon']); + } - // Notes - 1 to many relationship - $sql_related_notes = mysqli_query($mysqli, "SELECT asset_note, asset_note_created_at, asset_note_id, asset_note_type, user_name FROM asset_notes - LEFT JOIN users ON asset_note_created_by = user_id - WHERE asset_note_asset_id = $asset_id - AND asset_note_archived_at IS NULL - ORDER BY asset_note_created_at DESC" - ); - $note_count = mysqli_num_rows($sql_related_notes); + // The tabs, in the order a tech reaches for them + $asset_tabs = [ + 'interfaces' => ['label' => 'Interfaces', 'icon' => 'fa-ethernet', 'count' => $interface_count], + 'credentials' => ['label' => 'Credentials', 'icon' => 'fa-key', 'count' => $credential_count], + 'tickets' => ['label' => 'Tickets', 'icon' => 'fa-life-ring', 'count' => $ticket_count, 'badge' => $ticket_open_count], + 'recurring' => ['label' => 'Recurring', 'icon' => 'fa-redo-alt', 'count' => $recurring_ticket_count], + 'licenses' => ['label' => 'Licenses', 'icon' => 'fa-cube', 'count' => $software_count], + 'documents' => ['label' => 'Documents', 'icon' => 'fa-file-alt', 'count' => $document_count], + 'files' => ['label' => 'Files', 'icon' => 'fa-paperclip', 'count' => $files_count], + 'services' => ['label' => 'Services', 'icon' => 'fa-stream', 'count' => $service_count], + 'notes' => ['label' => 'Notes', 'icon' => 'fa-sticky-note', 'count' => $note_count], + ]; + if (!$can_credentials) { + unset($asset_tabs['credentials']); + } - // Note type icons, read from the categories list so the seeded icons - // stay the single source of truth - $note_type_icons = array(); - $sql_note_type_icons = mysqli_query($mysqli, "SELECT category_name, category_icon FROM categories WHERE category_type = 'asset_note_type'"); - while ($row = mysqli_fetch_assoc($sql_note_type_icons)) { - $note_type_icons[escapeHtml($row['category_name'])] = escapeHtml($row['category_icon']); - } + ?> - ?> + -
+ +
+
+ + " target="_blank" rel="noopener" title="Open photo"> + " alt="Photo of "> + + + + -
- -
-
- -

- -

- - asset_photo"> - - -
- -
-
- -
- -
- - -
- -
- -
- -
- -
- -
- -
- -
+
+

+ + + Archived + +

+
+ + + + + + + + + +
- -
-
-
Primary Network Interface
-
-
- -
- - -
- -
- -
- -
- - -
Client URI:
- -
-
- - -
-
-
Assignment
-
-
- -
- -
·
- -
- -
- -
- -
- -
- - -
-
- -
-
-
Additional Notes
-
- -
- + +
+
-
- - - -
-