Merged in feature/hapus-ansuran-v2 (pull request #340)

Feature/hapus ansuran v2
This commit is contained in:
Muhd hafifie
2025-08-17 13:40:58 +00:00
7 changed files with 368 additions and 28 deletions
+7
View File
@@ -3930,4 +3930,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);
}
}
+109 -13
View File
@@ -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,30 @@ 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())
->whereNotNull('id')
->whereNotNull('timestamp_approved_by_pc')
->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 +441,76 @@ 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);
}
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);
}
}
@@ -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);
}
}
+11 -1
View File
@@ -27,7 +27,17 @@ class Mohonid extends Model
'nilaimarhun',
'berat',
'margin',
'teller'
'teller',
'masa',
'tagoperasi',
'ansuran',
'operasi',
'timestamp_approved_by_pc',
'timestamp_approved_by_operasi',
];
protected $casts = [
'id' => 'string',
];
/**
+40 -13
View File
@@ -8,6 +8,8 @@ use App\Tunai;
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;
@@ -39,7 +41,14 @@ 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';
}
$transaction_gadai = TransaksiGadai::on('mysql7')->where('id',$request->tg_id)->first();
@@ -49,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){
@@ -91,6 +103,17 @@ class AnsuranServices
'softDelete' => 1,
));
$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();
$tarikh_audit = Carbon::now();
$audit->new_data = $gadai_updated;
$audit->kodcaw = $this->cawangan;
$audit->created_at = $tarikh_audit;
$audit->updated_at = $tarikh_audit;
$audit->save();
return 'success';
@@ -103,18 +126,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 +136,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;
}
}
@@ -0,0 +1,148 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class AddHapusAnsuranPropertiesToMohonidTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
protected $db_connection;
public function getActiveDB()
{
$connections = array_keys(config("database.connections"));
$excluded = config('database.excluded_connections', ['mysql7']);
$active = [];
foreach ($connections as $connection) {
if (in_array($connection, $excluded)) {
Log::debug("Skipping excluded connection: {$connection}");
continue;
}
try {
DB::connection($connection)->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());
}
}
}
}
}
+9 -1
View File
@@ -697,6 +697,13 @@ $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->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){
@@ -890,7 +897,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('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']);