« Back to History
yarn_entry_manage.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php /* yarn_entry_manage.php - Optimized with Cascading Color Selection */ header('X-Frame-Options: SAMEORIGIN'); error_reporting(E_ALL); ini_set('display_errors', 1); /* ----------------- bootstrap auth + db (ctx pattern) ----------------- */ if (file_exists(__DIR__ . '/modules/auth/page_acl.php')) { require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('yarn_entry_manage'); require_once __DIR__ . '/modules/activity/activity_logger.php'; $u = $ctx['user'] ?? null; $company_id = (int)($ctx['company_id'] ?? ($u['company_id'] ?? 0)); $pdo = $ctx['pdo'] ?? null; } else { require_once __DIR__ . '/modules/auth/auth.php'; require_login(); $u = auth_user(); $company_id = (int)($u['company_id'] ?? 0); $pdo = $GLOBALS['pdo'] ?? null; } if (!$pdo) { require __DIR__ . '/core/db.php'; $pdo = $GLOBALS['pdo'] ?? null; } $user_id = (int)($u['id'] ?? 0); /* ----------------- helpers ----------------- */ function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function q1(PDO $pdo,$sql,$p=[]){ $st=$pdo->prepare($sql); $st->execute($p); return $st->fetch(PDO::FETCH_ASSOC); } function qall(PDO $pdo,$sql,$p=[]){ $st=$pdo->prepare($sql); $st->execute($p); return $st->fetchAll(PDO::FETCH_ASSOC); } /* ---------- configuration ---------- */ $allowed_tables = [ 'yarn_in' => 'Yarn In', 'yarn_out' => 'Yarn Out', 'tpm_in' => 'TPM In', 'tpm_out' => 'TPM Out', 'tfo_in' => 'TFO In', 'tfo_out' => 'TFO Out', 'zari_in' => 'Zari In', 'zari_out' => 'Zari Out', ]; $allowed_edit_fields = ['txn_date','yarn_type','company','denier','color','boxes','weight','assign_to','remarks']; if (session_status() !== PHP_SESSION_ACTIVE) session_start(); if (empty($_SESSION['csrf_token'])) $_SESSION['csrf_token'] = bin2hex(random_bytes(16)); $csrf = $_SESSION['csrf_token']; /* ---------- handle update ---------- */ $errors = []; $success = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update') { if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { $errors[] = "Invalid CSRF token."; } else { $tbl = $_POST['tbl'] ?? ''; $id = (int)($_POST['id'] ?? 0); if (isset($allowed_tables[$tbl]) && $id > 0) { try { // Verify record belongs to this company $old_data = q1($pdo, "SELECT * FROM `$tbl` WHERE id = ? AND company_id = ?", [$id, $company_id]); if (!$old_data) throw new Exception("Record not found."); // Build SET clause only for allowed fields $set_parts = []; $params = []; foreach ($allowed_edit_fields as $f) { if (isset($_POST[$f])) { $val = trim($_POST[$f]) === '' ? null : trim($_POST[$f]); $set_parts[] = "`$f` = ?"; $params[] = $val; } } if (empty($set_parts)) throw new Exception("Nothing to update."); $params[] = $id; $params[] = $company_id; $sql = "UPDATE `$tbl` SET " . implode(', ', $set_parts) . " WHERE id = ? AND company_id = ? LIMIT 1"; $pdo->prepare($sql)->execute($params); activity_log([ 'company_id' => $company_id, 'user_id' => $user_id, 'module' => 'yarn', 'action_name' => 'edit', 'entity_type' => $tbl, 'entity_id' => $id, 'remarks' => 'Updated yarn entry record' ]); header("Location: " . basename($_SERVER['PHP_SELF']) . "?tbl=$tbl&msg=Successfully Updated"); exit; } catch (Exception $e) { $errors[] = "Update failed: " . $e->getMessage(); } } } } /* ---------- routing & data fetch ---------- */ $tbl = $_GET['tbl'] ?? 'yarn_out'; if (!isset($allowed_tables[$tbl])) $tbl = 'yarn_out'; $edit_id = (int)($_GET['edit'] ?? 0); $success = $_GET['msg'] ?? ''; // Pagination $page = max(1, (int)($_GET['page'] ?? 1)); $perPage = 50; $offset = ($page - 1) * $perPage; $f_comp = trim($_GET['f_company'] ?? ''); $where = " WHERE company_id = :cid "; $params = [':cid' => $company_id]; if ($f_comp) { $where .= " AND company LIKE :c "; $params[':c'] = "%$f_comp%"; } $total = (int)q1($pdo, "SELECT COUNT(*) as c FROM `$tbl` $where", $params)['c']; $rows = qall($pdo, "SELECT * FROM `$tbl` $where ORDER BY id DESC LIMIT $perPage OFFSET $offset", $params); $table_cols = array_column(qall($pdo, "DESCRIBE `$tbl`"), 'Field'); /* ---------- Edit Mode Data Preparation ---------- */ $record = null; $initial_options = ['yarn_type'=>[],'denier'=>[],'color'=>[],'assign_to'=>[]]; if ($edit_id > 0) { $record = q1($pdo, "SELECT * FROM `$tbl` WHERE id = ? AND company_id = ?", [$edit_id, $company_id]); if ($record) { foreach (array_keys($initial_options) as $col) { if (in_array($col, $table_cols)) { $res = qall($pdo, "SELECT DISTINCT `$col` as v FROM `$tbl` WHERE company = ? AND company_id = ? AND `$col` IS NOT NULL", [$record['company'], $company_id]); $initial_options[$col] = array_column($res, 'v'); } } } } require_once __DIR__ . '/partials/header.php'; ?> <div class="container-fluid py-4"> <div class="card shadow-sm border-0 mb-4"> <div class="card-body d-flex justify-content-between align-items-center"> <h4 class="fw-bold text-primary mb-0">Yarn Management: <?= h($allowed_tables[$tbl]) ?></h4> <form method="get" class="d-flex gap-2"> <select name="tbl" class="form-select w-auto" onchange="this.form.submit()"> <?php foreach($allowed_tables as $k=>$v): ?> <option value="<?= $k ?>" <?= $k===$tbl?'selected':'' ?>><?= $v ?></option> <?php endforeach; ?> </select> </form> </div> </div> <?php if($success): ?><div class="alert alert-success"><?= h($success) ?></div><?php endif; ?> <?php if($errors): ?><div class="alert alert-danger"><?= implode('<br>', $errors) ?></div><?php endif; ?> <?php if ($record): ?> <div class="card shadow border-0 mb-5"> <div class="card-header bg-primary text-white"><h5 class="mb-0">Edit Record #<?= $record['id'] ?></h5></div> <div class="card-body p-4"> <form method="post" id="yarn-edit-form"> <input type="hidden" name="action" value="update"><input type="hidden" name="tbl" value="<?=h($tbl)?>"> <input type="hidden" name="id" value="<?=h($record['id'])?>"><input type="hidden" name="csrf_token" value="<?=h($csrf)?>"> <div class="row g-3"> <div class="col-md-2"> <label class="form-label fw-bold small">Date</label> <input type="date" name="txn_date" class="form-control" value="<?= h(substr($record['txn_date'],0,10)) ?>"> </div> <div class="col-md-2"> <label class="form-label fw-bold small">Company</label> <select name="company" id="sel_company" class="form-select" required> <?php $comps = qall($pdo, "SELECT DISTINCT company FROM `$tbl` WHERE company_id = ?", [$company_id]); foreach($comps as $c): ?> <option value="<?=h($c['company'])?>" <?= $c['company']===$record['company']?'selected':'' ?>><?=h($c['company'])?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <label class="form-label fw-bold small">Yarn Type</label> <select name="yarn_type" id="sel_yarn_type" class="form-select" required> <?php foreach($initial_options['yarn_type'] as $o): ?> <option value="<?=h($o)?>" <?= $o===$record['yarn_type']?'selected':'' ?>><?=h($o)?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <label class="form-label fw-bold small">Denier</label> <select name="denier" id="sel_denier" class="form-select" required> <?php foreach($initial_options['denier'] as $o): ?> <option value="<?=h($o)?>" <?= $o===$record['denier']?'selected':'' ?>><?=h($o)?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <label class="form-label fw-bold small">Color</label> <select name="color" id="sel_color" class="form-select" required> <?php foreach($initial_options['color'] as $o): ?> <option value="<?=h($o)?>" <?= $o===$record['color']?'selected':'' ?>><?=h($o)?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <label class="form-label fw-bold small">Assign To</label> <select name="assign_to" id="sel_assign_to" class="form-select"> <option value="">-- Select --</option> <?php foreach($initial_options['assign_to'] as $o): ?> <option value="<?=h($o)?>" <?= $o===$record['assign_to']?'selected':'' ?>><?=h($o)?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <label class="form-label fw-bold small">Box</label> <input type="number" step="1" min="0" name="boxes" class="form-control" value="<?= h($record['boxes'] ?? '') ?>"> </div> <div class="col-md-2"> <label class="form-label fw-bold small">Weight</label> <input type="number" step="0.01" name="weight" class="form-control" value="<?= h($record['weight']) ?>"> </div> </div> <div class="mt-4"> <button type="submit" class="btn btn-primary px-4">Save Changes</button> <a href="?tbl=<?= $tbl ?>" class="btn btn-light border px-4">Cancel</a> </div> </form> </div> </div> <?php endif; ?> <div class="card shadow-sm border-0"> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead class="table-light"> <tr> <th>ID</th><th>Date</th><th>Company</th><th>Yarn</th><th>Denier</th><th>Color</th><th>Box</th><th>Weight</th><th>Action</th> </tr> </thead> <tbody> <?php foreach($rows as $r): ?> <tr> <td>#<?= $r['id'] ?></td> <td><?= h(substr($r['txn_date'],0,10)) ?></td> <td class="fw-bold"><?= h($r['company']) ?></td> <td><span class="badge bg-info text-dark"><?= h($r['yarn_type']) ?></span></td> <td><?= h($r['denier']) ?></td> <td><?= h($r['color'] ?? '-') ?></td> <td><?= h($r['boxes'] ?? '-') ?></td> <td><?= number_format($r['weight'],2) ?></td> <td><a href="?tbl=<?= $tbl ?>&edit=<?= $r['id'] ?>" class="btn btn-sm btn-outline-primary">Edit</a></td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </div> <script> // Cascading Dropdown Logic const updateSelect = (id, data, placeholder = "-- Select --") => { const el = document.getElementById(id); if(!el) return; el.innerHTML = `<option value="">${placeholder}</option>`; (data || []).forEach(v => { if(v) el.innerHTML += `<option value="${v}">${v}</option>`; }); }; // Company change hone par logic document.getElementById('sel_company')?.addEventListener('change', function() { const company = this.value; const tbl = "<?= $tbl ?>"; fetch(`/erp/ajax_table_options.php?tbl=${tbl}&company=${encodeURIComponent(company)}&action=get_all_options`) .then(r => r.json()) .then(json => { if(!json.ok) return; updateSelect('sel_yarn_type', json.data.yarn_type); updateSelect('sel_denier', json.data.denier); updateSelect('sel_color', []); // Denier select hone par hi color aayega }); }); // Denier change hone par specifically uske color fetch karna document.getElementById('sel_denier')?.addEventListener('change', function() { const company = document.getElementById('sel_company').value; const yarn_type = document.getElementById('sel_yarn_type').value; const denier = this.value; const tbl = "<?= $tbl ?>"; if(!denier) return; fetch(`/erp/ajax_table_options.php?tbl=${tbl}&company=${encodeURIComponent(company)}&yarn_type=${encodeURIComponent(yarn_type)}&denier=${encodeURIComponent(denier)}&action=get_colors`) .then(r => r.json()) .then(json => { if(json.ok) updateSelect('sel_color', json.data.color); }); }); </script> <?php require_once __DIR__ . '/partials/footer.php'; ?>