|
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/config/../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 assign tasks
if ($current_user_role !== 'CEO' && $current_user_role !== 'Manager') {
header("Location: dashboard.php");
exit;
}
// Get all employees for assignment
$employees_query = "SELECT uid, fname, email, role FROM tbl_user WHERE status = 'active' AND role = 'Employee' ORDER BY fname ASC";
$employees_result = mysqli_query($con, $employees_query);
// Get all proposals for dropdown
$proposals_query = "SELECT proposal_id, proposal_code, proposal_title, customer_id,
(SELECT customer_name FROM tbl_customers WHERE customer_id = tbl_proposals.customer_id) as customer_name
FROM tbl_proposals
WHERE status IN ('Accepted', 'Sent', 'Negotiate')
ORDER BY created_at DESC";
$proposals_result = mysqli_query($con, $proposals_query);
// Get all categories
$categories_query = "SELECT DISTINCT category_name FROM tbl_categories ORDER BY category_name ASC";
$categories_result = mysqli_query($con, $categories_query);
// Get all tasks with proposal details
$tasks_query = "SELECT t.*,
e.fname as employee_name,
e.email as employee_email,
a.fname as assigned_by_name,
p.proposal_code,
p.proposal_title,
(SELECT customer_name FROM tbl_customers WHERE customer_id = p.customer_id) as customer_name,
DATEDIFF(t.end_date, CURDATE()) as days_remaining
FROM tbl_tasks t
LEFT JOIN tbl_user e ON t.employee_id = e.uid
LEFT JOIN tbl_user a ON t.assigned_by = a.uid
LEFT JOIN tbl_proposals p ON t.proposal_id = p.proposal_id
ORDER BY t.end_date ASC, t.created_at DESC";
$tasks_result = mysqli_query($con, $tasks_query);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<base href="../" />
<title>Task Assignment - 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" />
<!-- Flatpickr CSS (Metronic Date Picker) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<!-- Tagify CSS for Tags Input -->
<link href="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.css" rel="stylesheet" type="text/css" />
<style>
.tagify {
border: 1px solid #e4e6ef;
border-radius: 0.475rem;
}
</style>
</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'; ?>
<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">
📋 Task Assignment
</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">Tasks</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">
<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="searchTask"
class="form-control form-control-solid w-250px ps-13"
placeholder="Search tasks..." />
</div>
</div>
<div class="card-toolbar">
<button type="button" class="btn btn-sm btn-primary"
data-bs-toggle="modal" data-bs-target="#taskModal"
onclick="openAddModal()">
<i class="ki-duotone ki-plus fs-2"></i>
Assign Task
</button>
</div>
</div>
<div class="card-body py-4">
<div class="table-responsive">
<table class="table align-middle table-row-dashed fs-6 gy-5" id="tasksTable">
<thead>
<tr class="text-start text-muted fw-bold fs-7 text-uppercase gs-0">
<th class="min-w-125px">Employee</th>
<th class="min-w-200px">Project/Proposal</th>
<th class="min-w-150px">Task Title</th>
<th class="min-w-125px">Category</th>
<th class="min-w-100px">Priority</th>
<th class="min-w-100px">Start Date</th>
<th class="min-w-100px">End Date</th>
<th class="min-w-100px">Status</th>
<th class="text-end min-w-150px">Actions</th>
</tr>
</thead>
<tbody class="text-gray-600 fw-semibold">
<?php while ($task = mysqli_fetch_assoc($tasks_result)):
$is_delayed = ($task['days_remaining'] < 0 && $task['status'] !== 'Completed');
?>
<tr class="<?php echo $is_delayed ? 'bg-light-dange' : ''; ?>">
<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-info text-info">
<?php echo strtoupper(substr($task['employee_name'], 0, 1)); ?>
</div>
</div>
<div class="d-flex flex-column">
<span class="text-gray-800 mb-1">
<?php echo htmlspecialchars($task['employee_name']); ?>
</span>
</div>
</div>
</td>
<td>
<?php if ($task['proposal_id']): ?>
<div class="d-flex flex-column">
<span class="text-gray-800 fw-bold">
<?php echo htmlspecialchars($task['proposal_code']); ?>
</span>
<span class="text-muted fs-7">
<?php echo htmlspecialchars($task['customer_name']); ?>
</span>
</div>
<?php else: ?>
<span class="badge badge-light-secondary">No Project</span>
<?php endif; ?>
</td>
<td>
<span class="text-gray-800 fw-bold">
<?php echo htmlspecialchars($task['task_title']); ?>
</span>
</td>
<td>
<?php if ($task['category']): ?>
<div class="d-flex flex-column">
<span class="badge badge-light-primary mb-1">
<?php echo htmlspecialchars($task['category']); ?>
</span>
<?php if ($task['subcategory']): ?>
<span class="badge badge-light-info">
<?php echo htmlspecialchars($task['subcategory']); ?>
</span>
<?php endif; ?>
</div>
<?php else: ?>
<span class="text-muted">-</span>
<?php endif; ?>
</td>
<td>
<span class="badge badge-light-<?php
echo $task['priority'] === 'Urgent' ? 'danger' :
($task['priority'] === 'High' ? 'warning' :
($task['priority'] === 'Medium' ? 'info' : 'secondary'));
?>">
<?php echo htmlspecialchars($task['priority']); ?>
</span>
</td>
<td>
<?php echo $task['start_date'] ? date('M d, Y', strtotime($task['start_date'])) : '-'; ?>
</td>
<td>
<?php echo date('M d, Y', strtotime($task['end_date'])); ?>
</td>
<td>
<?php if ($is_delayed): ?>
<span class="badge badge-danger">Delayed</span>
<?php else: ?>
<span class="badge badge-light-<?php
echo $task['status'] === 'Completed' ? 'success' :
($task['status'] === 'In Progress' ? 'primary' :
($task['status'] === 'On Hold' ? 'warning' : 'secondary'));
?>">
<?php echo htmlspecialchars($task['status']); ?>
</span>
<?php endif; ?>
</td>
<td class="text-end">
<!-- Invoice Button (Only for Completed Tasks) -->
<?php if ($task['status'] === 'Completed'): ?>
<button class="btn btn-icon btn-light btn-active-light-success btn-sm me-1"
onclick="downloadInvoice(<?php echo $task['task_id']; ?>)"
title="Download Invoice">
<i class="ki-duotone ki-document fs-3">
<span class="path1"></span>
<span class="path2"></span>
</i>
</button>
<?php endif; ?>
<!-- Edit Button -->
<button class="btn btn-icon btn-light btn-active-light-primary btn-sm me-1"
onclick='editTask(<?php echo json_encode($task); ?>)'>
<i class="ki-duotone ki-pencil fs-3">
<span class="path1"></span>
<span class="path2"></span>
</i>
</button>
<!-- Delete Button -->
<button class="btn btn-icon btn-light btn-active-light-danger btn-sm"
onclick="deleteTask(<?php echo $task['task_id']; ?>, '<?php echo htmlspecialchars($task['task_title']); ?>')">
<i class="ki-duotone ki-trash fs-3">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
<span class="path4"></span>
<span class="path5"></span>
</i>
</button>
</td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<?php include 'includes/footer.php'; ?>
</div>
</div>
</div>
</div>
<!-- Add/Edit Task Modal -->
<!-- Add/Edit Task Modal -->
<div class="modal fade" id="taskModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered mw-900px modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h2 class="fw-bolder" id="modalTitle">Assign New Task</h2>
<div class="btn btn-icon btn-sm btn-active-icon-primary" data-bs-dismiss="modal">
<i class="ki-duotone ki-cross fs-1">
<span class="path1"></span>
<span class="path2"></span>
</i>
</div>
</div>
<form id="taskForm" method="POST">
<div class="modal-body py-10 px-lg-17" style="max-height: 70vh; overflow-y: auto;">
<input type="hidden" name="action" id="action" value="add">
<input type="hidden" name="task_id" id="task_id" value="">
<div id="alertBox"></div>
<div class="row">
<!-- Employee Selection -->
<div class="col-md-6 fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Select Employee</label>
<select class="form-select form-select-solid"
name="employee_id"
id="employee_id"
data-control="select2"
data-placeholder="Select an employee"
data-dropdown-parent="#taskModal"
required>
<option value="">Select Employee</option>
<?php
mysqli_data_seek($employees_result, 0);
while ($emp = mysqli_fetch_assoc($employees_result)):
?>
<option value="<?php echo $emp['uid']; ?>"><?php echo htmlspecialchars($emp['fname']); ?></option>
<?php endwhile; ?>
</select>
</div>
<!-- Proposal/Project Selection -->
<div class="col-md-6 fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Select Project</label>
<select class="form-select form-select-solid"
name="proposal_id"
id="proposal_id"
data-control="select2"
data-placeholder="Select a proposal/project"
data-dropdown-parent="#taskModal"
onchange="loadProposalDetails()"
required>
<option value="">Select Project</option>
<?php
mysqli_data_seek($proposals_result, 0);
while ($prop = mysqli_fetch_assoc($proposals_result)):
?>
<option value="<?php echo $prop['proposal_id']; ?>"
data-title="<?php echo htmlspecialchars($prop['proposal_title']); ?>"
data-customer="<?php echo htmlspecialchars($prop['customer_name']); ?>">
<?php echo htmlspecialchars($prop['proposal_code']); ?> - <?php echo htmlspecialchars($prop['customer_name']); ?>
</option>
<?php endwhile; ?>
</select>
</div>
</div>
<!-- Task Title -->
<div class="fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Task Title</label>
<input type="text" class="form-control form-control-solid"
name="task_title" id="task_title"
placeholder="Enter task title" required />
</div>
<!-- Task Description -->
<div class="fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Task Description</label>
<textarea class="form-control form-control-solid"
name="task_description" id="task_description"
rows="3" placeholder="Enter task description" required></textarea>
</div>
<div class="row">
<!-- Category -->
<div class="col-md-6 fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Category</label>
<select class="form-select form-select-solid"
name="category"
id="category"
data-control="select2"
data-placeholder="Select or type category"
data-dropdown-parent="#taskModal"
data-tags="true"
onchange="loadSubcategories()"
required>
<option value="">Select Category</option>
<?php
mysqli_data_seek($categories_result, 0);
while ($cat = mysqli_fetch_assoc($categories_result)):
?>
<option value="<?php echo htmlspecialchars($cat['category_name']); ?>">
<?php echo htmlspecialchars($cat['category_name']); ?>
</option>
<?php endwhile; ?>
</select>
</div>
<!-- Subcategory -->
<div class="col-md-6 fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Subcategory</label>
<select class="form-select form-select-solid"
name="subcategory"
id="subcategory"
data-control="select2"
data-placeholder="Select or type subcategory"
data-dropdown-parent="#taskModal"
data-tags="true"
required>
<option value="">Select Subcategory</option>
</select>
</div>
</div>
<div class="row">
<!-- Priority -->
<div class="col-md-4 fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Priority</label>
<select class="form-select form-select-solid"
name="priority"
id="priority"
data-control="select2"
data-placeholder="Select priority"
data-dropdown-parent="#taskModal"
data-hide-search="true"
required>
<option value="">Select Priority</option>
<option value="Low">Low</option>
<option value="Medium" selected>Medium</option>
<option value="High">High</option>
<option value="Urgent">Urgent</option>
</select>
</div>
<!-- Start Date -->
<div class="col-md-4 fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Start Date</label>
<input type="text" class="form-control form-control-solid"
name="start_date" id="start_date"
placeholder="Select start date"
readonly
required />
</div>
<!-- End Date -->
<div class="col-md-4 fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">End Date</label>
<input type="text" class="form-control form-control-solid"
name="end_date" id="end_date"
placeholder="Select end date"
readonly
required />
</div>
</div>
<!-- Tags -->
<div class="fv-row mb-7">
<label class="fs-6 fw-semibold mb-2">Tags (Optional)</label>
<input type="text" class="form-control form-control-solid"
name="tags" id="tags"
placeholder="Add tags"
value="" />
<div class="form-text">Press Enter or comma to add multiple tags</div>
</div>
<!-- Status (Only in Edit Mode) -->
<div class="fv-row mb-7" id="statusField" style="display: none;">
<label class="required fs-6 fw-semibold mb-2">Status</label>
<select class="form-select form-select-solid"
name="status"
id="status"
data-control="select2"
data-placeholder="Select status"
data-dropdown-parent="#taskModal"
data-hide-search="true">
<option value="Pending">Pending</option>
<option value="In Progress">In Progress</option>
<option value="Completed">Completed</option>
<option value="On Hold">On Hold</option>
</select>
</div>
</div>
<div class="modal-footer flex-center">
<button type="reset" class="btn btn-light me-3" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-primary" id="submitBtn">
<span class="indicator-label">Assign Task</span>
<span class="indicator-progress">Please wait...
<span class="spinner-border spinner-border-sm align-middle ms-2"></span>
</span>
</button>
</div>
</form>
</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>
<!-- Flatpickr JS (Metronic Date Picker) -->
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<!-- Tagify JS -->
<script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
<!-- Tasks JS - ONLY ONCE -->
<script src="admin/js/tasks.js?v=<?php echo time(); ?>"></script>
<?php include 'includes/chat_widget.php'; ?>
</body>
</html>