« Back to History
rapier_production_entry.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php // Rapier Production Entry — karigar fills machine-wise production details $__sess_dir = __DIR__ . '/tmp_sessions'; if (!is_dir($__sess_dir)) { @mkdir($__sess_dir, 0775, true); } @ini_set('session.save_path', $__sess_dir); if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } $u = $_SESSION['user'] ?? null; if (!$u) { header('Location: /erp/public/login.php?next=' . rawurlencode($_SERVER['REQUEST_URI'])); exit; } require_once __DIR__ . '/core/db.php'; $pdo = $GLOBALS['pdo'] ?? null; $company_id = (int)($u['company_id'] ?? 0); // Karigar auth $is_karigar = ($u['role'] ?? '') === 'karigar' || (int)($u['department_id'] ?? 0) === 20; if (!$is_karigar && $pdo && (int)($u['id'] ?? 0) > 0) { $st = $pdo->prepare("SELECT department_id FROM users WHERE id = ? LIMIT 1"); $st->execute([(int)$u['id']]); $is_karigar = ((int)$st->fetchColumn() === 20); } if (!$is_karigar) { require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('rapier_production_entry'); $pdo = $ctx['pdo'] ?? $pdo; $company_id = (int)($ctx['company_id'] ?? $company_id); $u = $ctx['user'] ?? $u; } // employee_id resolve $employee_id = (int)($u['employee_id'] ?? 0); if ($employee_id === 0 && (int)($u['id'] ?? 0) > 0 && $pdo) { $st = $pdo->prepare("SELECT employee_id FROM users WHERE id = ? LIMIT 1"); $st->execute([(int)$u['id']]); $employee_id = (int)$st->fetchColumn(); } if ($employee_id === 0) { $employee_id = (int)($u['id'] ?? 0); } function fmt_mc(string $code): string { if (preg_match('/\d+/', $code, $m)) { return 'R-' . str_pad($m[0], 2, '0', STR_PAD_LEFT); } return strtoupper($code); } // ── Filter params ──────────────────────────────────────────────────────────── $sel_date = $_GET['date'] ?? date('Y-m-d'); $sel_shift = $_GET['shift'] ?? (((int)date('H') >= 8 && (int)date('H') < 20) ? 'day' : 'night'); if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $sel_date)) { $sel_date = date('Y-m-d'); } $sel_shift = in_array($sel_shift, ['day','night']) ? $sel_shift : 'day'; // ── Fetch machines logged for this karigar on selected date+shift ───────────── $machines = []; if ($pdo) { $st = $pdo->prepare(" SELECT l.id AS log_id, l.machine_id, m.code, l.drop_pin, l.feeder_empty, l.weaf_error, l.servo_error, l.tension_error, l.material_meter, l.efficiency, l.pick, l.down_time, l.down_reason FROM rapier_machine_shift_log l JOIN machines m ON m.id = l.machine_id WHERE l.company_id = :cid AND l.employee_id = :eid AND l.date = :dt AND l.shift = :sh ORDER BY m.code "); $st->execute([':cid' => $company_id, ':eid' => $employee_id, ':dt' => $sel_date, ':sh' => $sel_shift]); $machines = $st->fetchAll(PDO::FETCH_ASSOC); } // ── POST: save production details ──────────────────────────────────────────── $save_ok = ''; $save_err = ''; $saved_ids = []; // log_ids that were saved this request if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_production'])) { $rows = $_POST['rows'] ?? []; if (!$pdo || empty($rows)) { $save_err = 'No data to save.'; } else { try { $upd = $pdo->prepare(" UPDATE rapier_machine_shift_log SET drop_pin = :drop_pin, feeder_empty = :feeder_empty, weaf_error = :weaf_error, servo_error = :servo_error, tension_error = :tension_error, material_meter = :material_meter, efficiency = :efficiency, pick = :pick, down_time = :down_time, down_reason = :down_reason WHERE id = :log_id AND company_id = :cid AND employee_id = :eid LIMIT 1 "); foreach ($rows as $log_id => $d) { $log_id = (int)$log_id; if ($log_id <= 0) continue; $upd->execute([ ':drop_pin' => max(0, (int)($d['drop_pin'] ?? 0)), ':feeder_empty' => max(0, (int)($d['feeder_empty'] ?? 0)), ':weaf_error' => max(0, (int)($d['weaf_error'] ?? 0)), ':servo_error' => max(0, (int)($d['servo_error'] ?? 0)), ':tension_error' => max(0, (int)($d['tension_error'] ?? 0)), ':material_meter' => max(0, (float)($d['material_meter'] ?? 0)), ':efficiency' => min(100, max(0, (float)($d['efficiency'] ?? 0))), ':pick' => max(0, (int)($d['pick'] ?? 0)), ':down_time' => max(0, (float)($d['down_time'] ?? 0)), ':down_reason' => substr(trim((string)($d['down_reason'] ?? '')), 0, 500), ':log_id' => $log_id, ':cid' => $company_id, ':eid' => $employee_id, ]); $saved_ids[] = $log_id; } $count = count($saved_ids); $save_ok = $count === 1 ? 'Machine saved!' : $count . ' machines saved!'; // Refresh machines data $st->execute([':cid' => $company_id, ':eid' => $employee_id, ':dt' => $sel_date, ':sh' => $sel_shift]); $machines = $st->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { $save_err = 'Error: ' . $e->getMessage(); } } } require_once __DIR__ . '/partials/header.php'; ?> <div class="container-fluid mt-3" style="max-width:900px;"> <!-- Page header --> <div class="card mb-3 border-0 shadow-sm"> <div class="card-body d-flex justify-content-between align-items-center py-3"> <div> <h5 class="mb-0 fw-bold">Production Entry</h5> <div class="text-muted small">Machine-wise shift details bharein</div> </div> <a href="rapier_karigar_dashboard.php" class="btn btn-sm btn-outline-secondary">← Back</a> </div> </div> <!-- Date + Shift filter --> <div class="card mb-3 border-0 shadow-sm"> <div class="card-body py-3"> <form method="GET" class="row g-2 align-items-end"> <div class="col-auto"> <label class="form-label small mb-1 fw-semibold">Date</label> <input type="date" name="date" class="form-control form-control-sm" value="<?= htmlspecialchars($sel_date) ?>" max="<?= date('Y-m-d') ?>"> </div> <div class="col-auto"> <label class="form-label small mb-1 fw-semibold">Shift</label> <select name="shift" class="form-select form-select-sm"> <option value="day" <?= $sel_shift==='day' ? 'selected' : '' ?>>☀ Day</option> <option value="night" <?= $sel_shift==='night' ? 'selected' : '' ?>>☾ Night</option> </select> </div> <div class="col-auto"> <button type="submit" class="btn btn-sm btn-primary">Load</button> </div> </form> </div> </div> <?php if ($save_ok): ?> <div class="alert alert-success py-2"><?= htmlspecialchars($save_ok) ?></div> <?php endif; ?> <?php if ($save_err): ?> <div class="alert alert-danger py-2"><?= htmlspecialchars($save_err) ?></div> <?php endif; ?> <?php if (empty($machines)): ?> <div class="card border-0 shadow-sm"> <div class="card-body text-center py-5"> <div style="font-size:2.5rem;">🚧</div> <h6 class="mt-3 mb-1">Is date/shift ke liye koi machine log nahi mili</h6> <p class="text-muted small mb-0"> Pehle dashboard se attendance mark karein, phir yahan details bharein. </p> <a href="rapier_karigar_dashboard.php" class="btn btn-sm btn-outline-primary mt-3">Dashboard pe jao</a> </div> </div> <?php else: ?> <?php foreach ($machines as $i => $mac): ?> <?php $lid = $mac['log_id']; $just_saved = in_array($lid, $saved_ids); ?> <!-- Individual machine form --> <form method="POST" action="?date=<?= urlencode($sel_date) ?>&shift=<?= urlencode($sel_shift) ?>" class="machine-form mb-3" data-lid="<?= $lid ?>"> <input type="hidden" name="save_production" value="1"> <div class="card border-0 shadow-sm <?= $just_saved ? 'border-success border-2' : '' ?>"> <!-- Machine header --> <div class="card-header fw-bold py-2 d-flex justify-content-between align-items-center <?= $just_saved ? 'bg-success text-white' : 'bg-primary text-white' ?>"> <span> <span class="badge bg-white <?= $just_saved ? 'text-success' : 'text-primary' ?> fs-6 me-2"> <?= htmlspecialchars(fmt_mc($mac['code'])) ?> </span> <?= htmlspecialchars($mac['code']) ?> </span> <?php if ($just_saved): ?> <span class="small">✓ Saved</span> <?php endif; ?> </div> <div class="card-body"> <div class="row g-3"> <!-- Pick --> <div class="col-6 col-md-3"> <label class="form-label small fw-semibold mb-1">Pick</label> <input type="number" name="rows[<?= $lid ?>][pick]" class="form-control form-control-sm" value="<?= (int)$mac['pick'] ?>" min="0"> </div> <!-- Material Meter --> <div class="col-6 col-md-3"> <label class="form-label small fw-semibold mb-1">Material Meter</label> <input type="number" step="0.01" name="rows[<?= $lid ?>][material_meter]" class="form-control form-control-sm" value="<?= number_format((float)$mac['material_meter'], 2, '.', '') ?>" min="0"> </div> <!-- Efficiency --> <div class="col-6 col-md-3"> <label class="form-label small fw-semibold mb-1">Efficiency (%)</label> <input type="number" step="0.01" name="rows[<?= $lid ?>][efficiency]" class="form-control form-control-sm" value="<?= number_format((float)$mac['efficiency'], 2, '.', '') ?>" min="0" max="100"> </div> <!-- Down Time --> <div class="col-6 col-md-3"> <label class="form-label small fw-semibold mb-1">Down Time (min)</label> <input type="number" step="0.01" name="rows[<?= $lid ?>][down_time]" class="form-control form-control-sm" value="<?= number_format((float)$mac['down_time'], 2, '.', '') ?>" min="0"> </div> <!-- Error counts --> <div class="col-6 col-md-2"> <label class="form-label small fw-semibold mb-1">Drop Pin</label> <input type="number" name="rows[<?= $lid ?>][drop_pin]" class="form-control form-control-sm" value="<?= (int)$mac['drop_pin'] ?>" min="0"> </div> <div class="col-6 col-md-2"> <label class="form-label small fw-semibold mb-1">Feeder Empty</label> <input type="number" name="rows[<?= $lid ?>][feeder_empty]" class="form-control form-control-sm" value="<?= (int)$mac['feeder_empty'] ?>" min="0"> </div> <div class="col-6 col-md-2"> <label class="form-label small fw-semibold mb-1">Weaf Error</label> <input type="number" name="rows[<?= $lid ?>][weaf_error]" class="form-control form-control-sm" value="<?= (int)$mac['weaf_error'] ?>" min="0"> </div> <div class="col-6 col-md-2"> <label class="form-label small fw-semibold mb-1">Servo Error</label> <input type="number" name="rows[<?= $lid ?>][servo_error]" class="form-control form-control-sm" value="<?= (int)$mac['servo_error'] ?>" min="0"> </div> <div class="col-6 col-md-2"> <label class="form-label small fw-semibold mb-1">Tension Error</label> <input type="number" name="rows[<?= $lid ?>][tension_error]" class="form-control form-control-sm" value="<?= (int)$mac['tension_error'] ?>" min="0"> </div> <!-- Down Reason --> <div class="col-12 col-md-8"> <label class="form-label small fw-semibold mb-1">Down Reason</label> <input type="text" name="rows[<?= $lid ?>][down_reason]" class="form-control form-control-sm" value="<?= htmlspecialchars($mac['down_reason']) ?>" placeholder="Agar machine band rahi to reason likhein..." maxlength="500"> </div> <!-- Individual Save button --> <div class="col-12 col-md-4 d-flex align-items-end"> <button type="submit" class="btn btn-outline-success w-100"> ✓ Save <?= htmlspecialchars(fmt_mc($mac['code'])) ?> </button> </div> </div> </div> </div> </form> <?php endforeach; ?> <!-- Save All button — collects all machine forms and submits together --> <div class="d-grid mb-4"> <button type="button" class="btn btn-success btn-lg" onclick="saveAll()"> ✓ Save All Machines </button> </div> <!-- /Save All --> <script> function saveAll() { const master = document.createElement('form'); master.method = 'POST'; master.action = '?date=<?= urlencode($sel_date) ?>&shift=<?= urlencode($sel_shift) ?>'; const addHidden = (name, val) => { const inp = document.createElement('input'); inp.type = 'hidden'; inp.name = name; inp.value = val; master.appendChild(inp); }; addHidden('save_production', '1'); // Collect all fields from every machine form document.querySelectorAll('.machine-form').forEach(form => { form.querySelectorAll('input[name^="rows["], textarea[name^="rows["]').forEach(el => { addHidden(el.name, el.value); }); }); document.body.appendChild(master); master.submit(); } </script> <?php endif; ?> </div> <script> // Focus pe value select ho jaye taaki directly type kar sake document.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('input[type=number]').forEach(el => { el.addEventListener('focus', function() { this.select(); }); }); }); </script> <?php require_once __DIR__ . '/partials/footer.php'; ?>