From adf0226f2bc9c71fd21e6780ce50d74e8e3a9ad6 Mon Sep 17 00:00:00 2001 From: hafifierahman Date: Tue, 17 Jun 2025 02:23:00 +0800 Subject: [PATCH 1/3] loading waiting approval refresh --- app/Http/Controllers/GadaiController.php | 7 ++++ app/Services/Transaction/AnsuranServices.php | 43 ++++++++++++++------ routes/web.php | 2 + 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/GadaiController.php b/app/Http/Controllers/GadaiController.php index a3805af..b75c6e9 100644 --- a/app/Http/Controllers/GadaiController.php +++ b/app/Http/Controllers/GadaiController.php @@ -3800,4 +3800,11 @@ class GadaiController extends Controller return response()->json($view); } + + public function getApprovalFromOperation(Request $request){ + $ansuranserv = new AnsServ($request->kodcaw); + $view = $ansuranserv->getApprovalFromOperation($request); + + return response()->json($view); + } } diff --git a/app/Services/Transaction/AnsuranServices.php b/app/Services/Transaction/AnsuranServices.php index 69d395b..5cf56e7 100644 --- a/app/Services/Transaction/AnsuranServices.php +++ b/app/Services/Transaction/AnsuranServices.php @@ -8,6 +8,7 @@ use App\Tunai; use App\Transaction; use App\TransaksiKeuntungan; use App\Cawangan; +use App\Mohon; use App\TransaksiGadai; use Carbon\Carbon; use Illuminate\Http\Request; @@ -40,6 +41,7 @@ class AnsuranServices $harisemasa = $tarikh->toDateString(); if($harisemasa !== $tarikh_request->toDateString()){ + Log::debug('Date mismatch: ' . $harisemasa . ' vs ' . $tarikh_request->toDateString()); return 'date not equal'; } $transaction_gadai = TransaksiGadai::on('mysql7')->where('id',$request->tg_id)->first(); @@ -91,6 +93,19 @@ class AnsuranServices 'softDelete' => 1, )); + $tarikh_audit = Carbon::now(); + + $audit = new Audit(); + $audit->users = $request->teller; + $audit->actions = 'Hapus Ansuran'; + $audit->norujukan = $request->norujukan; + $audit->new_data = ''; + $audit->old_data = ''; + $audit->kodcaw = $this->cawangan; + $audit->created_at = $tarikh_audit; + $audit->updated_at = $tarikh_audit; + $audit->save(); + return 'success'; @@ -103,18 +118,6 @@ class AnsuranServices } return 'success'; - - // $audit = new Audit(); - // $audit->users = $request->teller; - // $audit->actions = 'Hapus Ansuran'; - // $audit->norujukan = $norujukan; - // $audit->new_data = $new_data; - // $audit->old_data = $old_data; - // $audit->kodcaw = $kodcaw; - // $audit->created_at = $current; - // $audit->updated_at = $current; - // $audit->save(); - } public function getLatestAdvanceWithoutDelete(Request $request){ @@ -125,5 +128,21 @@ class AnsuranServices return $latest; } + public function getApprovalFromOperation(Request $request){ + $tarikh = Carbon::now(); + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$this->cawangan)->first(); + + $latest = Mohon::on($cawangan['mysql']) + ->whereDate('tarikh',$tarikh->toDateString()) + ->where('teller',$request->teller) + ->where('masalulus','=','') + ->where('operasi','=','') + ->where('status','Hapus Ansuran') + ->latest('tarikh') + ->first(); + + return $latest; + } + } diff --git a/routes/web.php b/routes/web.php index 3698995..6925a0e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -885,6 +885,8 @@ $router->group(['prefix'=>'admin'], function () use ($router){ $router->post('ansuran/delete',['uses'=>'GadaiController@deleteAnsuran']); $router->get('ansuran/getLatest',['uses'=>'GadaiController@getLatestAdvanceWithoutDelete']); $router->get('laporan/imbangdugabackup',['uses' => 'LaporanController@getImbangDugaBackup']); + $router->get('ansuran/getApproval',['uses'=>'GadaiController@getApprovalFromOperation']); + $router->get('laporan/online',['uses'=>'AdminPageController@LaporanOnline']); $router->get('laporan/tuntutbaki',['uses'=>'AdminPageController@LaporanTuntutBaki']); From 448402061f1e88bbe015847b0a79a998f0a3b51c Mon Sep 17 00:00:00 2001 From: Hafifie PKB Date: Mon, 30 Jun 2025 12:40:19 +0800 Subject: [PATCH 2/3] added box komen on teller and added audit trail and added endpoints for laporan --- app/Http/Controllers/KelulusanController.php | 81 ++++++++-- app/Http/Controllers/LaporanController.php | 44 ++++++ app/Mohonid.php | 8 +- app/Services/Transaction/AnsuranServices.php | 24 ++- ...us_ansuran_properties_to_mohonid_table.php | 148 ++++++++++++++++++ routes/web.php | 9 +- 6 files changed, 289 insertions(+), 25 deletions(-) create mode 100644 database/migrations/2025_06_24_166534_add_hapus_ansuran_properties_to_mohonid_table.php diff --git a/app/Http/Controllers/KelulusanController.php b/app/Http/Controllers/KelulusanController.php index a3f26c3..81388a4 100644 --- a/app/Http/Controllers/KelulusanController.php +++ b/app/Http/Controllers/KelulusanController.php @@ -10,6 +10,7 @@ use App\Mohonid; use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; class KelulusanController extends Controller { @@ -298,13 +299,16 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) 'tarikh'=> $harini->toDateString(), 'mohon' => $request->mohon, 'norujukan' => $norujukan, - 'katalaluan' => '', + 'katalaluan' => $request->komen, 'pinjaman' => $request->pinjaman, 'nilaimarhun' => $request->nilaimarhun, 'berat' => $request->berat, 'margin' => $request->margin, 'benar' => '0', - 'teller' => $request->teller + 'teller' => $request->teller, + 'tagoperasi'=> ($request->tagoperasi) ? true : false, + 'masa' => $harini->toTimeString(), + 'ansuran' => ($request->ansuran) ? $request->ansuran : 0.00, ]); return response()->json($mohonid,201); @@ -322,18 +326,24 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) $kelulusan=Mohonid::on($cawangan['mysql']) ->where('tarikh','=',$harini->toDateString()) ->where('norujukan','=',$norujukan) + ->where('recno','=',$request->recno) ->update(array( 'katalaluan' => $request->komen, 'benar' => '2', - 'id' => $request->khazanah + 'id' => $request->khazanah, + 'timestamp_approved_by_pc' => $harini, )); }else{ + $benar = ($request->tagoperasi == 1) ? 0 : 1; + $kelulusan=Mohonid::on($cawangan['mysql']) ->where('tarikh','=',$harini->toDateString()) ->where('norujukan','=',$norujukan) + ->where('recno','=',$request->recno) ->update(array( - 'benar' => '1', - 'id' => $request->khazanah + 'benar' => $benar, + 'id' => $request->khazanah, + 'timestamp_approved_by_pc' => $harini, )); } @@ -381,16 +391,28 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) $arraykelulusan = []; foreach($cawangan_all as $index=>$cawangan){ - $kelulusan=Mohon::on($cawangan['mysql']) - ->where('tarikh','=',$harini->toDateString()) - ->where('masalulus','=','') - ->where('pelulus','=','operasi') - ->get(); + $kelulusan = Mohon::on($cawangan['mysql']) + ->where('tarikh','=',$harini->toDateString()) + ->where('masalulus','=','') + ->where('pelulus','=','operasi') + ->get(); - if(sizeof($kelulusan) != 0){ - array_push($arraykelulusan,["kelulusanall" => $kelulusan,"cawangan" => $cawangan['details_caw'],"cawangankod" => $cawangan['kodcaw']]); + $mohonid_data = Mohonid::on($cawangan['mysql']) + ->where('tarikh','=',$harini->toDateString()) + ->where('tagoperasi', '1') + ->whereNull('operasi') + ->get(); + + // Check if EITHER has data (not just $kelulusan) + if(sizeof($kelulusan) != 0 || sizeof($mohonid_data) != 0){ + array_push($arraykelulusan,[ + "kelulusanall" => $kelulusan, + "kelulusanMohonid" => $mohonid_data, + "cawangan" => $cawangan['details_caw'], + "cawangankod" => $cawangan['kodcaw'] + ]); } - } + } return response()->json($arraykelulusan,200); } @@ -417,4 +439,37 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) return response()->json($arraykelulusan,200); } + public function UpdateHapusAnsuranOperasi(Request $request){ + $harini = Carbon::now(); + + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); + + if($request->sahkan === 1){ + $kelulusan=Mohonid::on($cawangan['mysql']) + ->where('tarikh','=',$harini->toDateString()) + ->where('norujukan','=',$request->norujukan) + ->where('recno','=',$request->siri) + ->where('tagoperasi', '=', 1) + ->update(array( + 'operasi' => $request->namaoperasi, + 'timestamp_approved_by_operasi' => $harini, + 'benar' => 1, + )); + }else if($request->sahkan === 2){ + $kelulusan=Mohonid::on($cawangan['mysql']) + ->where('tarikh','=',$harini->toDateString()) + ->where('norujukan','=',$request->norujukan) + ->where('recno','=',$request->siri) + ->where('tagoperasi', '=', 1) + ->update(array( + 'operasi' => $request->namaoperasi, + 'timestamp_approved_by_operasi' => $harini, + 'benar' => 2, + )); + } + + return response()->json($kelulusan,202); + + } + } diff --git a/app/Http/Controllers/LaporanController.php b/app/Http/Controllers/LaporanController.php index 1c5f4c8..5b6e285 100644 --- a/app/Http/Controllers/LaporanController.php +++ b/app/Http/Controllers/LaporanController.php @@ -26,6 +26,7 @@ use Carbon\Carbon; use App\imbangdugalama; use App\Services\Reports\ImbangDugaService; use App\Services\Reports\Account\GeneralLedger; +use App\Mohonid; use Illuminate\Support\Facades\Log; @@ -1698,4 +1699,47 @@ $date = new Carbon($request->tarikh); return response()->json($array_imbangduga,200); } + + public function getLaporanKelulusan(Request $request){ + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); + + $laporan_kelulusan = Mohonid::on($cawangan['mysql']) + ->whereBetween('tarikh', [$request->mula, $request->akhir]) + ->when($request->mohon, function($query, $mohon) { + return $query->where('mohon', $mohon); + }) + ->get(); + + if($laporan_kelulusan->isEmpty()){ + return response()->json(['message' => 'No data found'], 404); + } + + return response()->json([ + 'success' => true, + 'message' => 'Laporan kelulusan retrieved successfully', + 'data' => $laporan_kelulusan, + 'count' => $laporan_kelulusan->count(), + 'timestamp' => Carbon::now()->toISOString() + ], 200); + } + + public function getListofKelulusan(Request $request){ + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); + + $laporan_kelulusan = Mohonid::on($cawangan['mysql']) + ->groupBy('mohon') + ->pluck('mohon'); + + if($laporan_kelulusan->isEmpty()){ + return response()->json(['message' => 'No data found'], 404); + } + + return response()->json([ + 'success' => true, + 'message' => 'List of Type Kelulusan retrieved successfully', + 'data' => $laporan_kelulusan, + 'count' => $laporan_kelulusan->count(), + 'timestamp' => Carbon::now()->toISOString() + ], 200); + } } diff --git a/app/Mohonid.php b/app/Mohonid.php index c474be9..ce9013f 100644 --- a/app/Mohonid.php +++ b/app/Mohonid.php @@ -27,7 +27,13 @@ class Mohonid extends Model 'nilaimarhun', 'berat', 'margin', - 'teller' + 'teller', + 'masa', + 'tagoperasi', + 'ansuran', + 'operasi', + 'timestamp_approved_by_pc', + 'timestamp_approved_by_operasi', ]; /** diff --git a/app/Services/Transaction/AnsuranServices.php b/app/Services/Transaction/AnsuranServices.php index 5cf56e7..0d2dbc9 100644 --- a/app/Services/Transaction/AnsuranServices.php +++ b/app/Services/Transaction/AnsuranServices.php @@ -9,6 +9,7 @@ use App\Transaction; use App\TransaksiKeuntungan; use App\Cawangan; use App\Mohon; +use App\Mohonid; use App\TransaksiGadai; use Carbon\Carbon; use Illuminate\Http\Request; @@ -40,6 +41,12 @@ class AnsuranServices $tarikh = Carbon::now(); $harisemasa = $tarikh->toDateString(); + $audit = new Audit(); + $audit->users = $request->teller; + $audit->actions = 'Hapus Ansuran'; + $audit->norujukan = $request->norujukan; + $audit->new_data = ''; + if($harisemasa !== $tarikh_request->toDateString()){ Log::debug('Date mismatch: ' . $harisemasa . ' vs ' . $tarikh_request->toDateString()); return 'date not equal'; @@ -51,8 +58,11 @@ class AnsuranServices return 'wrong teller'; } + $audit->old_data = $transaction_gadai; + + try{ - DB::connection('mysql7')->transaction(function () use($cawangan,$request,$harisemasa,$transaction,$transaction_gadai){ + DB::connection('mysql7')->transaction(function () use($cawangan,$request,$harisemasa,$transaction,$transaction_gadai,$audit){ try{ DB::connection($cawangan['mysql'])->transaction(function () use($cawangan,$request,$transaction_gadai,$harisemasa,$transaction){ @@ -93,14 +103,12 @@ class AnsuranServices 'softDelete' => 1, )); - $tarikh_audit = Carbon::now(); + $gadai_updated = Gadai::on($cawangan['mysql']) + ->select('percentpinj','bakipjm','tempoh','t_update','bakihargajualan','tempohbayar','lelong_tawarruq','margin_semasa','tunggakanujrah','tunggakanonepercent') + ->where('norujukan',$request->norujukan)->first(); - $audit = new Audit(); - $audit->users = $request->teller; - $audit->actions = 'Hapus Ansuran'; - $audit->norujukan = $request->norujukan; - $audit->new_data = ''; - $audit->old_data = ''; + $tarikh_audit = Carbon::now(); + $audit->new_data = $gadai_updated; $audit->kodcaw = $this->cawangan; $audit->created_at = $tarikh_audit; $audit->updated_at = $tarikh_audit; diff --git a/database/migrations/2025_06_24_166534_add_hapus_ansuran_properties_to_mohonid_table.php b/database/migrations/2025_06_24_166534_add_hapus_ansuran_properties_to_mohonid_table.php new file mode 100644 index 0000000..dbbd661 --- /dev/null +++ b/database/migrations/2025_06_24_166534_add_hapus_ansuran_properties_to_mohonid_table.php @@ -0,0 +1,148 @@ +select('SELECT 1'); + $active[] = $connection; + } catch (\Exception $e) { + continue; + } + } + + return $active; + } + + public function up() + { + $databases = $this->getActiveDB(); + Log::info("Active databases: " . implode(', ', $databases)); + foreach ($databases as $database) { + Log::info("Migrating database: {$database}"); + $this->safeAddProperties($database, 'mohonid'); + } + } + + private function safeAddProperties($database, $table_name) + { + // Skip if table doesn't exist + if (!Schema::connection($database)->hasTable($table_name)) { + Log::warning("Table {$table_name} does not exist in database {$database}. Skipping migration."); + return; + } + + try { + // Get existing columns once + $existing_columns = Schema::connection($database)->getColumnListing($table_name); + + $columns_to_add = [ + 'tagoperasi' => 'boolean', + 'ansuran' => 'decimal', + 'masa' => 'time', + 'operasi' => 'string', + 'timestamp_approved_by_pc' => 'timestamp', + 'timestamp_approved_by_operasi' => 'timestamp', + ]; + + // Find missing columns (this was missing!) + $missing_columns = array_diff(array_keys($columns_to_add), $existing_columns); + + // Add all missing columns in one schema call + if (!empty($missing_columns)) { + Schema::connection($database)->table($table_name, function (Blueprint $table) use ($existing_columns) { + // Add ansuran column - decimal with default 0 + if( !in_array('tagoperasi', $existing_columns)) { + $table->boolean('tagoperasi')->default(0)->comment('Tag Operasi'); + } + + if (!in_array('ansuran', $existing_columns)) { + $table->decimal('ansuran', 10, 2)->default(0.00)->after('pinjaman')->comment('Ansuran Amount'); + } + + // Add masa column - TIME type + if (!in_array('masa', $existing_columns)) { + $table->time('masa')->nullable()->after('tarikh')->comment('Time period'); + } + + // Add operasi column - string + if (!in_array('operasi', $existing_columns)) { + $table->string('operasi')->nullable()->comment('Nama Operasi'); + } + + // Add approval timestamp columns (changed from boolean to timestamp) + if (!in_array('timestamp_approved_by_pc', $existing_columns)) { + $table->timestamp('timestamp_approved_by_pc')->nullable()->after('id')->comment('Time Approved by PC'); + } + + if (!in_array('timestamp_approved_by_operasi', $existing_columns)) { + $table->timestamp('timestamp_approved_by_operasi')->nullable()->comment('Time approved by Operasi'); + } + }); + } + + } catch (\Exception $e) { + // Don't fail entire migration for one database + Log::error("Migration failed for database {$database}: " . $e->getMessage()); + } + } + + public function down() + { + $databases = $this->getActiveDB(); + + foreach ($databases as $database) { + if (Schema::connection($database)->hasTable('mohonid')) { + try { + Schema::connection($database)->table('mohonid', function (Blueprint $table) use ($database) { + // Check each column before dropping + if (Schema::connection($database)->hasColumn('mohonid', 'ansuran')) { + $table->dropColumn('ansuran'); + } + if (Schema::connection($database)->hasColumn('mohonid', 'masa')) { + $table->dropColumn('masa'); + } + if (Schema::connection($database)->hasColumn('mohonid', 'operasi')) { + $table->dropColumn('operasi'); + } + if (Schema::connection($database)->hasColumn('mohonid', 'is_approved_by_pc')) { + $table->dropColumn('is_approved_by_pc'); + } + if (Schema::connection($database)->hasColumn('mohonid', 'is_approved_by_operasi')) { + $table->dropColumn('is_approved_by_operasi'); + } + }); + } catch (\Exception $e) { + \Log::error("Rollback failed for database {$database}: " . $e->getMessage()); + } + } + } + + + } +} diff --git a/routes/web.php b/routes/web.php index 6925a0e..d6a6fb8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -692,6 +692,10 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->put('autoserahan/setapproval',['uses'=>'AutoSerahanController@SetApprovalWithdrawal']); $router->get('autoserahan/get',['uses'=>'AutoSerahanController@getAutoSerahanApproval']); $router->get('autoserahan/checkapproval',['uses'=>'AutoSerahanController@checkProsesApproval']); + $router->get('autoserahan/allrecord',['uses'=>'AutoSerahanController@getApprovedAutoSerahan']); + + /*Endpoints for Hapus Ansuran*/ + $router->put('UpdateHapusAnsuran',['uses'=>'KelulusanController@UpdateHapusAnsuranOperasi']); }); $router->group(['prefix'=>'e-arrahn'], function () use ($router){ @@ -885,9 +889,8 @@ $router->group(['prefix'=>'admin'], function () use ($router){ $router->post('ansuran/delete',['uses'=>'GadaiController@deleteAnsuran']); $router->get('ansuran/getLatest',['uses'=>'GadaiController@getLatestAdvanceWithoutDelete']); $router->get('laporan/imbangdugabackup',['uses' => 'LaporanController@getImbangDugaBackup']); - $router->get('ansuran/getApproval',['uses'=>'GadaiController@getApprovalFromOperation']); - - + $router->get('laporan/kelulusan',['uses' => 'LaporanController@getLaporanKelulusan']); + $router->get('laporan/kelulusan/list',['uses' => 'LaporanController@getListofKelulusan']); $router->get('laporan/online',['uses'=>'AdminPageController@LaporanOnline']); $router->get('laporan/tuntutbaki',['uses'=>'AdminPageController@LaporanTuntutBaki']); From c369566ca9fbcda61b36112ceb75967df83454ae Mon Sep 17 00:00:00 2001 From: Hafifie PKB Date: Sun, 6 Jul 2025 08:49:21 +0800 Subject: [PATCH 3/3] added endpoints laporan kelulusan and make id into string --- app/Http/Controllers/KelulusanController.php | 41 ++++++++++++++++++++ app/Mohonid.php | 4 ++ routes/web.php | 3 ++ 3 files changed, 48 insertions(+) diff --git a/app/Http/Controllers/KelulusanController.php b/app/Http/Controllers/KelulusanController.php index 81388a4..c9c357b 100644 --- a/app/Http/Controllers/KelulusanController.php +++ b/app/Http/Controllers/KelulusanController.php @@ -399,6 +399,8 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) $mohonid_data = Mohonid::on($cawangan['mysql']) ->where('tarikh','=',$harini->toDateString()) + ->whereNotNull('id') + ->whereNotNull('timestamp_approved_by_pc') ->where('tagoperasi', '1') ->whereNull('operasi') ->get(); @@ -472,4 +474,43 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) } + public function getApproval(Request $request){ + $harini = Carbon::now(); + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); + $kelulusan = Mohonid::on($cawangan['mysql']) + ->where('tarikh','=',$harini->toDateString()) + ->where('teller','=',$request->teller) + ->where('mohon','=',$request->mohon) + ->where('benar','=',0) + ->latest('masa') + ->first(); + + return response()->json($kelulusan, 200); + } + + public function getApprovalList(Request $request){ + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); + $kelulusan = Mohonid::on($cawangan['mysql']) + ->groupBy('mohon') + ->pluck('mohon'); + + return response()->json($kelulusan, 200); + } + + public function getApprovalLaporan(Request $request){ + $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$request->kodcaw)->first(); + $kelulusan = Mohonid::on($cawangan['mysql']) + ->selectRaw('recno, benar, tarikh, onlineid, mohon, norujukan, id, katalaluan, benar, operasi, pinjaman, ansuran, nilaimarhun, berat, margin, teller ,masa, timestamp_approved_by_pc, timestamp_approved_by_operasi') + ->whereBetween('tarikh', [$request->tarikh_mula, $request->tarikh_akhir]) + ->where('mohon', $request->mohon) + ->orderBy('tarikh', 'desc') + ->orderBy('masa', 'desc') + ->get(); + + + return response()->json($kelulusan, 200); + } + + + } diff --git a/app/Mohonid.php b/app/Mohonid.php index ce9013f..15ca500 100644 --- a/app/Mohonid.php +++ b/app/Mohonid.php @@ -36,6 +36,10 @@ class Mohonid extends Model 'timestamp_approved_by_operasi', ]; + protected $casts = [ + 'id' => 'string', + ]; + /** * The attributes excluded from the model's JSON form. * diff --git a/routes/web.php b/routes/web.php index d6a6fb8..78894df 100644 --- a/routes/web.php +++ b/routes/web.php @@ -696,6 +696,9 @@ $router->group(['prefix'=>'api'], function () use ($router){ /*Endpoints for Hapus Ansuran*/ $router->put('UpdateHapusAnsuran',['uses'=>'KelulusanController@UpdateHapusAnsuranOperasi']); + $router->get('getApproval',['uses'=>'KelulusanController@getApproval']); + $router->get('getApproval/list',['uses'=>'KelulusanController@getApprovalList']); + $router->get('getApproval/laporan',['uses'=>'KelulusanController@getApprovalLaporan']); }); $router->group(['prefix'=>'e-arrahn'], function () use ($router){