« Back to History
taka_va_receive_entry.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('taka_va_receive_entry'); $pdo = $ctx['pdo'] ?? null; $company_id = (int)($ctx['company_id'] ?? 0); $u = $ctx['user'] ?? null; require_once __DIR__ . '/partials/header.php'; if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } function get_financial_year($date) { $ts = strtotime($date); $y = (int)date('Y', $ts); $m = (int)date('m', $ts); return ($m >= 4) ? $y . '-' . substr((string)($y + 1), -2) : ($y - 1) . '-' . substr((string)$y, -2); } $errors = []; $success = ''; $edit_id = (int)($_GET['edit'] ?? 0); $edit_row = null; $challanStmt = $pdo->prepare(" SELECT t.challan_no, MAX(t.party_name) AS party_name, MAX(t.quality) AS quality, MAX(fq.quality_name) AS quality_name FROM taka_va_entry t LEFT JOIN fabric_quality_master fq ON fq.id = t.quality AND fq.company_id = t.company_id WHERE t.company_id = :cid GROUP BY t.challan_no ORDER BY t.challan_no DESC "); $challanStmt->execute([':cid' => $company_id]); $challanOptions = $challanStmt->fetchAll(PDO::FETCH_ASSOC); $quality_name_by_id = []; foreach ($challanOptions as $option) { $quality_name_by_id[(string)($option['quality'] ?? '')] = $option['quality_name'] ?? ''; } if ($edit_id > 0) { $editStmt = $pdo->prepare("SELECT * FROM taka_va_receive_entry WHERE id = :id AND company_id = :cid LIMIT 1"); $editStmt->execute([':id' => $edit_id, ':cid' => $company_id]); $edit_row = $editStmt->fetch(PDO::FETCH_ASSOC) ?: null; if (!$edit_row) { $errors[] = 'Receive entry not found for edit.'; $edit_id = 0; } } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $form_id = (int)($_POST['id'] ?? 0); if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) { $errors[] = 'Invalid CSRF token.'; } $receive_date = $_POST['receive_date'] ?? ''; $financial_year = $receive_date ? get_financial_year($receive_date) : ''; $challan_no = (int)($_POST['challan_no'] ?? 0); $party_name = ''; $quality = 0; $taka = (int)($_POST['taka'] ?? 0); $meters = (float)($_POST['meters'] ?? 0); $remark = trim($_POST['remark'] ?? ''); if (!$receive_date) $errors[] = 'Receive date required'; if (!$challan_no) $errors[] = 'Challan no required'; if ($taka <= 0) $errors[] = 'Taka must be > 0'; if (!$errors && $challan_no) { $chk = $pdo->prepare("SELECT party_name, quality FROM taka_va_entry WHERE company_id = :cid AND challan_no = :ch ORDER BY id DESC LIMIT 1"); $chk->execute([':cid' => $company_id, ':ch' => $challan_no]); $challanRow = $chk->fetch(PDO::FETCH_ASSOC); if (!$challanRow) { $errors[] = 'Challan no. not found'; } else { $party_name = trim((string)($challanRow['party_name'] ?? '')); $quality = (int)($challanRow['quality'] ?? 0); if ($party_name === '') $errors[] = 'Party name not found for selected challan'; if ($quality <= 0) $errors[] = 'Quality not found for selected challan'; } } if (!$errors) { try { if ($form_id > 0) { $stmt = $pdo->prepare(" UPDATE taka_va_receive_entry SET financial_year = :fy, receive_date = :receive_date, challan_no = :challan_no, party_name = :party_name, quality = :quality, taka = :taka, meters = :meters, remark = :remark WHERE id = :id AND company_id = :cid "); } else { $stmt = $pdo->prepare(" INSERT INTO taka_va_receive_entry (company_id, financial_year, receive_date, challan_no, party_name, quality, taka, meters, remark) VALUES (:cid, :fy, :receive_date, :challan_no, :party_name, :quality, :taka, :meters, :remark) "); } $params = [ ':cid' => $company_id, ':fy' => $financial_year, ':receive_date' => $receive_date, ':challan_no' => $challan_no, ':party_name' => $party_name, ':quality' => $quality, ':taka' => $taka, ':meters' => $meters, ':remark' => $remark, ]; if ($form_id > 0) { $params[':id'] = $form_id; } $stmt->execute($params); // Standardized activity log require_once __DIR__ . '/helpers/activity_helper.php'; log_activity([ 'activity_type' => 'entry', 'module_name' => 'taka_va_receive_entry', 'action_name' => $form_id > 0 ? 'update_save' : 'add_save', 'activity_note' => "Challan: $challan_no, Party: $party_name, Quality: $quality, Taka: $taka, Meters: $meters", 'reference_id' => $form_id > 0 ? $form_id : $pdo->lastInsertId(), ]); $success = $form_id > 0 ? 'Receive entry updated successfully!' : 'Receive entry saved successfully!'; $_POST = []; $edit_row = null; $edit_id = 0; } catch (PDOException $e) { if ($e->getCode() == 23000) { $errors[] = 'Duplicate challan for this financial year.'; } else { $errors[] = 'DB Error: ' . $e->getMessage(); } } } } $historyStmt = $pdo->prepare(" SELECT r.id, r.receive_date, r.financial_year, r.challan_no, r.party_name, r.quality, fq.quality_name, r.taka, r.meters, r.remark FROM taka_va_receive_entry r LEFT JOIN fabric_quality_master fq ON fq.id = r.quality AND fq.company_id = r.company_id WHERE r.company_id = :cid ORDER BY r.receive_date DESC, r.id DESC LIMIT 50 "); $historyStmt->execute([':cid' => $company_id]); $history_rows = $historyStmt->fetchAll(PDO::FETCH_ASSOC); $form_row = $edit_row ?: [ 'id' => 0, 'receive_date' => $_POST['receive_date'] ?? date('Y-m-d'), 'challan_no' => $_POST['challan_no'] ?? '', 'party_name' => $_POST['party_name'] ?? '', 'quality' => $_POST['quality'] ?? '', 'taka' => $_POST['taka'] ?? '', 'meters' => $_POST['meters'] ?? '', 'remark' => $_POST['remark'] ?? '', ]; ?> <div class="container mt-4"> <div class="card shadow-sm"> <div class="card-header" id="form-section"> <h5 class="mb-0"><?= $edit_row ? 'Edit Taka VA Receive Entry' : 'Taka VA Receive Entry' ?></h5> </div> <div class="card-body"> <?php if ($errors): ?> <div class="alert alert-danger"> <?php foreach ($errors as $e): ?> <div><?= htmlspecialchars($e) ?></div> <?php endforeach; ?> </div> <?php endif; ?> <?php if ($success): ?> <div class="alert alert-success"><?= $success ?></div> <?php endif; ?> <form method="post" class="row g-3"> <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> <input type="hidden" name="id" value="<?= (int)($form_row['id'] ?? 0) ?>"> <input type="hidden" name="financial_year" value="<?= htmlspecialchars(get_financial_year($form_row['receive_date'] ?? date('Y-m-d'))) ?>"> <div class="col-md-3"> <label class="form-label">Receive Date</label> <input type="date" name="receive_date" class="form-control" value="<?= htmlspecialchars((string)($form_row['receive_date'] ?? date('Y-m-d'))) ?>" required> </div> <div class="col-md-3"> <label class="form-label">Challan No</label> <input type="number" name="challan_no" id="challan_no" list="challanList" class="form-control" value="<?= htmlspecialchars((string)($form_row['challan_no'] ?? '')) ?>" required> <datalist id="challanList"> <?php foreach ($challanOptions as $ch): ?> <option value="<?= (int)$ch['challan_no'] ?>"></option> <?php endforeach; ?> </datalist> </div> <div class="col-md-3"> <label class="form-label">Party Name</label> <input type="text" id="party_name_text" class="form-control" value="<?= htmlspecialchars((string)($form_row['party_name'] ?? '')) ?>" readonly> <input type="hidden" name="party_name" id="party_name" value="<?= htmlspecialchars((string)($form_row['party_name'] ?? '')) ?>"> </div> <div class="col-md-3"> <label class="form-label">Quality</label> <input type="text" id="quality_text" class="form-control" value="<?= htmlspecialchars((string)($quality_name_by_id[(string)($form_row['quality'] ?? '')] ?? '')) ?>" readonly> <input type="hidden" name="quality" id="quality" value="<?= htmlspecialchars((string)($form_row['quality'] ?? '')) ?>"> </div> <div class="col-md-3"> <label class="form-label">Taka</label> <input type="number" name="taka" class="form-control" value="<?= htmlspecialchars((string)($form_row['taka'] ?? '')) ?>" required> </div> <div class="col-md-3"> <label class="form-label">Meters</label> <input type="number" step="0.01" name="meters" class="form-control" value="<?= htmlspecialchars((string)($form_row['meters'] ?? '')) ?>"> </div> <div class="col-md-6"> <label class="form-label">Remark</label> <input type="text" name="remark" class="form-control" value="<?= htmlspecialchars((string)($form_row['remark'] ?? '')) ?>"> </div> <div class="col-12 text-end"> <?php if ($edit_row): ?> <a href="taka_va_receive_entry.php" class="btn btn-outline-secondary">Cancel</a> <?php endif; ?> <button class="btn btn-success"><?= $edit_row ? 'Update Receive' : 'Save Receive' ?></button> </div> </form> </div> </div> <div class="card shadow-sm mt-4"> <div class="card-header"> <h5 class="mb-0">Recent History</h5> </div> <div class="card-body p-0"> <div class="table-responsive"> <table class="table table-striped table-hover mb-0 align-middle"> <thead class="table-light"> <tr> <th>Date</th> <th>Challan No</th> <th>Party</th> <th>Quality</th> <th class="text-end">Taka</th> <th class="text-end">Meters</th> <th>Remark</th> <th class="text-end">Action</th> </tr> </thead> <tbody> <?php if (!$history_rows): ?> <tr> <td colspan="8" class="text-center py-4 text-muted">No receive entries found.</td> </tr> <?php else: ?> <?php foreach ($history_rows as $row): ?> <tr> <td><?= htmlspecialchars((string)$row['receive_date']) ?></td> <td><?= (int)$row['challan_no'] ?></td> <td><?= htmlspecialchars((string)$row['party_name']) ?></td> <td><?= htmlspecialchars((string)($row['quality_name'] ?: ('#' . (int)$row['quality']))) ?></td> <td class="text-end"><?= number_format((int)$row['taka']) ?></td> <td class="text-end"><?= number_format((float)$row['meters'], 2) ?></td> <td><?= htmlspecialchars((string)$row['remark']) ?></td> <td class="text-end"> <a href="?edit=<?= (int)$row['id'] ?>#form-section" class="btn btn-sm btn-primary">Edit</a> </td> </tr> <?php endforeach; ?> <?php endif; ?> </tbody> </table> </div> </div> </div> </div> <script> const takaChallanMap = <?= json_encode(array_reduce($challanOptions, function($carry, $item) { $carry[(string)$item['challan_no']] = [ 'party_name' => $item['party_name'] ?? '', 'quality' => (string)($item['quality'] ?? ''), 'quality_name' => $item['quality_name'] ?? '' ]; return $carry; }, []), JSON_UNESCAPED_UNICODE) ?>; (function () { const challanInput = document.getElementById('challan_no'); const partyInput = document.getElementById('party_name'); const partyText = document.getElementById('party_name_text'); const qualityInput = document.getElementById('quality'); const qualityText = document.getElementById('quality_text'); if (!challanInput || !partyInput || !partyText || !qualityInput || !qualityText) { return; } function syncChallanDetails() { const val = String(challanInput.value || '').trim(); const data = takaChallanMap[val] || null; if (!data) { partyInput.value = ''; partyText.value = ''; qualityInput.value = ''; qualityText.value = ''; return; } partyInput.value = data.party_name || ''; partyText.value = data.party_name || ''; qualityInput.value = data.quality || ''; qualityText.value = data.quality_name || data.quality || ''; } challanInput.addEventListener('input', syncChallanDetails); challanInput.addEventListener('change', syncChallanDetails); syncChallanDetails(); })(); </script> <?php require_once __DIR__ . '/partials/footer.php'; ?>