623 lines
21 KiB
PHP
623 lines
21 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Barryvdh\DomPDF\Facade\Pdf as FacadePdf;
|
|
use Barryvdh\DomPDF\PDF;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Container\Attributes\DB;
|
|
use Illuminate\Support\Facades\DB as FacadesDB;
|
|
use Carbon\Carbon;
|
|
|
|
class AdminController extends Controller
|
|
{
|
|
public function dashboard()
|
|
{
|
|
// Total produk
|
|
$jumlahbarang = FacadesDB::table('produk')->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'));
|
|
}
|
|
}
|