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;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir;
use App\Http\Controllers\Controller;
use App\Services\Parking\geTransaksiParkir;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
@@ -14,9 +15,60 @@ class ParkingOperationController extends Controller
*
* @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()
{
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)
{
$transaksi = $this->show($request->input('transaksi'))->getData();
// dd($transaksi)->status;
// dd($transaksi->getData());
Log::info(get_class($transaksi));
dd(get_class($transaksi));
// if ($transaksi->status === true && $transaksi->member === false) {
// }
return;
$gateStatus = $request->input('gate');
$no_pol = $request->input('transaksi');
Log::info($no_pol);
if ($gateStatus == 0) {
$transaksiIn = $this->inTransaksi($no_pol);
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
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class ApiV1MemberController extends Controller
@@ -1,12 +1,13 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function index()
public function index()
{
return view('dashboard');
}
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\FrontOffice;
namespace App\Http\Controllers\Parking\FrontOffice;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir;
@@ -24,7 +24,7 @@ public function search(Request $request)
{
// Log::info($request->all());
$keyword = $request->q;
Log::info($keyword);
Log::info($keyword);
if (!$keyword) {
return response()->json([
@@ -50,7 +50,7 @@ public function search(Request $request)
}
// $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 )
// : null;
@@ -84,7 +84,7 @@ public function image($id)
// return response($picture->pic_body_masuk)
// ->header('Content-Type', 'image/jpeg');
// ❌ kalau tidak ada data
if (!$picture || !$picture->pic_body_masuk) {
return response()->file(public_path('images/no-image.jpg'));
@@ -92,7 +92,7 @@ public function image($id)
return response($picture->pic_body_masuk)
->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
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir;
use Carbon\Carbon;
use Illuminate\Http\Request;
@@ -36,7 +37,7 @@ public function index()
// $incidenTrans = $data->where('veri_check', 0)->whereDate('veri_date', $dateNow)->count();
// $pendingTrans = $data->where('veri_check', 1)->whereDate('veri_date', $dateNow)->count();
// $inSite = $data->where('status',1)->count();
// dd($dateNow, $VeriTrans,$incidenTrans);
return view('home', compact('VeriTrans','incidenTrans', 'pendingTrans','inSite'));
}
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class LostiketController extends Controller
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class MemberProduct extends Controller
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\ProdukPrice;
use Illuminate\Http\Request;
@@ -15,7 +16,7 @@ class MemberProductController extends Controller
public function index()
{
$products = ProdukPrice::getProduct();
return view('register', compact('products'));
}
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\MemberCard;
use App\Models\StikerTrans;
use App\Models\StikerTransDetail;
@@ -28,7 +29,7 @@ public function index(Request $request)
$departmentSelect = DB::table('stasiunkerja')->get();
$memberSelect = DB::table('jenis_langganan')->get();
$jenisStiker = DB::table('tarif_stiker')->get();
return view('member.member', compact([
'vehicleSelect',
'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('veh : ' .$request->vehicle));
@@ -47,7 +48,7 @@ public function getMember (Request $request)
Log::info(json_encode('isactive : ' .gettype($request->isactive)));
if ($request->ajax() ) {
$dataStiker = 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')
@@ -55,12 +56,12 @@ public function getMember (Request $request)
->leftJoin('stasiunkerja as sk','sk.kode','=','ts.unit_kerja')
->leftJoin('jenis_mobil as jm','jm.id','=','dts.jenis_mobil')
->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, jl.nama as jmember, sk.nama as dept, dts.nopol,
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,
jm.nama vehicle, dts.jenis_member, cm.no_card as no_card'))
->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'))
if ($request->nama) {
$dataStiker = $dataStiker->where('ts.nama', 'like', '%' . $request->nama . '%');
}
@@ -72,15 +73,15 @@ public function getMember (Request $request)
if ($request->nopol) {
$dataStiker = $dataStiker->where('ts.unit_kerja', 'like', '%' . $request->depart . '%');
}
if ($request->member) {
$dataStiker = $dataStiker->where('ts.jenis_langganan', 'like', '%' . $request->member . '%');
}
if ($request->nopol) {
$dataStiker = $dataStiker->where('dts.nopol', 'like', '%' . $request->nopol . '%');
}
if ($request->vehicle) {
$dataStiker = $dataStiker->where('dts.jenis_mobil', 'like', '%' . $request->vehicle . '%');
}
@@ -94,7 +95,7 @@ public function getMember (Request $request)
}
Log::info($dataStiker->toSql());
$dataStiker = $dataStiker->get();
return response()->json($dataStiker);
@@ -126,7 +127,7 @@ public function checkField (Request $request)
'nopol' => 'required|string|unique:detail_transaksi_stiker,nopol',
// 'nocard' => 'string|exists:card_member,no_card',
]);
$nocard = $request->input('nocard');
$nocardExists = DB::table('card_member')
->where('no_card', $nocard)
@@ -188,14 +189,14 @@ public function store(Request $request)
'no_id' => $noid,
'nama' => $dataStiker['nama'],
'alamat' => $dataStiker['address'] ?? '',
'telepon' => $dataStiker['phone'] ?? '',
'unit_kerja' => $dataStiker['depart'],
'jenis_stiker' => $dataStiker['member'],
'awal' => $awal,
'telepon' => $dataStiker['phone'] ?? '',
'unit_kerja' => $dataStiker['depart'],
'jenis_stiker' => $dataStiker['member'],
'awal' => $awal,
'akhir' => $akhir,
'harga' => $dataStiker['harga'] ?? 0,
'keterangan' => $dataStiker['note'] ?? '',
'tanggal' => $dateNow,
'harga' => $dataStiker['harga'] ?? 0,
'keterangan' => $dataStiker['note'] ?? '',
'tanggal' => $dateNow,
'operator' => $user->nomer,
];
@@ -215,7 +216,7 @@ public function store(Request $request)
} else {
return 0;;
}
if ($dataCard) {
foreach ($dataCard as $cardNumber) {
$dataCard = [
@@ -238,7 +239,7 @@ public function store(Request $request)
$response = false;
$msg = 'Gagal menyimpan data ' . $e->getMessage() . $e->getLine();
}
return response()->json(['response' => $response, 'pesan' => $msg]);
}
@@ -252,7 +253,7 @@ public function show($id)
{
Log::info('Data yang diterima : ' . json_encode($id));
$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')
->leftJoin('jenis_langganan as jl','jl.id','=','transaksi_stiker.jenis_langganan')
->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('card_member as cm','cm.notrans','=','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, jl.nama as jmember, sk.nama as dept, dts.nopol,
// 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,
// jm.nama vehicle, dts.jenis_member, cm.no_card as no_card')
// )->where('ts.notrans', 'like', '%' . $id . '%')
// ->get();
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Operasional;
namespace App\Http\Controllers\Parking\Operasional;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Report;
namespace App\Http\Controllers\Parking\Report;
use App\Http\Controllers\Controller;
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();
// $jenisStiker = DB::table('stasiunkerja')->get();
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir;
use Carbon\Carbon;
use Illuminate\Http\Request;
@@ -104,7 +105,7 @@ public function gateData(Request $request)
};
})
->when($paymentMethod, function ($q) use ($paymentMethod) {
return $q->where('tp.rep_bank', $paymentMethod);
@@ -141,7 +142,7 @@ public function gateData(Request $request)
->orderBy('jm.nama')
->orderBy('tp.status_transaksi');
return response()->json([
'byGateData' => $query->get()
]);
@@ -212,7 +213,7 @@ public function allReportData(Request $request)
'pk.nama as kasir_keluar',
'tp.id_op_masuk',
'tp.waktu_masuk',
'tp.waktu_keluar',
'tp.status',
@@ -261,7 +262,7 @@ public function allReportData(Request $request)
// $keluarCasual = $tunai->where('status_transaksi', '0');
// $keluarMember = $tunai->where('status_transaksi', '3');
// $keluarLost = $tunai->where('status_transaksi', '32');
$keluarCasual = $tunai->filter(fn ($r) =>
$keluarCasual = $tunai->filter(fn ($r) =>
(string) data_get($r, 'status_transaksi') === '0'
&& data_get($r, 'id_op_masuk') !== null
);
@@ -356,7 +357,7 @@ public function allReportData(Request $request)
// $keluarCasual = $nonTunai->where('status_transaksi', '0');
// $keluarMember = $nonTunai->where('status_transaksi', '3');
// $keluarLost = $nonTunai->where('status_transaksi', '32');
$keluarCasual = $nonTunai->filter(fn ($r) =>
$keluarCasual = $nonTunai->filter(fn ($r) =>
(string) data_get($r, 'status_transaksi') === '0'
&& data_get($r, 'id_op_masuk') !== null
);
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Http\Setup\Gate;
namespace App\Http\Controllers\Parking\Setup\Gate;
use App\Http\Controllers\Controller;
use App\Models\NamaPos;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Http\Setup\Gate;
namespace App\Http\Controllers\Parking\Setup\Gate;
use App\Http\Controllers\Controller;
use App\Models\ConfigHardware;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Http\Setup\Gate;
namespace App\Http\Controllers\Parking\Setup\Gate;
use App\Http\Controllers\Controller;
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
namespace App\Http\Controllers\Http\Setup\Vehicle;
namespace App\Http\Controllers\Parking\Setup\Vehicle;
use App\Http\Controllers\Controller;
use App\Models\VehicleItem;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Http\Setup\Vehicle;
namespace App\Http\Controllers\Parking\Setup\Vehicle;
use App\Http\Controllers\Controller;
use App\Models\MasterTarif;
@@ -51,9 +51,9 @@ public function show($id)
{
// Log::info($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;
}
@@ -77,44 +77,42 @@ public function edit($id)
*/
public function update(Request $request, $id)
{
// Log::info($request->all());
Log::info($request->all());
// $id = $request->id_mobil;
$dataQuery = MasterTarif::find($id);
try {
Log::info($request->all());
$dataQuery->fill($request->all());
if (! $dataQuery->isDirty()) {
// if($dataQuery->isDirty()) {
if (!$dataQuery->isDirty()) {
return response()->json([
'status' => false,
'message' => 'Tidak ada perubahan data'
"status" => false,
"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();
return response()->json([
'status' => true,
'message' => 'Data berhasil di ubah'
"status" => true,
"message" => "Data berhasil di ubah",
]);
} catch (\Throwable $th) {
//throw $th;
Log::info('Data yang di simpan' . json_encode($dataQuery->getDirty()));
Log::info(
"Data yang di simpan" . json_encode($dataQuery->getDirty()),
);
// Log::info($request->all());
return response()->json([
'status' => false,
'message' => 'Gagal menyimpan data ' . $th->getMessage(),
"status" => false,
"message" => "Gagal menyimpan data " . $th->getMessage(),
]);
}
}
/**
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
@@ -40,7 +41,7 @@ public function run()
if (!$this->checkUsersView()) {
DB::statement("
CREATE OR REPLACE VIEW users AS
SELECT
SELECT
id,
nomer,
nama,
@@ -90,8 +91,8 @@ public function run()
private function checkPgcrypto()
{
// $result = DB::select("
// SELECT 1
// FROM pg_extension
// SELECT 1
// FROM pg_extension
// WHERE extname = 'pgcrypto'
// ");
@@ -117,8 +118,8 @@ private function checkPegawaiColumns()
private function checkUsersView()
{
$result = DB::select("
SELECT 1
FROM information_schema.views
SELECT 1
FROM information_schema.views
WHERE table_name = 'users'
");
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
@@ -19,7 +20,7 @@ public function index()
$departmentSelect = DB::table('stasiunkerja')->get();
$memberSelect = DB::table('jenis_langganan')->get();
$jenisStiker = DB::table('tarif_stiker')->get();
return view('stiker.stiker', compact([
// return view('member.member', compact([
'vehicleSelect',
@@ -27,7 +28,7 @@ public function index()
'memberSelect',
'jenisStiker',
]));
}
/**
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
@@ -21,7 +22,7 @@ public function index ()
return view('streaming', compact('urlStream'));
}
public function streamSnapshot()
{
// Ambil URL kamera dan autentikasi
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Tools;
namespace App\Http\Controllers\Parking\Tools;
use App\Http\Controllers\Controller;
use App\Models\TransaksiStiker;
@@ -12,7 +12,7 @@
class StikerExtendedController extends Controller
{
// protected function ;
/**
* Display a listing of the resource.
@@ -103,9 +103,9 @@ public function show($id, Request $request)
// ->whereRaw("to_char(tgl_edited, 'YYYY-MM') = ?", [$blnKemarin])
->whereBetween('tgl_edited', [$start, $end])
->get();
$jumlah = $count->count();
return response()->json([
'jumlah' => $jumlah
]);
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Tools;
namespace App\Http\Controllers\Parking\Tools;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Parking;
use App\Http\Controllers\Controller;
use App\Models\TransaksiParkir;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@@ -19,7 +20,7 @@ class VerifyTransController extends Controller
*
* @return \Illuminate\Http\Response
*/
public function skipMember ()
public function skipMember ()
{
$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')
@@ -41,7 +42,7 @@ public function skipMember ()
->get();
Log::info(json_encode($transaksi));
if ($transaksi->status_transaksi && $transaksi->status_transaksi == 3) {
$dateNow = Carbon::now();
@@ -51,7 +52,7 @@ public function skipMember ()
'veri_date' => $dateNow,
'veri_adm' => 'SYSTEM'
]);
// $response = true;
// $message = [
// 'no_pol' => $RealtimeTrans->no_pol,
@@ -61,7 +62,7 @@ public function skipMember ()
return $transaksi;
}
public function index(Request $request)
{
if ($request->ajax()) {
@@ -93,7 +94,7 @@ public function index(Request $request)
foreach ($transaksi as $data) {
if ($data->status_transaksi && $data->status_transaksi == '3') {
$dateNow = Carbon::now();
$query = DB::table('transaksi_parkir')
->where('no_pol', $data->no_pol )
->where('status', 1)
@@ -101,7 +102,7 @@ public function index(Request $request)
'veri_date' => $dateNow,
'veri_adm' => 'SYSTEM'
]);
Log::info('Member update ' . $query);
// $response = true;
@@ -272,7 +273,7 @@ private function getCurlImage($url)
// Mengambil bagian 'user' dan 'pass' dari URL
$user = $parsedUrl['user'] ?? null;
$pass = $parsedUrl['pass'] ?? null;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
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')
->where('id_pos', $transaksi->veri_kode)
->first();
Log::info(json_encode($getCamera));
// Log::info($getCamera);
/* Body Masuk */
@@ -354,9 +355,9 @@ public function showImages(Request $request)
$transaksi->pic_body_masuk = 'Tidak ada foto';
}
$baseIn =
$baseIn =
Log::info(json_encode('foto masuk' .$transaksi->pic_body_masuk));
/* 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';
@@ -373,7 +374,7 @@ public function showImages(Request $request)
// Log::info('Drive Cam URL: ' . $getCamera->drive_cam);
// $ImgBodyOut = $this->getCurlImage($getCamera->body_cam);
// // try {
// // try {
// $ImgBodyOut = Http::accept('image/jpeg')
// ->withOptions(['verify' => false,])
// ->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()) {
// Konversi gambar ke base64
// $ImgBodyOut = base64_encode($ImgBodyOut->body());
// $ImgBodyOut = base64_encode($ImgBodyOut->body());
// } else {
// Log::error('Failed to get image. Status code: ' . $ImgBodyOut->status());
// return 'Tidak ada foto';
@@ -393,7 +394,7 @@ public function showImages(Request $request)
// 'error' => $e->getMessage(),
// ], 500);
// }
// ])->get($getCamera->body_cam);
// ])->get('http://192.168.200.64/ISAPI/streaming/channels/1/picture&auth=digest&username=admin&password=rootjuga1');
// $ImgDriveOut = $this->getCurlImage($getCamera->drive_cam);
@@ -412,7 +413,7 @@ public function showImages(Request $request)
Log::error('Error fetching data: ' . $e->getMessage());
return response()->json(['error' => 'Data not found or other error'], 500);
}
}
}
// $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;
@@ -434,7 +435,7 @@ public function showImages(Request $request)
// public function show($no_pol)
// {
// $transaksi = TransaksiParkir::where('no_pol', $no_pol)->orderBy('waktu_masuk','desc')->first();
// // if($transaksi->veri_kode) {
// // $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 $fillable = [ 'level_code', 'level_name' ];
protected $fillable = [
'level_code', 'level_name','create_by','create_date','update_date','update_by'
];
public function levelPegawai ()
{
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'
];
public function posParams() {
return $this->hasOne(ConfigPos::class, 'id_pos', 'id');
}
public function posHardware() {
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
{
// protected $connection = 'pgsql_second';
// protected $casts = [
// 'id' => 'string',
// ];
// public $timestamps = false;
protected $casts = [
'id' => 'string',
];
public $timestamps = false;
use HasFactory;
protected $table = 'transaksi_parkir';
const updated_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\VehicleItem;
use Illuminate\Support\Facades\Log;
use function GuzzleHttp\json_encode;
class RateParkingService
{
public function calc ($transaksi, $times)
public function parkingTimeCalc($vehicle, $times)
{
$duration = $times; ## Parse lama parkir berdasarkan detik
$tarifVehicle = MasterTarif::find($transaksi);
$tarifVehicle = MasterTarif::find($vehicle);
Log::info(json_encode($tarifVehicle));
$parkingPrice = 0; //Tarif pertama
Log::info("\n" . '------------------======== Starting tarif Begin ==============----------------------');
Log::info('Mulai perhitungan tarif dengan durasi : ' . $duration .' (Rp. '. $parkingPrice .')');
Log::info("\n" . "------------------======== Starting tarif Begin ==============----------------------");
Log::info("Mulai perhitungan tarif dengan durasi : " . $duration . " (Rp. " . $parkingPrice . ")");
// Grace Periode
if ($duration < $tarifVehicle->waktu_gratis) {
Log::info('GP Rules : ');
return $parkingPrice;
} else if ( $tarifVehicle->waktu_gratis !== 0 && $tarifVehicle->tarif_periode !== 0) {
Log::info('GP Rules : ');
$parkingPrice = $parkingPrice + $tarifVehicle->tarif_period;
$duration = $duration - $tarifVehicle->waktu_gratis;
Log::info('Setelah GP : ' . $parkingPrice . ' Durasi parkir : ' . $duration);
}
// if ($duration < $tarifVehicle->waktu_gratis) {
// Log::info("GP Rules : ");
// return $parkingPrice;
// } elseif (
// $tarifVehicle->waktu_gratis !== 0 &&
// $tarifVehicle->tarif_periode !== 0
// ) {
// 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
$firstPrice = 0;
$firstDuration = $tarifVehicle->frek_interval * ($tarifVehicle->interval * 60);
Log::info('Firstime rules : ' . $firstDuration);
Log::info("Firstime rules : " . $firstDuration);
// if ($duration >= $firstDuration) {
do {
$duration -= ($tarifVehicle->interval * 60);
$parkingPrice += $tarifVehicle->tarif_interval;
$firstPrice++;
} while ($firstPrice < $tarifVehicle->frek_interval);
Log::info('Tarif jam pertama : ' . $parkingPrice . ' Sisa durasi : ' . $duration);
do {
$duration -= $tarifVehicle->interval * 60;
$parkingPrice += $tarifVehicle->tarif_interval;
$firstPrice++;
} while ($firstPrice < $tarifVehicle->frek_interval);
Log::info("Tarif jam pertama : " . $parkingPrice . " Sisa durasi : " . $duration);
// }
// Log::info($firstDuration);
@@ -46,41 +56,88 @@ public function calc ($transaksi, $times)
// Log::info($tarifVehicle->frek_waktu2 . ' - ' . $tarifVehicle->waktu2);
$secondDuration = $tarifVehicle->frek_waktu2 * ($tarifVehicle->waktu2 * 60);
if ($duration >= $secondDuration) {
Log::info('');
Log::info('Secondtime rules : ' . $secondDuration);
Log::info("");
Log::info("Secondtime rules : " . $secondDuration);
Log::info($secondPrice);
do {
$duration -= ($tarifVehicle->waktu2 * 60);
$parkingPrice += $tarifVehicle->tarif_interval;
$duration -= $tarifVehicle->waktu2 * 60;
Log::info($parkingPrice);
Log::info($tarifVehicle->tarif);
$parkingPrice += $tarifVehicle->tarif;
$secondPrice++;
Log::info($secondPrice);
} 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;
$lastDuration = $tarifVehicle->waktu_tarif * 60;
if ($duration <= $lastDuration && $duration > 0) {
Log::info('');
Log::info('Sisa Durasi ' . $duration);
if ($lastDuration <= $duration) {
Log::info("");
Log::info("Sisa Durasi " . $duration);
do {
$duration -= ($tarifVehicle->waktu_tarif * 60);
$duration -= $tarifVehicle->waktu_tarif * 60;
$parkingPrice += $tarifVehicle->tarif;
// $nextDuration++;
} 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 ($parkingPrice > $tarifVehicle->maksimum) {
// $parkingPrice = $tarifVehicle->maksimum;
// }
// }
// }
return $parkingPrice;
return [$duration, $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;
}
}