diff --git a/app/Http/Controllers/GadaianController.php b/app/Http/Controllers/GadaianController.php index 3b92ff49..d1e71bda 100644 --- a/app/Http/Controllers/GadaianController.php +++ b/app/Http/Controllers/GadaianController.php @@ -184,13 +184,16 @@ class GadaianController extends Controller 'norujukan' => $norujukan, 'nopelanggan' => $customer_info['nopelanggan'], 'nokp' => $noic, - 'sirig' => $new_sirig - ]); + 'sirig' => $new_sirig, + 'shoraka_new' => true, + ])->throw()->json(); + $norujukan = $gadai['norujukan']; + Session::put('norujukan', $norujukan); } else { $norujukan = Session::get('norujukan'); $nokp = Session::get('nokp'); $nopelanggan = Session::get('nopelanggan'); - $gadai_session = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/check/sag', ['kodcaw' => $auth_user['cawangan'], 'norujukan' => $norujukan, 'nokp' => $nokp])->json(); + $gadai_session = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/check/sag', ['kodcaw' => $auth_user['cawangan'], 'norujukan' => $norujukan, 'nokp' => $nokp])->throw()->json(); if ($gadai_session == null) { $gadai_transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/' . $auth_user['cawangan'] . '/' . $current->toDateString())->json(); if ($gadai_transaction) { @@ -209,9 +212,11 @@ class GadaianController extends Controller 'norujukan' => $norujukan_baru, 'nopelanggan' => $nopelanggan, 'nokp' => $nokp, - 'sirig' => $new_sirig - ]); - $norujukan = $norujukan_baru; + 'sirig' => $new_sirig, + 'shoraka_new' => true, + ])->throw()->json(); + $norujukan = $gadai_baru['norujukan']; + Session::put('norujukan', $norujukan); } } @@ -353,6 +358,7 @@ class GadaianController extends Controller return $shoraka->hold($request, $request->norujukan_gadai, 'gadai', [ 'cara_terima' => $caraTerima, 'pinjaman' => $pinjamanAmt, + 'temporary_gadai' => true, ]); } @@ -544,31 +550,55 @@ class GadaianController extends Controller $keuntungan6bulan = $keuntungan_sebln * 6; $keuntungan12bulan = $keuntungan_sebln * 12; $hargajualan = $request->pinjaman + $keuntungan12bulan; - $gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/' . $auth_user['cawangan'] . '/' . $request->norujukan_gadai, [ - 'kodcaw' => $auth_user['cawangan'], - 'nilaimarhun' => round($total_nilai_marhun, 2), - 'berat' => round($request->total_berat, 2), - 'pinjaman' => round($request->pinjaman, 2), - 'kadarupah' => round($kadarupah, 2), - 'marhun' => $request->marhun_detail, - 'percentpinj' => $margin_pinjaman, - 'teller' => $auth_user['name'], - 'upah6' => $keuntungan6bulan, - 'upah12' => $keuntungan12bulan, - 'hargajualan' => $hargajualan, - 'kuantiti_marhun' => $request->kuantiti_marhun, - 'transaction' => 'Ubah Gadai', - 'kadarujrah' => round($kadarupah, 2), - 'ujrah' => $ujrah, - 'onepercent' => $onepercent, - 'margin_semasa' => $margin_pinjaman, - 'kadar_rebate' => $this->parseMoney($request->kadar_rebate), - 'rebate' => $this->parseMoney($request->rebate), - ])->json(); - $update_komuditi = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/komuditi/update', [ - 'unit_komuditi' => round($request->pinjaman, 2), - 'norujukan' => $request->norujukan_gadai - ])->json(); + try { + $gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/' . $auth_user['cawangan'] . '/' . $request->norujukan_gadai, [ + 'kodcaw' => $auth_user['cawangan'], + 'nilaimarhun' => round($total_nilai_marhun, 2), + 'berat' => round($request->total_berat, 2), + 'pinjaman' => round($request->pinjaman, 2), + 'kadarupah' => round($kadarupah, 2), + 'marhun' => $request->marhun_detail, + 'percentpinj' => $margin_pinjaman, + 'teller' => $auth_user['name'], + 'upah6' => $keuntungan6bulan, + 'upah12' => $keuntungan12bulan, + 'hargajualan' => $hargajualan, + 'kuantiti_marhun' => $request->kuantiti_marhun, + 'transaction' => 'Ubah Gadai', + 'kadarujrah' => round($kadarupah, 2), + 'ujrah' => $ujrah, + 'onepercent' => $onepercent, + 'margin_semasa' => $margin_pinjaman, + 'kadar_rebate' => $this->parseMoney($request->kadar_rebate), + 'rebate' => $this->parseMoney($request->rebate), + ]); + } catch (\Illuminate\Http\Client\ConnectionException $exception) { + return back()->withInput()->with('gadai_edit_error', + 'Sambungan terganggu. Semak rekod gadai sebelum mencuba semula.'); + } + if (!$gadai->successful()) { + $message = 'Ubah Gadai tidak berjaya. Sila semak dengan operasi.'; + if ($gadai->status() === 409 || $gadai->status() === 422) { + $apiMessage = $gadai->json()['message'] ?? null; + if (is_string($apiMessage) && $apiMessage !== '') { + $message = $apiMessage; + } + } + return back()->withInput()->with('gadai_edit_error', $message); + } + try { + $update_komuditi = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/komuditi/update', [ + 'unit_komuditi' => round($request->pinjaman, 2), + 'norujukan' => $request->norujukan_gadai + ]); + } catch (\Illuminate\Http\Client\ConnectionException $exception) { + return back()->with('gadai_edit_error', + 'Rekod gadai telah dikemas kini tetapi kemas kini komoditi tidak dapat disahkan. Sila semak dengan operasi.'); + } + if (!$update_komuditi->successful()) { + return back()->with('gadai_edit_error', + 'Rekod gadai telah dikemas kini tetapi kemas kini komoditi gagal. Sila semak dengan operasi.'); + } event(new GadaiNotify('lulus', $auth_user['cawangan'])); @@ -582,7 +612,7 @@ class GadaianController extends Controller $norujukan = $request->norujukan; $auth_user = Auth::user(); - Http::withOptions(['verify' => config('app.api_verify')])->delete(config('api.url') . '/api/gadai/batal/' . $auth_user['cawangan'] . '/' . $norujukan); + Http::withOptions(['verify' => config('app.api_verify')])->delete(config('api.url') . '/api/gadai/batal/' . $auth_user['cawangan'] . '/' . $norujukan)->throw(); $request->session()->forget('page_reload'); $request->session()->forget('norujukan'); $request->session()->forget('borang_online_printed'); diff --git a/app/Http/Controllers/ShorakaController.php b/app/Http/Controllers/ShorakaController.php index 3c6dfb31..0dea9b76 100644 --- a/app/Http/Controllers/ShorakaController.php +++ b/app/Http/Controllers/ShorakaController.php @@ -18,6 +18,49 @@ class ShorakaController extends Controller return view('shoraka.index', compact('records', 'cawangan_info')); } + public function operasiIndex(Request $request) + { + abort_unless(in_array(Auth::user()->roles, ['operasi', 'pc', 'ppc'], true), 403); + $isOperasi = Auth::user()->roles === 'operasi'; + $filters = $request->validate([ + 'kodcaw' => 'nullable|string|max:30', + 'norujukan' => 'nullable|string|max:100', + 'state' => 'nullable|in:WAITING,PROCESSING,REVIEW,DONE', + 'date_from' => 'nullable|date_format:Y-m-d', + 'date_to' => 'nullable|date_format:Y-m-d' . ($request->filled('date_from') ? '|after_or_equal:date_from' : ''), + ]); + $branchQuery = ShorakaFinancing::select('kodcaw'); + if (!$isOperasi) { + $branchQuery->where('kodcaw', Auth::user()->cawangan); + } + $branches = $branchQuery->distinct()->orderBy('kodcaw')->pluck('kodcaw'); + $query = ShorakaFinancing::select('id', 'kodcaw', 'norujukan', 'teller', 'action', 'state', 'created_at', 'updated_at'); + if (!$isOperasi) { + $query->where('kodcaw', Auth::user()->cawangan); + } + foreach (['kodcaw', 'norujukan', 'state'] as $field) { + if (!empty($filters[$field])) { + $query->where($field, $filters[$field]); + } + } + if (!empty($filters['date_from'])) { + $query->where('created_at', '>=', $filters['date_from'] . ' 00:00:00'); + } + if (!empty($filters['date_to'])) { + $query->where('created_at', '<', \Carbon\Carbon::parse($filters['date_to'])->addDay()->format('Y-m-d') . ' 00:00:00'); + } + $records = $query->orderByDesc('created_at')->orderByDesc('id') + ->paginate(25)->appends($filters); + $cawangan_info = ['details_caw' => Auth::user()->cawangan, 'kodcaw' => Auth::user()->cawangan]; + return view('shoraka.operasi', compact('records', 'branches', 'filters', 'isOperasi', 'cawangan_info')); + } + + public function pcIndex(Request $request) + { + abort_unless(in_array(Auth::user()->roles, ['pc', 'ppc'], true), 403); + return $this->operasiIndex($request); + } + public function show(string $norujukan, ShorakaFinancingService $service) { $record = $service->local($norujukan); @@ -32,6 +75,62 @@ class ShorakaController extends Controller return view('shoraka.show', compact('norujukan', 'record', 'data', 'error', 'cawangan_info')); } + public function poll(Request $request, string $norujukan, ShorakaFinancingService $service) + { + $record = $service->local($norujukan); + abort_unless($record && $record->teller === Auth::user()->name && $record->action === 'gadai', 403); + if ($record->state === 'DONE') { + return response()->json(['state' => 'done', 'redirect' => route('customer_info')]); + } + abort_unless(!empty($record->context['temporary_gadai']), 409); + if ($record->state === 'REVIEW') { + return response()->json(['state' => 'failed', 'message' => 'Penyelesaian memerlukan semakan operasi. Jangan ulang bayaran.']); + } + if ($record->state === 'PROCESSING') { + return response()->json(['state' => 'pending']); + } + try { + $data = $service->api()->get($service->url($norujukan))->throw()->json()['data']; + $order = $data['order'] ?? null; + if ($order && !empty($order['order_id']) && ($order['status'] ?? '') !== 'Cancelled') { + $service->api()->post($service->url($norujukan, '/refresh'))->throw(); + $data = $service->api()->get($service->url($norujukan))->throw()->json()['data']; + $order = $data['order'] ?? null; + } + $status = $order['status'] ?? null; + if (in_array($status, ['Cancelled', 'FAILED', 'UNKNOWN'], true) || !$order) { + return response()->json(['state' => 'failed', 'message' => !empty($data['simulation']) + ? 'Simulasi gagal berjaya diuji. Tiada gadaian atau marhun disimpan dan tiada bayaran diproses.' + : 'Transaksi gagal atau hasil penghantaran belum dapat dipastikan. Hubungi operasi; jangan hantar semula.']); + } + if (!empty($data['can_complete'])) { + if ($request->input('progress') === 'check') { + return response()->json(['state' => 'ready']); + } + $result = $service->finish($request, $norujukan); + return response()->json(['state' => 'done', 'redirect' => $result->getTargetUrl()]); + } + if ($status === 'Completed') { + return response()->json(['state' => 'failed', 'message' => 'Komoditi selesai tetapi maklumat gadaian belum dapat disahkan. Hubungi operasi.']); + } + return response()->json(['state' => 'pending']); + } catch (Throwable $exception) { + if ($record->fresh()->state === 'REVIEW') { + return response()->json(['state' => 'failed', 'message' => 'Penyelesaian memerlukan semakan operasi. Jangan ulang bayaran.']); + } + if ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface + && $exception->getStatusCode() >= 400 && $exception->getStatusCode() < 500) { + return response()->json(['state' => 'failed', 'message' => $exception->getMessage()]); + } + if ($exception instanceof \Illuminate\Http\Client\RequestException + && in_array($exception->response->status(), [404, 409], true)) { + return response()->json(['state' => 'failed', 'message' => 'Maklumat transaksi tidak dapat disahkan. Hubungi operasi; jangan hantar semula.']); + } + // Connection loss is not proof of a failed commodity trade. + return response()->json(['state' => 'pending']); + } + } + public function submit(string $norujukan, ShorakaFinancingService $service) { $record = $service->local($norujukan); diff --git a/app/Services/ShorakaFinancingService.php b/app/Services/ShorakaFinancingService.php index cf153039..240fe879 100644 --- a/app/Services/ShorakaFinancingService.php +++ b/app/Services/ShorakaFinancingService.php @@ -10,12 +10,13 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Http; use Throwable; +use Illuminate\Support\Facades\Cache; class ShorakaFinancingService { public function ensureReady(): void { - // Check local migration before any registration side effect. + // Check the configured financing database before any registration side effect. ShorakaFinancing::where('kodcaw', Auth::user()->cawangan)->exists(); $response = $this->api()->get(rtrim(config('api.url'), '/') . '/api/shoraka/readiness')->throw()->json(); abort_unless(!empty($response['ready']), 503, 'Shoraka belum dikonfigurasi. Pembiayaan baharu ditahan.'); @@ -42,15 +43,25 @@ class ShorakaFinancingService public function hold(Request $request, string $reference, string $action, array $extra = []) { $user = Auth::user(); + $context = array_merge($request->except(['_token', 'password']), $extra); + if (!empty($extra['temporary_gadai'])) { + $key = 'shoraka:payout:' . hash('sha256', $user->cawangan . ':' . $reference); + $temporaryContext = $context; + $context = ['temporary_gadai' => true, 'pinjaman' => $extra['pinjaman']]; + } $record = ShorakaFinancing::firstOrCreate( ['kodcaw' => $user->cawangan, 'norujukan' => $reference], [ 'teller' => $user->name, 'action' => $action, 'state' => 'WAITING', - 'context' => array_merge($request->except(['_token', 'password']), $extra), + 'context' => $context, ] ); // A duplicate request only opens the saved workflow; it never replays registration. if ($record->wasRecentlyCreated) { + if (isset($temporaryContext) && !Cache::store('file')->put($key, $temporaryContext, 604800)) { + $record->update(['state' => 'REVIEW']); + abort(503, 'Maklumat pembiayaan sementara tidak dapat disimpan.'); + } try { $this->api()->post($this->url($reference, '/submit')); } catch (Throwable $exception) { @@ -91,11 +102,17 @@ class ShorakaFinancingService 409, 'Amaun pembiayaan berubah. Semakan operasi diperlukan sebelum bayaran.' ); + $context = $record->context; + if (!empty($context['temporary_gadai'])) { + $context = Cache::store('file')->get('shoraka:payout:' . hash('sha256', $record->kodcaw . ':' . $reference)); + abort_unless(is_array($context), 409, 'Maklumat sementara tamat. Semakan operasi diperlukan sebelum bayaran.'); + } + $claimed = ShorakaFinancing::where('id', $record->id)->where('state', 'WAITING') ->update(['state' => 'PROCESSING', 'updated_at' => now()]); abort_unless($claimed === 1, 409, 'Penyelesaian sedang diproses.'); - $saved = new Request($record->context); + $saved = new Request($context); $saved->setLaravelSession($request->session()); try { if ($record->action === 'gadai') { @@ -119,6 +136,9 @@ class ShorakaFinancingService $result = redirect()->route('shoraka.show', ['norujukan' => $reference]); } $record->update(['state' => 'DONE', 'context' => []]); + if (!empty($context['temporary_gadai'])) { + Cache::store('file')->forget('shoraka:payout:' . hash('sha256', $record->kodcaw . ':' . $reference)); + } return $result; } catch (Throwable $exception) { // A failed remote payment response can be ambiguous. Never retry automatically. diff --git a/app/helpers.php b/app/helpers.php index 974dacb6..5b56823f 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -2,13 +2,13 @@ if (!function_exists('api_url_for_browser')) { /** - * Base URL for JavaScript in the browser, derived from API_URL (config api.url). + * Base URL for JavaScript, using API_BROWSER_URL when configured. * Docker dev often uses host.docker.internal for PHP→host; browsers may not resolve it. * Same host-mapped port is reachable at 127.0.0.1. Production URLs are unchanged. */ function api_url_for_browser(): string { - $url = rtrim((string) config('api.url'), '/'); + $url = rtrim((string) (config('api.browser_url') ?: config('api.url')), '/'); return str_ireplace('host.docker.internal', '127.0.0.1', $url); } diff --git a/config/api.php b/config/api.php index a5475271..600c34ca 100644 --- a/config/api.php +++ b/config/api.php @@ -1,6 +1,7 @@ env('API_URL'), + 'browser_url' => env('API_BROWSER_URL'), 'url_koop' => env('API_URL_KOOP','https://apiujrah.erahn.com.my'), 'url_pkb' => env('API_URL_PKB','http://localhost:8000'), ]; \ No newline at end of file diff --git a/resources/views/gadaian/v1/edit.blade.php b/resources/views/gadaian/v1/edit.blade.php index dcc5b1a2..7b2384ac 100644 --- a/resources/views/gadaian/v1/edit.blade.php +++ b/resources/views/gadaian/v1/edit.blade.php @@ -5,6 +5,9 @@ @section('content') @include('modal.editmarhun')
+ @if(session('gadai_edit_error')) + + @endif

Pembiayaan

@@ -946,6 +949,7 @@ text: `Komen : ${data.komen}` }).then(function(){ $(func).attr("onSubmit","return true;"); + window.shorakaProgress(1, 'Sedang menghantar pembiayaan kepada Shoraka...'); $(func).submit(); return true; }); @@ -1058,6 +1062,7 @@ }).then(function(){ $(func).attr("onSubmit","return true;"); + window.shorakaProgress(1, 'Sedang menghantar pembiayaan kepada Shoraka...'); $(func).submit(); return true; @@ -1092,11 +1097,7 @@ return false; } else if(pinjaman < 10000 && pinjaman <= Number(pembiayaan_max_teller)){ - Swal.fire({ - icon: 'success', - title: 'Berjaya!', - text: 'Pembiayaan Berjaya Disimpan' - }); + window.shorakaProgress(1, 'Sedang menghantar pembiayaan kepada Shoraka...'); return true; } } diff --git a/resources/views/gadaian/v1/index.blade.php b/resources/views/gadaian/v1/index.blade.php index 7aa435ed..71ea47b6 100644 --- a/resources/views/gadaian/v1/index.blade.php +++ b/resources/views/gadaian/v1/index.blade.php @@ -1162,9 +1162,9 @@ return false; } else { Swal.fire({ - icon: 'success', - title: 'Berjaya!', - text: 'Pembiayaan Berjaya Disimpan' + icon: 'info', + title: 'Sedang diproses', + text: 'Sedang menghantar pembiayaan untuk pengesahan Shoraka.' }); $(func).attr("onSubmit","return true;"); diff --git a/resources/views/gadaian/v2/edit.blade.php b/resources/views/gadaian/v2/edit.blade.php index c38f447d..0b79c1b3 100644 --- a/resources/views/gadaian/v2/edit.blade.php +++ b/resources/views/gadaian/v2/edit.blade.php @@ -5,6 +5,9 @@ @section('content') @include('modal.editmarhun')
+ @if(session('gadai_edit_error')) + + @endif

Pembiayaan

@@ -1612,6 +1615,7 @@ text: `Komen : ${data.komen}` }).then(function(){ $(func).attr("onSubmit","return true;"); + window.shorakaProgress(1, 'Sedang menghantar pembiayaan kepada Shoraka...'); $(func).submit(); return true; }); @@ -1724,6 +1728,7 @@ }).then(function(){ $(func).attr("onSubmit","return true;"); + window.shorakaProgress(1, 'Sedang menghantar pembiayaan kepada Shoraka...'); $(func).submit(); return true; @@ -1758,11 +1763,7 @@ return false; } else if(pinjaman < 10000 && pinjaman <= Number(pembiayaan_max_teller)){ - Swal.fire({ - icon: 'success', - title: 'Berjaya!', - text: 'Pembiayaan Berjaya Disimpan' - }); + window.shorakaProgress(1, 'Sedang menghantar pembiayaan kepada Shoraka...'); return true; } } diff --git a/resources/views/gadaian/v2/index.blade.php b/resources/views/gadaian/v2/index.blade.php index b01646e6..7bd4daab 100644 --- a/resources/views/gadaian/v2/index.blade.php +++ b/resources/views/gadaian/v2/index.blade.php @@ -2000,9 +2000,9 @@ } else { //insert code asal Swal.fire({ - icon: 'success', - title: 'Berjaya!', - text: 'Pembiayaan Berjaya Disimpan' + icon: 'info', + title: 'Sedang diproses', + text: 'Sedang menghantar pembiayaan untuk pengesahan Shoraka.' }); $(func).attr("onSubmit","return true;"); diff --git a/resources/views/homepage/khazanah/home.blade.php b/resources/views/homepage/khazanah/home.blade.php index 43745fbe..56b281e6 100644 --- a/resources/views/homepage/khazanah/home.blade.php +++ b/resources/views/homepage/khazanah/home.blade.php @@ -268,6 +268,11 @@ Harga Emas
+ @if(in_array(Auth::user()->roles, ['pc', 'ppc'], true)) + + @endif @if(!empty(($cawangan_info['features'] ?? [])['pembiayaan_online']))
Kelulusan Anggota Kelulusan + Komoditi Shoraka Pembiayaan Online Modal Online EOD Modal Online diff --git a/resources/views/homepage/teller/home.blade.php b/resources/views/homepage/teller/home.blade.php index 96118da7..ea240d1e 100644 --- a/resources/views/homepage/teller/home.blade.php +++ b/resources/views/homepage/teller/home.blade.php @@ -60,7 +60,7 @@ HARGA EMAS ALIRAN TUNAI @if(in_array(Auth::user()->roles, ['teller', 'penilai', 'pc', 'ppc', 'admin', 'masteradmin', 'operasi']) || Auth::user()->role_harian === 'teller') - PEMBIAYAAN SHORAKA + KOMODITI SHORAKA @endif {{-- TETAPAN --}}
diff --git a/resources/views/print/sag_ujrah_3.blade.php b/resources/views/print/sag_ujrah_3.blade.php index 0b0a5732..3a20ddab 100644 --- a/resources/views/print/sag_ujrah_3.blade.php +++ b/resources/views/print/sag_ujrah_3.blade.php @@ -615,7 +615,7 @@ {{ $komoditi['no_sijil'] }} 4 Kuantiti (Unit) - {{ number_format($kuantiti, 2) }} TAN + {{ $kuantiti }} TONNES 2 @@ -1849,7 +1849,7 @@ {{ $komoditi['no_sijil'] }} 4 Kuantiti - {{ number_format($kuantiti, 2) }} + {{ $kuantiti }} 2 diff --git a/resources/views/shoraka/index.blade.php b/resources/views/shoraka/index.blade.php index fdb7559f..31adf1b1 100644 --- a/resources/views/shoraka/index.blade.php +++ b/resources/views/shoraka/index.blade.php @@ -20,13 +20,13 @@
-
Pembiayaan Shoraka
+
Komoditi Shoraka
Kembali ke Paparan Utama diff --git a/resources/views/shoraka/navigation.blade.php b/resources/views/shoraka/navigation.blade.php index 6a6ac58e..07acd467 100644 --- a/resources/views/shoraka/navigation.blade.php +++ b/resources/views/shoraka/navigation.blade.php @@ -1,3 +1,50 @@ + + + @else + @if($error)
{{ $error }}
@endif @if(session('shoraka_message'))
{{ session('shoraka_message') }}
@endif @php @@ -80,6 +152,7 @@ Muat Turun Sijil @endif
+ @endif
diff --git a/routes/web.php b/routes/web.php index ad6b00b4..38901f93 100644 --- a/routes/web.php +++ b/routes/web.php @@ -420,6 +420,8 @@ Route::group(['middleware' => ['khazanah']], function() { Route::post('/barcodescanned',['as'=>'barcode.scanned','uses'=>'KhazanahController@barcodescanned'])->middleware('auth','khazanah'); //Operasi +Route::get('/pc/shoraka', 'ShorakaController@pcIndex')->name('pc.shoraka.index')->middleware('auth', 'khazanah'); +Route::get('/operasi/shoraka', 'ShorakaController@operasiIndex')->name('operasi.shoraka.index')->middleware('auth', 'operasi'); Route::get('/operasi/kelulusan','OperasiController@kelulusan')->name('operasi.kelulusan')->middleware('auth','operasi'); Route::get('/operasi/kelulusan/anggota','OperasiController@kelulusanAnggota')->name('operasi.kelulusananggota')->middleware('auth','operasi'); Route::post('/operasi/createkelulusan',['as'=>'operasi.createkelulusan','uses'=>'OperasiController@createkelulusan'])->middleware('auth','teller'); @@ -610,6 +612,7 @@ Route::group(['prefix' => 'shoraka', 'middleware' => ['auth', 'role:teller,penil Route::get('/', 'ShorakaController@index')->name('shoraka.index'); Route::get('/{norujukan}', 'ShorakaController@show')->name('shoraka.show'); Route::post('/{norujukan}/submit', 'ShorakaController@submit')->name('shoraka.submit'); + Route::post('/{norujukan}/poll', 'ShorakaController@poll')->name('shoraka.poll'); Route::post('/{norujukan}/refresh', 'ShorakaController@refresh')->name('shoraka.refresh'); Route::post('/{norujukan}/finish', 'ShorakaController@finish')->name('shoraka.finish'); Route::get('/{norujukan}/certificate', 'ShorakaController@certificate')->name('shoraka.certificate');