« Back to History
gray_receive_entry.php
|
20260721_154032.php
Initial Bulk Import
Copy Code
<?php ob_start(); require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('gray_receive_entry'); $pdo = $ctx['pdo']; $company_id = (int)$ctx['company_id']; $success = isset($_GET['success']); $last_date = $_GET['last_date'] ?? ''; $inserted_id = $_GET['id'] ?? ''; // ===== HELPER: GET FINANCIAL YEAR ===== function get_financial_year($date) { $ts = strtotime($date); $y = (int)date('Y', $ts); $m = (int)date('m', $ts); return ($m >= 4) ? $y . '-' . substr(($y + 1), -2) : ($y - 1) . '-' . substr($y, -2); } // ===== LOGIC: GET NEXT SERIAL GRAY_ID ===== $next_gray_id = 1; try { // Is saal ka max gray_id nikalna (Sequence barkaraar rakhne ke liye) $st_gid = $pdo->prepare("SELECT MAX(gray_id) FROM gray_receive WHERE company_id = :cid"); $st_gid->execute([':cid' => $company_id]); $max_gid = (int)$st_gid->fetchColumn(); $next_gray_id = $max_gid + 1; } catch(Exception $e) {} // ===== POST PROCESSING ===== if ($_SERVER['REQUEST_METHOD'] === 'POST') { $raw_date = $_POST['rec_date'] ?? ''; $d = DateTime::createFromFormat('d-m-Y', $raw_date); $rec_date = $d ? $d->format('Y-m-d') : date('Y-m-d'); $fy = get_financial_year($rec_date); $finish_mts = (float)($_POST['finish_mts'] ?? 0); $grey_mts = (float)($_POST['grey_mts'] ?? 0); $shortage = (float)($grey_mts - $finish_mts); $shortage_pct = ($grey_mts > 0) ? ($shortage / $grey_mts) * 100 : 0; try { $pdo->beginTransaction(); // 1. Phir se check karein (Transaction ke andar) taaki double entry na ho $st_gid = $pdo->prepare("SELECT MAX(gray_id) FROM gray_receive WHERE company_id = :cid FOR UPDATE"); $st_gid->execute([':cid' => $company_id]); $final_gray_id = (int)$st_gid->fetchColumn() + 1; // 2. Insert into gray_receive $stmt = $pdo->prepare(" INSERT INTO gray_receive (company_id, gray_id, mill_id, gpno, rec_date, financial_year, quality_id, grey_mts, taka, finish_mts, shortage, shortage_pct, remark, status) VALUES (:cid, :grid, :mill_id, :gpno, :date, :fy, :quality_id, :grey, :taka, :finish, :sh, :sh_pct, :remark, 'open') "); $stmt->execute([ ':cid' => $company_id, ':grid' => $final_gray_id, // Manual sequence number ':mill_id' => $_POST['mill_id'], ':gpno' => $_POST['gpno'], ':date' => $rec_date, ':fy' => $fy, ':quality_id' => $_POST['quality_id'], ':grey' => $grey_mts, ':taka' => $_POST['taka'], ':finish' => $finish_mts, ':sh' => $shortage, ':sh_pct' => $shortage_pct, ':remark' => $_POST['remark'] ?? '' ]); $receive_id = $pdo->lastInsertId(); // Standardized activity log require_once __DIR__ . '/helpers/activity_helper.php'; log_activity([ 'activity_type' => 'entry', 'module_name' => 'gray_receive_entry', 'action_name' => 'add_save', 'activity_note' => "Mill: {$_POST['mill_id']}, GP No: {$_POST['gpno']}, Quality: {$_POST['quality_id']}, Grey MTS: $grey_mts, Finish MTS: $finish_mts, Taka: {$_POST['taka']}, Remark: {$_POST['remark']}", 'reference_id' => $receive_id, ]); $pdo->commit(); header("Location: gray_receive_entry.php?success=1&id=$receive_id&last_date=" . urlencode($raw_date)); exit(); } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); die("System Error: " . $e->getMessage()); } } require_once __DIR__ . '/partials/header.php'; // Fetch Masters $mills = $pdo->prepare("SELECT id, mill_name FROM mill_master WHERE company_id = ? AND is_active = 1 ORDER BY mill_name"); $mills->execute([$company_id]); $mills = $mills->fetchAll(PDO::FETCH_ASSOC); $qualities = $pdo->prepare("SELECT id, quality_name FROM fabric_quality_master WHERE company_id = ? AND is_active = 1 ORDER BY quality_name"); $qualities->execute([$company_id]); $qualities = $qualities->fetchAll(PDO::FETCH_ASSOC); ?> <div class="container-fluid mt-3"> <div class="card p-3 shadow-sm border-0"> <div class="d-flex justify-content-between align-items-center mb-3"> <h5 class="m-0 text-primary fw-bold">Gray Receive Entry</h5> <div class="text-end"> <span class="badge bg-info text-dark border">Next Gray ID: <?= $next_gray_id ?></span> </div> </div> <?php if($success): ?> <div class="alert alert-success alert-dismissible fade show border-0 shadow-sm py-2"> <strong>Success!</strong> Entry Saved with System ID: <?= htmlspecialchars($inserted_id) ?> <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <form method="POST" id="entryForm" autocomplete="off"> <div class="row g-3"> <div class="col-md-3"> <label class="form-label small fw-bold">Mill Name</label> <select id="mill_id" name="mill_id" required> <option value="">Select Mill</option> <?php foreach($mills as $m): ?> <option value="<?= $m['id'] ?>"><?= htmlspecialchars($m['mill_name']) ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <label class="form-label small fw-bold">GP No</label> <input type="text" name="gpno" class="form-control" required> </div> <div class="col-md-2"> <label class="form-label small fw-bold">Date</label> <input type="text" id="rec_date" name="rec_date" class="form-control" value="<?= htmlspecialchars($last_date) ?>" required> </div> <div class="col-md-3"> <label class="form-label small fw-bold">Quality</label> <select id="quality_id" name="quality_id" required> <option value="">Select Quality</option> <?php foreach($qualities as $q): ?> <option value="<?= $q['id'] ?>"><?= htmlspecialchars($q['quality_name']) ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <label class="form-label small fw-bold">Grey MTS</label> <input type="number" step="0.01" name="grey_mts" class="form-control text-primary fw-bold" required> </div> <div class="col-md-1"> <label class="form-label small fw-bold">Taka</label> <input type="number" name="taka" class="form-control text-center" required> </div> <div class="col-md-2"> <label class="form-label small fw-bold">Finish MTS</label> <input type="number" step="0.01" name="finish_mts" class="form-control text-success fw-bold" required> </div> <div class="col-md-4"> <label class="form-label small fw-bold">Remark</label> <input type="text" name="remark" class="form-control"> </div> <div class="col-md-3 d-flex align-items-end"> <button type="submit" id="saveBtn" class="btn btn-primary w-100 fw-bold">SAVE ENTRY</button> </div> </div> </form> </div> </div> <link href="https://cdn.jsdelivr.net/npm/tom-select/dist/css/tom-select.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/tom-select/dist/js/tom-select.complete.min.js"></script> <script> const tsMill = new TomSelect("#mill_id", { create: false }); const tsQuality = new TomSelect("#quality_id", { create: false }); const dateInp = document.getElementById('rec_date'); if(!dateInp.value) { const d = new Date(); dateInp.value = String(d.getDate()).padStart(2,'0')+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+d.getFullYear(); } const inputs = Array.from(document.querySelectorAll('#entryForm input, #entryForm select, #entryForm button')); inputs.forEach((input, i) => { input.addEventListener('keydown', (e) => { if (e.key === 'Enter') { if (input.tomselect && input.tomselect.isOpen) return; e.preventDefault(); const next = inputs[i + 1]; if (next) next.focus(); } }); }); window.onload = () => setTimeout(() => tsMill.focus(), 200); </script> <?php require_once __DIR__ . '/partials/footer.php'; ob_end_flush(); ?>