Merge branch 'afiqhamzah-feat-mykad-reader-registration' into 'new-super'

Change poskod input interaction

See merge request online-sistem1/kaunter!225
This commit is contained in:
hafifie rahman
2023-03-28 16:21:21 +00:00
12 changed files with 762 additions and 199 deletions
@@ -173,6 +173,18 @@ class CustomersController extends Controller
$no_pelanggan = $request->bangsa . substr($request->noic,6,2).'-'.$count;
$detail_poskod = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/poskod/' . $request->poskod)->json();
if(empty($detail_poskod)){
$detail_poskod = Http::withOptions(['verify' => config('app.api_verify')])
->post(config('api.url') . '/api/poskod', [
'poskod' => $request->poskod,
'koddaerah' => $request->koddaerah,
'kodnegeri' => $request->kodnegeri,
'user' => auth()->user(),
])->json();
}
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/customers/create/'. $auth_user['cawangan'],[
'kodcaw' => $auth_user['cawangan'],
'nopelanggan' => $no_pelanggan,
+4 -1
View File
@@ -31,6 +31,7 @@ class HomeController extends Controller
$auth_user = Auth::user();
$api_url = config('api.url');
if(session()->has('iklan') && session()->get('iklan') == 0)
{
session()->put('iklan', 1);
@@ -40,6 +41,7 @@ class HomeController extends Controller
}
}
if($auth_user['roles'] == 'teller'){
if($auth_user['role_harian'] == 'teller'){
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
@@ -55,13 +57,14 @@ class HomeController extends Controller
}
}
elseif($auth_user['roles'] == 'pc' || $auth_user['roles'] == 'ppc'){
$countkhazanah = 0;
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get( config('api.url') .'/api/gadai/serah_marhun/khazanah/'. $auth_user['cawangan'])->json();
$listserah = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/listSerahMarhunController/'.$auth_user['cawangan'])->json();
$countkhazanah = sizeof($gadai) + sizeof($listserah);
return view('homepage.khazanah.home',compact('cawangan_info','api_url','countkhazanah'));
}
else{
+4 -4
View File
@@ -31,10 +31,10 @@ class NoHttpCache
/**
* @var $headers \Symfony\Component\HttpFoundation\HeaderBag
*/
$response->header('Pragma', 'no-cache');
$response->header('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT');
$response->header('Cache-Control', 'no-cache, must-revalidate, no-store, max-age=0, private');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT');
$response->headers->set('Cache-Control', 'no-cache, must-revalidate, no-store, max-age=0, private');
return $response;
}
}
}
+5
View File
@@ -48,6 +48,11 @@ return [
'root' => storage_path('app'),
],
'supports' => [
'driver' => 'local',
'root' => storage_path('drivers'),
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
+208 -172
View File
@@ -1,258 +1,294 @@
WebSocketManager = {
url:"",
WebSocketManager = {
url:"",
init: function(url) {
WebSocketManager.url = url;
},
open: function(callback, slot) {
},
open: function(callback, slot) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"OPEN","Slot":"'+ slot +'"}');
};
wsocket.send('{"Cmd":"OPEN","Slot":"'+ slot +'"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
wsocket.close();
callback(obj);
};
},
listReader: function(callback) {
};
},
listReader: function(callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"LIST_READER"}');
};
wsocket.send('{"Cmd":"LIST_READER"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode);
};
},
};
wsocket.onerror = evt => {
let hideLoader = () => {
let pageLoader = document.getElementById('page_loader');
pageLoader.removeAttribute('class');
};
hideLoader();
wsocket.close();
Swal.fire({
icon: 'error',
title: 'MyKad driver/services tidak dapat dikesan, sila pasang driver',
html: `
<div class="mt-2">
<button type="button" class="btn-download-driver btn btn-outline-secondary btn-lg mb-2">
Download driver <i class="fa fa-download"></i>
</button><br>
<button type="button" class="btn-yes swal2-confirm swal2-styled">OK</button><br>
</div>
`,
showCancelButton: false,
showConfirmButton: false,
willOpen: () => {
const yes = document.querySelector('button.btn-yes')
const download_driver = document.querySelector('button.btn-download-driver')
yes.addEventListener('click', () => {
swal.close();
})
download_driver.addEventListener('click', () => {
window.location.href = mykad_reader_driver_endpoint;
})
}
});
};
},
close: function(callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"CLOSE"}');
};
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
wsocket.close();
callback(obj);
};
},
verifyFPTemplate: function(callback, ThumbCode, Bas64FPLeft, Bas64FPRight) {
},
verifyFPTemplate: function(callback, ThumbCode, Bas64FPLeft, Bas64FPRight) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"VERIFY_FP_TEMPLATE","ThumbCode":"'+ ThumbCode +'","Bas64FPLeft":"'+ Bas64FPLeft +'","Bas64FPRight":"'+ Bas64FPRight +'"}');
};
wsocket.send('{"Cmd":"VERIFY_FP_TEMPLATE","ThumbCode":"'+ ThumbCode +'","Bas64FPLeft":"'+ Bas64FPLeft +'","Bas64FPRight":"'+ Bas64FPRight +'"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
wsocket.close();
callback(obj.RespCode, obj.RespMessage);
};
callback(obj.RespCode, obj.RespMessage);
};
},
readMyKad: function (callback) {
readMyKad: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"READ_MYKAD"}');
};
wsocket.send('{"Cmd":"READ_MYKAD"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
readAllText: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"READ_ALL_TEXT"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
readPhoto: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"READ_PHOTO"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
readBio: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"READ_BIO"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
readMyKid: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"READ_MYKID"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioEnrol: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_ENROL"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
//var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(obj);
};
},
getThumbImage: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"GET_MYKAD_THUMB_IMAGE"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
getThumbBin1: function (callback) {
};
},
readAllText: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"GET_THUMB_BIN1"}');
};
wsocket.send('{"Cmd":"READ_ALL_TEXT"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
getThumbBin2: function (callback) {
};
},
readPhoto: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"GET_THUMB_BIN2"}');
};
wsocket.send('{"Cmd":"READ_PHOTO"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioEnrolBin1: function (callback) {
};
},
readBio: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_ENROL_BIN1"}');
};
wsocket.send('{"Cmd":"READ_BIO"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
readMyKid: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"READ_MYKID"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioEnrol: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_ENROL"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
//var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(obj);
};
},
FPBioEnrolBin2: function (callback) {
};
},
getThumbImage: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_ENROL_BIN2"}');
};
wsocket.send('{"Cmd":"GET_MYKAD_THUMB_IMAGE"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
getThumbBin1: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"GET_THUMB_BIN1"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
getThumbBin2: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"GET_THUMB_BIN2"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioEnrolBin1: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_ENROL_BIN1"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
//var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(obj);
};
},
FPBioVerify: function (callback) {
};
},
FPBioEnrolBin2: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_VERIFY"}');
};
wsocket.send('{"Cmd":"FP_BIO_ENROL_BIN2"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
//var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioVerifyBin: function (callback) {
callback(obj);
};
},
FPBioVerify: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_VERIFY_BIN"}');
};
wsocket.send('{"Cmd":"FP_BIO_VERIFY"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioVerifyLeft: function (callback) {
};
},
FPBioVerifyBin: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_VERIFY_LEFT"}');
};
wsocket.send('{"Cmd":"FP_BIO_VERIFY_BIN"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioVerifyBinLeft: function (callback) {
};
},
FPBioVerifyLeft: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_VERIFY_BIN_LEFT"}');
};
wsocket.send('{"Cmd":"FP_BIO_VERIFY_LEFT"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioVerifyRight: function (callback) {
};
},
FPBioVerifyBinLeft: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_VERIFY_RIGHT"}');
};
wsocket.send('{"Cmd":"FP_BIO_VERIFY_BIN_LEFT"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
},
FPBioVerifyBinRight: function (callback) {
};
},
FPBioVerifyRight: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_VERIFY_BIN_RIGHT"}');
};
wsocket.send('{"Cmd":"FP_BIO_VERIFY_RIGHT"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
}
};
},
FPBioVerifyBinRight: function (callback) {
wsocket = new WebSocket(WebSocketManager.url);
wsocket.onopen = function () {
wsocket.send('{"Cmd":"FP_BIO_VERIFY_BIN_RIGHT"}');
};
wsocket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
var data = JSON.parse(obj.RespMessage);
wsocket.close();
callback(data, obj.RespCode, obj.RespSW12AndApiName);
};
}
}
+1 -1
View File
@@ -205,7 +205,7 @@ let original_photo_loader = document.querySelector("#photo-mykad").src;
let mykad_modal = document.querySelector("#daftar_pelanggan_mykad_reader");
let photo_container = mykad_modal.querySelector("#photo-mykad-container");
modal_form.querySelector("input[name='name']").value = data.OrgName;
modal_form.querySelector("textarea[name='name']").value = data.OrgName;
modal_form.querySelector("input[name='noic']").value = getMyKadNumberWithoutHypens(data.IDNum);
modal_form.querySelector("input[name='tarikh_lahir']").value = getFormattedDateOfBirth(data.BirthDate);
modal_form.querySelector("input[name='negeri_lahir']").value = data.BirthPlace;
+172
View File
@@ -0,0 +1,172 @@
let handlePoskodDetail_NotFound_MyKad = (modal) => {
let input_negeri = modal.querySelector('input#negeri');
let input_daerah = modal.querySelector('input#daerah');
let select_daerah = modal.querySelector('select#select-daerah');
handlePoskodDetail_NotFound(modal, input_negeri, input_daerah, select_daerah);
}
let handlePoskodDetail_Found_MyKad = (modal) => {
let input_negeri = modal.querySelector('input#negeri');
let input_daerah = modal.querySelector('input#daerah');
let select_daerah = modal.querySelector('select#select-daerah');
handlePoskodDetail_Found(input_negeri, input_daerah, select_daerah);
}
let handlePoskodDetail_NotFound_Passport = (modal) => {
let input_negeri = modal.querySelector('input#passport_negeri');
let input_daerah = modal.querySelector('input#passport_daerah');
let select_daerah = modal.querySelector('select#select-daerah');
handlePoskodDetail_NotFound(modal, input_negeri, input_daerah, select_daerah);
}
let handlePoskodDetail_Found_Passport = (modal) => {
let input_negeri = modal.querySelector('input#passport_negeri');
let input_daerah = modal.querySelector('input#passport_daerah');
let select_daerah = modal.querySelector('select#select-daerah');
handlePoskodDetail_Found(input_negeri, input_daerah, select_daerah);
}
let handlePoskodDetail_NotFound = (modal, input_negeri, input_daerah, select_daerah) => {
input_daerah.closest('div.col-md-8').style.display = 'none';
input_daerah.disabled = true;
input_daerah.required = false;
select_daerah.closest('div.col-md-8').style.display = 'block';
select_daerah.disabled = false;
select_daerah.readOnly = false;
select_daerah.required = true;
input_negeri.value = '';
input_negeri.placeholder = '';
let getAllNegeri = () => {
return fetch(api_url + '/api/daerah');
};
$(select_daerah).attr("data-placeholder","Sila pilih daerah");
$(select_daerah).val('').trigger('change');
getAllNegeri()
.then(response => response.json())
.then(x => x.map(y => {
return {
"id": y.namadaerah,
"text": y.namadaerah + ' - ' + y.negeri.negeri,
"data-koddaerah": y.koddaerah,
}
}))
.then(x => {
$(select_daerah).select2({
placeholder: "Sila pilih daerah pelanggan",
closeOnSelect: true,
dropdownPosition: 'below',
data: x,
dropdownParent: $(modal),
});
})
.then(() => $(select_daerah).val('').trigger('change'));
};
let handlePoskodDetail_Found = (input_negeri, input_daerah, select_daerah) => {
select_daerah.closest('div.col-md-8').style.display = 'none';
select_daerah.disabled = 'true';
select_daerah.required = false;
input_daerah.closest('div.col-md-8').style.display = 'block';
input_daerah.disabled = false;
input_daerah.required = true;
input_negeri.readOnly = true;
input_negeri.placeholder = '';
input_daerah.readOnly = true;
input_daerah.placeholder = '';
};
$('select.select2-daerah').on('select2:select', function (e) {
let caller = e.target || e.srcElement;
let modal = caller.closest('div.modal.fade');
let input_negeri = modal.querySelector('input[name="negeri"]');
let selected_daerah = e.params.data;
let selected_kod_daerah = selected_daerah['data-koddaerah'];
let getDaerahDetail = (koddaerah) => {
return fetch(api_url + '/api/daerah/' + koddaerah)
.then(response => response.json())
.then(x => fetch(api_url + '/api/negeri/' + x.kodnegeri))
.then(response => response.json())
};
let populatePostcodeRegistrationInputs = (koddaerah, kodnegeri) => {
const input_koddaerah = document.createElement("input");
input_koddaerah.className = "d-none";
input_koddaerah.name = "koddaerah";
input_koddaerah.value = koddaerah;
const input_kodnegeri = document.createElement("input");
input_kodnegeri.className = "d-none";
input_kodnegeri.name = "kodnegeri";
input_kodnegeri.value = kodnegeri;
modal.querySelector('form').appendChild(input_koddaerah);
modal.querySelector('form').appendChild(input_kodnegeri);
}
getDaerahDetail(selected_kod_daerah)
.then(x => {
populatePostcodeRegistrationInputs(selected_kod_daerah, x.kodnegeri)
return x;
})
.then(x => input_negeri.value = x.negeri);
});
$('#daftar_pelanggan_mykad_reader textarea#alamat').change(function(){
let modal = document.querySelector('#daftar_pelanggan_mykad_reader');
let input_poskod = modal.querySelector('input#poskod');
let input_daerah = modal.querySelector('input#daerah');
let input_negeri = modal.querySelector('input#negeri');
let select_daerah = modal.querySelector('select#select-daerah');
input_poskod.value = '';
input_poskod.readOnly = false;
input_daerah.value = '';
input_daerah.closest('div.col-md-8').style.display = 'none';
input_daerah.disabled = true;
input_daerah.readOnly = true;
select_daerah.closest('div.col-md-8').style.display = 'block';
select_daerah.disabled = true;
select_daerah.readOnly = false;
// Handle stubborn select2
let isSelect2exist = modal.querySelector('span.select2');
if(isSelect2exist){
modal.querySelector('span.select2')
.querySelector('span.select2-selection__rendered')
.textContent = '';
$(select_daerah).select2('destroy');
}
select_daerah.value = ''
input_negeri.value = '';
input_negeri.readOnly = true;
input_poskod.focus();
});
+88 -17
View File
@@ -6,6 +6,7 @@
visibility: hidden;
position: absolute;
}
</style>
<div class="container">
<div class="row justify-content-center">
@@ -40,6 +41,9 @@
@php
$user_cawangan = strtolower(auth()->user()->cawangan_kerja->details_caw);
$enabled_cawangan = array_map(fn($x) => strtolower($x), config('mykad-reader.enabled_cawangan'));
$is_in_pelanggan_main_page = request()->path() === 'pelanggan';
$is_enabled_to_use_mykad_reader = function () use($user_cawangan, $enabled_cawangan){
if(sizeof($enabled_cawangan) == 0){
@@ -55,7 +59,8 @@
};
@endphp
@if( $is_enabled_to_use_mykad_reader() )
@if( $is_in_pelanggan_main_page && $is_enabled_to_use_mykad_reader() )
<span class="btn btn-outline-primary" id="button_read_mykad">Baca MyKad</span>
@endif
</div>
@@ -121,13 +126,7 @@
</select>
</div>
<div class="col-md-4">Ahli</div>
<div class="col-md-8">
<select class="form-control" name="kumpulan_sahabat" id="kumpulan_sahabat">
<option value="0">Tidak</option>
<option value="1">Kumpulan PKINK</option>
<option value="2">Sahabat</option>
</select>
</div>
</div>
</div>
<div class="col-md-6">
@@ -137,15 +136,20 @@
<div class="col-md-4">Poskod</div>
<div class="col-md-8"><input class="form-control" type="text" name="poskod" id="poskod" autocomplete="off" placeholder="Poskod"></div>
<div class="col-md-4">Daerah</div>
<div class="col-md-8"><input class="form-control" type="text" name="daerah" id="daerah" readonly autocomplete="off"></div>
<div class="col-md-8" style="display: none;">
<input class="form-control" type="text" name="daerah" id="daerah" autocomplete="off" readonly required>
</div>
<div class="col-md-8">
<select class="select2-daerah form-control" name="select-daerah" id="select-daerah" data-placeholder="Sila pilih daerah" style="width: 100%;" readonly disabled></select>
</div>
<div class="col-md-4">Negeri</div>
<div class="col-md-8"><input class="form-control" type="text" name="negeri" id="negeri" readonly autocomplete="off"></div>
<div class="col-md-8"><input class="form-control" type="text" name="negeri" id="negeri" autocomplete="off" readonly required></div>
<div class="col-md-4">Umur</div>
<div class="col-md-8"><input class="form-control" type="text" name="age" id="age" readonly></div>
<div class="col-md-4">Bangsa</div>
<div class="col-md-8">
<select class="form-control" name="bangsa" id="bangsa">
<option selected value="M">Melayu</option>
<option value="M">Melayu</option>
<option value="C">Cina</option>
<option value="I">India</option>
<option value="L">Lain-lain</option>
@@ -219,7 +223,7 @@
<div class="col-md-6">
<div class="row form-group">
<div class="col-md-4">Nama</div>
<div class="col-md-8"><input class="form-control" type="text" name="name" id="name" autocomplete="off" placeholder="Nama" readonly></div>
<div class="col-md-8"><textarea class="form-control" style="resize:none" name="name" id="name" autocomplete="off" placeholder="Nama" readonly></textarea></div>
<div class="col-md-4">No KP</div>
<div class="col-md-8"><input class="form-control" type="text" name="noic" id="noic" value="{{$noic ?? ''}}" readonly></div>
<div class="col-md-4">Tarikh Lahir</div>
@@ -267,13 +271,18 @@
<div class="col-md-6">
<div class="row form-group">
<div class="col-md-4">Alamat</div>
<div class="col-md-8"><textarea class="form-control" style="resize:none" name="alamat" id="alamat" cols="30" rows="3" placeholder="Alamat Pelanggan" readonly></textarea></div>
<div class="col-md-8"><textarea class="form-control" style="resize:none" name="alamat" id="alamat" cols="30" rows="3" placeholder="Alamat Pelanggan"></textarea></div>
<div class="col-md-4">Poskod</div>
<div class="col-md-8"><input class="form-control" type="text" name="poskod" id="poskod" autocomplete="off" placeholder="Poskod" readonly></div>
<div class="col-md-4">Daerah</div>
<div class="col-md-8"><input class="form-control" type="text" name="daerah" id="daerah" readonly autocomplete="off" readonly></div>
<div class="col-md-8">
<input class="form-control" type="text" name="daerah" id="daerah" autocomplete="off" readonly required>
</div>
<div class="col-md-8" style="display: none;">
<select class="select2-daerah form-control" name="select-daerah" id="select-daerah" data-placeholder="Pilih daerah" style="width: 100%;" readonly disabled></select>
</div>
<div class="col-md-4">Negeri</div>
<div class="col-md-8"><input class="form-control" type="text" name="negeri" id="negeri" readonly autocomplete="off" readonly></div>
<div class="col-md-8"><input class="form-control" type="text" name="negeri" id="negeri" readonly autocomplete="off" required></div>
<div class="col-md-4">Umur</div>
<div class="col-md-8"><input class="form-control" type="text" name="age" id="age" readonly></div>
<div class="col-md-4">Bangsa</div>
@@ -393,9 +402,12 @@
<div class="col-md-4">Poskod</div>
<div class="col-md-8"><input class="form-control" type="text" name="poskod" id="passport_poskod" autocomplete="off" placeholder="Poskod"></div>
<div class="col-md-4">Daerah</div>
<div class="col-md-8"><input class="form-control" type="text" name="daerah" id="passport_daerah" readonly autocomplete="off"></div>
<div class="col-md-8" style="display: none;"><input class="form-control" type="text" name="daerah" id="passport_daerah" autocomplete="off" readonly required></div>
<div class="col-md-8">
<select class="select2-daerah form-control" name="select-daerah" id="select-daerah" data-placeholder="Pilih daerah" style="width: 100%;" readonly disabled></select>
</div>
<div class="col-md-4">Negeri</div>
<div class="col-md-8"><input class="form-control" type="text" name="negeri" id="passport_negeri" readonly autocomplete="off"></div>
<div class="col-md-8"><input class="form-control" type="text" name="negeri" id="passport_negeri" autocomplete="off" readonly ></div>
<div class="col-md-4">Umur</div>
<div class="col-md-8"><input class="form-control" type="text" name="age" id="passport_age" readonly></div>
<div class="col-md-4">Bangsa</div>
@@ -555,6 +567,14 @@
method:'GET',
url:api_url+'/api/poskod/'+poskod,
success:function(poskod_detail){
let parent_modal = document.querySelector('#daftar_pelanggan');
if(Object.keys(poskod_detail).length === 0){
handlePoskodDetail_NotFound_MyKad(parent_modal);
return;
}
var koddaerah = poskod_detail['koddaerah'];
var kodnegeri = poskod_detail['kodnegeri'];
$.ajax({
@@ -571,10 +591,50 @@
$('#daerah').val(daerah['namadaerah']);
}
});
handlePoskodDetail_Found_MyKad(parent_modal);
}
});
});
$('#daftar_pelanggan_mykad_reader input#poskod').change(function(){
var poskod = this.value;
$.ajax({
method:'GET',
url:api_url+'/api/poskod/'+poskod,
success:function(poskod_detail){
let parent_modal = document.querySelector('#daftar_pelanggan_mykad_reader');
if(Object.keys(poskod_detail).length === 0){
handlePoskodDetail_NotFound_MyKad(parent_modal);
return;
}
var koddaerah = poskod_detail['koddaerah'];
var kodnegeri = poskod_detail['kodnegeri'];
$.ajax({
url:api_url+'/api/negeri/'+kodnegeri,
method:'GET',
success:function(negeri){
$('#daftar_pelanggan_mykad_reader #negeri').val(negeri['negeri']);
}
});
$.ajax({
url:api_url+'/api/daerah/'+koddaerah,
method:'GET',
success:function(daerah){
$('#daftar_pelanggan_mykad_reader #daerah').val(daerah['namadaerah']);
}
});
handlePoskodDetail_Found_MyKad(parent_modal);
}
});
});
$('#passport_poskod').change(function(){
var poskod = this.value;
@@ -582,6 +642,13 @@
method:'GET',
url:api_url+'/api/poskod/'+poskod,
success:function(poskod_detail){
let parent_modal = document.querySelector('#passport_pelanggan');
if(Object.keys(poskod_detail).length === 0){
handlePoskodDetail_NotFound_Passport(parent_modal);
return;
}
var koddaerah = poskod_detail['koddaerah'];
var kodnegeri = poskod_detail['kodnegeri'];
$.ajax({
@@ -598,6 +665,8 @@
$('#passport_daerah').val(daerah['namadaerah']);
}
});
handlePoskodDetail_Found_Passport(parent_modal);
}
});
});
@@ -1206,9 +1275,11 @@
// mycard-read endpoint initialization
let mykad_reader_endpoint = "{{ config('mykad-reader.endpoint') }}";
let wakil_caricustomer_endpoint = "{{ route('wakil.caricustomer') }}";
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/postcode-concerns.js') }}"></script>
@endpush
@endsection
+13 -4
View File
@@ -76,6 +76,15 @@
flex-direction: column;
align-items: flex-start !important;
}
.select2-container .select2-selection--single {
height: 37px;
}
.select2-container .select2-selection--single .select2-selection__rendered {
padding-left: 0px;
}
</style>
</head>
@@ -318,11 +327,11 @@
</nav>
@if ($auth_user['roles'] == 'ppc' || $auth_user['roles'] == 'pc')
@php
@php
$current = Carbon\Carbon::now();
$tarikhsemasa = $current->toDateString();
$cawangan = App\CawanganAR::where('kodcaw',$auth_user['cawangan'])->get()->toArray();
$getVault = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/TunaiDiTangan/' . $auth_user['cawangan'],['tarikh' => $tarikhsemasa])->json();
@endphp
@@ -359,7 +368,7 @@
</script>
@endif
<main class="py-4">
@yield('content')
</main>
@@ -0,0 +1,247 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Muat Turun</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.2/d3.min.js"
integrity="sha512-+uTBQREQVLccPeGbB3Q0R5TC/1mfAoRg9fomTL3iOb+kpCCWS5WjMdM1dYE1e1dB/pxEi0Zc2VdFJcCT72QyuA=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<style>
@import url(https://fonts.googleapis.com/css?family=Open+Sans:800);
.container-countdown {
margin: auto;
width: 400px;
}
.path--background {
fill: rgb(34, 213, 201);
stroke: #fff;
stroke-width: 0px;
}
.pulse {
fill: rgb(255, 74, 74) !important;
}
.path--foreground {
fill: #eee;
stroke: #eee;
stroke-width: 2px;
}
.label {
font: 90px "Open Sans";
font-weight: 900;
text-anchor: middle;
fill: rgb(34, 213, 201);
}
h1 {
font: "Open Sans";
font-weight: 900;
text-anchor: middle;
}
.container-page {
display: flex;
justify-content: center;
align-items: center;
/* for single line flex container */
align-content: center;
/* for multi-line flex container */
height: 100vh;
}
</style>
</head>
<body>
<div class="container-page">
<div class="container-countdown"></div>
</div>
<script>
var width = 400,
height = 400,
timePassed = 0,
timeLimit = 15;
var fields = [{
value: timeLimit,
size: timeLimit,
update: function() {
return timePassed = timePassed + 1;
}
}];
var nilArc = d3.svg.arc()
.innerRadius(width / 3 - 133)
.outerRadius(width / 3 - 133)
.startAngle(0)
.endAngle(2 * Math.PI);
var arc = d3.svg.arc()
.innerRadius(width / 3 - 55)
.outerRadius(width / 3 - 25)
.startAngle(0)
.endAngle(function(d) {
return ((d.value / d.size) * 2 * Math.PI);
});
var svg = d3.select(".container-countdown").append("svg")
.attr("width", width)
.attr("height", height);
var field = svg.selectAll(".field")
.data(fields)
.enter().append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
.attr("class", "field");
var back = field.append("path")
.attr("class", "path path--background")
.attr("d", arc);
var path = field.append("path")
.attr("class", "path path--foreground");
var label = field.append("text")
.attr("class", "label")
.attr("dy", ".35em");
addWaitingText();
(function update() {
field
.each(function(d) {
d.previous = d.value, d.value = d.update(timePassed);
});
path.transition()
.ease("elastic")
.duration(500)
.attrTween("d", arcTween);
if ((timeLimit - timePassed) <= 10)
pulseText();
else
label
.text(function(d) {
return d.size - d.value;
});
if (timePassed <= timeLimit)
setTimeout(update, 1000 - (timePassed % 1000));
else{
destroyTimer();
destroyWaitingText();
downloadMyKadDriver()
.then(() => redirectToPagePelanggan());
}
})();
function pulseText() {
back.classed("pulse", true);
label.classed("pulse", true);
if ((timeLimit - timePassed) >= 0) {
label.style("font-size", "120px")
.attr("transform", "translate(0," + +4 + ")")
.text(function(d) {
return d.size - d.value;
});
}
label.transition()
.ease("elastic")
.duration(900)
.style("font-size", "90px")
.attr("transform", "translate(0," + -10 + ")");
}
function destroyTimer() {
label.transition()
.ease("back")
.duration(700)
.style("opacity", "0")
.style("font-size", "5")
.attr("transform", "translate(0," + -40 + ")")
.each("end", function() {
field.selectAll("text").remove()
});
path.transition()
.ease("back")
.duration(700)
.attr("d", nilArc);
back.transition()
.ease("back")
.duration(700)
.attr("d", nilArc)
.each("end", function() {
field.selectAll("path").remove()
});
}
function arcTween(b) {
var i = d3.interpolate({
value: b.previous
}, b);
return function(t) {
return arc(i(t));
};
}
function addWaitingText()
{
var waiting_text = document.createElement("h1");
waiting_text.innerHTML= "sila tunggu sebentar ... "
waiting_text.style.marginTop = "0px";
waiting_text.style.textAlign = "center";
document.querySelector("svg").after(waiting_text);
}
function destroyWaitingText()
{
var waiting_text = document.querySelector("h1");
waiting_text.innerHTML= "";
}
let redirectToPagePelanggan = () => {
let pelanggan_url = "{{ url('pelanggan') }}";
window.location.href = pelanggan_url
};
function downloadMyKadDriver()
{
let download_driver_file_url = "{{ route('mykadreader.driver.download') }}";
let downloadDriverFile = () => {
return fetch(download_driver_file_url)
.then(response => response.blob())
.then(blob => {
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = 'MyKadReaderDriver.zip';
link.click();
})
.catch(e => console.log(e))
};
return downloadDriverFile();
}
</script>
</body>
</html>
+8
View File
@@ -2,6 +2,7 @@
use Illuminate\Support\Facades\Route;
use App\Services\ImbangdugaServices;
use Illuminate\Support\Facades\Storage;
/*
|--------------------------------------------------------------------------
| Web Routes
@@ -375,3 +376,10 @@ Route::get('admin/searchpelanggan',['as'=>'admin.searchpelanggan','uses'=>'Khaza
Route::get('admin/poskod',['as'=>'admin.poskod','uses'=>'HomeController@poskod']);
Route::get('pembeliannotifykomuditi',['as'=>'beli.notifyKomoditi','uses'=>'OperasiController@notifyKomoditi'])->middleware('auth','operasi');
Route::get('supports/driver/mykad-reader',['as'=>'mykadreader.driver', function(){
return view('supports.driver.mykad-reader.download');
}])->middleware('auth','teller');
Route::get('supports/driver/mykad-reader/download',['as'=>'mykadreader.driver.download', function(){
return Storage::disk('supports')->download('MykadReaderDriver.zip');
}])->middleware('auth','teller');
Binary file not shown.