<?php
namespace App\Http\Controllers;
use App\Exports\PelangganExport;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Models\Pelanggan;
use App\Models\Penjualan;
use App\Models\Service;
use DateInterval;
use DatePeriod;
use DateTime;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
class PelangganController extends Controller
{
/**
* Display a listing of the resource.
*/
private $sorting_order = "desc";
public function index(Request $request)
{
if ($request->sorting_order == "desc") {
$this->sorting_order = "asc";
}
$sorting_order = $this->sorting_order;
$begin = new DateTime('-1 month');
$end = new DateTime();
$periode = [
$begin->format('d/m/Y'),
$end->format('d/m/Y'),
];
// dd($begin, $end);
// $datas = Pelanggan::with(['riwayat', 'penjualan.detail_penjualan', 'service' => function ($q) {
// $q->where('status_transaksi', 'success')->with('detail');
// }])->withCount("riwayat")->withCount('penjualan')->withCount(['service' => function ($q) {
// $q->where('status_transaksi', 'success');
// }]);
$pelanggans = Pelanggan::query();
$datas = Pelanggan::with(['riwayat', 'penjualan.detail_penjualan', 'service.detail', 'service.sparepart_luar'])
->select([
'pelanggans.*',
])
// Menghitung jumlah transaksi (total penjualan + total service 'success')
->selectRaw(
'(
(SELECT COUNT(*) FROM penjualans WHERE penjualans.pelanggan_id = pelanggans.id AND penjualans.deleted_at IS NULL) +
(SELECT COUNT(*) FROM services WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL)
) as jumlah_transaksi'
)
// Menghitung nominal transaksi (total harga item penjualan + total harga item service 'success')
->selectRaw(
'
COALESCE((SELECT SUM((detail_penjualans.harga_item - detail_penjualans.diskon)*detail_penjualans.qty)
FROM detail_penjualans
JOIN penjualans ON detail_penjualans.penjualan_id = penjualans.id
WHERE penjualans.pelanggan_id = pelanggans.id AND penjualans.deleted_at IS NULL AND detail_penjualans.deleted_at IS NULL), 0)
+
COALESCE((SELECT SUM(services.biaya)
FROM services
WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL), 0)
+
COALESCE((SELECT SUM(((detail_services.harga_item - detail_services.diskon)*detail_services.jumlah))
FROM detail_services
JOIN services ON detail_services.service_id = services.id
WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL AND detail_services.deleted_at IS NULL), 0)
+
COALESCE((SELECT SUM(((sparepart_luars.harga_jual_SL - sparepart_luars.diskon_SL)*sparepart_luars.jumlah_SL))
FROM sparepart_luars
JOIN services ON sparepart_luars.service_id = services.id
WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL), 0)
as total_nominal'
)
->groupBy('pelanggans.id');
if (request()->periode) {
$periode = explode(" - ", request()->periode);
$begin = DateTime::createFromFormat('d/m/Y', $periode[0])->setTime(0, 0, 0);
$end = DateTime::createFromFormat('d/m/Y', $periode[1])->setTime(23, 59, 59);
if (isset($begin) && isset($end)) {
$datas->tanggal($begin, $end);
$pelanggans->tanggal($begin, $end);
}
}
if (isset($request->kecamatan)) {
$datas->kecamatan($request->kecamatan);
$pelanggans->kecamatan($request->kecamatan);
}
if (isset($request->nama_pelanggan)) {
$datas->cari($request->nama_pelanggan);
$pelanggans->cari($request->nama_pelanggan);
}
$countAll = $pelanggans->count();
$dataKecamatan = Pelanggan::select("kecamatan_pelanggan")->distinct()->get()->sortBy("kecamatan_pelanggan");
if ($request->order) {
$order = $request->order;
if ($order == "nama") {
$datas->orderBy("nama_pelanggan", $sorting_order);
} else if ($order == "telp") {
$datas->orderBy("telp_pelanggan", $sorting_order);
} else if ($order == "alamat") {
$datas->orderBy("alamat_pelanggan", $sorting_order);
} else if ($order == "kecamatan") {
$datas->orderBy("kecamatan_pelanggan", $sorting_order);
} else if ($order == "nominal") {
$datas->orderBy("total_nominal", $sorting_order);
} else if ($order == "waktu") {
$datas->orderBy("created_at", $sorting_order);
} else if ($order == "total") {
// $datas->orderBy("riwayat_count", $sorting_order);
$datas->orderBy("jumlah_transaksi", $sorting_order);
}
} else {
$datas->orderBy("jumlah_transaksi", $sorting_order);
}
if (isset($request->nama_pelanggan)) {
$datas = $datas->cari($request->nama_pelanggan);
}
// dd($datas->get(), $begin, $end);
$datas = $datas->paginate(15);
return response()->view("pelanggan.index", compact("request", "datas", "sorting_order", "dataKecamatan", "begin", "end", "countAll", "periode"));
}
public function exportExcel(Request $request)
{
$sorting_order = $this->sorting_order;
$begin = new DateTime('-1 month');
$end = new DateTime();
if (request()->periode) {
$periode = explode(" - ", request()->periode);
$begin = DateTime::createFromFormat('d/m/Y', $periode[0]);
$end = DateTime::createFromFormat('d/m/Y', $periode[1]);
}
$begin->format('d/m/Y');
$end->format('d/m/Y');
if ($this->sorting_order == "asc") {
$sorting_order = "desc";
} else {
$sorting_order = "asc";
}
// $datas = Pelanggan::withCount("riwayat")->orderBy("riwayat_count", $sorting_order);
// if (isset($begin) && isset($end)) {
// $datas->tanggal($begin, $end);
// }
// if (isset($request->kecamatan)) {
// $datas->kecamatan($request->kecamatan);
// }
// if ($request->order) {
// $order = $request->order;
// if ($order == "nama") {
// $datas->orderBy("nama_pelanggan", $sorting_order);
// } else if ($order == "telp") {
// $datas->orderBy("telp_pelanggan", $sorting_order);
// } else if ($order == "alamat") {
// $datas->orderBy("alamat_pelanggan", $sorting_order);
// } else if ($order == "nominal") {
// $datas->with("riwayat")->riwayatSum()->groupBy("pelanggans.id")->orderBy("total", $sorting_order);
// } else if ($order == "waktu") {
// $datas->orderBy("created_at", $sorting_order);
// }
// }
// // if (isset($begin) && isset($end)) {
// // $datas = Pelanggan::tanggal($begin, $end)->paginate(15);
// // return response()->view("pelanggan.index", compact("request", "datas"));
// // }
$datas = Pelanggan::with(['riwayat', 'penjualan.detail_penjualan', 'service.detail', 'service.sparepart_luar'])
->select([
'pelanggans.*',
])
// Menghitung jumlah transaksi (total penjualan + total service 'success')
->selectRaw(
'(
(SELECT COUNT(*) FROM penjualans WHERE penjualans.pelanggan_id = pelanggans.id) +
(SELECT COUNT(*) FROM services WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL)
) as jumlah_transaksi'
)
// Menghitung nominal transaksi (total harga item penjualan + total harga item service 'success')
->selectRaw(
'
COALESCE((SELECT SUM((detail_penjualans.harga_item - detail_penjualans.diskon)*detail_penjualans.qty)
FROM detail_penjualans
JOIN penjualans ON detail_penjualans.penjualan_id = penjualans.id
WHERE penjualans.pelanggan_id = pelanggans.id AND penjualans.deleted_at IS NULL AND detail_penjualans.deleted_at IS NULL), 0)
+
COALESCE((SELECT SUM(services.biaya)
FROM services
WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL), 0)
+
COALESCE((SELECT SUM(((detail_services.harga_item - detail_services.diskon)*detail_services.jumlah))
FROM detail_services
JOIN services ON detail_services.service_id = services.id
WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL AND detail_services.deleted_at IS NULL), 0)
+
COALESCE((SELECT SUM(((sparepart_luars.harga_jual_SL - sparepart_luars.diskon_SL)*sparepart_luars.jumlah_SL))
FROM sparepart_luars
JOIN services ON sparepart_luars.service_id = services.id
WHERE services.pelanggan_id = pelanggans.id AND services.status_transaksi = "success" AND services.deleted_at IS NULL), 0)
as total_nominal'
)
->groupBy('pelanggans.id');
if (request()->periode) {
$periode = explode(" - ", request()->periode);
$begin = DateTime::createFromFormat('d/m/Y', $periode[0])->setTime(0, 0, 0);
$end = DateTime::createFromFormat('d/m/Y', $periode[1])->setTime(23, 59, 59);
if (isset($begin) && isset($end)) {
$datas->tanggal($begin, $end);
}
}
if (isset($request->kecamatan)) {
$datas->kecamatan($request->kecamatan);
}
if ($request->order) {
$order = $request->order;
if ($order == "nama") {
$datas->orderBy("nama_pelanggan", $sorting_order);
} else if ($order == "telp") {
$datas->orderBy("telp_pelanggan", $sorting_order);
} else if ($order == "alamat") {
$datas->orderBy("alamat_pelanggan", $sorting_order);
} else if ($order == "kecamatan") {
$datas->orderBy("kecamatan_pelanggan", $sorting_order);
} else if ($order == "nominal") {
$datas->orderBy("total_nominal", $sorting_order);
} else if ($order == "waktu") {
$datas->orderBy("created_at", $sorting_order);
} else if ($order == "total") {
// $datas->orderBy("riwayat_count", $sorting_order);
$datas->orderBy("jumlah_transaksi", $sorting_order);
}
} else {
$datas->orderBy("jumlah_transaksi", $sorting_order);
}
if (isset($request->nama_pelanggan)) {
$datas = $datas->cari($request->nama_pelanggan);
}
$datas = $datas->get();
$dataArray = [];
foreach ($datas as $data) {
$dataArray[] = [
$data->nama_pelanggan,
$data->telp_pelanggan,
$data->alamat_pelanggan,
$data->total_nominal,
$data->jumlah_transaksi,
$data->created_at ? $data->created_at->toDateTimeString() : "-",
];
}
// dd($dataArray);
return Excel::download(new PelangganExport($dataArray), 'Laporan Data-Pelanggan.xlsx');
}
/**
* Show the form for creating a new resource.
*/
public function create(): Response
{
return response()->view("pelanggan.create");
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): RedirectResponse
{
try {
$request->validate([
'nama_pelanggan' => 'required',
'telp_pelanggan' => 'required|max:13|unique:pelanggans,telp_pelanggan',
'alamat_pelanggan' => 'required',
'kecamatan_pelanggan' => 'required',
], ['telp_pelanggan.unique' => 'Nomor telah terdaftar silahkan gunakan nomor yang lain!']);
Pelanggan::create([
"nama_pelanggan" => $request->nama_pelanggan,
"kecamatan_pelanggan" => $request->kecamatan_pelanggan,
"telp_pelanggan" => $request->telp_pelanggan,
"alamat_pelanggan" => $request->alamat_pelanggan,
"pengguna_id" => Auth::user()->id,
]);
return redirect(route("pelanggan.index"))->with('success', 'data berhasil disimpan');
} catch (\Throwable $th) {
return redirect()->route('pelanggan.index')->with('error', $th->getMessage());
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
$data = Pelanggan::with(['riwayat', 'penjualan.detail_penjualan', 'service' => function ($q) {
$q->where('status_transaksi', 'success')->with('detail','sparepart_luar');
}])->findOrFail($id);
return response()->view("pelanggan.info", compact("data"));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id): Response
{
$data = Pelanggan::find($id);
return response()->view("pelanggan.edit", compact("data"));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id): RedirectResponse
{
$data = Pelanggan::find($id);
DB::beginTransaction();
try {
$request->validate([
'nama_pelanggan' => 'required',
'telp_pelanggan' => 'required|max:13',
'alamat_pelanggan' => 'required',
'kecamatan_pelanggan' => 'required',
], ['telp_pelanggan.unique' => 'Nomor telah terdaftar silahkan gunakan nomor yang lain!']);
$data->update([
"nama_pelanggan" => $request->nama_pelanggan,
"kecamatan_pelanggan" => $request->kecamatan_pelanggan,
"telp_pelanggan" => $request->telp_pelanggan,
"alamat_pelanggan" => $request->alamat_pelanggan,
]);
DB::commit();
return redirect()->route("pelanggan.index")->with('success', 'data berhasil disimpan');
} catch (\Throwable $th) {
DB::rollBack();
return redirect()->route('pelanggan.index')->with('error', $th->getMessage());
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id): RedirectResponse
{
DB::beginTransaction();
try {
$data = Pelanggan::find($id);
$penjualan = Penjualan::where('pelanggan_id', $data->id);
$service = Service::where('pelanggan_id', $data->id);
$penjualan->delete();
$service->delete();
$data->delete();
DB::commit();
return redirect()->route('pelanggan.index')->with('success', 'Pelanggan berhasil dihapus');
} catch (\Throwable $th) {
DB::rollback();
return redirect()->route('pelanggan.index')->with('error', $th->getMessage());
}
}
public function getPelanggan(string $id)
{
$datas = Pelanggan::find($id);
return response()->json([
'data' => $datas,
]);
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]