prepare(" SELECT * FROM projects WHERE id = ? AND client_id = ? "); $stmt->execute([$project_id, $_SESSION['client_id']]); $project = $stmt->fetch(); if (!$project) { header('Location: projects-list.php'); exit; } // If project is already Closed, no more edits if ($project['status'] === 'Closed') { header('Location: view-project.php?id=' . $project_id); exit; } $page_title = 'Edit Project'; $success = ''; $error = ''; // Get industries $industriesStmt = $pdo->query("SELECT industry_name, industry_code FROM industry_codes ORDER BY industry_name"); $industries = $industriesStmt->fetchAll(); // Get selection members stats (for close dialog info) $pendingMemberCount = 0; $completeMemberCount = 0; try { $stmt2 = $pdo->prepare(" SELECT SUM(CASE WHEN sm.sample_status = 'pending' THEN 1 ELSE 0 END) as pending_count, SUM(CASE WHEN sm.sample_status = 'complete' THEN 1 ELSE 0 END) as complete_count FROM selection_members sm JOIN project_selections ps ON sm.selection_id = ps.id WHERE ps.project_id = ? "); $stmt2->execute([$project_id]); $memberStats = $stmt2->fetch(); $pendingMemberCount = intval($memberStats['pending_count'] ?? 0); $completeMemberCount = intval($memberStats['complete_count'] ?? 0); } catch (Exception $e) { // Not critical } // Handle form submission if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_project'])) { $project_name = trim($_POST['project_name'] ?? ''); $client_reference = trim($_POST['client_reference'] ?? ''); $industry = $_POST['industry'] ?? ''; $deadline_date = $_POST['deadline_date'] ?? ''; $deadline_time = $_POST['deadline_time'] ?? ''; $eloi = intval($_POST['eloi'] ?? 0); $sample_size = intval($_POST['sample_size'] ?? 0); $description = trim($_POST['description'] ?? ''); $status = $_POST['status'] ?? $project['status']; $close_action = $_POST['close_action'] ?? ''; // accept_all or accept_complete_only // Validation if (empty($project_name) || empty($industry) || empty($deadline_date) || empty($deadline_time)) { $error = 'Please fill in all required fields.'; } elseif ($eloi <= 0 || $sample_size <= 0) { $error = 'eLOI and Sample Size must be greater than 0.'; } elseif (strlen($client_reference) > 16) { $error = 'Client reference must be 16 characters or less.'; } else { try { // Combine deadline date and time $deadline = $deadline_date . ' ' . $deadline_time . ':00'; // Track if status changed to Live $made_live_at = $project['made_live_at']; if ($status === 'Live' && $project['status'] !== 'Live') { $made_live_at = date('Y-m-d H:i:s'); } // ============================================================ // CLOSE PROJECT: Handle member status BEFORE updating project // ============================================================ $membersMarkedComplete = 0; if ($status === 'Closed' && $project['status'] !== 'Closed') { if ($close_action === 'accept_all') { // Mark ALL pending members as complete $updateMembers = $pdo->prepare(" UPDATE selection_members sm JOIN project_selections ps ON sm.selection_id = ps.id SET sm.sample_status = 'complete', sm.completed_at = NOW() WHERE ps.project_id = ? AND sm.sample_status = 'pending' "); $updateMembers->execute([$project_id]); $membersMarkedComplete = $updateMembers->rowCount(); error_log("Project $project_id closed: Marked $membersMarkedComplete pending members as complete (accept_all)"); } // 'accept_complete_only' = leave pending as-is, only reward already-complete } // Update project $updateStmt = $pdo->prepare(" UPDATE projects SET project_name = ?, client_reference = ?, industry = ?, deadline = ?, eloi = ?, sample_size = ?, description = ?, status = ?, made_live_at = ? WHERE id = ? AND client_id = ? "); $updateStmt->execute([ $project_name, $client_reference, $industry, $deadline, $eloi, $sample_size, $description, $status, $made_live_at, $project_id, $_SESSION['client_id'] ]); // Log activity (column is `details` not `description`) $closeDetail = ''; if ($status === 'Closed' && $project['status'] !== 'Closed') { $closeDetail = " Close action: $close_action. Members marked complete: $membersMarkedComplete."; } $logStmt = $pdo->prepare(" INSERT INTO project_activity_log (project_id, client_id, action, details, ip_address) VALUES (?, ?, 'updated', ?, ?) "); $logStmt->execute([ $project_id, $_SESSION['client_id'], "Updated project: $project_name. Status: $status.$closeDetail", $_SERVER['REMOTE_ADDR'] ?? 'unknown' ]); $success = 'Project updated successfully!'; // Refresh project data $stmt->execute([$project_id, $_SESSION['client_id']]); $project = $stmt->fetch(); // ============================================================ // CLOSE PROJECT: Process rewards AFTER member statuses updated // ============================================================ if ($status === 'Closed' && function_exists('processProjectCloseRewards')) { try { $panelPdo = getPanelDBConnection(); $rewardSummary = processProjectCloseRewards($project_id, $pdo, $panelPdo); $rewardMsg = ''; if ($membersMarkedComplete > 0) { $rewardMsg .= $membersMarkedComplete . ' pending member(s) accepted as complete. '; } if ($rewardSummary['members_rewarded'] > 0) { $rewardMsg .= $rewardSummary['members_rewarded'] . ' member(s) credited with survey rewards (' . number_format($rewardSummary['total_member_points'], 0) . ' pts). '; } if ($rewardSummary['affiliates_rewarded'] > 0) { $rewardMsg .= $rewardSummary['affiliates_rewarded'] . ' affiliate(s) credited ₹' . number_format($rewardSummary['total_affiliate_commission'], 2) . ' revenue share.'; } if (empty($rewardMsg)) { $rewardMsg = 'No reward-eligible completions found.'; } $success .= ' ' . $rewardMsg; if (!empty($rewardSummary['errors'])) { $error = 'Notes: ' . implode('; ', array_slice($rewardSummary['errors'], 0, 5)); } } catch (Exception $e) { error_log("Close project rewards error: " . $e->getMessage()); $error = 'Project closed but reward processing had an error: ' . $e->getMessage(); } } // If status changed to Live, redirect to view page if ($status === 'Live') { header('Location: view-project.php?id=' . $project_id); exit; } } catch (Exception $e) { error_log("Update project error: " . $e->getMessage()); $error = 'An error occurred while updating the project. Please try again.'; } } } include 'client-portal-header.php'; ?>

Edit Project

Update project details for

⚠️
Max 16 characters

⚠️ Important Note

Changing the status to "Closed" will prevent any further edits to this project.

Cancel