« Back to History
jobs_manage.php
|
20260723_000646.php
Initial Domain Snapshot
Copy Code
<?php /* ============================================================================ File: /erp/jobs_manage.php Purpose: Job Openings Management (Add, Edit, Open/Close, Counts) ============================================================================ */ header('X-Frame-Options: SAMEORIGIN'); error_reporting(E_ALL); ini_set('display_errors', '1'); /* ================= AUTH & CONTEXT ================= */ require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('attendance_dashboard'); $pdo = $ctx['pdo']; $COMPANY_ID = (int)$ctx['company_id']; $u = $ctx['user'] ?? null; function j($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function money0($n){ return number_format((float)$n, 2, '.', ''); } $message = ''; $error = ''; /* ================= HANDLE FORM SUBMISSION (ADD / EDIT) ================= */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['action']) && ($_POST['action'] === 'save_job')) { try { $pdo->beginTransaction(); $job_id = !empty($_POST['job_id']) ? (int)$_POST['job_id'] : null; $job_code = trim($_POST['job_code']); $title = trim($_POST['position']); // Form input field 'position' ko DB column 'title' me save kar rahe hain $department = trim($_POST['department']); $vacancies = isset($_POST['vacancies']) ? (int)$_POST['vacancies'] : 1; $status = trim($_POST['status']); if (empty($job_code) || empty($title)) { throw new Exception("Job Code aur Position Name zaroori hain."); } if ($job_id) { // EDIT JOB - Exact Database Columns used here $stmt = $pdo->prepare("UPDATE jobs SET job_code = ?, title = ?, department = ?, vacancies = ?, status = ? WHERE id = ? AND company_id = ?"); $stmt->execute([$job_code, $title, $department, $vacancies, $status, $job_id, $COMPANY_ID]); $message = "Job successfully update ho gayi."; } else { // ADD NEW JOB - Exact Database Columns used here $stmt = $pdo->prepare("INSERT INTO jobs (company_id, job_code, title, department, vacancies, status) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$COMPANY_ID, $job_code, $title, $department, $vacancies, $status]); $message = "Nayi Job successfully add ho gayi."; } $pdo->commit(); } catch (Exception $e) { $pdo->rollBack(); $error = "Error: " . $e->getMessage(); } } // TOGGLE STATUS if (isset($_POST['action']) && $_POST['action'] === 'toggle_status') { try { $job_id = (int)$_POST['toggle_job_id']; $current_status = $_POST['current_status']; $new_status = ($current_status === 'Open') ? 'Closed' : 'Open'; $stmt = $pdo->prepare("UPDATE jobs SET status = ? WHERE id = ? AND company_id = ?"); $stmt->execute([$new_status, $job_id, $COMPANY_ID]); $message = "Job status successfully badal gaya."; } catch (Exception $e) { $error = "Status update nahi ho paya: " . $e->getMessage(); } } } /* ================= FETCH ALL JOBS WITH APPLICANTS COUNT ================= */ try { $query = " SELECT j.*, (SELECT COUNT(ja.id) FROM job_applications ja WHERE ja.job_id = j.id) as applicants_count FROM jobs j WHERE j.company_id = ? ORDER BY j.id DESC "; $stmt = $pdo->prepare($query); $stmt->execute([$COMPANY_ID]); $jobs = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { $error = "Database Error: " . $e->getMessage(); $jobs = []; } /* ================= HEADER ================= */ require_once __DIR__ . '/partials/header.php'; ?> <div class="container-fluid py-4"> <div class="d-flex justify-content-between align-items-center mb-4"> <h4 class="mb-0 fw-bold text-uppercase text-dark">Job Openings Management</h4> <button type="button" class="btn btn-primary btn-sm px-4 fw-bold" onclick="openAddModal()"> <i class="bi bi-plus-lg me-1"></i> Add New Job </button> </div> <?php if (!empty($message)): ?> <div class="alert alert-success alert-dismissible fade show border-0 shadow-sm" role="alert"> <i class="bi bi-check-circle-fill me-2"></i> <?= j($message) ?> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> <?php endif; ?> <?php if (!empty($error)): ?> <div class="alert alert-danger alert-dismissible fade show border-0 shadow-sm" role="alert"> <i class="bi bi-exclamation-triangle-fill me-2"></i> <?= j($error) ?> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> <?php endif; ?> <div class="card shadow-sm border-0"> <div class="card-body p-0"> <div class="table-responsive"> <table class="table table-hover align-middle mb-0 text-nowrap"> <thead class="table-light"> <tr> <th class="ps-4">Job Code</th> <th>Position</th> <th>Department</th> <th class="text-center">Vacancies</th> <th class="text-center">Status</th> <th class="text-center">Applicants</th> <th class="text-end pe-4">Action</th> </tr> </thead> <tbody> <?php if (empty($jobs)): ?> <tr> <td colspan="7" class="text-center py-5 text-muted fw-bold">Koi active job openings nahi mili.</td> </tr> <?php else: ?> <?php foreach ($jobs as $job): ?> <tr> <td class="ps-4 fw-semibold text-secondary"><?= j($job['job_code']) ?></td> <td class="fw-bold text-dark"><?= j($job['title'] ?? '-') ?></td> <td><?= j($job['department'] ?: '-') ?></td> <td class="text-center fw-bold text-primary"><?= (int)$job['vacancies'] ?></td> <td class="text-center"> <span class="badge rounded-pill px-3 py-2 <?= $job['status'] === 'Open' ? 'bg-success text-white' : 'bg-danger text-white' ?>"> <?= j($job['status']) ?> </span> </td> <td class="text-center"> <span class="badge bg-light text-dark border px-3 py-2 fw-bold"> <?= (int)$job['applicants_count'] ?> </span> </td> <td class="text-end pe-4"> <div class="d-inline-flex gap-2"> <form method="POST" class="m-0"> <input type="hidden" name="action" value="toggle_status"> <input type="hidden" name="toggle_job_id" value="<?= (int)$job['id'] ?>"> <input type="hidden" name="current_status" value="<?= j($job['status']) ?>"> <button type="submit" class="btn btn-sm <?= $job['status'] === 'Open' ? 'btn-outline-danger' : 'btn-outline-success' ?>" title="Change Status"> <i class="bi <?= $job['status'] === 'Open' ? 'bi-toggle-on' : 'bi-toggle-off' ?>"></i> Status </button> </form> <button type="button" class="btn btn-sm btn-outline-primary" onclick="openEditModal(<?= j(json_encode($job)) ?>)" title="Edit Job"> <i class="bi bi-pencil-square"></i> Edit </button> </div> </td> </tr> <?php endforeach; ?> <?php endif; ?> </tbody> </table> </div> </div> </div> </div> <div class="modal fade" id="jobModal" data-bs-backdrop="static" tabindex="-1" aria-labelledby="jobModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content border-0 shadow"> <div class="modal-header bg-dark text-white"> <h5 class="modal-title text-uppercase fw-bold fs-6" id="jobModalLabel">Add New Job</h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <form method="POST" id="jobForm" autocomplete="off"> <div class="modal-body p-4"> <input type="hidden" name="action" value="save_job"> <input type="hidden" name="job_id" id="job_id"> <div class="row g-3"> <div class="col-md-6"> <label class="form-label fw-semibold text-secondary">Job Code <span class="text-danger">*</span></label> <input type="text" class="form-control" name="job_code" id="job_code" placeholder="e.g. MM-TEX-01" required> </div> <div class="col-md-6"> <label class="form-label fw-semibold text-secondary">Department</label> <input type="text" class="form-control" name="department" id="department" placeholder="e.g. Weaving / HR"> </div> <div class="col-12"> <label class="form-label fw-semibold text-secondary">Position Name <span class="text-danger">*</span></label> <input type="text" class="form-control" name="position" id="position" placeholder="e.g. Master Weaver / Supervisor" required> </div> <div class="col-md-6"> <label class="form-label fw-semibold text-secondary">No. of Vacancies</label> <input type="number" class="form-control" name="vacancies" id="vacancies" min="1" value="1" required> </div> <div class="col-md-6"> <label class="form-label fw-semibold text-secondary">Status</label> <select class="form-select" name="status" id="status"> <option value="Open">Open</option> <option value="Closed">Closed</option> </select> </div> </div> </div> <div class="modal-footer bg-light p-3"> <button type="button" class="btn btn-secondary btn-sm px-3" data-bs-dismiss="modal">Cancel</button> <button type="submit" class="btn btn-primary btn-sm px-4">Save Job</button> </div> </form> </div> </div> </div> <script> let jobModal; document.addEventListener('DOMContentLoaded', function() { const modalEl = document.getElementById('jobModal'); if(modalEl) { jobModal = new bootstrap.Modal(modalEl); } }); function openAddModal() { document.getElementById('jobModalLabel').innerText = "Add New Job"; document.getElementById('jobForm').reset(); document.getElementById('job_id').value = ""; document.getElementById('status').value = "Open"; if(jobModal) jobModal.show(); } function openEditModal(job) { document.getElementById('jobModalLabel').innerText = "Edit Job Details"; document.getElementById('jobForm').reset(); document.getElementById('job_id').value = job.id; document.getElementById('job_code').value = job.job_code; document.getElementById('position').value = job.title; // DB column 'title' mapped back to form document.getElementById('department').value = job.department; document.getElementById('vacancies').value = job.vacancies; document.getElementById('status').value = job.status; if(jobModal) jobModal.show(); } </script> <?php /* ================= FOOTER ================= */ require_once __DIR__ . '/partials/footer.php'; ?>