MIF_E31211810/app/Http/Controllers/HitungController.php

184 lines
7.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Hasil;
use App\MovingAverage;
use App\Models\Produk;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
class HitungController extends Controller
{
function index()
{
$data['title'] = 'Perhitungan';
$data['awal'] = get_var("SELECT MIN(tanggal) FROM tb_penjualan");
$data['akhir'] = get_var("SELECT MAX(tanggal) FROM tb_penjualan");
return view('hitung.index', $data);
}
public function hasilHitung(Request $request)
{
$data = [];
$data['awal'] = $request->awal;
$data['akhir'] = $request->akhir;
$data['next_periode'] = 1;
$data['moving_periode'] = $request->moving_periode;
$data['title'] = "Hasil Perhitungan"; // Judul halaman
// Ambil nilai pencarian dari input 'search'
$data['q'] = $request->input('q');
// Ambil semua produk dari model Produk
$produks = Produk::all();
$data['produks'] = [];
// Loop untuk mengisi array $data['produks']
foreach ($produks as $produk) {
$data['produks'][$produk->kode_produk] = $produk->nama_produk;
}
// Inisialisasi query untuk hasil perhitungan
$query = Hasil::query()
->where('periode', $data['moving_periode'])
->whereIn('kode_produk', array_keys($data['produks']));
// Jika ada nilai pencarian, tambahkan kondisi pencarian
if (!empty($data['q'])) {
$query->where(function ($query) use ($data) {
$query->where('kode_produk', 'like', '%' . $data['q'] . '%')
->orWhere('tanggal', 'like', '%' . $data['q'] . '%')
->orWhere('jumlah', 'like', '%' . $data['q'] . '%')
->orWhere('mape', 'like', '%' . $data['q'] . '%');
});
}
$data['rows'] = $query->get();
return view('hitung.hitungHasil', $data);
}
function hasil(Request $request)
{
$data['q'] = $request->input('q');
$data['kode_produk'] = $request->input('kode_produk');
$data['title'] = 'Hasil Peramalan';
$data['limit'] = 25;
$query = Hasil::where(function ($query) use ($data) {
$query->where('nama_produk', 'like', '%' . $data['q'] . '%')
->orWhere('tb_hasil.kode_produk', 'like', '%' . $data['q'] . '%')
->orWhere('tb_hasil.periode', 'like', '%' . $data['q'] . '%');
})->leftJoin('tb_produk', 'tb_produk.kode_produk', '=', 'tb_hasil.kode_produk')
->orderBy('tanggal', 'DESC');
if ($data['kode_produk'])
$query->where('tb_produk.kode_produk', $data['kode_produk']);
$data['rows'] = $query->paginate($data['limit'])->withQueryString();
$data['no'] = $data['rows']->firstItem();
return view('hitung.hasil', $data);
}
function detail(Request $request)
{
$data['awal'] = $request->awal;
$data['akhir'] = $request->akhir;
$data['next_periode'] = 1;
$data['moving_periode'] = $request->moving_periode;
$data['title'] = "Hasil Perhitungan"; //judul halaman
$data['search'] = $request->input('search');
$produks = Produk::all(); //mengambil semua produk
$data['produks'] = array();
foreach ($produks as $row) {
$data['produks'][$row->kode_produk] = $row->nama_produk;
}
foreach ($data['produks'] as $kode_produk => $nama_produk) {
$rows = get_results("SELECT MAX(tanggal) as tanggal, SUM(jumlah) AS total FROM tb_penjualan WHERE tanggal>='$data[awal]' AND tanggal<='$data[akhir]' AND kode_produk='$kode_produk' GROUP BY YEAR(tanggal), MONTH(tanggal)");
$periode_data = array();
foreach ($rows as $row) {
$periode_data[$row->tanggal] = $row->total;
}
$ma = new MovingAverage($periode_data, $data['moving_periode'], $data['next_periode']);
$max = max(array_keys($ma->yt));
foreach ($ma->next_ft as $key => $val) {
$tanggal = date('Y-m-d', strtotime("+$key month", strtotime($max)));
$tahun = date('Y', strtotime("+$key month", strtotime($max)));
$bulan = date('m', strtotime("+$key month", strtotime($max)));
Hasil::where('kode_produk', $kode_produk)
->where('periode', $data['moving_periode'])
->whereMonth('tanggal', $bulan)
->whereYear('tanggal', $tahun)
->delete();
$hasil = new Hasil([
'tanggal' => $tanggal,
'kode_produk' => $kode_produk,
'periode' => $data['moving_periode'],
'jumlah' => $val,
'mape' => $ma->error['MAPE'],
]);
$hasil->save();
// Menambahkan logika kategori MAPE
$akurasi = '';
if ($ma->error['MAPE'] >= 0 && $ma->error['MAPE'] <= 0.10) {
$akurasi = 'Sangat Baik';
} elseif ($ma->error['MAPE'] > 0.10 && $ma->error['MAPE'] <= 0.20) {
$akurasi = 'Baik';
} elseif ($ma->error['MAPE'] > 0.20 && $ma->error['MAPE'] <= 0.50) {
$akurasi = 'Cukup Baik';
} elseif ($ma->error['MAPE'] > 0.50) {
$akurasi = 'Sangat Buruk';
}
// Update hasil dengan kategori MAPE
$hasil->akurasi = $akurasi;
$hasil->save();
}
}
// Ambil hasil dari database
$query = Hasil::where('periode', $data['moving_periode'])
->whereIn('kode_produk', array_keys($data['produks']));
// Apply search filter if present
if (!empty($data['q'])) {
$query->where(function ($search) use ($data) {
$search->where('kode_produk', 'like', '%' . $data['q'] . '%')
->orWhere('tanggal', 'like', '%' . $data['q'] . '%')
->orWhere('jumlah', 'like', '%' . $data['q'] . '%')
->orWhere('mape', 'like', '%' . $data['q'] . '%');
});
}
$data['results'] = $query->get()->groupBy('kode_produk');
return view('hitung.hitungHasil', $data); //memanggil view hitung.hasil
}
function cetak(Request $request)
{
$moving_periode = 3;
$data['moving_periode'] = $moving_periode;
$data['title'] = "Hasil Perhitungan";
$produks = Produk::all();
$data['produks'] = [];
foreach ($produks as $row) {
$data['produks'][$row->kode_produk] = $row->nama_produk;
}
$data['results'] = Hasil::where('periode', $data['moving_periode'])
->whereIn('kode_produk', array_keys($data['produks']))
->get()
->groupBy('kode_produk');
// Log data untuk memastikan data yang diterima
return view('hitung.cetak', $data);
}
}