CRUD area & gate, statistik pengunjung per pintu, laporan okupansi area
This commit is contained in:
@@ -31,10 +31,84 @@ public function statistik()
|
||||
return view("report.statistik");
|
||||
}
|
||||
|
||||
public function statistikPengunjung()
|
||||
{
|
||||
$pintu = DB::table("nama_pos")->select("id", "nama")->orderBy("id")->get();
|
||||
|
||||
return view("report.statistik-pengunjung", compact("pintu"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Statistik transaksi parkir dipecah per hari / minggu / bulan.
|
||||
* Periode berdasarkan kolom tanggal. Response: rows per periode + ringkasan.
|
||||
* Statistik jumlah pengunjung (kendaraan masuk) per jam / hari / minggu.
|
||||
* Fokus qty saja, periode berdasarkan waktu_masuk.
|
||||
*/
|
||||
public function statistikPengunjungData(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
"grup" => "nullable|in:jam,hari,minggu",
|
||||
"tgl_awal" => "nullable|date_format:Y-m-d",
|
||||
"tgl_akhir" => "nullable|date_format:Y-m-d|after_or_equal:tgl_awal",
|
||||
"pintu_masuk" => "nullable|string|max:10",
|
||||
]);
|
||||
|
||||
$grup = $request->input("grup", "hari");
|
||||
$tglAkhir = $request->input("tgl_akhir", date("Y-m-d"));
|
||||
$tglAwal = $request->input("tgl_awal", date("Y-m-d", strtotime("-6 days", strtotime($tglAkhir))));
|
||||
|
||||
if ((strtotime($tglAkhir) - strtotime($tglAwal)) / 86400 > 370) {
|
||||
return response()->json(["message" => "Rentang maksimal 370 hari, persempit periodenya."], 422);
|
||||
}
|
||||
|
||||
$bucket = match ($grup) {
|
||||
"jam" => "to_char(date_trunc('hour', tp.waktu_masuk), 'YYYY-MM-DD HH24:00:00')",
|
||||
"minggu" => "to_char(date_trunc('week', tp.waktu_masuk), 'YYYY-MM-DD')",
|
||||
default => "to_char(date_trunc('day', tp.waktu_masuk), 'YYYY-MM-DD')",
|
||||
};
|
||||
$labelPintu = "case when tp.id_pintu_masuk is null then 'Tanpa Pintu' when np.nama is null then 'Pintu ' || tp.id_pintu_masuk else np.nama || ' (' || tp.id_pintu_masuk || ')' end";
|
||||
|
||||
$query = DB::table("transaksi_parkir as tp")
|
||||
->leftJoin("nama_pos as np", "np.id", "=", "tp.id_pintu_masuk")
|
||||
->whereNotNull("tp.waktu_masuk")
|
||||
->whereDate("tp.waktu_masuk", ">=", $tglAwal)
|
||||
->whereDate("tp.waktu_masuk", "<=", $tglAkhir);
|
||||
|
||||
if ($request->filled("pintu_masuk") && $request->input("pintu_masuk") !== "all") {
|
||||
if ($request->input("pintu_masuk") === "__none__") {
|
||||
$query->whereNull("tp.id_pintu_masuk");
|
||||
} else {
|
||||
$query->where("tp.id_pintu_masuk", $request->input("pintu_masuk"));
|
||||
}
|
||||
}
|
||||
|
||||
$rows = $query
|
||||
->selectRaw("{$bucket} as periode")
|
||||
->selectRaw("tp.id_pintu_masuk")
|
||||
->selectRaw("{$labelPintu} as pintu")
|
||||
->selectRaw("count(*) as jumlah")
|
||||
->groupByRaw("{$bucket}, tp.id_pintu_masuk, np.nama")
|
||||
->orderBy("periode")
|
||||
->orderBy("pintu")
|
||||
->get();
|
||||
|
||||
$total = (int) $rows->sum("jumlah");
|
||||
$puncak = $rows->sortByDesc("jumlah")->first();
|
||||
|
||||
return response()->json([
|
||||
"status" => true,
|
||||
"grup" => $grup,
|
||||
"tgl_awal" => $tglAwal,
|
||||
"tgl_akhir" => $tglAkhir,
|
||||
"data" => $rows,
|
||||
"ringkasan" => [
|
||||
"total" => $total,
|
||||
"rata_rata" => $rows->count() ? round($total / $rows->count(), 1) : 0,
|
||||
"puncak" => $puncak ? (int) $puncak->jumlah : 0,
|
||||
"puncak_periode" => $puncak ? $puncak->periode : null,
|
||||
"puncak_pintu" => $puncak ? $puncak->pintu : null,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function statistikData(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
@@ -55,14 +129,16 @@ public function statistikData(Request $request)
|
||||
}
|
||||
|
||||
$bucket = match ($grup) {
|
||||
"minggu" => "date_trunc('week', tp.tanggal)::date",
|
||||
"bulan" => "date_trunc('month', tp.tanggal)::date",
|
||||
default => "tp.tanggal::date",
|
||||
"minggu" => "date_trunc('week', tp.waktu_keluar)::date",
|
||||
"bulan" => "date_trunc('month', tp.waktu_keluar)::date",
|
||||
default => "tp.waktu_keluar::date",
|
||||
};
|
||||
|
||||
$query = DB::table("transaksi_parkir as tp")
|
||||
->whereDate("tp.tanggal", ">=", $tglAwal)
|
||||
->whereDate("tp.tanggal", "<=", $tglAkhir);
|
||||
->where("tp.status", 0)
|
||||
->whereNotNull("tp.waktu_keluar")
|
||||
->whereDate("tp.waktu_keluar", ">=", $tglAwal)
|
||||
->whereDate("tp.waktu_keluar", "<=", $tglAkhir);
|
||||
|
||||
if ($request->filled("status_transaksi")) {
|
||||
$query->where("tp.status_transaksi", $request->input("status_transaksi"));
|
||||
@@ -78,10 +154,9 @@ public function statistikData(Request $request)
|
||||
$rows = $query
|
||||
->selectRaw("({$bucket}) as periode")
|
||||
->selectRaw("count(*) as transaksi")
|
||||
->selectRaw("count(case when tp.status = 0 then 1 end) as keluar")
|
||||
->selectRaw("coalesce(sum(case when tp.status = 0 then tp.bayar_keluar end), 0) as pendapatan")
|
||||
->selectRaw("coalesce(sum(case when tp.status = 0 and (tp.cara_bayar is null or tp.cara_bayar = 0) then tp.bayar_keluar end), 0) as tunai")
|
||||
->selectRaw("coalesce(sum(case when tp.status = 0 and tp.cara_bayar = 3 then tp.bayar_keluar end), 0) as cashless")
|
||||
->selectRaw("coalesce(sum(tp.bayar_keluar), 0) as pendapatan")
|
||||
->selectRaw("coalesce(sum(case when tp.cara_bayar is null or tp.cara_bayar = 0 then tp.bayar_keluar end), 0) as tunai")
|
||||
->selectRaw("coalesce(sum(case when tp.cara_bayar = 3 then tp.bayar_keluar end), 0) as cashless")
|
||||
->groupByRaw($bucket)
|
||||
->orderBy("periode")
|
||||
->get();
|
||||
@@ -94,7 +169,6 @@ public function statistikData(Request $request)
|
||||
"data" => $rows,
|
||||
"ringkasan" => [
|
||||
"transaksi" => $rows->sum("transaksi"),
|
||||
"keluar" => $rows->sum("keluar"),
|
||||
"pendapatan" => (float) $rows->sum("pendapatan"),
|
||||
"tunai" => (float) $rows->sum("tunai"),
|
||||
"cashless" => (float) $rows->sum("cashless"),
|
||||
|
||||
Reference in New Issue
Block a user