count('idproduk'); // Total transaksi $jumlahtransaksi = FacadesDB::table('penjualan')->count('idpenjualan'); // Total penjualan per bulan $sales = FacadesDB::table('penjualan') ->selectRaw('MONTH(tanggalpenjualan) as bulan, SUM(grandtotal) as total') ->groupBy('bulan') ->pluck('total', 'bulan') ->toArray(); // Ambil 5 produk terlaris berdasarkan jumlah penjualan $produkTerlaris = FacadesDB::table('penjualan') ->select('namabarang', FacadesDB::raw('SUM(jumlah) as total_terjual')) ->groupBy('namabarang') ->orderByDesc('total_terjual') ->limit(5) ->get(); return view('admin.dashboard', compact('jumlahbarang', 'jumlahtransaksi', 'sales', 'produkTerlaris')); } public function daftarbarang() { $data['daftarbarang'] = FacadesDB::table('produk')->get(); return view('admin.daftarbarang', $data); } public function tambahbarang() { return view('admin.tambahbarang'); } public function tambahbarangsimpan(Request $request) { $request->validate([ 'namaproduk' => 'required', 'stok' => 'required', 'hargajual' => 'required', ]); FacadesDB::table('produk')->insert([ 'namaproduk' => $request->input('namaproduk'), 'stok' => $request->input('stok'), 'hargajual' => $request->input('hargajual'), 'created_at' => date('Y-m-d H:i:s'), ]); return redirect('daftarbarang')->with('success', 'Data Berhasil Ditambahkan'); } public function barangedit($id) { $data['barang'] = FacadesDB::table('produk')->where('idproduk', $id)->first(); return view('admin.barangedit', $data); } public function barangeditsimpan(Request $request, $id) { $request->validate([ 'namaproduk' => 'required', 'stok' => 'required', 'hargajual' => 'required', ]); FacadesDB::table('produk')->where('idproduk', $id)->update([ 'namaproduk' => $request->input('namaproduk'), 'stok' => $request->input('stok'), 'hargajual' => $request->input('hargajual'), ]); return redirect('daftarbarang')->with('success', 'Data Berhasil Diubah'); } public function baranghapus($id) { FacadesDB::table('produk')->where('idproduk', $id)->delete(); return redirect('daftarbarang')->with('success', 'Data Berhasil Dihapus'); } // Pengguna public function penggunadaftar() { $data['pengguna'] = FacadesDB::table('users')->where('id', '!=', Auth::user()->id)->get(); return view('admin.penggunadaftar', $data); } public function penggunatambah() { return view('admin.penggunatambah'); } public function penggunatambahsimpan(Request $request) { $request->validate([ 'name' => 'required', 'email' => 'required', 'password' => 'required', 'role' => 'required', 'username' => 'required', ]); FacadesDB::table('users')->insert([ 'name' => $request->input('name'), 'username' => $request->input('username'), 'email' => $request->input('email'), 'password' => bcrypt($request->input('password')), 'role' => $request->input('role'), ]); return redirect('penggunadaftar')->with('success', 'Data Berhasil Ditambahkan'); } public function penggunaedit($id) { $data['pengguna'] = FacadesDB::table('users')->where('id', $id)->first(); return view('admin.penggunaedit', $data); } public function penggunaeditsimpan(Request $request, $id) { $request->validate([ 'name' => 'required', 'email' => 'required', 'role' => 'required', 'username' => 'required', ]); $data = [ 'name' => $request->input('name'), 'username' => $request->input('username'), 'email' => $request->input('email'), 'role' => $request->input('role'), ]; if ($request->input('password')) { $data['password'] = bcrypt($request->input('password')); } FacadesDB::table('users')->where('id', $id)->update($data); return redirect('penggunadaftar')->with('success', 'Data Berhasil Diubah'); } public function penggunahapus($id) { FacadesDB::table('users')->where('id', $id)->delete(); return redirect('penggunadaftar')->with('success', 'Data Berhasil Dihapus'); } // Profile public function profile() { $data['profile'] = FacadesDB::table('users')->where('id', Auth::user()->id)->first(); return view('admin.profile', $data); } public function profileupdate(Request $request) { $request->validate([ 'name' => 'required', 'username' => 'required', 'email' => 'required', ]); $data = [ 'name' => $request->input('name'), 'username' => $request->input('username'), 'email' => $request->input('email'), ]; if ($request->input('password')) { $data['password'] = bcrypt($request->input('password')); } FacadesDB::table('users')->where('id', Auth::user()->id)->update($data); return redirect('profile')->with('success', 'Data Berhasil Diubah'); } public function penjualandaftar() { // Ambil data penjualan yang dikelompokkan berdasarkan 'notajual' $data['penjualan'] = FacadesDB::table('penjualan') ->select('notajual', 'tanggalpenjualan', 'grandtotal') ->groupBy('notajual') ->orderBy('idpenjualan', 'desc') ->get(); // Buat array untuk menyimpan detail penjualan $penjualanDetail = []; // Loop untuk setiap penjualan dan ambil detailnya foreach ($data['penjualan'] as $value) { $penjualanDetail[$value->notajual] = FacadesDB::table('penjualan') ->where('notajual', $value->notajual) ->get(); } // Tambahkan detail penjualan ke data yang akan dikirim ke view $data['penjualandetail'] = $penjualanDetail; // dd($data); return view('admin.penjualandaftar', $data); } public function penjualantambah() { $data['barang'] = FacadesDB::table('produk')->get(); return view('admin.penjualantambah', $data); } private function bersihkanRupiah($nilai) { return (int) str_replace(['Rp', '.', ',', ' '], '', $nilai); } public function penjualantambahsimpan(Request $request) { $notajual = now()->format('Ymdhis'); // Bersihkan uangpembeli & kembalian jadi angka murni $uangPembeliRaw = $request->uangpembeli ?? '0'; $uangPembeli = (int) preg_replace('/[^\d]/', '', $uangPembeliRaw); $kembalianRaw = $request->kembalian ?? '0'; $kembalian = (int) preg_replace('/[^\d]/', '', $kembalianRaw); foreach ($request->namabarang as $key => $namabarang) { $stok = FacadesDB::table('produk')->where('namaproduk', $namabarang)->select('stok')->first(); if ($stok->stok < $request->jumlah[$key]) { return redirect('penjualantambah')->with('error', 'Jumlah pembelian melebihi stok'); } FacadesDB::table('penjualan')->insert([ 'notajual' => $notajual, 'namabarang' => $namabarang, 'harga' => $request->harga[$key], 'jumlah' => $request->jumlah[$key], 'total' => $request->total[$key], 'tanggalpenjualan' => $request->tanggalpenjualan, 'grandtotal' => $request->grandtotalnon, 'uangpembeli' => $uangPembeli, 'kembalian' => $kembalian, 'metodepembayaran' => $request->metodepembayaran, 'potongan' => $request->potongan[$key], ]); // Update stock FacadesDB::table('produk')->where('namaproduk', $namabarang)->decrement('stok', $request->jumlah[$key]); } return redirect('notapenjualan/' . $notajual); } public function penjualanhapus($id) { FacadesDB::table('penjualan')->where('notajual', $id)->delete(); return redirect('penjualan')->with('success', 'Data Berhasil Dihapus'); } public function cetaknotapenjualan($id) { // Ambil data penjualan yang dikelompokkan berdasarkan 'notajual' $data['penjualan'] = FacadesDB::table('penjualan') ->select('*') ->groupBy('notajual') ->orderBy('idpenjualan', 'desc') ->where('notajual', $id)->first(); // Buat array untuk menyimpan detail penjualan $penjualanDetail = []; // Loop untuk setiap penjualan dan ambil detailnya $penjualanDetail[$data['penjualan']->notajual] = FacadesDB::table('penjualan') ->where('notajual', $data['penjualan']->notajual) ->get(); // Tambahkan detail penjualan ke data yang akan dikirim ke view $data['penjualandetail'] = $penjualanDetail; return view('admin.cetaknotapenjualan', $data); } public function cetakfakturpenjualan($id) { // Ambil data penjualan yang dikelompokkan berdasarkan 'notajual' $data['penjualan'] = FacadesDB::table('penjualan') ->select('*') ->groupBy('notajual') ->orderBy('idpenjualan', 'desc') ->where('notajual', $id)->first(); // Buat array untuk menyimpan detail penjualan $penjualanDetail = []; // Loop untuk setiap penjualan dan ambil detailnya $penjualanDetail[$data['penjualan']->notajual] = FacadesDB::table('penjualan') ->where('notajual', $data['penjualan']->notajual) ->get(); // Tambahkan detail penjualan ke data yang akan dikirim ke view $data['penjualandetail'] = $penjualanDetail; // dd($data); return view('admin.cetakfakturpenjualan', $data); } public function pelanggan() { // Get all pelanggan records $data['pelanggan'] = FacadesDB::table('pelanggan')->get(); // Getting unique visit counts for each pelanggan based on distinct notajual $visitCounts = FacadesDB::table('penjualan') ->select('idpelanggan', FacadesDB::raw('COUNT(DISTINCT notajual) as visit_count')) ->groupBy('idpelanggan') ->pluck('visit_count', 'idpelanggan'); // Preparing the visit array $data['visit'] = []; foreach ($data['pelanggan'] as $value) { // Default to 0 if not found $data['visit'][$value->idpelanggan] = $visitCounts->get($value->idpelanggan, 0); } return view('admin.pelanggandaftar', $data); } public function pelanggantambah() { return view('admin.pelanggantambah'); } public function pelanggantambahsimpan(Request $request) { $request->validate([ 'namapelanggan' => 'required', 'alamat' => 'required', 'nohp' => 'required|numeric', ]); FacadesDB::table('pelanggan')->insert([ 'namapelanggan' => $request->input('namapelanggan'), 'alamat' => $request->input('alamat'), 'nohp' => $request->input('nohp'), ]); return redirect('pelanggandaftar')->with('success', 'Data Berhasil Ditambahkan'); } public function pelangganedit($id) { $data['pelanggan'] = FacadesDB::table('pelanggan')->where('idpelanggan', $id)->first(); return view('admin.pelangganedit', $data); } public function pelanggandetail($id) { $data['penjualan'] = FacadesDB::table('penjualan') ->select('notajual', 'tanggalpenjualan', 'grandtotal') ->where('idpelanggan', $id) ->groupBy('notajual') ->orderBy('idpenjualan', 'desc') ->get(); // Buat array untuk menyimpan detail penjualan $penjualanDetail = []; // Loop untuk setiap penjualan dan ambil detailnya foreach ($data['penjualan'] as $value) { $penjualanDetail[$value->notajual] = FacadesDB::table('penjualan') ->where('notajual', $value->notajual) ->get(); } // Tambahkan detail penjualan ke data yang akan dikirim ke view $data['penjualandetail'] = $penjualanDetail; $data['namapelanggan'] = FacadesDB::table('pelanggan') ->select('namapelanggan') ->where('idpelanggan', $id) ->first() ->namapelanggan; return view('admin.pelanggandetail', $data); } public function pelangganeditsimpan(Request $request, $id) { $request->validate([ 'namapelanggan' => 'required', 'alamat' => 'required', 'nohp' => 'required|numeric', ]); FacadesDB::table('pelanggan')->where('idpelanggan', $id)->update([ 'namapelanggan' => $request->input('namapelanggan'), 'alamat' => $request->input('alamat'), 'nohp' => $request->input('nohp'), ]); return redirect('pelanggandaftar')->with('success', 'Data Berhasil Diubah'); } public function pelangganhapus($id) { FacadesDB::table('pelanggan')->where('idpelanggan', $id)->delete(); return back()->with('success', 'Data Berhasil Dihapus'); } public function laporanpenjualan(Request $request) { $tanggalAwal = $request->input('tanggal_awal'); $tanggalAkhir = $request->input('tanggal_akhir'); $query = FacadesDB::table('penjualan'); if ($tanggalAwal && $tanggalAkhir) { $query->whereBetween('tanggalpenjualan', [$tanggalAwal, $tanggalAkhir]); } $sales = $query->orderBy('tanggalpenjualan', 'desc')->get(); $totalPemasukan = $sales->sum('total'); // Check the action from the request if ($request->input('action') === 'cetak') { // Load the view for the PDF $pdf = FacadePdf::loadView('admin.laporanpenjualancetak', [ 'sales' => $sales, 'totalPemasukan' => $totalPemasukan, 'tanggalAwal' => $tanggalAwal, 'tanggalAkhir' => $tanggalAkhir, ]); // Return the PDF to the browser return $pdf->download('laporan_penjualan.pdf'); } // Return the view with the sales data for the search action return view('admin.laporanpenjualan', compact('sales', 'totalPemasukan', 'tanggalAwal', 'tanggalAkhir')); } public function peramalan(Request $request) { $tanggal_awal = $request->input('tanggal_awal', date('Y-m-01')); // Default awal bulan ini $tanggal_akhir = $request->input('tanggal_akhir', date('Y-m-t')); // Default akhir bulan ini $periode = $request->input('periode', 3); // Default 3 bulan $penjualan = FacadesDB::table('penjualan') ->select(FacadesDB::raw('DATE_FORMAT(tanggalpenjualan, "%Y-%m") as bulan'), FacadesDB::raw('SUM(jumlah) as jumlahtotal')) ->whereBetween('tanggalpenjualan', [$tanggal_awal, $tanggal_akhir]) // Filter tanggal ->groupBy('bulan') ->orderBy('bulan', 'asc') ->get(); $data_penjualan = []; foreach ($penjualan as $p) { $data_penjualan[] = ['bulan' => $p->bulan, 'jumlahtotal' => $p->jumlahtotal]; } usort($data_penjualan, function ($a, $b) { return strcmp($a['bulan'], $b['bulan']); }); $moving_averages = []; $grafik = []; if (count($data_penjualan) >= $periode) { for ($i = $periode - 1; $i < count($data_penjualan); $i++) { $sum = 0; for ($j = 0; $j < $periode; $j++) { $sum += $data_penjualan[$i - $j]['jumlahtotal']; } $rata2 = $sum / $periode; $moving_averages[] = [ 'tanggal' => $data_penjualan[$i]['bulan'], 'rata2' => round($rata2, 2) ]; $grafik[] = [ 'bulan' => $data_penjualan[$i]['bulan'], 'jumlah' => $data_penjualan[$i]['jumlahtotal'], 'prediksi' => round($rata2, 2) ]; } // Prediksi bulan berikutnya $sum = 0; for ($k = count($data_penjualan) - $periode; $k < count($data_penjualan); $k++) { $sum += $data_penjualan[$k]['jumlahtotal']; } $prediksi = $sum / $periode; $lastMonth = end($data_penjualan)['bulan']; $nextMonth = date('Y-m', strtotime($lastMonth . ' +1 month')); $moving_averages[] = [ 'tanggal' => $nextMonth, 'rata2' => round($prediksi, 2) ]; $grafik[] = [ 'bulan' => $nextMonth, 'jumlah' => null, 'prediksi' => round($prediksi, 2) ]; } $barang = FacadesDB::table('produk')->get(); return view('admin.peramalan', compact('data_penjualan', 'moving_averages', 'periode', 'grafik', 'tanggal_awal', 'tanggal_akhir', 'barang')); } public function peramalanhasil(Request $request) { $tanggal_awal = $request->input('tanggal_awal', date('Y-m-01')); // Default awal bulan ini $tanggal_akhir = $request->input('tanggal_akhir', date('Y-m-t')); // Default akhir bulan ini $periode = $request->input('periode', 3); // Default 3 bulan $idbarang = $request->input('idbarang'); $rowbarang = FacadesDB::table('produk')->where('idproduk', $idbarang)->first(); $namaproduk = $rowbarang->namaproduk; $penjualan = FacadesDB::table('penjualan') ->select(FacadesDB::raw('DATE_FORMAT(tanggalpenjualan, "%Y-%m") as bulan'), FacadesDB::raw('SUM(jumlah) as jumlahtotal')) ->whereBetween('tanggalpenjualan', [$tanggal_awal, $tanggal_akhir]) ->where('namabarang', $namaproduk) ->groupBy('bulan') ->orderBy('bulan', 'asc') ->get(); $data_penjualan = []; foreach ($penjualan as $p) { $data_penjualan[] = ['bulan' => $p->bulan, 'jumlahtotal' => $p->jumlahtotal]; } usort($data_penjualan, function ($a, $b) { return strcmp($a['bulan'], $b['bulan']); }); $moving_averages = []; $grafik = []; $errors = []; $mape = 0; if (count($data_penjualan) >= $periode) { for ($i = $periode - 1; $i < count($data_penjualan); $i++) { $sum = 0; for ($j = 0; $j < $periode; $j++) { $sum += $data_penjualan[$i - $j]['jumlahtotal']; } $rata2 = $sum / $periode; $actual = $data_penjualan[$i]['jumlahtotal']; // MAPE Calculation $error = abs(($actual - $rata2) / $actual) * 100; $errors[] = $error; $moving_averages[] = [ 'tanggal' => $data_penjualan[$i]['bulan'], 'rata2' => round($rata2, 2), 'error' => round($error, 2) ]; $grafik[] = [ 'bulan' => $data_penjualan[$i]['bulan'], 'jumlah' => $actual, 'prediksi' => round($rata2, 2) ]; } // Hitung MAPE rata-rata if (count($errors) > 0) { $mape = array_sum($errors) / count($errors); } // Prediksi bulan berikutnya $sum = 0; for ($k = count($data_penjualan) - $periode; $k < count($data_penjualan); $k++) { $sum += $data_penjualan[$k]['jumlahtotal']; } $prediksi = $sum / $periode; $lastMonth = end($data_penjualan)['bulan']; $nextMonth = date('Y-m', strtotime($lastMonth . ' +1 month')); $moving_averages[] = [ 'tanggal' => $nextMonth, 'rata2' => round($prediksi, 2), 'error' => null // Tidak ada error untuk prediksi bulan depan ]; $grafik[] = [ 'bulan' => $nextMonth, 'jumlah' => null, 'prediksi' => round($prediksi, 2) ]; } return view('admin.peramalanhasil', compact('data_penjualan', 'moving_averages', 'periode', 'grafik', 'tanggal_awal', 'tanggal_akhir', 'mape', 'namaproduk')); } }