« Back to History
shift_master.php
|
20260721_154033.php
Initial Bulk Import
Copy Code
<?php require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('shift_master_manage'); $u = $ctx['user'] ?? null; $company_id = (int)($ctx['company_id'] ?? 0); $pdo = $ctx['pdo'] ?? null; $shiftInColumn = 'shift_in'; $shiftOutColumn = 'shift_out'; // ---------- CSRF ---------- if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // ---------- POST (ADD / UPDATE) ---------- if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) { die("Invalid CSRF token"); } $id = (int)($_POST['id'] ?? 0); $data = [ 'company_id' => $company_id, 'shift_code' => trim($_POST['shift_code'] ?? ''), 'shift_name' => trim($_POST['shift_name'] ?? ''), 'shift_in' => $_POST['shift_in'] ?? '', 'shift_out' => $_POST['shift_out'] ?? '', 'shift_hours' => (float)($_POST['shift_hours'] ?? 0), 'lunch_in' => $_POST['lunch_in'] ?? null, 'lunch_out' => $_POST['lunch_out'] ?? null, 'deduct_lunch' => $_POST['deduct_lunch'] ?? null, 'extra_day_hrs' => $_POST['extra_day_hrs'] ?? null, 'late_arrival_allow' => $_POST['late_arrival_allow'] ?? '', 'sms_delay' => $_POST['sms_delay'] ?? '', 'is_active' => (int)($_POST['is_active'] ?? 1), ]; if ($id > 0) { // UPDATE $sql = "UPDATE shift_master SET shift_code = :shift_code, shift_name = :shift_name, {$shiftInColumn} = :shift_in, {$shiftOutColumn} = :shift_out, shift_hours = :shift_hours, lunch_in = :lunch_in, lunch_out = :lunch_out, deduct_lunch = :deduct_lunch, extra_day_hrs = :extra_day_hrs, late_arrival_allow = :late_arrival_allow, sms_delay = :sms_delay, is_active = :is_active, updated_at = NOW() WHERE id = :id AND company_id = :company_id"; $data['id'] = $id; } else { // INSERT $sql = "INSERT INTO shift_master (company_id, shift_code, shift_name, {$shiftInColumn}, {$shiftOutColumn}, shift_hours, lunch_in, lunch_out, deduct_lunch, extra_day_hrs, late_arrival_allow, sms_delay, is_active, created_at) VALUES (:company_id, :shift_code, :shift_name, :shift_in, :shift_out, :shift_hours, :lunch_in, :lunch_out, :deduct_lunch, :extra_day_hrs, :late_arrival_allow, :sms_delay, :is_active, NOW())"; } $stmt = $pdo->prepare($sql); $stmt->execute($data); // REDIRECT (NO HEADER ERROR NOW) header("Location: shift_master.php"); exit; } // ---------- EDIT LOAD ---------- $edit = null; if (!empty($_GET['edit'])) { $stmt = $pdo->prepare("SELECT * FROM shift_master WHERE id = ? AND company_id = ?"); $stmt->execute([(int)$_GET['edit'], $company_id]); $edit = $stmt->fetch(PDO::FETCH_ASSOC); } // ---------- LIST ---------- $stmt = $pdo->prepare("SELECT * FROM shift_master WHERE company_id = ? ORDER BY id DESC"); $stmt->execute([$company_id]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // ---------- HEADER AFTER ALL LOGIC ---------- require_once __DIR__ . '/partials/header.php'; ?> <div class="container mt-4"> <!-- FORM --> <div class="card mb-4"> <div class="card-header"> <strong><?= $edit ? 'Edit Shift' : 'Add Shift' ?></strong> </div> <div class="card-body"> <form method="POST"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <input type="hidden" name="id" value="<?= $edit['id'] ?? '' ?>"> <div class="row"> <div class="col-md-2 mb-2"> <label>Code</label> <input type="text" name="shift_code" class="form-control" value="<?= htmlspecialchars($edit['shift_code'] ?? '') ?>" required> </div> <div class="col-md-3 mb-2"> <label>Name</label> <input type="text" name="shift_name" class="form-control" value="<?= htmlspecialchars($edit['shift_name'] ?? '') ?>" required> </div> <div class="col-md-2 mb-2"> <label>In Time</label> <input type="time" name="in_time" class="form-control" value="<?= $edit['in_time'] ?? '' ?>" required> </div> <div class="col-md-2 mb-2"> <label>Out Time</label> <input type="time" name="shift_out" class="form-control" value="<?= htmlspecialchars($edit['shift_out'] ?? '') ?>" required> </div> <div class="col-md-2 mb-2"> <label>Hours</label> <input type="number" step="0.01" name="shift_hours" class="form-control" value="<?= htmlspecialchars($edit['shift_hours'] ?? '') ?>" required> </div> <div class="col-md-2 mb-2"> <label>Lunch In</label> <input type="time" name="lunch_in" class="form-control" value="<?= htmlspecialchars($edit['lunch_in'] ?? '') ?>"> </div> <div class="col-md-2 mb-2"> <label>Lunch Out</label> <input type="time" name="lunch_out" class="form-control" value="<?= htmlspecialchars($edit['lunch_out'] ?? '') ?>"> </div> <div class="col-md-2 mb-2"> <label>Deduct Lunch</label> <input type="time" name="deduct_lunch" class="form-control" value="<?= htmlspecialchars($edit['deduct_lunch'] ?? '') ?>"> </div> <div class="col-md-2 mb-2"> <label>Extra Day Hrs</label> <input type="time" name="extra_day_hrs" class="form-control" value="<?= htmlspecialchars($edit['extra_day_hrs'] ?? '') ?>"> </div> <div class="col-md-2 mb-2"> <label>Late Arrival Allow</label> <input type="time" name="late_arrival_allow" class="form-control" value="<?= htmlspecialchars($edit['late_arrival_allow'] ?? '') ?>"> </div> <div class="col-md-2 mb-2"> <label>SMS Delay</label> <input type="time" name="sms_delay" class="form-control" value="<?= htmlspecialchars($edit['sms_delay'] ?? '') ?>"> </div> <div class="col-md-2 mb-2"> <label>Active</label> <select name="is_active" class="form-control"> <option value="1" <?= (!empty($edit) && $edit['is_active']==1)?'selected':'' ?>>Yes</option> <option value="0" <?= (!empty($edit) && $edit['is_active']==0)?'selected':'' ?>>No</option> </select> </div> </div> <button class="btn btn-primary mt-3"> <?= $edit ? 'Update' : 'Save' ?> </button> <?php if ($edit): ?> <a href="shift_master.php" class="btn btn-secondary mt-3">Cancel</a> <?php endif; ?> </form> </div> </div> <!-- LIST --> <div class="card"> <div class="card-header"> <strong>Shift List</strong> </div> <div class="card-body table-responsive"> <table class="table table-bordered table-sm"> <thead> <tr> <th>ID</th> <th>Code</th> <th>Name</th> <th>In</th> <th>Out</th> <th>Hours</th> <th>Lunch In</th> <th>Lunch Out</th> <th>Deduct Lunch</th> <th>Extra Day</th> <th>Late Allow</th> <th>SMS Delay</th> <th>Active</th> <th>Action</th> </tr> </thead> <tbody> <?php foreach ($rows as $r): ?> <tr> <td><?= htmlspecialchars($r['id'] ?? '') ?></td> <td><?= htmlspecialchars($r['shift_code'] ?? '') ?></td> <td><?= htmlspecialchars($r['shift_name'] ?? '') ?></td> <td><?= htmlspecialchars($r['shift_in'] ?? '') ?></td> <td><?= htmlspecialchars($r['shift_out'] ?? '') ?></td> <td><?= htmlspecialchars($r['shift_hours'] ?? '') ?></td> <td><?= htmlspecialchars($r['lunch_in'] ?? '') ?></td> <td><?= htmlspecialchars($r['lunch_out'] ?? '') ?></td> <td><?= htmlspecialchars($r['deduct_lunch'] ?? '') ?></td> <td><?= htmlspecialchars($r['extra_day_hrs'] ?? '') ?></td> <td><?= htmlspecialchars($r['late_arrival_allow'] ?? '') ?></td> <td><?= htmlspecialchars($r['sms_delay'] ?? '') ?></td> <td><?= !empty($r['is_active']) ? 'Yes' : 'No' ?></td> <td> <a href="?edit=<?= htmlspecialchars($r['id'] ?? '') ?>" class="btn btn-sm btn-warning">Edit</a> </td> </tr> <?php endforeach; ?> <?php if (empty($rows)): ?> <tr><td colspan="10" class="text-center">No data</td></tr> <?php endif; ?> </tbody> </table> </div> </div> </div> <?php require_once __DIR__ . '/partials/footer.php'; ?>