3 Commits

Author SHA1 Message Date
ismailmasseran 0cb85c2375 Merge pull request 'resolve bugs laporan audit operasi' (#13) from fix/resolve-bugs-laporan-audit-operasi into main
Reviewed-on: #13
2026-09-02 11:58:46 +08:00
nurafrinaalimi16 2a0ffde016 resolve bugs laporan audit operasi 2026-09-02 11:55:28 +08:00
ismailmasseran 92991f0d10 Prod kopkb (#12)
Co-authored-by: dev_kopkb <xtrabiz.sb@gmail.com>
Co-authored-by: nurafrinaalimi16 <nurafrinaalimi16@gmail.com>
Co-authored-by: root <root@erahn.click>
Reviewed-on: #12
2026-09-01 15:10:30 +08:00
7 changed files with 507 additions and 259 deletions
+50
View File
@@ -0,0 +1,50 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:WRTHcFTq5YARKVdA8YDUzsh9Ue8vD63ivgZgXNNBiGo=
APP_DEBUG=true
APP_URL=http://ujrahkopkb.erahn.com.my
API_URL=http://apiujrah-kopkb.erahn.com.my
#API_ARRAHNBID=http://lelong.test/api/
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=kaunter_erahn
DB_USERNAME=spider
DB_PASSWORD=G0dz!ll4
BROADCAST_DRIVER=pusher
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
PUSHER_APP_ID=1132718
PUSHER_APP_KEY=26b0ec2f297f94b7aa9b
PUSHER_APP_SECRET=421b61fb5a8ecce477a6
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
MYKAD_READER_PORT=8085
MYKAD_READER_ENABLED_CAWANGAN='' # IF NO CAWANGAN STATED, ALL CAWANGAN IS ENABLED
+153 -5
View File
@@ -87,13 +87,19 @@ class OperasiController extends Controller
'siri' => $request->siri
])->json();
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusan/' . $request->kodcaw . '/' . $norujukan, [
$updateData = [
'sahkan' => 1,
'namaoperasi' => $request->namaoperasi,
'siri' => $request->siri
])->json();
} else {
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateHapusAnsuran', [
];
if ($request->has('actions')) {
$updateData['actions'] = $request->actions;
}
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusan/' . $request->kodcaw . '/' . $norujukan, $updateData)->json();
}else{
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateHapusAnsuran',[
'siri' => $request->siri,
"kodcaw" => $request->kodcaw,
"norujukan" => $request->norujukan,
@@ -139,6 +145,49 @@ class OperasiController extends Controller
return response()->json($updatelulus, 200);
}
public function createKelulusanByKhazanah(Request $request)
{
$auth_user = Auth::user();
$api_url = config('api.url');
$current = Carbon::now();
$current = new Carbon();
$norujukan = $request->norujukan;
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
$getsiri = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/ListLatestLulus/'. $auth_user['cawangan'] . '/' . $norujukan)->json();
if(isset($getsiri['siri']))
{
$siri = $getsiri['siri'] + 1;
}else{
$siri = 1;
}
$createlulus = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/CreateKelulusan/' . $auth_user['cawangan'] . '/' . $norujukan . '/roles/khazanah', [
'komen' => $request->komen,
'dategadai' => $current->toDateString(),
'bilgadai' => 1,
'siri' => $siri,
'margin' => $request->margin,
'berat' => $request->berat,
'nilaimarhun' => $request->nilaimarhun,
'status' => $request->status,
'jumpinjam' => $request->jumpinjam,
'jenistebus' => "G",
'teller' => $request->teller,
'peloperasi' => "operasi",
'pelulus' => "operasi",
'actions' => "Mohon Pengesahan Pembayaran Pampasan"
])->json();
event(new OperasiNotice($auth_user['cawangan'],$auth_user['name']));
return response()->json($siri,201);
}
public function updatekelulusananggota(Request $request)
{
$auth_user = Auth::user();
@@ -149,7 +198,7 @@ class OperasiController extends Controller
$kodcaw = $request->kodcaw;
$komen = $request->komenkelulusan;
$namaoperasi = $request->namaoperasi;
$taglulus = $request->taglulus; // contoh: 'Y' = lulus, 'N' = batal
$taglulus = $request->taglulus; // contoh: 'Y' = lulus, 'N' = batalmarginmutu()
// 1️⃣ Tentukan status kelulusan
$status = ($taglulus == 'Y') ? 1 : 2; // 1 = Lulus, 2 = Batal/Tolak
@@ -401,4 +450,103 @@ class OperasiController extends Controller
return view('operasi.kelulusan_anggota', compact('cawangan_info', 'api_url', 'arraykelulusan'));
}
public function marginmutu()
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
// Get MaxMutuEmas data from API
$maxmutuemas = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/maxmutuemas')->json();
return view('operasi.marginmutu', compact('cawangan_info', 'api_url', 'maxmutuemas'));
}
public function editMarginMutu()
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
return view('operasi.edit_marginmutu', compact('cawangan_info', 'api_url'));
}
public function laporanAudit()
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
return view('homepage.operasi.laporan-audit', compact('cawangan_info', 'api_url'));
}
public function cetakLaporanAuditTrail(Request $request)
{
$api_url = config('api.url');
$auth_user = Auth::user();
$current = Carbon::now();
$current = new Carbon();
$tarikh_cetak = $current->toDateString();
if($request->dateaudit == null){
$date = $current->toDateString();
}else{
$split_date = explode('-', $request->dateaudit);
$date = $split_date[0] . '-' . $split_date[1] . '-' . $split_date[2];
}
if($request->dateaudit_till == null){
$date_till = $current->toDateString();
}else{
$split_date_till = explode('-', $request->dateaudit_till);
$date_till = $split_date_till[0] . '-' . $split_date_till[1] . '-' . $split_date_till[2];
}
$audittrail_raw = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/reports/audittrail/operasi',['date' => $date,'date_till' => $date_till])->json();
if(!$audittrail_raw){
return redirect()->back()->with('errormessage', 'Tiada data pada tarikh tersebut.');
}
// Transform the data to match view format
$audittrail = [];
foreach($audittrail_raw as $item) {
$created_at = \Carbon\Carbon::parse($item['created_at']);
// Format differences for display
$differences_text = '-';
if (isset($item['differences']) && !empty($item['differences'])) {
$diff_parts = [];
foreach ($item['differences'] as $field => $changes) {
$old = $changes['old'] ?? 'null';
$new = $changes['new'] ?? 'null';
$diff_parts[] = "{$field}: {$old}{$new}";
}
$differences_text = implode('; ', $diff_parts);
}
$audittrail[] = [
'tarikh' => $created_at->format('d/m/Y'),
'masa' => $created_at->format('H:i:s'),
'users' => $item['users'],
'actions' => $item['actions'],
'differ' => $differences_text
];
}
$cawangan_detail = [
'kodcaw' => 'operasi',
'namacaw' => 'Operasi Ar-Rahn',
'alamat1' => 'Lot 107, Jalan Parit Dalam,',
'alamat2' => 'Seksyen 8',
'poskod' => '15000',
'bandar' => 'Kota Bahru',
'negeri' => 'Kelantan',
'notel' => '03-12345678',
'nofaks' => '03-12345678',
];
return view('print.laporan_audittrail_operasi', compact('audittrail','cawangan_detail','tarikh_cetak','date','date_till','api_url'));
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
return [
'url' => env('API_URL'),
'url_koop' => env('API_URL_KOOP','http://localhost:8000'),
'url_koop' => env('API_URL_KOOP','https://apiujrah.erahn.com.my'),
'url_pkb' => env('API_URL_PKB','http://localhost:8000'),
];
+1 -3
View File
@@ -525,7 +525,6 @@ var api_url = @json($api_url ?? '');
});
// Logik amaran SweetAlert
if("{{ auth()->user()->cawangan }}" == 'X0301'){
if (search === true) {
if (blacklist_search === true) {
Swal.fire({
@@ -555,8 +554,7 @@ var api_url = @json($api_url ?? '');
text: 'Sila Daftar Pelanggan.'
});
}
}
}
}
});
+5 -3
View File
@@ -75,7 +75,8 @@
->json();
@endphp
<input type="text" class="form-control" name="outstanding_semasa"
id="outstanding_semasa" readonly value="{{ number_format($outstanding_semasa, 2) }}">
id="outstanding_semasa" readonly
value="{{ number_format($outstanding_semasa, 2) }}">
</div>
</div>
@@ -157,7 +158,7 @@
<!-- Butang Assign Sebagai Anggota -->
@if (isset($showAssignAnggotaBtn) && $showAssignAnggotaBtn && auth()->user()->cawangan == 'X0301')
@if (isset($showAssignAnggotaBtn) && $showAssignAnggotaBtn)
<div class="m-0 p-2">
<button type="button" class="btn btn-success d-flex align-items-center"
data-noic="{{ $noic }}" onclick="assignAnggota(this)">
@@ -1014,7 +1015,8 @@
);
alert
(xhr
.responseText);
.responseText
);
}
});
});
+7 -1
View File
@@ -29,6 +29,7 @@
<div class="form-group row col-12">
<input type="hidden" name="kodcaw" id="kodcaw" value="{{$cawangan_info['kodcaw']}}">
<input type="hidden" name="nokp" id="nokp" value="{{ $customer_info['kpbaru'] }}">
<input type="hidden" name="tag_anggota" id="tag_anggota" value="{{ $customer_info['tag_anggota'] ?? 0 }}">
</div>
<div class="col-12 mb-2">
@@ -640,8 +641,13 @@
},
success:function(data){
kadarupah = data;
// Jika anggota (tag_anggota = 1), kadar ujrah dipaksa 0.00
if(Number($('#tag_anggota').val()) === 1){
kadarupah = 0;
}
});
}
});
$('#total_nilai_marhun').val(formatter.format(total_nilai_marhun));
$('#marhun_detail').val(marhun_details);
+73 -29
View File
@@ -655,7 +655,7 @@
</table>
<table class="main-table text-center" style="border-top: none !important">
<tr>
<th colspan="5">JUMLAH KEUNTUNGAN DAN LAIN-LAIN CAJ BERDASARKAN TEMPOH PEMBIAYAAN</th>
<th colspan="5">JUMLAH KEUNTUNGAN BERDASARKAN TEMPOH PEMBIAYAAN</th>
</tr>
<tr>
<th>TEMPOH PEMBIAYAAN</th>
@@ -670,13 +670,13 @@
<td>{{ $formatted_t_matang_1 }}</td>
</tr>
<tr>
<th class="text-left">JUMLAH KEUNTUNGAN (1%) DAN LAIN-LAIN CAJ YANG PERLU DIBAYAR</th>
<th class="text-left">JUMLAH KEUNTUNGAN YANG PERLU DIBAYAR</th>
<td style="font-size:12px"><b>RM{{ number_format($gadai_detail['bakiupah'] / 6, 2) }}</b></td>
<td style="font-size:12px"><b>RM{{ number_format($gadai_detail['bakiupah'], 2) }}</b></td>
<td>RM{{ number_format($gadai_detail['bakiupah'], 2) }}</td>
</tr>
<tr>
<th class="text-left">JUMLAH KEUNTUNGAN (1%) DAN LAIN-LAIN CAJ TERKUMPUL<br> SEPANJANG TEMPOH
<th class="text-left">JUMLAH KEUNTUNGAN TERKUMPUL<br> SEPANJANG TEMPOH
PEMBIAYAAN
</th>
<td>-</td>
@@ -717,7 +717,7 @@
<tr>
<td colspan="4">
Pelanggan bersetuju dan dengan ini menggadaikan Marhun sebagai cagaran kepada
Jumlah Pembiayaan termasuk Jumlah Keuntungan dan Lain-Lain Caj Terkumpul
Jumlah Pembiayaan termasuk Jumlah Keuntungan Terkumpul
mengikut
syarat-syarat pembiayaan dalam SAG ini. KoPKB dengan ini menerima gadaian Marhun
tersebut.
@@ -731,14 +731,12 @@
<td style="vertical-align: top">
<table class="akad-table">
<tr>
<td colspan="4"><b><u>AKAD (SIMPAN MARHUN)</u></b></td>
<td colspan="4"><b><u>KADAR KEUNTUNGAN BULANAN</u></b></td>
</tr>
<tr>
<td colspan="4">
Pelanggan dengan ini bersetuju marhun disimpan oleh KoPKB dan bersetuju membayar
lain-lain caj
sebagaimana jadual dibawah bagi setiap
RM100.00 Jumlah Marhun Keseluruhan:
Kadar keuntungan Pembiayaan Ar-Rahn Tawarruq adalah berdasarkan jumlah
pembiayaan seperti berikut :
</td>
</tr>
</table>
@@ -746,35 +744,35 @@
<table class="main-table text-center"
style="font-size: 9px; width: 100%; margin-top: 5px;">
<tr>
<th>KADAR LAIN-LAIN CAJ / RM100</th>
<th>KADAR KEUNTUNGAN SEBULAN (%)</th>
</tr>
<tr>
<td>RM{{ $kadar_ujrah[0]['kadarujrah'] }}/sebulan</td>
<td>1.00</td>
</tr>
</table>
@else
<table class="main-table text-center"
style="font-size: 9px; width: 100%; margin-top: 5px;">
<tr>
<th>NILAI MARHUN KESELURUHAN</th>
<th>JUMLAH PEMBIAYAAN</th>
<th></th>
<th>KADAR LAIN-LAIN CAJ / RM100</th>
<th>KADAR KEUNTUNGAN SEBULAN (%)</th>
</tr>
<tr>
<td>
< RM400.99</td>
<td>-</td>
<td>RM{{ $kadar_ujrah[0]['kadarujrah'] }}/sebulan</td>
<td>{{ $kadar_ujrah[0]['kadarupdah'] }}</td>
</tr>
<tr>
<td>RM401.00 - RM2000.99</td>
<td>-</td>
<td>RM{{ $kadar_ujrah[1]['kadarujrah'] }}/sebulan</td>
<td>{{ $kadar_ujrah[1]['kadarupdah'] }}</td>
</tr>
<tr>
<td>> RM2001.00</td>
<td>-</td>
<td>RM{{ $kadar_ujrah[2]['kadarujrah'] }}/sebulan</td>
<td>{{ $kadar_ujrah[2]['kadarupdah'] }}</td>
</tr>
</table>
@endif
@@ -829,15 +827,15 @@
<tr>
<td></td>
<td>e.</td>
<td colspan="2">Membayar Jumlah Pembiayaan termasuk Jumlah Keuntungan dan
Lain-Lain Caj Terkumpul yang diberi mengikut dalam tempoh seperti di SAG ini;
<td colspan="2">Membayar Jumlah Pembiayaan termasuk Jumlah Keuntungan yang diberi
mengikut dalam tempoh seperti di SAG ini;
</td>
</tr>
<tr>
<td></td>
<td>f.</td>
<td colspan="2">Tertakluk kepada pembayaran penuh Jumlah Pembiayaan termasuk
Jumlah Keuntungan dan Lain-Lain Caj Terkumpul, Pelanggan perlu hadir sendiri
Jumlah Keuntungan Terkumpul, Pelanggan perlu hadir sendiri
menyelesaikan Pembiayaan;</td>
</tr>
<tr>
@@ -1066,8 +1064,7 @@
<td colspan="1"></td>
<td colspan="1">o.</td>
<td colspan="2">KoPKB berhak menuntut Jumlah Pembiayaan termasuk Jumlah Keuntungan
dan
Lain-Lain Caj Terkumpul setelah tamat tempoh yang dinyatakan pada notis berkaitan;
setelah tamat tempoh yang dinyatakan pada notis berkaitan;
</td>
</tr>
<tr>
@@ -1212,8 +1209,7 @@
<td colspan="1">a.</td>
<td colspan="2">Marhun akan dilelong atau dijual. KoPKB akan membatalkan
lelongan Marhun sekiranya Pelanggan membayar tunggakan Jumlah Pembiayaan
termasuk Jumlah Keuntungan dan
Lain-Lain Caj
termasuk Jumlah Keuntungan
sepenuhnya tiga (3) hari sebelum tarikh lelongan;</td>
</tr>
<tr>
@@ -1233,7 +1229,7 @@
<td colspan="1">c.</td>
<td colspan="2">Sebarang lebihan hasil lelongan atau jualan (jika ada) setelah
ditolak
Jumlah Pembiayaan termasuk Jumlah Keuntungan dan Lain-Lain Caj Terkumpul
Jumlah Pembiayaan termasuk Jumlah Keuntungan Terkumpul
yang tertunggak dan kos-kos berkaitan akan
dikembalikan
kepada Pelanggan dan;</td>
@@ -1264,7 +1260,7 @@
<td>=</td>
<td><b>BAKI TEMPOH PEMBIAYAAN <br></td>
<td>X</td>
<td><b>JUMLAH KEUNTUNGAN 1% DAN LAIN-LAIN CAJ YANG PERLU DIBAYAR</b></td>
<td><b>JUMLAH KEUNTUNGAN YANG PERLU DIBAYAR</b></td>
</tr>
</table>
<br>
@@ -1280,7 +1276,7 @@
<td colspan="1"></td>
<td colspan="1">a.</td>
<td colspan="2">Pelanggan gagal dan/ingkar menjelaskan Jumlah Pembiayaan,
Jumlah Keuntungan dan Lain-Lain Caj Terkumpul pada tarikh yang ditetapkan;
Jumlah Keuntungan Terkumpul pada tarikh yang ditetapkan;
</td>
</tr>
<tr>
@@ -1306,6 +1302,45 @@
<tr>
<td colspan="1"></td>
<td colspan="1"><b>6.</b></td>
<td colspan="2"><b>Pelanggan dengan ini bersetuju, memberi kuasa dan melantik
Ar-Rahn sebagai wakil (wakil di bawah prinsip Wakalah) untuk menguruskan baki
hasil lelongan yang menjadi hak Pelanggan,
sekiranya ada, yang bernilai RM10.00 (Ringgit Malaysia: Sepuluh) atau kurang,
dan tidak dituntut oleh Pelanggan dalam tempoh tuntutan yang ditetapkan oleh
Ar-Rahn setelah usaha munasabah telah diambil untuk memaklumkan kepada
Pelanggan.</b></td>
</tr>
<tr>
<td colspan="1"></td>
<td colspan="1"><b>7.</b></td>
<td colspan="2">
<b>
Pelanggan selanjutnya bersetuju bahawa baki hasil lelongan tersebut boleh
disalurkan oleh Ar-Rahn, bagi pihak Pelanggan, sebagai infaq kepada mana-mana
institusi agama Islam, badan kebajikan atau institusi lain yang diluluskan
oleh Jawatankuasa Syariah dan/atau pihak berkuasa yang berkaitan, tanpa
sebarang liabiliti ke atas Ar-Rahn selepas penyaluran tersebut dibuat dengan
jumlah tidak melebihi RM10.00.
</b>
<div style="margin-top: 8px;">
<span
style="
display: inline-block;
width: 13px;
height: 13px;
border: 1px solid #000;
margin-right: 6px;
vertical-align: middle;
"></span>
<b>Tandakan (✓) jika tidak bersetuju.</b>
</div>
</td>
</tr>
<tr>
<td colspan="1"></td>
<td colspan="1"><b>8.</b></td>
<td colspan="2"><b>Sekiranya Pelanggan mempunyai sebarang pertanyaan atau
aduan, Pelanggan boleh menghubungi KoPKB sebagaimana berikut:</b></td>
</tr>
@@ -1713,6 +1748,7 @@
{{-- MARHUN DETAIL SECTION --}}
<div class="main-marhun">
<table class="main-table text-center" style="width: 75%">
<tr>
<th>BIL</th>
<th>JENIS MARHUN</th>
@@ -1846,7 +1882,7 @@
</table>
<table class="main-table text-center" style="border-top: none !important">
<tr>
<th colspan="5">JUMLAH KEUNTUNGAN DAN LAIN-LAIN CAJ BERDASARKAN TEMPOH PEMBIAYAAN</th>
<th colspan="5">JUMLAH KEUNTUNGAN BERDASARKAN TEMPOH PEMBIAYAAN</th>
</tr>
<tr>
<th>TEMPOH PEMBIAYAAN</th>
@@ -1861,19 +1897,27 @@
<td>{{ $formatted_t_matang_1 }}</td>
</tr>
<tr>
<th class="text-left">JUMLAH KEUNTUNGAN DAN LAIN-LAIN CAJ YANG PERLU DIBAYAR BULANAN</th>
<th class="text-left">JUMLAH KEUNTUNGAN YANG PERLU DIBAYAR BULANAN</th>
<td style="font-size:12px"><b>RM{{ number_format($gadai_detail['bakiupah'] / 6, 2) }}</b></td>
<td style="font-size:12px"><b>RM{{ number_format($gadai_detail['bakiupah'], 2) }}</b></td>
<td>RM {{ number_format($gadai_detail['bakiupah'], 2) }}</td>
</tr>
<tr>
<th class="text-left">JUMLAH KEUNTUNGAN DAN LAIN-LAIN CAJ TERKUMPUL <br> SEPANJANG TEMPOH
<th class="text-left">JUMLAH KEUNTUNGAN TERKUMPUL <br> SEPANJANG TEMPOH
PEMBIAYAAN</th>
<td>-</td>
<td>RM{{ number_format($gadai_detail['bakiupah'], 2) }}</td>
<td>RM{{ number_format($gadai_detail['upah12'], 2) }}</td>
</tr>
</table>
<div style="color: black; font-weight: bold; margin-top: 0px; width: 100%;">
<span>PENGURUSAN HASIL LELONGAN YANG TIDAK DITUNTUT</span>
<span>
<input type="checkbox" name="hasil_lelongan_tidak_dituntut">
</span>
</div>
{{-- SIGNATURE SECTION --}}
<table class="main-table mt-10">
<tr>