Penambahan login cashier via API, perhitungan tarif

This commit is contained in:
2026-07-24 14:04:49 +07:00
parent 3ea7367255
commit 8bd2d0c542
63 changed files with 1979 additions and 309 deletions
@@ -0,0 +1,187 @@
<?php
namespace App\Http\Controllers\Api\V1\Cashier;
use App\Http\Controllers\Controller;
use App\Models\JenisMobil;
use App\Models\NamaPos;
use App\Models\Pegawai;
use App\Models\Softseting;
use App\Services\Parking\geTransaksi;
use App\Services\Parking\RateParkingService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use function GuzzleHttp\json_encode;
class CashierOperationController extends Controller
{
public function login(Request $request)
{
$username = $request->username;
$password = $request->password;
$gateStatus = $request->idpintu;
$user = Pegawai::where("username", $username)->where("password", $password)->first();
$gateId = NamaPos::with("posHardware", "posParams")->where("id", $gateStatus)->first();
if (!$gateId) {
return response()->json([
"status" => false,
"message" => "ID Pintu tidak ditemukan",
]);
}
$globalSetting = Softseting::first();
$shortcutVeh = explode(",", $gateId->posParams->kend_valid);
$kendValid = JenisMobil::whereIn("id", $shortcutVeh)->orderBy("id")->get();
if (!$user) {
return response()->json([
"status" => false,
"message" => "Username dan Password salah atau user tidak aktif",
]);
}
Log::info("Login user " . $user->nama . " berhasil.");
$fotoPegawai = $user->foto;
Log::info([
"type" => gettype($fotoPegawai),
"resource" => is_resource($fotoPegawai),
"length" => is_string($fotoPegawai) ? strlen($fotoPegawai) : null,
]);
if (is_resource($fotoPegawai)) {
// $pegawaiFilename = $user->username;
rewind($fotoPegawai);
$fotoPegawai = stream_get_contents($fotoPegawai);
} else {
$user->foto = url(Storage::url("images/pegawai/no-image.jpg"));
}
// $fotoPegawai = pg_unescape_bytea($fotoPegawai);
// $foto = stream_get_contents($fotoPegawai);
// file_put_contents(storage_path("app/debug_before.bin"), $foto);
// file_put_contents(
// storage_path("app/debug_after.bin"),
// pg_unescape_bytea($foto),
// );
// $raw = stream_get_contents($fotoPegawai);
// Log::info([
// "raw_size" => strlen($raw),
// ]);
// $binary = pg_unescape_bytea($raw);
// Log::info([
// "binary_size" => strlen($binary),
// ]);
// Log::info([
// "resource" => is_resource($fotoPegawai),
// "type" => gettype($fotoPegawai),
// "size" => is_string($fotoPegawai) ? strlen($fotoPegawai) : null,
// "hex" => bin2hex(substr($fotoPegawai, 0, 100)),
// "before" => bin2hex(substr($fotoPegawai, 0, 16)),
// // "after" => bin2hex(substr($decoded, 0, 16)),
// ]);
if (!empty($fotoPegawai)) {
$filename = "pegawai_" . $user->nomer . ".jpg";
$result = Storage::disk("public")->put("images/pegawai/" . $filename, $fotoPegawai);
Log::info(["save" => $result]);
$user->foto = url(Storage::url("images/pegawai/" . $filename));
}
// Log::info($user->toArray());
return response()->json([
"status" => true,
"message" => "Login berhasil",
"data" => [
"user" => $user,
"gate" => $gateId,
"settings" => $globalSetting,
"vehicleValid" => $kendValid,
],
]);
}
function checkMember(Request $request)
{
Log::info($request->input("transaksi"));
$getMember = new geTransaksi();
$data = $getMember->TransaksiMember($request->input("transaksi"));
if (!$data) {
return response()->json([
"success" => false,
"message" => "Transaksi member tidak ditemukan",
]);
}
return response()->json([
"success" => true,
"data" => $data,
]);
}
function transaksiInside(Request $request)
{
Log::info("Transaksi di input : " . $request->input("transaksi"));
$gateOut = $request->input("idpintu");
$vehicle = $request->input("kendaraan");
$licensePlate = $request->input("platNomer");
$gettransaksi = new geTransaksi();
$dateNow = Carbon::now()->format("Y-m-d HH:mm:ss");
Log::info("Kendaraan di pilih : " . $vehicle);
$Transaksi = $gettransaksi->TransaksiParkir($request->input("transaksi"));
if (!$Transaksi) {
Log::info("Transaksi tidak ditemukan : " . json_encode($Transaksi));
return response()->json([
"success" => false,
"message" => "Transaksi tidak ditemukan",
]);
}
Log::info("Transaksi ditemukan : " . json_encode($Transaksi));
$waktu_masuk = Str::of($Transaksi->waktu_masuk)->trim();
$timeInSecond = Carbon::parse($waktu_masuk);
$timeOutSecond = Carbon::now();
$duration = $timeInSecond->diffInSeconds($timeOutSecond);
$hitungTarif = new RateParkingService();
[$duration, $tarifParkir] = $hitungTarif->parkingTimeCalc($vehicle, $duration);
$Transaksi["waktu_keluar"] = $timeOutSecond->format("Y-m-d H:i:s");
$Transaksi["bayar_keluar"] = (int) $tarifParkir;
$Transaksi["id_pintu_keluar"] = $gateOut;
Log::info("jam masuk : " . $timeInSecond);
Log::info("jam keluar : " . $timeOutSecond);
Log::info("Lama parkir dalam detik : " . $duration);
Log::info("Tarif transaksi : " . $tarifParkir);
return response()->json([
"success" => true,
"data" => $Transaksi,
]);
}
// function transaksiProcess(Request $request)
}
@@ -0,0 +1,85 @@
<?php
namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ParkingOperationConteroller extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
@@ -2,8 +2,9 @@
namespace App\Http\Controllers\Api\V1; namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir; use App\Models\TransaksiParkir;
use App\Http\Controllers\Controller;
use App\Services\Parking\geTransaksiParkir;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -14,9 +15,60 @@ class ParkingOperationController extends Controller
* *
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function inTransaksi($data)
{
Log::info('Memulai proses pintu masuk : ' . $data);
$service = new geTransaksiParkir();
$data = $service->TransaksiParkir($data);
Log::info('Hasil : ' . $data);
if ($data) {
return response()->json([
'status' => true,
'message' => 'Kendaraan masih didalam',
'data' => $data
]);
}
$data = $service->TransaksiMember($data);
// if (!$data) {
// // store ke function/ insert ke database
// $memberActive = $service->TransaksiMember($data);
// // if (!$memberActive)
// }
return $data;
}
public function outTransaksi($data, geTransaksiParkir $TransaksiParkir)
{
$data = $TransaksiParkir->TransaksiParkir($data);
}
public function index() public function index()
{ {
return TransaksiParkir::selectRaw(
'transaksi_parkir.id::VARCHAR as id,
no_pol,
id_kendaraan,
id_pintu_masuk,
id_pintu_keluar,
waktu_masuk,
waktu_keluar,
bayar_keluar,
jm.nama',
)->leftJoin('jenis_mobil as jm','transaksi_parkir.id_kendaraan','=','jm.id')
// ->where('status', 1)
->orderByDesc('waktu_masuk')
->limit(50)->get();
} }
/** /**
@@ -37,15 +89,25 @@ public function create()
*/ */
public function store(Request $request) public function store(Request $request)
{ {
$transaksi = $this->show($request->input('transaksi'))->getData(); $gateStatus = $request->input('gate');
$no_pol = $request->input('transaksi');
// dd($transaksi)->status; Log::info($no_pol);
// dd($transaksi->getData());
Log::info(get_class($transaksi)); if ($gateStatus == 0) {
dd(get_class($transaksi));
// if ($transaksi->status === true && $transaksi->member === false) { $transaksiIn = $this->inTransaksi($no_pol);
// }
return; if ($transaksiIn) {
return $transaksiIn;
}
$transaksi = $this->store($no_pol);
}
// Log::info($data);
return response()->json([
// 'data' => $data
]);
} }
-13
View File
@@ -1,13 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class ApiV1MemberController extends Controller class ApiV1MemberController extends Controller
@@ -1,12 +1,13 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class DashboardController extends Controller class DashboardController extends Controller
{ {
public function index() public function index()
{ {
return view('dashboard'); return view('dashboard');
} }
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\FrontOffice; namespace App\Http\Controllers\Parking\FrontOffice;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir; use App\Models\TransaksiParkir;
@@ -24,7 +24,7 @@ public function search(Request $request)
{ {
// Log::info($request->all()); // Log::info($request->all());
$keyword = $request->q; $keyword = $request->q;
Log::info($keyword); Log::info($keyword);
if (!$keyword) { if (!$keyword) {
return response()->json([ return response()->json([
@@ -50,7 +50,7 @@ public function search(Request $request)
} }
// $pic_body_masuk = (string) $data->pic_body_masuk; // $pic_body_masuk = (string) $data->pic_body_masuk;
// $data->pic_body_masuk_base64 = $data->pic_body_masuk // $data->pic_body_masuk_base64 = $data->pic_body_masuk
// ? 'data:image/jpeg;base64,' . base64_encode($pic_body_masuk ) // ? 'data:image/jpeg;base64,' . base64_encode($pic_body_masuk )
// : null; // : null;
@@ -84,7 +84,7 @@ public function image($id)
// return response($picture->pic_body_masuk) // return response($picture->pic_body_masuk)
// ->header('Content-Type', 'image/jpeg'); // ->header('Content-Type', 'image/jpeg');
// ❌ kalau tidak ada data // ❌ kalau tidak ada data
if (!$picture || !$picture->pic_body_masuk) { if (!$picture || !$picture->pic_body_masuk) {
return response()->file(public_path('images/no-image.jpg')); return response()->file(public_path('images/no-image.jpg'));
@@ -92,7 +92,7 @@ public function image($id)
return response($picture->pic_body_masuk) return response($picture->pic_body_masuk)
->header('Content-Type', 'image/jpeg') ->header('Content-Type', 'image/jpeg')
->header('Cache-Control', 'public, max-age=86400'); // cache 1 hari ->header('Cache-Control', 'public, max-age=86400'); // cache 1 hari
} }
/** /**
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir; use App\Models\TransaksiParkir;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -36,7 +37,7 @@ public function index()
// $incidenTrans = $data->where('veri_check', 0)->whereDate('veri_date', $dateNow)->count(); // $incidenTrans = $data->where('veri_check', 0)->whereDate('veri_date', $dateNow)->count();
// $pendingTrans = $data->where('veri_check', 1)->whereDate('veri_date', $dateNow)->count(); // $pendingTrans = $data->where('veri_check', 1)->whereDate('veri_date', $dateNow)->count();
// $inSite = $data->where('status',1)->count(); // $inSite = $data->where('status',1)->count();
// dd($dateNow, $VeriTrans,$incidenTrans); // dd($dateNow, $VeriTrans,$incidenTrans);
return view('home', compact('VeriTrans','incidenTrans', 'pendingTrans','inSite')); return view('home', compact('VeriTrans','incidenTrans', 'pendingTrans','inSite'));
} }
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class LostiketController extends Controller class LostiketController extends Controller
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class MemberProduct extends Controller class MemberProduct extends Controller
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\ProdukPrice; use App\Models\ProdukPrice;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -15,7 +16,7 @@ class MemberProductController extends Controller
public function index() public function index()
{ {
$products = ProdukPrice::getProduct(); $products = ProdukPrice::getProduct();
return view('register', compact('products')); return view('register', compact('products'));
} }
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\MemberCard; use App\Models\MemberCard;
use App\Models\StikerTrans; use App\Models\StikerTrans;
use App\Models\StikerTransDetail; use App\Models\StikerTransDetail;
@@ -28,7 +29,7 @@ public function index(Request $request)
$departmentSelect = DB::table('stasiunkerja')->get(); $departmentSelect = DB::table('stasiunkerja')->get();
$memberSelect = DB::table('jenis_langganan')->get(); $memberSelect = DB::table('jenis_langganan')->get();
$jenisStiker = DB::table('tarif_stiker')->get(); $jenisStiker = DB::table('tarif_stiker')->get();
return view('member.member', compact([ return view('member.member', compact([
'vehicleSelect', 'vehicleSelect',
'departmentSelect', 'departmentSelect',
@@ -37,7 +38,7 @@ public function index(Request $request)
])); ]));
} }
public function getMember (Request $request) public function getMember (Request $request)
{ {
Log::info(json_encode('nopol : ' .$request->nopol)); Log::info(json_encode('nopol : ' .$request->nopol));
Log::info(json_encode('veh : ' .$request->vehicle)); Log::info(json_encode('veh : ' .$request->vehicle));
@@ -47,7 +48,7 @@ public function getMember (Request $request)
Log::info(json_encode('isactive : ' .gettype($request->isactive))); Log::info(json_encode('isactive : ' .gettype($request->isactive)));
if ($request->ajax() ) { if ($request->ajax() ) {
$dataStiker = DB::table('transaksi_stiker as ts') $dataStiker = DB::table('transaksi_stiker as ts')
->leftjoin('detail_transaksi_stiker as dts','dts.notrans','=','ts.notrans') ->leftjoin('detail_transaksi_stiker as dts','dts.notrans','=','ts.notrans')
->leftJoin('card_member as cm','cm.notrans','=','ts.no_id') ->leftJoin('card_member as cm','cm.notrans','=','ts.no_id')
@@ -55,12 +56,12 @@ public function getMember (Request $request)
->leftJoin('stasiunkerja as sk','sk.kode','=','ts.unit_kerja') ->leftJoin('stasiunkerja as sk','sk.kode','=','ts.unit_kerja')
->leftJoin('jenis_mobil as jm','jm.id','=','dts.jenis_mobil') ->leftJoin('jenis_mobil as jm','jm.id','=','dts.jenis_mobil')
->select(DB::raw(' ->select(DB::raw('
ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon, ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon,
ts.awal as awal , ts.akhir as akhir, jl.nama as jmember, sk.nama as dept, dts.nopol, ts.awal as awal , ts.akhir as akhir, jl.nama as jmember, sk.nama as dept, dts.nopol,
jm.nama vehicle, dts.jenis_member, cm.no_card as no_card')) jm.nama vehicle, dts.jenis_member, cm.no_card as no_card'))
->distinct(); ->distinct();
// ->select(DB::raw('ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon , ts.awal as awal , ts.akhir as akhir, sk.nama as unit_kerja, jl.nama as jenis_member, ts.no_id')) // ->select(DB::raw('ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon , ts.awal as awal , ts.akhir as akhir, sk.nama as unit_kerja, jl.nama as jenis_member, ts.no_id'))
if ($request->nama) { if ($request->nama) {
$dataStiker = $dataStiker->where('ts.nama', 'like', '%' . $request->nama . '%'); $dataStiker = $dataStiker->where('ts.nama', 'like', '%' . $request->nama . '%');
} }
@@ -72,15 +73,15 @@ public function getMember (Request $request)
if ($request->nopol) { if ($request->nopol) {
$dataStiker = $dataStiker->where('ts.unit_kerja', 'like', '%' . $request->depart . '%'); $dataStiker = $dataStiker->where('ts.unit_kerja', 'like', '%' . $request->depart . '%');
} }
if ($request->member) { if ($request->member) {
$dataStiker = $dataStiker->where('ts.jenis_langganan', 'like', '%' . $request->member . '%'); $dataStiker = $dataStiker->where('ts.jenis_langganan', 'like', '%' . $request->member . '%');
} }
if ($request->nopol) { if ($request->nopol) {
$dataStiker = $dataStiker->where('dts.nopol', 'like', '%' . $request->nopol . '%'); $dataStiker = $dataStiker->where('dts.nopol', 'like', '%' . $request->nopol . '%');
} }
if ($request->vehicle) { if ($request->vehicle) {
$dataStiker = $dataStiker->where('dts.jenis_mobil', 'like', '%' . $request->vehicle . '%'); $dataStiker = $dataStiker->where('dts.jenis_mobil', 'like', '%' . $request->vehicle . '%');
} }
@@ -94,7 +95,7 @@ public function getMember (Request $request)
} }
Log::info($dataStiker->toSql()); Log::info($dataStiker->toSql());
$dataStiker = $dataStiker->get(); $dataStiker = $dataStiker->get();
return response()->json($dataStiker); return response()->json($dataStiker);
@@ -126,7 +127,7 @@ public function checkField (Request $request)
'nopol' => 'required|string|unique:detail_transaksi_stiker,nopol', 'nopol' => 'required|string|unique:detail_transaksi_stiker,nopol',
// 'nocard' => 'string|exists:card_member,no_card', // 'nocard' => 'string|exists:card_member,no_card',
]); ]);
$nocard = $request->input('nocard'); $nocard = $request->input('nocard');
$nocardExists = DB::table('card_member') $nocardExists = DB::table('card_member')
->where('no_card', $nocard) ->where('no_card', $nocard)
@@ -188,14 +189,14 @@ public function store(Request $request)
'no_id' => $noid, 'no_id' => $noid,
'nama' => $dataStiker['nama'], 'nama' => $dataStiker['nama'],
'alamat' => $dataStiker['address'] ?? '', 'alamat' => $dataStiker['address'] ?? '',
'telepon' => $dataStiker['phone'] ?? '', 'telepon' => $dataStiker['phone'] ?? '',
'unit_kerja' => $dataStiker['depart'], 'unit_kerja' => $dataStiker['depart'],
'jenis_stiker' => $dataStiker['member'], 'jenis_stiker' => $dataStiker['member'],
'awal' => $awal, 'awal' => $awal,
'akhir' => $akhir, 'akhir' => $akhir,
'harga' => $dataStiker['harga'] ?? 0, 'harga' => $dataStiker['harga'] ?? 0,
'keterangan' => $dataStiker['note'] ?? '', 'keterangan' => $dataStiker['note'] ?? '',
'tanggal' => $dateNow, 'tanggal' => $dateNow,
'operator' => $user->nomer, 'operator' => $user->nomer,
]; ];
@@ -215,7 +216,7 @@ public function store(Request $request)
} else { } else {
return 0;; return 0;;
} }
if ($dataCard) { if ($dataCard) {
foreach ($dataCard as $cardNumber) { foreach ($dataCard as $cardNumber) {
$dataCard = [ $dataCard = [
@@ -238,7 +239,7 @@ public function store(Request $request)
$response = false; $response = false;
$msg = 'Gagal menyimpan data ' . $e->getMessage() . $e->getLine(); $msg = 'Gagal menyimpan data ' . $e->getMessage() . $e->getLine();
} }
return response()->json(['response' => $response, 'pesan' => $msg]); return response()->json(['response' => $response, 'pesan' => $msg]);
} }
@@ -252,7 +253,7 @@ public function show($id)
{ {
Log::info('Data yang diterima : ' . json_encode($id)); Log::info('Data yang diterima : ' . json_encode($id));
$dataStiker = StikerTrans::with('stiker_details.vehicle', 'memberCard') $dataStiker = StikerTrans::with('stiker_details.vehicle', 'memberCard')
->select('transaksi_stiker.notrans', 'transaksi_stiker.nama', 'transaksi_stiker.alamat', 'transaksi_stiker.telepon', 'transaksi_stiker.awal', 'transaksi_stiker.akhir', 'transaksi_stiker.jenis_langganan', ->select('transaksi_stiker.notrans', 'transaksi_stiker.nama', 'transaksi_stiker.alamat', 'transaksi_stiker.telepon', 'transaksi_stiker.awal', 'transaksi_stiker.akhir', 'transaksi_stiker.jenis_langganan',
'transaksi_stiker.unit_kerja', 'transaksi_stiker.no_id', 'jl.nama as jmember', 'sk.nama as dept') 'transaksi_stiker.unit_kerja', 'transaksi_stiker.no_id', 'jl.nama as jmember', 'sk.nama as dept')
->leftJoin('jenis_langganan as jl','jl.id','=','transaksi_stiker.jenis_langganan') ->leftJoin('jenis_langganan as jl','jl.id','=','transaksi_stiker.jenis_langganan')
->leftJoin('stasiunkerja as sk','sk.kode','=','transaksi_stiker.unit_kerja') ->leftJoin('stasiunkerja as sk','sk.kode','=','transaksi_stiker.unit_kerja')
@@ -265,8 +266,8 @@ public function show($id)
// ->leftJoin('jenis_mobil as jm','jm.id','=','dts.jenis_mobil') // ->leftJoin('jenis_mobil as jm','jm.id','=','dts.jenis_mobil')
// ->leftJoin('card_member as cm','cm.notrans','=','ts.no_id') // ->leftJoin('card_member as cm','cm.notrans','=','ts.no_id')
// ->select(DB::raw(' // ->select(DB::raw('
// ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon, // ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon,
// ts.awal as awal , ts.akhir as akhir, jl.nama as jmember, sk.nama as dept, dts.nopol, // ts.awal as awal , ts.akhir as akhir, jl.nama as jmember, sk.nama as dept, dts.nopol,
// jm.nama vehicle, dts.jenis_member, cm.no_card as no_card') // jm.nama vehicle, dts.jenis_member, cm.no_card as no_card')
// )->where('ts.notrans', 'like', '%' . $id . '%') // )->where('ts.notrans', 'like', '%' . $id . '%')
// ->get(); // ->get();
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Operasional; namespace App\Http\Controllers\Parking\Operasional;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Report; namespace App\Http\Controllers\Parking\Report;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -78,7 +78,7 @@ public function dataStiker(Request $request)
} }
} }
// public function laporanStikerHarian() // public function laporanStikerHarian()
// { // {
// $jenisLangganan = DB::table('jenis_langganan')->get(); // $jenisLangganan = DB::table('jenis_langganan')->get();
// $jenisStiker = DB::table('stasiunkerja')->get(); // $jenisStiker = DB::table('stasiunkerja')->get();
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir; use App\Models\TransaksiParkir;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -104,7 +105,7 @@ public function gateData(Request $request)
}; };
}) })
->when($paymentMethod, function ($q) use ($paymentMethod) { ->when($paymentMethod, function ($q) use ($paymentMethod) {
return $q->where('tp.rep_bank', $paymentMethod); return $q->where('tp.rep_bank', $paymentMethod);
@@ -141,7 +142,7 @@ public function gateData(Request $request)
->orderBy('jm.nama') ->orderBy('jm.nama')
->orderBy('tp.status_transaksi'); ->orderBy('tp.status_transaksi');
return response()->json([ return response()->json([
'byGateData' => $query->get() 'byGateData' => $query->get()
]); ]);
@@ -212,7 +213,7 @@ public function allReportData(Request $request)
'pk.nama as kasir_keluar', 'pk.nama as kasir_keluar',
'tp.id_op_masuk', 'tp.id_op_masuk',
'tp.waktu_masuk', 'tp.waktu_masuk',
'tp.waktu_keluar', 'tp.waktu_keluar',
'tp.status', 'tp.status',
@@ -261,7 +262,7 @@ public function allReportData(Request $request)
// $keluarCasual = $tunai->where('status_transaksi', '0'); // $keluarCasual = $tunai->where('status_transaksi', '0');
// $keluarMember = $tunai->where('status_transaksi', '3'); // $keluarMember = $tunai->where('status_transaksi', '3');
// $keluarLost = $tunai->where('status_transaksi', '32'); // $keluarLost = $tunai->where('status_transaksi', '32');
$keluarCasual = $tunai->filter(fn ($r) => $keluarCasual = $tunai->filter(fn ($r) =>
(string) data_get($r, 'status_transaksi') === '0' (string) data_get($r, 'status_transaksi') === '0'
&& data_get($r, 'id_op_masuk') !== null && data_get($r, 'id_op_masuk') !== null
); );
@@ -356,7 +357,7 @@ public function allReportData(Request $request)
// $keluarCasual = $nonTunai->where('status_transaksi', '0'); // $keluarCasual = $nonTunai->where('status_transaksi', '0');
// $keluarMember = $nonTunai->where('status_transaksi', '3'); // $keluarMember = $nonTunai->where('status_transaksi', '3');
// $keluarLost = $nonTunai->where('status_transaksi', '32'); // $keluarLost = $nonTunai->where('status_transaksi', '32');
$keluarCasual = $nonTunai->filter(fn ($r) => $keluarCasual = $nonTunai->filter(fn ($r) =>
(string) data_get($r, 'status_transaksi') === '0' (string) data_get($r, 'status_transaksi') === '0'
&& data_get($r, 'id_op_masuk') !== null && data_get($r, 'id_op_masuk') !== null
); );
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Http\Setup\Gate; namespace App\Http\Controllers\Parking\Setup\Gate;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\NamaPos; use App\Models\NamaPos;
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Http\Setup\Gate; namespace App\Http\Controllers\Parking\Setup\Gate;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\ConfigHardware; use App\Models\ConfigHardware;
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Http\Setup\Gate; namespace App\Http\Controllers\Parking\Setup\Gate;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers\Parking\Setup\UserLevel;
use App\Http\Controllers\Controller;
use App\Models\LevelPegawai;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class LevelUserController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$leveluser = Auth()->User()->level_pegawai;
Log::info((int) $leveluser);
$levelAvail = LevelPegawai::where("level_code", ">=", $leveluser)->orderBy("level_id")->get();
return view("setup.UserLevel.level-user", compact("levelAvail"));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Http\Setup\Vehicle; namespace App\Http\Controllers\Parking\Setup\Vehicle;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\VehicleItem; use App\Models\VehicleItem;
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Http\Setup\Vehicle; namespace App\Http\Controllers\Parking\Setup\Vehicle;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\MasterTarif; use App\Models\MasterTarif;
@@ -51,9 +51,9 @@ public function show($id)
{ {
// Log::info($id); // Log::info($id);
$id = str($id); $id = str($id);
$vehicleRates = DB::table('tarif')->where('id_mobil', $id)->first(); $vehicleRates = DB::table("tarif")->where("id_mobil", $id)->first();
Log::info(json_encode($vehicleRates)); Log::info(json_encode($vehicleRates));
return $vehicleRates; return $vehicleRates;
} }
@@ -77,44 +77,42 @@ public function edit($id)
*/ */
public function update(Request $request, $id) public function update(Request $request, $id)
{ {
// Log::info($request->all()); Log::info($request->all());
// $id = $request->id_mobil; // $id = $request->id_mobil;
$dataQuery = MasterTarif::find($id); $dataQuery = MasterTarif::find($id);
try { try {
Log::info($request->all()); Log::info($request->all());
$dataQuery->fill($request->all()); $dataQuery->fill($request->all());
if (! $dataQuery->isDirty()) { if (!$dataQuery->isDirty()) {
// if($dataQuery->isDirty()) {
return response()->json([ return response()->json([
'status' => false, "status" => false,
'message' => 'Tidak ada perubahan data' "message" => "Tidak ada perubahan data",
]); ]);
// }
} }
Log::info('Data yang di simpan' . json_encode($dataQuery->getDirty())); Log::info(
"Data yang di simpan" . json_encode($dataQuery->getDirty()),
);
$dataQuery->save(); $dataQuery->save();
return response()->json([ return response()->json([
'status' => true, "status" => true,
'message' => 'Data berhasil di ubah' "message" => "Data berhasil di ubah",
]); ]);
} catch (\Throwable $th) { } catch (\Throwable $th) {
//throw $th; Log::info(
Log::info('Data yang di simpan' . json_encode($dataQuery->getDirty())); "Data yang di simpan" . json_encode($dataQuery->getDirty()),
);
// Log::info($request->all()); // Log::info($request->all());
return response()->json([ return response()->json([
'status' => false, "status" => false,
'message' => 'Gagal menyimpan data ' . $th->getMessage(), "message" => "Gagal menyimpan data " . $th->getMessage(),
]); ]);
} }
} }
/** /**
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
@@ -40,7 +41,7 @@ public function run()
if (!$this->checkUsersView()) { if (!$this->checkUsersView()) {
DB::statement(" DB::statement("
CREATE OR REPLACE VIEW users AS CREATE OR REPLACE VIEW users AS
SELECT SELECT
id, id,
nomer, nomer,
nama, nama,
@@ -90,8 +91,8 @@ public function run()
private function checkPgcrypto() private function checkPgcrypto()
{ {
// $result = DB::select(" // $result = DB::select("
// SELECT 1 // SELECT 1
// FROM pg_extension // FROM pg_extension
// WHERE extname = 'pgcrypto' // WHERE extname = 'pgcrypto'
// "); // ");
@@ -117,8 +118,8 @@ private function checkPegawaiColumns()
private function checkUsersView() private function checkUsersView()
{ {
$result = DB::select(" $result = DB::select("
SELECT 1 SELECT 1
FROM information_schema.views FROM information_schema.views
WHERE table_name = 'users' WHERE table_name = 'users'
"); ");
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -19,7 +20,7 @@ public function index()
$departmentSelect = DB::table('stasiunkerja')->get(); $departmentSelect = DB::table('stasiunkerja')->get();
$memberSelect = DB::table('jenis_langganan')->get(); $memberSelect = DB::table('jenis_langganan')->get();
$jenisStiker = DB::table('tarif_stiker')->get(); $jenisStiker = DB::table('tarif_stiker')->get();
return view('stiker.stiker', compact([ return view('stiker.stiker', compact([
// return view('member.member', compact([ // return view('member.member', compact([
'vehicleSelect', 'vehicleSelect',
@@ -27,7 +28,7 @@ public function index()
'memberSelect', 'memberSelect',
'jenisStiker', 'jenisStiker',
])); ]));
} }
/** /**
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
@@ -21,7 +22,7 @@ public function index ()
return view('streaming', compact('urlStream')); return view('streaming', compact('urlStream'));
} }
public function streamSnapshot() public function streamSnapshot()
{ {
// Ambil URL kamera dan autentikasi // Ambil URL kamera dan autentikasi
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Tools; namespace App\Http\Controllers\Parking\Tools;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\TransaksiStiker; use App\Models\TransaksiStiker;
@@ -12,7 +12,7 @@
class StikerExtendedController extends Controller class StikerExtendedController extends Controller
{ {
// protected function ; // protected function ;
/** /**
* Display a listing of the resource. * Display a listing of the resource.
@@ -103,9 +103,9 @@ public function show($id, Request $request)
// ->whereRaw("to_char(tgl_edited, 'YYYY-MM') = ?", [$blnKemarin]) // ->whereRaw("to_char(tgl_edited, 'YYYY-MM') = ?", [$blnKemarin])
->whereBetween('tgl_edited', [$start, $end]) ->whereBetween('tgl_edited', [$start, $end])
->get(); ->get();
$jumlah = $count->count(); $jumlah = $count->count();
return response()->json([ return response()->json([
'jumlah' => $jumlah 'jumlah' => $jumlah
]); ]);
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Tools; namespace App\Http\Controllers\Parking\Tools;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -1,7 +1,8 @@
<?php <?php
namespace App\Http\Controllers; namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir; use App\Models\TransaksiParkir;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -19,7 +20,7 @@ class VerifyTransController extends Controller
* *
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function skipMember () public function skipMember ()
{ {
$transaksi = TransaksiParkir::leftjoin('jenis_mobil as jm','transaksi_parkir.id_kendaraan','=','jm.id') $transaksi = TransaksiParkir::leftjoin('jenis_mobil as jm','transaksi_parkir.id_kendaraan','=','jm.id')
->leftjoin('nama_pos as np_masuk', 'transaksi_parkir.id_pintu_masuk','=','np_masuk.id') ->leftjoin('nama_pos as np_masuk', 'transaksi_parkir.id_pintu_masuk','=','np_masuk.id')
@@ -41,7 +42,7 @@ public function skipMember ()
->get(); ->get();
Log::info(json_encode($transaksi)); Log::info(json_encode($transaksi));
if ($transaksi->status_transaksi && $transaksi->status_transaksi == 3) { if ($transaksi->status_transaksi && $transaksi->status_transaksi == 3) {
$dateNow = Carbon::now(); $dateNow = Carbon::now();
@@ -51,7 +52,7 @@ public function skipMember ()
'veri_date' => $dateNow, 'veri_date' => $dateNow,
'veri_adm' => 'SYSTEM' 'veri_adm' => 'SYSTEM'
]); ]);
// $response = true; // $response = true;
// $message = [ // $message = [
// 'no_pol' => $RealtimeTrans->no_pol, // 'no_pol' => $RealtimeTrans->no_pol,
@@ -61,7 +62,7 @@ public function skipMember ()
return $transaksi; return $transaksi;
} }
public function index(Request $request) public function index(Request $request)
{ {
if ($request->ajax()) { if ($request->ajax()) {
@@ -93,7 +94,7 @@ public function index(Request $request)
foreach ($transaksi as $data) { foreach ($transaksi as $data) {
if ($data->status_transaksi && $data->status_transaksi == '3') { if ($data->status_transaksi && $data->status_transaksi == '3') {
$dateNow = Carbon::now(); $dateNow = Carbon::now();
$query = DB::table('transaksi_parkir') $query = DB::table('transaksi_parkir')
->where('no_pol', $data->no_pol ) ->where('no_pol', $data->no_pol )
->where('status', 1) ->where('status', 1)
@@ -101,7 +102,7 @@ public function index(Request $request)
'veri_date' => $dateNow, 'veri_date' => $dateNow,
'veri_adm' => 'SYSTEM' 'veri_adm' => 'SYSTEM'
]); ]);
Log::info('Member update ' . $query); Log::info('Member update ' . $query);
// $response = true; // $response = true;
@@ -272,7 +273,7 @@ private function getCurlImage($url)
// Mengambil bagian 'user' dan 'pass' dari URL // Mengambil bagian 'user' dan 'pass' dari URL
$user = $parsedUrl['user'] ?? null; $user = $parsedUrl['user'] ?? null;
$pass = $parsedUrl['pass'] ?? null; $pass = $parsedUrl['pass'] ?? null;
$ch = curl_init(); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@@ -344,7 +345,7 @@ public function showImages(Request $request)
->select('video1_conn as body_cam','video2_conn as drive_cam') ->select('video1_conn as body_cam','video2_conn as drive_cam')
->where('id_pos', $transaksi->veri_kode) ->where('id_pos', $transaksi->veri_kode)
->first(); ->first();
Log::info(json_encode($getCamera)); Log::info(json_encode($getCamera));
// Log::info($getCamera); // Log::info($getCamera);
/* Body Masuk */ /* Body Masuk */
@@ -354,9 +355,9 @@ public function showImages(Request $request)
$transaksi->pic_body_masuk = 'Tidak ada foto'; $transaksi->pic_body_masuk = 'Tidak ada foto';
} }
$baseIn = $baseIn =
Log::info(json_encode('foto masuk' .$transaksi->pic_body_masuk)); Log::info(json_encode('foto masuk' .$transaksi->pic_body_masuk));
/* Driver Masuk */ /* Driver Masuk */
if (!empty($transaksi->pic_driver_masuk) && is_resource($transaksi->pic_driver_masuk)) { if (!empty($transaksi->pic_driver_masuk) && is_resource($transaksi->pic_driver_masuk)) {
$transaksi->pic_driver_masuk = base64_encode(stream_get_contents($transaksi->pic_driver_masuk)) ?? 'Tidak ada FOTO'; $transaksi->pic_driver_masuk = base64_encode(stream_get_contents($transaksi->pic_driver_masuk)) ?? 'Tidak ada FOTO';
@@ -373,7 +374,7 @@ public function showImages(Request $request)
// Log::info('Drive Cam URL: ' . $getCamera->drive_cam); // Log::info('Drive Cam URL: ' . $getCamera->drive_cam);
// $ImgBodyOut = $this->getCurlImage($getCamera->body_cam); // $ImgBodyOut = $this->getCurlImage($getCamera->body_cam);
// // try { // // try {
// $ImgBodyOut = Http::accept('image/jpeg') // $ImgBodyOut = Http::accept('image/jpeg')
// ->withOptions(['verify' => false,]) // ->withOptions(['verify' => false,])
// ->withHeaders(['Authorization' => 'Digest username="admin", realm="your_realm", nonce="nonce_value", response="response_hash"']) // ->withHeaders(['Authorization' => 'Digest username="admin", realm="your_realm", nonce="nonce_value", response="response_hash"'])
@@ -381,7 +382,7 @@ public function showImages(Request $request)
// if ($ImgBodyOut->successful()) { // if ($ImgBodyOut->successful()) {
// Konversi gambar ke base64 // Konversi gambar ke base64
// $ImgBodyOut = base64_encode($ImgBodyOut->body()); // $ImgBodyOut = base64_encode($ImgBodyOut->body());
// } else { // } else {
// Log::error('Failed to get image. Status code: ' . $ImgBodyOut->status()); // Log::error('Failed to get image. Status code: ' . $ImgBodyOut->status());
// return 'Tidak ada foto'; // return 'Tidak ada foto';
@@ -393,7 +394,7 @@ public function showImages(Request $request)
// 'error' => $e->getMessage(), // 'error' => $e->getMessage(),
// ], 500); // ], 500);
// } // }
// ])->get($getCamera->body_cam); // ])->get($getCamera->body_cam);
// ])->get('http://192.168.200.64/ISAPI/streaming/channels/1/picture&auth=digest&username=admin&password=rootjuga1'); // ])->get('http://192.168.200.64/ISAPI/streaming/channels/1/picture&auth=digest&username=admin&password=rootjuga1');
// $ImgDriveOut = $this->getCurlImage($getCamera->drive_cam); // $ImgDriveOut = $this->getCurlImage($getCamera->drive_cam);
@@ -412,7 +413,7 @@ public function showImages(Request $request)
Log::error('Error fetching data: ' . $e->getMessage()); Log::error('Error fetching data: ' . $e->getMessage());
return response()->json(['error' => 'Data not found or other error'], 500); return response()->json(['error' => 'Data not found or other error'], 500);
} }
} }
// $transaksi = TransaksiParkir::where('id', $request->id)->where('no_pol', $request->no_pol)->firstOrfail(); // $transaksi = TransaksiParkir::where('id', $request->id)->where('no_pol', $request->no_pol)->firstOrfail();
// // $pic_masuk = $transaksi->pic_body_masuk ? base64_encode(stream_get_contents($transaksi->pic_body_masuk)) : null; // // $pic_masuk = $transaksi->pic_body_masuk ? base64_encode(stream_get_contents($transaksi->pic_body_masuk)) : null;
@@ -434,7 +435,7 @@ public function showImages(Request $request)
// public function show($no_pol) // public function show($no_pol)
// { // {
// $transaksi = TransaksiParkir::where('no_pol', $no_pol)->orderBy('waktu_masuk','desc')->first(); // $transaksi = TransaksiParkir::where('no_pol', $no_pol)->orderBy('waktu_masuk','desc')->first();
// // if($transaksi->veri_kode) { // // if($transaksi->veri_kode) {
// // $paramsBodyKeluar = DB::table('config_pos_hardware')->select('video1_conn')->where('id_pos', $transaksi->veri_kode)->first(); // // $paramsBodyKeluar = DB::table('config_pos_hardware')->select('video1_conn')->where('id_pos', $transaksi->veri_kode)->first();
// // } // // }
@@ -0,0 +1,29 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CashierAuthentication
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$token = $request->header('X-Token');
if (!$token) {
return response()->json([
'status' => false,
'message' => 'Anda tidak berhasil login'
], 401);
}
return $next($request);
}
}
+22
View File
@@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class JenisMobil extends Model
{
use HasFactory;
protected $table = 'jenis_mobil';
protected $casts = [
'id' => 'string',
];
protected $fillable = [
'nama','short_cut'
];
}
+4 -2
View File
@@ -11,8 +11,10 @@ class LevelPegawai extends Model
protected $table = 'level_user'; protected $table = 'level_user';
protected $fillable = [ 'level_code', 'level_name' ]; protected $fillable = [
'level_code', 'level_name','create_by','create_date','update_date','update_by'
];
public function levelPegawai () public function levelPegawai ()
{ {
return $this->belongsTo(User::class, 'level_pegawai', 'level_code'); return $this->belongsTo(User::class, 'level_pegawai', 'level_code');
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Menu_Avail extends Model
{
use HasFactory;
protected $table = 'menu_avail';
protected $fillable = [
'menu_id','menu_name','path','created_by','created_at','updated_at','deleted_at'
];
}
+4 -4
View File
@@ -18,11 +18,11 @@ class NamaPos extends Model
'id','nama','jenis','tanggal','lokasi','grace_period','manless','area' 'id','nama','jenis','tanggal','lokasi','grace_period','manless','area'
]; ];
public function posParams() {
return $this->hasOne(ConfigPos::class, 'id_pos', 'id');
}
public function posHardware() { public function posHardware() {
return $this->hasOne(ConfigHardware::class, 'id_pos', 'id'); return $this->hasOne(ConfigHardware::class, 'id_pos', 'id');
} }
public function posParams() {
return $this->hasOne(ConfigPos::class, 'id_pos', 'id');
}
} }
+5 -4
View File
@@ -8,12 +8,13 @@
class TransaksiParkir extends Model class TransaksiParkir extends Model
{ {
// protected $connection = 'pgsql_second'; // protected $connection = 'pgsql_second';
// protected $casts = [ protected $casts = [
// 'id' => 'string', 'id' => 'string',
// ]; ];
// public $timestamps = false; public $timestamps = false;
use HasFactory; use HasFactory;
protected $table = 'transaksi_parkir'; protected $table = 'transaksi_parkir';
const updated_at = null; const updated_at = null;
const created_at = null; const created_at = null;
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class akseslevel extends Model
{
use HasFactory;
protected $table = 'akseslevel';
protected $fillable = [
'level_user','menu_id'
];
}
+96 -39
View File
@@ -5,39 +5,49 @@
use App\Models\MasterTarif; use App\Models\MasterTarif;
use App\Models\VehicleItem; use App\Models\VehicleItem;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use function GuzzleHttp\json_encode;
class RateParkingService class RateParkingService
{ {
public function calc ($transaksi, $times) public function parkingTimeCalc($vehicle, $times)
{ {
$duration = $times; ## Parse lama parkir berdasarkan detik $duration = $times; ## Parse lama parkir berdasarkan detik
$tarifVehicle = MasterTarif::find($transaksi); $tarifVehicle = MasterTarif::find($vehicle);
Log::info(json_encode($tarifVehicle));
$parkingPrice = 0; //Tarif pertama $parkingPrice = 0; //Tarif pertama
Log::info("\n" . '------------------======== Starting tarif Begin ==============----------------------'); Log::info("\n" . "------------------======== Starting tarif Begin ==============----------------------");
Log::info('Mulai perhitungan tarif dengan durasi : ' . $duration .' (Rp. '. $parkingPrice .')'); Log::info("Mulai perhitungan tarif dengan durasi : " . $duration . " (Rp. " . $parkingPrice . ")");
// Grace Periode // Grace Periode
if ($duration < $tarifVehicle->waktu_gratis) { // if ($duration < $tarifVehicle->waktu_gratis) {
Log::info('GP Rules : '); // Log::info("GP Rules : ");
return $parkingPrice; // return $parkingPrice;
} else if ( $tarifVehicle->waktu_gratis !== 0 && $tarifVehicle->tarif_periode !== 0) { // } elseif (
Log::info('GP Rules : '); // $tarifVehicle->waktu_gratis !== 0 &&
$parkingPrice = $parkingPrice + $tarifVehicle->tarif_period; // $tarifVehicle->tarif_periode !== 0
$duration = $duration - $tarifVehicle->waktu_gratis; // ) {
Log::info('Setelah GP : ' . $parkingPrice . ' Durasi parkir : ' . $duration); // Log::info("GP Rules : ");
} // $parkingPrice = $parkingPrice + $tarifVehicle->tarif_period;
// $duration = $duration - $tarifVehicle->waktu_gratis;
// Log::info(
// "Setelah GP : " .
// $parkingPrice .
// " Durasi parkir : " .
// $duration,
// );
// }
## Hitung Tarif pertama ## Hitung Tarif pertama
$firstPrice = 0; $firstPrice = 0;
$firstDuration = $tarifVehicle->frek_interval * ($tarifVehicle->interval * 60); $firstDuration = $tarifVehicle->frek_interval * ($tarifVehicle->interval * 60);
Log::info('Firstime rules : ' . $firstDuration); Log::info("Firstime rules : " . $firstDuration);
// if ($duration >= $firstDuration) { // if ($duration >= $firstDuration) {
do { do {
$duration -= ($tarifVehicle->interval * 60); $duration -= $tarifVehicle->interval * 60;
$parkingPrice += $tarifVehicle->tarif_interval; $parkingPrice += $tarifVehicle->tarif_interval;
$firstPrice++; $firstPrice++;
} while ($firstPrice < $tarifVehicle->frek_interval); } while ($firstPrice < $tarifVehicle->frek_interval);
Log::info('Tarif jam pertama : ' . $parkingPrice . ' Sisa durasi : ' . $duration); Log::info("Tarif jam pertama : " . $parkingPrice . " Sisa durasi : " . $duration);
// } // }
// Log::info($firstDuration); // Log::info($firstDuration);
@@ -46,41 +56,88 @@ public function calc ($transaksi, $times)
// Log::info($tarifVehicle->frek_waktu2 . ' - ' . $tarifVehicle->waktu2); // Log::info($tarifVehicle->frek_waktu2 . ' - ' . $tarifVehicle->waktu2);
$secondDuration = $tarifVehicle->frek_waktu2 * ($tarifVehicle->waktu2 * 60); $secondDuration = $tarifVehicle->frek_waktu2 * ($tarifVehicle->waktu2 * 60);
if ($duration >= $secondDuration) { if ($duration >= $secondDuration) {
Log::info(''); Log::info("");
Log::info('Secondtime rules : ' . $secondDuration); Log::info("Secondtime rules : " . $secondDuration);
Log::info($secondPrice);
do { do {
$duration -= ($tarifVehicle->waktu2 * 60); $duration -= $tarifVehicle->waktu2 * 60;
$parkingPrice += $tarifVehicle->tarif_interval; Log::info($parkingPrice);
Log::info($tarifVehicle->tarif);
$parkingPrice += $tarifVehicle->tarif;
$secondPrice++; $secondPrice++;
Log::info($secondPrice);
} while ($secondPrice < $tarifVehicle->frek_waktu2); } while ($secondPrice < $tarifVehicle->frek_waktu2);
Log::info('Tarif jam kedua : ' . $parkingPrice . ' Sisa durasi : ' . $duration); Log::info("Tarif jam kedua : " . $parkingPrice . " Sisa durasi : " . $duration);
} }
$nextDuration = 0; $nextDuration = 0;
$lastDuration = $tarifVehicle->waktu_tarif * 60; $lastDuration = $tarifVehicle->waktu_tarif * 60;
if ($duration <= $lastDuration && $duration > 0) { if ($lastDuration <= $duration) {
Log::info(''); Log::info("");
Log::info('Sisa Durasi ' . $duration); Log::info("Sisa Durasi " . $duration);
do { do {
$duration -= ($tarifVehicle->waktu_tarif * 60); $duration -= $tarifVehicle->waktu_tarif * 60;
$parkingPrice += $tarifVehicle->tarif; $parkingPrice += $tarifVehicle->tarif;
// $nextDuration++; // $nextDuration++;
} while ($duration > 0); } while ($duration > 0);
Log::info('Tarif jam berikutnya : ' . $parkingPrice . ' Sisa durasi : ' . $duration); Log::info("Tarif jam berikutnya : " . $parkingPrice . " Sisa durasi : " . $duration);
} }
Log::info('Tarif Parkir Anda : ' . $parkingPrice . ' Sisa durasi : ' . $duration); $tarifMaks = $tarifVehicle->maksimum;
if ($tarifMaks != 0) {
if ($parkingPrice > $tarifMaks) {
$parkingPrice = $tarifMaks;
}
}
Log::info(
"Tarif Parkir Anda : " .
// $parkingPrice .
" Sisa durasi : " .
$duration,
);
// if ($tarifVehicle->time_base_maks == 1) { // if ($tarifVehicle->time_base_maks == 1) {
// if ($parkingPrice > $tarifVehicle->maksimum) { // if ($parkingPrice > $tarifVehicle->maksimum) {
// $parkingPrice = $tarifVehicle->maksimum; // $parkingPrice = $tarifVehicle->maksimum;
// } // }
// } // }
return [$duration, $parkingPrice];
return $parkingPrice;
} }
}
public function parkingDailysCalc($vehicle, $times)
{
if ($times < 86400) {
$parkingPrice = $this->parkingTimeCalc($vehicle, $times);
return $parkingPrice;
}
$tarifVehicle = MasterTarif::find($vehicle);
$parkingPrice = 0;
Log::info("Parameter tarif : " . json_encode($tarifVehicle));
Log::info("Memulai hitung tarif : " . $parkingPrice);
Log::info("Base time : " . $times);
if ($tarifVehicle->time_base == 1) {
$durationDailys = $tarifVehicle->time_base_maks * 60 * 60;
Log::info("Waktu 1 hari : " . $durationDailys);
$parkingDuration = $times;
do {
$parkingDuration -= $durationDailys;
$parkingPrice += $tarifVehicle->maksimum;
} while ($parkingDuration >= 86400);
$result = $this->parkingTimeCalc($vehicle, $parkingDuration);
$parkingDuration = $result[0];
$parkingPrice = $result[1];
}
Log::info("Sisa waktu : " . $parkingDuration);
Log::info("Tarif nya jadi : " . $parkingPrice);
return [$parkingDuration, (int) $parkingPrice];
}
}
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace App\Services\Parking;
use App\Models\TransaksiParkir;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class geTransaksi
{
public function TransaksiParkir($idNopol)
{
Log::info("Mencari transaksi : " . $idNopol);
if (!$idNopol) {
return;
}
$getTransaksi = TransaksiParkir::selectRaw(
'transaksi_parkir.id::VARCHAR as id,
no_pol,
id_kendaraan,
id_pintu_masuk,
id_pintu_keluar,
waktu_masuk,
waktu_keluar,
bayar_keluar, jm.nama',
)
->leftJoin("jenis_mobil as jm", "transaksi_parkir.id_kendaraan", "=", "jm.id")
->where("no_pol", "LIKE", $idNopol . "%")
->where("status", 1)
->orderByDesc("waktu_masuk")
->first();
return $getTransaksi;
}
public function TransaksiMember($nopolCardNumber)
{
Log::info("Mencari transaksi member : " . $nopolCardNumber);
$getMember = DB::table("mergetransaksistikerdetail as mtsd")
// $getMember = DB::table("transaksi_stiker as ts")
// ->leftjoin("detail_transaksi_stiker as dts", "dts.notrans", "=", "ts.notrans")
// ->leftJoin("card_member as cm", "cm.notrans", "=", "ts.no_id")
// ->leftJoin("jenis_langganan as jl", "jl.id", "=", "ts.jenis_langganan")
// ->leftJoin("stasiunkerja as sk", "sk.kode", "=", "ts.unit_kerja")
// ->leftJoin("jenis_mobil as jm", "jm.id", "=", "dts.jenis_mobil")
->select(
DB::raw('
mtsd.notrans, nama , alamat as alamat , telepon as telepon,
awal , akhir as akhir, nopol, nama vehicle, mtsd.tanggal, cm.no_card as no_card'),
)
// ->distinct()
->leftJoin("card_member as cm", "cm.notrans", "=", "mtsd.no_id")
->where("nopol", $nopolCardNumber)
// ->whereRaw("now() between awal and akhir")
->orderByDesc("tanggal")
->first();
if (!$getMember) {
Log::info("Member aktif tidak ditemukan");
return null;
}
Log::info("Member ditemukan : " . json_encode($getMember));
return $getMember;
}
}
@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('menu_avail', function (Blueprint $table) {
$table->id();
$table->integer('menu_id');
$table->string('menu_name');
$table->string('path');
$table->integer('created_by');
$table->timestamps();
$table->timestamp('deleted_at');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('menu_avail');
}
};
@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('akses_level', function (Blueprint $table) {
$table->id();
$table->string('level_user');
$table->string('menu_id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('akses_level');
}
};
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class akses_level extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class akseslevel extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
+150
View File
@@ -0,0 +1,150 @@
<?php
namespace Database\Seeders;
use Carbon\Carbon;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class menu_avail_seeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('menu_avail')->delete();
DB::table('menu_avail')->insert([
[
'menu_id' => '4100',
'menu_name' => 'Setup',
'path' => '/setup/#',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4101',
'menu_name' => 'Setup Pintu/Pos',
'path' => '/setup/master/gate',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4102',
'menu_name' => 'Setup Kendaraan',
'path' => '/setup/master/vehicle',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4103',
'menu_name' => 'Master Shift',
'path' => '/setup/master/shift',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4111',
'menu_name' => 'Master Pegawai',
'path' => '/setup/master/pegawai',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4111',
'menu_name' => 'Master Level',
'path' => '/setup/master/level',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4121',
'menu_name' => 'Master Nama stiker',
'path' => '/setup/master/stiker',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4122',
'menu_name' => 'Master Tarif Stiker',
'path' => '/setup/master/stiker-price',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4123',
'menu_name' => 'Master Jenis Stiker',
'path' => '/setup/master/stiker-type',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4200',
'menu_name' => 'Operational',
'path' => '/transaksi/#',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4201',
'menu_name' => 'Transaksi Parkir',
'path' => '/transaksi/parkir',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4202',
'menu_name' => 'Transaksi Stiker',
'path' => '/transaksi/parkir',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4300',
'menu_name' => 'Laporan',
'path' => '/report/#',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4301',
'menu_name' => 'Per Pintu/Pos',
'path' => '/report/laporan-per-pintu',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4302',
'menu_name' => 'Per hari',
'path' => '/report/laporan-per-hari',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4303',
'menu_name' => 'Per Bank',
'path' => '/report/laporan-per-bank',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4304',
'menu_name' => 'Per Petugas',
'path' => '/report/laporan-per-petugas',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
[
'menu_id' => '4302',
'menu_name' => 'Per Kendaraan',
'path' => '/report/laporan-per-kendaraan',
'created_by' => '0000',
'created_at' => Carbon::now(),
],
]);
}
}
File diff suppressed because one or more lines are too long
-1
View File
@@ -94,7 +94,6 @@ $(document).ready(function () {
let vehicleRate = $('#show-tarif').serialize(); let vehicleRate = $('#show-tarif').serialize();
let id = $('#id_mobil').val(); let id = $('#id_mobil').val();
// let url = "{{ route('vehicle.update',':id') }}";
let url = $(this).data('url'); let url = $(this).data('url');
url = url.replace(':id', id); url = url.replace(':id', id);
console.log(url); console.log(url);
@@ -1,7 +1,7 @@
<div class="horizontal-menu"> <div class="horizontal-menu">
<nav class="navbar top-navbar"> <nav class="navbar top-navbar">
<button class="navbar-toggler d-lg-none" <button class="navbar-toggler d-lg-none"
type="button" type="button"
data-toggle="horizontal-menu-toggle"> data-toggle="horizontal-menu-toggle">
</button> </button>
</nav> </nav>
@@ -25,14 +25,15 @@
<ul> <ul>
<li class="nav-item"><a class="nav-link" href="/setup/master/gate">Master Pintu/Pos</a></li> <li class="nav-item"><a class="nav-link" href="/setup/master/gate">Master Pintu/Pos</a></li>
<li class="nav-item"><a class="nav-link" href="/setup/master/vehicle">Master Kendaraan</a></li> <li class="nav-item"><a class="nav-link" href="/setup/master/vehicle">Master Kendaraan</a></li>
<li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Tarif</a></li> <!--<li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Tarif</a></li>-->
<li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Shift</a></li> <li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Shift</a></li>
<hr> <hr>
<li class="nav-item"><a class="nav-link" href="/setup/master/level-user">Master Level Pengguna</a></li>
<li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Petugas/Pegawai</a></li> <li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Petugas/Pegawai</a></li>
<hr> <hr>
<li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Stiker</a></li> <li class="nav-item"><a class="nav-link" href="/transaksi/member">Master Stiker</a></li>
</ul> </ul>
</div> </div>
</li> </li>
@endif @endif
@if(app()->environment('local')) @if(app()->environment('local'))
@@ -48,7 +49,7 @@
<li class="nav-item"><a class="nav-link" href="/transaksi/stiker">Member / Stiker</a></li> <li class="nav-item"><a class="nav-link" href="/transaksi/stiker">Member / Stiker</a></li>
<li class="nav-item"><a class="nav-link" href="/transaksi/member">Member</a></li> <li class="nav-item"><a class="nav-link" href="/transaksi/member">Member</a></li>
</ul> </ul>
</div> </div>
</li> </li>
@endif @endif
<li class="nav-item"> <li class="nav-item">
@@ -161,7 +162,7 @@
<i class="mdi mdi-settings text-primary"></i> <i class="mdi mdi-settings text-primary"></i>
Settings Settings
</a> --}} </a> --}}
<form method="POST" action="{{ route('logout') }}"> <form method="POST" action="{{ route('logout') }}">
@csrf @csrf
<button type="submit" class="dropdown-item ai-icon"> <button type="submit" class="dropdown-item ai-icon">
@@ -191,4 +192,4 @@ class="text-danger"
</button> </button>
</div> </div>
</nav> </nav>
</div> </div>
@@ -0,0 +1,294 @@
@extends('layouts.master')
use Carbon\Carbon;
@section('styles')
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css">
<style>
.card-body label {
font-size: 13px;
color: #6c757d;
}
.card-body .form-control,
.card-body .form-select {
font-size: 14px;
}
#search-button {
font-weight: 600;
letter-spacing: .3px;
}
.table-garis, .garis {
border: 0.1px solid black; /* Sets a 1px solid black border */
border-collapse: collapse;
}
.text-label {
color: #000000;
}
/*
.table-selectable tbody tr {
cursor: pointer;
transition: 0.15s;
}
.table-selectable tbody tr:hover {
background-color: #f2f6ff;
}
.table-selectable tbody tr.selected {
background-color: #0d6efd !important;
color: #fff;
}
.table-selectable tbody tr.selected td {
color: #fff !important;
} */
</style>
@endsection
@section('content')
<!-- partial -->
<div class="container-fluid page-body-wrapper">
<div class="main-panel">
<div class="content-wrapper">
<div class="row">
<div class="col-2">
</div>
<div class="col-12 col-md-8 grid-margin justify-content-center stretch-card">
<div class="card">
<div class="card-body">
<h4 class="card-title">Daftar Pintu/Pos</h4>
<div class="table-responsive mb-2">
<table class="table table-bordered table-selectable" id="example" data-url="{{ route('getMember') }}">
<thead>
<tr>
<th class="p-3" width="3%">No.</th>
<th style="text-align: center;" width="10%">Level Code</th>
<th style="text-align: center;">Level Pengguna</th>
<!--<th style="text-align: center;">Dibuat Oleh</th>-->
<th style="text-align: center;">Tanggal Dibuat</th>
<th style="text-align: center;">Hak Akses</th>
</tr>
</thead>
<tbody>
@foreach ($levelAvail as $level)
<tr>
<td class="text-center">{{ $loop->iteration }}</td>
<td class="text-center" hidden>{{ $level->level_id }}</td>
<td class="text-center" width="7%">{{ $level->level_code }} </td>
<td>{{ $level->level_name }}</td>
<!--<td width="10%"></td>-->
<td class="text-center" width="10%">{{ \Carbon\Carbon::parse($level->create_date)->format('Y-m-d')}}</td>
<td class="text-center" width="12%">
<button type="button" class="bi bi-menu-app btn-xl parameter-button" data-bs-toggle="modal" title="Izin Akses" data-bs-target=".bd-ubah-modal-lg"></button>
<button type="button" class="bi bi-list hardware-button" data-bs-toggle="tooltip" title="Menu Akses" data-id="{{ $level->level_id }}" data-nama="{{ $level->level_name }}"></button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="d-flex justify-content-center align-items-center mt-2">
<div>
<button class="btn btn-primary btn-sm add-button" data-bs-toggle="modal" data-bs-target=".bd-example-modal-lg">Tambah</button>
<button class="btn btn-warning btn-sm edit-button" id="btnEdit" data-bs-toggle="modal" data-bs-target=".bd-ubah-modal-lg">Ubah</button>
<button class="btn btn-danger btn-sm" id="btnDelete">Hapus</button>
<button class="btn btn-danger btn-sm" id="btnDelete">Detail</button>
</div>
</div>
<!-- ADD MEMMBER MODAL -->
{{-- @include('stiker.tambah-stiker')
@include('stiker.ubah-stiker') --}}
<!-- END MEMMBER MODAL -->
</div>
</div>
</div>
<div class="col-2">
</div>
</div>
</div>
</div>
</div>
@endsection
@section('javascript')
<!--********* Scripts *********-->
<!-- Datatable -->
<!--********* Scripts *********-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.5/jquery.validate.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/metisMenu/3.0.7/metisMenu.min.js"></script>
<script src="{{asset ('vendor/moment/moment.min.js') }}"></script>
<script src="{{asset ('vendor/bootstrap-daterangepicker/daterangepicker.js') }}"></script>
<script src="{{asset ('vendor/bootstrap-select/dist/js/bootstrap-select.min.js') }}"></script>
<script src="{{asset ('vendor/sweetalert2/dist/sweetalert2.min.js') }}"></script>
<script src="{{asset ('js/custom.min.js') }}"></script>
<script src="{{asset ('js/dlabnav-init.js') }}"></script>
<script src="{{asset ('js/member/index.js') }}"></script>
<script src="{{asset ('js/member/member-register.js') }}"></script>
{{-- <script>
$(document).ready(function () {
$(document).on('click', '.hardware-button', function () {
let row = $(this).closest('tr');
// kalau sudah ada baris edit, hapus dulu
$('.edit-row').remove();
let id = $(this).data('id');
let nama = $(this).data('nama');
$.ajax({
url: "{{ route('hardware.show', '') }}/" + id,
type: 'GET',
success: function (r) {
console.log(r);
let colSpan = row.children('td').length;
// Field yang mau ditampilkan (pilih sendiri mau yang mana)
let fields = [
['printer1_avail', 'Printer Status'],
['printer1_conn', 'Printer Connection'],
['printer1_spd', 'Printer Speed/Baudrate'],
['video1_avail', 'Kamera Status'],
['video1_conn', 'Kamera URL/Path'],
['sound_avail', 'Sound Status'],
['bg_avail', 'BGate Status'],
['bg_conn', 'BGate Connection'],
['bank_reader_avail', 'Reader BANK Status'],
['bank_reader_comm', 'Reader BANK Connection'],
['bank_reader_key', 'Reader BANK Key/Parameter'],
];
let rows = '';
for (let i = 0; i < fields.length; i ++) {
let f1 = fields[i];
rows += `
<tr>
<td class="fw-semibold text-muted text-label"><strong>${f1[1]}</strong></td>
<td>
<span class="view-mode">${formatValue(f1[0], r[f1[0]])}</span>
<input type="text"
class="form-control form-control-sm edit-mode d-none"
data-key="${f1[0]}"
value="${r[f1[0]] ?? ''}">
</td>
</tr>
`;
}
let editHtml = `
<tr class="edit-row" data-id="${id}">
<td colspan="${colSpan}">
<div class="card shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center">
<strong>Hardware Configuration</strong>
<div>
<button class="btn btn-sm btn-primary btn-edit">Edit</button>
<button class="btn btn-sm btn-success btn-save d-none">Save</button>
<button class="btn btn-sm btn-secondary btn-cancel d-none">Cancel</button>
</div>
</div>
<div class="card-body p-2">
<table class="table table-bordered table-sm align-middle mb-0">
<thead class="table-light">
<tr>
<th width="15%">Setting</th>
<th width="85%">Value</th>
</tr>
</thead>
<tbody>
${rows}
</tbody>
</table>
</div>
</div>
</td>
</tr>
`;
row.after(editHtml);
},
error: function (xhr) {
console.error(xhr.responseText);
}
});
});
// MODE EDIT
$(document).on('click', '.btn-edit', function () {
$('.view-mode').addClass('d-none');
$('.edit-mode').removeClass('d-none');
$('.btn-edit').addClass('d-none');
$('.btn-save, .btn-cancel').removeClass('d-none');
});
// CANCEL
$(document).on('click', '.btn-cancel', function () {
$('.edit-mode').addClass('d-none');
$('.view-mode').removeClass('d-none');
$('.btn-save, .btn-cancel').addClass('d-none');
$('.btn-edit').removeClass('d-none');
});
// SAVE
$(document).on('click', '.btn-save', function () {
let dataToSend = {};
$('.edit-mode').each(function () {
let key = $(this).data('key');
dataToSend[key] = $(this).val();
});
console.log(dataToSend);
let gateId = $('.edit-row').data('id');
$.ajax({
url: "{{ route('hardware.update', '') }}/" + gateId,
type: "PUT",
data: {
_token: "{{ csrf_token() }}",
data: dataToSend
},
success: function () {
$('.edit-mode').each(function () {
let val = $(this).val();
$(this).siblings('.view-mode').text(val);
});
$('.btn-cancel').click();
alert('Berhasil disimpan 🔥');
}
});
});
function formatValue(key, value) {
// kalau field *_avail kita kasih badge
if (key.includes('_avail')) {
if (value == 1) {
return `<span class="badge rounded-pill bg-success px-3">ON</span>`;
} else {
return `<span class="badge rounded-pill bg-danger px-3">OFF</span>`;
}
}
// default
return value ?? '-';
}
});
</script> --}}
@endsection
+10 -12
View File
@@ -24,7 +24,7 @@
.text-label { .text-label {
color: #000000; color: #000000;
} }
/* /*
.table-selectable tbody tr { .table-selectable tbody tr {
cursor: pointer; cursor: pointer;
transition: 0.15s; transition: 0.15s;
@@ -76,10 +76,10 @@
$jenis = 'Masuk'; $jenis = 'Masuk';
} elseif ($pintu->jenis === 1) { } elseif ($pintu->jenis === 1) {
$jenis = 'Keluar'; $jenis = 'Keluar';
} }
$isManless = $pintu->manless === 1 $isManless = $pintu->manless === 1
? '<span class="d-inline-block rounded-circle bg-success" style="width:12px;height:12px;"></span>' ? '<span class="d-inline-block rounded-circle bg-success" style="width:12px;height:12px;"></span>'
: '<span class="d-inline-block rounded-circle bg-danger" style="width:12px;height:12px;"></span>'; : '<span class="d-inline-block rounded-circle bg-danger" style="width:12px;height:12px;"></span>';
@endphp @endphp
<tr> <tr>
@@ -95,11 +95,11 @@
default => '-' default => '-'
} }
}}</td> }}</td>
<td class="text-center" width="7%"><span class="d-inline-block rounded-circle <td class="text-center" width="7%"><span class="d-inline-block rounded-circle
{{ $pintu->grace_period === 1 ? 'bg-success' : 'bg-danger' }}" {{ $pintu->grace_period === 1 ? 'bg-success' : 'bg-danger' }}"
style="width:12px;height:12px;"> style="width:12px;height:12px;">
</span></td> </span></td>
<td class="text-center" width="7%"><span class="d-inline-block rounded-circle <td class="text-center" width="7%"><span class="d-inline-block rounded-circle
{{ $pintu->manless === 1 ? 'bg-success' : 'bg-danger' }}" {{ $pintu->manless === 1 ? 'bg-success' : 'bg-danger' }}"
style="width:12px;height:12px;"> style="width:12px;height:12px;">
</span> </span>
@@ -116,11 +116,9 @@
<div class="d-flex justify-content-center align-items-center mt-2"> <div class="d-flex justify-content-center align-items-center mt-2">
<div> <div>
<button class="btn btn-primary btn-sm add-button" data-bs-toggle="modal" data-bs-target=".bd-example-modal-lg">Tambah</button> <button class="btn btn-primary btn-sm add-button" data-bs-toggle="modal" data-bs-target=".bd-example-modal-lg">Tambah</button>
{{-- </div> <button class="btn btn-warning btn-sm edit-button" id="btnEdit" data-bs-toggle="modal" data-bs-target=".bd-ubah-modal-lg">Ubah</button>
<div id="rowActions" class="d-none"> --}}
<button class="btn btn-warning btn-sm edit-button" id="btnEdit" data-bs-toggle="modal" data-bs-target=".bd-ubah-modal-lg">Tambah</button>
<button class="btn btn-danger btn-sm" id="btnDelete">Hapus</button> <button class="btn btn-danger btn-sm" id="btnDelete">Hapus</button>
<button class="btn btn-info btn-sm" id="btnDetail">Detail</button> <button class="btn btn-danger btn-sm" id="btnDelete">Detail</button>
</div> </div>
</div> </div>
<!-- ADD MEMMBER MODAL --> <!-- ADD MEMMBER MODAL -->
@@ -241,7 +239,7 @@ class="form-control form-control-sm edit-mode d-none"
}, },
error: function (xhr) { error: function (xhr) {
console.error(xhr.responseText); console.error(xhr.responseText);
} }
}); });
}); });
@@ -316,4 +314,4 @@ function formatValue(key, value) {
}); });
</script> </script>
@endsection @endsection
@@ -15,6 +15,10 @@
color: #6c757d; color: #6c757d;
} }
input {
border: 2px solid #2251c7;
}
.card-body .form-control, .card-body .form-control,
.card-body .form-select { .card-body .form-select {
font-size: 14px; font-size: 14px;
@@ -36,24 +40,6 @@
.tes { .tes {
width: 100px; width: 100px;
} }
/*
.table-selectable tbody tr {
cursor: pointer;
transition: 0.15s;
}
.table-selectable tbody tr:hover {
background-color: #f2f6ff;
}
.table-selectable tbody tr.selected {
background-color: #0d6efd !important;
color: #fff;
}
.table-selectable tbody tr.selected td {
color: #fff !important;
} */
</style> </style>
@endsection @endsection
@@ -49,7 +49,7 @@
<label class="me-2 mb-0">Tarif</label> <label class="me-2 mb-0">Tarif</label>
<input type="number" class="form-control no-spinner" id="frek_interval" name="frek_interval" style="width:60px" value="1"> <input type="number" class="form-control no-spinner" id="frek_interval" name="frek_interval" style="width:60px" value="1">
<label class="me-2 ms-4 mb-0">X</label> <label class="me-2 ms-4 mb-0">X</label>
<input type="number me-6 ms-4" class="form-control no-spinner-time" id="interval" name="interval" style="width:65px" value="60"> <input type="number me-6 ms-4" class="form-control no-spinner-time" id="interval" name="interval" style="width:70px" value="60">
<label class="me-2 ms-4 mb-0">Menit Pertama adalah : </label> <label class="me-2 ms-4 mb-0">Menit Pertama adalah : </label>
<input type="number" class="form-control no-spinner" id="tarif_interval" name="tarif_interval" style="width:100px" value="0"> <input type="number" class="form-control no-spinner" id="tarif_interval" name="tarif_interval" style="width:100px" value="0">
</div> </div>
+32 -18
View File
@@ -1,5 +1,6 @@
<?php <?php
use App\Http\Controllers\Api\V1\Cashier\CashierOperationController;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\ConfigParameter; use App\Http\Controllers\Api\V1\ConfigParameter;
@@ -21,35 +22,48 @@
| |
*/ */
Route::middleware('auth:sanctum')->get('/user', function (Request $request) { Route::middleware("auth:sanctum")->get("/user", function (Request $request) {
return $request->user(); return $request->user();
}); });
Route::get('location', [ConfigParameter::class, 'index']); Route::get("location", [ConfigParameter::class, "index"]);
Route::prefix('v1')->group(function () { Route::prefix("v1")->group(function () {
Route::prefix('operation')->group(function () { Route::prefix("operation")->group(function () {
// Route::get('transaksiparkir/{id}', ParkingOperationController::class, 'inde'); // Route::get('transaksiparkir/{id}', ParkingOperationController::class, 'inde');
Route::resource('transaksiparkir', ParkingOperationController::class); Route::resource("parking", ParkingOperationController::class);
Route::prefix("cashier")->group(function () {
Route::post("login", [CashierOperationController::class, "login"]);
Route::post("getmember", [
CashierOperationController::class,
"checkMember",
]);
Route::post("transaksinside", [
CashierOperationController::class,
"transaksiInside",
]);
// Route::middleware('CashierAuthentication')->group(function () {
// });
});
}); });
}); });
Route::prefix('transaksi')->group(function () { Route::prefix("transaksi")->group(function () {
Route::get('stiker/telusuri', [TransaksiMember::class, 'status']); Route::get("stiker/telusuri", [TransaksiMember::class, "status"]);
Route::resource('stiker', TransaksiMember::class); Route::resource("stiker", TransaksiMember::class);
Route::resource('parkir', TransaksiParkir::class); Route::resource("parkir", TransaksiParkir::class);
}); });
Route::resource('member', MemberinController::class)->names('memberin'); Route::resource("member", MemberinController::class)->names("memberin");
Route::prefix('report')->group(function () { Route::prefix("report")->group(function () {
Route::post('harian', [LaporanController::class, 'harian']); Route::post("harian", [LaporanController::class, "harian"]);
Route::post('payment', [LaporanController::class, 'payment']); Route::post("payment", [LaporanController::class, "payment"]);
Route::post('operator', [LaporanController::class, 'operator']); Route::post("operator", [LaporanController::class, "operator"]);
Route::post('gate', [LaporanController::class, 'gate']); Route::post("gate", [LaporanController::class, "gate"]);
Route::post('daily', [LaporanController::class, 'daily']); Route::post("daily", [LaporanController::class, "daily"]);
}); });
Route::prefix('display')->group(function () { Route::prefix("display")->group(function () {
Route::get('content', [DisplayContentController::class, 'index']); Route::get("content", [DisplayContentController::class, "index"]);
}); });
+74 -71
View File
@@ -1,28 +1,32 @@
<?php <?php
use App\Http\Controllers\Apps\Memberin\SelfMemberinController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
// ParkingAccess
use App\Http\Controllers\Parking\DashboardController;
use App\Http\Controllers\Parking\Setup\Gate\MasterGateController;
use App\Http\Controllers\Parking\Setup\Gate\MasterGateHardwareController;
use App\Http\Controllers\Parking\Setup\Gate\MasterGateParameterController;
use App\Http\Controllers\Parking\Setup\Vehicle\MasterVehicleController;
use App\Http\Controllers\Parking\Setup\Vehicle\ModifiedVehiclepriceController;
use App\Http\Controllers\Parking\Setup\UserLevel\LevelUserController;
use App\Http\Controllers\Parking\LostiketController;
use App\Http\Controllers\Parking\MemberProductController;
use App\Http\Controllers\Parking\MemberStikerController;
use App\Http\Controllers\Parking\Operasional\TransaksiParkirController;
use App\Http\Controllers\Parking\Report\LaporanStiker;
use App\Http\Controllers\Parking\ReportTransaksiController;
use App\Http\Controllers\Parking\SetupController;
use App\Http\Controllers\Parking\StikerController;
use App\Http\Controllers\Parking\StreamerController;
use App\Http\Controllers\Parking\FrontOffice\FrontOfficeController;
use App\Http\Controllers\Parking\Tools\StikerExtendedController;
use App\Http\Controllers\Parking\Tools\TransactionChangeController;
use App\Http\Controllers\Parking\VerifyTransController;
use App\Http\Controllers\Apps\ModifiedTransaksi; use App\Http\Controllers\Apps\ModifiedTransaksi;
use App\Http\Controllers\DashboardController; use App\Http\Controllers\Apps\Memberin\SelfMemberinController;
use App\Http\Controllers\Http\Setup\Gate\MasterGateController;
use App\Http\Controllers\Http\Setup\Gate\MasterGateHardwareController;
use App\Http\Controllers\Http\Setup\Gate\MasterGateParameterController;
use App\Http\Controllers\LostiketController;
use App\Http\Controllers\MemberProductController;
use App\Http\Controllers\MemberStikerController;
use App\Http\Controllers\Operasional\TransaksiParkirController;
use App\Http\Controllers\Report\LaporanStiker;
use App\Http\Controllers\ReportTransaksiController;
use App\Http\Controllers\SetupController;
use App\Http\Controllers\StikerController;
use App\Http\Controllers\StreamerController;
use App\Http\Controllers\FrontOffice\FrontOfficeController;
use App\Http\Controllers\Http\Setup\Vehicle\MasterVehicleController;
use App\Http\Controllers\Http\Setup\Vehicle\ModifiedVehiclepriceController;
use App\Http\Controllers\Tools\StikerExtendedController;
use App\Http\Controllers\Tools\TransactionChangeController;
use App\Http\Controllers\VerifyTransController;
// use App\Services\BcaSignatureTest; // use App\Services\BcaSignatureTest;
@@ -41,71 +45,70 @@
// return view('backend'); // return view('backend');
// }); // });
Route::get("/", [SetupController::class, "index"]);
Route::post("/setup/run", [SetupController::class, "run"])->name("setup.run");
Route::resource("/apps", ModifiedTransaksi::class);
Route::post("/scan", [ModifiedTransaksi::class, "scan"])->name("apps.scan");
Route::get('/', [SetupController::class, 'index']); Route::resource("memberin", SelfMemberinController::class)->names("self-memberin");
Route::post('/setup/run', [SetupController::class, 'run'])->name('setup.run');
Route::resource('/apps', ModifiedTransaksi::class);
Route::post('/scan', [ModifiedTransaksi::class, 'scan'])->name('apps.scan');
Route::resource('memberin', SelfMemberinController::class)->names('self-memberin');
Auth::routes(); Auth::routes();
Route::group(['middleware' => 'auth'], function () { Route::group(["middleware" => "auth"], function () {
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); Route::get("/dashboard", [DashboardController::class, "index"])->name("dashboard");
Route::prefix('/setup')->group(function () { Route::prefix("/setup")->group(function () {
Route::prefix('master')->group(function () { Route::prefix("master")->group(function () {
Route::resource('gate', MasterGateController::class); Route::resource("gate", MasterGateController::class);
Route::resource('gate-details', MasterGateParameterController::class); Route::resource("gate-details", MasterGateParameterController::class);
Route::resource('gate-hardware', MasterGateHardwareController::class)->names('hardware'); Route::resource("gate-hardware", MasterGateHardwareController::class)->names("hardware");
Route::resource('vehicle', MasterVehicleController::class); Route::resource("vehicle", MasterVehicleController::class);
Route::resource('price', ModifiedVehiclepriceController::class)->names('vehicle'); Route::resource("price", ModifiedVehiclepriceController::class)->names("vehiclePrice");
Route::resource("level-user", LevelUserController::class)->names("levelUser");
}); });
}); });
Route::prefix('/transaksi')->group(function () { Route::prefix("/transaksi")->group(function () {
Route::resource('parkir', TransaksiParkirController::class)->names('transaksiparkir'); Route::resource("parkir", TransaksiParkirController::class)->names("transaksiparkir");
Route::get('stiker', [StikerController::class, 'index']); Route::get("stiker", [StikerController::class, "index"]);
Route::resource('member', MemberStikerController::class); Route::resource("member", MemberStikerController::class);
}); });
Route::prefix('report')->group(function () { Route::prefix("report")->group(function () {
Route::get('/laporan-semua-transaksi', [ReportTransaksiController::class, 'allReport']); Route::get("/laporan-semua-transaksi", [ReportTransaksiController::class, "allReport"]);
Route::get('/laporan-semua-transaksi/data', [ReportTransaksiController::class, 'allReportData'])->name('getData'); Route::get("/laporan-semua-transaksi/data", [ReportTransaksiController::class, "allReportData"])->name(
Route::get('/laporan-per-pintu', [ReportTransaksiController::class, 'byGate']); "getData",
Route::get('/laporan-per-pintu/data', [ReportTransaksiController::class, 'gateData'])->name('gateData'); );
Route::get("/laporan-per-pintu", [ReportTransaksiController::class, "byGate"]);
Route::get("/laporan-per-pintu/data", [ReportTransaksiController::class, "gateData"])->name("gateData");
Route::prefix('stiker')->group(function () { Route::prefix("stiker")->group(function () {
Route::get('/harian', [LaporanStiker::class, 'laporanStikerHarian']); Route::get("/harian", [LaporanStiker::class, "laporanStikerHarian"]);
Route::get('/harian/data', [LaporanStiker::class, 'dataStiker'])->name('stikerData'); Route::get("/harian/data", [LaporanStiker::class, "dataStiker"])->name("stikerData");
}); });
});
Route::prefix("/tools")->group(function () {
Route::resource("stiker-extend", StikerExtendedController::class);
Route::resource("change-trans", TransactionChangeController::class);
});
}); Route::prefix("/front-office")->group(function () {
Route::prefix('/tools')->group(function () { Route::get("/check-in-out/search", [FrontOfficeController::class, "search"])->name("check-in-out.search");
Route::resource('stiker-extend', StikerExtendedController::class); Route::get("/check-in-out/image/{id}", [FrontOfficeController::class, "image"]);
Route::resource('change-trans', TransactionChangeController::class); Route::resource("check-in-out", FrontOfficeController::class);
});
Route::prefix('/front-office')->group(function () {
Route::get('/check-in-out/search', [FrontOfficeController::class, 'search'])->name('check-in-out.search');
Route::get('/check-in-out/image/{id}', [FrontOfficeController::class, 'image']);
Route::resource('check-in-out', FrontOfficeController::class);
}); });
// Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); // Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::resource('verify', VerifyTransController::class); Route::resource("verify", VerifyTransController::class);
Route::post('/verify/show', [VerifyTransController::class, 'showImages']); Route::post("/verify/show", [VerifyTransController::class, "showImages"]);
Route::resource('losttiket', LostiketController::class); Route::resource("losttiket", LostiketController::class);
Route::post('member/data', [MemberStikerController::class, 'getMember'])->name('getMember'); Route::post("member/data", [MemberStikerController::class, "getMember"])->name("getMember");
Route::post('member/checkField', [MemberStikerController::class, 'checkField']); Route::post("member/checkField", [MemberStikerController::class, "checkField"]);
Route::resource('settings', LostiketController::class); Route::resource("settings", LostiketController::class);
Route::resource('settings-register', MemberProductController::class); Route::resource("settings-register", MemberProductController::class);
Route::get('streaming', [StreamerController::class, 'index']); Route::get("streaming", [StreamerController::class, "index"]);
Route::get('stream-snapshot', [StreamerController::class, 'streamSnapshot']); Route::get("stream-snapshot", [StreamerController::class, "streamSnapshot"]);
}); });
Route::get("phpinformation", function () {
Route::get('phpinformation', function () { phpinfo();
phpinfo(); })->name("phpmyinfo");
})->name('phpmyinfo');
-3
View File
@@ -1,3 +0,0 @@
*
!public/
!.gitignore
-2
View File
@@ -1,2 +0,0 @@
*
!.gitignore
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB