From 3c63cb5d22d03cd850dcef9f0cda94d11c198759 Mon Sep 17 00:00:00 2001 From: Dwi Swandhana Date: Sat, 21 Feb 2026 06:06:56 +0700 Subject: [PATCH] update --- .../app/Http/Controllers/GudangController.php | 630 ++++++++++++++++++ .../app/Http/Controllers/PoliController.php | 616 +++-------------- ...er_simbhp_for_unit_breakdown_and_stats.php | 56 ++ htdocs/resources/views/admin/gudang.blade.php | 157 ++++- .../base/partials/header-plain.blade.php | 9 +- htdocs/routes/web.php | 11 +- 6 files changed, 923 insertions(+), 556 deletions(-) create mode 100644 htdocs/app/Http/Controllers/GudangController.php create mode 100644 htdocs/database/migrations/2026_02_20_000005_alter_simbhp_for_unit_breakdown_and_stats.php diff --git a/htdocs/app/Http/Controllers/GudangController.php b/htdocs/app/Http/Controllers/GudangController.php new file mode 100644 index 00000000..30fd67e2 --- /dev/null +++ b/htdocs/app/Http/Controllers/GudangController.php @@ -0,0 +1,630 @@ +orderBy('nama', 'ASC')->get(); + $cdatane = SIMBHPJenis::all(); + $cjenis = count($cdatane); + if ($cjenis == 0){ + $tasks['jjenis'][0]['jenis'] = 'Belum Ada Jenis Barang'; + $tasks['jjenis'][0]['satuan'] = ''; + $tasks['jjenis'][0]['satuan_kecil'] = ''; + $tasks['jjenis'][0]['konversi_kecil'] = 1; + $tasks['jjenis'][0]['stok_minimum'] = 0; + } else { + $i = 0; + foreach($cdatane as $rdata){ + $tasks['jjenis'][$i]['jenis'] = $rdata->jenis; + $tasks['jjenis'][$i]['satuan'] = $rdata->satuan; + $tasks['jjenis'][$i]['satuan_kecil'] = $rdata->satuan_kecil ?? ''; + $tasks['jjenis'][$i]['konversi_kecil'] = $rdata->konversi_kecil ?? 1; + $tasks['jjenis'][$i]['stok_minimum'] = $rdata->stok_minimum ?? 0; + $i++; + } + } + $getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->groupBy('marking')->first(); + if (isset($getdebet->pemasukan)){ + $totpemasukan = $getdebet->pemasukan; + } else { $totpemasukan = 0 ;} + $getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->groupBy('marking')->first(); + if (isset($getkredit->pengeluaran)){ + $totpepengeluaran = $getkredit->pengeluaran; + } else { $totpepengeluaran = 0 ;} + + $tasks['masuk'] = $totpemasukan; + $tasks['keluar'] = $totpepengeluaran; + $tasks['pegawai'] = $pegawais; + $tasks['tahunne'] = date("Y"); + $tasks['tanggal'] = $sekarang; + $tasks['sidebar'] = 'simbhp'; + $tasks['stat_harian_masuk'] = $this->getAggregateBaseQty('pemasukan', 'harian'); + $tasks['stat_harian_keluar'] = $this->getAggregateBaseQty('pengeluaran', 'harian'); + $tasks['stat_bulanan_masuk'] = $this->getAggregateBaseQty('pemasukan', 'bulanan'); + $tasks['stat_bulanan_keluar'] = $this->getAggregateBaseQty('pengeluaran', 'bulanan'); + $tasks['stat_tahunan_masuk'] = $this->getAggregateBaseQty('pemasukan', 'tahunan'); + $tasks['stat_tahunan_keluar'] = $this->getAggregateBaseQty('pengeluaran', 'tahunan'); + $tasks['stat_perjenis_harian'] = $this->getUsagePerJenis('harian'); + $tasks['stat_perjenis_bulanan'] = $this->getUsagePerJenis('bulanan'); + $tasks['stat_perjenis_tahunan'] = $this->getUsagePerJenis('tahunan'); + $tasks['warningstok'] = $this->getLowStockWarnings(); + return view('admin.gudang', $tasks); + } + } + + public function jsonRekapbhp() { + $arraysurat = []; + $getdata = SIMBHPJenis::all(); + if (!empty($getdata)){ + foreach($getdata as $hasil){ + $jenis = $hasil->kodejenis; + $satuan = $hasil->satuan; + $satuanKecil = $hasil->satuan_kecil ?? ''; + $konversi = (int) ($hasil->konversi_kecil ?? 1); + if ($konversi <= 0) { $konversi = 1; } + $tlsjenis = $hasil->jenis; + $saldoBase = $this->getStockBaseByJenis($tlsjenis); + $saldoakhir = $this->formatStockDisplay($saldoBase, $satuan, $satuanKecil, $konversi); + $isWarning = $saldoBase <= (int) ($hasil->stok_minimum ?? 0); + $arraysurat[] = array( + 'id' => $hasil->id, + 'satuan' => $satuan, + 'jenis' => $jenis, + 'tlsjenis' => $tlsjenis, + 'saldo' => $saldoakhir, + 'warning' => $isWarning ? 'YA' : 'TIDAK', + ); + } + } + echo json_encode($arraysurat); + } + + public function jsonReportbhp(Request $request) { + $bulan = $request->input('val01'); + $tahun = $request->input('val02'); + $hasil = []; + if ($tahun == 'ALL'){ + $bulan = date("m"); + $tahun = date("Y"); + $getdata = SIMBHPReport::where('bulan', $bulan)->where('tahun', $tahun)->orderBy('id', 'DESC')->get(); + } else { + if ($bulan == 'ALL'){ + $getdata = SIMBHPReport::where('tahun', $tahun)->orderBy('id', 'DESC')->get(); + } else { + $getdata = SIMBHPReport::where('bulan', $bulan)->where('tahun', $tahun)->orderBy('id', 'DESC')->get(); + } + } + foreach($getdata as $rdata){ + $dd = $rdata->tanggal; + $mm = $rdata->bulan; + $yy = $rdata->tahun; + $pengeluaran = $rdata->pengeluaran; + $pemasukan = $rdata->pemasukan; + if ($mm < 10){ + $tgllengkap = $dd.'-0'.$mm.'-'.$yy; + } else { + $tgllengkap = $dd.'-'.$mm.'-'.$yy; + } + if ($pengeluaran == '' OR $pengeluaran == 0) {$total = $pemasukan;} + else { $total = $pengeluaran; } + + $hasil[] = array( + 'id' => $rdata->id, + 'tanggal' => $rdata->tanggal, + 'bulan' => $rdata->bulan, + 'tahun' => $rdata->tahun, + 'deskripsi' => $rdata->deskripsi, + 'pemasukan' => number_format( $pemasukan , 0 , '.' , ',' ), + 'pengeluaran' => number_format( $pengeluaran , 0 , '.' , ',' ), + 'jenis' => $rdata->jenis, + 'keterangan' => $rdata->keterangan, + 'tgllengkap' => $tgllengkap, + 'total' => $total, + ); + } + echo json_encode($hasil); + } + + public function jsonReportbhpPaginated(Request $request) { + $tanggal = $request->input('tanggal'); + $deskripsi = $request->input('deskripsi'); + $kategori = $request->input('kategori'); + $lm = 10; + $limit = ($request->input('limit') == null ? $lm : $request->input('limit')); + $order = ($request->input('order') == null ? 'id desc' : $request->input('order')); + $data = new SIMBHPReport; + if ($kategori != null AND $kategori != '') $data = $data->where('jenis', $kategori); + if ($tanggal != null AND $tanggal != '') $data = $data->where('created_at', 'LIKE', '%'.$tanggal.'%'); + if ($deskripsi != null AND $deskripsi != '') $data = $data->where('deskripsi', 'LIKE', '%'.$deskripsi.'%'); + $data = $data->orderByRaw($order)->paginate($limit); + $hasil = []; + $totaldata = $data->total(); + $debet = 0; + $kredit = 0; + if (!empty($data)){ + foreach($data as $rdata){ + $dd = $rdata->tanggal; + $mm = $rdata->bulan; + $yy = $rdata->tahun; + $pengeluaran = $rdata->pengeluaran; + $pemasukan = $rdata->pemasukan; + $deskripsi = $rdata->deskripsi; + $jenis = $rdata->jenis; + $debet = $debet + $pemasukan; + $kredit = $kredit + $pengeluaran; + $cekjenis = SIMBHPJenis::where('kodejenis', $jenis)->first(); + if (isset($cekjenis->id)){ + $kodejenis = $cekjenis->kodejenis; + $jenis = $cekjenis->jenis; + $satuan = $cekjenis->satuan; + } else { + $kodejenis = $jenis; + $jenis = ''; + $satuan = ''; + } + + if ($jenis != ''){ + $deskripsi = ''.$jenis.'
'.$deskripsi; + } + + if ($mm < 10){ + $tgllengkap = $yy.'-0'.$mm.'-'.$dd; + } else { + $tgllengkap = $yy.'-'.$mm.'-'.$dd; + } + if ($pengeluaran == '' OR $pengeluaran == 0) { + $total = $pemasukan; + $jentrans = 'PEMASUKAN'; + } + else { + $total = $pengeluaran; + $jentrans = 'PENGELUARAN'; + } + + $hasil[] = array( + 'id' => $rdata->id, + 'tanggal' => $rdata->tanggal, + 'bulan' => $rdata->bulan, + 'tahun' => $rdata->tahun, + 'tlsdeskripsi' => $deskripsi, + 'deskripsi' => $rdata->deskripsi, + 'pemasukan' => number_format( $pemasukan , 0 , '.' , ',' ), + 'pengeluaran' => number_format( $pengeluaran , 0 , '.' , ',' ), + 'jenis' => $kodejenis, + 'keterangan' => $rdata->keterangan, + 'tgllengkap' => $tgllengkap, + 'created_at' => $rdata->created_at, + 'nominal' => $total.' '.$satuan, + 'jentrans' => $jentrans, + ); + } + } + + $response = [ + 'message' => 'List Data', + 'data' => $hasil, + 'totaldata' => $totaldata + ]; + return response()->json($response, 200); + } + + public function exAddbarang(Request $request) { + $deskripsi = $request->input('set01'); + $pos = $request->input('set02'); + $tanggal = $request->input('set03'); + $jumlah = $request->input('set04'); + $jenis = $request->input('set05'); + $postujuan = $request->input('set06'); + $alasan = $request->input('set07'); + $set08 = $request->input('set08'); + $set09 = $request->input('set09'); + $set10 = $request->input('set10'); + $satuanTransaksi = $request->input('set11'); + if ($tanggal == '' OR is_null($tanggal)){ + $tanggal = date("d-m-Y"); + } + $total = (int)str_replace(',','',$jumlah); + if ($jenis == 'jenis'){ $jumlah = '-';} + if ($deskripsi != '' and $pos != '' and $tanggal != '' and $jumlah != '' and $jenis != ''){ + if ($jenis == 'jenis'){ + $jenis = $request->input('set02'); + $satuan = $request->input('set03'); + $idne = $request->input('set01'); + $satuanKecil = $set08; + $konversiKecil = (int) $set09; + if ($konversiKecil <= 0){ $konversiKecil = 1; } + $stokMinimum = (int) $set10; + if ($stokMinimum < 0){ $stokMinimum = 0; } + $kodejenis = preg_replace('/\s+/', '', $jenis); + if ($idne == 'new' OR $idne == ''){ + $ceksudah = SIMBHPJenis::where('kodejenis', $kodejenis)->where('satuan', $satuan)->count(); + if ($ceksudah != 0){ + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Sudah Ada, Silahkan Masukkan Jenis Barang Lain']); + } else { + $input = SIMBHPJenis::create([ + 'kodejenis' => $kodejenis, + 'jenis' => $jenis, + 'satuan' => $satuan, + 'satuan_kecil' => $satuanKecil, + 'konversi_kecil' => $konversiKecil, + 'stok_minimum' => $stokMinimum, + ]); + if ($input){ + return response()->json(['status' => 'Success', 'message' => 'Data '.$jenis.' Sukses Ditambahkan']); + } else { + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Gagal di masukkan, silahkan ulangi beberapa saat lagi']); + } + } + } else { + $ceksudah = SIMBHPJenis::where('id', '!=', $idne)->where('kodejenis', $kodejenis)->where('satuan', $satuan)->count(); + if ($ceksudah != 0){ + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Sudah Ada, Silahkan Masukkan Jenis Barang Lain']); + } else { + $input = SIMBHPJenis::where('id', $idne)->update([ + 'kodejenis' => $kodejenis, + 'jenis' => $jenis, + 'satuan' => $satuan, + 'satuan_kecil' => $satuanKecil, + 'konversi_kecil' => $konversiKecil, + 'stok_minimum' => $stokMinimum, + ]); + if ($input){ + return response()->json(['status' => 'Success', 'message' => 'Data '.$jenis.' Sukses Diupdate']); + } else { + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Gagal di masukkan, silahkan ulangi beberapa saat lagi']); + } + } + } + } else { + $ahrf = explode("-", $tanggal); + $tahun = $ahrf[0]; + if(isset($ahrf[1])){ $wulan = (int)$ahrf[1]; } else { $wulan = (int)date("m"); } + if(isset($ahrf[2])){ $dino = (int)$ahrf[2]; } else { $dino = (int)date("d"); } + if ($jenis == 'pemasukan'){ + $qtyBase = $this->calculateBaseQty($pos, $total, $satuanTransaksi ?: 'besar'); + $bayar = SIMBHPReport::create([ + 'tanggal' => $dino, + 'bulan' => $wulan, + 'tahun' => $tahun, + 'deskripsi' => $deskripsi, + 'pemasukan' => $total, + 'pengeluaran' => null, + 'qty_base' => $qtyBase, + 'satuan_transaksi' => $satuanTransaksi ?: 'besar', + 'jenis' => $pos, + 'keterangan' => '', + 'marking' => '', + ]); + } else if ($jenis == 'pengeluaran'){ + $getnama = User::where('id', $deskripsi)->first(); + $nama = $getnama->nama ?? 'Unkown'; + $deskripsi = 'Diterima oleh '.$nama; + $qtyBase = $this->calculateBaseQty($pos, $total, $satuanTransaksi ?: 'kecil'); + $stokSaatIni = $this->getStockBaseByJenis($pos); + if ($qtyBase > $stokSaatIni){ + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Nominal Melebihi Stok']); + } else { + $bayar = SIMBHPReport::create([ + 'tanggal' => $dino, + 'bulan' => $wulan, + 'tahun' => $tahun, + 'deskripsi' => $deskripsi, + 'pemasukan' => null, + 'pengeluaran' => $total, + 'qty_base' => $qtyBase, + 'satuan_transaksi' => $satuanTransaksi ?: 'kecil', + 'jenis' => $pos, + 'keterangan' => '', + 'marking' => '', + ]); + } + + } else if ($jenis == 'editor'){ + if ($alasan == ''){ + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Alasan Perubahan Data Wajib Di Isi!!!']); + } else { + $getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->where('jenis', $pos)->groupBy('jenis')->first(); + if (isset($getdebet->pemasukan)){ $totpemasukan = $getdebet->pemasukan; } else { $totpemasukan = 0 ;} + $getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->where('jenis', $pos)->groupBy('jenis')->first(); + if (isset($getkredit->pengeluaran)){ $totpepengeluaran = $getkredit->pengeluaran; } else { $totpepengeluaran = 0 ;} + $totpepengeluaran = $totpepengeluaran + $total; + + $rdatalama = SIMBHPReport::where('id', $postujuan)->first(); + $ldeskripsi = $rdatalama->deskripsi; + $lpemasukan = $rdatalama->pemasukan; + $lpengeluaran = $rdatalama->pengeluaran; + $ljenis = $rdatalama->jenis; + $marking = $rdatalama->marking; + if ($lpengeluaran == '' OR $lpengeluaran == 0) { + $satuanEdit = $rdatalama->satuan_transaksi ?: 'besar'; + $qtyBaseEdit = $this->calculateBaseQty($pos, $total, $satuanEdit); + $ltotal = number_format( $lpemasukan , 0 , '.' , ',' ); + if ($marking != ''){ + SIMBHPReport::where('marking', $marking)->whereNotIn('id', [$postujuan])->update([ + 'tanggal' => $dino, + 'bulan' => $wulan, + 'tahun' => $tahun, + 'pengeluaran' => $total, + 'qty_base' => $qtyBaseEdit, + 'satuan_transaksi' => $satuanEdit + ]); + } + $bayar = SIMBHPReport::where('id', $postujuan)->update([ + 'tanggal' => $dino, + 'bulan' => $wulan, + 'tahun' => $tahun, + 'deskripsi' => $deskripsi, + 'jenis' => $pos, + 'pemasukan' => $total, + 'qty_base' => $qtyBaseEdit, + 'satuan_transaksi' => $satuanEdit, + 'keterangan' => $alasan, + 'updated_at' => date("Y-m-d H:i:s") + ]); + } else { + $satuanEdit = $rdatalama->satuan_transaksi ?: 'kecil'; + $qtyBaseEdit = $this->calculateBaseQty($pos, $total, $satuanEdit); + $totpepengeluaran = $totpepengeluaran + $total; + if ($totpepengeluaran > $totpemasukan){ + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Nominal Melebihi Stok']); + } else { + $ltotal = number_format( $lpengeluaran , 0 , '.' , ',' ); + if ($marking != ''){ + SIMBHPReport::where('marking', $marking)->whereNotIn('id', [$postujuan])->update([ + 'tanggal' => $dino, + 'bulan' => $wulan, + 'tahun' => $tahun, + 'pemasukan' => $total, + 'qty_base' => $qtyBaseEdit, + 'satuan_transaksi' => $satuanEdit + ]); + } + $bayar = SIMBHPReport::where('id', $postujuan)->update([ + 'tanggal' => $dino, + 'bulan' => $wulan, + 'tahun' => $tahun, + 'deskripsi' => $deskripsi, + 'jenis' => $pos, + 'pengeluaran' => $total, + 'qty_base' => $qtyBaseEdit, + 'satuan_transaksi' => $satuanEdit, + 'keterangan' => $alasan, + 'updated_at' => date("Y-m-d H:i:s") + ]); + } + } + $baris1 = ''; + $baris2 = ''; + $baris3 = ''; + $baris4 = ''; + $baris5 = '

Data Lama

Data Perubahan

Deskripsi'.$ldeskripsi.'Diubah Menjadi'.$deskripsi.'
Jenis'.$ljenis.'Diubah Menjadi'.$pos.'
Total'.$ltotal.'Diubah Menjadi'.$jumlah.'
Dengan Alasan'.$alasan.''; + $baris6 = '
Eksekutor'.Session('nama').'
'; + $perubahan = $baris1.$baris2.$baris3.$baris4.$baris5.$baris6; + Xfiles::create([ + 'xmarking' => 'SIMBHP-'.$postujuan.'-'.time(), + 'xtabel' => 'History SIMBHP', + 'xjenis' => '', + 'xfile' => $perubahan + ]); + } + } else { + if ($alasan == ''){ + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Alasan Perubahan Data Wajib Di Isi!!!']); + } + else { + $rdatalama = SIMBHPReport::where('id', $postujuan)->first(); + $ldeskripsi = $rdatalama->deskripsi; + $lpemasukan = $rdatalama->pemasukan; + $lpengeluaran = $rdatalama->pengeluaran; + $ljenis = $rdatalama->jenis; + $marking = $rdatalama->marking; + if ($lpengeluaran == '' or $lpengeluaran == 0) { + $ltotal = number_format( $lpemasukan , 0 , '.' , ',' ); + } else { + $ltotal = number_format( $lpengeluaran , 0 , '.' , ',' ); + } + $baris1 = ''; + $baris2 = ''; + $baris3 = ''; + $baris4 = ''; + $baris5 = '

Data Lama

Data Perubahan

Deskripsi'.$ldeskripsi.'DIHAPUS
Jenis'.$ljenis.'DIHAPUS
Total'.$ltotal.'DIHAPUS
Dengan Alasan'.$alasan.''; + $baris6 = '
Eksekutor'.Session('nama').'
'; + $perubahan = $baris1.$baris2.$baris3.$baris4.$baris5.$baris6; + + Xfiles::create([ + 'xmarking' => 'SIMBHP-'.$postujuan.'-'.time(), + 'xtabel' => 'History SIMBHP', + 'xjenis' => '', + 'xfile' => $perubahan + ]); + if ($marking != ''){ + $bayar = SIMBHPReport::where('marking', $marking)->delete(); + } else { + $bayar = SIMBHPReport::where('id', $postujuan)->delete(); + } + } + } + if ($bayar){ + return response()->json(['status' => 'Success', 'message' => 'Transaksi '.$jenis.' Sukses Dilaksanakan']); + } else { + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Update Gagal, Pastikan Data Yang anda Isi Sudah Sesuai']); + } + } + } + else { + return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Pastikan Formnya Anda Isi dengan Lengkap']); + } + } + + public function exKwitansi(Request $request) + { + return response()->json([ + 'status' => 'Info', + 'message' => 'Fitur kwitansi gudang belum diaktifkan pada versi ini.' + ]); + } + + private function calculateBaseQty($jenisNama, $qtyInput, $satuanTransaksi = 'besar') + { + $qtyInput = (int) $qtyInput; + if ($qtyInput < 0) { $qtyInput = 0; } + $jenis = SIMBHPJenis::where('jenis', $jenisNama)->first(); + $konversi = (int) ($jenis->konversi_kecil ?? 1); + if ($konversi <= 0) { $konversi = 1; } + + if ($satuanTransaksi === 'kecil') { + return $qtyInput; + } + + return $qtyInput * $konversi; + } + + private function getStockBaseByJenis($jenisNama) + { + $rows = SIMBHPReport::where('jenis', $jenisNama)->get(); + $masuk = 0; + $keluar = 0; + foreach ($rows as $row) { + if (!is_null($row->pemasukan) && (int)$row->pemasukan > 0) { + $masuk += $this->extractBaseQty($row, 'pemasukan'); + } + if (!is_null($row->pengeluaran) && (int)$row->pengeluaran > 0) { + $keluar += $this->extractBaseQty($row, 'pengeluaran'); + } + } + + return $masuk - $keluar; + } + + private function extractBaseQty($row, $direction = 'pemasukan') + { + if (!is_null($row->qty_base) && (int)$row->qty_base > 0) { + return (int) $row->qty_base; + } + + if ($direction === 'pengeluaran') { + return (int) ($row->pengeluaran ?? 0); + } + + return (int) ($row->pemasukan ?? 0); + } + + private function formatStockDisplay($saldoBase, $satuanBesar, $satuanKecil, $konversi) + { + $saldoBase = (int) $saldoBase; + $konversi = (int) $konversi; + if ($konversi <= 1 || $satuanKecil == '') { + return number_format($saldoBase, 0, '.', ',').' '.$satuanBesar; + } + + $besar = intdiv($saldoBase, $konversi); + $kecil = $saldoBase % $konversi; + + return number_format($besar, 0, '.', ',').' '.$satuanBesar.' + '.number_format($kecil, 0, '.', ',').' '.$satuanKecil; + } + + private function getLowStockWarnings() + { + $warnings = []; + $allJenis = SIMBHPJenis::orderBy('jenis', 'ASC')->get(); + foreach ($allJenis as $item) { + $saldoBase = $this->getStockBaseByJenis($item->jenis); + $minimum = (int) ($item->stok_minimum ?? 0); + if ($saldoBase <= $minimum) { + $warnings[] = [ + 'jenis' => $item->jenis, + 'saldo' => $this->formatStockDisplay( + $saldoBase, + $item->satuan, + $item->satuan_kecil ?? '', + $item->konversi_kecil ?? 1 + ), + 'minimum' => $minimum, + 'satuan_kecil' => $item->satuan_kecil ?: $item->satuan, + ]; + } + } + + return $warnings; + } + + private function getAggregateBaseQty($direction, $scope = 'harian') + { + $now = date('Y-m-d'); + $d = (int) date('d', strtotime($now)); + $m = (int) date('m', strtotime($now)); + $y = (int) date('Y', strtotime($now)); + + $query = SIMBHPReport::query(); + if ($scope === 'harian') { + $query->where('tanggal', $d)->where('bulan', $m)->where('tahun', $y); + } elseif ($scope === 'bulanan') { + $query->where('bulan', $m)->where('tahun', $y); + } else { + $query->where('tahun', $y); + } + + $rows = $query->get(); + $total = 0; + foreach ($rows as $row) { + if ($direction === 'pemasukan' && !is_null($row->pemasukan) && (int)$row->pemasukan > 0) { + $total += $this->extractBaseQty($row, 'pemasukan'); + } + if ($direction === 'pengeluaran' && !is_null($row->pengeluaran) && (int)$row->pengeluaran > 0) { + $total += $this->extractBaseQty($row, 'pengeluaran'); + } + } + + return $total; + } + + private function getUsagePerJenis($scope = 'harian') + { + $now = date('Y-m-d'); + $d = (int) date('d', strtotime($now)); + $m = (int) date('m', strtotime($now)); + $y = (int) date('Y', strtotime($now)); + + $query = SIMBHPReport::query(); + if ($scope === 'harian') { + $query->where('tanggal', $d)->where('bulan', $m)->where('tahun', $y); + } elseif ($scope === 'bulanan') { + $query->where('bulan', $m)->where('tahun', $y); + } else { + $query->where('tahun', $y); + } + + $rows = $query->get(); + $grouped = []; + foreach ($rows as $row) { + $jenis = $row->jenis ?: 'Tidak Diketahui'; + if (!isset($grouped[$jenis])) { + $grouped[$jenis] = ['jenis' => $jenis, 'masuk' => 0, 'keluar' => 0]; + } + if (!is_null($row->pemasukan) && (int)$row->pemasukan > 0) { + $grouped[$jenis]['masuk'] += $this->extractBaseQty($row, 'pemasukan'); + } + if (!is_null($row->pengeluaran) && (int)$row->pengeluaran > 0) { + $grouped[$jenis]['keluar'] += $this->extractBaseQty($row, 'pengeluaran'); + } + } + + return array_values($grouped); + } +} diff --git a/htdocs/app/Http/Controllers/PoliController.php b/htdocs/app/Http/Controllers/PoliController.php index d206c69a..627998f8 100644 --- a/htdocs/app/Http/Controllers/PoliController.php +++ b/htdocs/app/Http/Controllers/PoliController.php @@ -3,14 +3,8 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; use App\Poli; use App\Ruangan; -use App\Organisms; -use App\XFiles; -use App\SIMBHPJenis; -use App\SIMBHPReport; -use App\User; use App\Periksa; use Validator; @@ -20,567 +14,129 @@ class PoliController extends Controller { public function index() { if (Session::get('previlage') == ''){ - return redirect('/login'); - } else { - $data = []; - $data['polis'] = Poli::all(); - $data['ruangans'] = Ruangan::all(); + return redirect('/login'); + } else { + $data = []; + $data['polis'] = Poli::all(); + $data['ruangans'] = Ruangan::all(); return view('admin.poli', $data); } } - public function viewGudangIndex() { - if (Session::get('previlage') == ''){ - return redirect('/login'); - } else { - $tasks = []; - $homebase = url("/"); - $sekarang = date("Y-m-d"); - $pegawais = User::select('id', 'nama', 'previlage')->orderBy('nama', 'ASC')->get(); - $cdatane = SIMBHPJenis::all(); - $cjenis = count($cdatane); - if ($cjenis == 0){ - $tasks['jjenis'][0]['jenis'] = 'Belum Ada Jenis Barang'; - $tasks['jjenis'][0]['satuan'] = ''; - } else { - $i = 0; - foreach($cdatane as $rdata){ - $tasks['jjenis'][$i]['jenis'] = $rdata->jenis; - $tasks['jjenis'][$i]['satuan'] = $rdata->satuan; - $i++; - } - } - $getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->groupBy('marking')->first(); - if (isset($getdebet->pemasukan)){ - $totpemasukan = $getdebet->pemasukan; - } else { $totpemasukan = 0 ;} - $getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->groupBy('marking')->first(); - if (isset($getkredit->pengeluaran)){ - $totpepengeluaran = $getkredit->pengeluaran; - } else { $totpepengeluaran = 0 ;} - - $tasks['masuk'] = $totpemasukan; - $tasks['keluar'] = $totpepengeluaran; - $tasks['pegawai'] = $pegawais; - $tasks['tahunne'] = date("Y"); - $tasks['tanggal'] = $sekarang; - $tasks['sidebar'] = 'simbhp'; - $previlage = Session('previlage'); - return view('admin.gudang', $tasks); - } - } + public function storePoli(Request $request) { - $validator = Validator::make($request->all(), [ - 'poli' => 'required', - 'poli' => 'required', - 'modaliti' => 'required' + $validator = Validator::make($request->all(), [ + 'poli' => 'required', + 'poli' => 'required', + 'modaliti' => 'required' ]); - if($validator->fails()) { - return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']); - } else { - $poli = $request->input('poli'); - $subpoli = $request->input('subpoli'); - $subsubpoli = $request->input('subsubpoli'); - $modaliti = $request->input('modaliti'); - Poli::create([ - 'poli' => $request->input('poli'), - 'subpoli' => $request->input('subpoli'), - 'subsubpoli'=> $request->input('subsubpoli'), - 'modaliti' => $request->input('modaliti'), - 'modaliti2' => $request->input('modaliti2') - ]); - Periksa::where('reques', $subpoli)->update([ - 'kd_spesimen' => $request->input('subsubpoli'), - 'nm_spesimen' => $request->input('modaliti'), - ]); - $tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Saved..!!'; - return response()->json(['status' => 'success', 'message' => $tulis]); - } - } - public function getListPoli() { - - $results = Poli::orderBy('subpoli', 'ASC')->get(); - echo json_encode($results); - } - public function updatePoli(Request $request) { - $validator = Validator::make($request->all(), [ - 'id' => 'required', - 'poli' => 'required', - 'subpoli' => 'required', - 'modaliti' => 'required' - ]); - if($validator->fails()) { + if($validator->fails()) { return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']); } else { - $id = $request->input('id'); - $poli = $request->input('poli'); - $subpoli = $request->input('subpoli'); - $subsubpoli = $request->input('subsubpoli'); - Poli::where('id', $id)->update([ - 'poli' => $poli, - 'subpoli' => $subpoli, - 'subsubpoli'=> $subsubpoli, - 'modaliti' => $request->input('modaliti'), - 'modaliti2' => $request->input('modaliti2') - ]); - Periksa::where('reques', $subpoli)->update([ - 'kd_spesimen' => $subsubpoli, - 'nm_spesimen' => $request->input('modaliti'), + $poli = $request->input('poli'); + $subpoli = $request->input('subpoli'); + $subsubpoli = $request->input('subsubpoli'); + Poli::create([ + 'poli' => $request->input('poli'), + 'subpoli' => $request->input('subpoli'), + 'subsubpoli'=> $request->input('subsubpoli'), + 'modaliti' => $request->input('modaliti'), + 'modaliti2' => $request->input('modaliti2') ]); - $tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Updated..!!'; - return response()->json(['status' => 'success', 'message' => $tulis]); + Periksa::where('reques', $subpoli)->update([ + 'kd_spesimen' => $request->input('subsubpoli'), + 'nm_spesimen' => $request->input('modaliti'), + ]); + $tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Saved..!!'; + return response()->json(['status' => 'success', 'message' => $tulis]); } } - public function deletePoli(Request $request) { - $id = $request->id; - $poli = Poli::find($id); - $poli->delete(); - return back(); + + public function getListPoli() { + $results = Poli::orderBy('subpoli', 'ASC')->get(); + echo json_encode($results); } + + public function updatePoli(Request $request) { + $validator = Validator::make($request->all(), [ + 'id' => 'required', + 'poli' => 'required', + 'subpoli' => 'required', + 'modaliti' => 'required' + ]); + if($validator->fails()) { + return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']); + } else { + $id = $request->input('id'); + $poli = $request->input('poli'); + $subpoli = $request->input('subpoli'); + $subsubpoli = $request->input('subsubpoli'); + Poli::where('id', $id)->update([ + 'poli' => $poli, + 'subpoli' => $subpoli, + 'subsubpoli'=> $subsubpoli, + 'modaliti' => $request->input('modaliti'), + 'modaliti2' => $request->input('modaliti2') + ]); + Periksa::where('reques', $subpoli)->update([ + 'kd_spesimen' => $subsubpoli, + 'nm_spesimen' => $request->input('modaliti'), + ]); + $tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Updated..!!'; + return response()->json(['status' => 'success', 'message' => $tulis]); + } + } + + public function deletePoli(Request $request) { + $id = $request->id; + $poli = Poli::find($id); + $poli->delete(); + return back(); + } + public function storeRuangan(Request $request) { - $validator = Validator::make($request->all(), [ - 'poli' => 'required', - 'ruangan' => 'required' + $validator = Validator::make($request->all(), [ + 'poli' => 'required', + 'ruangan' => 'required' ]); if($validator->fails()) { return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']); } else { Ruangan::create([ - 'poli' => $request->input('poli'), - 'ruangan' => $request->input('ruangan') + 'poli' => $request->input('poli'), + 'ruangan' => $request->input('ruangan') ]); - Session::flash('message', 'Data berhasil disimpan'); + Session::flash('message', 'Data berhasil disimpan'); Session::flash('alert-class', 'alert-success'); return back(); } } + public function getListRuangan(Request $request) { - $results = Ruangan::all(); + $results = Ruangan::all(); echo json_encode($results); } + public function updateRuangan(Request $request) { $validator = Validator::make($request->all(), [ - 'id' => 'required', - 'poli' => 'required', - 'ruangan' => 'required' + 'id' => 'required', + 'poli' => 'required', + 'ruangan' => 'required' ]); if($validator->fails()) { return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']); } else { - $id = $request->input('id'); + $id = $request->input('id'); Ruangan::where('id', $id)->update([ - 'poli' => $request->input('poli'), - 'ruangan' => $request->input('ruangan') + 'poli' => $request->input('poli'), + 'ruangan' => $request->input('ruangan') ]); } } + public function deleteRuangan(Request $request) { - $id = $request->id; - $ruangan = Ruangan::find($id); + $id = $request->id; + $ruangan = Ruangan::find($id); $ruangan->delete(); return back(); } - public function jsonRekapbhp() { - $tahun = date("Y"); - $thnlalu = $tahun - 1; - $totale = 0; - $arraysurat = []; - $getdata = SIMBHPJenis::all(); - if (!empty($getdata)){ - foreach($getdata as $hasil){ - $jenis = $hasil->kodejenis; - $satuan = $hasil->satuan; - $tlsjenis = $hasil->jenis;; - $getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->where('jenis', $tlsjenis)->groupBy('jenis')->first(); - if (isset($getdebet->pemasukan)){ - $totpemasukan = $getdebet->pemasukan; - } else { $totpemasukan = 0 ;} - $getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->where('jenis', $tlsjenis)->groupBy('jenis')->first(); - if (isset($getkredit->pengeluaran)){ - $totpepengeluaran = $getkredit->pengeluaran; - } else { $totpepengeluaran = 0 ;} - - $saldoakhir = $totpemasukan - $totpepengeluaran; - $arraysurat[] = array( - 'id' => $hasil->id, - 'satuan' => $satuan, - 'jenis' => $jenis, - 'tlsjenis' => $tlsjenis, - 'saldo' => number_format( $saldoakhir , 0 , '.' , ',' ), - ); - } - } - echo json_encode($arraysurat); - } - public function jsonReportbhp(Request $request) { - $bulan = $request->input('val01'); - $tahun = $request->input('val02'); - $hasil = []; - if ($tahun == 'ALL'){ - $bulan = date("m"); - $tahun = date("Y"); - $getdata = SIMBHPReport::where('bulan', $bulan)->where('tahun', $tahun)->orderBy('id', 'DESC')->get(); - } else { - if ($bulan == 'ALL'){ - $getdata = SIMBHPReport::where('tahun', $tahun)->orderBy('id', 'DESC')->get(); - } else { - $getdata = SIMBHPReport::where('bulan', $bulan)->where('tahun', $tahun)->orderBy('id', 'DESC')->get(); - } - - } - foreach($getdata as $rdata){ - $dd = $rdata->tanggal; - $mm = $rdata->bulan; - $yy = $rdata->tahun; - $pengeluaran= $rdata->pengeluaran; - $pemasukan = $rdata->pemasukan; - if ($mm < 10){ - $tgllengkap = $dd.'-0'.$mm.'-'.$yy; - } else { - $tgllengkap = $dd.'-'.$mm.'-'.$yy; - } - if ($pengeluaran == '' OR $pengeluaran == 0) {$total = $pemasukan;} - else { $total = $pengeluaran; } - - $hasil[] = array( - 'id' => $rdata->id, - 'tanggal' => $rdata->tanggal, - 'bulan' => $rdata->bulan, - 'tahun' => $rdata->tahun, - 'deskripsi' => $rdata->deskripsi, - 'pemasukan' => number_format( $pemasukan , 0 , '.' , ',' ), - 'pengeluaran' => number_format( $pengeluaran , 0 , '.' , ',' ), - 'jenis' => $rdata->jenis, - 'keterangan' => $rdata->keterangan, - 'tgllengkap' => $tgllengkap, - 'total' => $total, - ); - } - echo json_encode($hasil); - } - public function jsonReportbhpPaginated(Request $request) { - $tanggal = $request->input('tanggal'); - $deskripsi = $request->input('deskripsi'); - $kategori = $request->input('kategori'); - $lm = 10; - $limit = ($request->input('limit') == null ? $lm : $request->input('limit')); - $order = ($request->input('order') == null ? 'id desc' : $request->input('order')); - $data = new SIMBHPReport; - if ($kategori != null AND $kategori != '') $data = $data->where('jenis', $kategori); - if ($tanggal != null AND $tanggal != '') $data = $data->where('created_at', 'LIKE', '%'.$tanggal.'%'); - if ($deskripsi != null AND $deskripsi != '') $data = $data->where('deskripsi', 'LIKE', '%'.$deskripsi.'%'); - $data = $data->orderByRaw($order)->paginate($limit); - $hasil = []; - $totaldata = $data->total(); - $debet = 0; - $kredit = 0; - if (!empty($data)){ - foreach($data as $rdata){ - $dd = $rdata->tanggal; - $mm = $rdata->bulan; - $yy = $rdata->tahun; - $pengeluaran = $rdata->pengeluaran; - $pemasukan = $rdata->pemasukan; - $deskripsi = $rdata->deskripsi; - $jenis = $rdata->jenis; - $debet = $debet + $pemasukan; - $kredit = $kredit + $pengeluaran; - $cekjenis = SIMBHPJenis::where('kodejenis', $jenis)->first(); - if (isset($cekjenis->id)){ - $kodejenis = $cekjenis->kodejenis; - $jenis = $cekjenis->jenis; - $satuan = $cekjenis->satuan; - } else { - $kodejenis = $jenis; - $jenis = ''; - $satuan = ''; - } - - if ($jenis != ''){ - $deskripsi = ''.$jenis.'
'.$deskripsi; - } - - if ($mm < 10){ - $tgllengkap = $yy.'-0'.$mm.'-'.$dd; - } else { - $tgllengkap = $yy.'-'.$mm.'-'.$dd; - } - if ($pengeluaran == '' OR $pengeluaran == 0) { - $total = $pemasukan; - $jentrans = 'PEMASUKAN'; - } - else { - $total = $pengeluaran; - $jentrans = 'PENGELUARAN'; - } - - $hasil[] = array( - 'id' => $rdata->id, - 'tanggal' => $rdata->tanggal, - 'bulan' => $rdata->bulan, - 'tahun' => $rdata->tahun, - 'tlsdeskripsi' => $deskripsi, - 'deskripsi' => $rdata->deskripsi, - 'pemasukan' => number_format( $pemasukan , 0 , '.' , ',' ), - 'pengeluaran' => number_format( $pengeluaran , 0 , '.' , ',' ), - 'jenis' => $kodejenis, - 'keterangan' => $rdata->keterangan, - 'tgllengkap' => $tgllengkap, - 'created_at' => $rdata->created_at, - 'nominal' => $total.' '.$satuan, - 'jentrans' => $jentrans, - ); - } - } - - $response = [ - 'message' => 'List Data', - 'data' => $hasil, - 'totaldata' => $totaldata - ]; - return response()->json($response, 200); - } - public function exAddbarang(Request $request) { - $deskripsi = $request->input('set01'); - $pos = $request->input('set02'); - $tanggal = $request->input('set03'); - $jumlah = $request->input('set04'); - $jenis = $request->input('set05'); - $postujuan = $request->input('set06'); - $alasan = $request->input('set07'); - $nama = Session('nama'); - if ($tanggal == '' OR is_null($tanggal)){ - $tanggal = date("d-m-Y"); - } - $total = (int)str_replace(',','',$jumlah); - if ($jenis == 'jenis'){ $jumlah = '-';} - if ($deskripsi != '' and $pos != '' and $tanggal != '' and $jumlah != '' and $jenis != ''){ - if ($jenis == 'jenis'){ - $jenis = $request->input('set02'); - $satuan = $request->input('set03'); - $idne = $request->input('set04'); - $kodejenis = preg_replace('/\s+/', '', $jenis); - if ($idne == 'new' OR $idne == ''){ - $ceksudah = SIMBHPJenis::where('kodejenis', $kodejenis)->where('satuan', $satuan)->count(); - if ($ceksudah != 0){ - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Sudah Ada, Silahkan Masukkan Jenis Barang Lain']); - return back(); - } else { - $input = SIMBHPJenis::create([ - 'kodejenis' => $kodejenis, - 'jenis' => $jenis, - 'satuan' => $satuan, - ]); - if ($input){ - return response()->json(['status' => 'Success', 'message' => 'Data '.$jenis.' Sukses Ditambahkan']); - return back(); - } else { - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Gagal di masukkan, silahkan ulangi beberapa saat lagi']); - return back(); - } - } - } else { - $ceksudah = SIMBHPJenis::where('id', '!=', $idne)->where('kodejenis', $kodejenis)->where('satuan', $satuan)->count(); - if ($ceksudah != 0){ - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Sudah Ada, Silahkan Masukkan Jenis Barang Lain']); - return back(); - } else { - $input = SIMBHPJenis::where('id', $idne)->update([ - 'kodejenis' => $kodejenis, - 'jenis' => $jenis, - 'satuan' => $satuan, - ]); - if ($input){ - return response()->json(['status' => 'Success', 'message' => 'Data '.$jenis.' Sukses Diupdate']); - return back(); - } else { - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Gagal di masukkan, silahkan ulangi beberapa saat lagi']); - return back(); - } - } - } - } else { - $ahrf = explode("-", $tanggal); - $tahun = $ahrf[0]; - if(isset($ahrf[1])){ - $wulan = (int)$ahrf[1]; - } else { $wulan = date("m"); $wulan = (int)$wulan; } - if(isset($ahrf[2])){ - $dino = (int)$ahrf[2]; - } else { $dino = date("d"); } - if ($jenis == 'pemasukan'){ - $bayar = SIMBHPReport::create([ - 'tanggal' => $dino, - 'bulan' => $wulan, - 'tahun' => $tahun, - 'deskripsi' => $deskripsi, - 'pemasukan' => $total, - 'pengeluaran' => null, - 'jenis' => $pos, - 'keterangan' => '', - 'marking' => '', - ]); - } else if ($jenis == 'pengeluaran'){ - $getnama = User::where('id', $deskripsi)->first(); - $nama = $getnama->nama ?? 'Unkown'; - $deskripsi = 'Diterima oleh '.$nama; - $getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->where('jenis', $pos)->groupBy('jenis')->first(); - if (isset($getdebet->pemasukan)){ - $totpemasukan = $getdebet->pemasukan; - } else { $totpemasukan = 0 ;} - $getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->where('jenis', $pos)->groupBy('jenis')->first(); - if (isset($getkredit->pengeluaran)){ - $totpepengeluaran = $getkredit->pengeluaran; - } else { $totpepengeluaran = 0 ;} - $totpepengeluaran = $totpepengeluaran + $total; - if ($totpepengeluaran > $totpemasukan){ - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Nominal Melebihi Stok']); - return back(); - } else { - $bayar = SIMBHPReport::create([ - 'tanggal' => $dino, - 'bulan' => $wulan, - 'tahun' => $tahun, - 'deskripsi' => $deskripsi, - 'pemasukan' => null, - 'pengeluaran' => $total, - 'jenis' => $pos, - 'keterangan' => '', - 'marking' => '', - ]); - } - - } else if ($jenis == 'editor'){ - if ($alasan == ''){ - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Alasan Perubahan Data Wajib Di Isi!!!']); - return back(); - } else { - $getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->where('jenis', $pos)->groupBy('jenis')->first(); - if (isset($getdebet->pemasukan)){ - $totpemasukan = $getdebet->pemasukan; - } else { $totpemasukan = 0 ;} - $getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->where('jenis', $pos)->groupBy('jenis')->first(); - if (isset($getkredit->pengeluaran)){ - $totpepengeluaran = $getkredit->pengeluaran; - } else { $totpepengeluaran = 0 ;} - $totpepengeluaran = $totpepengeluaran + $total; - - $rdatalama = SIMBHPReport::where('id', $postujuan)->first(); - $ldeskripsi = $rdatalama->deskripsi; - $lpemasukan = $rdatalama->pemasukan; - $lpengeluaran = $rdatalama->pengeluaran; - $ljenis = $rdatalama->jenis; - $marking = $rdatalama->marking; - if ($lpengeluaran == '' OR $lpengeluaran == 0) { - $ltotal = number_format( $lpemasukan , 0 , '.' , ',' ); - if ($marking != ''){ - SIMBHPReport::where('marking', $marking)->whereNotIn('id', [$postujuan])->update([ - 'tanggal' => $dino, - 'bulan' => $wulan, - 'tahun' => $tahun, - 'pengeluaran' => $total - ]); - } - $bayar = SIMBHPReport::where('id', $postujuan)->update([ - 'tanggal' => $dino, - 'bulan' => $wulan, - 'tahun' => $tahun, - 'deskripsi' => $deskripsi, - 'jenis' => $pos, - 'pemasukan' => $total, - 'keterangan' => $alasan, - 'updated_at' => date("Y-m-d H:i:s") - ]); - } else { - $totpepengeluaran = $totpepengeluaran + $total; - if ($totpepengeluaran > $totpemasukan){ - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Nominal Melebihi Stok']); - return back(); - } else { - $ltotal = number_format( $lpengeluaran , 0 , '.' , ',' ); - if ($marking != ''){ - SIMBHPReport::where('marking', $marking)->whereNotIn('id', [$postujuan])->update([ - 'tanggal' => $dino, - 'bulan' => $wulan, - 'tahun' => $tahun, - 'pemasukan' => $total - ]); - } - $bayar = SIMBHPReport::where('id', $postujuan)->update([ - 'tanggal' => $dino, - 'bulan' => $wulan, - 'tahun' => $tahun, - 'deskripsi' => $deskripsi, - 'jenis' => $pos, - 'pengeluaran' => $total, - 'keterangan' => $alasan, - 'updated_at' => date("Y-m-d H:i:s") - ]); - } - } - $baris1 = ''; - $baris2 = ''; - $baris3 = ''; - $baris4 = ''; - $baris5 = '

Data Lama

Data Perubahan

Deskripsi'.$ldeskripsi.'Diubah Menjadi'.$deskripsi.'
Jenis'.$ljenis.'Diubah Menjadi'.$pos.'
Total'.$ltotal.'Diubah Menjadi'.$jumlah.'
Dengan Alasan'.$alasan.''; - $baris6 = '
Eksekutor'.Session('nama').'
'; - $perubahan = $baris1.$baris2.$baris3.$baris4.$baris5.$baris6; - Xfiles::create([ - 'xmarking' => 'SIMBHP-'.$postujuan.'-'.time(), - 'xtabel' => 'History SIMBHP', - 'xjenis' => '', - 'xfile' => $perubahan - ]); - } - } else { - if ($alasan == ''){ - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Alasan Perubahan Data Wajib Di Isi!!!']); - return back(); - } - else { - $rdatalama = SIMBHPReport::where('id', $postujuan)->first(); - $ldeskripsi = $rdatalama->deskripsi; - $lpemasukan = $rdatalama->pemasukan; - $lpengeluaran = $rdatalama->pengeluaran; - $ljenis = $rdatalama->jenis; - $marking = $rdatalama->marking; - if ($lpengeluaran == '' or $lpengeluaran == 0) { - $ltotal = number_format( $lpemasukan , 0 , '.' , ',' ); - } else { - $ltotal = number_format( $lpengeluaran , 0 , '.' , ',' ); - } - $baris1 = ''; - $baris2 = ''; - $baris3 = ''; - $baris4 = ''; - $baris5 = '

Data Lama

Data Perubahan

Deskripsi'.$ldeskripsi.'DIHAPUS
Jenis'.$ljenis.'DIHAPUS
Total'.$ltotal.'DIHAPUS
Dengan Alasan'.$alasan.''; - $baris6 = '
Eksekutor'.Session('nama').'
'; - $perubahan = $baris1.$baris2.$baris3.$baris4.$baris5.$baris6; - - Xfiles::create([ - 'xmarking' => 'SIMBHP-'.$postujuan.'-'.time(), - 'xtabel' => 'History SIMBHP', - 'xjenis' => '', - 'xfile' => $perubahan - ]); - if ($marking != ''){ - $bayar = SIMBHPReport::where('marking', $marking)->delete(); - } else { - $bayar = SIMBHPReport::where('id', $postujuan)->delete(); - } - } - } - if ($bayar){ - return response()->json(['status' => 'Success', 'message' => 'Transaksi '.$jenis.' Sukses Dilaksanakan']); - return back(); - } else { - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Update Gagal, Pastikan Data Yang anda Isi Sudah Sesuai']); - return back(); - } - } - } - else { - return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Pastikan Formnya Anda Isi dengan Lengkap']); - return back(); - } - } } diff --git a/htdocs/database/migrations/2026_02_20_000005_alter_simbhp_for_unit_breakdown_and_stats.php b/htdocs/database/migrations/2026_02_20_000005_alter_simbhp_for_unit_breakdown_and_stats.php new file mode 100644 index 00000000..e6df4162 --- /dev/null +++ b/htdocs/database/migrations/2026_02_20_000005_alter_simbhp_for_unit_breakdown_and_stats.php @@ -0,0 +1,56 @@ +string('satuan_kecil', 100)->nullable()->after('satuan'); + } + if (!Schema::hasColumn('simbhpjenis', 'konversi_kecil')) { + $table->integer('konversi_kecil')->default(1)->after('satuan_kecil'); + } + if (!Schema::hasColumn('simbhpjenis', 'stok_minimum')) { + $table->integer('stok_minimum')->default(0)->after('konversi_kecil'); + } + }); + + Schema::table('simbhpreport', function (Blueprint $table) { + if (!Schema::hasColumn('simbhpreport', 'qty_base')) { + $table->integer('qty_base')->nullable()->after('pengeluaran'); + } + if (!Schema::hasColumn('simbhpreport', 'satuan_transaksi')) { + $table->string('satuan_transaksi', 20)->nullable()->after('qty_base'); + } + }); + } + + public function down(): void + { + Schema::table('simbhpreport', function (Blueprint $table) { + if (Schema::hasColumn('simbhpreport', 'qty_base')) { + $table->dropColumn('qty_base'); + } + if (Schema::hasColumn('simbhpreport', 'satuan_transaksi')) { + $table->dropColumn('satuan_transaksi'); + } + }); + + Schema::table('simbhpjenis', function (Blueprint $table) { + if (Schema::hasColumn('simbhpjenis', 'satuan_kecil')) { + $table->dropColumn('satuan_kecil'); + } + if (Schema::hasColumn('simbhpjenis', 'konversi_kecil')) { + $table->dropColumn('konversi_kecil'); + } + if (Schema::hasColumn('simbhpjenis', 'stok_minimum')) { + $table->dropColumn('stok_minimum'); + } + }); + } +}; diff --git a/htdocs/resources/views/admin/gudang.blade.php b/htdocs/resources/views/admin/gudang.blade.php index d31f35d8..f6534d15 100644 --- a/htdocs/resources/views/admin/gudang.blade.php +++ b/htdocs/resources/views/admin/gudang.blade.php @@ -52,9 +52,9 @@
-

{{ $rusak ?? 0 }}

- Barang Rusak/Hilang
- +

{{ count($warningstok ?? []) }}

+ Warning Stok Menipis
+ Lihat
@@ -63,6 +63,85 @@ +
+
+
+

Warning Barang Segera Habis

+ @if(isset($warningstok) && count($warningstok) > 0) + @foreach($warningstok as $w) +
+ {{ $w['jenis'] }} tersisa {{ $w['saldo'] }}. + Stok minimum: {{ number_format($w['minimum'], 0, '.', ',') }} {{ $w['satuan_kecil'] }}. +
+ @endforeach + @else +
Semua stok masih aman.
+ @endif +
+
+
+
+
+
+
Statistik Harian (Base Unit)
+
Masuk: {{ number_format($stat_harian_masuk ?? 0, 0, '.', ',') }}
+
Keluar: {{ number_format($stat_harian_keluar ?? 0, 0, '.', ',') }}
+
+
+ + + + @forelse($stat_perjenis_harian ?? [] as $row) + + @empty + + @endforelse + +
JenisMasukKeluar
{{ $row['jenis'] }}{{ number_format($row['masuk'],0,'.',',') }}{{ number_format($row['keluar'],0,'.',',') }}
Belum ada transaksi
+
+
+
+
+
+
Statistik Bulanan (Base Unit)
+
Masuk: {{ number_format($stat_bulanan_masuk ?? 0, 0, '.', ',') }}
+
Keluar: {{ number_format($stat_bulanan_keluar ?? 0, 0, '.', ',') }}
+
+
+ + + + @forelse($stat_perjenis_bulanan ?? [] as $row) + + @empty + + @endforelse + +
JenisMasukKeluar
{{ $row['jenis'] }}{{ number_format($row['masuk'],0,'.',',') }}{{ number_format($row['keluar'],0,'.',',') }}
Belum ada transaksi
+
+
+
+
+
+
Statistik Tahunan (Base Unit)
+
Masuk: {{ number_format($stat_tahunan_masuk ?? 0, 0, '.', ',') }}
+
Keluar: {{ number_format($stat_tahunan_keluar ?? 0, 0, '.', ',') }}
+
+
+ + + + @forelse($stat_perjenis_tahunan ?? [] as $row) + + @empty + + @endforelse + +
JenisMasukKeluar
{{ $row['jenis'] }}{{ number_format($row['masuk'],0,'.',',') }}{{ number_format($row['keluar'],0,'.',',') }}
Belum ada transaksi
+
+
+
+
@@ -134,6 +213,19 @@
+
+ + +
+
+ + + Contoh: 1 box = 100 strip, isi 100. +
+
+ + +