« Back to History
beam_stock_add.php
|
20260721_154032.php
Initial Bulk Import
Copy Code
<?php error_reporting(E_ALL); ini_set('display_errors', 1); /* ---------- AUTH ---------- */ require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('beam_stock_add'); $pdo = $ctx['pdo']; $COMPANY_ID = (int)$ctx['company_id']; $USER_ID = (int)$ctx['user']['id']; function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } /* ---------- WARPER LIST ---------- */ $st = $pdo->prepare(" SELECT id, name FROM company_employee_master WHERE company_id = ? AND is_active = 1 AND department_id = 22 ORDER BY name "); $st->execute([$COMPANY_ID]); $warpers = $st->fetchAll(PDO::FETCH_ASSOC); /* ---------- QUALITIES ---------- */ $st = $pdo->prepare(" SELECT id, name, tar, slot_pref FROM beam_qualities WHERE company_id = ? ORDER BY name "); $st->execute([$COMPANY_ID]); $qualities = $st->fetchAll(PDO::FETCH_ASSOC); /* ---------- SAVE ---------- */ $msg = $err = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $warp_date = $_POST['warp_date'] ?? ''; $warper_id = (int)($_POST['warper_id'] ?? 0); $quality_id = (int)($_POST['quality_id'] ?? 0); $beam_no = trim($_POST['beam_no'] ?? ''); $taka = (int)($_POST['taka'] ?? 0); // Always generate financial_year on backend $y = (int)date('Y', strtotime($warp_date ?: 'today')); $m = (int)date('m', strtotime($warp_date ?: 'today')); $financial_year = $m >= 4 ? $y . '-' . substr($y + 1, -2) : ($y - 1) . '-' . substr($y, -2); if (!$warp_date || !$warper_id || !$quality_id || !$beam_no || $taka <= 0) { $err = 'All required fields are mandatory.'; } else { // FY-based duplicate check for company_beam_stock $chk = $pdo->prepare(" SELECT id FROM company_beam_stock WHERE company_id = ? AND financial_year = ? AND beam_no = ? LIMIT 1 "); $chk->execute([$COMPANY_ID, $financial_year, $beam_no]); if ($chk->fetch()) { $err = 'Save failed. Beam No may already exist.'; } else { $qs = $pdo->prepare(" SELECT id, name, tar, slot_pref FROM beam_qualities WHERE company_id = ? AND id = ? LIMIT 1 "); $qs->execute([$COMPANY_ID, $quality_id]); $q = $qs->fetch(PDO::FETCH_ASSOC); if (!$q || !in_array($q['slot_pref'], ['Primary','Secondary'], true)) { $err = 'Invalid beam quality.'; } else { $beam_slot = strtolower($q['slot_pref']); $tar = (int)$q['tar']; $meter = $taka * 120; try { $pdo->beginTransaction(); /* beam_entry */ // FY-based duplicate check for beam_entry $chk2 = $pdo->prepare(" SELECT id FROM beam_entry WHERE company_id = ? AND financial_year = ? AND beam_no = ? LIMIT 1 "); $chk2->execute([$COMPANY_ID, $financial_year, $beam_no]); if ($chk2->fetch()) { throw new Exception('Save failed. Beam No may already exist.'); } $pdo->prepare(" INSERT INTO beam_entry ( company_id, employee_id, entry_date, financial_year, beam_no, quality_id, taka, meter, tar, created_by ) VALUES (?,?,?,?,?,?,?,?,?,?) ")->execute([ $COMPANY_ID, $warper_id, $warp_date, $financial_year, $beam_no, $quality_id, $taka, $meter, $tar, $USER_ID ]); /* ========================================= QUALITY DETAILS ========================================= */ $stQ = $pdo->prepare(" SELECT name, LOWER(slot_pref) AS slot_pref FROM beam_qualities WHERE id = ? LIMIT 1 "); $stQ->execute([$quality_id]); $qrow = $stQ->fetch(PDO::FETCH_ASSOC); $beam_slot = $qrow['slot_pref'] ?? ''; $beam_quality = $qrow['name'] ?? ''; /* ========================================= INSERT : company_beam_stock ========================================= */ $sql = " INSERT INTO company_beam_stock ( company_id, warp_date, beam_no, quality_id, beam_quality, beam_slot, taka, meter, tar, warper_id, beam_load_date, financial_year, load_type, created_at, updated_at ) VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?, 'stock', NOW(), NOW() ) "; $stmt = $pdo->prepare($sql); $stmt->execute([ $COMPANY_ID, // 1 $warp_date, // 2 $beam_no, // 3 $quality_id, // 4 $beam_quality, // 5 $beam_slot, // 6 $taka, // 7 $meter, // 8 $tar, // 9 $warper_id, // 10 $warp_date, // 11 $financial_year // 12 ]); $pdo->commit(); $msg = 'Beam stock entry saved successfully.'; } catch (Exception $e) { $pdo->rollBack(); $err = $e->getMessage(); } } } } } require_once __DIR__ . '/partials/header.php'; ?> <div class="container-fluid mt-4"> <div class="card shadow-sm"> <div class="card-body"> <h4 class="mb-4">Beam Stock Entry</h4> <?php if ($msg): ?> <div class="alert alert-success"><?=h($msg)?></div> <?php endif; ?> <?php if ($err): ?> <div class="alert alert-danger"><?=h($err)?></div> <?php endif; ?> <form method="post" class="row g-3"> <div class="col-md-3"> <label class="form-label">Warp Date</label> <input type="date" name="warp_date" class="form-control" value="<?=h(date('Y-m-d'))?>" required> </div> <div class="col-md-3"> <label class="form-label">Warper</label> <select name="warper_id" class="form-select" required> <option value="">Select…</option> <?php foreach ($warpers as $w): ?> <option value="<?=$w['id']?>"><?=h($w['name'])?></option> <?php endforeach; ?> </select> </div> <div class="col-md-3"> <label class="form-label">Quality</label> <select name="quality_id" id="quality" class="form-select" required> <option value="">Select…</option> <?php foreach ($qualities as $q): ?> <option value="<?=$q['id']?>" data-tar="<?=h($q['tar'])?>" data-slot="<?=h($q['slot_pref'])?>"> <?=h($q['name'])?> </option> <?php endforeach; ?> </select> </div> <div class="col-md-3"> <label class="form-label">FY</label> <?php $y = (int)date('Y'); $m = (int)date('m'); if ($m >= 4) { $fy_short = $y . '-' . substr($y+1, -2); } else { $fy_short = ($y-1) . '-' . substr($y, -2); } ?> <input type="text" name="fy" id="fy" class="form-control" value="<?=h($fy_short)?>" readonly required> </div> <script> function calcFY(dateStr) { if (!dateStr) return ''; const d = new Date(dateStr); let y = d.getFullYear(); let m = d.getMonth() + 1; if (isNaN(y)) { const now = new Date(); y = now.getFullYear(); m = now.getMonth() + 1; } if (m >= 4) { return y + '-' + String((y+1)).slice(-2); } else { return (y-1) + '-' + String(y).slice(-2); } } const warpDate = document.querySelector('input[name="warp_date"]'); const fyInput = document.getElementById('fy'); if (warpDate && fyInput) { warpDate.addEventListener('change', function() { fyInput.value = calcFY(this.value); }); } </script> <div class="col-md-3"> <label class="form-label">Beam Slot</label> <input type="text" id="beam_slot" class="form-control" readonly> </div> <div class="col-md-3"> <label class="form-label">Beam No</label> <input type="text" name="beam_no" class="form-control" required> </div> <div class="col-md-3"> <label class="form-label">Taka</label> <input type="number" name="taka" id="taka" class="form-control" min="1" required> </div> <div class="col-md-3"> <label class="form-label">Meter</label> <input type="number" id="meter" class="form-control" readonly> </div> <div class="col-md-3"> <label class="form-label">Tar</label> <input type="text" id="tar" class="form-control" readonly> </div> <div class="col-12"> <button class="btn btn-primary"> Save Beam Entry </button> </div> </form> </div> </div> </div> <script> const taka=document.getElementById('taka'); const meter=document.getElementById('meter'); taka.addEventListener('input',()=>{ meter.value = taka.value ? taka.value*120 : ''; }); const quality=document.getElementById('quality'); const tar=document.getElementById('tar'); const slot=document.getElementById('beam_slot'); quality.addEventListener('change',()=>{ const o = quality.selectedOptions[0]; tar.value = o?.dataset?.tar || ''; slot.value = o?.dataset?.slot || ''; }); </script> <?php require_once __DIR__ . '/partials/footer.php'; ?>