« Back to History
warper_beam_entry.php
|
20260721_154033.php
Initial Bulk Import
Copy Code
<?php /* ====================================================================== FILE: /erp/public/warper_beam_entry.php PURPOSE: Warper-only Beam Entry (STRICT dept_id=22) FIXED: Financial Year based Beam No & Auto-link User ====================================================================== */ error_reporting(E_ALL); ini_set('display_errors', 1); /* =================== A) DB bootstrap ===================== */ $pdo = $pdo ?? null; if (!$pdo instanceof PDO) { $dbfile = __DIR__.'/../core/db.php'; if (is_file($dbfile)) require_once $dbfile; if (!$pdo instanceof PDO && isset($GLOBALS['pdo']) && $GLOBALS['pdo'] instanceof PDO) $pdo = $GLOBALS['pdo']; } if (!$pdo instanceof PDO) { http_response_code(500); echo 'DB not connected'; exit; } /* =================== B) Auth ===================== */ $auth = __DIR__.'/../modules/auth/auth.php'; if (is_file($auth) && !function_exists('users_table_columns')) require_once $auth; $u = function_exists('auth_user') ? auth_user() : []; if ((!$u || empty($u['id'])) && function_exists('require_login')) { require_login(); $u = function_exists('auth_user') ? auth_user() : []; } $company_id = (int)($u['company_id'] ?? 0); $user_id = (int)($u['id'] ?? 0); $user_name = (string)($u['name'] ?? ''); if ($company_id<=0 || $user_id<=0) { http_response_code(401); exit('Unauthorized'); } /* =================== C) Helpers ===================== */ function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function postv($k,$d=null){ return isset($_POST[$k]) ? (is_string($_POST[$k])?trim($_POST[$k]):$_POST[$k]) : $d; } function getv ($k,$d=null){ return isset($_GET[$k]) ? (is_string($_GET[$k]) ?trim($_GET[$k]) :$_GET[$k]) : $d; } function cols(PDO $pdo,$t){ try{$r=$pdo->query("SHOW COLUMNS FROM `$t`")->fetchAll(PDO::FETCH_ASSOC);$m=[];foreach($r as $c)$m[strtolower($c['Field'])]=1;return $m;}catch(Throwable $e){return[];}} 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); } /* =================== D) Column detection ===================== */ $be = cols($pdo,'beam_entry'); $has_beam_no = isset($be['beam_no']); $has_meter = isset($be['meter']); $has_tar = isset($be['tar']); $has_qid = isset($be['quality_id']); $has_created = isset($be['created_by']); $bq = cols($pdo,'beam_qualities'); $bq_has_tar = isset($bq['tar']); /* =================== E) Resolve employee_id (FIXED: Auto + Fallback) ===================== */ $emp_id = 0; try { // 1. Try Auto-link via users table $st = $pdo->prepare("SELECT cem.id FROM company_employee_master cem JOIN users u ON u.employee_id = cem.id WHERE u.id = ? AND cem.company_id = ? AND cem.department_id = 22 AND cem.is_active = 1 LIMIT 1"); $st->execute([$user_id, $company_id]); $emp_id = (int)$st->fetchColumn(); // 2. If not found, check Session (Manual selection memory) if (!$emp_id && !empty($_SESSION['warper_emp_id'])) { $emp_id = (int)$_SESSION['warper_emp_id']; } } catch (Throwable $e) {} // Handle Manual Selection POST if ($_SERVER['REQUEST_METHOD']==='POST' && postv('_action')==='choose_emp') { $chosen = (int)postv('emp_choose',0); try{ $st=$pdo->prepare("SELECT id FROM company_employee_master WHERE company_id=? AND id=? AND is_active=1 AND department_id=22"); $st->execute([$company_id,$chosen]); if($st->fetchColumn()){ $_SESSION['warper_emp_id']=$chosen; $emp_id=$chosen; } }catch(Throwable $e){} } /* =================== F) Next Beam No Logic (FIXED: Same FY + 1) ===================== */ function compute_next_beam_fy($pdo, $company_id, $date) { $fy = get_financial_year($date); try { $st = $pdo->prepare("SELECT COALESCE(MAX(CAST(beam_no AS UNSIGNED)),0) FROM beam_entry WHERE company_id=? AND financial_year=?"); $st->execute([$company_id, $fy]); return (string)((int)$st->fetchColumn() + 1); } catch (Throwable $e) { return '1'; } } /* =================== G) Ajax ===================== */ if (getv('ajax')==='next_beam_no') { header('Content-Type: application/json'); echo json_encode(['ok'=>true,'next_beam_no'=>compute_next_beam_fy($pdo,$company_id,getv('entry_date',date('Y-m-d')))]); exit; } /* =================== H) Prefills ===================== */ $default_beam = compute_next_beam_fy($pdo,$company_id,date('Y-m-d')); $pref_entry_date = postv('entry_date', date('Y-m-d')); $pref_beam_no = postv('beam_no', $default_beam); $pref_qid = (int)postv('quality_id', 0); /* =================== I) Save ===================== */ $msg = $err = ''; require_once __DIR__ . '/../helpers/activity_helper.php'; if ($_SERVER['REQUEST_METHOD']==='POST' && postv('_action')==='save') { $entry_date = postv('entry_date', date('Y-m-d')); if ($entry_date !== date('Y-m-d')) $err = 'Sirf aaj ki date ki entry allowed hai.'; $beam_no = trim((string)postv('beam_no','')); $taka = (int)postv('taka',0); $qid = (int)postv('quality_id',0); if (!$err && ($taka <= 0 || $qid <= 0)) $err = 'Taka and Quality required'; $ok = false; if (!$err) { try { $fy = get_financial_year($entry_date); $meter = $taka * 120; $stTar = $pdo->prepare("SELECT COALESCE(".($bq_has_tar?'tar':'pattern').", '') FROM beam_qualities WHERE id=?"); $stTar->execute([$qid]); $tar = (string)$stTar->fetchColumn(); $cols = ['company_id','employee_id','entry_date','taka','financial_year']; $vals = [$company_id,$emp_id,$entry_date,$taka,$fy]; if ($has_beam_no){ $cols[]='beam_no'; $vals[]=$beam_no; } if ($has_meter){ $cols[]='meter'; $vals[]=$meter; } if ($has_tar){ $cols[]='tar'; $vals[]=$tar; } if ($has_qid){ $cols[]='quality_id'; $vals[]=$qid; } if ($has_created){ $cols[]='created_by'; $vals[]=$user_id; } $ph = rtrim(str_repeat('?,',count($cols)),','); $pdo->prepare("INSERT INTO beam_entry (".implode(',',$cols).") VALUES ($ph)")->execute($vals); $qs = $pdo->prepare("SELECT LOWER(slot_pref) FROM beam_qualities WHERE id=?"); $qs->execute([$qid]); $beam_slot = $qs->fetchColumn() ?: null; $pdo->prepare("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())") ->execute([$company_id, $entry_date, $beam_no, $qid, $qid, $beam_slot, $taka, $meter, $tar, $emp_id, $entry_date, $fy]); $msg = 'Saved successfully'; $pref_beam_no = compute_next_beam_fy($pdo,$company_id,$entry_date); $ok = true; } catch (Throwable $ex) { $err = 'DB Error: '.$ex->getMessage(); } } // --- Activity Log --- if ($ok) { log_activity([ 'activity_type' => 'entry', 'module_name' => 'warper_beam_entry', 'action_name' => 'save', 'activity_note' => "Beam No: $beam_no, Taka: $taka, Quality ID: $qid, Entry Date: $entry_date, Emp ID: $emp_id", 'reference_id' => null, ]); } } /* =================== J) Lists ===================== */ $qualities=[]; $sql = $bq_has_tar ? "SELECT id,name,COALESCE(tar,'') tar FROM beam_qualities WHERE company_id=? ORDER BY name" : "SELECT id,name,COALESCE(pattern,'') tar FROM beam_qualities WHERE company_id=? ORDER BY name"; $q=$pdo->prepare($sql); $q->execute([$company_id]); $qualities=$q->fetchAll(PDO::FETCH_ASSOC); $dept22=[]; $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]); $dept22=$st->fetchAll(PDO::FETCH_ASSOC); $show = (postv('_action')==='show'); $list=[]; if ($show && $emp_id > 0) { $st=$pdo->prepare("SELECT be.*, q.name as quality FROM beam_entry be LEFT JOIN beam_qualities q ON q.id=be.quality_id WHERE be.employee_id=? ORDER BY be.id DESC LIMIT 20"); $st->execute([$emp_id]); $list=$st->fetchAll(); } ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Warper Beam Entry</title> <meta name="viewport" content="width=device-width,initial-scale=1"> <style> :root{--primary:#34A853;--bg:#F5FFF7;--secondary:#5F6368;--border:#e5e7eb;--r:14px;--shadow:0 8px 20px rgba(0,0,0,.08);--text:#202124} *{box-sizing:border-box} body{margin:0;background:var(--bg);color:var(--text);font:14px/1.45 system-ui} .wrap{max-width:820px;margin:16px auto;padding:16px} .card{background:#fff;border:1px solid var(--border);border-radius:var(--r);box-shadow:var(--shadow);padding:18px} .top{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px} .link{color:#0b57d0;text-decoration:none;font-weight:600} .link:hover{text-decoration:underline} .ok{margin:10px 0;background:#ecfdf5;border:1px solid #a7f3d0;color:#065f46;padding:8px;border-radius:10px} .err{margin:10px 0;background:#fee2e2;border:1px solid #fecaca;color:#7f1d1d;padding:8px;border-radius:10px} label{display:block;margin:8px 0 6px;font-weight:600} input,select{width:100%;padding:10px;border:1px solid #d0d7de;border-radius:10px} .btn{padding:10px 16px;border:0;border-radius:10px;cursor:pointer;font-weight:600} .btn-pri{background:var(--primary);color:#fff} .btn-sec{background:#f1f3f4} table{width:100%;border-collapse:collapse;margin-top:14px} th,td{padding:10px;border-bottom:1px solid #e5e7eb;text-align:left} .grid{display:grid;gap:14px;grid-template-columns:1fr 1fr} </style> </head> <body> <div class="wrap"> <div class="top"> <a class="link" href="/erp/public/employee_portal.php">← Dashboard</a> <div style="color:var(--secondary)">Logged in: <b><?= h($user_name) ?></b></div> </div> <div class="card"> <h2>Warper Beam Entry</h2> <?php if($msg): ?><div class="ok" id="save_ok"><?= h($msg) ?></div><?php endif; ?> <?php if($err): ?><div class="err"><?= h($err) ?></div><?php endif; ?> <?php if($emp_id<=0): ?> <div class="err">Auto-link nahi mila. Kirpiya apna naam select karein:</div> <form method="post"><input type="hidden" name="_action" value="choose_emp"> <select name="emp_choose" required><option value="">-- Employees --</option> <?php foreach($dept22 as $e): ?><option value="<?= $e['id'] ?>"><?= h($e['name']) ?></option><?php endforeach; ?> </select><br><br><button class="btn btn-pri" type="submit">Continue</button></form> <?php else: ?> <form method="post" autocomplete="off"> <input type="hidden" name="_action" value="save"> <div class="grid"> <div><label>Warper</label><input type="text" value="<?= h($user_name) ?>" disabled></div> <div><label>Beam No *</label><input type="text" name="beam_no" id="beam_no" value="<?= h($pref_beam_no) ?>" required></div> <div><label>Date</label><input type="date" name="entry_date" id="entry_date" value="<?= h($pref_entry_date) ?>" required readonly></div> <div><label>Taka *</label><input id="taka" type="number" name="taka" value="<?= h(postv('taka','')) ?>" required></div> <div style="grid-column: span 2"><label>Quality</label> <select name="quality_id" required><option value="">-- Select --</option> <?php foreach($qualities as $q): ?><option value="<?= $q['id'] ?>" <?= ($q['id']==$pref_qid?'selected':'') ?>><?= h($q['name']) ?></option><?php endforeach; ?> </select> </div> </div> <div style="margin-top:12px;display:flex;gap:10px"> <button class="btn btn-pri" type="submit">Submit</button> <button class="btn btn-sec" type="submit" name="_action" value="show" formnovalidate>Show Entries</button> </div> </form> <?php endif; ?> </div> <?php if($show && $list): ?> <div class="card" style="margin-top:16px"> <table><thead><tr><th>Date</th><th>Beam No</th><th>Taka</th><th>Quality</th><th>FY</th></tr></thead> <tbody><?php foreach($list as $r): ?><tr><td><?= h($r['entry_date']) ?></td><td><?= h($r['beam_no']) ?></td><td><?= $r['taka'] ?></td><td><?= h($r['quality']) ?></td><td><?= h($r['financial_year']) ?></td></tr><?php endforeach; ?></tbody> </table> </div> <?php endif; ?> </div> <script> (function(){ const d=document.getElementById('entry_date'), b=document.getElementById('beam_no'); async function upd(){ if(!d||!b) return; try{ const res=await fetch(location.pathname+'?ajax=next_beam_no&entry_date='+encodeURIComponent(d.value)); const j=await res.json(); if(j&&j.ok){ b.value=j.next_beam_no||''; } }catch(e){} } if(d) d.addEventListener('change',upd); })(); </script> </body> </html>