Resolve bug edit and delete

This commit is contained in:
ninavirgiana 2026-03-22 00:01:14 +07:00
parent 4332219600
commit dedf8458ac
6 changed files with 194 additions and 152 deletions

View File

@ -6,6 +6,7 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\DB;
class PakanController extends Controller class PakanController extends Controller
{ {
@ -87,7 +88,9 @@ public function store(Request $request)
/** @var User $user */ /** @var User $user */
$user = Auth::user(); $user = Auth::user();
$request->merge([ $request->merge([
'harga_satuan' => str_replace('.', '', $request->harga_satuan) 'harga_satuan' => $request->harga_satuan
? str_replace('.', '', $request->harga_satuan)
: null
]); ]);
// karyawan TIDAK BOLEH input barang masuk // karyawan TIDAK BOLEH input barang masuk
@ -177,7 +180,9 @@ public function update(Request $request, $id)
/** @var User $user */ /** @var User $user */
$user = Auth::user(); $user = Auth::user();
$request->merge([ $request->merge([
'harga_satuan' => str_replace('.', '', $request->harga_satuan) 'harga_satuan' => $request->harga_satuan
? str_replace('.', '', $request->harga_satuan)
: null
]); ]);
if ($user->isKaryawan()) { if ($user->isKaryawan()) {
abort(403, 'Anda tidak memiliki izin mengedit data.'); abort(403, 'Anda tidak memiliki izin mengedit data.');
@ -220,6 +225,10 @@ public function update(Request $request, $id)
'harga_satuan.max' => 'Harga satuan terlalu besar.', 'harga_satuan.max' => 'Harga satuan terlalu besar.',
]); ]);
try {
DB::transaction(function () use ($request, $id, $namaBarang) {
$item = InventoriKandang::findOrFail($id); $item = InventoriKandang::findOrFail($id);
$total = null; $total = null;
@ -242,9 +251,7 @@ public function update(Request $request, $id)
->value('stok') ?? 0; ->value('stok') ?? 0;
if ($request->jumlah > $stokSekarang) { if ($request->jumlah > $stokSekarang) {
return back()->withErrors([ throw new \Exception('Stok tidak mencukupi. Sisa stok: ' . $stokSekarang);
'jumlah' => 'Stok tidak mencukupi. Sisa stok: ' . $stokSekarang
])->withInput();
} }
} }
@ -259,6 +266,15 @@ public function update(Request $request, $id)
: null, : null,
'total_harga' => $total, 'total_harga' => $total,
]); ]);
});
} catch (\Exception $e) {
return back()
->withErrors([
'jumlah' => $e->getMessage()
])
->withInput();
}
return redirect()->route('pakan')->with('success', 'Transaksi berhasil diupdate'); return redirect()->route('pakan')->with('success', 'Transaksi berhasil diupdate');
} }

View File

@ -5,6 +5,8 @@
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator; use Illuminate\Pagination\Paginator;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\URL;
class AppServiceProvider extends ServiceProvider class AppServiceProvider extends ServiceProvider
{ {
@ -25,5 +27,10 @@ public function boot(): void
// SET BAHASA INDONESIA UNTUK TANGGAL // SET BAHASA INDONESIA UNTUK TANGGAL
Carbon::setLocale('id'); Carbon::setLocale('id');
// PAKSA HTTPS HANYA DI PRODUCTION
if (app()->environment('production')) {
URL::forceScheme('https');
}
} }
} }

View File

@ -452,8 +452,7 @@ class="form-control @error('jumlah') is-invalid @enderror"> --}}
@section('scripts') @section('scripts')
<script> <script>
const baseUrl = "{{ url('/ayam') }}"; const baseUrl = "{{ route('ayam') }}";
$(document).ready(function() { $(document).ready(function() {
/* ============================= /* =============================
HANDLE MODAL EDIT NORMAL HANDLE MODAL EDIT NORMAL

View File

@ -50,12 +50,12 @@ class="form-control form-control-sm">
<label class="small">Tahun</label> <label class="small">Tahun</label>
<select name="tahun" class="form-control form-control-sm"> <select name="tahun" class="form-control form-control-sm">
<option value="">Semua</option> <option value="">Semua</option>
@foreach ([2024, 2025, 2026] as $th) @for ($th = now()->year - 2; $th <= now()->year + 1; $th++)
<option value="{{ $th }}" <option value="{{ $th }}"
{{ request('tahun') == $th ? 'selected' : '' }}> {{ request('tahun') == $th ? 'selected' : '' }}>
{{ $th }} {{ $th }}
</option> </option>
@endforeach @endfor
</select> </select>
</div> </div>
@ -103,7 +103,11 @@ class="form-control form-control-sm">
@endif @endif
@if ($errors->has('delete'))
<div class="alert alert-danger">
{{ $errors->first('delete') }}
</div>
@endif
<!-- TABEL --> <!-- TABEL -->
<div class="p-0 card-body"> <div class="p-0 card-body">
<div class="table-responsive"> <div class="table-responsive">
@ -165,8 +169,8 @@ class="badge badge-{{ $item->jenis_transaksi == 'masuk' ? 'success' : 'danger' }
data-target="#modalEditTransaksi" data-id="{{ $item->id }}" data-target="#modalEditTransaksi" data-id="{{ $item->id }}"
data-nama="{{ $item->nama_barang }}" data-nama="{{ $item->nama_barang }}"
data-jenis="{{ $item->jenis_transaksi }}" data-jenis="{{ $item->jenis_transaksi }}"
data-jumlah="{{ $item->jumlah }}" data-jumlah="{{ (int) $item->jumlah }}"
data-satuan="{{ $item->satuan }}" data-harga="{{ (int) $item->harga_satuan }}"
data-harga="{{ $item->harga_satuan }}" data-harga="{{ $item->harga_satuan }}"
data-tanggal="{{ $item->tanggal }}"> data-tanggal="{{ $item->tanggal }}">
<i class="la la-edit"></i> <i class="la la-edit"></i>
@ -320,7 +324,7 @@ class="form-control @error('jenis_transaksi') is-invalid @enderror" required>
<div class="form-group"> <div class="form-group">
<label>Jumlah</label> <label>Jumlah</label>
<input type="number" name="jumlah" id="jumlahTambah" max="999999" <input type="number" name="jumlah" id="jumlahTambah" max="999999"
min="1" inputmode="numeric" oninput="this.value=this.value.slice(0,6)" min="1" inputmode="numeric" maxlength="6"
class="form-control @error('jumlah') is-invalid @enderror" class="form-control @error('jumlah') is-invalid @enderror"
value="{{ old('jumlah') }}" required> value="{{ old('jumlah') }}" required>
@ -343,7 +347,7 @@ class="form-control @error('jumlah') is-invalid @enderror"
<div class="form-group"> <div class="form-group">
<label>Harga (Rp)</label> <label>Harga (Rp)</label>
<input type="text" name="harga_satuan" id="hargaTambah" <input type="text" name="harga_satuan" id="hargaTambah"
class="form-control @error('harga_satuan') is-invalid @enderror" class="form-control @error('harga_satuan') is-invalid @enderror"
inputmode="numeric" maxlength="12" value="{{ old('harga_satuan') }}"> inputmode="numeric" maxlength="12" value="{{ old('harga_satuan') }}">
@error('harga_satuan') @error('harga_satuan')
@ -434,7 +438,7 @@ class="form-control @error('jenis_transaksi') is-invalid @enderror" required>
<div class="form-group"> <div class="form-group">
<label>Jumlah</label> <label>Jumlah</label>
<input type="number" name="jumlah" id="jumlahEdit" max="999999" min="1" <input type="number" name="jumlah" id="jumlahEdit" max="999999" min="1"
inputmode="numeric" oninput="this.value=this.value.slice(0,6)" inputmode="numeric" maxlength="6"
class="form-control" required> class="form-control" required>
</div> </div>
</div> </div>
@ -513,54 +517,29 @@ class="form-control" required>
@section('scripts') @section('scripts')
<script> <script>
const baseUrl = "{{ url('/pakan') }}"; const baseUrl = "{{ route('pakan') }}";
function formatRupiah(angka) {
/* FORMAT RUPIAH */ if (!angka) return '';
function formatRupiah(angka) {
angka = angka.replace(/[^,\d]/g, '').toString();
let split = angka.split(',');
let sisa = split[0].length % 3;
let rupiah = split[0].substr(0, sisa);
let ribuan = split[0].substr(sisa).match(/\d{3}/gi);
if (ribuan) {
let separator = sisa ? '.' : '';
rupiah += separator + ribuan.join('.');
}
return rupiah;
}
function formatJumlah(angka){
angka = parseFloat(angka);
if(isNaN(angka)) return '';
if(angka === 0) return '0';
return angka.toString().replace(/\.?0+$/, '');
angka = angka.toString().replace(/\D/g, '');
return angka.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
} }
/* TAMBAH */ /* TAMBAH */
function hitungTambah() { function hitungTambah() {
let j = $('#jumlahTambah').val() || 0; let j = parseInt($('#jumlahTambah').val()) || 0;
let h = $('#hargaTambah').val().replace(/\./g, '') || 0;
let h = $('#hargaTambah').val().replace(/\D/g, '');
h = parseInt(h) || 0;
$('#totalTambah').val( $('#totalTambah').val(
'Rp ' + (j * h).toLocaleString('id-ID') 'Rp ' + (j * h).toLocaleString('id-ID')
); );
}
$('#hargaTambah').on('input', function() {
} let angka = this.value.replace(/\D/g, '');
$('#jumlahTambah, #hargaTambah').on('input', hitungTambah);
/* format harga tambah */
$('#hargaTambah').on('keyup', function() {
let angka = this.value.replace(/\./g, '');
if (angka.length > 9) { if (angka.length > 9) {
angka = angka.slice(0, 9); angka = angka.slice(0, 9);
@ -568,9 +547,11 @@ function hitungTambah() {
this.value = formatRupiah(angka); this.value = formatRupiah(angka);
hitungTambah(); hitungTambah();
});
});
/* format harga tambah */
$('#jumlahTambah').on('input', hitungTambah);
$('#jenisTambah').on('change', function() { $('#jenisTambah').on('change', function() {
if (this.value === 'keluar') { if (this.value === 'keluar') {
@ -585,20 +566,21 @@ function hitungTambah() {
/* EDIT */ /* EDIT */
function hitungEdit() { function hitungEdit() {
let j = $('#jumlahEdit').val() || 0; let j = parseInt($('#jumlahEdit').val()) || 0;
let h = $('#hargaEdit').val().replace(/\./g, '') || 0;
let h = $('#hargaEdit').val().replace(/\./g, '');
h = parseInt(h) || 0;
$('#totalEdit').val( $('#totalEdit').val(
'Rp ' + (j * h).toLocaleString('id-ID') j && h ? 'Rp ' + (j * h).toLocaleString('id-ID') : ''
); );
}
}
/* realtime hitung */ /* realtime hitung */
$('#jumlahEdit, #hargaEdit').on('input', hitungEdit); $('#jumlahEdit, #hargaEdit').on('input', hitungEdit);
/* format harga edit */ /* format harga edit */
$('#hargaEdit').on('keyup', function() { $('#hargaEdit').on('input', function() {
let angka = this.value.replace(/\./g, ''); let angka = this.value.replace(/\./g, '');
@ -609,8 +591,7 @@ function hitungEdit() {
this.value = formatRupiah(angka); this.value = formatRupiah(angka);
hitungEdit(); hitungEdit();
}); });
/* perubahan jenis transaksi edit */ /* perubahan jenis transaksi edit */
$('#jenisEdit').on('change', function() { $('#jenisEdit').on('change', function() {
@ -630,26 +611,38 @@ function hitungEdit() {
let btn = $(e.relatedTarget); let btn = $(e.relatedTarget);
$('#formEditTransaksi').attr('action', baseUrl + '/' + btn.data('id')); $('#formEditTransaksi').attr('action', baseUrl + '/' + btn.data('id'));
$('#formEditTransaksi [name=nama_barang]').val(btn.data('nama'));
$('#formEditTransaksi [name=jenis_transaksi]').val(btn.data('jenis'));
$('#formEditTransaksi [name=jumlah]').val(
formatJumlah(btn.data('jumlah'))
);
let harga = btn.data('harga');
if (harga !== null && harga !== undefined) { // FIX NAMA BARANG
harga = formatRupiah(harga.toString()); $('#namaEdit').val(''); // RESET DULU
} else {
harga = '';
}
$('#formEditTransaksi [name=harga_satuan]').val(harga); let nama = btn.data('nama');
$('#formEditTransaksi [name=tanggal]').val(btn.data('tanggal')); $('#namaEdit option').each(function () {
if ($(this).val().toLowerCase() === String(nama).toLowerCase()) {
$(this).prop('selected', true);
}
});
// jenis
$('#jenisEdit').val(btn.data('jenis'));
// jumlah (langsung angka asli)
$('#jumlahEdit').val(btn.data('jumlah'));
// harga
let harga = parseInt(btn.data('harga')) || 0;
$('#hargaEdit').val(harga ? formatRupiah(harga.toString()) : '');
// if (harga !== null && harga !== undefined && harga !== '') {
// $('#hargaEdit').val(formatRupiah(harga));} else {
// $('#hargaEdit').val('');
// }
// tanggal
$('#tanggalEdit').val(btn.data('tanggal'));
$('#jenisEdit').trigger('change'); $('#jenisEdit').trigger('change');
hitungEdit(); hitungEdit();
});
});
/* HAPUS */ /* HAPUS */
$('#modalHapusTransaksi').on('show.bs.modal', function(e) { $('#modalHapusTransaksi').on('show.bs.modal', function(e) {

View File

@ -392,15 +392,15 @@ function autoSubmit() {
}); });
function formatBerat(angka) { function formatBerat(angka) {
angka = parseFloat(angka); if (!angka && angka !== 0) return '';
if (isNaN(angka)) return ''; let num = Number(angka);
// jika nilainya 0 tetap tampil 0 if (Number.isInteger(num)) {
if (angka === 0) return '0'; return num.toString(); // contoh: 10 tetap 10
}
// hilangkan .00 atau nol di belakang return num.toFixed(2).replace(/\.?0+$/, ''); // contoh: 10.50 → 10.5
return angka.toString().replace(/\.?0+$/, '');
} }
/* MODAL EDIT */ /* MODAL EDIT */

View File

@ -386,9 +386,13 @@ function formatJumlah(angka) {
if (isNaN(angka)) return ''; if (isNaN(angka)) return '';
if (angka === 0) return '0'; // kalau bilangan bulat, tampilkan tanpa desimal
if (Number.isInteger(angka)) {
return angka.toString();
}
return angka.toString().replace(/\.?0+$/, ''); // kalau desimal, tampilkan normal (tanpa nol berlebih)
return angka.toString().replace(/(\.\d*?[1-9])0+$/, '$1');
} }
function formatRupiah(angka) { function formatRupiah(angka) {
@ -522,26 +526,51 @@ function hitungTotalTambah() {
function hitungTotalEdit() { function hitungTotalEdit() {
let jumlah = parseFloat($('#modalEditPenjualan input[name=jumlah]').val()) || 0; let jumlah = parseFloat($('#modalEditPenjualan input[name=jumlah]').val()) || 0;
let harga = parseFloat($('#modalEditPenjualan input[name=harga_satuan]').val()) || 0;
let harga = $('#modalEditPenjualan input[name=harga_satuan]').val()
.replace(/\./g, ''); // 🔥 hapus titik dulu
harga = parseFloat(harga) || 0;
let total = jumlah * harga; let total = jumlah * harga;
$('#totalPreviewEdit').val( $('#totalPreviewEdit').val(
"Rp " + total.toLocaleString('id-ID') "Rp " + total.toLocaleString('id-ID')
); );
} }
$('#modalEditPenjualan input[name=harga_satuan]').on('input', function() {
let angka = $(this).val().replace(/\D/g, '');
if (parseInt(angka || 0) > 99999999) {
angka = '99999999';
}
let rupiah = angka.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
$(this).val(rupiah);
hitungTotalEdit();
});
$('#formEdit').on('submit', function() {
let harga = $('#modalEditPenjualan input[name=harga_satuan]')
.val()
.replace(/\./g, '');
$('#modalEditPenjualan input[name=harga_satuan]').val(harga);
});
$('#modalEditPenjualan input[name=jumlah], #modalEditPenjualan input[name=harga_satuan]')
.on('input', hitungTotalEdit);
// FORMAT RUPIAH + PEMBATASAN HARGA // FORMAT RUPIAH + PEMBATASAN HARGA
$('#hargaTambah').on('input', function() { $('#hargaTambah').on('input', function() {
let angka = $(this).val().replace(/\D/g, ''); let angka = $(this).val().replace(/\D/g, '');
// BATAS MAKSIMAL // BATAS MAKSIMAL
if (angka > 99999999) { if (parseInt(angka || 0) > 99999999) {
angka = 99999999; angka = '99999999';
} }
// FORMAT RIBUAN // FORMAT RIBUAN
let rupiah = angka.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "."); let rupiah = angka.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
@ -551,11 +580,9 @@ function hitungTotalEdit() {
hitungTotalTambah(); hitungTotalTambah();
}); });
$('form').on('submit', function() { $('#modalTambahPenjualan form').on('submit', function() {
let harga = $('#hargaTambah').val().replace(/\./g, ''); let harga = $('#hargaTambah').val().replace(/\./g, '');
$('#hargaTambah').val(harga); $('#hargaTambah').val(harga);
}); });
}); });
</script> </script>