Explore/ismail (#17)

Co-authored-by: ISMAIL MASSERAN <topaz@ISMAILs-Macbook.local>
Co-authored-by: nurafrinaalimi16 <nurafrinaalimi16@gmail.com>
Co-authored-by: ISMAIL MASSERAN <topaz@Mac.dlinkrouter.local>
Reviewed-on: #17
Co-authored-by: ismailmasseran <ismail@koppkb.com>
Co-committed-by: ismailmasseran <ismail@koppkb.com>
This commit was merged in pull request #17.
This commit is contained in:
2026-09-09 14:46:15 +08:00
committed by afrina
parent 0cb85c2375
commit 44b1d847bc
138 changed files with 6714 additions and 704 deletions
+9 -5
View File
@@ -210,15 +210,17 @@
<div class="modal fade" id="daftar_pelanggan_mykad_reader" tabindex="-1" data-backdrop="static" aria-labelledby="ModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form id="form-mykad-reader" action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="modal-header">
<h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5>
</div>
<div class="modal-body">
<form action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="row form-group">
<div class="col-md-12 d-flex justify-content-center pb-3 d-none" id="photo-mykad-container">
<img src="{{ asset('img/spinner-loader.gif') }}" alt="" id="photo-mykad" width="150" height="200" object-fit="cover">
<input type="hidden" name="photo_base64" id="photo_base64" value="">
<input type="hidden" name="photo_mime" id="photo_mime" value="">
</div>
<div class="col-md-6">
<div class="row form-group">
@@ -473,7 +475,7 @@
</div>
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var search = "<?php echo $search ?>";
var type_id = "<?php echo $idtype ?>";
var blacklist_search = "<?php echo $blacklist_search ?>";
@@ -811,6 +813,8 @@
function verifycustomerMyKadReader(){
copyMykadPhotoFromImage();
let myKadModal = $('#daftar_pelanggan_mykad_reader');
// Construct URLSearchParams object instance from current URL querystring.
@@ -1275,10 +1279,10 @@
// mycard-read endpoint initialization
let mykad_reader_endpoint = "{{ config('mykad-reader.endpoint') }}";
let wakil_caricustomer_endpoint = "{{ route('wakil.caricustomer') }}";
let store_mykad_photo_endpoint = "{{ route('customer.storeMykadPhoto') }}";
let mykad_reader_driver_endpoint = "{{ route('mykadreader.driver') }}";
</script>
<script src="{{ asset('js/iris-mykad-websocket-client-api.js') }}"></script>
<script src="{{ asset('js/mykad-reader-customer.js') }}"></script>
<script src="{{ asset('js/mykad-reader-customer.js') }}?v=5"></script>
<script src="{{ asset('js/postcode-concerns.js') }}"></script>
@endpush
+17 -1
View File
@@ -21,6 +21,22 @@
</ol>
</nav>
@if(session()->has('message'))
<div class="alert alert-success">{{ session('message') }}</div>
@endif
@if(!empty($customer_info['photo_base64']))
<div class="form-group row col-md-12">
<div class="col-md-12 d-flex justify-content-center pb-3">
<img src="data:{{ $customer_info['photo_mime'] ?? 'image/jpeg' }};base64,{{ $customer_info['photo_base64'] }}"
alt="Gambar MyKad"
width="120"
height="160"
style="object-fit: cover;">
</div>
</div>
@endif
<div class="form-group row col-md-12">
<div class="col-md-6">
<div class="form-group row">
@@ -422,7 +438,7 @@
<script>
var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>";
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
var min_komoditi = "{{ $min_komoditi }}";
+12 -9
View File
@@ -229,15 +229,17 @@
<div class="modal fade" id="daftar_pelanggan_mykad_reader" tabindex="-1" data-backdrop="static" aria-labelledby="ModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form id="form-mykad-reader" action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="modal-header">
<h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5>
</div>
<div class="modal-body">
<form action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="row form-group">
<div class="col-md-12 d-flex justify-content-center pb-3 d-none" id="photo-mykad-container">
<img src="{{ asset('img/spinner-loader.gif') }}" alt="" id="photo-mykad" width="150" height="200" object-fit="cover">
<input type="hidden" name="photo_base64" id="photo_base64" value="">
<input type="hidden" name="photo_mime" id="photo_mime" value="">
</div>
<div class="col-md-6">
<div class="row form-group">
@@ -495,15 +497,14 @@
</div>
<script>
var api_url = @json($api_url ?? '');
var search = @json($search ?? false);
var type_id = @json($idtype ?? '');
var isAnggota = @json($isAnggota ?? false);
var isPelanggan = @json($isPelanggan ?? false);
var blacklist_search = @json($blacklist_search ?? false);
var showAssignAnggotaBtn = @json($showAssignAnggotaBtn ?? false);
var showDaftarPelangganBtn = @json($showDaftarPelangganBtn ?? false);
var api_url = "{{ api_url_for_browser() }}";
var search = "<?php echo $search ?>";
var type_id = "<?php echo $idtype ?>";
var blacklist_search = "<?php echo $blacklist_search ?>";
$(document).ready(function(){
// Datepicker
$('#passport_tarikh_lahir').datepicker({
@@ -891,6 +892,8 @@ var api_url = @json($api_url ?? '');
function verifycustomerMyKadReader(){
copyMykadPhotoFromImage();
let myKadModal = $('#daftar_pelanggan_mykad_reader');
// Construct URLSearchParams object instance from current URL querystring.
@@ -1414,10 +1417,10 @@ document.getElementsByName('form-store')[0].addEventListener('keypress', functio
// mycard-read endpoint initialization
let mykad_reader_endpoint = "{{ config('mykad-reader.endpoint') }}";
let wakil_caricustomer_endpoint = "{{ route('wakil.caricustomer') }}";
let store_mykad_photo_endpoint = "{{ route('customer.storeMykadPhoto') }}";
let mykad_reader_driver_endpoint = "{{ route('mykadreader.driver') }}";
</script>
<script src="{{ asset('js/iris-mykad-websocket-client-api.js') }}"></script>
<script src="{{ asset('js/mykad-reader-customer.js') }}"></script>
<script src="{{ asset('js/mykad-reader-customer.js') }}?v=5"></script>
<script src="{{ asset('js/postcode-concerns.js') }}"></script>
@endpush
+182 -140
View File
@@ -22,6 +22,22 @@
</ol>
</nav>
@if(session()->has('message'))
<div class="alert alert-success">{{ session('message') }}</div>
@endif
@if(!empty($customer_info['photo_base64']))
<div class="form-group row col-md-12">
<div class="col-md-12 d-flex justify-content-center pb-3">
<img src="data:{{ $customer_info['photo_mime'] ?? 'image/jpeg' }};base64,{{ $customer_info['photo_base64'] }}"
alt="Gambar MyKad"
width="120"
height="160"
style="object-fit: cover;">
</div>
</div>
@endif
<div class="form-group row col-md-12">
<div class="col-md-6">
<div class="form-group row">
@@ -155,6 +171,11 @@
<i class="fas fa-info-circle me-1"></i> Maklumat Pelanggan
</button>
<button class="btn btn-info d-flex align-items-center" data-toggle="modal"
data-target="#export_maklumat_modal" style="margin-right: 12px;">
<i class="fas fa-print me-1"></i> Cetak Maklumat Pelanggan
</button>
<!-- Butang Assign Sebagai Anggota -->
@@ -231,7 +252,6 @@
// 4️⃣ Hantar permohonan ke backend (Laravel)
const response = await fetch("{{ route('operasi.createkelulusan-anggota') }}", {
method: 'POST',
headers: {
"Content-Type": "application/json",
@@ -239,15 +259,14 @@
},
body: JSON.stringify({
mohon: "Assign Anggota",
noic: noic,
nokp: noic,
norujukan: norujukan,
komen: komen,
teller: "{{ Auth::user()->name }}",
tagoperasi: 1 // 1 = tunggu kelulusan operasi
})
console.log(`Response: ${response}`);
});
console.log(`Response: ${response}`);
const result = await response.json();
@@ -349,7 +368,7 @@
</div>
<div class="nav nav-tabs" id="nav-tab" role="tablist">
@php
$activate_tab = request()->session()->pull('activate_tab', 'SAG_lama');
$activate_tab = request()->session()->pull('activate_tab', 'SAG_baru');
$activate_tab_SAG_baru = $activate_tab === 'SAG_baru' ? 'active' : '';
$aria_selected_SAG_baru = $activate_tab === 'SAG_baru' ? 'true' : 'false';
@@ -368,91 +387,41 @@
</nav>
<div class="tab-content" id="navtawarruqdannottawarruq">
<div class="tab-pane fade {{ $activate_pane_SAG_baru }}" id="nav-tawarruq" role="tabpanel" aria-labelledby="nav-tawarruq-tab">
<table class="table table-striped table-hover" id="myTable">
<thead class="thead-dark">
<tr>
<th>Bil</th>
<th>No Rujukan</th>
<th>Tarikh Pembiayaan</th>
<th>Tarikh Matang</th>
<th>Baki Harga Jualan</th>
<th>Baki Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
<th>Keuntungan</th>
<th>Lelong</th>
</tr>
</thead>
</table>
<x-datatable
id="myTable"
filename="SAG_Baru"
:columns="['Bil', 'No Rujukan', 'Tarikh Pembiayaan', 'Tarikh Matang', 'Baki Harga Jualan', 'Baki Pembiayaan', 'Margin', 'Tempoh', 'Keuntungan', 'Lelong', 'Borang Online']"
/>
</div>
<div class="tab-pane fade {{ $activate_pane_SAG_lama }}" id="nav-xtawarruq" role="tabpanel" aria-labelledby="nav-xtawarruq-tab">
<table id="xtawarruq" class="table table-striped table-hover">
<thead class="thead-dark">
{{-- <tr>
<th>Bil</th>
<th>No Rujukan</th>
<th>Tarikh Gadai</th>
<th>Tarikh Matang</th>
<th>Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
<th>Lelong</th>
</tr> --}}
<tr>
<th>Bil</th>
<th>No Rujukan</th>
<th>Tarikh Pembiayaan</th>
<th>Tarikh Matang</th>
<th>Baki Harga Jualan</th>
<th>Baki Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
<th>Keuntungan</th>
<th>Lelong</th>
</tr>
</thead>
</table>
<x-datatable
id="xtawarruq"
filename="SAG_Lama"
:columns="['Bil', 'No Rujukan', 'Tarikh Pembiayaan', 'Tarikh Matang', 'Baki Harga Jualan', 'Baki Pembiayaan', 'Margin', 'Tempoh', 'Keuntungan', 'Lelong', 'Borang Online']"
/>
</div>
</div>
{{-- Sudah Tebus --}}
<table id="dahtebusTable" class="table table-striped table-hover">
<thead class="thead-dark">
<tr>
<th>Bil</th>
<th>No Rujukan</th>
<th>Tarikh Penyelesaian Pembiayaan</th>
<th>Baki Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
</tr>
</thead>
</table>
<x-datatable
id="dahtebusTable"
filename="SAG_Sudah_Tebus"
:columns="['Bil', 'No Rujukan', 'Tarikh Penyelesaian Pembiayaan', 'Baki Pembiayaan', 'Margin', 'Tempoh']"
/>
<table id="lelongTable" class="table table-striped table-hover">
<thead class="thead-dark">
<tr>
<th>Bil</th>
<th>No Rujukan</th>
<th>Tarikh Lelong</th>
<th>Tarikh Tuntut</th>
<th>Pembiayaan</th>
<th>Harga Jual</th>
<th>Jum Tuntut/Bayar</th>
<th>Keuntungan</th>
<th>Caj Lelong</th>
<th>Status Tuntutan</th>
<th>Cetak</th>
</tr>
</thead>
</table>
<x-datatable
id="lelongTable"
filename="SAG_Lelong"
:columns="['Bil', 'No Rujukan', 'Tarikh Lelong', 'Tarikh Tuntut', 'Pembiayaan', 'Harga Jual', 'Jum Tuntut/Bayar', 'Keuntungan', 'Caj Lelong', 'Status Tuntutan', 'Cetak']"
/>
<div class="text-center">
<button class="btn btn-primary" onclick="ubahfunc(this)" id="button-edit-gadaian">Ubah</button>
<button class="btn btn-primary" onclick="hapusfunc()">Hapus</button>
<button class="btn btn-primary" onclick="histfunc()">Rekod Pembiayaan</button>
<button class="btn btn-primary" onclick="removeansuran(this)" id="button-remove-ansuran">Hapus Ansuran</button>
<button class="btn btn-info" type="button" onclick="cetakBorangOnlineSelected()">Cetak Borang Online</button>
</div>
</div>
@@ -671,6 +640,33 @@
</div>
</div>
<div class="modal fade" id="export_maklumat_modal" tabindex="-1" aria-labelledby="export_maklumat_modalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered" style="max-width: 920px;">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="export_maklumat_modalLabel">Eksport Maklumat Pelanggan</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body p-0" style="height: 80vh; background: #e8eaed;">
<iframe id="export_maklumat_iframe"
src="about:blank"
title="Maklumat Pelanggan"
style="width: 100%; height: 100%; border: 0;"></iframe>
</div>
</div>
</div>
</div>
<script>
$('#export_maklumat_modal').on('show.bs.modal', function () {
$('#export_maklumat_iframe').attr('src', '{{ route('customer.print.maklumat', ['noic' => $noic]) }}');
});
$('#export_maklumat_modal').on('hidden.bs.modal', function () {
$('#export_maklumat_iframe').attr('src', 'about:blank');
});
</script>
<div class="modal fade" id="opt_modal" tabindex="-1" aria-labelledby="opt_modalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
@@ -715,90 +711,94 @@
</div>
</div>
<script>
var api_arrahnbid = "<?php echo config('app.api_arrahnbid'); ?>";
var api_url = "<?php echo $api_url; ?>";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
var min_komoditi = "{{ $min_komoditi }}";
$('#daftar_gadai').on('click', function() {
$("#daftar_gadai").prop('disabled', true);
var noic = $('#noic').val();
var iclama = "{{ $customer_info['kplama'] }}";
var icbaru = "{{ $customer_info['kpbaru'] }}";
var outstanding_semasa = "{{ $outstanding_semasa }}";
<script>
var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
var min_komoditi = "{{ $min_komoditi }}";
$('#daftar_gadai').on('click', function() {
$("#daftar_gadai").prop('disabled', true);
var noic = $('#noic').val();
var iclama = "{{ $customer_info['kplama'] }}";
var icbaru = "{{ $customer_info['kpbaru'] }}";
var outstanding_semasa = "{{ $outstanding_semasa }}";
event.preventDefault();
if (outstanding_semasa >= 300000) {
Swal.fire({
icon: 'error',
title: 'Had Pembiayaan',
text: 'Outstanding Pembiayaan Pelanggan Telah Melebihi Had'
});
$("#daftar_gadai").prop('disabled', false);
event.preventDefault();
if (outstanding_semasa >= 300000) {
Swal.fire({
icon: 'error',
title: 'Had Pembiayaan',
text: 'Outstanding Pembiayaan Pelanggan Telah Melebihi Had'
});
$("#daftar_gadai").prop('disabled', false);
event.preventDefault();
return false;
} else {
$.ajax({
method: 'get',
url: api_url + '/api/komuditi/check',
success: function(data) {
var check_komuditi = Object.keys(data).length;
if (check_komuditi == 0) {
return false;
} else {
$.ajax({
method: 'get',
url: api_url + '/api/komuditi/check',
success: function(data) {
var check_komuditi = Object.keys(data).length;
if (check_komuditi == 0) {
Swal.fire({
icon: 'error',
title: 'Unit Komoditi Berbaki Minima',
text: 'Sila Hubungi Operasi Untuk Membuat Pembelian Komoditi'
});
$("#daftar_gadai").prop('disabled', false);
event.preventDefault();
return false;
} else {
if (Number(data['unit_komuditi']) <= min_komoditi) {
$("#daftar_gadai").prop('disabled', false);
Swal.fire({
icon: 'error',
title: 'Unit Komoditi Berbaki Minima',
text: 'Sila Hubungi Operasi Untuk Membuat Pembelian Komoditi'
});
$("#daftar_gadai").prop('disabled', false);
event.preventDefault();
return false;
} else {
if (Number(data['unit_komuditi']) <= min_komoditi) {
$("#daftar_gadai").prop('disabled', false);
Swal.fire({
icon: 'error',
title: 'Unit Komoditi Berbaki Minima',
text: 'Sila Hubungi Operasi Untuk Membuat Pembelian Komoditi'
});
event.preventDefault();
return false;
if (icbaru.length > 0) {
window.location.href =
"{{ route('gadaian', ['noic' => $customer_info['kpbaru']]) }}";
} else {
if (icbaru.length > 0) {
window.location.href =
"{{ route('gadaian', ['noic' => $customer_info['kpbaru']]) }}";
} else {
window.location.href =
"{{ route('gadaian', ['noic' => $customer_info['kplama']]) }}";
}
window.location.href =
"{{ route('gadaian', ['noic' => $customer_info['kplama']]) }}";
}
}
}
});
}
});
}
});
$('a[data-toggle="tab"]').on('shown.bs.tab', function () {
if (typeof adjustErahnDatatables === 'function') {
adjustErahnDatatables();
}
});
$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
// here is the new selected tab id
var selectedTabId = e.target.id;
});
var tablegadai = $('#myTable').DataTable({
"scrollX": false,
order: [
[1, 'desc']
var tablegadai = initErahnDatatable('#myTable', {
order: [[1, 'desc']],
columnDefs: [
{ targets: 0, orderable: false, width: '40px' },
{ targets: -1, orderable: false, searchable: false, width: '70px' }
]
});
var xtawarruq = $('#xtawarruq').DataTable({
"scrollX": false
var xtawarruq = initErahnDatatable('#xtawarruq', {
columnDefs: [
{ targets: 0, orderable: false, width: '40px' }
]
});
var tabledahtebus = $('#dahtebusTable').DataTable({});
var tabledahtebus = initErahnDatatable('#dahtebusTable');
var tablelelong = $('#lelongTable').DataTable({
"scrollX": false
var tablelelong = initErahnDatatable('#lelongTable', {
columnDefs: [
{ targets: -1, orderable: false, searchable: false, width: '80px' }
]
});
var historybayarandatatable = $('#tablehistorybayaran').DataTable({
@@ -813,6 +813,41 @@
minimumFractionDigits: 2
});
function urlBorangOnline(norujukan) {
return '{{ url("/gadai/borang-pengesahan-online") }}/' + encodeURIComponent(norujukan);
}
function cetakBorangOnlineCell(gadai_detail) {
var cara = String(gadai_detail['cara_terima'] || '').toUpperCase();
if (cara !== 'ONLINE') {
return '';
}
return '<a class="btn btn-sm btn-info" href="' + urlBorangOnline(gadai_detail['norujukan']) +
'" target="_blank" title="Cetak borang pengesahan online"><i class="fas fa-print"></i></a>';
}
function cetakBorangOnlineSelected() {
var selected = $('input[name="belum"]:checked');
if (!selected.length) {
Swal.fire({
icon: 'warning',
title: 'Sila pilih SAG',
text: 'Pilih pembiayaan untuk cetak borang pengesahan.'
});
return;
}
var cara = String(selected.data('cara-terima') || '').toUpperCase();
if (cara !== 'ONLINE') {
Swal.fire({
icon: 'info',
title: 'Bukan pembiayaan online',
text: 'Borang ini hanya untuk SAG yang terima pembiayaan secara online.'
});
return;
}
window.open(urlBorangOnline(selected.val()), '_blank');
}
function getGadaiByNorujukan(norujukan) {
console.log(norujukan);
let gadai_tawarruq = fetch(api_url + '/api/gadai/norujukan/' + norujukan);
@@ -1214,8 +1249,8 @@
let table_norujukan = gadai_detail["norujukan"];
tablegadai.row.add([
'<input type="radio" value=' + gadai_detail["norujukan"] +
' name="belum"/>',
'<input type="radio" value="' + gadai_detail["norujukan"] +
'" name="belum" data-cara-terima="' + (gadai_detail['cara_terima'] || '') + '"/>',
'<a href="#" onclick="checkserah(this)" data-pinjaman=' +
gadai_detail['pinjaman'] + ' data-hargajualan=' +
gadai_detail['hargajualan'] + ' data-norujukan=' +
@@ -1232,6 +1267,7 @@
'RM ' + formatter.format(upahsemasa['pendapatan']),
'<div style="white-space: nowrap; color:red; font-weight: bolder">' +
taglel + '</div>',
cetakBorangOnlineCell(gadai_detail),
]).draw();
}
} else if (jenistebus == "sudah_tebus") {
@@ -1551,6 +1587,9 @@
success: function(data) {
$('#myTable').parents('div.dataTables_wrapper').first().show();
gadaiTable(data, "belum_tebus");
if (typeof adjustErahnDatatables === 'function') {
adjustErahnDatatables();
}
}
});
@@ -2807,6 +2846,9 @@
url: api_url + "/api/customers/" + noic + "/gadai/belum_tebus/" + kodcaw,
success: function(data) {
gadaiTable(data, "belum_tebus");
if (typeof adjustErahnDatatables === 'function') {
adjustErahnDatatables();
}
}
});
}