update pakan

This commit is contained in:
ninavirgiana 2026-03-24 10:43:42 +07:00
parent dedf8458ac
commit ff786d572a
2 changed files with 183 additions and 109 deletions

View File

@ -101,7 +101,7 @@ public function store(Request $request)
$request->validate([
'tanggal' => 'required|date|before_or_equal:today',
'nama_barang' => 'required|string|max:100',
'nama_barang' => 'required|string|max:100',
'jenis_transaksi' => 'required|in:masuk,keluar',
'jumlah' => 'required|numeric|min:1|max:999999',
// 'satuan' => 'required|string|max:50|in:karung',
@ -190,41 +190,43 @@ public function update(Request $request, $id)
$namaBarang = ucfirst(strtolower(trim($request->nama_barang)));
$request->validate([
$validator = \Illuminate\Support\Facades\Validator::make($request->all(), [
'tanggal' => 'required|date|before_or_equal:today',
'nama_barang' => 'required|string|max:100',
'nama_barang' => 'required|string|max:100',
'jenis_transaksi' => 'required|in:masuk,keluar',
'jumlah' => 'required|numeric|min:1|max:999999',
// 'satuan' => 'required|string|max:50|in:karung',
'harga_satuan' => $request->jenis_transaksi === 'masuk'
'jumlah' => 'required|numeric|min:1|max:999999',
'harga_satuan' => $request->jenis_transaksi === 'masuk'
? 'required|numeric|min:1|max:999999999'
: 'nullable',
], [
'tanggal.required' => 'Tanggal wajib diisi.',
'tanggal.date' => 'Format tanggal tidak valid.',
'nama_barang.required' => 'Nama barang wajib diisi.',
'nama_barang.string' => 'Nama barang harus berupa teks.',
'nama_barang.max' => 'Nama barang maksimal 100 karakter.',
'nama_barang.required' => 'Nama barang wajib diisi.',
'nama_barang.string' => 'Nama barang harus berupa teks.',
'nama_barang.max' => 'Nama barang maksimal 100 karakter.',
'jenis_transaksi.required' => 'Jenis transaksi wajib dipilih.',
'jenis_transaksi.in' => 'Jenis transaksi tidak valid.',
'jenis_transaksi.in' => 'Jenis transaksi tidak valid.',
'jumlah.required' => 'Jumlah wajib diisi.',
'jumlah.numeric' => 'Jumlah harus berupa angka.',
'jumlah.min' => 'Jumlah minimal 1.',
'jumlah.max' => 'Jumlah terlalu besar.',
'jumlah.required' => 'Jumlah wajib diisi.',
'jumlah.numeric' => 'Jumlah harus berupa angka.',
'jumlah.min' => 'Jumlah minimal 1.',
'jumlah.max' => 'Jumlah terlalu besar.',
// 'satuan.required' => 'Satuan wajib diisi.',
// 'satuan.string' => 'Satuan harus berupa teks.',
// 'satuan.max' => 'Satuan maksimal 50 karakter.',
'harga_satuan.required' => 'Harga satuan wajib diisi untuk transaksi masuk.',
'harga_satuan.numeric' => 'Harga satuan harus berupa angka.',
'harga_satuan.min' => 'Harga satuan minimal 1.',
'harga_satuan.max' => 'Harga satuan terlalu besar.',
'harga_satuan.required' => 'Harga satuan wajib diisi untuk transaksi masuk.',
'harga_satuan.numeric' => 'Harga satuan harus berupa angka.',
'harga_satuan.min' => 'Harga satuan minimal 1.',
'harga_satuan.max' => 'Harga satuan terlalu besar.',
]);
if ($validator->fails()) {
return back()
->withErrors($validator, 'edit')
->withInput()
->with('edit_id', $id);
}
try {
DB::transaction(function () use ($request, $id, $namaBarang) {
@ -272,8 +274,9 @@ public function update(Request $request, $id)
return back()
->withErrors([
'jumlah' => $e->getMessage()
])
->withInput();
], 'edit')
->withInput()
->with('edit_id', $id);
}
return redirect()->route('pakan')->with('success', 'Transaksi berhasil diupdate');

View File

@ -50,7 +50,7 @@ class="form-control form-control-sm">
<label class="small">Tahun</label>
<select name="tahun" class="form-control form-control-sm">
<option value="">Semua</option>
@for ($th = now()->year - 2; $th <= now()->year + 1; $th++)
@for ($th = now()->year - 2; $th <= now()->year + 1; $th++)
<option value="{{ $th }}"
{{ request('tahun') == $th ? 'selected' : '' }}>
{{ $th }}
@ -103,15 +103,16 @@ class="form-control form-control-sm">
@endif
@if ($errors->has('delete'))
<div class="alert alert-danger">
{{ $errors->first('delete') }}
</div>
@endif
@if ($errors->has('delete'))
<div class="alert alert-danger">
{{ $errors->first('delete') }}
</div>
@endif
<!-- TABEL -->
<div class="p-0 card-body">
<div class="table-responsive">
<table class="table mb-0" style="table-layout:fixed; width:100%;"> <thead class="table-light">
<table class="table mb-0" style="table-layout:fixed; width:100%;">
<thead class="table-light">
<tr>
<th class="text-center" style="width:60px;">No</th>
<th style="width:150px;">Tanggal</th>
@ -170,9 +171,8 @@ class="badge badge-{{ $item->jenis_transaksi == 'masuk' ? 'success' : 'danger' }
data-nama="{{ $item->nama_barang }}"
data-jenis="{{ $item->jenis_transaksi }}"
data-jumlah="{{ (int) $item->jumlah }}"
data-harga="{{ (int) $item->harga_satuan }}"
data-harga="{{ $item->harga_satuan }}"
data-tanggal="{{ $item->tanggal }}">
data-harga="{{ (int) $item->harga_satuan }}"
{{-- data-harga="{{ $item->harga_satuan }}" --}} data-tanggal="{{ $item->tanggal }}">
<i class="la la-edit"></i>
</button>
@ -279,8 +279,12 @@ class="form-control @error('jenis_transaksi') is-invalid @enderror" required>
</div>
<div class="form-group">
<label>Tanggal</label>
<input type="date" name="tanggal" class="form-control"
<input type="date" name="tanggal"
class="form-control @error('tanggal') is-invalid @enderror"
value="{{ old('tanggal', date('Y-m-d')) }}" max="{{ date('Y-m-d') }}" required>
@error('tanggal')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label>Nama Barang</label>
@ -347,7 +351,7 @@ class="form-control @error('jumlah') is-invalid @enderror"
<div class="form-group">
<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"
inputmode="numeric" maxlength="12" value="{{ old('harga_satuan') }}">
@error('harga_satuan')
@ -411,18 +415,23 @@ class="form-control @error('jenis_transaksi') is-invalid @enderror" required>
</select>
@error('jenis_transaksi')
@error('jenis_transaksi', 'edit')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label>Tanggal</label>
<input type="date" name="tanggal" id="tanggalEdit" class="form-control"
max="{{ date('Y-m-d') }}" required>
<input type="date" name="tanggal" id="tanggalEdit"
class="form-control @error('tanggal') is-invalid @enderror" max="{{ date('Y-m-d') }}"
required>
@error('tanggal', 'edit')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label>Nama Barang</label>
<select name="nama_barang" id="namaEdit" class="form-control" required>
<select name="nama_barang" id="namaEdit"
class="form-control @error('nama_barang') is-invalid @enderror" required>
<option value="Jagung">Jagung</option>
<option value="Katul">Katul</option>
@ -431,6 +440,9 @@ class="form-control @error('jenis_transaksi') is-invalid @enderror" required>
<option value="Pakan Starter">Pakan Starter</option>
</select>
@error('nama_barang', 'edit')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="row">
@ -439,7 +451,10 @@ class="form-control @error('jenis_transaksi') is-invalid @enderror" required>
<label>Jumlah</label>
<input type="number" name="jumlah" id="jumlahEdit" max="999999" min="1"
inputmode="numeric" maxlength="6"
class="form-control" required>
class="form-control @error('jumlah') is-invalid @enderror" required>
@error('jumlah', 'edit')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
</div>
<div class="col-md-4">
@ -453,8 +468,12 @@ class="form-control" required>
<div class="col-md-4 harga-edit">
<div class="form-group">
<label>Harga Satuan (Rp)</label>
<input type="text" name="harga_satuan" id="hargaEdit" class="form-control"
<input type="text" name="harga_satuan" id="hargaEdit"
class="form-control @error('harga_satuan') is-invalid @enderror"
inputmode="numeric" maxlength="12">
@error('harga_satuan', 'edit')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
</div>
</div>
@ -517,48 +536,53 @@ class="form-control" required>
@section('scripts')
<script>
const baseUrl = "{{ route('pakan') }}";
function formatRupiah(angka) {
if (!angka) return '';
const baseUrl = "{{ route('pakan') }}";
angka = angka.toString().replace(/\D/g, '');
return angka.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
function formatRupiah(angka) {
if (!angka) return '';
angka = angka.toString().replace(/\D/g, '');
return angka.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
/* TAMBAH */
function hitungTambah() {
let j = parseInt($('#jumlahTambah').val()) || 0;
let j = parseInt($('#jumlahTambah').val()) || 0;
let h = $('#hargaTambah').val().replace(/\D/g, '');
h = parseInt(h) || 0;
let h = $('#hargaTambah').val().replace(/\D/g, '');
h = parseInt(h) || 0;
$('#totalTambah').val(
'Rp ' + (j * h).toLocaleString('id-ID')
);
}
$('#hargaTambah').on('input', function() {
$('#totalTambah').val(
'Rp ' + (j * h).toLocaleString('id-ID')
);
}
$('#hargaTambah').on('input', function() {
let angka = this.value.replace(/\D/g, '');
let angka = this.value.replace(/\D/g, '');
if (angka.length > 9) {
angka = angka.slice(0, 9);
}
if (angka.length > 9) {
angka = angka.slice(0, 9);
}
this.value = formatRupiah(angka);
hitungTambah();
});
this.value = formatRupiah(angka);
hitungTambah();
});
/* format harga tambah */
$('#jumlahTambah').on('input', hitungTambah);
$('#jumlahTambah').on('input', hitungTambah);
$('#jenisTambah').on('change', function() {
if (this.value === 'keluar') {
$('.harga-tambah').hide();
$('#hargaTambah,#totalTambah').val('');
$('#hargaTambah')
.val('')
.prop('disabled', true);
$('#totalTambah').val('');
} else {
$('.harga-tambah').show();
$('#hargaTambah').prop('disabled', false);
}
});
@ -566,32 +590,32 @@ function hitungTambah() {
/* EDIT */
function hitungEdit() {
let j = parseInt($('#jumlahEdit').val()) || 0;
let j = parseInt($('#jumlahEdit').val()) || 0;
let h = $('#hargaEdit').val().replace(/\./g, '');
h = parseInt(h) || 0;
let h = $('#hargaEdit').val().replace(/\./g, '');
h = parseInt(h) || 0;
$('#totalEdit').val(
j && h ? 'Rp ' + (j * h).toLocaleString('id-ID') : ''
);
}
$('#totalEdit').val(
j && h ? 'Rp ' + (j * h).toLocaleString('id-ID') : ''
);
}
/* realtime hitung */
$('#jumlahEdit, #hargaEdit').on('input', hitungEdit);
/* format harga edit */
$('#hargaEdit').on('input', function() {
$('#hargaEdit').on('input', function() {
let angka = this.value.replace(/\./g, '');
let angka = this.value.replace(/\./g, '');
if (angka.length > 9) {
angka = angka.slice(0, 9);
}
if (angka.length > 9) {
angka = angka.slice(0, 9);
}
this.value = formatRupiah(angka);
hitungEdit();
this.value = formatRupiah(angka);
hitungEdit();
});
});
/* perubahan jenis transaksi edit */
$('#jenisEdit').on('change', function() {
@ -608,41 +632,44 @@ function hitungEdit() {
/* modal edit dibuka */
$('#modalEditTransaksi').on('show.bs.modal', function(e) {
let btn = $(e.relatedTarget);
// CEK: kalau ada error edit, JANGAN override input
let isError = {{ $errors->edit->any() ? 'true' : 'false' }};
$('#formEditTransaksi').attr('action', baseUrl + '/' + btn.data('id'));
if (isError) return; // STOP di sini, biar pakai old()
// FIX NAMA BARANG
$('#namaEdit').val(''); // RESET DULU
let btn = $(e.relatedTarget);
let id = btn.data('id');
let nama = btn.data('nama');
$('#namaEdit option').each(function () {
if ($(this).val().toLowerCase() === String(nama).toLowerCase()) {
$(this).prop('selected', true);
}
});
$('#formEditTransaksi').attr('action', baseUrl + '/' + btn.data('id'));
// jenis
$('#jenisEdit').val(btn.data('jenis'));
// FIX NAMA BARANG
$('#namaEdit').val(''); // RESET DULU
// jumlah (langsung angka asli)
$('#jumlahEdit').val(btn.data('jumlah'));
let nama = btn.data('nama');
$('#namaEdit option').each(function() {
if ($(this).val().toLowerCase() === String(nama).toLowerCase()) {
$(this).prop('selected', true);
}
});
// harga
let harga = parseInt(btn.data('harga')) || 0;
// jenis
$('#jenisEdit').val(btn.data('jenis'));
$('#hargaEdit').val(harga ? formatRupiah(harga.toString()) : '');
// if (harga !== null && harga !== undefined && harga !== '') {
// $('#hargaEdit').val(formatRupiah(harga));} else {
// $('#hargaEdit').val('');
// }
// jumlah (langsung angka asli)
$('#jumlahEdit').val(btn.data('jumlah'));
// tanggal
$('#tanggalEdit').val(btn.data('tanggal'));
// harga
let harga = parseInt(btn.data('harga')) || 0;
$('#jenisEdit').trigger('change');
hitungEdit();
});
$('#hargaEdit').val(harga ? formatRupiah(harga.toString()) : '');
// tanggal
$('#tanggalEdit').val(btn.data('tanggal'));
$('#jenisEdit').trigger('change');
hitungEdit();
});
/* HAPUS */
$('#modalHapusTransaksi').on('show.bs.modal', function(e) {
@ -686,15 +713,59 @@ function hitungEdit() {
@endif
@if ($errors->any())
@if ($errors->any() && !$errors->edit->any())
<script>
$(document).ready(function() {
$('#modalTransaksi').modal('show');
hitungTambah();
let jenis = "{{ old('jenis_transaksi') }}";
if (jenis === 'keluar') {
$('.harga-tambah').hide();
$('#hargaTambah').prop('disabled', true);
} else {
$('.harga-tambah').show();
$('#hargaTambah').prop('disabled', false);
}
hitungTambah();
});
</script>
@endif
@if ($errors->edit->any())
<script>
$(document).ready(function() {
let id = "{{ session('edit_id') }}";
// SET ACTION WAJIB!
$('#formEditTransaksi').attr('action', "{{ route('pakan') }}/" + id);
$('#modalEditTransaksi').modal('show');
// isi pakai old input
$('#jenisEdit').val("{{ old('jenis_transaksi') }}");
$('#tanggalEdit').val("{{ old('tanggal') }}");
$('#jumlahEdit').val("{{ old('jumlah') }}");
let nama = "{{ old('nama_barang') }}";
$('#namaEdit option').each(function() {
if ($(this).val().toLowerCase() === nama.toLowerCase()) {
$(this).prop('selected', true);
}
});
let harga = "{{ old('harga_satuan') }}";
if (harga) {
$('#hargaEdit').val(formatRupiah(harga));
}
$('#jenisEdit').trigger('change');
hitungEdit();
});
</script>
@endif
@endsection