From 1f27d90698c2acdb7a2d3b47671cee5a0f225a10 Mon Sep 17 00:00:00 2001 From: aiman Date: Sun, 14 Sep 2025 16:03:49 +0800 Subject: [PATCH 01/16] Tukar step pampasan v3 ke v2: --- app/Http/Controllers/BarangkesController.php | 88 +++++++++++++++----- config/app_parameter.php | 4 +- 2 files changed, 69 insertions(+), 23 deletions(-) diff --git a/app/Http/Controllers/BarangkesController.php b/app/Http/Controllers/BarangkesController.php index dd4f10c..8e37309 100644 --- a/app/Http/Controllers/BarangkesController.php +++ b/app/Http/Controllers/BarangkesController.php @@ -10,34 +10,78 @@ use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Http; class BarangkesController extends Controller { public function LaporanBarangKes(Request $request) { + $status = $request->status; - $cawangan = Cawangan::on('mysql7')->where('kodcaw', $request->kodcaw)->first(); + $cawangan = Cawangan::on('mysql7')->where('kodcaw', $request->kodcaw)->first(); - if (!$cawangan) { - return response()->json(['error' => 'Invalid kodcaw'], 403); + if (!$cawangan) { + return response()->json(['error' => 'Invalid kodcaw'], 403); + } + + $query = DB::connection($cawangan['mysql'])->table('palsu') + ->select([ + 'tarikh', + 'norujukan', + 'nota', + 'pembiayaan', + 'nilaimarhun', + 'jbg', + 'untung', + 'untungonepercent', + 'untungcajlain' + ]); + + // Only apply whereBetween if tarikh_mula and tarikh_akhir are provided + if ($request->filled('tarikh_mula') && $request->filled('tarikh_akhir')) { + $query->whereBetween('tarikh', [$request->tarikh_mula, $request->tarikh_akhir]); + } + + $result = $query->get(); + + $pampasan = Http::get(config('app_parameter.api_v3') . "pampasan", ['kodcaw' => $request->kodcaw]) + ->json()['data']; + + $palsu_array = $result->toArray(); + + // dd($pampasan, $palsu_array); + + $indexedArray2 = collect($pampasan)->keyBy('norujukan'); + + $merged = collect($palsu_array)->map(function ($item) use ($indexedArray2) { + $id = $item->norujukan; + $itemArray = (array) $item; // Convert object to array + $additional = $indexedArray2->get($id, []); + return array_merge($itemArray, $additional); + })->values()->toArray(); + + // dd($merged, $status); + + $filteredResults = []; + + if ($status == 'dituntut') { + foreach ($merged as $pampasan) { + if (isset($pampasan['status']) && $pampasan['status'] == 1) { + $filteredResults[] = $pampasan; + } + } + } + if ($status == 'belum-tuntut') { + foreach ($merged as $pampasan) { + if (!isset($pampasan['status']) ) { + $filteredResults[] = $pampasan; + } + } + } + if ($status == 'all') { + $filteredResults = $merged; + } + + return response()->json($filteredResults); } - - $query = DB::connection($cawangan['mysql'])->table('palsu') - ->select([ - 'tarikh', - 'norujukan', - 'nota', - 'pembiayaan', - 'nilaimarhun', - 'jbg', - 'untung', - 'untungonepercent', - 'untungcajlain' - ]) - ->whereBetween('tarikh', [$request->tarikh_mula, $request->tarikh_akhir]); - - $result = $query->get(); - - return response()->json($result); } -} \ No newline at end of file diff --git a/config/app_parameter.php b/config/app_parameter.php index a6cf4d8..c46f175 100644 --- a/config/app_parameter.php +++ b/config/app_parameter.php @@ -2,5 +2,7 @@ return [ 'url' => env('APP_URL', url('/')), - 'api_arrahnbid' => env('API_ARRAHNBID', 'http://lelong.test/api/') + 'api_arrahnbid' => env('API_ARRAHNBID', 'http://lelong.test/api/'), + 'api_v3' => env('API_V3', 'http://apiv3.localhost/api/') ]; + From 977fab853dfa162925196d5820ef9e33f5b69594 Mon Sep 17 00:00:00 2001 From: aiman Date: Sun, 14 Sep 2025 15:54:31 +0800 Subject: [PATCH 02/16] Tukar step pampasan v3 ke v2: --- app/.DS_Store | Bin 12292 -> 12292 bytes app/Http/Controllers/PampasanController.php | 94 ++++++++++++++++++ app/Pampasan.php | 33 ++++++ ...tung_pembiayaan_columns_to_palsu_table.php | 32 +++--- ...025_08_28_150140_create_pampasan_table.php | 57 +++++++++++ routes/web.php | 5 + 6 files changed, 205 insertions(+), 16 deletions(-) create mode 100644 app/Http/Controllers/PampasanController.php create mode 100644 app/Pampasan.php create mode 100644 database/migrations/2025_08_28_150140_create_pampasan_table.php diff --git a/app/.DS_Store b/app/.DS_Store index aba4526fd74a7b7bfd2123fff717d1802f630e69..c05d45cf3ec83c70d240a152fa214bbb44a0caa7 100644 GIT binary patch delta 37 tcmZokXi1ph&zQ6^U^hRb?PeZ<-|UljONwkxlvu?+S%J}QGq=J|egFj24IKag delta 56 zcmZokXi1ph&zQV1U^hRb-DVzv-|URSlMhIUaw;$+GvqTAFjP+7ASlJeY&Tg?Qhu|v M#47g9+zLPW0q~{}h5!Hn diff --git a/app/Http/Controllers/PampasanController.php b/app/Http/Controllers/PampasanController.php new file mode 100644 index 0000000..6592327 --- /dev/null +++ b/app/Http/Controllers/PampasanController.php @@ -0,0 +1,94 @@ +validate($request, [ + 'norujukan' => 'required|string', + 'baucerno' => 'required|string', + 'kodcaw' => 'required|string', + 'jumlah_pampasan' => 'required|numeric', + 'denominasi' => 'nullable|array', + 'teller' => 'required|string', + ]); + + try { + $cawangan = Cawangan::on('mysql7')->where('kodcaw', $request->kodcaw)->first(); + + if (!$cawangan) { + return response()->json([ + 'success' => false, + 'message' => 'Cawangan tidak dijumpai untuk kodcaw: ' . $request->kodcaw, + ], 404); + } + + $pampasan = Pampasan::on($cawangan['mysql'])->create([ + 'norujukan' => $validated['norujukan'], + 'baucerno' => $validated['baucerno'], + 'kodcaw' => $validated['kodcaw'], + 'jumlah_pampasan' => $validated['jumlah_pampasan'], + 'denominasi' => isset($validated['denominasi']) ? json_encode($validated['denominasi']) : null, + 'teller' => $validated['teller'], + ]); + + return response()->json([ + 'success' => true, + 'message' => 'Pampasan berjaya dibayar.', + 'data' => $pampasan, + ], 201); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Database error: ' . $e->getMessage(), + ], 500); + } + } + + public function updateStatusPampasan(Request $request) + { + $norujukan = $request->norujukan; + $kodcaw = $request->kodcaw; + + $cawangan = Cawangan::on('mysql7')->where('kodcaw', $request->kodcaw)->first(); + + $pampasan = Pampasan::on($cawangan['mysql'])->where("norujukan", $norujukan)->first(); + + $pampasan->status = 1; + + $pampasan->save(); + + // dd($pampasan); + + return response()->json([ + 'success' => true, + 'message' => 'Status Pampasan berjaya dituntut.', + 'data' => $pampasan, + ], 201); + } + + public function getPampasan() + { + $pampasan = Pampasan::on('mysql71')->get(); + + return response()->json([ + 'success' => true, + 'message' => 'Status Pampasan berjaya dituntut.', + 'data' => $pampasan, + ], 201); + } + + public function getPampasanByNoRujukan() + { + + } +} diff --git a/app/Pampasan.php b/app/Pampasan.php new file mode 100644 index 0000000..5aed11d --- /dev/null +++ b/app/Pampasan.php @@ -0,0 +1,33 @@ +hasColumn('palsu', 'norujukan')) { // Add index to norujukan column for better performance - $table->index('norujukan'); + // $table->index('norujukan'); // Add foreign key constraint named 'norujukan' - $table->foreign('norujukan', 'norujukan')->references('norujukan')->on('gadai'); + // $table->foreign('norujukan', 'norujukan')->references('norujukan')->on('gadai'); } }); @@ -87,21 +87,21 @@ class AddNmJbgUntungPembiayaanColumnsToPalsuTable extends Migration Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { // Drop foreign key constraint and index from norujukan column - if (Schema::connection($dbase)->hasColumn('palsu', 'norujukan')) { - try { - $table->dropForeign('norujukan'); - echo "Dropped foreign key 'norujukan' on connection '{$dbase}'\n"; - } catch (\Exception $e) { - echo "Warning: Could not drop foreign key 'norujukan' on connection '{$dbase}': " . $e->getMessage() . "\n"; - } + // if (Schema::connection($dbase)->hasColumn('palsu', 'norujukan')) { + // try { + // $table->dropForeign('norujukan'); + // echo "Dropped foreign key 'norujukan' on connection '{$dbase}'\n"; + // } catch (\Exception $e) { + // echo "Warning: Could not drop foreign key 'norujukan' on connection '{$dbase}': " . $e->getMessage() . "\n"; + // } - try { - $table->dropIndex(['norujukan']); - echo "Dropped index on 'norujukan' column on connection '{$dbase}'\n"; - } catch (\Exception $e) { - echo "Warning: Could not drop index on 'norujukan' on connection '{$dbase}': " . $e->getMessage() . "\n"; - } - } + // try { + // $table->dropIndex(['norujukan']); + // echo "Dropped index on 'norujukan' column on connection '{$dbase}'\n"; + // } catch (\Exception $e) { + // echo "Warning: Could not drop index on 'norujukan' on connection '{$dbase}': " . $e->getMessage() . "\n"; + // } + // } // Drop other columns if they exist $columnsToCheck = ['nilaimarhun', 'jbg', 'untung','untungonepercent','untungcajlain', 'pembiayaan']; diff --git a/database/migrations/2025_08_28_150140_create_pampasan_table.php b/database/migrations/2025_08_28_150140_create_pampasan_table.php new file mode 100644 index 0000000..3c867a7 --- /dev/null +++ b/database/migrations/2025_08_28_150140_create_pampasan_table.php @@ -0,0 +1,57 @@ +select('SELECT 1'); + return true; + } catch (\Exception $e) { + return false; + } + }); + return $db_connection ? array_values($db_connection) : []; + } + + public function up() + { + foreach ($this->getActiveDB() as $dbase) { + if (!Schema::connection($dbase)->hasTable('pampasan')) { + Schema::connection($dbase)->create('pampasan', function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('norujukan', 50)->unique()->index(); + $table->string('baucerno', 30)->index(); + $table->string('kodcaw', 20)->index(); + $table->decimal('jumlah_pampasan', 11, 2); + + if (Schema::getConnection()->getPdo()->getAttribute(PDO::ATTR_SERVER_VERSION) >= '5.7') { + $table->json('denominasi')->nullable(); + } else { + $table->longText('denominasi')->nullable(); + } + $table->string('teller', 100); + $table->tinyInteger('status') + ->default(0) + ->comment('0 = belum dituntut, 1 = dituntut'); + $table->timestamps(); + }); + } + } + } + + public function down() + { + foreach ($this->getActiveDB() as $dbase) { + Schema::connection($dbase)->dropIfExists('pampasan'); + } + } +} diff --git a/routes/web.php b/routes/web.php index 9f025c3..fcb9b81 100644 --- a/routes/web.php +++ b/routes/web.php @@ -379,6 +379,11 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->post('CreatePanjar/{kodcaw}',['uses'=>'PanjarController@create']); $router->post('DeletePanjar/{kodcaw}',['uses'=>'PanjarController@delete']); + //API PAMPASAN GUNA PANJAR + $router->post('pampasan/terimaPampasan',['uses'=>'PampasanController@terimaPampasan']); + $router->put('pampasan/updateStatusPampasan', ['uses' => 'PampasanController@updateStatusPampasan']); + $router->get('pampasan', ['uses' => 'PampasanController@getPampasan']); + //API KELULUSAN $router->get('SenaraiKelulusan/{kodcaw}',['uses'=>'KelulusanController@list']); From 59aeeb57f922ddca653fbc0565351b67d1213d79 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Wed, 17 Sep 2025 12:38:51 +0800 Subject: [PATCH 03/16] Continue dev on pampasan module --- app/Http/Controllers/BarangkesController.php | 45 +++--- app/Http/Controllers/PampasanController.php | 6 + app/Palsu.php | 8 ++ ...092001_add_jenis_column_to_palsu_table.php | 68 +++++++++ ...jenis_to_pampasan_for_semporna_records.php | 78 +++++++++++ ...on_semporna_records_jenis_to_hapuskira.php | 130 ++++++++++++++++++ ...93118_add_status_column_to_palsu_table.php | 73 ++++++++++ ..._093624_update_all_palsu_status_to_one.php | 80 +++++++++++ ...update_semporna_records_status_to_zero.php | 78 +++++++++++ 9 files changed, 545 insertions(+), 21 deletions(-) create mode 100644 database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php create mode 100644 database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php create mode 100644 database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php create mode 100644 database/migrations/2025_09_17_093118_add_status_column_to_palsu_table.php create mode 100644 database/migrations/2025_09_17_093624_update_all_palsu_status_to_one.php create mode 100644 database/migrations/2025_09_17_093756_update_semporna_records_status_to_zero.php diff --git a/app/Http/Controllers/BarangkesController.php b/app/Http/Controllers/BarangkesController.php index 8e37309..06ef56e 100644 --- a/app/Http/Controllers/BarangkesController.php +++ b/app/Http/Controllers/BarangkesController.php @@ -6,6 +6,8 @@ use App\Audit; use App\Polis; use App\Cawangan; use App\LookupAlasan; +use App\Pampasan; +use App\Palsu; use Illuminate\Http\Request; use Carbon\Carbon; @@ -24,7 +26,7 @@ class BarangkesController extends Controller return response()->json(['error' => 'Invalid kodcaw'], 403); } - $query = DB::connection($cawangan['mysql'])->table('palsu') + $palsu_query = Palsu::on($cawangan['mysql']) ->select([ 'tarikh', 'norujukan', @@ -35,33 +37,34 @@ class BarangkesController extends Controller 'untung', 'untungonepercent', 'untungcajlain' - ]); + ]) + ->when($request->filled('jenis'), function($query) use($request){ + return $query->where('jenis', $request->jenis); + }) + ->when($request->filled('tarikh_mula') && $request->filled('tarikh_akhir'), function($query) use($request){ + return $query->whereBetween('tarikh', [$request->tarikh_mula, $request->tarikh_akhir]); + }) + ->with('tebus:norujukan'); - // Only apply whereBetween if tarikh_mula and tarikh_akhir are provided - if ($request->filled('tarikh_mula') && $request->filled('tarikh_akhir')) { - $query->whereBetween('tarikh', [$request->tarikh_mula, $request->tarikh_akhir]); - } + $palsu_array = $palsu_query->get()->toArray(); + $pampasan_array = Pampasan::on($cawangan['mysql'])->where('kodcaw', $request->kodcaw)->get()->toArray(); - $result = $query->get(); - - $pampasan = Http::get(config('app_parameter.api_v3') . "pampasan", ['kodcaw' => $request->kodcaw]) - ->json()['data']; - - $palsu_array = $result->toArray(); - - // dd($pampasan, $palsu_array); - - $indexedArray2 = collect($pampasan)->keyBy('norujukan'); + $indexedArray2 = collect($pampasan_array)->keyBy('norujukan'); $merged = collect($palsu_array)->map(function ($item) use ($indexedArray2) { - $id = $item->norujukan; - $itemArray = (array) $item; // Convert object to array + $id = $item['norujukan']; + $itemArray = $item; // Already an array from toArray() $additional = $indexedArray2->get($id, []); + + // Add exists_in_tebus flag based on relationship + $itemArray['gadaian_sudah_tebus'] = !is_null($item['tebus']); + + // Remove the tebus relationship data to keep response clean + unset($itemArray['tebus']); + return array_merge($itemArray, $additional); })->values()->toArray(); - // dd($merged, $status); - $filteredResults = []; if ($status == 'dituntut') { @@ -78,7 +81,7 @@ class BarangkesController extends Controller } } } - if ($status == 'all') { + if ($status == 'all' || $status == null) { $filteredResults = $merged; } diff --git a/app/Http/Controllers/PampasanController.php b/app/Http/Controllers/PampasanController.php index 6592327..3ec2ebd 100644 --- a/app/Http/Controllers/PampasanController.php +++ b/app/Http/Controllers/PampasanController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Cawangan; +use App\Palsu; use App\Pampasan; use Illuminate\Http\Request; use Carbon\Carbon; @@ -67,6 +68,11 @@ class PampasanController extends Controller $pampasan->save(); + // Update corresponding palsu table record status to 1 + Palsu::on($cawangan['mysql']) + ->where('norujukan', $norujukan) + ->update(['status' => 1]); + // dd($pampasan); return response()->json([ diff --git a/app/Palsu.php b/app/Palsu.php index 06c5eaa..98d6f3b 100644 --- a/app/Palsu.php +++ b/app/Palsu.php @@ -4,6 +4,7 @@ namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOne; use App\Audit; use Illuminate\Support\Carbon; @@ -30,6 +31,8 @@ class Palsu extends Model 'untungonepercent', 'untungcajlain', 'pembiayaan', + 'jenis', + 'status', ]; // public static function boot() @@ -87,4 +90,9 @@ class Palsu extends Model // { // return $this->belongsTo(Daerah::class, 'koddaerah', 'koddaerah'); // } + + public function tebus(): HasOne + { + return $this->hasOne(Tebus::class, 'norujukan', 'norujukan'); + } } diff --git a/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php b/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php new file mode 100644 index 0000000..a9de2a2 --- /dev/null +++ b/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php @@ -0,0 +1,68 @@ +select('SELECT 1'); + return true; + } catch (\Exception $e) { + return false; + } + }); + + return $db_connection ? array_values($db_connection) : []; + } + + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { + if (!Schema::connection($dbase)->hasColumn('palsu', 'jenis')) { + $table->string('jenis', 50)->nullable()->comment('Jenis/Type classification'); + } + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { + if (Schema::connection($dbase)->hasColumn('palsu', 'jenis')) { + $table->dropColumn('jenis'); + } + }); + } + } +} diff --git a/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php b/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php new file mode 100644 index 0000000..424a87b --- /dev/null +++ b/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php @@ -0,0 +1,78 @@ +getSempornaRecords(); + + // Update jenis to 'pampasan' for Semporna records in mysql34 (Semporna branch) + try { + $updated = DB::connection('mysql34')->table('palsu') + ->whereIn('norujukan', $semporna_records) + ->update(['jenis' => 'pampasan']); + + echo "Updated {$updated} Semporna records with jenis = 'pampasan'\n"; + } catch (\Exception $e) { + echo "Error updating Semporna records: " . $e->getMessage() . "\n"; + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $semporna_records = $this->getSempornaRecords(); + + // Revert jenis to null for Semporna records + try { + $reverted = DB::connection('mysql34')->table('palsu') + ->whereIn('norujukan', $semporna_records) + ->update(['jenis' => null]); + + echo "Reverted {$reverted} Semporna records jenis to null\n"; + } catch (\Exception $e) { + echo "Error reverting Semporna records: " . $e->getMessage() . "\n"; + } + } +} diff --git a/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php b/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php new file mode 100644 index 0000000..44594a3 --- /dev/null +++ b/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php @@ -0,0 +1,130 @@ +select('SELECT 1'); + return true; + } catch (\Exception $e) { + return false; + } + }); + + return $db_connection ? array_values($db_connection) : []; + } + + /** + * Semporna norujukan records to exclude + */ + private function getSempornaRecords(): array + { + return [ + '011237240808-0003', + '011237240719-0015', + '011237240806-0011', + '011237240828-0001', + '011237240904-0007', + '011237240904-0008', + '011237240904-0009', + '011237240719-0023', + '011237240719-0024', + '011237240719-0025', + '011237240618-0026', + '011237240719-0027', + '011237240719-0028', + '011237240618-0020', + '011237240719-0030', + '011237240618-0029', + '011237240731-0026', + '011237240912-0009' + ]; + } + + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + $db_connection = $this->getActiveDB(); + $semporna_records = $this->getSempornaRecords(); + + foreach ($db_connection as $dbase) { + try { + if ($dbase == 'mysql34') { + // For Semporna (mysql34), update only non-Semporna records to 'hapuskira' + $updated = DB::connection($dbase)->table('palsu') + ->whereNotIn('norujukan', $semporna_records) + ->update(['jenis' => 'hapuskira']); + + if ($updated > 0) { + echo "Updated {$updated} non-Semporna records in {$dbase} to jenis = 'hapuskira'\n"; + } + } else { + // For all other databases, update all records to 'hapuskira' + $updated = DB::connection($dbase)->table('palsu') + ->update(['jenis' => 'hapuskira']); + + if ($updated > 0) { + echo "Updated {$updated} records in {$dbase} to jenis = 'hapuskira'\n"; + } + } + } catch (\Exception $e) { + echo "Error updating {$dbase}: " . $e->getMessage() . "\n"; + } + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + try { + // Revert all jenis values to null except Semporna records which should remain 'pampasan' + if ($dbase == 'mysql34') { + $semporna_records = $this->getSempornaRecords(); + $reverted = DB::connection($dbase)->table('palsu') + ->whereNotIn('norujukan', $semporna_records) + ->update(['jenis' => null]); + + if ($reverted > 0) { + echo "Reverted {$reverted} non-Semporna records in {$dbase} jenis to null\n"; + } + } else { + $reverted = DB::connection($dbase)->table('palsu') + ->update(['jenis' => null]); + + if ($reverted > 0) { + echo "Reverted {$reverted} records in {$dbase} jenis to null\n"; + } + } + } catch (\Exception $e) { + echo "Error reverting {$dbase}: " . $e->getMessage() . "\n"; + } + } + } +} diff --git a/database/migrations/2025_09_17_093118_add_status_column_to_palsu_table.php b/database/migrations/2025_09_17_093118_add_status_column_to_palsu_table.php new file mode 100644 index 0000000..6c71628 --- /dev/null +++ b/database/migrations/2025_09_17_093118_add_status_column_to_palsu_table.php @@ -0,0 +1,73 @@ +select('SELECT 1'); + return true; + } catch (\Exception $e) { + return false; + } + }); + + return $db_connection ? array_values($db_connection) : []; + } + + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { + if (!Schema::connection($dbase)->hasColumn('palsu', 'status')) { + $table->unsignedSmallInteger('status')->default(0)->comment('Status value'); + } + }); + + // Update existing rows to have status = 0 + DB::connection($dbase)->table('palsu') + ->whereNull('status') + ->update(['status' => 0]); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { + if (Schema::connection($dbase)->hasColumn('palsu', 'status')) { + $table->dropColumn('status'); + } + }); + } + } +} diff --git a/database/migrations/2025_09_17_093624_update_all_palsu_status_to_one.php b/database/migrations/2025_09_17_093624_update_all_palsu_status_to_one.php new file mode 100644 index 0000000..3cba378 --- /dev/null +++ b/database/migrations/2025_09_17_093624_update_all_palsu_status_to_one.php @@ -0,0 +1,80 @@ +select('SELECT 1'); + return true; + } catch (\Exception $e) { + return false; + } + }); + + return $db_connection ? array_values($db_connection) : []; + } + + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + try { + // Update all status values to 1 in palsu table + $updated = DB::connection($dbase)->table('palsu') + ->update(['status' => 1]); + + if ($updated > 0) { + echo "Updated {$updated} records in {$dbase} palsu table to status = 1\n"; + } + } catch (\Exception $e) { + echo "Error updating {$dbase}: " . $e->getMessage() . "\n"; + } + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + try { + // Revert all status values back to 0 in palsu table + $reverted = DB::connection($dbase)->table('palsu') + ->update(['status' => 0]); + + if ($reverted > 0) { + echo "Reverted {$reverted} records in {$dbase} palsu table to status = 0\n"; + } + } catch (\Exception $e) { + echo "Error reverting {$dbase}: " . $e->getMessage() . "\n"; + } + } + } +} diff --git a/database/migrations/2025_09_17_093756_update_semporna_records_status_to_zero.php b/database/migrations/2025_09_17_093756_update_semporna_records_status_to_zero.php new file mode 100644 index 0000000..7731a9d --- /dev/null +++ b/database/migrations/2025_09_17_093756_update_semporna_records_status_to_zero.php @@ -0,0 +1,78 @@ +getSempornaRecords(); + + // Update status to 0 for Semporna records in mysql34 (Semporna branch) + try { + $updated = DB::connection('mysql34')->table('palsu') + ->whereIn('norujukan', $semporna_records) + ->update(['status' => 0]); + + echo "Updated {$updated} Semporna records with status = 0\n"; + } catch (\Exception $e) { + echo "Error updating Semporna records status: " . $e->getMessage() . "\n"; + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $semporna_records = $this->getSempornaRecords(); + + // Revert status to 1 for Semporna records + try { + $reverted = DB::connection('mysql34')->table('palsu') + ->whereIn('norujukan', $semporna_records) + ->update(['status' => 1]); + + echo "Reverted {$reverted} Semporna records status to 1\n"; + } catch (\Exception $e) { + echo "Error reverting Semporna records status: " . $e->getMessage() . "\n"; + } + } +} From 38dd97c4f2d31fe7ecf813191ba7f91bf242c5b2 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Wed, 17 Sep 2025 14:14:06 +0800 Subject: [PATCH 04/16] Register pampasan to panjar after tuntutan made by pelanggan --- app/Http/Controllers/PampasanController.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/PampasanController.php b/app/Http/Controllers/PampasanController.php index 3ec2ebd..48a95c0 100644 --- a/app/Http/Controllers/PampasanController.php +++ b/app/Http/Controllers/PampasanController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Cawangan; use App\Palsu; use App\Pampasan; +use App\Panjar; use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Log\Logger; @@ -58,7 +59,6 @@ class PampasanController extends Controller public function updateStatusPampasan(Request $request) { $norujukan = $request->norujukan; - $kodcaw = $request->kodcaw; $cawangan = Cawangan::on('mysql7')->where('kodcaw', $request->kodcaw)->first(); @@ -73,7 +73,19 @@ class PampasanController extends Controller ->where('norujukan', $norujukan) ->update(['status' => 1]); - // dd($pampasan); + Panjar::on($cawangan['mysql']) + ->create([ + 'tarikh' => Carbon::now()->toDateString(), + 'deskripsi' => 'BAYARAN PAMPASAN' . '(' . $pampasan->norujukan . ')', + 'bayaran' => $pampasan->jumlah_pampasan, + 'tag' => 1, + 'kategori' => 'Belanja AM', + 'id' => $pampasan->teller, + 'bakiperubatan' => $request->bakiperubatan, + 'nobaucer' => $pampasan->baucherno, + 'nobil' => Carbon::now()->format('dmy'), + 'tuntutoleh' => $pampasan->teller, + ]); return response()->json([ 'success' => true, From f5874b956db5585bc8540d7d57507caf4d9f18f6 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Mon, 22 Sep 2025 13:00:08 +0800 Subject: [PATCH 05/16] Update pampasan module with enhanced agreement tracking and semporna processing - Add agreement_printed_at timestamp to pampasan table for tracking printed agreements - Update jenis handling for semporna v2 processing logic - Refactor barangkes controller eager loading for improved performance - Remove obsolete jenis migration files and consolidate schema changes - Update related models and controllers for semporna v2 compatibility --- app/Http/Controllers/BarangkesController.php | 10 +- app/Http/Controllers/PampasanController.php | 180 +++++++++++++----- app/Palsu.php | 6 +- app/Pampasan.php | 4 +- app/Support/Tawarruq.php | 3 + app/Support/v1/Penebusan.php | 13 ++ ...jenis_to_pampasan_for_semporna_records.php | 78 -------- ...on_semporna_records_jenis_to_hapuskira.php | 130 ------------- ...greement_printed_at_to_pampasan_table.php} | 28 +-- routes/web.php | 1 + 10 files changed, 174 insertions(+), 279 deletions(-) delete mode 100644 database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php delete mode 100644 database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php rename database/migrations/{2025_09_17_092001_add_jenis_column_to_palsu_table.php => 2025_09_18_141626_add_agreement_printed_at_to_pampasan_table.php} (54%) diff --git a/app/Http/Controllers/BarangkesController.php b/app/Http/Controllers/BarangkesController.php index 06ef56e..ae0f29a 100644 --- a/app/Http/Controllers/BarangkesController.php +++ b/app/Http/Controllers/BarangkesController.php @@ -38,13 +38,10 @@ class BarangkesController extends Controller 'untungonepercent', 'untungcajlain' ]) - ->when($request->filled('jenis'), function($query) use($request){ - return $query->where('jenis', $request->jenis); - }) ->when($request->filled('tarikh_mula') && $request->filled('tarikh_akhir'), function($query) use($request){ return $query->whereBetween('tarikh', [$request->tarikh_mula, $request->tarikh_akhir]); }) - ->with('tebus:norujukan'); + ->with(['tebus:norujukan', 'gadai:norujukan,nokp']); $palsu_array = $palsu_query->get()->toArray(); $pampasan_array = Pampasan::on($cawangan['mysql'])->where('kodcaw', $request->kodcaw)->get()->toArray(); @@ -59,8 +56,13 @@ class BarangkesController extends Controller // Add exists_in_tebus flag based on relationship $itemArray['gadaian_sudah_tebus'] = !is_null($item['tebus']); + // Add nokp customer from gadai relationship + $itemArray['nokp'] = $item['gadai']['nokp']; + // Remove the tebus relationship data to keep response clean unset($itemArray['tebus']); + unset($itemArray['gadai']); + return array_merge($itemArray, $additional); })->values()->toArray(); diff --git a/app/Http/Controllers/PampasanController.php b/app/Http/Controllers/PampasanController.php index 48a95c0..cdbeb86 100644 --- a/app/Http/Controllers/PampasanController.php +++ b/app/Http/Controllers/PampasanController.php @@ -6,6 +6,7 @@ use App\Cawangan; use App\Palsu; use App\Pampasan; use App\Panjar; +use App\Tebus; use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Log\Logger; @@ -13,46 +14,37 @@ use Illuminate\Support\Facades\Log; class PampasanController extends Controller { + public function terimaPampasan(Request $request) { $validated = $this->validate($request, [ 'norujukan' => 'required|string', - 'baucerno' => 'required|string', 'kodcaw' => 'required|string', 'jumlah_pampasan' => 'required|numeric', - 'denominasi' => 'nullable|array', + 'denominasi' => 'required|array', 'teller' => 'required|string', ]); try { - $cawangan = Cawangan::on('mysql7')->where('kodcaw', $request->kodcaw)->first(); + $cawangan = $this->getCawangan($request->kodcaw); if (!$cawangan) { - return response()->json([ - 'success' => false, - 'message' => 'Cawangan tidak dijumpai untuk kodcaw: ' . $request->kodcaw, - ], 404); + return $this->errorResponse('Cawangan tidak dijumpai untuk kodcaw: ' . $request->kodcaw, 404); } - $pampasan = Pampasan::on($cawangan['mysql'])->create([ - 'norujukan' => $validated['norujukan'], - 'baucerno' => $validated['baucerno'], - 'kodcaw' => $validated['kodcaw'], + $pampasan = Pampasan::on($cawangan['mysql']) + ->where('norujukan', $validated['norujukan']) + ->first(); + + $pampasan->update([ 'jumlah_pampasan' => $validated['jumlah_pampasan'], 'denominasi' => isset($validated['denominasi']) ? json_encode($validated['denominasi']) : null, 'teller' => $validated['teller'], ]); - return response()->json([ - 'success' => true, - 'message' => 'Pampasan berjaya dibayar.', - 'data' => $pampasan, - ], 201); + return $this->successResponse('Pampasan berjaya dibayar.', $pampasan, 201); } catch (\Exception $e) { - return response()->json([ - 'success' => false, - 'message' => 'Database error: ' . $e->getMessage(), - ], 500); + return $this->errorResponse('Database error: ' . $e->getMessage(), 500); } } @@ -60,7 +52,13 @@ class PampasanController extends Controller { $norujukan = $request->norujukan; - $cawangan = Cawangan::on('mysql7')->where('kodcaw', $request->kodcaw)->first(); + $cawangan = $this->getCawangan($request->kodcaw); + + if (!$cawangan) { + return $this->errorResponse('Cawangan tidak dijumpai untuk kodcaw: ' . $request->kodcaw, 404); + } + + $tebus = Tebus::on($cawangan['mysql'])->where('norujukan', $norujukan)->first(); $pampasan = Pampasan::on($cawangan['mysql'])->where("norujukan", $norujukan)->first(); @@ -73,40 +71,128 @@ class PampasanController extends Controller ->where('norujukan', $norujukan) ->update(['status' => 1]); - Panjar::on($cawangan['mysql']) - ->create([ - 'tarikh' => Carbon::now()->toDateString(), - 'deskripsi' => 'BAYARAN PAMPASAN' . '(' . $pampasan->norujukan . ')', - 'bayaran' => $pampasan->jumlah_pampasan, - 'tag' => 1, - 'kategori' => 'Belanja AM', - 'id' => $pampasan->teller, - 'bakiperubatan' => $request->bakiperubatan, - 'nobaucer' => $pampasan->baucherno, - 'nobil' => Carbon::now()->format('dmy'), - 'tuntutoleh' => $pampasan->teller, + return $this->successResponse('Status Pampasan berjaya dituntut.', $pampasan, 201); + } + + public function getPampasan(Request $request) + { + $cawangan_connection = Cawangan::where('kodcaw', $request->kodcaw)->first()->mysql; + + $pampasan = Pampasan::on($cawangan_connection) + ->when($request->filled('norujukan'), function ($query) use ($request) { + return $query->where('norujukan', $request->norujukan); + }) + ->get(); + + + return $this->successResponse('Senarai pampasan', $pampasan, 201); + } + + public function updateAgreementPrintedAt(Request $request) + { + $validated = $this->validate($request, [ + 'norujukan' => 'required|string', + 'kodcaw' => 'required|string', + ]); + + try { + $cawangan = $this->getCawangan($validated['kodcaw']); + + if (!$cawangan) { + return $this->errorResponse('Cawangan tidak dijumpai untuk kodcaw: ' . $validated['kodcaw'], 404); + } + + $pampasan = Pampasan::on($cawangan['mysql'])->where('norujukan', $validated['norujukan'])->first(); + + if (!$pampasan) { + return $this->errorResponse('Pampasan tidak dijumpai untuk norujukan: ' . $validated['norujukan'], 404); + } + + $pampasan->agreement_printed_at = Carbon::now(); + $pampasan->save(); + + return $this->successResponse('Agreement printed timestamp berjaya dikemaskini.', $pampasan, 200); + } catch (\Exception $e) { + return $this->errorResponse('Database error: ' . $e->getMessage(), 500); + } + } + + public function initiatePampasan(Request $request) + { + $validated = $this->validate($request, [ + 'norujukan' => 'required|string', + 'kodcaw' => 'required|string', + 'teller' => 'required|string', + 'baucerno' => 'required|string', + ]); + + try { + $cawangan = $this->getCawangan($validated['kodcaw']); + + if (!$cawangan) { + return $this->errorResponse('Cawangan tidak dijumpai untuk kodcaw: ' . $validated['kodcaw'], 404); + } + + // Find the palsu record + $palsu = Palsu::on($cawangan['mysql'])->where('norujukan', $validated['norujukan'])->first(); + + if (!$palsu) { + return $this->errorResponse('Barang kes tidak dijumpai untuk norujukan: ' . $validated['norujukan'], 404); + } + + // Check if pampasan already exists for this norujukan + $existingPampasan = Pampasan::on($cawangan['mysql'])->where('norujukan', $validated['norujukan'])->first(); + + if ($existingPampasan) { + // If pampasan exists, just update the agreement_printed_at + $existingPampasan->agreement_printed_at = Carbon::now(); + $existingPampasan->save(); + + return $this->successResponse('Agreement printed timestamp berjaya dikemaskini untuk pampasan sedia ada.', $existingPampasan, 200); + } + + // Create new pampasan record based on palsu data + $pampasan = Pampasan::on($cawangan['mysql'])->create([ + 'norujukan' => $palsu->norujukan, + 'baucerno' => $validated['baucerno'], + 'kodcaw' => $palsu->kodcaw, + 'jumlah_pampasan' => $palsu->nilaimarhun, + 'teller' => $validated['teller'], + 'status' => 0, + 'agreement_printed_at' => Carbon::now(), ]); - return response()->json([ - 'success' => true, - 'message' => 'Status Pampasan berjaya dituntut.', - 'data' => $pampasan, - ], 201); + return $this->successResponse('Pampasan berjaya daftar dari rekod barang kes.', $pampasan, 201); + } catch (\Exception $e) { + return $this->errorResponse('Database error: ' . $e->getMessage(), 500); + } } - public function getPampasan() + private function getCawangan($kodcaw) { - $pampasan = Pampasan::on('mysql71')->get(); + $cawangan = Cawangan::on('mysql7')->where('kodcaw', $kodcaw)->first(); - return response()->json([ - 'success' => true, - 'message' => 'Status Pampasan berjaya dituntut.', - 'data' => $pampasan, - ], 201); + if (!$cawangan) { + return null; + } + + return $cawangan; } - public function getPampasanByNoRujukan() + private function errorResponse($message, $statusCode = 404) { - + return response()->json([ + 'success' => false, + 'message' => $message, + ], $statusCode); + } + + private function successResponse($message, $data = null, $statusCode = 200) + { + return response()->json([ + 'success' => true, + 'message' => $message, + 'data' => $data, + ], $statusCode); } } diff --git a/app/Palsu.php b/app/Palsu.php index 98d6f3b..e03ff42 100644 --- a/app/Palsu.php +++ b/app/Palsu.php @@ -31,7 +31,6 @@ class Palsu extends Model 'untungonepercent', 'untungcajlain', 'pembiayaan', - 'jenis', 'status', ]; @@ -95,4 +94,9 @@ class Palsu extends Model { return $this->hasOne(Tebus::class, 'norujukan', 'norujukan'); } + + public function gadai(): HasOne + { + return $this->hasOne(Gadai::class, 'norujukan', 'norujukan'); + } } diff --git a/app/Pampasan.php b/app/Pampasan.php index 5aed11d..9bc0f0b 100644 --- a/app/Pampasan.php +++ b/app/Pampasan.php @@ -20,8 +20,10 @@ class Pampasan extends Model 'baucerno', 'kodcaw', 'jumlah_pampasan', + 'denominasi', 'teller', - 'nota' + 'nota', + 'agreement_printed_at', ]; /** diff --git a/app/Support/Tawarruq.php b/app/Support/Tawarruq.php index be5506f..785a302 100644 --- a/app/Support/Tawarruq.php +++ b/app/Support/Tawarruq.php @@ -2,11 +2,14 @@ namespace App\Support; +use App\Cawangan; use App\KadarUpah; +use App\Pampasan; use App\Support\v1\GadaiV1 as Version1Gadai; use App\Services\MasterServices; use App\Support\v1\Penebusan; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request as HttpRequest; use Illuminate\Support\Facades\Log; diff --git a/app/Support/v1/Penebusan.php b/app/Support/v1/Penebusan.php index f85126f..00bde97 100644 --- a/app/Support/v1/Penebusan.php +++ b/app/Support/v1/Penebusan.php @@ -15,6 +15,8 @@ use App\KomuditiPurchase; use App\KomuditiTransaksi; use App\Marhun; use App\Moratorium; +use App\Palsu; +use App\Pampasan; use App\Support\OnePercent; use App\Support\Tawarruq; use App\Support\v1\Calculation as V1Calculation; @@ -479,6 +481,17 @@ class Penebusan $upah_rebet_sebenar = $harga_tebus - $gadai['bakipjm']; } + $isPampasan = Pampasan::on($cawangan['mysql'])->where('norujukan', $request->norujukan)->exists(); + + if($isPampasan){ + $barang_kes = Palsu::on($cawangan['mysql'])->where('norujukan', $norujukan)->first(); + + $harga_tebus = $barang_kes->untung + $barang_kes->pembiayaan; + $upah_tebus = $barang_kes->untung; + $upah_rebet = $this->kiraUpahRebetSebenar($kodcaw,$norujukan); + $upah_rebet_sebenar = $barang_kes->untung; + $rebet = $gadai['hargajualan'] - $harga_tebus; + } $create_tebus = Tebus::on($cawangan['mysql'])->create([ 'kodcaw'=> $kodcaw, diff --git a/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php b/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php deleted file mode 100644 index 424a87b..0000000 --- a/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php +++ /dev/null @@ -1,78 +0,0 @@ -getSempornaRecords(); - - // Update jenis to 'pampasan' for Semporna records in mysql34 (Semporna branch) - try { - $updated = DB::connection('mysql34')->table('palsu') - ->whereIn('norujukan', $semporna_records) - ->update(['jenis' => 'pampasan']); - - echo "Updated {$updated} Semporna records with jenis = 'pampasan'\n"; - } catch (\Exception $e) { - echo "Error updating Semporna records: " . $e->getMessage() . "\n"; - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - $semporna_records = $this->getSempornaRecords(); - - // Revert jenis to null for Semporna records - try { - $reverted = DB::connection('mysql34')->table('palsu') - ->whereIn('norujukan', $semporna_records) - ->update(['jenis' => null]); - - echo "Reverted {$reverted} Semporna records jenis to null\n"; - } catch (\Exception $e) { - echo "Error reverting Semporna records: " . $e->getMessage() . "\n"; - } - } -} diff --git a/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php b/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php deleted file mode 100644 index 44594a3..0000000 --- a/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php +++ /dev/null @@ -1,130 +0,0 @@ -select('SELECT 1'); - return true; - } catch (\Exception $e) { - return false; - } - }); - - return $db_connection ? array_values($db_connection) : []; - } - - /** - * Semporna norujukan records to exclude - */ - private function getSempornaRecords(): array - { - return [ - '011237240808-0003', - '011237240719-0015', - '011237240806-0011', - '011237240828-0001', - '011237240904-0007', - '011237240904-0008', - '011237240904-0009', - '011237240719-0023', - '011237240719-0024', - '011237240719-0025', - '011237240618-0026', - '011237240719-0027', - '011237240719-0028', - '011237240618-0020', - '011237240719-0030', - '011237240618-0029', - '011237240731-0026', - '011237240912-0009' - ]; - } - - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - $db_connection = $this->getActiveDB(); - $semporna_records = $this->getSempornaRecords(); - - foreach ($db_connection as $dbase) { - try { - if ($dbase == 'mysql34') { - // For Semporna (mysql34), update only non-Semporna records to 'hapuskira' - $updated = DB::connection($dbase)->table('palsu') - ->whereNotIn('norujukan', $semporna_records) - ->update(['jenis' => 'hapuskira']); - - if ($updated > 0) { - echo "Updated {$updated} non-Semporna records in {$dbase} to jenis = 'hapuskira'\n"; - } - } else { - // For all other databases, update all records to 'hapuskira' - $updated = DB::connection($dbase)->table('palsu') - ->update(['jenis' => 'hapuskira']); - - if ($updated > 0) { - echo "Updated {$updated} records in {$dbase} to jenis = 'hapuskira'\n"; - } - } - } catch (\Exception $e) { - echo "Error updating {$dbase}: " . $e->getMessage() . "\n"; - } - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - $db_connection = $this->getActiveDB(); - - foreach ($db_connection as $dbase) { - try { - // Revert all jenis values to null except Semporna records which should remain 'pampasan' - if ($dbase == 'mysql34') { - $semporna_records = $this->getSempornaRecords(); - $reverted = DB::connection($dbase)->table('palsu') - ->whereNotIn('norujukan', $semporna_records) - ->update(['jenis' => null]); - - if ($reverted > 0) { - echo "Reverted {$reverted} non-Semporna records in {$dbase} jenis to null\n"; - } - } else { - $reverted = DB::connection($dbase)->table('palsu') - ->update(['jenis' => null]); - - if ($reverted > 0) { - echo "Reverted {$reverted} records in {$dbase} jenis to null\n"; - } - } - } catch (\Exception $e) { - echo "Error reverting {$dbase}: " . $e->getMessage() . "\n"; - } - } - } -} diff --git a/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php b/database/migrations/2025_09_18_141626_add_agreement_printed_at_to_pampasan_table.php similarity index 54% rename from database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php rename to database/migrations/2025_09_18_141626_add_agreement_printed_at_to_pampasan_table.php index a9de2a2..01e2154 100644 --- a/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php +++ b/database/migrations/2025_09_18_141626_add_agreement_printed_at_to_pampasan_table.php @@ -5,7 +5,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\DB; -class AddJenisColumnToPalsuTable extends Migration +class AddAgreementPrintedAtToPampasanTable extends Migration { /** * Get active database connections @@ -16,17 +16,13 @@ class AddJenisColumnToPalsuTable extends Migration $db_connection = array_filter($config_db, function($connection) { try { - if ($connection == 'mysql7') { - return false; - } - + if ($connection === 'mysql7') return false; // ikut pattern sedia ada DB::connection($connection)->select('SELECT 1'); return true; } catch (\Exception $e) { return false; } }); - return $db_connection ? array_values($db_connection) : []; } @@ -37,12 +33,10 @@ class AddJenisColumnToPalsuTable extends Migration */ public function up() { - $db_connection = $this->getActiveDB(); - - foreach ($db_connection as $dbase) { - Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { - if (!Schema::connection($dbase)->hasColumn('palsu', 'jenis')) { - $table->string('jenis', 50)->nullable()->comment('Jenis/Type classification'); + foreach ($this->getActiveDB() as $dbase) { + Schema::connection($dbase)->table('pampasan', function (Blueprint $table) use ($dbase) { + if (!Schema::connection($dbase)->hasColumn('pampasan', 'agreement_printed_at')) { + $table->timestamp('agreement_printed_at')->nullable()->comment('Timestamp when agreement was printed'); } }); } @@ -55,12 +49,10 @@ class AddJenisColumnToPalsuTable extends Migration */ public function down() { - $db_connection = $this->getActiveDB(); - - foreach ($db_connection as $dbase) { - Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { - if (Schema::connection($dbase)->hasColumn('palsu', 'jenis')) { - $table->dropColumn('jenis'); + foreach ($this->getActiveDB() as $dbase) { + Schema::connection($dbase)->table('pampasan', function (Blueprint $table) use ($dbase) { + if (Schema::connection($dbase)->hasColumn('pampasan', 'agreement_printed_at')) { + $table->dropColumn('agreement_printed_at'); } }); } diff --git a/routes/web.php b/routes/web.php index fcb9b81..fb4d452 100644 --- a/routes/web.php +++ b/routes/web.php @@ -380,6 +380,7 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->post('DeletePanjar/{kodcaw}',['uses'=>'PanjarController@delete']); //API PAMPASAN GUNA PANJAR + $router->post('pampasan/initiatePampasan',['uses'=>'PampasanController@initiatePampasan']); $router->post('pampasan/terimaPampasan',['uses'=>'PampasanController@terimaPampasan']); $router->put('pampasan/updateStatusPampasan', ['uses' => 'PampasanController@updateStatusPampasan']); $router->get('pampasan', ['uses' => 'PampasanController@getPampasan']); From 3b44cec5a2e503ac38cbd631e4d196f6f1b45d89 Mon Sep 17 00:00:00 2001 From: Ain Izazi Date: Mon, 25 Aug 2025 09:40:16 +0800 Subject: [PATCH 06/16] add di function customer nota arcc --- app/Http/Controllers/CallCenterController.php | 75 ++++++++++++++++++- app/Http/Controllers/CustomerController.php | 20 +++++ ...120937_add_nota_arcc_to_customer_table.php | 32 ++++++++ routes/web.php | 6 +- 4 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2025_08_10_120937_add_nota_arcc_to_customer_table.php diff --git a/app/Http/Controllers/CallCenterController.php b/app/Http/Controllers/CallCenterController.php index 543ea2d..4a8d890 100644 --- a/app/Http/Controllers/CallCenterController.php +++ b/app/Http/Controllers/CallCenterController.php @@ -1649,4 +1649,77 @@ class CallCenterController extends Controller -} + + public function customerUpdate($nokp,Request $request){ + $poskod = Poskod::on('mysql7')->where('poskod','=',$request->poskod)->first(); + $customer_update = Customer::on('mysql7') + ->where('kplama','=',$nokp) + ->orWhere('kpbaru','=',$nokp) + ->update(array( + 'nota_arcc'=>$request->nota_arcc, + )); + + return response()->json($customer_update, 200); + } + + + public function customerUpdateKaunter($nokp,$kodcaw, Request $request){ + $current = Carbon::now(); + + DB::connection('mysql7')->beginTransaction(); + + try{ + $poskod = Poskod::on('mysql7')->where('poskod','=',$request->poskod)->first(); + + $customer_info = DB::connection('mysql7')->table('customer') + ->select('kodcaw','kodkerja','nota_pekerjaan','nota_arcc','tarikhdaftar','nopelanggan','kpbaru','kplama','nama','t_lahir','jantina','poskod') + ->where('kplama','=',$nokp) + ->orWhere('kpbaru','=',$nokp) + ->get()->toArray(); + + + $old_data = json_encode($customer_info); + + $customer_update = Customer::on('mysql7') + ->where('kplama','=',$nokp) + ->orWhere('kpbaru','=',$nokp) + ->update(array( + 'nota_arcc' => $request->nota_arcc, + )); + + if($customer_update) + { + $customer_info_new = DB::connection('mysql7')->table('customer') + ->select('kodcaw','kodkerja','nota_pekerjaan','nota_arcc','tarikhdaftar','nopelanggan','kpbaru','kplama','nama','t_lahir','jantina','alamat1','poskod') + ->where('kplama','=',$nokp) + ->orWhere('kpbaru','=',$nokp) + ->get()->toArray(); + + $new_data = json_encode($customer_info_new); + + $audit_customer = DB::connection('mysql7') + ->table('audit_customer') + ->insert([ + 'username' => $request->namateller, + 'old_data' => $old_data, + 'new_data' => $new_data, + 'kodcaw' => $customer_info[0]->kodcaw, + 'created_at' => Carbon::now()->toDateTimeString(), + 'updated_at' => Carbon::now()->toDateTimeString(), + 'customer_name' => $customer_info[0]->nama, + 'customer_nokp' => $nokp, + ]); + } + + DB::connection('mysql7')->commit(); + + return response()->json($customer_update, 200); + + }catch (\Exception $e) { + DB::connection('mysql7')->rollback(); + return response()->json($e->getMessage(),400); + + } + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 46c1ae3..6080cac 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -362,6 +362,7 @@ class CustomerController extends Controller 'nota'=>$request->nota, 'kodkerja'=>$request->kodkerja, 'nota_pekerjaan'=>$request->nota_pekerjaan, + // 'nota_arcc'=>$request->nota_arcc, 'tujuangadai'=>$request->tujuangadai ]); @@ -390,6 +391,7 @@ class CustomerController extends Controller 'kodnegeri' => $poskod['kodnegeri'], 'kodkerja'=>$request->kodkerja, 'nota_pekerjaan'=>$request->nota_pekerjaan, + // 'nota_arcc'=>$request->nota_arcc, 'telefon' => $request->telefon1, 'telefon2' => $request->telefon2 )); @@ -424,6 +426,7 @@ class CustomerController extends Controller 'kodkerja' => $request->kodkerja, // 'nota_pekerjaan' => $request->nota_pekerjaan, 'nota_pekerjaan' => $request->kodkerja === '6' ? $request->nota_pekerjaan : null, + // 'nota_arcc' => $request->nota_arcc, 'noakaun' => $request->noakaun, 'nota' => $request->nota, 'alamat1' => $request->alamat, @@ -501,6 +504,7 @@ class CustomerController extends Controller 'kodbank' => $request->kodbank, 'kodkerja' => $request->kodkerja, 'nota_pekerjaan' => $request->nota_pekerjaan, + // 'nota_arcc' => $request->nota_arcc, 'noakaun' => $request->noakaun, 'nota' => $request->nota, 'nama' => $request->nama, @@ -999,4 +1003,20 @@ class CustomerController extends Controller return response()->json($results); } +// public function createNotaArcc($kodcaw, Request $request) +// { +// $current = Carbon::now(); + +// $customer = Customer::on('mysql7')->create([ +// 'kodcaw' => $kodcaw, +// 'tarikhdaftar' => $current->toDateString(), +// 'nota_arcc' => $request->nota_arcc, +// 'teller' => $request->teller, +// 'aktif' => 'A' +// ]); + +// return response()->json($customer, 201); +// } + + } diff --git a/database/migrations/2025_08_10_120937_add_nota_arcc_to_customer_table.php b/database/migrations/2025_08_10_120937_add_nota_arcc_to_customer_table.php new file mode 100644 index 0000000..b61c531 --- /dev/null +++ b/database/migrations/2025_08_10_120937_add_nota_arcc_to_customer_table.php @@ -0,0 +1,32 @@ +string('nota_arcc')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('customer', function (Blueprint $table) { + $table->dropColumn('nota_arcc'); + }); + } +} diff --git a/routes/web.php b/routes/web.php index fb4d452..d826ac1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -63,7 +63,11 @@ $router->group(['prefix'=>'api'], function () use ($router){ //arcc $router->get('customer/searchbyname',['uses'=>'CustomerController@searchByName']); // Route::get('/api/customers/searchbyname', [CustomerController::class, 'searchByName']); - + // $router->put('customers/update/{nokp}', ['uses' => 'CallCenterController@customerUpdate']); //kena tengok api ni + // $router->put('customers/update/kaunter/{nokp}/{kodcaw}', ['uses' => 'CallCenterController@customerUpdateKaunter']); + $router->put('callcenter/customers/update/{nokp}', ['uses' => 'CallCenterController@customerUpdate']); //kena tengok api ni + $router->put('callcenter/customers/update/kaunter/{nokp}/{kodcaw}', ['uses' => 'CallCenterController@customerUpdateKaunter']); + //Change Password $router->post('changepassword/{kodcaw}/{id}',['uses'=>'CustomerController@changepassword']); From 632c2b5190c203b083ef51d299df3a7a7a412d5d Mon Sep 17 00:00:00 2001 From: Nur Izzati Date: Wed, 27 Aug 2025 12:26:19 +0800 Subject: [PATCH 07/16] tambah baik laporan SA by sag --- app/Http/Controllers/StokAuditController.php | 147 +++++++++++++++++++ routes/web.php | 1 + 2 files changed, 148 insertions(+) diff --git a/app/Http/Controllers/StokAuditController.php b/app/Http/Controllers/StokAuditController.php index d0188c1..cc6129f 100644 --- a/app/Http/Controllers/StokAuditController.php +++ b/app/Http/Controllers/StokAuditController.php @@ -432,4 +432,151 @@ class StokAuditController extends Controller 'totaltunggakan'=>$totaltunggakan ?? null]; return response()->json($arrayrekod,200); } + + + public function LaporanAuditKhasByNorujukan($kodcaw, Request $request) + { + $daritempoh = $request->daritempoh; + $hinggatempoh = $request->hinggatempoh; + + $cawangan = Cawangan::on('mysql7')->where('kodcaw', '=', $request->kodcaw)->first(); + + // Ambil semua rekod gadai asas + $audit = Gadai::on($cawangan['mysql']) + ->where([ + ['tagpalsu', '=', 0], + ['tempoh', '>=', $daritempoh], + ['tempoh', '<=', $hinggatempoh], + ['sttebus', '=', ''], + ['taglel', '=', 0], + ]) + ->orderBy('norujukan', 'ASC') // susun ikut norujukan + ->get(); + + $arraynorujukan = $audit->pluck('norujukan')->toArray(); + + // Tarikh terkini ikut trans_type T + $tarikhTerkiniT = Transaction::on('mysql7') + ->select('norujukan', DB::raw('MAX(created_at) as tarikh_max')) + ->where('trans_type', 'T') + ->whereIn('norujukan', $arraynorujukan) + ->groupBy('norujukan') + ->pluck('tarikh_max', 'norujukan') + ->toArray(); + + // Tarikh terkini ikut trans_type A + $tarikhTerkiniA = Transaction::on('mysql7') + ->select('norujukan', DB::raw('MAX(created_at) as tarikh_max')) + ->where('trans_type', 'A') + ->whereIn('norujukan', $arraynorujukan) + ->groupBy('norujukan') + ->pluck('tarikh_max', 'norujukan') + ->toArray(); + + // Filter audit + $rekodaudit = $audit->filter(function ($item) use ($tarikhTerkiniT, $tarikhTerkiniA) { + $norujukan = $item->norujukan; + + $adaTebusTerkini = isset($tarikhTerkiniT[$norujukan]) && + Transaction::on('mysql7') + ->where('norujukan', $norujukan) + ->where('trans_type', 'T') + ->whereDate('created_at', '>=', date('Y-m-d', strtotime($tarikhTerkiniT[$norujukan]))) + ->exists(); + + $adaAnsuranTerkini = isset($tarikhTerkiniA[$norujukan]) && + Transaction::on('mysql7') + ->where('norujukan', $norujukan) + ->where('trans_type', 'A') + ->whereDate('created_at', '>=', date('Y-m-d', strtotime($tarikhTerkiniA[$norujukan]))) + ->exists(); + + return !$adaTebusTerkini && !$adaAnsuranTerkini; + })->values(); + + // Attach customer info + blast untuk setiap norujukan + foreach ($rekodaudit as $index => $rekod) { + $customer = Customer::on('mysql7') + ->where('kpbaru', '=', $rekod->nokp) + ->orWhere('kplama', '=', $rekod->nokp) + ->first(); + + $rekodaudit[$index]['customer'] = $customer; + + $rekodaudit[$index]['blasted'] = BlastWasap::on('mysql7') + ->where('nokp', $rekod->nokp) + ->where('norujukan', $rekod->norujukan) + ->where('kodcaw', $kodcaw) + ->first(); + + // 👉 Kira keuntungan (tunggakan sebenar) guna function + $upah = $this->kiraupahUjrahOnePercent($kodcaw, $rekod->norujukan); + $keuntungan = $upah['ujrah'] + $upah['onepercent']; + + // Save ke dalam rekod + $rekodaudit[$index]['tunggakan'] = $this->floorTo5SenFrom2dp($keuntungan); + } + + // Summary total + $summary = [ + 'totalrekod' => $rekodaudit->count(), + 'totalberat' => $rekodaudit->sum('berat'), + 'totalnilaimarhun'=> $rekodaudit->sum('nilaimarhun'), + 'totalpinjaman' => $rekodaudit->sum('pinjaman'), + 'totalbakipjm' => $rekodaudit->sum('bakipjm'), + 'totaltunggakan' => $rekodaudit->sum('tunggakan'), + ]; + + return response()->json([ + 'rekod' => $rekodaudit, + 'summary' => $summary, + ]); + } + + public function kiraupahUjrahOnePercent($kodcaw,$norujukan){ + $onepercentservices = new OnePercentServices(); + + $cawangan = Cawangan::on('mysql7') + ->where('kodcaw','=',$kodcaw) + ->first(); + + $gadai_data = Gadai::on($cawangan['mysql']) + ->where('norujukan','=',$norujukan) + ->first(); + + if($gadai_data['tempoh'] >= 12.0){ + $tempoh = 12; + }else{ + $tempoh = $gadai_data['tempoh']; + } + + $bilang_bln = $tempoh - $gadai_data['tempohbayar']; + $array_upah = $onepercentservices->kiraanKeuntunganSebenar($gadai_data['pinjaman'],$gadai_data['nilaimarhun'],$gadai_data['kadarupah'],$gadai_data['percentpinj']); + $ujrah = $bilang_bln * $array_upah['ujrah']; + $onepercent = $bilang_bln * $array_upah['onepercent']; + $onepercent_semasa = $onepercent; + $ujrah_semasa = $ujrah; + + return ['ujrah' => $ujrah_semasa, 'onepercent' => $onepercent_semasa]; + } + + // dalam Controller (private/protected) + private function floorTo5SenFrom2dp($amount) + { + // pastikan numeric + $amount = (float) $amount; + + // 1) Tukar ke sen dan buang sebarang pecahan sen (hanya baca 2 dp) + // tambah epsilon kecil untuk elak isu floating point + $cents = (int) floor($amount * 100 + 0.0000001); + + // 2) Floor ke gandaan 5 sen + $cents5 = (int) (floor($cents / 5) * 5); + + // balik ke ringgit + return $cents5 / 100; + } + + + } diff --git a/routes/web.php b/routes/web.php index d826ac1..0a028b5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -672,6 +672,7 @@ $router->group(['prefix'=>'api'], function () use ($router){ //STOKAUDITKHAS $router->get('stokauditkhas/aktif/{kodcaw}',['uses'=>'StokAuditController@LaporanAuditKhasAktif']); + $router->get('stokauditkhasbynorujukan/aktif/{kodcaw}',['uses'=>'StokAuditController@LaporanAuditKhasByNorujukan']); //API BLAST WASAP $router->post('blastwasap/{kodcaw}',['uses'=>'StokAuditController@blastwasap']); From 0a9140c85d47b7f968db5f3179daf2ef636f0d2a Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Thu, 25 Sep 2025 10:58:58 +0800 Subject: [PATCH 08/16] Enhance audit trail system for approval workflows - Add conditional audit data enrichment for specific approval actions - Implement namapelulus and norujukan tracking for pampasan approvals - Improve audit data structure handling for scalar and array values - Add user field validation with fallback defaults for audit records - Optimize approval controller with better request parameter handling --- app/Http/Controllers/KelulusanController.php | 31 ++++++++++++++++++-- app/Http/Controllers/LaporanController.php | 2 +- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/KelulusanController.php b/app/Http/Controllers/KelulusanController.php index c9c357b..a909743 100644 --- a/app/Http/Controllers/KelulusanController.php +++ b/app/Http/Controllers/KelulusanController.php @@ -96,6 +96,7 @@ class KelulusanController extends Controller { $harini = Carbon::now(); $harini = new Carbon; + $kelulusan = null; $cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first(); $pengesahan = $request->pengesahan; @@ -193,7 +194,33 @@ class KelulusanController extends Controller $audit = new Audit(); $audit->users = (isset($request->namakhazanah) ? $request->namakhazanah : ''); - $audit->actions = "Pengesahan Kelulusan 75%"; + $audit->actions = $request->actions ?? "pengesahan kelulusan 75%"; + + // Only prepare detailed audit data for Pampasan approval + if($request->actions == 'Pengesahan Pembayaran Pampasan') { + // Prepare data for audit - ensure it's an array + $auditData = []; + + // If kelulusan is a scalar (update result), create array structure + if (is_scalar($kelulusan) || is_null($kelulusan)) { + $auditData = ['update_result' => $kelulusan]; + } else { + $auditData = $kelulusan; + } + + // Add namapelulus and norujukanasal to the audit data + if(isset($request->namaoperasi)) { + $auditData['namapelulus'] = !empty($request->namaoperasi) ? $request->namaoperasi : null; + } + if(isset($request->norujukan)) { + $auditData['norujukan'] = !empty($request->norujukan) ? $request->norujukan : null; + } + } else { + // For other actions, use simple kelulusan data + $auditData = $kelulusan; + } + + $audit->new_data = json_encode($auditData); $audit->kodcaw = $kodcaw; $audit->created_at = $harini; $audit->updated_at = $harini; @@ -275,7 +302,7 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) $audit = new Audit(); $audit->users = (isset($request->teller) ? $request->teller : ''); - $audit->actions = "Minta Pengesahan kelulusan 75%"; + $audit->actions = $request->actions ?? "Minta Pengesahan kelulusan 75%"; $audit->new_data = json_encode($kelulusan); $audit->kodcaw = $kodcaw; $audit->created_at = $harini; diff --git a/app/Http/Controllers/LaporanController.php b/app/Http/Controllers/LaporanController.php index 5b6e285..82acd19 100644 --- a/app/Http/Controllers/LaporanController.php +++ b/app/Http/Controllers/LaporanController.php @@ -1244,7 +1244,7 @@ $date = new Carbon($request->tarikh); array_push($atarray,[ 'tarikh' => $tarikh, 'masa' => $masa, - 'users' => $at['users'], + 'users' => isset($at['users']) && $at['users'] !== '' ? $at['users'] : '-', 'pelulus' => isset($atnewdata['namapelulus']) ? $atnewdata['namapelulus'] : '-', 'actions' => $at['actions'], 'norujukan' => $at['norujukan'], From a858d6d59d7384989cb0886efdac9229821b33c7 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Wed, 1 Oct 2025 20:07:28 +0800 Subject: [PATCH 09/16] Add conditional peloperasi field for pampasan withdrawal approvals - Implement dynamic field assignment for Kelulusan Pengeluaran Pampasan status - Add peloperasi field only when status matches and request parameter exists - Improve data structure handling in approval creation workflow - Enhance conditional logic for pampasan-specific approval requirements --- app/Http/Controllers/KelulusanController.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/KelulusanController.php b/app/Http/Controllers/KelulusanController.php index a909743..c663000 100644 --- a/app/Http/Controllers/KelulusanController.php +++ b/app/Http/Controllers/KelulusanController.php @@ -256,9 +256,7 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) if($roles == "khazanah") { - $kelulusan=Mohon::on($cawangan['mysql']) - ->create([ - + $createData = [ 'tarikh'=> $harini->toDateString(), 'norujukan'=> $norujukan, 'siri' => $request->siri, @@ -272,10 +270,14 @@ public function create(REQUEST $request,$kodcaw,$norujukan,$roles) 'jenistebus' => $request->jenistebus, 'teller' => $request->teller, 'pelulus' => ($request->pelulus) ? $request->pelulus : '' + ]; + // Add peloperasi if status is Kelulusan Pengeluaran Pampasan + if($request->status == 'Kelulusan Pengeluaran Pampasan' && isset($request->peloperasi)) { + $createData['peloperasi'] = $request->peloperasi; + } - - ]); + $kelulusan=Mohon::on($cawangan['mysql'])->create($createData); } else if($roles == "operasi") { From 642d9f01bb1d1ccf75fb4e4892aa840744db3de8 Mon Sep 17 00:00:00 2001 From: hafifierahman Date: Wed, 1 Oct 2025 21:35:44 +0800 Subject: [PATCH 10/16] fix backdate stock audit that exceed 12 months --- app/Http/Controllers/BackupStokAuditController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/BackupStokAuditController.php b/app/Http/Controllers/BackupStokAuditController.php index 191806e..fb56b2a 100644 --- a/app/Http/Controllers/BackupStokAuditController.php +++ b/app/Http/Controllers/BackupStokAuditController.php @@ -331,7 +331,7 @@ class BackupStokAuditController extends Controller } public function kiraupahTawarruqStokAudit($tempoh,$tempohbayar,$kadarupah,$bakipinjaman){ - + $tempoh = ($tempoh > 12) ? 12 : $tempoh; $bilang_bln = $tempoh - $tempohbayar; if($bilang_bln > 12){ @@ -458,6 +458,7 @@ class BackupStokAuditController extends Controller public function kiraupahTawarruqStokAuditUjrahOnePercent($tempoh,$tempohbayar,$kadarupah,$bakipinjaman,$nilaimarhun,$margin_semasa){ $onepercentservices = new V2Calculation(); $upah = $onepercentservices->kiraanKeuntunganRebet($bakipinjaman,$nilaimarhun,$kadarupah,$margin_semasa); + $tempoh = ($tempoh > 12) ? 12 : $tempoh; $bilang_bln = $tempoh - $tempohbayar; $keuntungan_semasa = $bilang_bln * $upah['onepercent']; $ujrah_semasa = $bilang_bln * $upah['ujrah']; From e320ac8219715295e5458913812a35efc13b2824 Mon Sep 17 00:00:00 2001 From: hafifierahman Date: Sat, 4 Oct 2025 21:24:50 +0800 Subject: [PATCH 11/16] added customer info lelong for arrahnpay --- .../TransactionOnlineController.php | 48 +++++++++++++++++-- routes/web.php | 1 + 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/TransactionOnlineController.php b/app/Http/Controllers/TransactionOnlineController.php index 92b6e6a..dc93906 100644 --- a/app/Http/Controllers/TransactionOnlineController.php +++ b/app/Http/Controllers/TransactionOnlineController.php @@ -8,6 +8,7 @@ use App\Cawangan; use App\Gadai; use App\GlDetail; use App\Http\Controllers\TebusController as TebusController; +use App\Lelong; use App\Services\Loggers\OnlineTransactionLoggerService; use App\Services\OnePercentServices; use App\Support\v2\Calculation; @@ -767,8 +768,49 @@ class TransactionOnlineController extends Controller return 'rejected'; } } - - - + public function CustomerInfoLelong(Request $request){ + $cawangan_all = Cawangan::on('mysql7')->get(); + $totalBakiLelong = 0; + $totalRugiLelong = 0; + + foreach ($cawangan_all as $index => $cawangan) { + $gadai = Gadai::on($cawangan['mysql']) + ->where([['sttebus', '=', ''], ['nokp', '=', $request->ic]]) + ->orderBy('t_gadai', 'desc') + ->get()->toArray(); + + if (sizeof($gadai) != 0) { + foreach ($gadai as $gad) { + $bakilelong = Lelong::on($cawangan['mysql']) + ->where(function($query) { + $query->whereNull('trkhtuntut') + ->orWhere('trkhtuntut', '=', ''); + }) + ->where('baki', '>=', 0) + ->sum('baki'); + + $rugilelong = Lelong::on($cawangan['mysql']) + ->where(function($query) { + $query->whereNull('trkhtuntut') + ->orWhere('trkhtuntut', '=', ''); + }) + ->where('baki','<',0) + ->sum('baki'); + } + + $totalBakiLelong += $bakilelong; + $totalRugiLelong += $rugilelong; + } + } + + return response()->json([ + 'success' => true, + 'message' => 'Data retrieved successfully', + 'data' => [ + 'bakilelong' => $totalBakiLelong, + 'rugilelong' => $totalRugiLelong, + ] + ], 200); + } } diff --git a/routes/web.php b/routes/web.php index 0a028b5..2b27708 100644 --- a/routes/web.php +++ b/routes/web.php @@ -794,6 +794,7 @@ $router->group(['prefix'=>'portal'], function () use ($router){ $router->get('transaksipelanggan/upah',['uses'=>'TransactionController@TransaksiUpah']); $router->get('searchsagonline',['uses'=>'TransactionOnlineController@searchSAGOnline']); $router->get('customer/info',['uses'=>'TransactionOnlineController@CustomerInfo']); + $router->get('customer/info/lelong',['uses'=>'TransactionOnlineController@CustomerInfoLelong']); }); $router->group(['prefix'=>'admin'], function () use ($router){ From 83228e8b2ed3148ce05aac786f11c118a2ff1cad Mon Sep 17 00:00:00 2001 From: Nur Izzati Date: Sun, 5 Oct 2025 09:18:47 +0800 Subject: [PATCH 12/16] tambah t_lelong dlm gadai --- app/Http/Controllers/GadaiController.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/GadaiController.php b/app/Http/Controllers/GadaiController.php index 81bc8e9..71f3863 100644 --- a/app/Http/Controllers/GadaiController.php +++ b/app/Http/Controllers/GadaiController.php @@ -3871,11 +3871,13 @@ class GadaiController extends Controller public function updateTagLelong(Request $request){ $norujukan = $request->norujukan; $kodcaw = $request->kodcaw; + $t_lelong = $request->t_lelong; $cawangan = Cawangan::on('mysql7')->where('kodcaw',$request->kodcaw)->first(); $updateTag = Gadai::on($cawangan->mysql)->where('norujukan',$norujukan)->update([ - 'taglel'=>1 + 'taglel'=>1, + 't_lelong' => $t_lelong, ]); return response()->json('success'); @@ -3888,7 +3890,8 @@ class GadaiController extends Controller $cawangan = Cawangan::on('mysql7')->where('kodcaw',$request->kodcaw)->first(); $updateTag = Gadai::on($cawangan->mysql)->where('norujukan',$norujukan)->update([ - 'taglel'=>0 + 'taglel'=>0, + 't_lelong' => null, ]); return response()->json('success'); From 9c5b0414979df3a1ad2f61d4d2fa7bc2efb3ac40 Mon Sep 17 00:00:00 2001 From: Hafifie PKB Date: Sun, 5 Oct 2025 09:59:37 +0800 Subject: [PATCH 13/16] fix specific norujukan --- app/Http/Controllers/TransactionOnlineController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/TransactionOnlineController.php b/app/Http/Controllers/TransactionOnlineController.php index dc93906..ebaade7 100644 --- a/app/Http/Controllers/TransactionOnlineController.php +++ b/app/Http/Controllers/TransactionOnlineController.php @@ -776,7 +776,7 @@ class TransactionOnlineController extends Controller foreach ($cawangan_all as $index => $cawangan) { $gadai = Gadai::on($cawangan['mysql']) - ->where([['sttebus', '=', ''], ['nokp', '=', $request->ic]]) + ->where('nokp', '=', $request->ic) ->orderBy('t_gadai', 'desc') ->get()->toArray(); @@ -787,6 +787,7 @@ class TransactionOnlineController extends Controller $query->whereNull('trkhtuntut') ->orWhere('trkhtuntut', '=', ''); }) + ->where('norujukan', '=' ,$gad['norujukan']) ->where('baki', '>=', 0) ->sum('baki'); @@ -795,6 +796,7 @@ class TransactionOnlineController extends Controller $query->whereNull('trkhtuntut') ->orWhere('trkhtuntut', '=', ''); }) + ->where('norujukan', '=' ,$gad['norujukan']) ->where('baki','<',0) ->sum('baki'); } From 13a15c354f977edaab35ccfd1e6cecceb9d9bb2a Mon Sep 17 00:00:00 2001 From: Ain Izazi Date: Sun, 5 Oct 2025 11:43:15 +0800 Subject: [PATCH 14/16] function barangkes di adminv2 --- app/Http/Controllers/BarangkesController.php | 77 ++++++++++++++++++- app/Http/Controllers/CustomerController.php | 80 ++++++++++++++++---- app/Palsu.php | 1 + routes/web.php | 19 +++-- 4 files changed, 155 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/BarangkesController.php b/app/Http/Controllers/BarangkesController.php index ae0f29a..4008d14 100644 --- a/app/Http/Controllers/BarangkesController.php +++ b/app/Http/Controllers/BarangkesController.php @@ -8,11 +8,13 @@ use App\Cawangan; use App\LookupAlasan; use App\Pampasan; use App\Palsu; +use App\Gadai; use Illuminate\Http\Request; use Carbon\Carbon; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Log; class BarangkesController extends Controller { @@ -89,4 +91,77 @@ class BarangkesController extends Controller return response()->json($filteredResults); } -} + + public function store(Request $request) //cara fifi ajar + { + + $current = Carbon::now(); + $kodcaw = $request->kodcaw; + $cawangan = Cawangan::on('mysql7') + ->where('kodcaw', $kodcaw) + ->first(); + + $insert = Palsu::on($cawangan['mysql'])->create([ + 'kodcaw' => $request->kodcaw, + 'tarikh' => $current->toDateString(), + 'norujukan' => $request->norujukan, + 'teller' => $request->teller, + 'nota' => $request->nota ? $request->nota : '', + 'pembiayaan' => $request->pinjaman, + 'nilaimarhun' => $request->nilaimarhun, + 'jbg' => $request->jbg, + 'untung' => $request->tunggakan, + 'untungonepercent' => $request->tunggakanonepercent, + 'untungcajlain' => $request->tunggakanujrah, + ]); + + // return $insert; + + return response()->json([ + 'success' => true, + 'message' => 'Barang kes berjaya didaftar', + 'data' => $insert + ], 201); + } + + public function update(Request $request) + { + + $current = Carbon::now(); + $kodcaw = $request->kodcaw; + Log::info($request->all()); + + // Cari connection cawangan + $cawangan = Cawangan::on('mysql7') + ->where('kodcaw', $kodcaw) + ->first(); + + if (!$cawangan) { + return response()->json([ + 'success' => false, + 'message' => 'Cawangan tidak dijumpai', + ], 404); + } + + // Update direct (ikut norujukan) + $palsu = palsu::on($cawangan['mysql']) + ->where('norujukan', $request->norujukan) + ->update([ + 'kodcaw' => $request->kodcaw, + 'tarikh' => $request->tarikh, + 'teller' => $request->teller, + 'nota' => $request->nota ?? '', + 'pembiayaan' => $request->pinjaman, + 'nilaimarhun' => $request->nilaimarhun, + 'jbg' => $request->jbg, + 'untung' => $request->tunggakan, + 'untungonepercent' => $request->tunggakanonepercent, + 'untungcajlain' => $request->tunggakanujrah, + ]); + + return response()->json([ + 'success' => $palsu ? true : false, + 'message' => $palsu ? 'Rekod gadai berjaya dikemaskini' : 'Rekod tidak dijumpai', + ], 200); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 6080cac..c19232b 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -14,6 +14,7 @@ use App\Blacklist; use App\AuditCustomer; use Illuminate\Http\Request; use App\TuntutBaki; +use Illuminate\Support\Facades\Auth; use Carbon\Carbon; use Illuminate\Support\Facades\Log; @@ -904,6 +905,69 @@ class CustomerController extends Controller return response()->json($customer); } +public function AdminsearchCustomerBySAG(Request $request) +{ + // Ambil kodcaw dari user login + $kodcaw = $request->kodcaw; + // $norujukan = $request->input('norujukan'); + + // Cari connection untuk cawangan + $cawangan = Cawangan::on('mysql7')->where('kodcaw', $kodcaw)->first(); + if (!$cawangan) { + return response()->json([], 404); + } + + $gadai = optional(Gadai::on($cawangan['mysql'])->where('norujukan',$request->norujukan)->first())->toArray() ?? []; + + if(!empty($gadai)){ + $customer = optional(Customer::on('mysql7')->where(function ($query) use ($gadai) { + $query->where('kpbaru',$gadai['nokp']) + ->orWhere('kplama',$gadai['nokp']); + })->first())->toArray() ?? []; + }else{ + return response()->json(['success' => false,'message' => 'norujukan tidak dijumpainya'], 404); + } + + // cara fifi ajar + $result = [[ + 'id' => $customer['id'], + 'kodcaw' => $gadai['kodcaw'], + 'norujukan' => $gadai['norujukan'], + 'teller' => $gadai['teller'], + 'nota' => $customer['nota'], + 'pinjaman' => $gadai['pinjaman'], + 'nilaimarhun' => $gadai['nilaimarhun'], + 'jbg' => $gadai['jbg'], + 'tunggakan' => $gadai['tunggakan'], + 'tunggakanonepercent' => $gadai['tunggakanonepercent'], + 'tunggakanujrah' => $gadai['tunggakanujrah'], + 'nama' => $customer['nama'], + 'kplama' => $customer['kplama'], + 'kpbaru' => $customer['kpbaru'], + ]]; + + // saya buat sendiri + // Join customer + gadai ikut nokp + // $result = DB::connection($cawangan['mysql']) + // ->table('gadai') + // ->join('online_arrahn.customer as c', function($join) { + // $join->on('gadai.nokp', '=', 'c.kpbaru') + // ->orOn('gadai.nokp', '=', 'c.kplama'); + // }) + // ->where('norujukan', $request->norujukan) + // ->select( + // 'id', + // 'gadai.kodcaw','gadai.norujukan','gadai.teller', + // 'c.nota','gadai.pinjaman','gadai.nilaimarhun','gadai.jbg', + // 'gadai.tunggakan','gadai.tunggakanonepercent','gadai.tunggakanujrah', + // 'c.nama','c.kpbaru','c.kplama' + // ) + // ->take(5) + // ->get(); + + return response()->json($result); +} + public function changepassword(Request $request, $kodcaw, $id) { $current = Carbon::now(); @@ -1003,20 +1067,4 @@ class CustomerController extends Controller return response()->json($results); } -// public function createNotaArcc($kodcaw, Request $request) -// { -// $current = Carbon::now(); - -// $customer = Customer::on('mysql7')->create([ -// 'kodcaw' => $kodcaw, -// 'tarikhdaftar' => $current->toDateString(), -// 'nota_arcc' => $request->nota_arcc, -// 'teller' => $request->teller, -// 'aktif' => 'A' -// ]); - -// return response()->json($customer, 201); -// } - - } diff --git a/app/Palsu.php b/app/Palsu.php index e03ff42..00ce962 100644 --- a/app/Palsu.php +++ b/app/Palsu.php @@ -22,6 +22,7 @@ class Palsu extends Model protected $fillable = [ 'recno', 'kodcaw', + 'tarikh', 'norujukan', 'teller', 'nota', diff --git a/routes/web.php b/routes/web.php index 2b27708..0f81536 100644 --- a/routes/web.php +++ b/routes/web.php @@ -56,12 +56,13 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->put('customers/update/khazanah/{nokp}', ['uses' => 'CustomerController@customerUpdateKhazanah']); $router->get('customers/laporan/{kodcaw}/{tarikh}',['uses'=>'CustomerController@getLaporanCustomers']); $router->get('customers/latest/{kodcaw}',['uses'=>'CustomerController@getLatestCustomer']); - $router->put('customers/information/update/admin', ['uses' => 'CustomerController@customerUpdateAdmin']); + $router->put('customers/information/update/admin', ['uses' => 'CustomerController@customerUpdateAdmin']); //blh refer sini izazi $router->get('admin/customers/nokp/search',['uses'=>'CustomerController@showOneCustomerByICAdmin']); $router->get('customer/blacklist',['uses'=>'CustomerController@blacklistCustomer']); $router->get('customer/eachcawangan/{ic}',['uses'=>'CustomerController@showCustomerByEachCawangan']); //arcc $router->get('customer/searchbyname',['uses'=>'CustomerController@searchByName']); + $router->get('customer/searchbygadai/{kodcaw}/{norujukan}',['uses'=>'CustomerController@AdminsearchGadai']); // Route::get('/api/customers/searchbyname', [CustomerController::class, 'searchByName']); // $router->put('customers/update/{nokp}', ['uses' => 'CallCenterController@customerUpdate']); //kena tengok api ni // $router->put('customers/update/kaunter/{nokp}/{kodcaw}', ['uses' => 'CallCenterController@customerUpdateKaunter']); @@ -87,7 +88,7 @@ $router->group(['prefix'=>'api'], function () use ($router){ $router->get('gadai/cawangan/{kodcaw}/{tarikh}',['uses'=>'GadaiController@showOneGadaiByCawanganOnly']); $router->get('gadai/norujukan/{norujukan}',['uses'=>'GadaiController@showOneGadaiByNorujukan']); $router->get('gadai/norujukankodcaw/{kodcaw}/{norujukan}',['uses'=>'GadaiController@showOneGadaiByNorujukanKodcaw']); - $router->get('gadai/norujukan/{kodcaw}/{norujukan}',['uses'=>'GadaiController@showOneGadaibyRujukanAndCawangan']); + $router->get('gadai/norujukan/{kodcaw}/{norujukan}',['uses'=>'GadaiController@showOneGadaibyRujukanAndCawangan']); // refer sini utk pass gadai $router->post('gadai/{kodcaw}',['uses'=>'GadaiController@create']); $router->post('gadaiold/{kodcaw}',['uses'=>'GadaiController@createold']); $router->get('gadai/{cawangan_code}/{date}',['uses'=>'GadaiController@gadaiTransactionByCawanganAndDay']); @@ -466,8 +467,14 @@ $router->group(['prefix'=>'api'], function () use ($router){ //laporanlelong adminportal $router->get('laporan/lelong',['uses' => 'LelongController@LaporanLelong']); $router->get('lookupbatchlel/{kodcaw}',['uses' => 'LelongController@LookupBatchLel']); - + //barangkes $router->get('palsu/laporan', ['uses' => 'BarangkesController@LaporanBarangKes']); + $router->get('barangkes', ['uses' => 'BarangkesController@index']); // + $router->post('barangkes/store', ['uses' => 'BarangkesController@store']); + + // $router->post('/barangkes/{id}', ['uses' => 'BarangkesController@show']); + $router->put('barangkes/update/{recno}', ['uses' => 'BarangkesController@update']); + //update tagterima Tebus @@ -808,9 +815,11 @@ $router->group(['prefix'=>'admin'], function () use ($router){ $router->get('TuntutBakiTarikhTeller/{kodcaw}',['uses'=>'AdminPageController@showTuntutBakiTarikhTeller']); $router->get('lelong/tarikh/{kodcaw}',['uses'=>'AdminPageController@LelonganTarikh']); $router->post('updateTunaiGTByTarikh/{kodcaw}',['uses'=>'AdminPageController@UpdateTunaiByTarikh']); - $router->get('searchByName',['uses'=>'CustomerController@AdminsearchCustomerByName']); - $router->get('searchByIC',['uses'=>'CustomerController@AdminsearchCustomerByIC']); + $router->get('searchByIC',['uses'=>'CustomerController@AdminsearchCustomerByIC']); //refer ni jugak + + // sag + $router->get('searchBySag',['uses'=>'CustomerController@AdminsearchCustomerBySAG']); //refer ni jugak $router->get('pembiayaanTahunan',['uses'=>'AdminPageController@TahunanGadai']); $router->get('penebusanTahunan',['uses'=>'AdminPageController@TahunanTebus']); From 0a290029a5eb7f6a47bd18eb2f844148c274097d Mon Sep 17 00:00:00 2001 From: aiman Date: Sun, 14 Sep 2025 16:03:49 +0800 Subject: [PATCH 15/16] Tukar step pampasan v3 ke v2: --- app/Http/Controllers/BarangkesController.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/BarangkesController.php b/app/Http/Controllers/BarangkesController.php index 4008d14..603efb4 100644 --- a/app/Http/Controllers/BarangkesController.php +++ b/app/Http/Controllers/BarangkesController.php @@ -94,11 +94,11 @@ class BarangkesController extends Controller public function store(Request $request) //cara fifi ajar { - + $current = Carbon::now(); $kodcaw = $request->kodcaw; $cawangan = Cawangan::on('mysql7') - ->where('kodcaw', $kodcaw) + ->where('kodcaw', $kodcaw) ->first(); $insert = Palsu::on($cawangan['mysql'])->create([ @@ -114,7 +114,7 @@ class BarangkesController extends Controller 'untungonepercent' => $request->tunggakanonepercent, 'untungcajlain' => $request->tunggakanujrah, ]); - + // return $insert; return response()->json([ @@ -126,7 +126,7 @@ class BarangkesController extends Controller public function update(Request $request) { - + $current = Carbon::now(); $kodcaw = $request->kodcaw; Log::info($request->all()); @@ -164,4 +164,4 @@ class BarangkesController extends Controller 'message' => $palsu ? 'Rekod gadai berjaya dikemaskini' : 'Rekod tidak dijumpai', ], 200); } -} \ No newline at end of file +} From 6d80afed8f441cc824a6a9c4220591cdd4f953b1 Mon Sep 17 00:00:00 2001 From: Afiq Hamzah Date: Wed, 17 Sep 2025 12:38:51 +0800 Subject: [PATCH 16/16] Continue dev on pampasan module --- app/Http/Controllers/BarangkesController.php | 2 +- app/Http/Controllers/PampasanController.php | 5 + app/Palsu.php | 7 + ...092001_add_jenis_column_to_palsu_table.php | 68 +++++++++ ...jenis_to_pampasan_for_semporna_records.php | 78 +++++++++++ ...on_semporna_records_jenis_to_hapuskira.php | 130 ++++++++++++++++++ 6 files changed, 289 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php create mode 100644 database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php create mode 100644 database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php diff --git a/app/Http/Controllers/BarangkesController.php b/app/Http/Controllers/BarangkesController.php index 603efb4..fed34b7 100644 --- a/app/Http/Controllers/BarangkesController.php +++ b/app/Http/Controllers/BarangkesController.php @@ -6,9 +6,9 @@ use App\Audit; use App\Polis; use App\Cawangan; use App\LookupAlasan; +use App\Gadai; use App\Pampasan; use App\Palsu; -use App\Gadai; use Illuminate\Http\Request; use Carbon\Carbon; diff --git a/app/Http/Controllers/PampasanController.php b/app/Http/Controllers/PampasanController.php index cdbeb86..1972c2a 100644 --- a/app/Http/Controllers/PampasanController.php +++ b/app/Http/Controllers/PampasanController.php @@ -70,6 +70,11 @@ class PampasanController extends Controller Palsu::on($cawangan['mysql']) ->where('norujukan', $norujukan) ->update(['status' => 1]); +<<<<<<< HEAD +======= + + // dd($pampasan); +>>>>>>> 83d619ac (Continue dev on pampasan module) return $this->successResponse('Status Pampasan berjaya dituntut.', $pampasan, 201); } diff --git a/app/Palsu.php b/app/Palsu.php index 00ce962..7defa11 100644 --- a/app/Palsu.php +++ b/app/Palsu.php @@ -32,6 +32,10 @@ class Palsu extends Model 'untungonepercent', 'untungcajlain', 'pembiayaan', +<<<<<<< HEAD +======= + 'jenis', +>>>>>>> 83d619ac (Continue dev on pampasan module) 'status', ]; @@ -95,9 +99,12 @@ class Palsu extends Model { return $this->hasOne(Tebus::class, 'norujukan', 'norujukan'); } +<<<<<<< HEAD public function gadai(): HasOne { return $this->hasOne(Gadai::class, 'norujukan', 'norujukan'); } +======= +>>>>>>> 83d619ac (Continue dev on pampasan module) } diff --git a/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php b/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php new file mode 100644 index 0000000..a9de2a2 --- /dev/null +++ b/database/migrations/2025_09_17_092001_add_jenis_column_to_palsu_table.php @@ -0,0 +1,68 @@ +select('SELECT 1'); + return true; + } catch (\Exception $e) { + return false; + } + }); + + return $db_connection ? array_values($db_connection) : []; + } + + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { + if (!Schema::connection($dbase)->hasColumn('palsu', 'jenis')) { + $table->string('jenis', 50)->nullable()->comment('Jenis/Type classification'); + } + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + Schema::connection($dbase)->table('palsu', function (Blueprint $table) use ($dbase) { + if (Schema::connection($dbase)->hasColumn('palsu', 'jenis')) { + $table->dropColumn('jenis'); + } + }); + } + } +} diff --git a/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php b/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php new file mode 100644 index 0000000..424a87b --- /dev/null +++ b/database/migrations/2025_09_17_093116_update_jenis_to_pampasan_for_semporna_records.php @@ -0,0 +1,78 @@ +getSempornaRecords(); + + // Update jenis to 'pampasan' for Semporna records in mysql34 (Semporna branch) + try { + $updated = DB::connection('mysql34')->table('palsu') + ->whereIn('norujukan', $semporna_records) + ->update(['jenis' => 'pampasan']); + + echo "Updated {$updated} Semporna records with jenis = 'pampasan'\n"; + } catch (\Exception $e) { + echo "Error updating Semporna records: " . $e->getMessage() . "\n"; + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $semporna_records = $this->getSempornaRecords(); + + // Revert jenis to null for Semporna records + try { + $reverted = DB::connection('mysql34')->table('palsu') + ->whereIn('norujukan', $semporna_records) + ->update(['jenis' => null]); + + echo "Reverted {$reverted} Semporna records jenis to null\n"; + } catch (\Exception $e) { + echo "Error reverting Semporna records: " . $e->getMessage() . "\n"; + } + } +} diff --git a/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php b/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php new file mode 100644 index 0000000..44594a3 --- /dev/null +++ b/database/migrations/2025_09_17_093117_update_non_semporna_records_jenis_to_hapuskira.php @@ -0,0 +1,130 @@ +select('SELECT 1'); + return true; + } catch (\Exception $e) { + return false; + } + }); + + return $db_connection ? array_values($db_connection) : []; + } + + /** + * Semporna norujukan records to exclude + */ + private function getSempornaRecords(): array + { + return [ + '011237240808-0003', + '011237240719-0015', + '011237240806-0011', + '011237240828-0001', + '011237240904-0007', + '011237240904-0008', + '011237240904-0009', + '011237240719-0023', + '011237240719-0024', + '011237240719-0025', + '011237240618-0026', + '011237240719-0027', + '011237240719-0028', + '011237240618-0020', + '011237240719-0030', + '011237240618-0029', + '011237240731-0026', + '011237240912-0009' + ]; + } + + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + $db_connection = $this->getActiveDB(); + $semporna_records = $this->getSempornaRecords(); + + foreach ($db_connection as $dbase) { + try { + if ($dbase == 'mysql34') { + // For Semporna (mysql34), update only non-Semporna records to 'hapuskira' + $updated = DB::connection($dbase)->table('palsu') + ->whereNotIn('norujukan', $semporna_records) + ->update(['jenis' => 'hapuskira']); + + if ($updated > 0) { + echo "Updated {$updated} non-Semporna records in {$dbase} to jenis = 'hapuskira'\n"; + } + } else { + // For all other databases, update all records to 'hapuskira' + $updated = DB::connection($dbase)->table('palsu') + ->update(['jenis' => 'hapuskira']); + + if ($updated > 0) { + echo "Updated {$updated} records in {$dbase} to jenis = 'hapuskira'\n"; + } + } + } catch (\Exception $e) { + echo "Error updating {$dbase}: " . $e->getMessage() . "\n"; + } + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $db_connection = $this->getActiveDB(); + + foreach ($db_connection as $dbase) { + try { + // Revert all jenis values to null except Semporna records which should remain 'pampasan' + if ($dbase == 'mysql34') { + $semporna_records = $this->getSempornaRecords(); + $reverted = DB::connection($dbase)->table('palsu') + ->whereNotIn('norujukan', $semporna_records) + ->update(['jenis' => null]); + + if ($reverted > 0) { + echo "Reverted {$reverted} non-Semporna records in {$dbase} jenis to null\n"; + } + } else { + $reverted = DB::connection($dbase)->table('palsu') + ->update(['jenis' => null]); + + if ($reverted > 0) { + echo "Reverted {$reverted} records in {$dbase} jenis to null\n"; + } + } + } catch (\Exception $e) { + echo "Error reverting {$dbase}: " . $e->getMessage() . "\n"; + } + } + } +}