update tgl 28 april 2

This commit is contained in:
whywdd 2025-04-28 23:42:49 +07:00
parent a074805ce6
commit 749d33bed0
3 changed files with 124 additions and 22 deletions

View File

@ -3,40 +3,53 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\UangMasukModel; // Import model use App\Models\UangMasukModel; // Import model
use App\Models\GajiModel; // Import model gaji
use Illuminate\Http\Request; use Illuminate\Http\Request;
class UangMasukController extends Controller class UangMasukController extends Controller
{ {
public function index() public function index()
{ {
return view('UangMasuk'); // Ambil data karyawan untuk dropdown
$karyawans = GajiModel::whereNotNull('gaji')
->where('gaji', '>', 0)
->select('id', 'nama', 'jabatan', 'gaji')
->get();
return view('UangMasuk', compact('karyawans'));
} }
public function store(Request $request) public function store(Request $request)
{ {
try { try {
// Validasi input $request->validate([
$validated = $request->validate([
'Tanggal' => 'required|date', 'Tanggal' => 'required|date',
'keterangan_type' => 'required|in:karyawan,manual',
'kategori' => 'required|array', 'kategori' => 'required|array',
'kategori.*' => 'required|string',
'keterangan' => 'required|string',
'nominal' => 'required|array',
'nominal.*' => 'required|string',
'posisi' => 'required|array', 'posisi' => 'required|array',
'posisi.*' => 'required|in:debit,kredit', 'nominal' => 'required|array',
]); ]);
// Inisialisasi data untuk disimpan // Gabungkan keterangan berdasarkan tipe input
$keterangan = '';
if ($request->keterangan_type === 'karyawan') {
$keterangan = $request->keterangan;
if ($request->filled('keterangan_tambahan')) {
$keterangan = $request->keterangan_tambahan;
}
} else {
$keterangan = $request->keterangan_manual;
}
$data = [ $data = [
'Tanggal' => $validated['Tanggal'], 'Tanggal' => $request->Tanggal,
'keterangan' => $validated['keterangan'], 'keterangan' => $keterangan,
]; ];
// Proses setiap rekening // Proses setiap rekening
foreach ($validated['kategori'] as $index => $kategori) { foreach ($request->kategori as $index => $kategori) {
$kode = $this->generateKode($kategori); $kode = $this->generateKode($kategori);
$nominal = str_replace(['.', ','], '', $validated['nominal'][$index]); $nominal = str_replace(['.', ','], '', $request->nominal[$index]);
// Set kode dan kategori sesuai urutan // Set kode dan kategori sesuai urutan
$positionIndex = $index === 0 ? '' : ($index + 1); $positionIndex = $index === 0 ? '' : ($index + 1);
@ -44,7 +57,7 @@ public function store(Request $request)
$data["kategori" . $positionIndex] = $kategori; $data["kategori" . $positionIndex] = $kategori;
// Set uang_masuk atau uang_keluar berdasarkan posisi // Set uang_masuk atau uang_keluar berdasarkan posisi
if ($validated['posisi'][$index] === 'debit') { if ($request->posisi[$index] === 'debit') {
$data["uang_masuk" . $positionIndex] = $nominal; $data["uang_masuk" . $positionIndex] = $nominal;
$data["uang_keluar" . $positionIndex] = null; $data["uang_keluar" . $positionIndex] = null;
} else { } else {

View File

@ -5,7 +5,7 @@
<!-- Header --> <!-- Header -->
<div class="mb-4 bg-blue-600 text-white p-4 rounded-lg shadow-md"> <div class="mb-4 bg-blue-600 text-white p-4 rounded-lg shadow-md">
<h1 class="text-2xl font-bold">Gaji Karyawan</h1> <h1 class="text-2xl font-bold">Gaji Karyawan</h1>
<p class="text-sm mt-1">Tabel keterangan gaji karyawan</p> <p class="text-sm mt-1">Tabel keterangan karyawan</p>
</div> </div>
<!-- SweetAlert2 CSS --> <!-- SweetAlert2 CSS -->

View File

@ -29,13 +29,60 @@ class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:
<label class="block text-sm font-medium text-gray-700 mb-1"> <label class="block text-sm font-medium text-gray-700 mb-1">
Keterangan <span class="text-red-600">*</span> Keterangan <span class="text-red-600">*</span>
</label> </label>
<textarea <div class="space-y-2">
name="keterangan" <!-- Radio Button untuk memilih input -->
class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" <div class="flex items-center space-x-4">
rows="3" <label class="flex items-center">
placeholder="Masukkan keterangan transaksi" <input type="radio" name="keterangan_type" value="karyawan" checked class="mr-2" onchange="toggleKeteranganInput()">
required <span>Pilih Karyawan</span>
></textarea> </label>
<label class="flex items-center">
<input type="radio" name="keterangan_type" value="manual" class="mr-2" onchange="toggleKeteranganInput()">
<span>Input Manual</span>
</label>
</div>
<!-- Dropdown Karyawan -->
<div id="karyawanInput">
<div class="space-y-4">
<select
id="keterangan"
name="keterangan"
class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500"
required
>
<option value="">Pilih Karyawan</option>
@foreach($karyawans as $karyawan)
<option value="{{ $karyawan->nama }}" data-gaji="{{ $karyawan->gaji }}">{{ $karyawan->nama }} - {{ $karyawan->jabatan }}</option>
@endforeach
</select>
<!-- Input Keterangan Tambahan -->
<div class="form-group">
<label class="block text-sm font-medium text-gray-700 mb-1">
Keterangan Tambahan
</label>
<textarea
name="keterangan_tambahan"
class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500"
rows="3"
placeholder="Tambahkan keterangan lain jika diperlukan"
></textarea>
</div>
</div>
</div>
<!-- Input Manual -->
<div id="manualInput" class="hidden">
<textarea
name="keterangan_manual"
class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500"
rows="3"
placeholder="Masukkan keterangan"
required
></textarea>
</div>
</div>
</div> </div>
<!-- Container untuk rekening-rekening --> <!-- Container untuk rekening-rekening -->
@ -228,6 +275,24 @@ class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-
let rekeningCount = 1; let rekeningCount = 1;
const MAX_REKENING = 5; const MAX_REKENING = 5;
function toggleKeteranganInput() {
const karyawanInput = document.getElementById('karyawanInput');
const manualInput = document.getElementById('manualInput');
const keteranganType = document.querySelector('input[name="keterangan_type"]:checked').value;
if (keteranganType === 'karyawan') {
karyawanInput.classList.remove('hidden');
manualInput.classList.add('hidden');
document.getElementById('keterangan').required = true;
document.querySelector('textarea[name="keterangan_manual"]').required = false;
} else {
karyawanInput.classList.add('hidden');
manualInput.classList.remove('hidden');
document.getElementById('keterangan').required = false;
document.querySelector('textarea[name="keterangan_manual"]').required = true;
}
}
function tambahRekening() { function tambahRekening() {
if (rekeningCount >= MAX_REKENING) { if (rekeningCount >= MAX_REKENING) {
Swal.fire({ Swal.fire({
@ -318,6 +383,18 @@ function validateBalance() {
}); });
return; return;
} }
// Set keterangan berdasarkan input yang dipilih
const keteranganType = document.querySelector('input[name="keterangan_type"]:checked').value;
if (keteranganType === 'karyawan') {
const karyawan = document.getElementById('keterangan').value;
const tambahan = document.querySelector('textarea[name="keterangan_tambahan"]').value;
document.querySelector('textarea[name="keterangan_manual"]').value = '';
document.getElementById('keterangan').value = tambahan ? `${karyawan} - ${tambahan}` : karyawan;
} else {
const manual = document.querySelector('textarea[name="keterangan_manual"]').value;
document.getElementById('keterangan').value = manual;
}
}); });
// Event listener untuk input nominal // Event listener untuk input nominal
@ -335,6 +412,18 @@ function validateBalance() {
} }
}); });
document.getElementById('keterangan').addEventListener('change', function() {
const selectedOption = this.options[this.selectedIndex];
const gaji = selectedOption.getAttribute('data-gaji');
if (gaji) {
const nominalInputs = document.getElementsByName('nominal[]');
if (nominalInputs.length > 0) {
nominalInputs[0].value = new Intl.NumberFormat('id-ID').format(gaji);
validateBalance();
}
}
});
@if(session('success')) @if(session('success'))
Swal.fire({ Swal.fire({
icon: 'success', icon: 'success',