diff --git a/htdocs/app/Http/Controllers/BiorepositoryController.php b/htdocs/app/Http/Controllers/BiorepositoryController.php index c4780763..5cebc63c 100644 --- a/htdocs/app/Http/Controllers/BiorepositoryController.php +++ b/htdocs/app/Http/Controllers/BiorepositoryController.php @@ -122,9 +122,12 @@ class BiorepositoryController extends Controller 'slotnomor' => 'required|integer|min:1', 'boxnomor' => 'required|integer|min:1', 'tubenomor' => 'required|integer|min:1', - 'nmbakteri' => 'required|max:200', - 'strain' => 'required|in:Gram Negatif,Gram Positif', + 'nmbakteri' => 'nullable|max:200', + 'strain' => 'nullable|in:Gram Negatif,Gram Positif', 'stored_at' => 'required|date', + 'volume' => 'nullable|numeric|min:0', + 'volume_ambil' => 'nullable|numeric|min:0', + 'existing_specimen_id' => 'nullable|integer', ]); if ($validator->fails()) { @@ -151,10 +154,36 @@ class BiorepositoryController extends Controller $slotTaken = BioSpecimen::where('rack_id', $rack->id) ->where('shelf_number', $request->input('shelfnomor')) ->where('tube_number', $request->input('tubenomor')) - ->exists(); + ->first(); if ($slotTaken) { - return back()->withErrors(['tubenomor' => 'Posisi tube pada shelf ini sudah terisi spesimen.'])->withInput(); + $existingId = (int) $request->input('existing_specimen_id'); + if ($existingId !== (int) $slotTaken->id) { + return back()->withErrors(['tubenomor' => 'Posisi tube pada shelf ini sudah terisi spesimen.'])->withInput(); + } + + $volumeAmbil = (float) $request->input('volume_ambil'); + if ($volumeAmbil <= 0) { + return back()->withErrors(['volume_ambil' => 'Isi volume yang diambil dari spesimen.'])->withInput(); + } + + $volumeSekarang = (float) ($slotTaken->volume ?? 0); + if ($volumeAmbil > $volumeSekarang) { + return back()->withErrors(['volume_ambil' => 'Volume diambil melebihi sisa volume spesimen.'])->withInput(); + } + + $slotTaken->volume = (string) ($volumeSekarang - $volumeAmbil); + $slotTaken->save(); + + return redirect('/biorepository')->with('success', 'Pengambilan volume berhasil. Sisa volume diperbarui.'); + } + + if (!$request->filled('nmbakteri') || !$request->filled('strain')) { + return back()->withErrors(['nmbakteri' => 'Nama bakteri dan strain wajib diisi untuk spesimen baru.'])->withInput(); + } + + if (!$request->filled('volume')) { + return back()->withErrors(['volume' => 'Volume awal spesimen wajib diisi.'])->withInput(); } $atccByUser = strtoupper(preg_replace('/[^A-Za-z0-9]/', '', Session::get('nama', 'UNKNOWN'))); @@ -195,6 +224,7 @@ class BiorepositoryController extends Controller 'input_by' => Session::get('nama'), 'stored_at' => $request->input('stored_at'), 'storage_condition' => $this->mapStorageCondition($request->input('kategorisimpan')), + 'volume' => (string) $request->input('volume'), 'notes' => $request->input('notes'), ]); diff --git a/htdocs/resources/views/admin/biorepository.blade.php b/htdocs/resources/views/admin/biorepository.blade.php index edb3cee9..a927cf1f 100644 --- a/htdocs/resources/views/admin/biorepository.blade.php +++ b/htdocs/resources/views/admin/biorepository.blade.php @@ -63,7 +63,7 @@ background: #fce8e8; border-color: #e7adad; color: #8d1f1f; - cursor: not-allowed; + cursor: pointer; } .oldest-highlight { border: 1px solid #ffd58f; @@ -206,9 +206,23 @@ @for($tube = 1; $tube <= $tubeCapacity; $tube++) @php $tubeKey = $shelf.'-'.$tube; @endphp @if(isset($tubeMap[$tubeKey])) -
- {{ ($tubeMap[$tubeKey]->bacteria_name ?? $tubeMap[$tubeKey]->specimen_name) }} / {{ $tubeMap[$tubeKey]->strain ?? '-' }} -
+ @else