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 = '
Data Lama | Data Perubahan |
';
+ $baris2 = '| Deskripsi | '.$ldeskripsi.' | Diubah Menjadi | '.$deskripsi.' |
';
+ $baris3 = '| Jenis | '.$ljenis.' | Diubah Menjadi | '.$pos.' |
';
+ $baris4 = '| Total | '.$ltotal.' | Diubah Menjadi | '.$jumlah.' |
';
+ $baris5 = '| 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 = 'Data Lama | Data Perubahan |
';
+ $baris2 = '| Deskripsi | '.$ldeskripsi.' | DIHAPUS |
';
+ $baris3 = '| Jenis | '.$ljenis.' | DIHAPUS |
';
+ $baris4 = '| Total | '.$ltotal.' | DIHAPUS |
';
+ $baris5 = '| 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 = 'Data Lama | Data Perubahan |
';
- $baris2 = '| Deskripsi | '.$ldeskripsi.' | Diubah Menjadi | '.$deskripsi.' |
';
- $baris3 = '| Jenis | '.$ljenis.' | Diubah Menjadi | '.$pos.' |
';
- $baris4 = '| Total | '.$ltotal.' | Diubah Menjadi | '.$jumlah.' |
';
- $baris5 = '| 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 = 'Data Lama | Data Perubahan |
';
- $baris2 = '| Deskripsi | '.$ldeskripsi.' | DIHAPUS |
';
- $baris3 = '| Jenis | '.$ljenis.' | DIHAPUS |
';
- $baris4 = '| Total | '.$ltotal.' | DIHAPUS |
';
- $baris5 = '| 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, '.', ',') }}
+
+
+
+ | Jenis | Masuk | Keluar |
+
+ @forelse($stat_perjenis_harian ?? [] as $row)
+ | {{ $row['jenis'] }} | {{ number_format($row['masuk'],0,'.',',') }} | {{ number_format($row['keluar'],0,'.',',') }} |
+ @empty
+ | Belum ada transaksi |
+ @endforelse
+
+
+
+
+
+
+
+
Statistik Bulanan (Base Unit)
+
Masuk: {{ number_format($stat_bulanan_masuk ?? 0, 0, '.', ',') }}
+
Keluar: {{ number_format($stat_bulanan_keluar ?? 0, 0, '.', ',') }}
+
+
+
+ | Jenis | Masuk | Keluar |
+
+ @forelse($stat_perjenis_bulanan ?? [] as $row)
+ | {{ $row['jenis'] }} | {{ number_format($row['masuk'],0,'.',',') }} | {{ number_format($row['keluar'],0,'.',',') }} |
+ @empty
+ | Belum ada transaksi |
+ @endforelse
+
+
+
+
+
+
+
+
Statistik Tahunan (Base Unit)
+
Masuk: {{ number_format($stat_tahunan_masuk ?? 0, 0, '.', ',') }}
+
Keluar: {{ number_format($stat_tahunan_keluar ?? 0, 0, '.', ',') }}
+
+
+
+ | Jenis | Masuk | Keluar |
+
+ @forelse($stat_perjenis_tahunan ?? [] as $row)
+ | {{ $row['jenis'] }} | {{ number_format($row['masuk'],0,'.',',') }} | {{ number_format($row['keluar'],0,'.',',') }} |
+ @empty
+ | Belum ada transaksi |
+ @endforelse
+
+
+
+
+
+