« Back to History
kasab_edit.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php /* ====================================================== File: /erp/kasab_edit.php Purpose: Edit Kasab Entry (Robust + Auto-balanced) ====================================================== */ require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('mesr_stock_entry'); $pdo = $ctx['pdo']; $company_id = (int)$ctx['company_id']; $id = isset($_GET['id']) ? (int)$_GET['id'] : 0; if ($id <= 0) { die("Invalid ID"); } /* ---- Fetch record safely ---- */ $stmt = $pdo->prepare(" SELECT * FROM kasab_entry WHERE id = ? AND company_id = ? "); $stmt->execute([$id, $company_id]); $data = $stmt->fetch(PDO::FETCH_ASSOC); if (!$data) { die("Entry Not Found"); } /* ---- Safe JSON decode ---- */ function safe_decode($json) { $raw = json_decode($json, true); if (!is_array($raw)) return []; if (isset($raw['rolls']) && is_array($raw['rolls'])) { return array_values($raw['rolls']); } if (isset($raw['weights']) && is_array($raw['weights'])) { return array_values($raw['weights']); } return array_values($raw); } $weightsArr = safe_decode($data['weight_json']); $rollsArr = safe_decode($data['rolls_json']); /* ====================================================== AUTO BALANCE LOGIC ====================================================== */ $weightCount = count($weightsArr); $rollCount = count($rollsArr); $rowCount = max($weightCount, $rollCount, 1); /* If rolls missing, repeat last roll */ if ($rollCount < $rowCount) { $lastRoll = $rollCount > 0 ? (int)$rollsArr[$rollCount - 1] : ''; for ($i = $rollCount; $i < $rowCount; $i++) { $rollsArr[$i] = $lastRoll; } } /* If weights missing, pad empty */ if ($weightCount < $rowCount) { for ($i = $weightCount; $i < $rowCount; $i++) { $weightsArr[$i] = ''; } } /* Trim extra */ $rollsArr = array_slice($rollsArr, 0, $rowCount); $weightsArr = array_slice($weightsArr, 0, $rowCount); // FIX: Removed double header inclusion require_once __DIR__ . '/partials/header.php'; ?> <div class="container py-4"> <div class="card shadow-sm border-0"> <div class="card-header bg-white py-3 d-flex justify-content-between align-items-center border-bottom"> <h4 class="mb-0 fw-bold text-primary"> <i class="bi bi-pencil-square me-2"></i>Edit Kasab Entry #<?= (int)$id ?> </h4> <a href="kasab_preview.php" class="btn btn-outline-secondary btn-sm shadow-sm"> <i class="bi bi-arrow-left"></i> Back </a> </div> <div class="card-body p-4"> <form id="updateKasabForm"> <input type="hidden" name="entry_id" value="<?= (int)$id ?>"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?? '' ?>"> <div class="row g-3 mb-4"> <div class="col-md-6"> <label class="form-label fw-bold text-muted small uppercase">Entry Date</label> <input type="date" name="entry_date" class="form-control form-control-lg border-2" value="<?= htmlspecialchars($data['entry_date']) ?>" required> </div> <div class="col-md-6"> <label class="form-label fw-bold text-muted small uppercase">Color</label> <input type="text" name="color" class="form-control form-control-lg border-2" placeholder="e.g. Red, Blue..." value="<?= htmlspecialchars($data['color']) ?>" required> </div> </div> <div class="table-responsive rounded-3 border"> <table class="table table-hover align-middle mb-0" id="edit_table"> <thead class="table-dark"> <tr> <th style="width:70px;" class="text-center">#</th> <th>Rolls</th> <th>Weight (kg)</th> <th style="width:80px;" class="text-center">Action</th> </tr> </thead> <tbody class="bg-white"> <?php for($i=0; $i<$rowCount; $i++): ?> <tr> <td class="idx text-center fw-bold text-secondary"><?= $i+1 ?></td> <td> <input type="number" name="rolls[]" class="form-control border-1" value="<?= htmlspecialchars($rollsArr[$i]) ?>" required> </td> <td> <input type="number" step="0.001" name="weights[]" class="form-control border-1" value="<?= htmlspecialchars($weightsArr[$i]) ?>" required> </td> <td class="text-center"> <button type="button" class="btn btn-sm btn-link text-danger delete-row-btn" title="Delete Row"> <i class="bi bi-trash3-fill fs-5"></i> </button> </td> </tr> <?php endfor; ?> </tbody> </table> </div> <div class="d-flex justify-content-between align-items-center mt-4 pt-3 border-top"> <button type="button" class="btn btn-dark px-4 shadow-sm" onclick="addRow()"> <i class="bi bi-plus-lg me-2"></i>Add New Row </button> <button type="submit" class="btn btn-primary px-5 py-2 shadow fw-bold"> <i class="bi bi-cloud-arrow-up-fill me-2"></i>Update Entry </button> </div> </form> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function(){ // Serial Number update karne ke liye function refreshRowNumbers(){ document.querySelectorAll('.idx').forEach((td, i) => { td.innerText = i + 1; }); } // Row delete button logic function attachDeleteRowHandlers() { document.querySelectorAll('.delete-row-btn').forEach(btn => { btn.onclick = function() { const tr = btn.closest('tr'); const tbody = tr.parentElement; if (tbody.rows.length > 1) { tr.remove(); refreshRowNumbers(); } else { alert('At least one entry is required.'); } }; }); } // Nayi row add karte waqt delete handler properly attach karne ke liye isko global format me handle karenge function syncRollInputs(value){ document.querySelectorAll('input[name="rolls[]"]').forEach(input => { input.value = value; }); } document.addEventListener('input', function(e){ if(e.target.matches('input[name="rolls[]"]')){ syncRollInputs(e.target.value); } }); // Nayi row add karne ke liye window.addRow = function(){ const tbody = document.querySelector('#edit_table tbody'); const firstRow = tbody.querySelector('tr'); if (!firstRow) return; const newRow = firstRow.cloneNode(true); const firstRollValue = firstRow.querySelector('input[name="rolls[]"]')?.value || ''; newRow.querySelectorAll('input[name="weights[]"]').forEach(input => input.value = ''); newRow.querySelectorAll('input[name="rolls[]"]').forEach(input => input.value = firstRollValue); tbody.appendChild(newRow); refreshRowNumbers(); attachDeleteRowHandlers(); // Nayi row ke delete button par function bind karne ke liye }; // Initial attach for delete buttons attachDeleteRowHandlers(); // AJAX Submission document.getElementById("updateKasabForm").addEventListener("submit", async function(e){ e.preventDefault(); const submitBtn = this.querySelector('button[type="submit"]'); const originalText = submitBtn.innerHTML; submitBtn.disabled = true; submitBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Updating...'; const fd = new FormData(this); try { const res = await fetch("save/update_kasab_data.php", { method: "POST", body: fd }); const data = await res.json(); if(data.success){ alert("Data Updated Successfully!"); window.location.href = "kasab_preview.php"; } else { alert("Error: " + (data.message || "Failed to update")); submitBtn.disabled = false; submitBtn.innerHTML = originalText; } } catch(err) { console.error(err); alert("Server Error. Please check database or network connection."); submitBtn.disabled = false; submitBtn.innerHTML = originalText; } }); }); </script> <?php require_once __DIR__ . '/partials/footer.php'; ?>