« Back to History
candidates_manage.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php /* ============================================================================ File: /erp/candidates_manage.php Purpose: HR Main Page - Listing, Filters, and Quick Actions with Dynamic Location Share ============================================================================ */ require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('attendance_dashboard'); $pdo = $ctx['pdo']; $COMPANY_ID = (int)$ctx['company_id']; function j($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } // 1. Handle Quick Status Update if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update_status') { try { $status = $_POST['status']; $remark = isset($_POST['status_remark']) ? trim($_POST['status_remark']) : null; // Validation: Reject ke liye compulsory hai if ($status === 'Rejected' && empty($remark)) { throw new Exception("Candidate ko reject karne ke liye reason likhna zaroori hai."); } $stmt = $pdo->prepare("UPDATE job_applications SET application_status = ?, status_remark = ? WHERE id = ? AND company_id = ?"); $stmt->execute([$status, $remark, (int)$_POST['application_id'], $COMPANY_ID]); $message = "Status updated to " . j($status); } catch (Exception $e) { $error = $e->getMessage(); } } // 2. Fetch Data Optimized using JOINs with Current/Expected Salary & Company Details $sql = "SELECT ja.id as application_id, ja.candidate_id, ja.application_status, ja.status_remark, ja.applied_at, c.full_name, c.mobile, c.total_experience, c.current_salary, c.expected_salary, j.title as job_position, comp.name as company_name, comp.address as company_address, comp.location as company_location FROM job_applications ja LEFT JOIN candidates c ON ja.candidate_id = c.id LEFT JOIN jobs j ON ja.job_id = j.id LEFT JOIN companies comp ON ja.company_id = comp.id WHERE ja.company_id = ?"; $stmt = $pdo->prepare($sql); $stmt->execute([$COMPANY_ID]); $candidates = $stmt->fetchAll(PDO::FETCH_ASSOC); require_once __DIR__ . '/partials/header.php'; ?> <div class="container py-4"> <?php if (isset($message)): ?> <div class="alert alert-success"><?= $message ?></div> <?php endif; ?> <?php if (isset($error)): ?> <div class="alert alert-danger"><?= $error ?></div> <?php endif; ?> <table class="table table-hover align-middle"> <thead> <tr> <th>Candidate</th> <th>Mobile</th> <th>Position</th> <th>Experience</th> <th>Current Salary</th> <th>Expected Salary</th> <th>Status</th> <th>Action</th> </tr> </thead> <tbody> <?php if (!empty($candidates)): ?> <?php foreach ($candidates as $row): // Clean Mobile number for WhatsApp $clean_mobile = preg_replace('/[^0-9]/', '', $row['mobile'] ?? ''); if (strlen($clean_mobile) === 10) { $clean_mobile = '91' . $clean_mobile; } // Company Address aur Location fallback checks $comp_name = $row['company_name'] ?? 'Our Company'; $comp_address = !empty($row['company_address']) ? $row['company_address'] : 'Our office location'; $comp_location = !empty($row['company_location']) ? $row['company_location'] : ''; // Readymade Template Message with Dynamic Address & Map Link $whatsapp_msg = "Hello " . ($row['full_name'] ?? 'Candidate') . ",\n\n" . "We reviewed your application for the position of *" . ($row['job_position'] ?? 'Job') . "*.\n" . "We would love to invite you for an interview. Please let us know your availability.\n\n" . "*Interview Venue Details:*\n" . "🏢 Company: " . $comp_name . "\n" . "📍 Address: " . $comp_address . "\n"; if (!empty($comp_location)) { $whatsapp_msg .= "🗺️ Google Maps Link: " . $comp_location . "\n\n"; } else { $whatsapp_msg .= "\n"; } $whatsapp_msg .= "Regards,\nHR Team"; $wa_link = "https://wa.me/" . $clean_mobile . "?text=" . urlencode($whatsapp_msg); // Dynamic Badge Color Setup $badge_class = 'bg-secondary'; if ($row['application_status'] === 'Shortlisted') { $badge_class = 'bg-success'; // Green for Shortlist } elseif ($row['application_status'] === 'Rejected') { $badge_class = 'bg-danger'; // Red for Reject } ?> <tr> <td class="fw-bold"> <?= j($row['full_name'] ?? 'Unknown') ?> <?php if (!empty($row['status_remark'])): ?> <div class="small text-muted fw-normal mt-1" style="font-size: 0.85rem;"> <i class="fas fa-comment-alt text-secondary me-1"></i> <strong>Remark:</strong> <?= j($row['status_remark']) ?> </div> <?php endif; ?> </td> <td><?= j($row['mobile'] ?? '-') ?></td> <td><?= j($row['job_position'] ?? '-') ?></td> <td><?= j($row['total_experience'] ?? 'Fresher') ?> Yrs</td> <td class="text-secondary">₹<?= number_format((float)($row['current_salary'] ?? 0), 2) ?></td> <td class="fw-bold text-dark">₹<?= number_format((float)($row['expected_salary'] ?? 0), 2) ?></td> <td><span class="badge <?= $badge_class ?>"><?= j($row['application_status']) ?></span></td> <td> <div class="btn-group"> <a href="candidate_view.php?id=<?= (int)$row['candidate_id'] ?>" class="btn btn-sm btn-dark">View</a> <?php if (!empty($clean_mobile)): ?> <a href="<?= $wa_link ?>" target="_blank" class="btn btn-sm btn-success" title="Send WhatsApp Invite"> <i class="fab fa-whatsapp"></i> WhatsApp </a> <?php endif; ?> <?php if ($row['application_status'] === 'New'): ?> <form method="POST" class="d-inline" onsubmit="return handleStatusAction(this, 'Shortlisted', false);"> <input type="hidden" name="action" value="update_status"> <input type="hidden" name="application_id" value="<?= (int)$row['application_id'] ?>"> <input type="hidden" name="status" value="Shortlisted"> <input type="hidden" name="status_remark" class="status-remark-input"> <button class="btn btn-sm btn-outline-success">Shortlist</button> </form> <form method="POST" class="d-inline" onsubmit="return handleStatusAction(this, 'Rejected', true);"> <input type="hidden" name="action" value="update_status"> <input type="hidden" name="application_id" value="<?= (int)$row['application_id'] ?>"> <input type="hidden" name="status" value="Rejected"> <input type="hidden" name="status_remark" class="status-remark-input"> <button type="submit" class="btn btn-sm btn-outline-danger">Reject</button> </form> <?php endif; ?> </div> </td> </tr> <?php endforeach; ?> <?php else: ?> <tr><td colspan="8" class="text-center">Koi data nahi mila.</td></tr> <?php endif; ?> </tbody> </table> </div> <script> function handleStatusAction(form, statusType, isRequired) { let msg = isRequired ? "Candidate ko reject karne ka kya karan (Remark) hai? (Mandatory)" : "Candidate ko Shortlist karne ke liye koi detail ya remark likhna chahte hain? (Optional)"; let remark = prompt(msg); // Agar cancel click kiya if (remark === null) { return false; } remark = remark.trim(); // Agar reject kiya aur remark blank chhod diya if (isRequired && remark === "") { alert("Bina remark dale aap reject nahi kar sakte!"); return false; } // Hidden field me value push karenge form.querySelector('.status-remark-input').value = remark; return true; } </script> <?php require_once __DIR__ . '/partials/footer.php'; ?>