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');
Log::info($no_pol);
// dd($transaksi)->status; if ($gateStatus == 0) {
// dd($transaksi->getData());
Log::info(get_class($transaksi)); $transaksiIn = $this->inTransaksi($no_pol);
dd(get_class($transaksi));
// if ($transaksi->status === true && $transaksi->member === false) { if ($transaksiIn) {
// } return $transaksiIn;
return; }
$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,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 DashboardController extends Controller class DashboardController extends Controller
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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,7 +51,7 @@ 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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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'
];
}
+3 -1
View File
@@ -11,7 +11,9 @@ 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 ()
{ {
+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'
];
}
+3 -3
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 posHardware() {
return $this->hasOne(ConfigHardware::class, 'id_pos', 'id');
}
public function posParams() { public function posParams() {
return $this->hasOne(ConfigPos::class, 'id_pos', 'id'); return $this->hasOne(ConfigPos::class, 'id_pos', 'id');
} }
public function posHardware() {
return $this->hasOne(ConfigHardware::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'
];
}
+84 -27
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,32 +56,48 @@ 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) {
@@ -79,8 +105,39 @@ public function calc ($transaksi, $times)
// } // }
// } // }
return [$duration, $parkingPrice];
}
public function parkingDailysCalc($vehicle, $times)
{
if ($times < 86400) {
$parkingPrice = $this->parkingTimeCalc($vehicle, $times);
return $parkingPrice; 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);
@@ -25,9 +25,10 @@
<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>
@@ -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
+2 -4
View File
@@ -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 -->
@@ -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"]);
}); });
+73 -70
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