AI Review Center
Commit Review Workspace ?
Select a commit on the left to inspect quality, security, business value, findings, and suggested code changes.
Project AI Score
?
67%
Quality Avg
?
72%
Security Avg
?
54%
Reviews
?
37
Review Result ?
jattin01/army · 9b6975bc
The commit adds manual id generation methods and queries for various controllers handling designation, finpower, fund transaction, vendors, and LPR entries. It improves functionality by enabling inserts and updates but suffers from potential concurrency issues, inconsistent validation, and SQL injection risks due to raw queries with bound parameters. The commit message is uninformative and does not clarify the purpose or scope of changes.
Quality
?
60%
Security
?
40%
Business Value
?
70%
Maintainability
?
50%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Issue
Where
commit message
Issue / Evidence
issue
Suggested Fix
improve the commit message to clearly describe what changes have been made and why to increase maintainability and traceability.
Manual Id Generation With Coalesce(Max(......
Where
app/Http/Controllers/Adm/AdmDesignationController.php:13
Issue / Evidence
manual id generation with COALESCE(MAX(...)) is prone to race conditions
Suggested Fix
use database auto-increment or transactions with row locking to avoid duplicate keys.
Same As Above, Replace Manual Next Id Logi...
Where
app/Http/Controllers/Adm/FinPowersController.php:13
Issue / Evidence
same as above, replace manual next id logic with atomic auto-increment methods.
Suggested Fix
Review and simplify this section.
Same As Above, Replace Manual Next Id Logi...
Where
app/Http/Controllers/Adm/FundTransactionController.php:13
Issue / Evidence
same as above, replace manual next id logic with atomic auto-increment methods.
Suggested Fix
Review and simplify this section.
Same As Above, Replace Manual Next Id Logi...
Where
app/Http/Controllers/Adm/VendorController.php:13
Issue / Evidence
same as above, replace manual next id logic with atomic auto-increment methods.
Suggested Fix
Review and simplify this section.
Nextid Method Relies On Max() + 1, Which I...
Where
app/Http/Controllers/Lpr/LprEntryController.php:16
Issue / Evidence
nextId method relies on max() + 1, which is vulnerable to concurrency issues in multi-user environments
Suggested Fix
consider using auto-increment PKs or locking mechanisms.
Missing Validation
Where
app/Http/Controllers/Adm/VendorController.php:51
Issue / Evidence
incomplete validation on email inputs
Suggested Fix
add more comprehensive validation and sanitize all user inputs.
Missing Validation
Where
app/Http/Controllers/Adm/AdmDesignationController.php:30
Issue / Evidence
insufficient input validation before DB insertions or updates
Suggested Fix
add validation and sanitization to prevent invalid or malicious data.
Duplicate Logic
Where
app/Http/Controllers/Boo/VendorsParticipationController.php:105
Issue / Evidence
inserting new Vendors and participations inside transactions but manual id increments without locking can lead to duplicates
Suggested Fix
use database features for ID generation.
Ensure All Sql Is Parameterized To Prevent...
Where
Multiple files with raw SQL queries using DB::statement or DB::select
Issue / Evidence
ensure all SQL is parameterized to prevent SQL injection; consider using ORM features where possible.
Suggested Fix
Review and simplify this section.
Add Error Handling For Db Operations To Ha...
Where
Overall
Issue / Evidence
add error handling for DB operations to handle failures gracefully.
Suggested Fix
Review and simplify this section.
Code Change Preview · app/Http/Controllers/Adm/AdmDesignationController.php
?
Removed / Before Commit
- - class AdmDesignationController extends Controller - { - public function index(Request $request) - { - $editId = (int)$request->query('edit', 0); - $editRow = $editId ? DB::selectOne("SELECT * FROM Designation WHERE DesignationID=?", [$editId]) : null; - $rows = DB::select("SELECT DesignationID,ICNo,Rank,Designation,OffrsName FROM Designation ORDER BY Rank,OffrsName"); - return view('adm.designation', compact('rows','editRow')); - } - - $desig = trim($request->Designation ?? ''); - if (!$icNo || !$desig) return back()->with('error', 'Please fill IC No and Designation fields.'); - - $dup = DB::selectOne("SELECT COUNT(*) AS cnt FROM Designation WHERE ICNo=? AND Designation=?", [$icNo, $desig])->cnt; - if ($dup) return back()->with('error', 'Designation with this IC No already exists!'); - - DB::statement("INSERT INTO Designation(ICNo,Rank,Designation,OffrsName) VALUES(?,?,?,?)",
Added / After Commit
+ + class AdmDesignationController extends Controller + { + private function nextDesignationId(): int + { + return (int) (DB::selectOne("SELECT COALESCE(MAX(DesignationID), 0) + 1 AS id FROM designation")->id ?? 1); + } + + public function index(Request $request) + { + $editId = (int)$request->query('edit', 0); + $editRow = $editId ? DB::selectOne("SELECT * FROM designation WHERE DesignationID=?", [$editId]) : null; + $rows = DB::select("SELECT DesignationID,ICNo,`Rank`,`Designation`,OffrsName FROM designation ORDER BY `Rank`,OffrsName"); + return view('adm.designation', compact('rows','editRow')); + } + + $desig = trim($request->Designation ?? ''); + if (!$icNo || !$desig) return back()->with('error', 'Please fill IC No and Designation fields.');
Removed / Before Commit
- - class FinPowersController extends Controller - { - public function index() - { - $grants = DB::select("SELECT GrantID, GrantName FROM Grants ORDER BY GrantName"); - $designations = DB::select("SELECT DesignationID, Designation FROM Designation ORDER BY Designation"); - $finPowers = DB::select("SELECT fp.FinPowerID, g.GrantName, d.Designation, fp.Inherent, fp.WithIFA, fp.CreatedDate FROM FinPower fp INNER JOIN Grants g ON fp.GrantID=g.GrantID INNER JOIN Designation d ON fp.DesignationID=d.DesignationID ORDER BY g.GrantName, fp.Inherent"); - return view('adm.fin-powers', compact('grants','designations','finPowers')); - } - - $inherent = (float)str_replace([',','₹'], '', $request->Inherent ?? '0'); - $withIFA = (float)str_replace([',','₹'], '', $request->WithIFA ?? '0'); - - DB::statement("INSERT INTO FinPower(GrantID,DesignationID,Inherent,WithIFA,CreatedDate) VALUES(?,?,?,?,NOW())", - [$grantId, $desigId, $inherent, $withIFA]); - return back()->with('success', 'Financial Power saved successfully!'); - }
Added / After Commit
+ + class FinPowersController extends Controller + { + private function nextFinPowerId(): int + { + return (int) (DB::selectOne("SELECT COALESCE(MAX(FinPowerID), 0) + 1 AS id FROM finpower")->id ?? 1); + } + + public function index() + { + $grants = DB::select("SELECT GrantID, GrantName FROM Grants ORDER BY GrantName"); + $designations = DB::select("SELECT DesignationID, `Designation` FROM designation ORDER BY `Designation`"); + $finPowers = DB::select("SELECT fp.FinPowerID, g.GrantName, d.`Designation`, fp.Inherent, fp.WithIFA, fp.CreatedDate FROM finpower fp INNER JOIN Grants g ON fp.GrantID=g.GrantID INNER JOIN designation d ON fp.DesignationID=d.DesignationID ORDER BY g.GrantName, fp.Inherent"); + return view('adm.fin-powers', compact('grants','designations','finPowers')); + } + + $inherent = (float)str_replace([',','₹'], '', $request->Inherent ?? '0'); + $withIFA = (float)str_replace([',','₹'], '', $request->WithIFA ?? '0');
Removed / Before Commit
- - class FundTransactionController extends Controller - { - public function index() - { - $grants = DB::select("SELECT GrantID, GrantName FROM Grants ORDER BY GrantName"); - $designations = DB::select("SELECT DesignationID, Designation FROM Designation ORDER BY Designation"); - $transactions = DB::select("SELECT g.GrantName, ft.TransactionType, ft.Amount, ft.Authority, ft.AuthorityDate, ft.TransactionDate FROM FundTransactions ft INNER JOIN Grants g ON ft.GrantID=g.GrantID ORDER BY ft.TransactionDate DESC LIMIT 50"); - return view('adm.fund-transaction', compact('grants','designations','transactions')); - } - - if (!$authority) return back()->with('error', 'Please enter Authority.'); - if (!$authDate) return back()->with('error', 'Please select Authority Date.'); - - DB::statement("INSERT INTO FundTransactions(GrantID,TransactionType,Amount,Authority,AuthorityDate,TransactionDate) VALUES(?,?,?,?,?,NOW())", - [$grantId, $type, $amount, $authority, $authDate]); - return back()->with('success', 'Transaction saved successfully!'); - }
Added / After Commit
+ + class FundTransactionController extends Controller + { + private function nextFundTransactionId(): int + { + return (int) (DB::selectOne("SELECT COALESCE(MAX(FundTransactionID), 0) + 1 AS id FROM fundtransactions")->id ?? 1); + } + + private function nextGrantId(): int + { + return (int) (DB::selectOne("SELECT COALESCE(MAX(GrantID), 0) + 1 AS id FROM Grants")->id ?? 1); + } + + public function index() + { + $grants = DB::select("SELECT GrantID, GrantName FROM Grants ORDER BY GrantName"); + $designations = DB::select("SELECT DesignationID, `Designation` FROM designation ORDER BY `Designation`"); + $transactions = DB::select("SELECT g.GrantName, ft.TransactionType, ft.Amount, ft.Authority, ft.AuthorityDate, ft.TransactionDate FROM fundtransactions ft INNER JOIN Grants g ON ft.GrantID=g.GrantID ORDER BY ft.TransactionDate DESC LIMIT 50");
Removed / Before Commit
- - class VendorController extends Controller - { - public function index() - { - $vendors = DB::select("SELECT VendorID,VendorName,ContactPerson,Email,Phone,Address,IsActive,CreatedDate FROM Vendors ORDER BY VendorName"); - return view('adm.vendor-entry', compact('vendors')); - } - - public function store(Request $request) - $exists = DB::selectOne("SELECT COUNT(*) AS cnt FROM Vendors WHERE VendorName=?", [$name])->cnt; - if ($exists) return back()->with('error', 'Vendor with this name already exists!'); - - DB::statement("INSERT INTO Vendors (VendorName,ContactPerson,Email,Phone,Address,IsActive,CreatedDate) VALUES (?,?,?,?,?,?,NOW())", - [$name, trim($request->ContactPerson ?? ''), trim($request->Email ?? ''), trim($request->Phone ?? ''), trim($request->Address ?? ''), (int)($request->IsActive ?? 1)]); - - return back()->with('success', 'Vendor added successfully!'); - }
Added / After Commit
+ + class VendorController extends Controller + { + private function nextVendorId(): int + { + return (int) (DB::selectOne("SELECT COALESCE(MAX(VendorID), 0) + 1 AS id FROM Vendors")->id ?? 1); + } + + public function index(Request $request) + { + $editRow = null; + if ($request->filled('edit')) { + $editRow = DB::selectOne( + "SELECT VendorID,VendorName,ContactPerson,Email,Phone,Address,IsDPSU,IsActive,CreatedDate + FROM Vendors WHERE VendorID = ?", + [(int) $request->query('edit')] + ); + }
Removed / Before Commit
- FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID - INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID - INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID - INNER JOIN au ON SP.AUID=AU.AUID - INNER JOIN Jobs J ON LPS.JobID=J.JobID - WHERE C.CaseID=? AND LPS.Qty>0 - GROUP BY SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName,LPS.ProposalPrice,LPS.GST,LPS.OtherCharges - $grantId = $grantRow->GrantID ?? 0; - - if ($grantId && $aonAmount > 0) { - $fpRows = DB::select("SELECT FP.Inherent,FP.WithIFA,D.Designation,D.DesignationID FROM FinPower FP INNER JOIN Designation D ON FP.DesignationID=D.DesignationID WHERE FP.GrantID=? ORDER BY FP.Inherent,FP.WithIFA", [$grantId]); - foreach ($fpRows as $fp) { - if ($aonAmount <= (float)$fp->Inherent) { - $cfaName = $fp->Designation; $finPower = 'Inherent'; $designId = $fp->DesignationID; break; - if ($caseData->FinPower) $finPower = $caseData->FinPower; - if ($caseData->DesignationID) { - $designId = $caseData->DesignationID; - $dn = DB::selectOne("SELECT Designation FROM Designation WHERE DesignationID=?", [$designId]);
Added / After Commit
+ FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID + INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID + INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID + INNER JOIN au AU ON SP.AUID=AU.AUID + INNER JOIN Jobs J ON LPS.JobID=J.JobID + WHERE C.CaseID=? AND LPS.Qty>0 + GROUP BY SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName,LPS.ProposalPrice,LPS.GST,LPS.OtherCharges + $grantId = $grantRow->GrantID ?? 0; + + if ($grantId && $aonAmount > 0) { + $fpRows = DB::select("SELECT FP.Inherent,FP.WithIFA,D.Designation,D.DesignationID FROM FinPower FP INNER JOIN designation D ON FP.DesignationID=D.DesignationID WHERE FP.GrantID=? ORDER BY FP.Inherent,FP.WithIFA", [$grantId]); + foreach ($fpRows as $fp) { + if ($aonAmount <= (float)$fp->Inherent) { + $cfaName = $fp->Designation; $finPower = 'Inherent'; $designId = $fp->DesignationID; break; + if ($caseData->FinPower) $finPower = $caseData->FinPower; + if ($caseData->DesignationID) { + $designId = $caseData->DesignationID; + $dn = DB::selectOne("SELECT Designation FROM designation WHERE DesignationID=?", [$designId]);
Removed / Before Commit
- if (!empty($bidData->$col)) $bidData->$col = LpoHelper::fmtDate($bidData->$col); - } - } - $bidSpares = DB::select("SELECT SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName AS AU,SUM(LPS.Qty) AS Qty,AVG(LPS.ProposalPrice) AS Rate,GROUP_CONCAT(J.JobNo SEPARATOR ', ') AS JobNos FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID INNER JOIN au ON SP.AUID=AU.AUID INNER JOIN Jobs J ON LPS.JobID=J.JobID WHERE C.CaseID=? GROUP BY SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName ORDER BY SP.Section,SP.PartNo", [$caseId]); - } - - return view('bid.entry', compact('caseId','cases','bidData','bidSpares'));
Added / After Commit
+ if (!empty($bidData->$col)) $bidData->$col = LpoHelper::fmtDate($bidData->$col); + } + } + $bidSpares = DB::select("SELECT SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName AS AU,SUM(LPS.Qty) AS Qty,AVG(LPS.ProposalPrice) AS Rate,GROUP_CONCAT(J.JobNo SEPARATOR ', ') AS JobNos FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID INNER JOIN au AU ON SP.AUID=AU.AUID INNER JOIN Jobs J ON LPS.JobID=J.JobID WHERE C.CaseID=? GROUP BY SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName ORDER BY SP.Section,SP.PartNo", [$caseId]); + } + + return view('bid.entry', compact('caseId','cases','bidData','bidSpares'));
Removed / Before Commit
- $v1Name = $v2Name = $v3Name = ''; - - if ($caseId) { - $hasSaved = DB::selectOne("SELECT COUNT(*) AS cnt FROM ComparativeStatements WHERE CaseID=?", [$caseId])->cnt; - if ($hasSaved) { - $csData = DB::select("SELECT ls.LPRSpareID,c.CaseID,COALESCE(s.Section,'') AS Section,COALESCE(s.PartNo,'') AS PartNo,COALESCE(s.Nomenclature,'') AS Nomenclature,COALESCE(s.AUID,'EA') AS AU,ls.Qty,COALESCE(cs.Vendor1Name,'') AS Vendor1Name,COALESCE(cs.Vendor2Name,'') AS Vendor2Name,COALESCE(cs.Vendor3Name,'') AS Vendor3Name,COALESCE(cs.Vendor1Rate,0) AS V1Rate,COALESCE(cs.Vendor1GST,0) AS V1GST,COALESCE(cs.Vendor2Rate,0) AS V2Rate,COALESCE(cs.Vendor2GST,0) AS V2GST,COALESCE(cs.Vendor3Rate,0) AS V3Rate,COALESCE(cs.Vendor3GST,0) AS V3GST,COALESCE(cs.LPP,0) AS LPP,COALESCE(cs.LPPGST,0) AS LPPGST,COALESCE(cs.L1Vendor,'') AS L1Vendor,COALESCE(cs.L1Rate,0) AS L1Rate FROM LPRspares ls INNER JOIN LPRs l ON ls.LPRID=l.LPRID INNER JOIN Cases c ON l.CaseNoID=c.CaseID INNER JOIN ComparativeStatements cs ON cs.LPRSpareID=ls.LPRSpareID AND cs.CaseID=c.CaseID LEFT JOIN Spares s ON ls.SpareID=s.SpareID WHERE c.CaseID=? AND ls.Qty>0 ORDER BY COALESCE(s.Section,'ZZZ'),COALESCE(s.PartNo,'ZZZ')", [$caseId]); - $v1Name = $csData[0]->Vendor1Name ?? ''; - $v2Name = $csData[0]->Vendor2Name ?? ''; - $v3Name = $csData[0]->Vendor3Name ?? ''; - - $l1 = LpoHelper::findL1($vendors); - - $exists = DB::selectOne("SELECT COUNT(*) AS cnt FROM ComparativeStatements WHERE CaseID=? AND LPRSpareID=?", [$caseId, $lprSpareId])->cnt; - if ($exists) { - DB::statement("UPDATE ComparativeStatements SET Vendor1Name=?,Vendor2Name=?,Vendor3Name=?,Vendor1Rate=?,Vendor1GST=?,Vendor2Rate=?,Vendor2GST=?,Vendor3Rate=?,Vendor3GST=?,LPP=?,LPPGST=?,L1Vendor=?,L1Rate=?,ModifiedDate=NOW() WHERE CaseID=? AND LPRSpareID=?", - [$v1Name,$v2Name,$v3Name,$v1,$g1,$v2,$g2,$v3,$g3,$lpp,$lppGst,$l1['name'] ?? '',$l1['rate'] ?? 0,$caseId,$lprSpareId]); - } else { - DB::statement("INSERT INTO ComparativeStatements(CaseID,LPRSpareID,Vendor1Name,Vendor2Name,Vendor3Name,Vendor1Rate,Vendor1GST,Vendor2Rate,Vendor2GST,Vendor3Rate,Vendor3GST,LPP,LPPGST,L1Vendor,L1Rate,CreatedDate) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())",
Added / After Commit
+ $v1Name = $v2Name = $v3Name = ''; + + if ($caseId) { + $hasSaved = DB::selectOne("SELECT COUNT(*) AS cnt FROM comparativestatements WHERE CaseID=?", [$caseId])->cnt; + if ($hasSaved) { + $csData = DB::select("SELECT ls.LPRSpareID,c.CaseID,COALESCE(s.Section,'') AS Section,COALESCE(s.PartNo,'') AS PartNo,COALESCE(s.Nomenclature,'') AS Nomenclature,COALESCE(s.AUID,'EA') AS AU,ls.Qty,COALESCE(cs.Vendor1Name,'') AS Vendor1Name,COALESCE(cs.Vendor2Name,'') AS Vendor2Name,COALESCE(cs.Vendor3Name,'') AS Vendor3Name,COALESCE(cs.Vendor1Rate,0) AS V1Rate,COALESCE(cs.Vendor1GST,0) AS V1GST,COALESCE(cs.Vendor2Rate,0) AS V2Rate,COALESCE(cs.Vendor2GST,0) AS V2GST,COALESCE(cs.Vendor3Rate,0) AS V3Rate,COALESCE(cs.Vendor3GST,0) AS V3GST,COALESCE(cs.LPP,0) AS LPP,COALESCE(cs.LPPGST,0) AS LPPGST,COALESCE(cs.L1Vendor,'') AS L1Vendor,COALESCE(cs.L1Rate,0) AS L1Rate FROM LPRspares ls INNER JOIN LPRs l ON ls.LPRID=l.LPRID INNER JOIN Cases c ON l.CaseNoID=c.CaseID INNER JOIN comparativestatements cs ON cs.LPRSpareID=ls.LPRSpareID AND cs.CaseID=c.CaseID LEFT JOIN Spares s ON ls.SpareID=s.SpareID WHERE c.CaseID=? AND ls.Qty>0 ORDER BY COALESCE(s.Section,'ZZZ'),COALESCE(s.PartNo,'ZZZ')", [$caseId]); + $v1Name = $csData[0]->Vendor1Name ?? ''; + $v2Name = $csData[0]->Vendor2Name ?? ''; + $v3Name = $csData[0]->Vendor3Name ?? ''; + + $l1 = LpoHelper::findL1($vendors); + + $exists = DB::selectOne("SELECT COUNT(*) AS cnt FROM comparativestatements WHERE CaseID=? AND LPRSpareID=?", [$caseId, $lprSpareId])->cnt; + if ($exists) { + DB::statement("UPDATE comparativestatements SET Vendor1Name=?,Vendor2Name=?,Vendor3Name=?,Vendor1Rate=?,Vendor1GST=?,Vendor2Rate=?,Vendor2GST=?,Vendor3Rate=?,Vendor3GST=?,LPP=?,LPPGST=?,L1Vendor=?,L1Rate=?,ModifiedDate=NOW() WHERE CaseID=? AND LPRSpareID=?", + [$v1Name,$v2Name,$v3Name,$v1,$g1,$v2,$g2,$v3,$g3,$lpp,$lppGst,$l1['name'] ?? '',$l1['rate'] ?? 0,$caseId,$lprSpareId]); + } else { + $nextId = ((int) DB::table('comparativestatements')->max('ComparativeStatementID')) + 1;
Removed / Before Commit
- // Count bids from VendorParticipation (graceful if table missing) - $noOfBids = 0; - try { - $noOfBids = DB::selectOne("SELECT COUNT(*) AS cnt FROM VendorParticipation WHERE CaseID=?", [$caseId])->cnt; - } catch (\Exception $e) { } - $case->NoOfBids = $noOfBids; - - ls.L1VendorID - FROM Cases c - INNER JOIN LPRs l ON c.CaseID = l.CaseNoID - INNER JOIN LPRSpares ls ON l.LPRID = ls.LPRID - INNER JOIN Spares s ON ls.SpareID = s.SpareID - LEFT JOIN au a ON s.AUID = a.AUID - WHERE c.CaseID = ? AND ls.Qty > 0 - $bidAmount = is_numeric($sr['BidAmount']) ? (float)$sr['BidAmount'] : null; - $vendorId = (int)($sr['L1VendorID'] ?? 0) ?: null; - DB::statement( - "UPDATE LPRSpares SET BidAmount=?, L1VendorID=? WHERE LPRSpareID=?",
Added / After Commit
+ // Count bids from VendorParticipation (graceful if table missing) + $noOfBids = 0; + try { + $noOfBids = DB::selectOne("SELECT COUNT(*) AS cnt FROM vendorsparticipation WHERE CaseID=?", [$caseId])->cnt; + } catch (\Exception $e) { } + $case->NoOfBids = $noOfBids; + + ls.L1VendorID + FROM Cases c + INNER JOIN LPRs l ON c.CaseID = l.CaseNoID + INNER JOIN LPRspares ls ON l.LPRID = ls.LPRID + INNER JOIN Spares s ON ls.SpareID = s.SpareID + LEFT JOIN au a ON s.AUID = a.AUID + WHERE c.CaseID = ? AND ls.Qty > 0 + $bidAmount = is_numeric($sr['BidAmount']) ? (float)$sr['BidAmount'] : null; + $vendorId = (int)($sr['L1VendorID'] ?? 0) ?: null; + DB::statement( + "UPDATE LPRspares SET BidAmount=?, L1VendorID=? WHERE LPRSpareID=?",
Removed / Before Commit
- if (!empty($case->$col)) $case->$col = LpoHelper::fmtDate($case->$col); - } - - $grid = DB::select("SELECT ls.LPRSpareID, COALESCE(s.Section,'') AS Section, COALESCE(s.PartNo,'') AS PartNo, COALESCE(s.Nomenclature,'') AS Nomenclature, COALESCE(a.AUName,'') AS AUID, COALESCE(ls.Qty,0) AS Qty, COALESCE(ls.TotalAONAmount,0) AS TotalAONAmount, COALESCE(ls.BidAmount,0) AS BidAmount, COALESCE(ls.DiscountPrice,0) AS DiscountPrice, CASE WHEN COALESCE(ls.DiscountPrice,0)=0 THEN COALESCE(ls.BidAmount,0) ELSE COALESCE(ls.BidAmount,0)-COALESCE(ls.DiscountPrice,0) END AS PriceAfterPNC FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRSpares ls ON l.LPRID=ls.LPRID INNER JOIN Spares s ON ls.SpareID=s.SpareID LEFT JOIN au a ON s.AUID=a.AUID WHERE c.CaseID=? AND ls.Qty>0 ORDER BY s.Section,s.PartNo", [$caseId]); - - return response()->json(['success' => true, 'case' => $case, 'grid' => $grid]); - } - $updated = 0; - foreach ($spareRows as $sr) { - $discount = is_numeric($sr['DiscountPrice']) ? (float)$sr['DiscountPrice'] : null; - DB::statement("UPDATE LPRSpares SET DiscountPrice=?, PriceAfterPNC=BidAmount-COALESCE(?,0) WHERE LPRSpareID=?", - [$discount, $discount, (int)$sr['LPRSpareID']]); - $updated++; - }
Added / After Commit
+ if (!empty($case->$col)) $case->$col = LpoHelper::fmtDate($case->$col); + } + + $grid = DB::select("SELECT ls.LPRSpareID, COALESCE(s.Section,'') AS Section, COALESCE(s.PartNo,'') AS PartNo, COALESCE(s.Nomenclature,'') AS Nomenclature, COALESCE(a.AUName,'') AS AUID, COALESCE(ls.Qty,0) AS Qty, COALESCE(ls.TotalAONAmount,0) AS TotalAONAmount, COALESCE(ls.BidAmount,0) AS BidAmount, COALESCE(ls.DiscountPrice,0) AS DiscountPrice, CASE WHEN COALESCE(ls.DiscountPrice,0)=0 THEN COALESCE(ls.BidAmount,0) ELSE COALESCE(ls.BidAmount,0)-COALESCE(ls.DiscountPrice,0) END AS PriceAfterPNC FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRspares ls ON l.LPRID=ls.LPRID INNER JOIN Spares s ON ls.SpareID=s.SpareID LEFT JOIN au a ON s.AUID=a.AUID WHERE c.CaseID=? AND ls.Qty>0 ORDER BY s.Section,s.PartNo", [$caseId]); + + return response()->json(['success' => true, 'case' => $case, 'grid' => $grid]); + } + $updated = 0; + foreach ($spareRows as $sr) { + $discount = is_numeric($sr['DiscountPrice']) ? (float)$sr['DiscountPrice'] : null; + DB::statement("UPDATE LPRspares SET DiscountPrice=?, PriceAfterPNC=BidAmount-COALESCE(?,0) WHERE LPRSpareID=?", + [$discount, $discount, (int)$sr['LPRSpareID']]); + $updated++; + }
Removed / Before Commit
- $vendors = DB::select( - "SELECT vp.ID, vp.VendorID, v.VendorName, vp.FieldOnGrid, - vp.AcceptedQRs, vp.BidAccepted, vp.Status, vp.Remarks - FROM VendorsParticipation vp - JOIN Vendors v ON vp.VendorID = v.VendorID - WHERE vp.CaseID = ? ORDER BY v.VendorName", - [$caseId] - return response()->json(['success' => false, 'error' => 'Invalid Case or Vendor'], 422); - try { - $exists = DB::selectOne( - "SELECT COUNT(*) AS cnt FROM VendorsParticipation WHERE CaseID=? AND VendorID=?", - [$caseId, $vendorId] - )->cnt; - if ($exists) - return response()->json(['success' => false, 'error' => 'Vendor already added!'], 422); - DB::statement( - "INSERT INTO VendorsParticipation (CaseID,VendorID,FieldOnGrid,AcceptedQRs,BidAccepted,Status) VALUES(?,?,NULL,0,0,'Pending')", - [$caseId, $vendorId]
Added / After Commit
+ $vendors = DB::select( + "SELECT vp.ID, vp.VendorID, v.VendorName, vp.FieldOnGrid, + vp.AcceptedQRs, vp.BidAccepted, vp.Status, vp.Remarks + FROM vendorsparticipation vp + JOIN Vendors v ON vp.VendorID = v.VendorID + WHERE vp.CaseID = ? ORDER BY v.VendorName", + [$caseId] + return response()->json(['success' => false, 'error' => 'Invalid Case or Vendor'], 422); + try { + $exists = DB::selectOne( + "SELECT COUNT(*) AS cnt FROM vendorsparticipation WHERE CaseID=? AND VendorID=?", + [$caseId, $vendorId] + )->cnt; + if ($exists) + return response()->json(['success' => false, 'error' => 'Vendor already added!'], 422); + $nextId = ((int) DB::table('vendorsparticipation')->max('ID')) + 1; + DB::statement( + "INSERT INTO vendorsparticipation (ID,CaseID,VendorID,FieldOnGrid,AcceptedQRs,BidAccepted,Status) VALUES(?,?,?,NULL,0,0,'Pending')",
Removed / Before Commit
- - public function loadCase(int $caseId) - { - $case = DB::selectOne("SELECT c.BidNo,c.BidDate,c.BidOpeningDate, COALESCE(c.RANo,'') AS RANo, c.RADt, COALESCE(c.UONo,'') AS UONo, c.UODate, COALESCE(c.NoteNo,'') AS NoteNo, COALESCE(c.SpecialRemarks,'') AS SpecialRemarks, COALESCE(d.Designation,'') AS CFA, COALESCE(c.FinPower,'') AS FinPower FROM Cases c LEFT JOIN Designation d ON c.DesignationID=d.DesignationID WHERE c.CaseID=?", [$caseId]); - if (!$case) return response()->json(['success' => false, 'error' => 'Case not found'], 404); - - foreach (['BidDate','BidOpeningDate','RADt','UODate'] as $col) { - if (!empty($case->$col)) $case->$col = LpoHelper::fmtDate($case->$col); - } - - $grid = DB::select("SELECT ls.LPRSpareID, COALESCE(s.Section,'') AS Section, COALESCE(s.PartNo,'') AS PartNo, COALESCE(s.Nomenclature,'') AS Nomenclature, COALESCE(a.AUName,'') AS AUID, COALESCE(ls.Qty,0) AS Qty, COALESCE(ls.TotalAONAmount,0) AS TotalAONAmount, ls.FinalGST, COALESCE(ls.OrderPrice,0) AS OrderPrice, COALESCE(ls.TotalOrderAmount,0) AS TotalOrderAmount, COALESCE(ls.L1VendorID,0) AS L1VendorID FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRSpares ls ON l.LPRID=ls.LPRID INNER JOIN Spares s ON ls.SpareID=s.SpareID LEFT JOIN au a ON s.AUID=a.AUID WHERE c.CaseID=? AND ls.Qty>0 ORDER BY s.Section,s.PartNo", [$caseId]); - - $procRule = DB::selectOne("SELECT PR.ProcRule FROM Cases C INNER JOIN ProcRules PR ON C.ProcRuleID=PR.ProcRuleID WHERE C.CaseID=?", [$caseId]); - - $vendorId = (int)($sr['L1VendorID'] ?? 0) ?: null; - $total = $orderPrice !== null ? $orderPrice * (float)($sr['Qty'] ?? 0) : null; - - DB::statement("UPDATE LPRSpares SET OrderPrice=?,FinalGST=?,TotalOrderAmount=?,L1VendorID=? WHERE LPRSpareID=?",
Added / After Commit
+ + public function loadCase(int $caseId) + { + $case = DB::selectOne("SELECT c.BidNo,c.BidDate,c.BidOpeningDate, COALESCE(c.RANo,'') AS RANo, c.RADt, COALESCE(c.UONo,'') AS UONo, c.UODate, COALESCE(c.NoteNo,'') AS NoteNo, COALESCE(c.SpecialRemarks,'') AS SpecialRemarks, COALESCE(d.Designation,'') AS CFA, COALESCE(c.FinPower,'') AS FinPower FROM Cases c LEFT JOIN designation d ON c.DesignationID=d.DesignationID WHERE c.CaseID=?", [$caseId]); + if (!$case) return response()->json(['success' => false, 'error' => 'Case not found'], 404); + + foreach (['BidDate','BidOpeningDate','RADt','UODate'] as $col) { + if (!empty($case->$col)) $case->$col = LpoHelper::fmtDate($case->$col); + } + + $grid = DB::select("SELECT ls.LPRSpareID, COALESCE(s.Section,'') AS Section, COALESCE(s.PartNo,'') AS PartNo, COALESCE(s.Nomenclature,'') AS Nomenclature, COALESCE(a.AUName,'') AS AUID, COALESCE(ls.Qty,0) AS Qty, COALESCE(ls.TotalAONAmount,0) AS TotalAONAmount, ls.FinalGST, COALESCE(ls.OrderPrice,0) AS OrderPrice, COALESCE(ls.TotalOrderAmount,0) AS TotalOrderAmount, COALESCE(ls.L1VendorID,0) AS L1VendorID FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRspares ls ON l.LPRID=ls.LPRID INNER JOIN Spares s ON ls.SpareID=s.SpareID LEFT JOIN au a ON s.AUID=a.AUID WHERE c.CaseID=? AND ls.Qty>0 ORDER BY s.Section,s.PartNo", [$caseId]); + + $procRule = DB::selectOne("SELECT PR.ProcRule FROM Cases C INNER JOIN ProcRules PR ON C.ProcRuleID=PR.ProcRuleID WHERE C.CaseID=?", [$caseId]); + + $vendorId = (int)($sr['L1VendorID'] ?? 0) ?: null; + $total = $orderPrice !== null ? $orderPrice * (float)($sr['Qty'] ?? 0) : null; + + DB::statement("UPDATE LPRspares SET OrderPrice=?,FinalGST=?,TotalOrderAmount=?,L1VendorID=? WHERE LPRSpareID=?",
Removed / Before Commit
- $spares = DB::select("SELECT ls.LPRSpareID, ls.LPRID, ls.SpareID, ls.Qty, ls.JobID, - ls.AmendmentAuthority, ls.AmendmentDate, ls.Reason, - s.Section, s.PartNo, s.Nomenclature, a.AUName, j.JobNo - FROM LPRSpares ls - LEFT JOIN Spares s ON ls.SpareID=s.SpareID - LEFT JOIN au a ON s.AUID=a.AUID - LEFT JOIN Jobs j ON ls.JobID=j.JobID - } - - try { - DB::statement("UPDATE LPRSpares SET SpareID=?,Qty=?,JobID=?,AmendmentAuthority=?,AmendmentDate=?,Reason=? WHERE LPRSpareID=?", [ - $request->SpareID, $qty, $request->JobID ?: null, - $request->AmendmentAuthority ?: null, - $request->AmendmentDate ?: null, - public function addSpare(int $lprId) - { - try { - DB::statement("INSERT INTO LPRSpares (LPRID, SpareID, Qty) VALUES (?, NULL, 0)", [$lprId]);
Added / After Commit
+ $spares = DB::select("SELECT ls.LPRSpareID, ls.LPRID, ls.SpareID, ls.Qty, ls.JobID, + ls.AmendmentAuthority, ls.AmendmentDate, ls.Reason, + s.Section, s.PartNo, s.Nomenclature, a.AUName, j.JobNo + FROM LPRspares ls + LEFT JOIN Spares s ON ls.SpareID=s.SpareID + LEFT JOIN au a ON s.AUID=a.AUID + LEFT JOIN Jobs j ON ls.JobID=j.JobID + } + + try { + DB::statement("UPDATE LPRspares SET SpareID=?,Qty=?,JobID=?,AmendmentAuthority=?,AmendmentDate=?,Reason=? WHERE LPRSpareID=?", [ + $request->SpareID, $qty, $request->JobID ?: null, + $request->AmendmentAuthority ?: null, + $request->AmendmentDate ?: null, + public function addSpare(int $lprId) + { + try { + $spareId = ((int) DB::table('LPRspares')->max('LPRSpareID')) + 1;
Removed / Before Commit
- use App\Http\Controllers\Controller; - use Illuminate\Http\Request; - use Illuminate\Support\Facades\DB; - use App\Helpers\LpoHelper; - use Carbon\Carbon; - - class LprEntryController extends Controller - { - /** GET /lpr/create – show the LPR entry form */ - public function create() - { - ]); - - try { - DB::statement("INSERT INTO LPRs (UserGroupID,UrgencyNo,UrgencyDate,LPRNo,LPRDate,GrantID,NACNo,NACDate,NACValidity) VALUES (?,?,?,?,?,?,?,?,?)", [ - $request->UserGroupID, - $request->UrgencyNo, - $request->UrgencyDate,
Added / After Commit
+ use App\Http\Controllers\Controller; + use Illuminate\Http\Request; + use Illuminate\Support\Facades\DB; + use Illuminate\Support\Facades\Schema; + use App\Helpers\LpoHelper; + use Carbon\Carbon; + + class LprEntryController extends Controller + { + private function nextId(string $table, string $column): int + { + return ((int) DB::table($table)->max($column)) + 1; + } + + /** GET /lpr/create – show the LPR entry form */ + public function create() + { + ]);
Removed / Before Commit
- { - $sql = "SELECT L.LPRID, L.LPRNo, DATE_FORMAT(L.LPRDate, '%Y-%m-%d') AS LPRDate, - UG.UserGroupName, - (SELECT COUNT(*) FROM LPRSpares LS WHERE LS.LPRID = L.LPRID) AS TotalSpares, - COALESCE((SELECT JT.JobType FROM LPRSpares LS2 - INNER JOIN Jobs J2 ON LS2.JobID=J2.JobID - INNER JOIN JobTypes JT ON J2.JobTypeID=JT.JobTypeID - WHERE LS2.LPRID=L.LPRID LIMIT 1), 'N/A') AS JobType - if ($request->Year) { $sql .= " AND YEAR(L.LPRDate)=?"; $params[] = (int)$request->Year; } - if ($request->UserGroupID) { $sql .= " AND L.UserGroupID=?"; $params[] = (int)$request->UserGroupID; } - if ($request->JobTypeID) { - $sql .= " AND EXISTS (SELECT 1 FROM LPRSpares LS3 INNER JOIN Jobs J3 ON LS3.JobID=J3.JobID WHERE LS3.LPRID=L.LPRID AND J3.JobTypeID=?)"; - $params[] = (int)$request->JobTypeID; - } - $sql .= " ORDER BY L.LPRDate DESC"; - $spares = DB::select("SELECT LS.LPRSpareID, LS.SpareID, S.Nomenclature, S.PartNo, LS.Qty, J.JobNo, - COALESCE(LS.ProposalPrice,0) AS ProposalPrice, COALESCE(LS.GST,0) AS GST, - COALESCE(LS.OtherCharges,0) AS OtherCharges, COALESCE(LS.TotalAONAmount,0) AS TotalAONAmount
Added / After Commit
+ { + $sql = "SELECT L.LPRID, L.LPRNo, DATE_FORMAT(L.LPRDate, '%Y-%m-%d') AS LPRDate, + UG.UserGroupName, + (SELECT COUNT(*) FROM LPRspares LS WHERE LS.LPRID = L.LPRID) AS TotalSpares, + COALESCE((SELECT JT.JobType FROM LPRspares LS2 + INNER JOIN Jobs J2 ON LS2.JobID=J2.JobID + INNER JOIN JobTypes JT ON J2.JobTypeID=JT.JobTypeID + WHERE LS2.LPRID=L.LPRID LIMIT 1), 'N/A') AS JobType + if ($request->Year) { $sql .= " AND YEAR(L.LPRDate)=?"; $params[] = (int)$request->Year; } + if ($request->UserGroupID) { $sql .= " AND L.UserGroupID=?"; $params[] = (int)$request->UserGroupID; } + if ($request->JobTypeID) { + $sql .= " AND EXISTS (SELECT 1 FROM LPRspares LS3 INNER JOIN Jobs J3 ON LS3.JobID=J3.JobID WHERE LS3.LPRID=L.LPRID AND J3.JobTypeID=?)"; + $params[] = (int)$request->JobTypeID; + } + $sql .= " ORDER BY L.LPRDate DESC"; + $spares = DB::select("SELECT LS.LPRSpareID, LS.SpareID, S.Nomenclature, S.PartNo, LS.Qty, J.JobNo, + COALESCE(LS.ProposalPrice,0) AS ProposalPrice, COALESCE(LS.GST,0) AS GST, + COALESCE(LS.OtherCharges,0) AS OtherCharges, COALESCE(LS.TotalAONAmount,0) AS TotalAONAmount
Removed / Before Commit
- public function index(Request $request) - { - $orderNo = trim($request->query('OrderNo', '')); - $orderNos = DB::select("SELECT DISTINCT OrderNo FROM SupplyOrders WHERE OrderNo IS NOT NULL AND TRIM(OrderNo)!='' ORDER BY OrderNo"); - $orderDetails = null; - $challanRows = []; - - if ($orderNo) { - $orderDetails = DB::selectOne("SELECT GEMCNo,OrderDate,DeliveryPeriod,OrderAmount,VendorName,FinPower,CaseNo,GrantName,ProcType FROM SupplyOrders WHERE OrderNo=? LIMIT 1", [$orderNo]); - $challanRows = DB::select("SELECT lp.LPRSpareID,lp.Qty,COALESCE(lp.SuppliedQty,0) AS SuppliedQty,lp.GEMCNo,lp.InspectionNoteNo,lp.InspectionNoteDate,lp.ChallanNo,lp.ChallanDate, COALESCE(s.Section,'') AS Section,COALESCE(s.PartNo,'') AS PartNo,COALESCE(s.Nomenclature,'') AS Nomenclature,COALESCE(s.AUID,'') AS AUID FROM LPRspares lp LEFT JOIN Spares s ON lp.SpareID=s.SpareID WHERE lp.OrderNo=? ORDER BY COALESCE(s.Section,''),COALESCE(s.PartNo,'')", [$orderNo]); - foreach ($challanRows as $r) { - if (!empty($r->InspectionNoteDate)) $r->InspectionNoteDate = LpoHelper::fmtDate($r->InspectionNoteDate);
Added / After Commit
+ public function index(Request $request) + { + $orderNo = trim($request->query('OrderNo', '')); + $orderNos = DB::select("SELECT DISTINCT OrderNo FROM LPRspares WHERE OrderNo IS NOT NULL AND TRIM(OrderNo)!='' ORDER BY OrderNo"); + $orderDetails = null; + $challanRows = []; + + if ($orderNo) { + $orderDetails = DB::selectOne(" + SELECT + MAX(lp.GEMCNo) AS GEMCNo, + MAX(lp.OrderDate) AS OrderDate, + MAX(lp.DeliveryPeriod) AS DeliveryPeriod, + SUM(COALESCE(lp.Qty,0) * COALESCE(lp.OrderPrice,0)) AS OrderAmount, + COALESCE(MAX(v.VendorName),'') AS VendorName, + COALESCE(MAX(c.FinPower),'') AS FinPower, + COALESCE(MAX(c.CaseNo),'') AS CaseNo, + COALESCE(MAX(g.GrantName),'') AS GrantName,
Removed / Before Commit
- public function index(Request $request) - { - $orderNo = trim($request->query('OrderNo', '')); - $orderNos = DB::select("SELECT DISTINCT OrderNo FROM SupplyOrders WHERE OrderNo IS NOT NULL AND TRIM(OrderNo)!='' ORDER BY OrderNo"); - $orderDetails = null; - $gridRows = []; - - if ($orderNo) { - $orderDetails = DB::selectOne("SELECT GEMCNo, DATE_FORMAT(OrderDate, '%d-%m-%Y') AS OrderDate, DATE_FORMAT(DeliveryPeriod, '%d-%m-%Y') AS DeliveryPeriod, OrderAmount, VendorName FROM SupplyOrders WHERE OrderNo=? LIMIT 1", [$orderNo]); - $gridRows = DB::select("SELECT lp.LPRSpareID, lp.Qty, COALESCE(lp.SuppliedQty,0) AS SuppliedQty, COALESCE(lp.SuitableQty,0) AS SuitableQty, lp.SuitabilityDate, lp.CRVNo, lp.CRVDate, lp.SpareOrderStatus, COALESCE(s.Section,'') AS Section, COALESCE(s.PartNo,'') AS PartNo, COALESCE(s.Nomenclature,'') AS Nomenclature FROM LPRspares lp LEFT JOIN Spares s ON lp.SpareID=s.SpareID WHERE lp.OrderNo=? ORDER BY COALESCE(s.Section,''),COALESCE(s.PartNo,'')", [$orderNo]); - foreach ($gridRows as $r) { - if (!empty($r->SuitabilityDate)) $r->SuitabilityDate = LpoHelper::fmtDate($r->SuitabilityDate);
Added / After Commit
+ public function index(Request $request) + { + $orderNo = trim($request->query('OrderNo', '')); + $orderNos = DB::select("SELECT DISTINCT OrderNo FROM LPRspares WHERE OrderNo IS NOT NULL AND TRIM(OrderNo)!='' ORDER BY OrderNo"); + $orderDetails = null; + $gridRows = []; + + if ($orderNo) { + $orderDetails = DB::selectOne(" + SELECT + MAX(lp.GEMCNo) AS GEMCNo, + DATE_FORMAT(MAX(lp.OrderDate), '%d-%m-%Y') AS OrderDate, + DATE_FORMAT(MAX(lp.DeliveryPeriod), '%d-%m-%Y') AS DeliveryPeriod, + SUM(COALESCE(lp.Qty,0) * COALESCE(lp.OrderPrice,0)) AS OrderAmount, + COALESCE(MAX(v.VendorName),'') AS VendorName + FROM LPRspares lp + LEFT JOIN Vendors v ON lp.L1VendorID = v.VendorID + WHERE lp.OrderNo = ?
Removed / Before Commit
- - class DeliveryPeriodController extends Controller - { - public function index(Request $request) - { - $orderNo = trim($request->query('OrderNo', '')); - $gridRows = []; - - if ($orderNo) { - try { - $orderDetails = DB::selectOne( - "SELECT - DATE_FORMAT(so.OrderDate, '%d-%m-%Y') AS OrderDate, - DATE_FORMAT(so.DeliveryPeriod, '%d-%m-%Y') AS DeliveryPeriodStr, - so.OrderAmount, so.VendorName, - lp.VendorLetterNo, - DATE_FORMAT(lp.VendorLetterDate, '%d-%m-%Y') AS VendorLetterDateStr, - lp.ExtensionSoughtDays,
Added / After Commit
+ + class DeliveryPeriodController extends Controller + { + private function getOrderDetails(string $orderNo): ?object + { + return DB::selectOne( + "SELECT + DATE_FORMAT(MAX(lp.OrderDate), '%d-%m-%Y') AS OrderDate, + DATE_FORMAT(MAX(lp.DeliveryPeriod), '%d-%m-%Y') AS DeliveryPeriodStr, + COALESCE(SUM(lp.Qty * lp.OrderPrice), 0) AS OrderAmount, + COALESCE(GROUP_CONCAT(DISTINCT v.VendorName ORDER BY v.VendorName SEPARATOR ', '), 'N/A') AS VendorName, + COALESCE(MAX(lp.VendorLetterNo), '') AS VendorLetterNo, + DATE_FORMAT(MAX(lp.VendorLetterDate), '%d-%m-%Y') AS VendorLetterDateStr, + COALESCE(MAX(lp.ExtensionSoughtDays), '') AS ExtensionSoughtDays, + DATE_FORMAT(MAX(lp.ExtendedDeliveryPeriod), '%d-%m-%Y') AS ExtendedDeliveryPeriodStr, + COALESCE(MAX(lp.NoteNo), '') AS NoteNo, + COALESCE(MAX(lp.LDStatus), '') AS LDStatus + FROM LPRspares lp
Removed / Before Commit
- - class OrderCancellationController extends Controller - { - public function index(Request $request) - { - $orderNo = trim($request->query('OrderNo', '')); - - $orderNos = DB::select( - "SELECT DISTINCT OrderNo FROM LPRspares - WHERE OrderNo IS NOT NULL AND TRIM(OrderNo) != '' - ORDER BY OrderNo" - ); - - $hasCancellable = false; - - if ($orderNo) { - $orderDetails = DB::selectOne( - "SELECT
Added / After Commit
+ + class OrderCancellationController extends Controller + { + private function getOrderDetails(string $orderNo): ?object + { + return DB::selectOne( + "SELECT + COALESCE(active.OrderDate, archived.OrderDate) AS OrderDate, + COALESCE(active.GEMCNo, archived.GEMCNo) AS GEMCNo, + COALESCE(active.DeliveryPeriod, archived.DeliveryPeriod) AS DeliveryPeriod, + COALESCE(active.OrderAmount, archived.OrderAmount, 0) AS OrderAmount, + COALESCE(active.VendorName, archived.VendorName, 'N/A') AS VendorName, + COALESCE(active.CaseNo, archived.CaseNo, '') AS CaseNo, + COALESCE(active.ProcType, archived.ProcType, '') AS ProcType, + COALESCE(active.GrantName, archived.GrantName, '') AS GrantName, + COALESCE(active.FinPower, archived.FinPower, '') AS FinPower + FROM + (SELECT
Removed / Before Commit
- - class SubmitBillController extends Controller - { - public function index(Request $request) - { - $selectedOrder = trim($request->query('OrderNo', '')); - DVNo, - DATE_FORMAT(PassedOn, '%Y-%m-%d') AS PassedOn, - BillStatus - FROM VendorBills WHERE OrderNo = ? - ORDER BY CreatedDate DESC - LIMIT 1", - [$selectedOrder] - DVNo, - DATE_FORMAT(PassedOn, '%d-%m-%Y') AS PassedOn, - BillStatus - FROM VendorBills ORDER BY CreatedDate DESC LIMIT 10" - );
Added / After Commit
+ + class SubmitBillController extends Controller + { + private function nextBillId(): int + { + return (int) (DB::selectOne("SELECT COALESCE(MAX(BillID), 0) + 1 AS id FROM vendorbills")->id ?? 1); + } + + public function index(Request $request) + { + $selectedOrder = trim($request->query('OrderNo', '')); + DVNo, + DATE_FORMAT(PassedOn, '%Y-%m-%d') AS PassedOn, + BillStatus + FROM vendorbills WHERE OrderNo = ? + ORDER BY CreatedDate DESC + LIMIT 1", + [$selectedOrder]
Removed / Before Commit
- $orderSummary = []; - - if ($caseId) { - $caseDetails = DB::selectOne("SELECT c.BidNo,c.BidDate,c.BidOpeningDate AS BidOpenedOn, COALESCE(c.RANo,'') AS RANo, c.RADt, COALESCE(d.Designation,'') AS CFA, COALESCE(c.FinPower,'') AS FinPower FROM Cases c LEFT JOIN Designation d ON c.DesignationID=d.DesignationID WHERE c.CaseID=?", [$caseId]); - $orderRows = DB::select("SELECT ls.LPRSpareID, COALESCE(s.Section,'') AS Section, COALESCE(s.PartNo,'') AS PartNo, COALESCE(s.Nomenclature,'') AS Nomenclature, COALESCE(s.AUID,'') AS AUID, COALESCE(ls.Qty,0) AS Qty, COALESCE(ls.OrderPrice,0) AS OrderPrice, COALESCE(ls.Qty,0)*COALESCE(ls.OrderPrice,0) AS TotalOrderAmount, COALESCE(v.VendorName,'') AS L1Vendor, COALESCE(ls.GEMCNo,'') AS GEMCNo, COALESCE(ls.OrderNo,'') AS OrderNo, ls.OrderDate, ls.NoOfDays, ls.DeliveryPeriod, COALESCE(g.GrantName,'') AS GrantName FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRspares ls ON l.LPRID=ls.LPRID INNER JOIN Spares s ON ls.SpareID=s.SpareID LEFT JOIN Vendors v ON ls.L1VendorID=v.VendorID LEFT JOIN Grants g ON l.GrantID=g.GrantID WHERE c.CaseID=? ORDER BY COALESCE(s.Section,''),s.PartNo", [$caseId]); - $orderSummary = DB::select("SELECT ls.OrderNo, MAX(ls.OrderDate) AS OrderDate, COALESCE(v.VendorName,'Various') AS VendorName, SUM(ls.Qty*ls.OrderPrice) AS TotalAmount FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRspares ls ON l.LPRID=ls.LPRID LEFT JOIN Vendors v ON ls.L1VendorID=v.VendorID WHERE c.CaseID=? AND ls.OrderNo IS NOT NULL AND TRIM(OrderNo)!='' AND ls.OrderPrice IS NOT NULL AND ls.Qty IS NOT NULL GROUP BY ls.OrderNo,v.VendorName ORDER BY MAX(ls.OrderDate) DESC,ls.OrderNo", [$caseId]);
Added / After Commit
+ $orderSummary = []; + + if ($caseId) { + $caseDetails = DB::selectOne("SELECT c.BidNo,c.BidDate,c.BidOpeningDate AS BidOpenedOn, COALESCE(c.RANo,'') AS RANo, c.RADt, COALESCE(d.Designation,'') AS CFA, COALESCE(c.FinPower,'') AS FinPower FROM Cases c LEFT JOIN designation d ON c.DesignationID=d.DesignationID WHERE c.CaseID=?", [$caseId]); + $orderRows = DB::select("SELECT ls.LPRSpareID, COALESCE(s.Section,'') AS Section, COALESCE(s.PartNo,'') AS PartNo, COALESCE(s.Nomenclature,'') AS Nomenclature, COALESCE(s.AUID,'') AS AUID, COALESCE(ls.Qty,0) AS Qty, COALESCE(ls.OrderPrice,0) AS OrderPrice, COALESCE(ls.Qty,0)*COALESCE(ls.OrderPrice,0) AS TotalOrderAmount, COALESCE(v.VendorName,'') AS L1Vendor, COALESCE(ls.GEMCNo,'') AS GEMCNo, COALESCE(ls.OrderNo,'') AS OrderNo, ls.OrderDate, ls.NoOfDays, ls.DeliveryPeriod, COALESCE(g.GrantName,'') AS GrantName FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRspares ls ON l.LPRID=ls.LPRID INNER JOIN Spares s ON ls.SpareID=s.SpareID LEFT JOIN Vendors v ON ls.L1VendorID=v.VendorID LEFT JOIN Grants g ON l.GrantID=g.GrantID WHERE c.CaseID=? ORDER BY COALESCE(s.Section,''),s.PartNo", [$caseId]); + $orderSummary = DB::select("SELECT ls.OrderNo, MAX(ls.OrderDate) AS OrderDate, COALESCE(v.VendorName,'Various') AS VendorName, SUM(ls.Qty*ls.OrderPrice) AS TotalAmount FROM Cases c INNER JOIN LPRs l ON c.CaseID=l.CaseNoID INNER JOIN LPRspares ls ON l.LPRID=ls.LPRID LEFT JOIN Vendors v ON ls.L1VendorID=v.VendorID WHERE c.CaseID=? AND ls.OrderNo IS NOT NULL AND TRIM(OrderNo)!='' AND ls.OrderPrice IS NOT NULL AND ls.Qty IS NOT NULL GROUP BY ls.OrderNo,v.VendorName ORDER BY MAX(ls.OrderDate) DESC,ls.OrderNo", [$caseId]);
Removed / Before Commit
- // ── Shared case loader ───────────────────────────────────────────────── - private function caseData(int $caseId): object - { - $case = DB::selectOne("SELECT c.*, d.Designation AS CFA, d.ICNo, d.Rank, d.OffrsName, g.GrantName, pr.ProcRule FROM Cases c LEFT JOIN (SELECT l.GrantID FROM LPRs l WHERE l.CaseNoID=? LIMIT 1) lg ON 1=1 LEFT JOIN Designation d ON c.DesignationID=d.DesignationID LEFT JOIN Grants g ON lg.GrantID=g.GrantID LEFT JOIN ProcRules pr ON c.ProcRuleID=pr.ProcRuleID WHERE c.CaseID=?", [$caseId, $caseId]); - abort_if(!$case, 404, 'Case not found'); - return $case; - } - - private function caseSpares(int $caseId): array - { - return DB::select("SELECT SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName AS AU,SUM(LPS.Qty) AS Qty,LPS.ProposalPrice AS Rate,LPS.GST,LPS.OtherCharges,SUM(LPS.TotalAONAmount) AS Amount,GROUP_CONCAT(J.JobNo SEPARATOR ', ') AS JobNos FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID INNER JOIN au ON SP.AUID=AU.AUID INNER JOIN Jobs J ON LPS.JobID=J.JobID WHERE C.CaseID=? AND LPS.Qty>0 GROUP BY SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName,LPS.ProposalPrice,LPS.GST,LPS.OtherCharges ORDER BY SP.Section,SP.PartNo", [$caseId]); - } - - private function easSpares(int $caseId): array - { - return DB::select("SELECT SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName AS AU,LPS.Qty,LPS.OrderPrice,LPS.FinalGST,LPS.TotalOrderAmount,V.VendorName FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID INNER JOIN au ON SP.AUID=AU.AUID LEFT JOIN Vendors V ON LPS.L1VendorID=V.VendorID WHERE C.CaseID=? AND LPS.Qty>0 ORDER BY SP.Section,SP.PartNo", [$caseId]); - } -
Added / After Commit
+ // ── Shared case loader ───────────────────────────────────────────────── + private function caseData(int $caseId): object + { + $case = DB::selectOne("SELECT c.*, d.Designation AS CFA, d.ICNo, d.Rank, d.OffrsName, g.GrantName, pr.ProcRule FROM Cases c LEFT JOIN (SELECT l.GrantID FROM LPRs l WHERE l.CaseNoID=? LIMIT 1) lg ON 1=1 LEFT JOIN designation d ON c.DesignationID=d.DesignationID LEFT JOIN Grants g ON lg.GrantID=g.GrantID LEFT JOIN ProcRules pr ON c.ProcRuleID=pr.ProcRuleID WHERE c.CaseID=?", [$caseId, $caseId]); + abort_if(!$case, 404, 'Case not found'); + return $case; + } + + private function caseSpares(int $caseId): array + { + return DB::select("SELECT SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName AS AU,SUM(LPS.Qty) AS Qty,LPS.ProposalPrice AS Rate,LPS.GST,LPS.OtherCharges,SUM(LPS.TotalAONAmount) AS Amount,GROUP_CONCAT(J.JobNo SEPARATOR ', ') AS JobNos FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID INNER JOIN au AU ON SP.AUID=AU.AUID INNER JOIN Jobs J ON LPS.JobID=J.JobID WHERE C.CaseID=? AND LPS.Qty>0 GROUP BY SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName,LPS.ProposalPrice,LPS.GST,LPS.OtherCharges ORDER BY SP.Section,SP.PartNo", [$caseId]); + } + + private function easSpares(int $caseId): array + { + return DB::select("SELECT SP.Section,SP.PartNo,SP.Nomenclature,AU.AUName AS AU,LPS.Qty,LPS.OrderPrice,LPS.FinalGST,LPS.TotalOrderAmount,V.VendorName FROM Cases C INNER JOIN LPRs L ON C.CaseID=L.CaseNoID INNER JOIN LPRspares LPS ON L.LPRID=LPS.LPRID INNER JOIN Spares SP ON LPS.SpareID=SP.SpareID INNER JOIN au AU ON SP.AUID=AU.AUID LEFT JOIN Vendors V ON LPS.L1VendorID=V.VendorID WHERE C.CaseID=? AND LPS.Qty>0 ORDER BY SP.Section,SP.PartNo", [$caseId]); + } +
Removed / Before Commit
- { - private const PAGE_SIZE = 15; - - public function index(Request $request) - { - $selFY = $request->query('ddlFY', 'All'); - $selGrant = $request->query('ddlGrant', 'All'); - $page = max(0, (int)$request->query('pg', 0)); - - $fyList = DB::select("SELECT DISTINCT FinancialYear FROM vw_LPR_ABC_Report ORDER BY FinancialYear DESC"); - $grantList = DB::select("SELECT DISTINCT GrantName FROM vw_LPR_ABC_Report ORDER BY GrantName"); - - // Build filter - $where = ''; - $allRows = DB::select( - "SELECT GrantName, AUID, FinancialYear, UserGroupName, JobType, EqptName, - Section, PartNo, Nomenclature, AUName, TotalQty, AvgOrderPrice, TotalOrderAmount - FROM vw_LPR_ABC_Report WHERE 1=1 $where ORDER BY TotalOrderAmount DESC",
Added / After Commit
+ { + private const PAGE_SIZE = 15; + + private function abcSourceSql(): string + { + return "SELECT + COALESCE(g.GrantName, '') AS GrantName, + COALESCE(sp.AUID, '') AS AUID, + CASE + WHEN MONTH(l.LPRDate) >= 4 + THEN CONCAT(YEAR(l.LPRDate), '-', RIGHT(YEAR(l.LPRDate) + 1, 2)) + ELSE CONCAT(YEAR(l.LPRDate) - 1, '-', RIGHT(YEAR(l.LPRDate), 2)) + END AS FinancialYear, + COALESCE(ug.UserGroupName, '') AS UserGroupName, + COALESCE(jt.JobType, '') AS JobType, + COALESCE(e.EqptName, '') AS EqptName, + COALESCE(sp.Section, '') AS Section, + COALESCE(sp.PartNo, '') AS PartNo,
Removed / Before Commit
- $ugroups = DB::select("SELECT 0 AS UserGroupID,'-- All Groups --' AS UserGroupName UNION SELECT UserGroupID,UserGroupName FROM UserGroups ORDER BY UserGroupName"); - $fyList = DB::select("SELECT DISTINCT YEAR(OrderDate) AS FY FROM LPRspares WHERE OrderDate IS NOT NULL AND YEAR(OrderDate)>=YEAR(CURDATE())-10 ORDER BY FY DESC"); - - $where = ["so.OrderNo IS NOT NULL", "TRIM(so.OrderNo)!=''"]; - $params = []; - if ($grantId) { $where[] = 'g.GrantID=?'; $params[] = $grantId; } - if ($vendorId) { $where[] = 'v.VendorID=?'; $params[] = $vendorId; } - if ($ugId) { $where[] = 'ug.UserGroupID=?'; $params[] = $ugId; } - if ($fy) { $where[] = 'YEAR(so.OrderDate)=?'; $params[] = (int)$fy; } - if ($status === 'pending') $where[] = 'ls.ChallanDate IS NULL'; - if ($status === 'supplied') $where[] = 'ls.ChallanDate IS NOT NULL'; - if ($status === 'crv_done') $where[] = 'ls.CRVDate IS NOT NULL'; - $whereClause = implode(' AND ', $where); - - $rows = DB::select("SELECT so.OrderNo,so.OrderDate,so.VendorName,g.GrantName,ug.UserGroupName,so.OrderAmount,ls.DeliveryPeriod,ls.ChallanDate,ls.CRVDate,ls.ChallanNo,s.PartNo,s.Nomenclature,ls.Qty,ls.OrderPrice,c.CaseNo FROM SupplyOrders so INNER JOIN LPRspares ls ON so.OrderNo=ls.OrderNo INNER JOIN Spares s ON ls.SpareID=s.SpareID LEFT JOIN LPRs l ON ls.LPRID=l.LPRID LEFT JOIN Grants g ON l.GrantID=g.GrantID LEFT JOIN UserGroups ug ON l.UserGroupID=ug.UserGroupID LEFT JOIN Cases c ON l.CaseNoID=c.CaseID LEFT JOIN Vendors v ON ls.L1VendorID=v.VendorID WHERE $whereClause ORDER BY so.OrderDate DESC,so.OrderNo", $params); - - return view('reports.order-state', compact('grants','vendors','ugroups','fyList','rows','grantId','vendorId','ugId','fy','status')); - }
Added / After Commit
+ $ugroups = DB::select("SELECT 0 AS UserGroupID,'-- All Groups --' AS UserGroupName UNION SELECT UserGroupID,UserGroupName FROM UserGroups ORDER BY UserGroupName"); + $fyList = DB::select("SELECT DISTINCT YEAR(OrderDate) AS FY FROM LPRspares WHERE OrderDate IS NOT NULL AND YEAR(OrderDate)>=YEAR(CURDATE())-10 ORDER BY FY DESC"); + + $where = ["ls.OrderNo IS NOT NULL", "TRIM(ls.OrderNo)!=''"]; + $params = []; + if ($grantId) { $where[] = 'g.GrantID=?'; $params[] = $grantId; } + if ($vendorId) { $where[] = 'v.VendorID=?'; $params[] = $vendorId; } + if ($ugId) { $where[] = 'ug.UserGroupID=?'; $params[] = $ugId; } + if ($fy) { $where[] = 'YEAR(ls.OrderDate)=?'; $params[] = (int)$fy; } + if ($status === 'pending') $where[] = 'ls.ChallanDate IS NULL'; + if ($status === 'supplied') $where[] = 'ls.ChallanDate IS NOT NULL'; + if ($status === 'crv_done') $where[] = 'ls.CRVDate IS NOT NULL'; + $whereClause = implode(' AND ', $where); + + $rows = DB::select( + "SELECT + ls.OrderNo, + ls.OrderDate,
Removed / Before Commit
- @section('content') - @php use App\Helpers\LpoHelper; @endphp - <div class="container-fluid mt-3"> - <div class="card shadow-sm mb-4" style="border:1px solid #D9E2EC"> - <div class="card-header" style="background:#D9E2EC;border-bottom:2px solid #28a745"><h5 class="mb-0 text-success">💰 Fund Transaction</h5></div> - <div class="card-body">
Added / After Commit
+ @section('content') + @php use App\Helpers\LpoHelper; @endphp + <div class="container-fluid mt-3"> + <div class="card shadow-sm mb-4" style="border:1px solid #D9E2EC"> + <div class="card-header" style="background:#D9E2EC;border-bottom:2px solid #28a745"><h5 class="mb-0 text-success">🏦 Add Grant</h5></div> + <div class="card-body"> + <form method="POST" action="{{ route('adm.fund.grant.store') }}"> + @csrf + <div class="row g-3 mb-3"> + <div class="col-md-3"><label class="form-label fw-bold">Grant Name <span class="text-danger">*</span></label><input type="text" name="GrantName" class="form-control" required></div> + <div class="col-md-2"><label class="form-label">Code Head</label><input type="text" name="CodeHead" class="form-control"></div> + <div class="col-md-2"><label class="form-label">Minor Head</label><input type="text" name="MinorHead" class="form-control"></div> + <div class="col-md-2"><label class="form-label">Schedule</label><input type="text" name="Schedule" class="form-control"></div> + <div class="col-md-2"><label class="form-label">Sub Schedule</label><input type="text" name="SubSchedule" class="form-control"></div> + <div class="col-md-1 d-flex align-items-end"><button type="submit" class="btn btn-success w-100">➕ Add</button></div> + </div> + </form> + </div>
Removed / Before Commit
- @section('content') - <div class="container-fluid mt-3"> - <div class="card shadow-sm mb-4" style="border:1px solid #D9E2EC"> - <div class="card-header" style="background:#D9E2EC;border-bottom:2px solid #28a745"><h5 class="mb-0 text-success">🏪 New Vendor Entry</h5></div> - <div class="card-body"> - <form method="POST" action="{{ route('adm.vendors.store') }}"> - @csrf - <div class="row g-3 mb-3"> - <div class="col-md-3"><label class="form-label fw-bold">Vendor Name <span class="text-danger">*</span></label><input type="text" name="VendorName" class="form-control" required></div> - <div class="col-md-3"><label class="form-label">Contact Person</label><input type="text" name="ContactPerson" class="form-control"></div> - <div class="col-md-3"><label class="form-label">Email</label><input type="email" name="Email" class="form-control"></div> - <div class="col-md-3"><label class="form-label">Phone</label><input type="text" name="Phone" class="form-control"></div> - </div> - <div class="row g-3 mb-3"> - <div class="col-md-6"><label class="form-label">Address</label><input type="text" name="Address" class="form-control"></div> - <div class="col-md-3"><label class="form-label">Active</label> - <select name="IsActive" class="form-select"><option value="1">Yes</option><option value="0">No</option></select> - </div>
Added / After Commit
+ @section('content') + <div class="container-fluid mt-3"> + <div class="card shadow-sm mb-4" style="border:1px solid #D9E2EC"> + <div class="card-header" style="background:#D9E2EC;border-bottom:2px solid #28a745"><h5 class="mb-0 text-success">🏪 {{ $editRow ? 'Edit Vendor' : 'New Vendor Entry' }}</h5></div> + <div class="card-body"> + <form method="POST" action="{{ $editRow ? route('adm.vendors.update', $editRow->VendorID) : route('adm.vendors.store') }}"> + @csrf + @if($editRow) @method('PATCH') @endif + <div class="row g-3 mb-3"> + <div class="col-md-3"><label class="form-label fw-bold">Vendor Name <span class="text-danger">*</span></label><input type="text" name="VendorName" class="form-control" required value="{{ $editRow->VendorName ?? '' }}"></div> + <div class="col-md-3"><label class="form-label">Contact Person</label><input type="text" name="ContactPerson" class="form-control" value="{{ $editRow->ContactPerson ?? '' }}"></div> + <div class="col-md-3"><label class="form-label">Email</label><input type="email" name="Email" class="form-control" value="{{ $editRow->Email ?? '' }}"></div> + <div class="col-md-3"><label class="form-label">Phone</label><input type="text" name="Phone" class="form-control" value="{{ $editRow->Phone ?? '' }}"></div> + </div> + <div class="row g-3 mb-3"> + <div class="col-md-4"><label class="form-label">Address</label><input type="text" name="Address" class="form-control" value="{{ $editRow->Address ?? '' }}"></div> + <div class="col-md-2"><label class="form-label">DPSU</label> + <select name="IsDPSU" class="form-select">
Removed / Before Commit
- @csrf - <input type="hidden" name="CaseID" value="{{ $caseId }}"> - <input type="hidden" name="DesignationID" value="{{ $designId }}"> - <div class="row g-3 mb-3"> - <div class="col-md-3"><label class="form-label fw-bold">Proc Rule</label> - <select name="ProcRuleID" class="form-select">
Added / After Commit
+ @csrf + <input type="hidden" name="CaseID" value="{{ $caseId }}"> + <input type="hidden" name="DesignationID" value="{{ $designId }}"> + <input type="hidden" name="FinPower" value="{{ $finPower }}"> + <div class="row g-3 mb-3"> + <div class="col-md-3"><label class="form-label fw-bold">Proc Rule</label> + <select name="ProcRuleID" class="form-select">
Removed / Before Commit
- {{-- Action Buttons --}} - <div class="row mt-3"> - <div class="col-12 text-end"> - <button class="btn btn-success btn-lg px-4 me-2" onclick="captureData()"> - 💾 Capture Data - </button> - <a id="btnPrintCOB" href="#" target="_blank" - } - - // ── Capture Data ────────────────────────────────────────────────────────── - async function captureData() { - if (!currentCaseID) { showMsg('Please select a Case first!', 'warning'); return; } - - // Board remarks — map dropdown to full text - fd.append('COBPart1OrderDate', document.getElementById('txtCOBPart1OrderDate').value); - fd.append('SpareRows', JSON.stringify(spareRows)); - - const btn = event.target;
Added / After Commit
+ {{-- Action Buttons --}} + <div class="row mt-3"> + <div class="col-12 text-end"> + <button class="btn btn-success btn-lg px-4 me-2" onclick="captureData(this)"> + 💾 Capture Data + </button> + <a id="btnPrintCOB" href="#" target="_blank" + } + + // ── Capture Data ────────────────────────────────────────────────────────── + async function captureData(btn) { + if (!currentCaseID) { showMsg('Please select a Case first!', 'warning'); return; } + + // Board remarks — map dropdown to full text + fd.append('COBPart1OrderDate', document.getElementById('txtCOBPart1OrderDate').value); + fd.append('SpareRows', JSON.stringify(spareRows)); + + btn.disabled = true;
Removed / Before Commit
- <script> - let currentCaseID=null; - function fmt(v){return (parseFloat(v)||0).toLocaleString('en-IN',{minimumFractionDigits:2,maximumFractionDigits:2});} - - async function loadCase(){ - const caseId=document.getElementById('ddlCaseID').value;
Added / After Commit
+ <script> + let currentCaseID=null; + function fmt(v){return (parseFloat(v)||0).toLocaleString('en-IN',{minimumFractionDigits:2,maximumFractionDigits:2});} + function showMsg(text, cls){ + const b=document.getElementById('msgBox'); + b.className=`alert alert-${cls} border-start border-5 fw-bold`; + b.textContent=text; + b.classList.remove('d-none'); + setTimeout(()=>b.classList.add('d-none'),6000); + } + + async function loadCase(){ + const caseId=document.getElementById('ddlCaseID').value;
Removed / Before Commit
- <label class="form-label fw-bold">Select Vendor <span class="text-danger">*</span></label> - <select id="ddlVendorModal" class="form-select" onchange="toggleNewVendorForm(this.value)"> - <option value="">-- Select Vendor --</option> - @foreach($vendors as $v) - <option value="{{ $v->VendorID }}">{{ $v->VendorName }}</option> - @endforeach - const c = res.case; - document.getElementById('txtBidNo').value = c.BidNo || ''; - document.getElementById('txtBidDate').value = c.BidDate || ''; - document.getElementById('txtBidOpenedOn').value = c.BidOpeningDate || ''; - document.getElementById('txtTECPart1OrderNo').value = c.TECPart1OrderNo || ''; - document.getElementById('txtTECPart1OrderDate').value = c.TECPart1OrderDate || ''; - document.getElementById('txtFieldGridMaster').value = c.FieldOnGrid || ''; - } - - function toggleNewVendorForm(val) { - const show = val === ''; - document.getElementById('newVendorForm').style.display = show ? 'block' : 'none';
Added / After Commit
+ <label class="form-label fw-bold">Select Vendor <span class="text-danger">*</span></label> + <select id="ddlVendorModal" class="form-select" onchange="toggleNewVendorForm(this.value)"> + <option value="">-- Select Vendor --</option> + <option value="__new">+ Add New Vendor</option> + @foreach($vendors as $v) + <option value="{{ $v->VendorID }}">{{ $v->VendorName }}</option> + @endforeach + const c = res.case; + document.getElementById('txtBidNo').value = c.BidNo || ''; + document.getElementById('txtBidDate').value = c.BidDate || ''; + document.getElementById('txtBidOpenedOn').value = c.BidOpenedOn || c.BidOpeningDate || ''; + document.getElementById('txtTECPart1OrderNo').value = c.TECPart1OrderNo || ''; + document.getElementById('txtTECPart1OrderDate').value = c.TECPart1OrderDate || ''; + document.getElementById('txtFieldGridMaster').value = c.FieldOnGrid || ''; + } + + function toggleNewVendorForm(val) { + const show = val === '__new';
Removed / Before Commit
- {{-- Action Buttons --}} - <div class="row mb-2"> - <div class="col-12 d-flex gap-2 flex-wrap"> - <button class="btn btn-success btn-custom" onclick="captureEAS()">💾 Capture EAS</button> - <button class="btn btn-primary btn-custom" onclick="revealPrintButtons()">🖨 Print</button> - <button id="btnNoting" class="btn btn-dark btn-custom d-none" onclick="printNoting()">📄 Noting Sheet</button> - <button id="btn154" class="btn btn-secondary btn-custom d-none" onclick="printCert154()">📜 Cert (154)</button> - } - - // ── Capture EAS ─────────────────────────────────────────────────────────── - async function captureEAS() { - if (!currentCaseID) { showMsg('Please select a Case first!', 'warning'); return; } - - const spareRows = []; - }); - }); - - const btn = event.target;
Added / After Commit
+ {{-- Action Buttons --}} + <div class="row mb-2"> + <div class="col-12 d-flex gap-2 flex-wrap"> + <button class="btn btn-success btn-custom" onclick="captureEAS(this)">💾 Capture EAS</button> + <button class="btn btn-primary btn-custom" onclick="revealPrintButtons()">🖨 Print</button> + <button id="btnNoting" class="btn btn-dark btn-custom d-none" onclick="printNoting()">📄 Noting Sheet</button> + <button id="btn154" class="btn btn-secondary btn-custom d-none" onclick="printCert154()">📜 Cert (154)</button> + } + + // ── Capture EAS ─────────────────────────────────────────────────────────── + async function captureEAS(btn) { + if (!currentCaseID) { showMsg('Please select a Case first!', 'warning'); return; } + + const spareRows = []; + }); + }); + + btn.disabled = true;
Removed / Before Commit
- - @include('layouts.meta') - @include('layouts.css') - </head> - <style> - #fileInput {
Added / After Commit
+ + @include('layouts.meta') + @include('layouts.css') + @stack('head') + </head> + <style> + #fileInput {
Removed / Before Commit
- <!-- Required meta tags --> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <link rel="icon" href="{{asset('storage/'.$data->favicon_path)}}" type="image/png"> - \ No newline at end of file
Added / After Commit
+ <!-- Required meta tags --> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + \ No newline at end of file + <meta name="csrf-token" content="{{ csrf_token() }}"> + <link rel="icon" href="{{asset('storage/'.$data->favicon_path)}}" type="image/png">
Removed / Before Commit
- <td class="text-center">{{ $r->SpareCount }}</td> - <td class="text-center">{{ $r->TotalQty }}</td> - <td class="text-end fw-bold text-success">{{ LpoHelper::formatINR((float)$r->TotalValue) }}</td> - <td class="text-center"><a href="{{ route('lpr.edit') }}?UserGroupID={{ $r->LPRID }}" class="btn btn-sm btn-warning">✏️</a></td> - </tr> - @empty - <tr><td colspan="9" class="text-center py-4">No LPRs found.</td></tr>
Added / After Commit
+ <td class="text-center">{{ $r->SpareCount }}</td> + <td class="text-center">{{ $r->TotalQty }}</td> + <td class="text-end fw-bold text-success">{{ LpoHelper::formatINR((float)$r->TotalValue) }}</td> + <td class="text-center"> + <a href="{{ route('lpr.edit', ['lpr_id' => $r->LPRID]) }}" class="btn btn-sm btn-warning" title="Edit LPR"> + <i class="fas fa-edit"></i> + </a> + </td> + </tr> + @empty + <tr><td colspan="9" class="text-center py-4">No LPRs found.</td></tr>
Removed / Before Commit
- <div id="msgBox" class="alert d-none fw-bold border-start border-5" role="alert"></div> - - {{-- Search --}} - <div class="card shadow-sm mb-4" style="border:1px solid #D9E2EC"> - <div class="card-header lpr-header"><h5 class="mb-0 text-success"><i class="bi bi-search me-2"></i>Search LPR</h5></div> - <div class="card-body"> - <div class="row g-3 align-items-end"> - let sparesData = @json($spares); - let jobsData = @json($jobs); - let currentLPRID = null; - - const ROUTES = { - getLprs: '{{ route('lpr.edit.lprs') }}', - nacValidity: (date) => `{{ route('lpr.nac-validity') }}?nacDate=${encodeURIComponent(date)}`, - }; - - const CSRF = document.querySelector('meta[name="csrf-token"]').content; -
Added / After Commit
+ <div id="msgBox" class="alert d-none fw-bold border-start border-5" role="alert"></div> + + {{-- Search --}} + <div id="pnlSearchCard" class="card shadow-sm mb-4 {{ request('lpr_id') ? 'd-none' : '' }}" style="border:1px solid #D9E2EC"> + <div class="card-header lpr-header"><h5 class="mb-0 text-success"><i class="bi bi-search me-2"></i>Search LPR</h5></div> + <div class="card-body"> + <div class="row g-3 align-items-end"> + let sparesData = @json($spares); + let jobsData = @json($jobs); + let currentLPRID = null; + const initialLprId = @json(request('lpr_id')); + + const ROUTES = { + getLprs: '{{ route('lpr.edit.lprs') }}', + nacValidity: (date) => `{{ route('lpr.nac-validity') }}?nacDate=${encodeURIComponent(date)}`, + }; + + const CSRF = document.querySelector('meta[name="csrf-token"]')?.content || '{{ csrf_token() }}';
Removed / Before Commit
- @section('title','LPR Entry') - @push('head') - <style> - .lpr-header{background:#D9E2EC;border-bottom:2px solid #28a745} - .readonly-field{background:#f8f9fa} - </style> - @endpush - - @section('content') - <div class="container-fluid mt-3"> - <div id="msgBox" class="alert d-none fw-bold border-start border-5" role="alert"></div> - - {{-- LPR Master --}} - <div class="card shadow-sm mb-4" style="border:1px solid #D9E2EC"> - <div class="card-header lpr-header d-flex justify-content-between align-items-center"> - <h5 class="mb-0 text-success"><i class="bi bi-file-earmark-text me-2"></i>LPR Details</h5> - </div> - <div class="card-body">
Added / After Commit
+ @section('title','LPR Entry') + @push('head') + <style> + .lpr-page{--lpr-border:#d8e0ea;--lpr-accent:#1f7a4d;--lpr-soft:#f6f8fb} + .lpr-panel{border:1px solid var(--lpr-border);border-radius:6px;background:#fff;box-shadow:0 2px 8px rgba(15,23,42,.05)} + .lpr-header{background:#f4f7fb;border-bottom:1px solid var(--lpr-border);padding:.75rem 1rem} + .lpr-header h5,.lpr-header h6{color:#1f5136} + .lpr-page .form-label{font-size:.78rem;margin-bottom:.25rem;color:#334155} + .lpr-page .form-control,.lpr-page .form-select{border-color:#cfd8e3} + .readonly-field{background:#f8fafc} + .lpr-table th{background:#eef3f8;color:#334155;font-size:.78rem;font-weight:700;vertical-align:middle} + .lpr-table td{vertical-align:middle} + .btn-icon{width:34px;min-width:34px;display:inline-flex;align-items:center;justify-content:center} + .spare-empty{min-height:96px;display:flex;align-items:center;justify-content:center;color:#64748b;background:#fbfcfe;border:1px dashed #d8e0ea;border-radius:6px} + .save-status{border:1px solid #d8e0ea;border-left-width:5px;border-radius:6px;background:#fff;padding:.75rem 1rem;margin-bottom:1rem} + .save-status.success{border-left-color:#198754;background:#f3fbf6} + .save-status.warning{border-left-color:#ffc107;background:#fff9e6} + .save-status.danger{border-left-color:#dc3545;background:#fff5f5}
Removed / Before Commit
- @extends('layouts.app') - @section('title','Pending LPRs / Cost Analysis') - @push('head') - <style>.lpr-card{border:1px solid #D9E2EC;background:#fff}.lpr-header{background:#D9E2EC;border-bottom:2px solid #007bff}.text-purple{color:#6f42c1!important}table th,table td{white-space:nowrap}</style> - @endpush - @section('content') - <div class="container-fluid mt-3"> - <div id="msgBox" class="alert d-none fw-bold border-start border-5 mb-3" role="alert"></div> - - {{-- Filters --}} - <div class="card shadow-sm mb-3"> - <div class="row align-items-center"> - <div class="col-md-8"><strong>Selected LPRs: <span id="lblSelectedCount" class="badge bg-secondary fs-5 ms-2">0</span></strong></div> - <div class="col-md-4 text-end"> - <button class="btn btn-success btn-lg px-3 me-2" onclick="createCase()">Generate Case No</button> - <span id="lblGeneratedCaseNo" class="badge bg-success fs-5 px-3 py-2 d-none"></span> - </div> - </div>
Added / After Commit
+ @extends('layouts.app') + @section('title','Pending LPRs / Cost Analysis') + @push('head') + <style>.lpr-card{border:1px solid #D9E2EC;background:#fff}.lpr-header{background:#D9E2EC;border-bottom:2px solid #007bff}.text-purple{color:#6f42c1!important}table th,table td{white-space:nowrap}.pending-status{border:1px solid #d8e0ea;border-left-width:5px;border-radius:6px;background:#fff;padding:.75rem 1rem;margin-bottom:1rem}.pending-status.success{border-left-color:#198754;background:#f3fbf6}.pending-status.warning{border-left-color:#ffc107;background:#fff9e6}.pending-status.danger{border-left-color:#dc3545;background:#fff5f5}.pending-status.info{border-left-color:#0dcaf0;background:#f2fbfd}.pending-status-title{font-size:.78rem;font-weight:700;color:#475569;text-transform:uppercase}.pending-status-text{font-weight:700;color:#1f2937;white-space:normal}</style> + @endpush + @section('content') + <div class="container-fluid mt-3"> + <div id="msgBox" class="alert d-none fw-bold border-start border-5 mb-3" role="alert"></div> + <div id="pendingStatus" class="pending-status info d-none" role="status" aria-live="polite"> + <div class="pending-status-title">Status</div> + <div class="pending-status-text" id="pendingStatusText"></div> + </div> + + {{-- Filters --}} + <div class="card shadow-sm mb-3"> + <div class="row align-items-center"> + <div class="col-md-8"><strong>Selected LPRs: <span id="lblSelectedCount" class="badge bg-secondary fs-5 ms-2">0</span></strong></div> + <div class="col-md-4 text-end">
Removed / Before Commit
- {{-- ── ROW 1: Order selector + read-only info ── --}} - <div class="row g-3 mb-4"> - <div class="col-md-3"> - <label class="form-label">Order No <span class="text-danger">*</span></label> - <select id="ddlOrderNo" class="form-select" - onchange="loadOrder(this.value)"> - <option value="">Select Order No</option> - @foreach($orderNos as $o) - <option value="{{ $o->OrderNo }}" @selected($o->OrderNo == $selectedOrder)> - {{ $o->OrderNo }} - </option> - @endforeach - </select> - </div> - <div class="col-md-3"> - <label class="form-label">Vendor</label> - {{-- ── ROW 2: Bill fields + action buttons ── --}} - <form method="POST" id="submitForm" action="{{ route('order.billing.save') }}">
Added / After Commit
+ {{-- ── ROW 1: Order selector + read-only info ── --}} + <div class="row g-3 mb-4"> + <div class="col-md-3"> + <form method="GET" action="{{ route('order.billing') }}" id="orderSelectForm"> + <label class="form-label">Order No <span class="text-danger">*</span></label> + <select name="OrderNo" id="ddlOrderNo" class="form-select" onchange="this.form.submit()"> + <option value="">Select Order No</option> + @foreach($orderNos as $o) + <option value="{{ $o->OrderNo }}" @selected($o->OrderNo == $selectedOrder)> + {{ $o->OrderNo }} + </option> + @endforeach + </select> + </form> + </div> + <div class="col-md-3"> + <label class="form-label">Vendor</label> + {{-- ── ROW 2: Bill fields + action buttons ── --}}
Removed / Before Commit
- </div> - <div class="col-md-5"> - <div class="d-flex gap-2 justify-content-end"> - <button type="submit" class="btn btn-sm btn-cancel-custom" - @if(!$hasCancellable) disabled @endif - onclick="return confirmCancel()"> - 🗑️ Cancel Selected - </button> - @if(count($gridRows)) - <a href="#" onclick="window.print(); return false;" - class="btn btn-sm btn-print-custom"> - 📄 Print Report - </a> - <table class="table table-sm table-hover cancel-grid mb-0"> - <thead> - <tr> - <th style="width:4%"> - <input type="checkbox" id="chkAll" onclick="toggleAll(this)">
Added / After Commit
+ </div> + <div class="col-md-5"> + <div class="d-flex gap-2 justify-content-end"> + <button type="submit" class="btn btn-sm btn-cancel-custom" id="cancelSelectedBtn" + disabled + onclick="return confirmCancel()"> + 🗑️ Cancel Selected + </button> + @if(count($gridRows)) + <a href="{{ route('print.cancellation', ['orderNo' => base64_encode($orderNo)]) }}" target="_blank" + class="btn btn-sm btn-print-custom"> + 📄 Print Report + </a> + <table class="table table-sm table-hover cancel-grid mb-0"> + <thead> + <tr> + <th style="width:6%" class="text-center"> + <div class="small fw-semibold mb-1">Select</div>
Removed / Before Commit
- </div> - @endif - - <form method="POST" action="{{ route('order.dp-extension.save') }}"> - @csrf - - {{-- ── MAIN CARD ── --}} - <div class="card eas-card"> - <div class="row mb-3"> - <div class="col-md-2"> - <label class="form-label">Order No <span class="text-danger">*</span></label> - <select name="OrderNo" class="form-select form-select-sm form-field-uniform" - onchange="this.form.action='{{ route('order.dp-extension') }}'; this.form.method='get'; this.form.submit()"> - <option value="">Select Order No</option> - @foreach($orderNos as $o) - <option value="{{ $o->OrderNo }}" {{ $o->OrderNo === $orderNo ? 'selected' : '' }}> - </div> - <div class="col-md-2">
Added / After Commit
+ </div> + @endif + + <form method="GET" action="{{ route('order.dp-extension') }}" id="orderLookupForm"></form> + + <form method="POST" action="{{ route('order.dp-extension.save') }}" id="dpExtensionForm"> + @csrf + <input type="hidden" name="OrderNo" id="hidOrderNo" value="{{ $orderNo }}"> + + {{-- ── MAIN CARD ── --}} + <div class="card eas-card"> + <div class="row mb-3"> + <div class="col-md-2"> + <label class="form-label">Order No <span class="text-danger">*</span></label> + <select name="OrderNo" id="ddlOrderNo" form="orderLookupForm" class="form-select form-select-sm form-field-uniform"> + <option value="">Select Order No</option> + @foreach($orderNos as $o) + <option value="{{ $o->OrderNo }}" {{ $o->OrderNo === $orderNo ? 'selected' : '' }}>
Removed / Before Commit
- @endsection - @push('scripts') - <script> - async function saveOrders(){ - const rows=[]; - document.querySelectorAll('#orderBody tr[data-lprspare]').forEach(tr=>{
Added / After Commit
+ @endsection + @push('scripts') + <script> + function showMsg(text, cls){ + const b=document.getElementById('msgBox'); + b.className=`alert alert-${cls} border-start border-5 fw-bold`; + b.textContent=text; + b.classList.remove('d-none'); + setTimeout(()=>b.classList.add('d-none'),6000); + } + async function saveOrders(){ + const rows=[]; + document.querySelectorAll('#orderBody tr[data-lprspare]').forEach(tr=>{
Removed / Before Commit
Added / After Commit
+ <!doctype html> + <html lang="en"> + <head> + <meta charset="utf-8"> + <title>Order Cancellation Report</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> + <style> + body { font-family: Arial, sans-serif; font-size: 13px; color: #111; } + .page { max-width: 1100px; margin: 24px auto; } + .report-title { text-align: center; font-weight: 700; text-transform: uppercase; margin-bottom: 18px; } + .meta-table td { padding: 5px 8px; border: 1px solid #444; } + .meta-table .lbl { width: 16%; font-weight: 700; background: #f2f2f2; } + .items th, .items td { border: 1px solid #444 !important; padding: 6px 8px !important; vertical-align: top; } + .items th { background: #f2f2f2 !important; text-align: center; } + .signature { margin-top: 52px; display: flex; justify-content: flex-end; } + .signature-box { width: 260px; text-align: center; } + @media print { + .no-print { display: none !important; }
Removed / Before Commit
- Route::get('/lpo-dashboard/combo-chart', [LPODashboardController::class, 'comboChart'])->name('lpo.dashboard.combo-chart'); - - // ── LPR ─────────────────────────────────────────────────────────────────── - Route::prefix('lpr')->name('lpr.')->group(function () { - Route::get('/create', [LprEntryController::class, 'create'])->name('create'); - Route::post('/store', [LprEntryController::class, 'store'])->name('store'); - Route::post('/spare', [LprEntryController::class, 'storeSpare'])->name('spare.store'); - }); - - // ── AON ─────────────────────────────────────────────────────────────────── - Route::prefix('aon')->name('aon.')->group(function () { - Route::get('/', [AonController::class, 'index'])->name('index'); - Route::post('/save', [AonController::class, 'save'])->name('save'); - }); - - // ── BID ─────────────────────────────────────────────────────────────────── - Route::prefix('bid')->name('bid.')->group(function () { - Route::get('/', [BidController::class, 'index'])->name('index');
Added / After Commit
+ Route::get('/lpo-dashboard/combo-chart', [LPODashboardController::class, 'comboChart'])->name('lpo.dashboard.combo-chart'); + + // ── LPR ─────────────────────────────────────────────────────────────────── + Route::middleware(['auth'])->prefix('lpr')->name('lpr.')->group(function () { + Route::get('/create', [LprEntryController::class, 'create'])->name('create'); + Route::post('/store', [LprEntryController::class, 'store'])->name('store'); + Route::post('/spare', [LprEntryController::class, 'storeSpare'])->name('spare.store'); + }); + + // ── AON ─────────────────────────────────────────────────────────────────── + Route::middleware(['auth'])->prefix('aon')->name('aon.')->group(function () { + Route::get('/', [AonController::class, 'index'])->name('index'); + Route::post('/save', [AonController::class, 'save'])->name('save'); + }); + + // ── BID ─────────────────────────────────────────────────────────────────── + Route::middleware(['auth'])->prefix('bid')->name('bid.')->group(function () { + Route::get('/', [BidController::class, 'index'])->name('index');