🚀 Release: CorePlan v1.0.2 Community Edition

This commit is contained in:
root
2026-08-26 11:16:37 +02:00
parent 1cdf339b25
commit 6d2345041d
5 changed files with 252 additions and 34 deletions
+54 -12
View File
@@ -7,7 +7,7 @@ function getProjectLimit() {
$parts = explode('.', $license);
if (count($parts) !== 2) return 3;
$payload = json_decode(base64_decode($parts[0]), true);
$secret = 'TESSMANN_COREPLAN_SECURE_2026_MASTER_KEY';
$secret = 'hierkoennteetwasgeheimesstehenwasnichtsofortjederverstehtabermankannesjaversuchenzuerraten';
$expectedSig = hash_hmac('sha256', $parts[0], $secret);
if (!hash_equals($expectedSig, $parts[1])) return 3;
if (isset($payload['expires']) && strtotime($payload['expires']) < time()) return 3;
@@ -19,15 +19,34 @@ function isPMorAdmin() { return in_array($_SESSION['role'] ?? '', ['admin', 'pm'
function handleGetProjects() {
global $pdo; @session_start();
if (!isset($_SESSION['user_id'])) { http_response_code(401); exit; }
$stmt = $pdo->query("
SELECT p.*, u.username as assigned_username,
(SELECT COUNT(*) FROM tasks WHERE project_id = p.id) as total_tasks,
(SELECT COUNT(*) FROM tasks WHERE project_id = p.id AND is_completed = 1) as completed_tasks
FROM projects p
LEFT JOIN users u ON p.assigned_to = u.id
ORDER BY CASE WHEN p.status = 'closed' THEN 1 WHEN p.status = 'canceled' THEN 2 ELSE 0 END, p.deadline ASC, p.id DESC
");
echo json_encode(['success' => true, 'data' => $stmt->fetchAll()]); exit;
$role = $_SESSION['role'] ?? 'user';
$userId = $_SESSION['user_id'];
// BUGFIX: Normale User sehen nur Projekte, die ihnen zugewiesen sind!
if ($role === 'admin' || $role === 'pm') {
$stmt = $pdo->query("
SELECT p.*, u.username as assigned_username,
(SELECT COUNT(*) FROM tasks WHERE project_id = p.id) as total_tasks,
(SELECT COUNT(*) FROM tasks WHERE project_id = p.id AND is_completed = 1) as completed_tasks
FROM projects p
LEFT JOIN users u ON p.assigned_to = u.id
ORDER BY CASE WHEN p.status = 'closed' THEN 1 WHEN p.status = 'canceled' THEN 2 ELSE 0 END, p.deadline ASC, p.id DESC
");
echo json_encode(['success' => true, 'data' => $stmt->fetchAll()]); exit;
} else {
$stmt = $pdo->prepare("
SELECT p.*, u.username as assigned_username,
(SELECT COUNT(*) FROM tasks WHERE project_id = p.id) as total_tasks,
(SELECT COUNT(*) FROM tasks WHERE project_id = p.id AND is_completed = 1) as completed_tasks
FROM projects p
LEFT JOIN users u ON p.assigned_to = u.id
WHERE p.assigned_to = ?
ORDER BY CASE WHEN p.status = 'closed' THEN 1 WHEN p.status = 'canceled' THEN 2 ELSE 0 END, p.deadline ASC, p.id DESC
");
$stmt->execute([$userId]);
echo json_encode(['success' => true, 'data' => $stmt->fetchAll()]); exit;
}
}
function handleCreateProject() {
@@ -102,6 +121,31 @@ function handleDeleteProject() {
echo json_encode(['success' => true]); exit;
}
// NEU: Backend für den Projekt Print Report
function handleGetProjectReport() {
global $pdo; @session_start();
if (!isset($_SESSION['user_id'])) { http_response_code(401); exit; }
$id = $_GET['id'] ?? 0;
// Projekt ziehen
$stmt = $pdo->prepare("SELECT p.*, u.username as assigned_username FROM projects p LEFT JOIN users u ON p.assigned_to = u.id WHERE p.id = ?");
$stmt->execute([$id]);
$project = $stmt->fetch();
if (!$project) { echo json_encode(['success' => false]); exit; }
// Tasks ziehen
$stmt = $pdo->prepare("SELECT t.*, u.username as assigned_username FROM tasks t LEFT JOIN users u ON t.assigned_to = u.id WHERE t.project_id = ? ORDER BY t.is_completed ASC, t.phase ASC, t.priority ASC");
$stmt->execute([$id]);
$tasks = $stmt->fetchAll();
// Alle Kommentare zu diesen Tasks ziehen
$stmt = $pdo->prepare("SELECT c.* FROM task_comments c JOIN tasks t ON c.task_id = t.id WHERE t.project_id = ? ORDER BY c.created_at ASC");
$stmt->execute([$id]);
$comments = $stmt->fetchAll();
echo json_encode(['success' => true, 'project' => $project, 'tasks' => $tasks, 'comments' => $comments]); exit;
}
function handleGetTasks() {
global $pdo; @session_start();
if (!isset($_SESSION['user_id'])) { http_response_code(401); exit; }
@@ -189,7 +233,6 @@ function handleGetMyArea() {
echo json_encode(['success' => true, 'projects' => $myProjects, 'tasks' => $myTasks]); exit;
}
// NEU: Task Notizen laden
function handleGetTaskComments() {
global $pdo; @session_start();
if (!isset($_SESSION['user_id'])) { http_response_code(401); exit; }
@@ -199,7 +242,6 @@ function handleGetTaskComments() {
echo json_encode(['success' => true, 'data' => $stmt->fetchAll()]); exit;
}
// NEU: Task Notiz hinzufügen
function handleAddTaskComment() {
global $pdo; @session_start();
if (!isset($_SESSION['user_id'])) { http_response_code(401); exit; }