Feature/whatsapp blast #24
+2
-3
@@ -1,10 +1,10 @@
|
|||||||
APP_NAME=Laravel
|
APP_NAME=Laravel
|
||||||
APP_ENV=local
|
APP_ENV=local
|
||||||
|
APP_VERSION=v3.3
|
||||||
APP_KEY=base64:FFRogE6mJj8FaDSSHl/KpXpzqi2M+P4plxVSRgVM8JI=
|
APP_KEY=base64:FFRogE6mJj8FaDSSHl/KpXpzqi2M+P4plxVSRgVM8JI=
|
||||||
APP_DEBUG=true
|
APP_DEBUG=true
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
API_URL=http://localhost:8000
|
API_URL=http://localhost:8000
|
||||||
API_ARRAHNBID=http://lelong.test/api/
|
|
||||||
|
|
||||||
LOG_CHANNEL=stack
|
LOG_CHANNEL=stack
|
||||||
|
|
||||||
@@ -47,7 +47,6 @@ MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
|||||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||||
|
|
||||||
MYKAD_READER_PORT=17321
|
MYKAD_READER_PORT=17321
|
||||||
MYKAD_READER_ENABLED_CAWANGAN='' # IF NO CAWANGAN STATED, ALL CAWANGAN IS ENABLED
|
MYKAD_READER_ENABLED_CAWANGAN=''
|
||||||
|
|
||||||
# Shared with api_arrahn so the API can write staff inbox rows
|
|
||||||
INTERNAL_NOTIFICATION_SECRET=
|
INTERNAL_NOTIFICATION_SECRET=
|
||||||
|
|||||||
+3
-1
@@ -47,4 +47,6 @@ MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
|||||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||||
|
|
||||||
MYKAD_READER_PORT=17321
|
MYKAD_READER_PORT=17321
|
||||||
MYKAD_READER_ENABLED_CAWANGAN='' # IF NO CAWANGAN STATED, ALL CAWANGAN IS ENABLED
|
MYKAD_READER_ENABLED_CAWANGAN=''
|
||||||
|
|
||||||
|
INTERNAL_NOTIFICATION_SECRET="nIDTe(u@6[)VLJyd"
|
||||||
@@ -9,13 +9,7 @@ CREATE USER 'kaunteruser'@'localhost' IDENTIFIED BY 'your_password';
|
|||||||
|
|
||||||
GRANT ALL PRIVILEGES ON kaunter_erahn.* TO 'kaunteruser'@'%';
|
GRANT ALL PRIVILEGES ON kaunter_erahn.* TO 'kaunteruser'@'%';
|
||||||
FLUSH PRIVILEGES;
|
FLUSH PRIVILEGES;
|
||||||
```
|
```
|
||||||
|
|
||||||
# ADDITIONAL NOTE
|
|
||||||
|
|
||||||
## customers/v2/index.blade.php is modal to register customer
|
|
||||||
|
|
||||||
## Min Komoditi = RM5000
|
|
||||||
|
|
||||||
# System Flowchart
|
# System Flowchart
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
|
||||||
//Events
|
//Events
|
||||||
use App\Events\OperasiNotice;
|
use App\Events\OperasiNotice;
|
||||||
use App\Events\StatusLiked;
|
use App\Events\StatusLiked;
|
||||||
@@ -225,51 +224,19 @@ class OperasiController extends Controller
|
|||||||
'sahkan' => $status
|
'sahkan' => $status
|
||||||
];
|
];
|
||||||
|
|
||||||
Log::info('Menghantar permintaan ke API UpdateKelulusanAnggota', [
|
|
||||||
'endpoint' => $endpoint,
|
|
||||||
'payload' => $payload
|
|
||||||
]);
|
|
||||||
|
|
||||||
$response = Http::withOptions(['verify' => config('app.api_verify')])
|
$response = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
->put($endpoint, $payload);
|
->put($endpoint, $payload);
|
||||||
|
|
||||||
$updatelulus = $response->json();
|
$updatelulus = $response->json();
|
||||||
|
|
||||||
// 3️⃣ Log hasil respon API
|
|
||||||
Log::info('Respon dari API UpdateKelulusanAnggota', [
|
|
||||||
'status' => $response->status(),
|
|
||||||
'body' => $updatelulus
|
|
||||||
]);
|
|
||||||
|
|
||||||
// 4️⃣ Jika berjaya, cipta event notifikasi
|
|
||||||
if ($response->successful() && $updatelulus && isset($updatelulus['success']) && $updatelulus['success'] === true) {
|
if ($response->successful() && $updatelulus && isset($updatelulus['success']) && $updatelulus['success'] === true) {
|
||||||
// $jenis = ($status == 1) ? 'lulus' : 'batal';
|
|
||||||
// event(new NotifikasiAnggota($nokp, $jenis, null, $komen, $namaoperasi));
|
|
||||||
|
|
||||||
$statusText = ($status == 1) ? 'DILULUSKAN' : 'DITOLAK';
|
$statusText = ($status == 1) ? 'DILULUSKAN' : 'DITOLAK';
|
||||||
event(new NotifikasiAnggota($nokp, $statusText, $komen, $namaoperasi));
|
event(new NotifikasiAnggota($nokp, $statusText, $komen, $namaoperasi));
|
||||||
|
|
||||||
|
|
||||||
Log::info('Event NotifikasiAnggota dispatched', [
|
|
||||||
'nokp' => $nokp,
|
|
||||||
'komen' => $komen,
|
|
||||||
'namaoperasi' => $namaoperasi
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
Log::warning('Gagal kemas kini kelulusan anggota', [
|
|
||||||
'nokp' => $nokp,
|
|
||||||
'kodcaw' => $kodcaw,
|
|
||||||
'response' => $updatelulus
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json($updatelulus, $response->status());
|
return response()->json($updatelulus, $response->status());
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
Log::error('Ralat UpdateKelulusanAnggota (frontend)', [
|
|
||||||
'message' => $e->getMessage(),
|
|
||||||
'line' => $e->getLine()
|
|
||||||
]);
|
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
'message' => 'Ralat semasa menghantar kelulusan anggota.',
|
'message' => 'Ralat semasa menghantar kelulusan anggota.',
|
||||||
@@ -278,10 +245,6 @@ class OperasiController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function createkelulusan(Request $request)
|
public function createkelulusan(Request $request)
|
||||||
{
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
@@ -659,26 +622,35 @@ class OperasiController extends Controller
|
|||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan'])->json();
|
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan'])->json();
|
||||||
|
|
||||||
//declare array baru
|
$dateTo = Carbon::now()->toDateString();
|
||||||
$arraykelulusan = [];
|
$dateFrom = Carbon::now()->subDays(30)->toDateString();
|
||||||
|
|
||||||
$kelulusan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/ListOperasiKelulusan/')->json();
|
return view('operasi.rekodtelahlulus', compact('cawangan_info', 'api_url', 'dateFrom', 'dateTo'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function kelulusanrekodlepasData(Request $request)
|
||||||
|
{
|
||||||
|
$params = [
|
||||||
|
'date_from' => $request->query('date_from'),
|
||||||
|
'date_to' => $request->query('date_to'),
|
||||||
|
'search' => $request->query('search'),
|
||||||
|
];
|
||||||
|
|
||||||
foreach ($kelulusan as $index => $k) {
|
$response = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
foreach ($k['kelulusanall'] as $index1 => $kel) {
|
->get(config('api.url') . '/api/ListOperasiKelulusan/', array_filter($params, function ($value) {
|
||||||
$komen = explode("|", $kel['komen']);
|
return $value !== null && $value !== '';
|
||||||
|
}));
|
||||||
|
|
||||||
$results = array_search("", $komen, true);
|
if (!$response->successful()) {
|
||||||
if ($results !== false) {
|
return response()->json(['data' => [], 'error' => 'Gagal memuatkan rekod'], 502);
|
||||||
unset($komen[$results]);
|
|
||||||
}
|
|
||||||
|
|
||||||
array_push($arraykelulusan, ['norujukan' => $kel['norujukan'], 'pinjaman' => $kel['jumpinj'], 'nilaimarhun' => ($komen[1] ?? $kel['nilaimarhun'] ?? '-'), 'berat' => ($komen[2] ?? $kel['berat'] ?? '-'), 'margin' => ($komen[3] ?? $kel['margin'] ?? '-'), 'komen' => ($komen[0] ?? $kel['komen'] ?? '-'), 'status' => ($kel['status'] ?? '-'), 'pelulus' => $kel['operasi'],]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('operasi.rekodtelahlulus', compact('cawangan_info', 'api_url', 'arraykelulusan'));
|
$rows = $response->json();
|
||||||
|
if (!is_array($rows)) {
|
||||||
|
$rows = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json(['data' => $rows]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function notifyKomoditi()
|
public function notifyKomoditi()
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class NotificationService
|
|||||||
const TYPE_PEMBIAYAAN_REJECTED_PC = 'pembiayaan_online.rejected_pc';
|
const TYPE_PEMBIAYAAN_REJECTED_PC = 'pembiayaan_online.rejected_pc';
|
||||||
const TYPE_PEMBIAYAAN_PAID_PC = 'pembiayaan_online.paid_pc';
|
const TYPE_PEMBIAYAAN_PAID_PC = 'pembiayaan_online.paid_pc';
|
||||||
const TYPE_GADAI_KELULUSAN = 'gadai.kelulusan';
|
const TYPE_GADAI_KELULUSAN = 'gadai.kelulusan';
|
||||||
|
const TYPE_ANGGOTA_PENDING_OPERASI = 'anggota.pending_operasi';
|
||||||
const TYPE_ALIRAN_TUNAI_PENDING = 'aliran_tunai.pending_khazanah';
|
const TYPE_ALIRAN_TUNAI_PENDING = 'aliran_tunai.pending_khazanah';
|
||||||
const TYPE_ALIRAN_TUNAI_DECIDED = 'aliran_tunai.decided_teller';
|
const TYPE_ALIRAN_TUNAI_DECIDED = 'aliran_tunai.decided_teller';
|
||||||
const GADAI_KELULUSAN_MIN = 10000;
|
const GADAI_KELULUSAN_MIN = 10000;
|
||||||
@@ -366,6 +367,33 @@ class NotificationService
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($type === self::TYPE_ANGGOTA_PENDING_OPERASI) {
|
||||||
|
$nokp = !empty($data['nokp']) ? $data['nokp'] : '';
|
||||||
|
$nama = isset($data['nama']) ? trim((string) $data['nama']) : '';
|
||||||
|
$teller = isset($data['teller']) ? trim((string) $data['teller']) : '';
|
||||||
|
$komen = isset($data['komen']) ? trim((string) $data['komen']) : '';
|
||||||
|
$namaCaw = !empty($data['cawangan_nama']) ? $data['cawangan_nama'] : $kodcaw;
|
||||||
|
$who = $nama !== '' ? $nama : 'pelanggan';
|
||||||
|
if ($nokp !== '') {
|
||||||
|
$who .= ' ('.$nokp.')';
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'type' => $type,
|
||||||
|
'cawangan' => $kodcaw,
|
||||||
|
'title' => 'Permohonan assign anggota',
|
||||||
|
'body' => sprintf(
|
||||||
|
'%s — %s%s%s',
|
||||||
|
$namaCaw,
|
||||||
|
$who,
|
||||||
|
$teller !== '' ? ' — '.$teller : '',
|
||||||
|
$komen !== '' ? ' — '.$komen : ''
|
||||||
|
),
|
||||||
|
'url' => '/operasi/kelulusan/anggota',
|
||||||
|
'data' => $data,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
if ($type === self::TYPE_GADAI_KELULUSAN) {
|
if ($type === self::TYPE_GADAI_KELULUSAN) {
|
||||||
$norujukan = !empty($data['norujukan']) ? $data['norujukan'] : 'gadai';
|
$norujukan = !empty($data['norujukan']) ? $data['norujukan'] : 'gadai';
|
||||||
$amaun = number_format(isset($data['pinjaman']) ? (float) $data['pinjaman'] : 0, 2);
|
$amaun = number_format(isset($data['pinjaman']) ? (float) $data['pinjaman'] : 0, 2);
|
||||||
|
|||||||
@@ -13,56 +13,95 @@
|
|||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div class="card-body text-center">
|
<div class="card-body">
|
||||||
|
<div class="row mb-3 align-items-end">
|
||||||
<div class="row mb-4">
|
<div class="col-md-3">
|
||||||
<div class="col-2 justify-content-start">
|
<label for="date_from">Tarikh Dari</label>
|
||||||
|
<input type="date" id="date_from" class="form-control" value="{{ $dateFrom }}">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-8 mt-3 justify-content-center">
|
<div class="col-md-3">
|
||||||
|
<label for="date_to">Tarikh Hingga</label>
|
||||||
|
<input type="date" id="date_to" class="form-control" value="{{ $dateTo }}">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2">
|
<div class="col-md-3">
|
||||||
|
<button type="button" id="btn-filter-rekod" class="btn btn-primary mt-3 mt-md-0">Cari</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<table class='table table-striped table-hover' id='table-kelulusan' style="width:100%;">
|
<x-datatable
|
||||||
<thead class="thead-dark">
|
id="table-kelulusan"
|
||||||
<tr>
|
filename="Rekod_Lulus_Operasi"
|
||||||
<th>No Rujukan</th>
|
class="text-center"
|
||||||
<th>Status</th>
|
:columns="['Tarikh', 'No Rujukan', 'Status', 'Komen', 'Nilai Pembiayaan', 'Nilai Marhun', 'Berat', 'Margin', 'Pelulus']"
|
||||||
<th>Komen</th>
|
/>
|
||||||
<th>Nilai Pembiayaan</th>
|
|
||||||
<th>Nilai Marhun</th>
|
|
||||||
<th>Berat</th>
|
|
||||||
<th>Margin</th>
|
|
||||||
<th>Pelulus</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach($arraykelulusan as $index=>$k)
|
|
||||||
<tr>
|
|
||||||
<td>{{ $k['norujukan'] }}</td>
|
|
||||||
<td>{{ $k['status'] }}</td>
|
|
||||||
<td>{{ $k['komen'] }}</td>
|
|
||||||
<td>{{ $k['pinjaman'] }}</td>
|
|
||||||
<td>{{ $k['nilaimarhun'] }}</td>
|
|
||||||
<td>{{ $k['berat'] }}</td>
|
|
||||||
<td>{{ $k['margin'] }}</td>
|
|
||||||
<td>{{ $k['pelulus'] }}</td>
|
|
||||||
</tr>
|
|
||||||
@endforeach
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
|
function escapeHtml(value) {
|
||||||
|
return $('<div>').text(value == null ? '' : String(value)).html();
|
||||||
|
}
|
||||||
|
|
||||||
var tablekelulusan = $('#table-kelulusan').DataTable({
|
var tablekelulusan = initErahnDatatable('#table-kelulusan', {
|
||||||
"scrollX": true
|
deferRender: true,
|
||||||
|
order: [[0, 'desc']],
|
||||||
|
language: {
|
||||||
|
emptyTable: 'Tiada rekod',
|
||||||
|
zeroRecords: 'Tiada rekod dijumpai'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function setLoading(isLoading) {
|
||||||
|
$('#btn-filter-rekod').prop('disabled', isLoading).text(isLoading ? 'Memuatkan...' : 'Cari');
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadRekodLulus() {
|
||||||
|
var dateFrom = $('#date_from').val();
|
||||||
|
var dateTo = $('#date_to').val();
|
||||||
|
|
||||||
|
setLoading(true);
|
||||||
|
tablekelulusan.clear().draw();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: "{{ route('operasi.rekodlepas.data') }}",
|
||||||
|
method: 'GET',
|
||||||
|
data: {
|
||||||
|
date_from: dateFrom,
|
||||||
|
date_to: dateTo
|
||||||
|
},
|
||||||
|
success: function (response) {
|
||||||
|
var rows = response.data || [];
|
||||||
|
var data = rows.map(function (row) {
|
||||||
|
return [
|
||||||
|
escapeHtml(row.tarikh || '-'),
|
||||||
|
escapeHtml(row.norujukan || '-'),
|
||||||
|
escapeHtml(row.status || '-'),
|
||||||
|
escapeHtml(row.komen || '-'),
|
||||||
|
escapeHtml(row.pinjaman || '-'),
|
||||||
|
escapeHtml(row.nilaimarhun || '-'),
|
||||||
|
escapeHtml(row.berat || '-'),
|
||||||
|
escapeHtml(row.margin || '-'),
|
||||||
|
escapeHtml(row.pelulus || '-')
|
||||||
|
];
|
||||||
|
});
|
||||||
|
tablekelulusan.rows.add(data).draw();
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'error',
|
||||||
|
title: 'Ralat',
|
||||||
|
text: 'Gagal memuatkan rekod lulus.'
|
||||||
|
});
|
||||||
|
},
|
||||||
|
complete: function () {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#btn-filter-rekod').on('click', loadRekodLulus);
|
||||||
|
loadRekodLulus();
|
||||||
</script>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ Route::get('/khazanahtebus',['as'=>'khazanah.tebus','uses'=>'KhazanahController@
|
|||||||
Route::get('/kelulusan','KhazanahController@kelulusan')->middleware('auth','khazanah');
|
Route::get('/kelulusan','KhazanahController@kelulusan')->middleware('auth','khazanah');
|
||||||
Route::get('/kelulusanrekodlepas',['as'=>'khazanah.rekodlepas','uses'=>'KhazanahController@kelulusanrekodlepas'])->middleware('auth','khazanah');
|
Route::get('/kelulusanrekodlepas',['as'=>'khazanah.rekodlepas','uses'=>'KhazanahController@kelulusanrekodlepas'])->middleware('auth','khazanah');
|
||||||
Route::get('/kelulusanrekodlepasoperasi',['as'=>'operasi.rekodlepas','uses'=>'OperasiController@kelulusanrekodlepas'])->middleware('auth','operasi');
|
Route::get('/kelulusanrekodlepasoperasi',['as'=>'operasi.rekodlepas','uses'=>'OperasiController@kelulusanrekodlepas'])->middleware('auth','operasi');
|
||||||
|
Route::get('/kelulusanrekodlepasoperasi/data',['as'=>'operasi.rekodlepas.data','uses'=>'OperasiController@kelulusanrekodlepasData'])->middleware('auth','operasi');
|
||||||
Route::get('/pendahuluan',['as'=>'khazanah.pendahulu','uses'=>'KhazanahController@pendahuluan'])->middleware('auth','khazanah');
|
Route::get('/pendahuluan',['as'=>'khazanah.pendahulu','uses'=>'KhazanahController@pendahuluan'])->middleware('auth','khazanah');
|
||||||
Route::get('/serahan',['as'=>'khazanah.serahan','uses'=>'KhazanahController@serahan'])->middleware('auth','khazanah');
|
Route::get('/serahan',['as'=>'khazanah.serahan','uses'=>'KhazanahController@serahan'])->middleware('auth','khazanah');
|
||||||
Route::get('/laporanscanbarcode',['as'=>'laporanscanbarcode','uses'=>'KhazanahController@LaporanSemakBarcode'])->middleware('auth','khazanah');
|
Route::get('/laporanscanbarcode',['as'=>'laporanscanbarcode','uses'=>'KhazanahController@LaporanSemakBarcode'])->middleware('auth','khazanah');
|
||||||
|
|||||||
Reference in New Issue
Block a user