« Back to History
yarn_master.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php error_reporting(E_ALL); ini_set('display_errors', 1); // Auth aur Context Pattern require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('yarn_master'); $pdo = $ctx['pdo']; $company_id = (int)$ctx['company_id']; // Helper for XSS protection function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } /* ================= SAVE / UPDATE LOGIC ================= */ // Pattern: Delete-then-Insert within a Transaction if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'save') { try { $pdo->beginTransaction(); $id = !empty($_POST['id']) ? (int)$_POST['id'] : null; // 1. Delete existing record if ID exists if ($id) { $del = $pdo->prepare("DELETE FROM yarn_master WHERE id = ? AND company_id = ?"); $del->execute([$id, $company_id]); } // 2. Insert as a new record (preserving ID if it was an update) $sql = "INSERT INTO yarn_master (id, company_id, denier, color, technical_name, assign, remark, is_active, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())"; $stmt = $pdo->prepare($sql); $stmt->execute([ $id, $company_id, $_POST['denier'] ?? '', // Supports "110 Lichi" $_POST['color'] ?? '', $_POST['technical_name'] ?? '', $_POST['assign'] ?? '', $_POST['remark'] ?? '', 1 // is_active status ]); $pdo->commit(); header("Location: yarn_master.php?msg=Success"); exit; } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); die("System Error: " . $e->getMessage()); } } /* ================= FETCH DATA ================= */ $stmt = $pdo->prepare("SELECT * FROM yarn_master WHERE company_id = ? ORDER BY id DESC"); $stmt->execute([$company_id]); $yarn_list = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Yarn Master | ERP</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> <style> body { background-color: #f4f7f6; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .master-card { background: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); padding: 25px; margin-bottom: 20px; } .table-container { background: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); overflow: hidden; } .form-label { font-weight: 600; color: #444; font-size: 0.9rem; } .btn-save { background-color: #2c3e50; color: white; border: none; padding: 10px 25px; } .btn-save:hover { background-color: #1a252f; color: white; } .badge-assign { background-color: #e8f4fd; color: #2980b9; border: 1px solid #d1e9f9; padding: 5px 10px; border-radius: 4px; font-size: 0.8rem; } </style> </head> <body class="p-4"> <div class="container-fluid"> <div class="d-flex justify-content-between align-items-center mb-4"> <h2 class="h4 mb-0 text-uppercase" style="letter-spacing: 1px;">Yarn Master</h2> <span class="text-muted small">Company ID: <?= $company_id ?></span> </div> <div class="master-card"> <form method="POST" id="yarnForm"> <input type="hidden" name="action" value="save"> <input type="hidden" name="id" id="yarn_id"> <div class="row g-3"> <div class="col-md-2"> <label class="form-label">Denier / Quality</label> <input type="text" name="denier" id="denier" class="form-control" placeholder="e.g. 110 Lichi" required> </div> <div class="col-md-2"> <label class="form-label">Color</label> <input type="text" name="color" id="color" class="form-control" placeholder="Color Name"> </div> <div class="col-md-3"> <label class="form-label">Technical Name</label> <input type="text" name="technical_name" id="technical_name" class="form-control" placeholder="Internal Code/Name"> </div> <div class="col-md-3"> <label class="form-label">Assign Mapping</label> <input type="text" name="assign" id="assign" class="form-control" placeholder="Rapier / Loom / Weft"> </div> <div class="col-md-2 d-flex align-items-end gap-2"> <button type="submit" class="btn btn-save w-100">SAVE</button> <button type="button" onclick="resetForm()" class="btn btn-outline-secondary">CLR</button> </div> <div class="col-md-12"> <label class="form-label">Remark</label> <input type="text" name="remark" id="remark" class="form-control" placeholder="Any additional notes..."> </div> </div> </form> </div> <div class="table-container"> <table class="table table-hover mb-0"> <thead class="table-dark"> <tr> <th width="80">ID</th> <th>Denier/Quality</th> <th>Color</th> <th>Technical Name</th> <th>Assign</th> <th>Remark</th> <th width="100" class="text-center">Action</th> </tr> </thead> <tbody class="bg-white"> <?php if (empty($yarn_list)): ?> <tr><td colspan="7" class="text-center p-5 text-muted">No yarn records found.</td></tr> <?php endif; ?> <?php foreach ($yarn_list as $row): ?> <tr> <td><code class="text-primary">#<?= h($row['id']) ?></code></td> <td class="fw-bold text-dark"><?= h($row['denier']) ?></td> <td><?= h($row['color']) ?></td> <td><?= h($row['technical_name']) ?></td> <td><span class="badge-assign"><?= h($row['assign']) ?></span></td> <td class="small text-muted"><?= h($row['remark']) ?></td> <td class="text-center"> <button class="btn btn-sm btn-outline-primary px-3" onclick='editRow(<?= json_encode($row) ?>)'>Edit</button> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> <script> // Form filling for Edit mode function editRow(data) { document.getElementById('yarn_id').value = data.id; document.getElementById('denier').value = data.denier; document.getElementById('color').value = data.color; document.getElementById('technical_name').value = data.technical_name; document.getElementById('assign').value = data.assign; document.getElementById('remark').value = data.remark; // Smooth scroll to top form window.scrollTo({ top: 0, behavior: 'smooth' }); // Highlight effect for the field document.getElementById('denier').focus(); } function resetForm() { document.getElementById('yarnForm').reset(); document.getElementById('yarn_id').value = ''; } </script> </body> </html>