From 120c32f7817d400400643d747099dc4a96678073 Mon Sep 17 00:00:00 2001 From: ISMAIL MASSERAN Date: Tue, 8 Sep 2026 14:48:18 +0800 Subject: [PATCH] DONE: feature flags by branches --- REMARK.md | 27 ------ .../Controllers/AdminFeatureController.php | 69 +++++++++++++++ app/Http/Controllers/GadaianController.php | 14 +++ .../PembiayaanOnlineController.php | 50 ++++++++--- resources/views/admin/features.blade.php | 88 +++++++++++++++++++ resources/views/gadaian/v2/index.blade.php | 4 +- resources/views/homepage/admin/home.blade.php | 1 + .../views/homepage/khazanah/home.blade.php | 2 + routes/web.php | 2 + 9 files changed, 217 insertions(+), 40 deletions(-) delete mode 100644 REMARK.md create mode 100644 app/Http/Controllers/AdminFeatureController.php create mode 100644 resources/views/admin/features.blade.php diff --git a/REMARK.md b/REMARK.md deleted file mode 100644 index a80c8c59..00000000 --- a/REMARK.md +++ /dev/null @@ -1,27 +0,0 @@ -## CAWANGAN XTRA - X0301 -- WAN NUR FATIN NATASYA BINTI W M AZHARI - PENILAI -- MOHAMAD KHAIRULNIZAN BIN JUSOF - TELLER -- MOHAMAD AZUHAIDIE BIN AHMAD - PPC -- WAN NURUL AMIRA BINTI WAN HARON - PC - -## Akaun -- admin@test.com -- admin2@test.com - -Module Gadai Online: -- Langkah 1 -- Langkah 2 -[x] PC akan tekan submit, then customer akan masuk ke senarai online mengikut batch -[x] PC boleh semak list customer yang pilih gadai online -- Langkah 3 (Operasi) -[x] dapat dalam bentuk list -[x] Apa jadi kalau operasi reject? - patah balik ke pc, untuk pc buat semakan balik -- Langkah 4 -- Langkah 5 -- Langkah 6 -- Langkah 7 -[x] Macam mana PC nak tahu pembayaran berjaya (Tally PAID page) -[x] Kalau online, dia kena upload kat mana (Operasi: PAID + bukti) -- Langkah 8 -[x] PC semak senarai pelanggan gadai tu tally atau tak -[ ] PC tekan butang blast ke (tanda selesai ada; WhatsApp/SMS belum wire) \ No newline at end of file diff --git a/app/Http/Controllers/AdminFeatureController.php b/app/Http/Controllers/AdminFeatureController.php new file mode 100644 index 00000000..aa72a39d --- /dev/null +++ b/app/Http/Controllers/AdminFeatureController.php @@ -0,0 +1,69 @@ +middleware(['auth', 'admin']); + } + + protected function api() + { + return Http::withOptions(['verify' => config('app.api_verify')]); + } + + public function index() + { + $api_url = config('api.url'); + + $metaRes = $this->api()->get($api_url . '/api/features'); + $meta = $metaRes->successful() ? $metaRes->json() : []; + $keys = is_array($meta) && !empty($meta['keys']) ? $meta['keys'] : ['pembiayaan_online']; + $labels = is_array($meta) && !empty($meta['labels']) ? $meta['labels'] : [ + 'pembiayaan_online' => 'Pembiayaan Online', + ]; + + $listRes = $this->api()->get($api_url . '/api/features/cawangan'); + $cawangan = ($listRes->successful() && is_array($listRes->json())) ? $listRes->json() : []; + + if (!$listRes->successful()) { + session()->now('error', 'Gagal muat senarai ciri cawangan.'); + } + + return view('admin.features', compact('api_url', 'keys', 'labels', 'cawangan')); + } + + public function update(Request $request) + { + $kodcaw = trim((string) $request->input('kodcaw', '')); + $feature = trim((string) $request->input('feature', '')); + $enabled = (int) $request->input('enabled') ? 1 : 0; + + if ($kodcaw === '' || $feature === '') { + return redirect()->route('admin.features')->with('error', 'Kod cawangan dan ciri diperlukan.'); + } + + $res = $this->api() + ->put(config('api.url') . '/api/features/' . $kodcaw . '/' . $feature, [ + 'enabled' => $enabled, + ]); + + if (!$res->successful()) { + $body = $res->json(); + $msg = is_array($body) && isset($body['message']) + ? $body['message'] + : 'Gagal kemaskini ciri cawangan.'; + return redirect()->route('admin.features')->with('error', $msg); + } + + $label = $enabled ? 'diaktifkan' : 'dinyahaktifkan'; + return redirect() + ->route('admin.features') + ->with('message', $feature . ' ' . $label . ' untuk ' . $kodcaw . '.'); + } +} diff --git a/app/Http/Controllers/GadaianController.php b/app/Http/Controllers/GadaianController.php index 2ac08566..a656d422 100644 --- a/app/Http/Controllers/GadaianController.php +++ b/app/Http/Controllers/GadaianController.php @@ -32,6 +32,16 @@ class GadaianController extends Controller $this->AliranTunaiController = new AliranTunaiController(); } + protected function isPembiayaanOnlineEnabled($kodcaw) + { + $cawangan_info = Http::withOptions(['verify' => config('app.api_verify')]) + ->get(config('api.url') . '/api/cawangan/' . $kodcaw) + ->json(); + $features = is_array($cawangan_info) ? ($cawangan_info['features'] ?? []) : []; + + return !empty($features['pembiayaan_online']); + } + public function index(Request $request) { @@ -219,6 +229,10 @@ class GadaianController extends Controller $caraTerima = 'TUNAI'; } + if ($caraTerima === 'ONLINE' && !$this->isPembiayaanOnlineEnabled($auth_user['cawangan'])) { + $caraTerima = 'TUNAI'; + } + if ($caraTerima === 'ONLINE') { $online = Http::withOptions(['verify' => config('app.api_verify')]) ->asForm() diff --git a/app/Http/Controllers/PembiayaanOnlineController.php b/app/Http/Controllers/PembiayaanOnlineController.php index 93b24e24..9dfee280 100644 --- a/app/Http/Controllers/PembiayaanOnlineController.php +++ b/app/Http/Controllers/PembiayaanOnlineController.php @@ -24,6 +24,30 @@ class PembiayaanOnlineController extends Controller return Auth::user()->cawangan; } + protected function cawanganInfo() + { + return $this->api() + ->get(config('api.url') . '/api/cawangan/' . $this->kodcaw()) + ->json(); + } + + protected function isPembiayaanOnlineEnabled($cawangan_info = null) + { + if (!is_array($cawangan_info)) { + $cawangan_info = $this->cawanganInfo(); + } + $features = $cawangan_info['features'] ?? []; + + return !empty($features['pembiayaan_online']); + } + + protected function abortUnlessPembiayaanOnline($cawangan_info = null) + { + if (!$this->isPembiayaanOnlineEnabled($cawangan_info)) { + abort(403, 'Pembiayaan online tidak diaktifkan untuk cawangan ini.'); + } + } + /** * PC senarai queue + batch history. */ @@ -33,9 +57,8 @@ class PembiayaanOnlineController extends Controller $kodcaw = $this->kodcaw(); $api_url = config('api.url'); - $cawangan_info = $this->api() - ->get($api_url . '/api/cawangan/' . $kodcaw) - ->json(); + $cawangan_info = $this->cawanganInfo(); + $this->abortUnlessPembiayaanOnline($cawangan_info); $queue = $this->api() ->get($api_url . '/api/pembiayaan-online/' . $kodcaw . '/queue') @@ -79,6 +102,7 @@ class PembiayaanOnlineController extends Controller */ public function updateLine(Request $request, $id) { + $this->abortUnlessPembiayaanOnline(); $kodcaw = $this->kodcaw(); $api_url = config('api.url'); @@ -109,6 +133,7 @@ class PembiayaanOnlineController extends Controller */ public function submitBatch(Request $request) { + $this->abortUnlessPembiayaanOnline(); $kodcaw = $this->kodcaw(); $api_url = config('api.url'); $auth_user = Auth::user(); @@ -150,9 +175,8 @@ class PembiayaanOnlineController extends Controller $kodcaw = $this->kodcaw(); $api_url = config('api.url'); - $cawangan_info = $this->api() - ->get($api_url . '/api/cawangan/' . $kodcaw) - ->json(); + $cawangan_info = $this->cawanganInfo(); + $this->abortUnlessPembiayaanOnline($cawangan_info); $detail = $this->api() ->get($api_url . '/api/pembiayaan-online/' . $kodcaw . '/batches/' . $batchId) @@ -181,9 +205,8 @@ class PembiayaanOnlineController extends Controller $api_url = config('api.url'); $blastFilter = $request->input('blast_sent', '0'); - $cawangan_info = $this->api() - ->get($api_url . '/api/cawangan/' . $kodcaw) - ->json(); + $cawangan_info = $this->cawanganInfo(); + $this->abortUnlessPembiayaanOnline($cawangan_info); $query = []; if ($blastFilter !== 'all' && $blastFilter !== '') { @@ -219,6 +242,7 @@ class PembiayaanOnlineController extends Controller */ public function viewBukti($id) { + $this->abortUnlessPembiayaanOnline(); $kodcaw = $this->kodcaw(); $res = $this->api() ->get(config('api.url') . '/api/pembiayaan-online/' . $kodcaw . '/lines/' . $id . '/bukti'); @@ -258,6 +282,7 @@ class PembiayaanOnlineController extends Controller */ public function markBlast(Request $request) { + $this->abortUnlessPembiayaanOnline(); $kodcaw = $this->kodcaw(); $ids = $request->input('ids', []); if (!is_array($ids)) { @@ -572,9 +597,8 @@ class PembiayaanOnlineController extends Controller $api_url = config('api.url'); $status = $request->input('status', ''); - $cawangan_info = $this->api() - ->get($api_url . '/api/cawangan/' . $kodcaw) - ->json(); + $cawangan_info = $this->cawanganInfo(); + $this->abortUnlessPembiayaanOnline($cawangan_info); $modal = $this->api() ->get($api_url . '/api/modal-online/' . $kodcaw) @@ -624,6 +648,7 @@ class PembiayaanOnlineController extends Controller */ public function topupRequest(Request $request) { + $this->abortUnlessPembiayaanOnline(); $kodcaw = $this->kodcaw(); $amaun = (float) $request->input('amaun', 0); @@ -742,6 +767,7 @@ class PembiayaanOnlineController extends Controller */ public function closeModal(Request $request) { + $this->abortUnlessPembiayaanOnline(); $kodcaw = $this->kodcaw(); $res = $this->api() diff --git a/resources/views/admin/features.blade.php b/resources/views/admin/features.blade.php new file mode 100644 index 00000000..05d3a3b5 --- /dev/null +++ b/resources/views/admin/features.blade.php @@ -0,0 +1,88 @@ +@extends('layouts.app_operasi') + +@section('content') +
+
+
+ + + @if(session()->has('message')) +
{{ session('message') }}
+ @endif + @if(session()->has('error')) +
{{ session('error') }}
+ @endif + +
+
+
Ciri Cawangan
+ {{ count($cawangan) }} cawangan +
+
+ + + + + + @foreach($keys as $key) + + @endforeach + + + + @forelse($cawangan as $row) + + + + @foreach($keys as $key) + @php + $on = !empty(($row['features'] ?? [])[$key]); + @endphp + + @endforeach + + @empty + + + + @endforelse + +
KodCawangan{{ $labels[$key] ?? $key }}
{{ $row['kodcaw'] ?? '-' }}{{ $row['details_caw'] ?? '-' }} +
+ @csrf + + + + +
+
Tiada cawangan.
+
+
+
+
+
+ +@endsection diff --git a/resources/views/gadaian/v2/index.blade.php b/resources/views/gadaian/v2/index.blade.php index 455b8ac0..fceac066 100644 --- a/resources/views/gadaian/v2/index.blade.php +++ b/resources/views/gadaian/v2/index.blade.php @@ -28,6 +28,7 @@
+ @@ -1266,7 +1267,8 @@ } function toggleCaraTerima(pinjaman) { - if (pinjaman >= 5000 && pinjaman <= 50000) { + var pembiayaanOnlineEnabled = $('#pembiayaan_online_enabled').val() === '1'; + if (pembiayaanOnlineEnabled && pinjaman >= 5000 && pinjaman <= 50000) { $('#cara_terima_section').show(); toggleBankOnlineSection(); } else { diff --git a/resources/views/homepage/admin/home.blade.php b/resources/views/homepage/admin/home.blade.php index 26281b3d..9eb38ebf 100644 --- a/resources/views/homepage/admin/home.blade.php +++ b/resources/views/homepage/admin/home.blade.php @@ -16,6 +16,7 @@
diff --git a/resources/views/homepage/khazanah/home.blade.php b/resources/views/homepage/khazanah/home.blade.php index 2b69225e..8fb53118 100644 --- a/resources/views/homepage/khazanah/home.blade.php +++ b/resources/views/homepage/khazanah/home.blade.php @@ -262,10 +262,12 @@ Pendahuluan - Serahan + @if(!empty(($cawangan_info['features'] ?? [])['pembiayaan_online']))
Pembiayaan Online
+ @endif
Surat Wakil diff --git a/routes/web.php b/routes/web.php index 6701d8e6..fcbb0d6a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -468,6 +468,8 @@ Route::get('admin/pelanggan',['as'=>'admin.pelanggan','uses'=>'KhazanahControlle Route::get('admin/customer_info',['as'=>'admin.customer_info','uses'=>'KhazanahController@infoAdmin'])->middleware('auth','admin'); Route::get('admin/searchpelanggan',['as'=>'admin.searchpelanggan','uses'=>'KhazanahController@searchAdmin'])->middleware('auth','admin'); Route::get('admin/poskod',['as'=>'admin.poskod','uses'=>'HomeController@poskod']); +Route::get('admin/features',['as'=>'admin.features','uses'=>'AdminFeatureController@index'])->middleware('auth','admin'); +Route::post('admin/features',['as'=>'admin.features.update','uses'=>'AdminFeatureController@update'])->middleware('auth','admin'); Route::get('pembeliannotifykomuditi',['as'=>'beli.notifyKomoditi','uses'=>'OperasiController@notifyKomoditi'])->middleware('auth','operasi');