Explore/ismail #8

Merged
ismailmasseran merged 4 commits from explore/ismail into staging 2026-08-27 10:54:38 +08:00
121 changed files with 3119 additions and 205 deletions
+54
View File
@@ -0,0 +1,54 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:O1XZDqK4H6+3GdrODgCaLr2l+OoWvgVhYr0GJ1KizW8=
APP_DEBUG=true
APP_URL=http://localhost
# API_URL=http://api-annurv2.test
API_URL=http://host.docker.internal:8080
API_URL_KOOP=http://host.docker.internal:8080
API_URL_PKB=http://host.docker.internal:8080
API_ARRAHNBID=http://lelong.test/api/
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=kaunter_erahn
DB_USERNAME=kaunteruser
DB_PASSWORD=password
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
+1
View File
@@ -1,5 +1,6 @@
APP_NAME=Laravel
APP_ENV=staging
APP_VERSION=v2.2-staging
APP_KEY=base64:O1XZDqK4H6+3GdrODgCaLr2l+OoWvgVhYr0GJ1KizW8=
APP_DEBUG=true
APP_URL=http://172.16.6.200:8091
+4 -4
View File
@@ -56,11 +56,11 @@ jobs:
set -e
IMAGE_TAG="${{ inputs.image_tag }}"
mkdir -p "${DEPLOY_DIR}/docker/nginx"
mkdir -p "${DEPLOY_DIR}/docker/nginx" "${DEPLOY_DIR}/public"
cp docker-compose.staging.yml "${DEPLOY_DIR}/docker-compose.yml"
cp docker/nginx/default.conf "${DEPLOY_DIR}/docker/nginx/default.conf"
rm -rf "${DEPLOY_DIR}/public"
cp -R public "${DEPLOY_DIR}/public"
find "${DEPLOY_DIR}/public" -mindepth 1 -delete
cp -R public/. "${DEPLOY_DIR}/public/"
if [ ! -f "${DEPLOY_DIR}/.env.staging" ]; then
if [ -f .env.staging ]; then
@@ -78,7 +78,7 @@ jobs:
export IMAGE_TAG
docker compose --env-file .env.staging -f docker-compose.yml pull app
docker compose --env-file .env.staging -f docker-compose.yml up -d --no-build --remove-orphans
docker compose --env-file .env.staging -f docker-compose.yml up -d --no-build --force-recreate --remove-orphans app web
echo "✓ Deployed IMAGE_TAG=${IMAGE_TAG}"
+1 -1
View File
@@ -11,5 +11,5 @@ Homestead.yaml
npm-debug.log
yarn-error.log
/.vscode
docker-compose.yml
docker_src/
**/.DS_Store
+50
View File
@@ -1 +1,51 @@
If you does't know what is this you probably in wrong project
```sql
--- for all ip
CREATE USER 'kaunteruser'@'%' IDENTIFIED BY 'your_password';
--- for specific ip
CREATE USER 'kaunteruser'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON kaunter_erahn.* TO 'kaunteruser'@'%';
FLUSH PRIVILEGES;
```
# ADDITIONAL NOTE
## customers/v2/index.blade.php is modal to register customer
## Min Komoditi = RM5000
# System Flowchart
## Proses Gadaian
1) Pelanggan datang bawa marhun
2) Teller daftar maklumat pelanggan jika pelanggan baharu
3) Serah marhun ke penilai untuk timbang
4) Teller daftar marhun di sistem berdasarkan maklumat dari penilai
5) Penilai print SAG dan serah marhun ke Khazanah (PC/PPC) - __khazanah can still scan still scan though__
6) Khazanah scan barcode dekat SAG untuk masuk ke dalam peti besi
* table involved - gadai.semakbarcode (default is blank, after is Lulus)
7) DONE
## Setup new branch command:
1. Duplicate previous branch table - use erahn_{{name}}
```sql
SET FOREIGN_KEY_CHECKS = 0;
SET SESSION group_concat_max_len = 1000000;
SELECT GROUP_CONCAT(
CONCAT('TRUNCATE TABLE `', table_name, '`')
SEPARATOR '; '
) INTO @sql
FROM information_schema.tables
WHERE table_schema = DATABASE();
SELECT @sql; --- copy the output and paste it
SET FOREIGN_KEY_CHECKS = 1;
```
2. Add new cawangan kod on master_erahn.arrahn_master_db and and kaunter_erahn.cawangan
3. Register new cawangan detail in erahn_{{name}}.cawangan
+27
View File
@@ -0,0 +1,27 @@
## CAWANGAN XTRA - X0301
- WAN NUR FATIN NATASYA BINTI W M AZHARI - PENILAI
- MOHAMAD KHAIRULNIZAN BIN JUSOF - TELLER
- MOHAMAD AZUHAIDIE BIN AHMAD - PPC
- WAN NURUL AMIRA BINTI WAN HARON - PC
## Akaun
- admin@test.com
- admin2@test.com
Module Gadai Online:
- Langkah 1
- Langkah 2
[x] PC akan tekan submit, then customer akan masuk ke senarai online mengikut batch
[x] PC boleh semak list customer yang pilih gadai online
- Langkah 3 (Operasi)
[x] dapat dalam bentuk list
[x] Apa jadi kalau operasi reject? - patah balik ke pc, untuk pc buat semakan balik
- Langkah 4
- Langkah 5
- Langkah 6
- Langkah 7
[x] Macam mana PC nak tahu pembayaran berjaya (Tally PAID page)
[x] Kalau online, dia kena upload kat mana (Operasi: PAID + bukti)
- Langkah 8
[x] PC semak senarai pelanggan gadai tu tally atau tak
[ ] PC tekan butang blast ke (tanda selesai ada; WhatsApp/SMS belum wire)
@@ -105,7 +105,7 @@ class AliranTunaiController extends Controller
$gadai_tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/gadaitebus/listharini/'.$auth_user['cawangan'],['tarikh' => $harini->toDateString()])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan/',['kodlaluan' => $auth_user['name']])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan',['kodlaluan' => $auth_user['name']])->json();
$tuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/TuntutBaki/'.$auth_user['cawangan'])->json();
@@ -361,12 +361,13 @@ class AliranTunaiController extends Controller
$pendahuluan = $alirantunai['tambah'];
$serahan = $alirantunai['kurang'];
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan/',['kodlaluan' => $auth_user['name']])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan',['kodlaluan' => $auth_user['name']])->json();
$addtunai = is_array($addtunai) ? $addtunai : [];
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/gadai/laporan/'. $auth_user['cawangan'] .'/'. $current->toDateString())->json();
$tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/tebus/laporan/'. $auth_user['cawangan'] .'/'. $current->toDateString())->json();
$ansuran = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/ansuran/laporan/'. $auth_user['cawangan'],['tarikh' => $current->toDateString()])->json();
$tuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/TuntutBaki/'. $auth_user['cawangan'] . '/teller/',['teller' => Auth::user()->name])->json();
$tuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/TuntutBaki/'. $auth_user['cawangan'] . '/teller',['teller' => Auth::user()->name])->json();
$advansur = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/AnsuranByTarikh/'.$auth_user['cawangan'],['kodlaluan' => Auth::user()->name ])->json();
$lelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/lelong/harini/'.$auth_user['cawangan'])->json();
@@ -617,7 +618,7 @@ class AliranTunaiController extends Controller
$alirantunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/GetCurrentTunai/' . $auth_user['cawangan'],['kodlaluan' => $auth_user['name']])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan/',['kodlaluan' => $auth_user['name']])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan',['kodlaluan' => $auth_user['name']])->json();
$teller = $auth_user['name'];
@@ -658,7 +659,7 @@ class AliranTunaiController extends Controller
$cawangan=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/cawangan/detail/'.$auth_user['cawangan'])->json();
$cawangan_detail=$cawangan[0];
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan/',['kodlaluan' => $auth_user['name']])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getAddTunai/' . $auth_user['cawangan'] . '/kodlaluan',['kodlaluan' => $auth_user['name']])->json();
$teller = $auth_user['name'];
@@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Auth;
class ImpersonateController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function impersonate(Request $request, $id): RedirectResponse
{
Gate::authorize('impersonate');
$impersonator = $request->user();
$id = (int) $id;
$target = User::findOrFail($id);
if ($target->id === $request->user()->id) {
return back()->with('error', 'Tidak boleh impersonate diri sendiri.');
}
if (method_exists($target, 'canBeImpersonated') && !$target->canBeImpersonated()) {
return back()->with('error', 'Akaun ini tidak boleh di-impersonate.');
}
$request->user()->impersonate($target);
return redirect()->route('home');
}
public function leave(Request $request): RedirectResponse
{
if ($request->user() && method_exists($request->user(), 'isImpersonated') && $request->user()->isImpersonated()) {
$impersonated = $request->user();
$impersonator = method_exists($impersonated, 'impersonator') ? $impersonated->impersonator() : null;
$request->user()->leaveImpersonation();
}
return redirect()->route('home');
}
}
+40 -6
View File
@@ -60,9 +60,7 @@ class LoginController extends Controller
'password' => 'required|string',
]);
$credentials = $request->only('email', 'password');
if (Auth::guard('web')->attempt($credentials)) {
if ($this->attemptWebLogin($request)) {
$auth_user = Auth::guard('web')->user();
$api_url = config('api.url');
@@ -103,9 +101,7 @@ class LoginController extends Controller
'password' => 'required|string',
]);
$credentials = $request->only('email', 'password');
if (Auth::guard('dashboard')->attempt($credentials,true)) {
if ($this->attemptDashboardLogin($request)) {
$auth_user = Auth::guard('dashboard')->user();
$user_login['nama'] = $auth_user['name'];
@@ -187,4 +183,42 @@ class LoginController extends Controller
return response()->json($kakitangan,200);
}
/**
* In local environment, log in by email only (password ignored).
*/
private function attemptWebLogin(Request $request): bool
{
if (app()->environment('local')) {
$user = User::where('email', $request->email)->first();
if ($user) {
Auth::guard('web')->login($user);
return true;
}
return false;
}
return Auth::guard('web')->attempt($request->only('email', 'password'));
}
/**
* In local environment, log in by email only (password ignored).
*/
private function attemptDashboardLogin(Request $request): bool
{
if (app()->environment('local')) {
$user = Dashboard::where('email', $request->email)->first();
if ($user) {
Auth::guard('dashboard')->login($user, true);
return true;
}
return false;
}
return Auth::guard('dashboard')->attempt($request->only('email', 'password'), true);
}
}
+38 -1
View File
@@ -211,13 +211,50 @@ class GadaianController extends Controller
'teller' => $auth_user['name']
]);
$this->AliranTunaiController->alirantunaiGadai($request, $auth_user['name']);
$caraTerima = strtoupper((string) $request->input('cara_terima', 'TUNAI'));
$pinjamanAmt = round((float) $request->pinjaman, 2);
// Online only for RM5k50k; otherwise force cash path.
if ($caraTerima === 'ONLINE' && ($pinjamanAmt < 5000 || $pinjamanAmt > 50000)) {
$caraTerima = 'TUNAI';
}
if ($caraTerima === 'ONLINE') {
$online = Http::withOptions(['verify' => config('app.api_verify')])
->asForm()
->post(config('api.url') . '/api/pembiayaan-online/' . $auth_user['cawangan'], [
'norujukan' => $request->norujukan_gadai,
'nokp' => $request->nokp,
'pinjaman' => $pinjamanAmt,
'kodbank' => $request->kodbank,
'noakaun' => $request->noakaun,
'nama_bank' => $request->nama_bank,
'nama_akaun' => $request->nama_akaun ?: $request->nama_pelanggan,
'nama_pelanggan' => $request->nama_pelanggan,
'nopelanggan' => $request->nopelanggan,
'created_by' => $auth_user['name'],
'update_customer_bank' => true,
]);
if (!$online->successful()) {
$body = $online->json();
$msg = is_array($body) && isset($body['message'])
? $body['message']
: 'Gagal daftar pembiayaan online. Sila cuba lagi.';
return redirect()->back()->with('error', $msg);
}
} else {
$this->AliranTunaiController->alirantunaiGadai($request, $auth_user['name']);
}
event(new GadaiNotify('lulus', $auth_user['cawangan']));
$request->session()->forget('page_reload');
$request->session()->forget('norujukan');
$request->session()->flash('activate_tab', 'SAG_baru');
if ($caraTerima === 'ONLINE') {
$request->session()->flash('message', 'Gadai berjaya. Pembiayaan online menunggu semakan PC.');
}
return redirect()->route('customer_info');
}
+5 -2
View File
@@ -348,8 +348,8 @@ class KhazanahController extends Controller
$tunaipast = Http::withOptions(['verify' => config('app.api_verify')])->get( config('api.url') .'/api/getPastTunai/'. $auth_user['cawangan'],['kodlaluan' => $ls['kodlaluan']])->json();
$gadai_tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/gadaitebus/listharini/'.$auth_user['cawangan'].'/teller/',['tarikh' => $harini->toDateString(),'teller' => $ls['kodlaluan']])->json();
$tuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/TuntutBaki/'.$auth_user['cawangan'].'/teller/',['teller' => $ls['kodlaluan']])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/getAddTunai/'.$auth_user['cawangan'].'/kodlaluan/',['kodlaluan' => $ls['kodlaluan']])->json();
$tuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/TuntutBaki/'.$auth_user['cawangan'].'/teller',['teller' => $ls['kodlaluan']])->json();
$addtunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/getAddTunai/'.$auth_user['cawangan'].'/kodlaluan',['kodlaluan' => $ls['kodlaluan']])->json();
array_push($arraygadaitebus,$gadai_tebus);
array_push($arraytuntutbaki,$tuntutbaki);
@@ -505,6 +505,9 @@ class KhazanahController extends Controller
public function mintakatalaluansemula(Request $request)
{
if (app()->environment('local')) {
return "True";
}
if(Hash::check($request->passsemula, Auth::user()->password))
{
@@ -321,6 +321,9 @@ class OperasiController extends Controller
public function mintakatalaluansemula(Request $request)
{
if (app()->environment('local')) {
return "True";
}
if (Hash::check($request->passsemula, Auth::user()->password)) {
return "True";
@@ -0,0 +1,744 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
class PembiayaanOnlineController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
protected function api()
{
return Http::withOptions(['verify' => config('app.api_verify')]);
}
protected function kodcaw()
{
return Auth::user()->cawangan;
}
/**
* PC senarai queue + batch history.
*/
public function index(Request $request)
{
$auth_user = Auth::user();
$kodcaw = $this->kodcaw();
$api_url = config('api.url');
$cawangan_info = $this->api()
->get($api_url . '/api/cawangan/' . $kodcaw)
->json();
$queue = $this->api()
->get($api_url . '/api/pembiayaan-online/' . $kodcaw . '/queue')
->json();
$batches = $this->api()
->get($api_url . '/api/pembiayaan-online/' . $kodcaw . '/batches')
->json();
$banks = $this->api()->get($api_url . '/api/bank')->json();
if (!is_array($banks)) {
$banks = [];
}
$modal = $this->api()
->get($api_url . '/api/modal-online/' . $kodcaw)
->json();
$lines = $queue['data'] ?? [];
$slot = $queue['slot_cadangan'] ?? null;
if (!is_array($batches)) {
$batches = [];
}
return view('pembiayaan_online.pc.senarai', compact(
'auth_user',
'kodcaw',
'api_url',
'cawangan_info',
'lines',
'batches',
'banks',
'modal',
'slot',
'queue'
));
}
/**
* Update bank/docs for a queue line.
*/
public function updateLine(Request $request, $id)
{
$kodcaw = $this->kodcaw();
$api_url = config('api.url');
$payload = [
'kodbank' => $request->input('kodbank'),
'noakaun' => $request->input('noakaun'),
'nama_bank' => $request->input('nama_bank'),
'nama_akaun' => $request->input('nama_akaun'),
'nota' => $request->input('nota'),
'update_customer_bank' => true,
];
$res = $this->api()
->asForm()
->put($api_url . '/api/pembiayaan-online/' . $kodcaw . '/lines/' . $id, $payload);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal kemaskini rekod.';
return redirect()->back()->with('error', $msg);
}
return redirect()->route('pembiayaan.online.pc')->with('message', 'Rekod dikemaskini.');
}
/**
* Submit selected lines as a batch to Operasi.
*/
public function submitBatch(Request $request)
{
$kodcaw = $this->kodcaw();
$api_url = config('api.url');
$auth_user = Auth::user();
$ids = $request->input('ids', []);
if (!is_array($ids)) {
$ids = array_filter(explode(',', (string) $ids));
}
$res = $this->api()
->asForm()
->post($api_url . '/api/pembiayaan-online/' . $kodcaw . '/batches/submit', [
'ids' => $ids,
'pc_submitted_by' => $auth_user['name'],
'slot' => $request->input('slot'),
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal hantar batch.';
return redirect()->back()->with('error', $msg);
}
$batchNo = $res->json()['batch']['batch_no'] ?? '';
return redirect()->route('pembiayaan.online.pc')
->with('message', 'Batch dihantar ke Operasi' . ($batchNo ? ': ' . $batchNo : '.'));
}
/**
* Batch detail.
*/
public function showBatch($batchId)
{
$kodcaw = $this->kodcaw();
$api_url = config('api.url');
$cawangan_info = $this->api()
->get($api_url . '/api/cawangan/' . $kodcaw)
->json();
$detail = $this->api()
->get($api_url . '/api/pembiayaan-online/' . $kodcaw . '/batches/' . $batchId)
->json();
if (!is_array($detail) || empty($detail['batch'])) {
return redirect()->route('pembiayaan.online.pc')->with('error', 'Batch tidak dijumpai.');
}
return view('pembiayaan_online.pc.batch', [
'batch' => $detail['batch'],
'lines' => $detail['lines'] ?? [],
'kodcaw' => $kodcaw,
'api_url' => $api_url,
'cawangan_info' => $cawangan_info,
]);
}
/**
* PC: senarai PAID untuk tally + blast.
*/
public function paidIndex(Request $request)
{
$auth_user = Auth::user();
$kodcaw = $this->kodcaw();
$api_url = config('api.url');
$blastFilter = $request->input('blast_sent', '0');
$cawangan_info = $this->api()
->get($api_url . '/api/cawangan/' . $kodcaw)
->json();
$query = [];
if ($blastFilter !== 'all' && $blastFilter !== '') {
$query['blast_sent'] = $blastFilter;
}
$paid = $this->api()
->get($api_url . '/api/pembiayaan-online/' . $kodcaw . '/paid', $query)
->json();
$lines = $paid['data'] ?? [];
if (!is_array($lines)) {
$lines = [];
}
$bilangan = $paid['bilangan'] ?? count($lines);
$jumlah = $paid['jumlah'] ?? 0;
return view('pembiayaan_online.pc.paid', compact(
'auth_user',
'kodcaw',
'api_url',
'cawangan_info',
'lines',
'bilangan',
'jumlah',
'blastFilter'
));
}
/**
* PC: view/download bukti bayaran inline.
*/
public function viewBukti($id)
{
$kodcaw = $this->kodcaw();
$res = $this->api()
->get(config('api.url') . '/api/pembiayaan-online/' . $kodcaw . '/lines/' . $id . '/bukti');
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Bukti tidak dijumpai.';
return redirect()->back()->with('error', $msg);
}
$payload = $res->json();
$bukti = $payload['bukti'] ?? null;
if (!$bukti || empty($bukti['data'])) {
return redirect()->back()->with('error', 'Fail bukti kosong.');
}
$raw = $bukti['data'];
if (strpos($raw, 'base64,') !== false) {
$raw = substr($raw, strpos($raw, 'base64,') + 7);
}
$binary = base64_decode($raw, true);
if ($binary === false) {
$binary = base64_decode($bukti['data']);
}
$type = $bukti['type'] ?? 'application/octet-stream';
$filename = $bukti['filename'] ?? ('bukti-' . $id);
return response($binary, 200, [
'Content-Type' => $type,
'Content-Disposition' => 'inline; filename="' . $filename . '"',
]);
}
/**
* PC: tanda rekod PAID sebagai selesai semak / blast.
*/
public function markBlast(Request $request)
{
$kodcaw = $this->kodcaw();
$ids = $request->input('ids', []);
if (!is_array($ids)) {
$ids = array_filter(explode(',', (string) $ids));
}
if (count($ids) === 0) {
return redirect()->back()->with('error', 'Sila pilih sekurang-kurangnya satu rekod.');
}
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/pembiayaan-online/' . $kodcaw . '/paid/blast', [
'ids' => $ids,
'blast_by' => Auth::user()['name'],
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal tanda selesai.';
return redirect()->back()->with('error', $msg);
}
$n = $res->json()['dikemaskini'] ?? count($ids);
return redirect()
->route('pembiayaan.online.pc.paid')
->with('message', $n . ' rekod ditanda selesai semak/blast.');
}
/**
* Operasi: senarai batch semua cawangan.
*/
public function operasiIndex(Request $request)
{
$auth_user = Auth::user();
$api_url = config('api.url');
$status = $request->input('status', 'SUBMITTED');
$tarikh = $request->input('tarikh');
$query = ['status' => $status];
if ($tarikh) {
$query['tarikh'] = $tarikh;
}
$res = $this->api()
->get($api_url . '/api/pembiayaan-online/operasi/batches', $query)
->json();
$batches = $res['data'] ?? [];
if (!is_array($batches)) {
$batches = [];
}
return view('pembiayaan_online.operasi.senarai', compact(
'auth_user',
'api_url',
'batches',
'status',
'tarikh'
));
}
/**
* Operasi: detail batch + lines.
*/
public function operasiShowBatch($kodcaw, $batchId)
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = $this->api()
->get($api_url . '/api/cawangan/' . $kodcaw)
->json();
$detail = $this->api()
->get($api_url . '/api/pembiayaan-online/operasi/' . $kodcaw . '/batches/' . $batchId)
->json();
if (!is_array($detail) || empty($detail['batch'])) {
return redirect()
->route('pembiayaan.online.operasi')
->with('error', 'Batch tidak dijumpai.');
}
return view('pembiayaan_online.operasi.batch', [
'auth_user' => $auth_user,
'batch' => $detail['batch'],
'lines' => $detail['lines'] ?? [],
'kodcaw' => $kodcaw,
'api_url' => $api_url,
'cawangan_info' => $cawangan_info,
]);
}
public function operasiApproveLine(Request $request, $kodcaw, $id)
{
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/pembiayaan-online/operasi/' . $kodcaw . '/lines/' . $id . '/approve', [
'ops_by' => Auth::user()['name'],
]);
return $this->opsRedirect($res, $kodcaw, $request->input('batch_id'), 'Rekod diluluskan.');
}
public function operasiRejectLine(Request $request, $kodcaw, $id)
{
$reason = trim((string) $request->input('reject_reason', ''));
if ($reason === '') {
return redirect()->back()->with('error', 'Sebab tolak diperlukan.');
}
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/pembiayaan-online/operasi/' . $kodcaw . '/lines/' . $id . '/reject', [
'ops_by' => Auth::user()['name'],
'reject_reason' => $reason,
]);
return $this->opsRedirect($res, $kodcaw, $request->input('batch_id'), 'Rekod ditolak. Dikembalikan ke PC.');
}
public function operasiApproveBatch(Request $request, $kodcaw, $batchId)
{
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/pembiayaan-online/operasi/' . $kodcaw . '/batches/' . $batchId . '/approve', [
'ops_by' => Auth::user()['name'],
]);
return $this->opsRedirect($res, $kodcaw, $batchId, 'Semua rekod menunggu dalam batch diluluskan.');
}
public function operasiMarkPaid(Request $request, $kodcaw, $id)
{
$payload = $this->buildPaidPayload($request);
if (isset($payload['error'])) {
return redirect()->back()->with('error', $payload['error']);
}
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/pembiayaan-online/operasi/' . $kodcaw . '/lines/' . $id . '/paid', $payload);
return $this->opsRedirect($res, $kodcaw, $request->input('batch_id'), 'Rekod ditanda PAID.');
}
public function operasiMarkPaidBatch(Request $request, $kodcaw, $batchId)
{
$payload = $this->buildPaidPayload($request);
if (isset($payload['error'])) {
return redirect()->back()->with('error', $payload['error']);
}
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/pembiayaan-online/operasi/' . $kodcaw . '/batches/' . $batchId . '/paid', $payload);
return $this->opsRedirect($res, $kodcaw, $batchId, 'Rekod APPROVED dalam batch ditanda PAID.');
}
/**
* @return array
*/
protected function buildPaidPayload(Request $request)
{
$noRujukan = trim((string) $request->input('no_rujukan_bayaran', ''));
if ($noRujukan === '') {
return ['error' => 'No. rujukan bayaran diperlukan.'];
}
if (!$request->hasFile('bukti')) {
return ['error' => 'Fail bukti bayaran diperlukan.'];
}
$file = $request->file('bukti');
if (!$file->isValid()) {
return ['error' => 'Fail bukti tidak sah.'];
}
$raw = base64_encode(file_get_contents($file->getRealPath()));
$mime = $file->getMimeType() ?: 'application/octet-stream';
return [
'ops_by' => Auth::user()['name'],
'no_rujukan_bayaran' => $noRujukan,
'tarikh_bayaran' => $request->input('tarikh_bayaran') ?: date('Y-m-d'),
'bukti_data' => $raw,
'bukti_filename' => $file->getClientOriginalName(),
'bukti_type' => $mime,
];
}
protected function opsRedirect($res, $kodcaw, $batchId, $successMsg)
{
$batchId = $batchId ?: null;
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Tindakan gagal.';
return redirect()->back()->with('error', $msg);
}
if ($batchId) {
return redirect()
->route('pembiayaan.online.operasi.batch', ['kodcaw' => $kodcaw, 'batchId' => $batchId])
->with('message', $successMsg);
}
return redirect()->route('pembiayaan.online.operasi')->with('message', $successMsg);
}
/**
* PC: modal online float + top-up request form/history.
*/
public function topupIndex(Request $request)
{
$auth_user = Auth::user();
$kodcaw = $this->kodcaw();
$api_url = config('api.url');
$status = $request->input('status', '');
$cawangan_info = $this->api()
->get($api_url . '/api/cawangan/' . $kodcaw)
->json();
$modal = $this->api()
->get($api_url . '/api/modal-online/' . $kodcaw)
->json();
$query = [];
if ($status !== '' && $status !== 'all') {
$query['status'] = $status;
}
$reqRes = $this->api()
->get($api_url . '/api/modal-online/' . $kodcaw . '/topup/requests', $query)
->json();
$requests = $reqRes['data'] ?? [];
if (!is_array($requests)) {
$requests = [];
}
$pendingRes = $this->api()
->get($api_url . '/api/modal-online/' . $kodcaw . '/topup/requests', ['status' => 'PENDING'])
->json();
$pendingList = $pendingRes['data'] ?? [];
$hasPending = is_array($pendingList) && count($pendingList) > 0;
$isMissing = !empty($modal['missing']);
$pendingRequest = $modal['pending_request'] ?? null;
if (!$pendingRequest && $hasPending) {
$pendingRequest = $pendingList[0];
}
return view('pembiayaan_online.pc.topup', compact(
'auth_user',
'kodcaw',
'api_url',
'cawangan_info',
'modal',
'requests',
'status',
'hasPending',
'isMissing',
'pendingRequest'
));
}
/**
* PC: submit top-up request.
*/
public function topupRequest(Request $request)
{
$kodcaw = $this->kodcaw();
$amaun = (float) $request->input('amaun', 0);
if ($amaun <= 0) {
return redirect()->back()->with('error', 'Amaun mesti lebih daripada 0.');
}
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/modal-online/' . $kodcaw . '/topup/request', [
'amaun' => $amaun,
'dimohon_oleh' => Auth::user()['name'],
'nota' => $request->input('nota'),
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal hantar permohonan.';
return redirect()->back()->with('error', $msg)->withInput();
}
return redirect()
->route('pembiayaan.online.pc.topup')
->with('message', 'Permohonan modal online dihantar. Menunggu kelulusan Operasi.');
}
/**
* Operasi: senarai permohonan tambah modal online.
*/
public function operasiTopupIndex(Request $request)
{
$auth_user = Auth::user();
$api_url = config('api.url');
$status = $request->input('status', 'PENDING');
$tarikh = $request->input('tarikh');
$query = [];
if ($status === 'all') {
$query['status'] = 'all';
} elseif ($status !== '' && $status !== null) {
$query['status'] = $status;
} else {
$query['status'] = 'PENDING';
}
if ($tarikh) {
$query['tarikh'] = $tarikh;
}
$res = $this->api()
->get($api_url . '/api/modal-online/operasi/topup/requests', $query)
->json();
$requests = $res['data'] ?? [];
if (!is_array($requests)) {
$requests = [];
}
return view('pembiayaan_online.operasi.topup', compact(
'auth_user',
'api_url',
'requests',
'status',
'tarikh'
));
}
public function operasiTopupApprove(Request $request, $id)
{
$amaun = $request->input('amaun');
if ($amaun !== null && $amaun !== '' && (float) $amaun <= 0) {
return redirect()->back()->with('error', 'Amaun diluluskan mesti lebih daripada 0.');
}
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/modal-online/operasi/topup/' . $id . '/approve', [
'diluluskan_oleh' => Auth::user()['name'],
'nota' => $request->input('nota'),
'amaun' => $amaun,
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal lulus permohonan.';
return redirect()->back()->with('error', $msg);
}
$amaunLulus = $res->json()['request']['amaun'] ?? $amaun;
return redirect()
->route('pembiayaan.online.operasi.topup')
->with('message', 'Permohonan diluluskan RM ' . number_format((float) $amaunLulus, 2) . '. Modal online cawangan dikemas kini.');
}
public function operasiTopupReject(Request $request, $id)
{
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/modal-online/operasi/topup/' . $id . '/reject', [
'diluluskan_oleh' => Auth::user()['name'],
'nota' => $request->input('nota'),
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal tolak permohonan.';
return redirect()->back()->with('error', $msg);
}
return redirect()
->route('pembiayaan.online.operasi.topup')
->with('message', 'Permohonan ditolak.');
}
/**
* PC: EOD close branch modal online.
*/
public function closeModal(Request $request)
{
$kodcaw = $this->kodcaw();
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/modal-online/' . $kodcaw . '/close', [
'ditutup_oleh' => Auth::user()['name'],
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal tutup modal online.';
return redirect()->back()->with('error', $msg);
}
$dikembalikan = $res->json()['dikembalikan'] ?? 0;
return redirect()
->route('pembiayaan.online.pc.topup')
->with('message', 'Modal online ditutup. Baki dikembalikan RM ' . number_format((float) $dikembalikan, 2) . '.');
}
/**
* Operasi: EOD dashboard semua cawangan.
*/
public function operasiEodIndex(Request $request)
{
$auth_user = Auth::user();
$api_url = config('api.url');
$tarikh = $request->input('tarikh') ?: date('Y-m-d');
$res = $this->api()
->get($api_url . '/api/modal-online/operasi/eod', [
'zone' => 'all',
'tarikh' => $tarikh,
])
->json();
$rows = $res['data'] ?? [];
if (!is_array($rows)) {
$rows = [];
}
$summary = [
'open' => $res['open'] ?? 0,
'closed' => $res['closed'] ?? 0,
'missing' => $res['missing'] ?? 0,
'bilangan' => $res['bilangan'] ?? count($rows),
];
return view('pembiayaan_online.operasi.eod', compact(
'auth_user',
'api_url',
'rows',
'tarikh',
'summary'
));
}
public function operasiCloseModal(Request $request, $kodcaw)
{
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/modal-online/' . $kodcaw . '/close', [
'ditutup_oleh' => Auth::user()['name'],
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal tutup modal online.';
return redirect()->back()->with('error', $msg);
}
return redirect()
->route('pembiayaan.online.operasi.eod')
->with('message', 'Modal online ' . $kodcaw . ' ditutup.');
}
public function operasiCloseAllModal(Request $request)
{
$res = $this->api()
->asForm()
->post(config('api.url') . '/api/modal-online/operasi/eod/close-all', [
'ditutup_oleh' => Auth::user()['name'],
'zone' => 'all',
]);
if (!$res->successful()) {
$body = $res->json();
$msg = is_array($body) && isset($body['message']) ? $body['message'] : 'Gagal tutup semua modal online.';
return redirect()->back()->with('error', $msg);
}
$closed = $res->json()['closed'] ?? 0;
$skipped = $res->json()['skipped'] ?? 0;
return redirect()
->route('pembiayaan.online.operasi.eod')
->with('message', 'EOD selesai: ' . $closed . ' ditutup, ' . $skipped . ' sudah ditutup.');
}
}
+3 -1
View File
@@ -25,6 +25,8 @@ class AuthServiceProvider extends ServiceProvider
{
$this->registerPolicies();
//
Gate::define('impersonate', function ($user) {
return $user->canImpersonate();
});
}
}
+12
View File
@@ -6,9 +6,11 @@ use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Lab404\Impersonate\Models\Impersonate;
class User extends Authenticatable
{
use Impersonate;
use Notifiable;
protected $guard = 'web';
@@ -43,4 +45,14 @@ class User extends Authenticatable
{
return $this->hasOne(Cawangan::class, 'kodcaw', 'cawangan');
}
public function canImpersonate(): bool
{
return in_array($this->roles ?? '', ['admin'], true);
}
public function canBeImpersonated(): bool
{
return ($this->roles ?? '') !== 'admin';
}
}
+15
View File
@@ -0,0 +1,15 @@
<?php
if (!function_exists('api_url_for_browser')) {
/**
* Base URL for JavaScript in the browser, derived from API_URL (config api.url).
* Docker dev often uses host.docker.internal for PHP→host; browsers may not resolve it.
* Same host-mapped port is reachable at 127.0.0.1. Production URLs are unchanged.
*/
function api_url_for_browser(): string
{
$url = rtrim((string) config('api.url'), '/');
return str_ireplace('host.docker.internal', '127.0.0.1', $url);
}
}
+4
View File
@@ -14,6 +14,7 @@
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^6.3",
"jeroennoten/laravel-adminlte": "^3.5",
"lab404/laravel-impersonate": "^1.7",
"laravel/framework": "^7.24",
"laravel/tinker": "^2.0",
"laravel/ui": "^2.4",
@@ -51,6 +52,9 @@
"classmap": [
"database/seeds",
"database/factories"
],
"files": [
"app/helpers.php"
]
},
"autoload-dev": {
Generated
+71 -4
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "bfd66ab0246126c4f2cc7bbeeacca4ec",
"content-hash": "fa66321247398a94dc8b7f8099bb184e",
"packages": [
{
"name": "almasaeed2010/adminlte",
@@ -1293,6 +1293,73 @@
},
"time": "2022-05-18T14:12:47+00:00"
},
{
"name": "lab404/laravel-impersonate",
"version": "1.7.8",
"source": {
"type": "git",
"url": "https://github.com/404labfr/laravel-impersonate.git",
"reference": "0008a39da8914cc946b6a5ed211230708ee736b3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/404labfr/laravel-impersonate/zipball/0008a39da8914cc946b6a5ed211230708ee736b3",
"reference": "0008a39da8914cc946b6a5ed211230708ee736b3",
"shasum": ""
},
"require": {
"laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0 | ^13.0",
"php": "^7.2 | ^8.0"
},
"require-dev": {
"mockery/mockery": "^1.3.3",
"orchestra/testbench": "^4.0 | ^5.0 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0",
"phpunit/phpunit": "^7.5 | ^8.0 | ^9.0 | ^10.0 | ^11.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Lab404\\Impersonate\\ImpersonateServiceProvider"
]
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Lab404\\Impersonate\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Marceau Casals",
"email": "marceau@casals.fr"
}
],
"description": "Laravel Impersonate is a plugin that allows to you to authenticate as your users.",
"keywords": [
"auth",
"impersonate",
"impersonation",
"laravel",
"laravel-package",
"laravel-plugin",
"package",
"plugin",
"user"
],
"support": {
"issues": "https://github.com/404labfr/laravel-impersonate/issues",
"source": "https://github.com/404labfr/laravel-impersonate/tree/1.7.8"
},
"time": "2026-03-17T15:24:14+00:00"
},
{
"name": "laravel/framework",
"version": "v7.30.6",
@@ -9013,12 +9080,12 @@
],
"aliases": [],
"minimum-stability": "dev",
"stability-flags": [],
"stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^7.2.5"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
"platform-dev": {},
"plugin-api-version": "2.9.0"
}
+2
View File
@@ -15,6 +15,8 @@ return [
'name' => env('APP_NAME', 'Laravel'),
'version' => env('APP_VERSION', ''),
/*
|--------------------------------------------------------------------------
| Application Environment
+1 -16
View File
@@ -1,23 +1,8 @@
# Staging stack — isolated from local docker-compose.yml (8081 / 3307)
# and from api_arrahn staging (8090 / 3308).
#
# Local:
# docker compose --env-file .env.staging -f docker-compose.staging.yml up -d --build
#
# CI (image already in registry):
# APP_IMAGE=git.koppkb.com/kopkb/kaunter IMAGE_TAG=<sha> \
# docker compose --env-file .env.staging -f docker-compose.staging.yml up -d --no-build
#
# Host nginx reverse-proxies the public domain to 127.0.0.1:${HTTP_PORT}.
# See docker/nginx/host-proxy.example.conf
#
# If 8091 or 3309 is already taken, set HTTP_PORT / MYSQL_PUBLISH_PORT in .env.staging.
name: kaunter_staging
services:
app:
image: ${APP_IMAGE:-kaunter}:${IMAGE_TAG:-staging}
image: ${APP_IMAGE:-git.koppkb.com/kopkb/kaunter}:${IMAGE_TAG:-staging}
build:
context: .
dockerfile: docker/php/Dockerfile
+1 -1
View File
@@ -9,7 +9,7 @@ server {
client_max_body_size 50M;
location / {
try_files $uri $uri/ @php;
try_files $uri @php;
}
location @php {
+20 -20
View File
@@ -4,22 +4,22 @@ WORKDIR /var/www/html
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
git \
pkg-config \
unzip \
libonig-dev \
libzip-dev \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
git \
pkg-config \
unzip \
libonig-dev \
libzip-dev \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j"$(nproc)" \
pdo_mysql \
mbstring \
bcmath \
zip \
exif \
gd \
pdo_mysql \
mbstring \
bcmath \
zip \
exif \
gd \
&& rm -rf /var/lib/apt/lists/*
COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer
@@ -40,12 +40,12 @@ COPY --chown=www-data:www-data . /var/www/html
RUN composer install --no-interaction --prefer-dist --no-dev --optimize-autoloader --no-scripts \
&& mkdir -p \
storage/logs \
storage/framework/cache/data \
storage/framework/views \
storage/framework/sessions \
storage/app/public \
bootstrap/cache \
storage/logs \
storage/framework/cache/data \
storage/framework/views \
storage/framework/sessions \
storage/app/public \
bootstrap/cache \
&& chown -R www-data:www-data storage bootstrap/cache vendor
FROM base AS development
@@ -306,7 +306,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 ?>";
$(document).ready(function(){
@@ -157,7 +157,7 @@
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var ppc = "{{ Auth::user()->name }}";
var ic_asal = "{{ $customer_info['kpbaru'] != null ? $customer_info['kpbaru'] : $customer_info['kplama'] }}"
+1 -1
View File
@@ -48,6 +48,6 @@
</div>
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
</script>
@endsection
+4 -5
View File
@@ -26,7 +26,7 @@
<div class="container">
<div class="row justify-content-center">
@php $auth_user = Auth::user();@endphp
<input type="hidden" id="api" value="{{ $api_url }}"/>
<input type="hidden" id="api" value="{{ api_url_for_browser() }}"/>
<div class="col-md-12">
@@ -348,7 +348,7 @@
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tableaddtunai = $('#tableaddtunai').DataTable({
@@ -558,9 +558,8 @@
function cetaklaporanalirantunai()
{
let urlroute = '{{ route("laporan.alirantunai") }}';
window.location.href = urlroute;
let urlroute = '{{ route("laporan.alirantunai") }}';
window.location.href = api_url + urlroute;
}
+2 -2
View File
@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="icon" href="{{ asset('img/icon_pkb.png') }}">
<title>arOS v2.2</title>
<title>arOS {{ config('app.version') }}</title>
<style>
@keyframes slide {
@@ -82,7 +82,7 @@
<div class="card-header pb-0 text-left">
<div style="display: flex; justify-content:space-between; align-items:center">
<h1 class="font-weight-bolder text-info text-gradient" style="word-break: break-word; white-space: nowrap;">
Kaunter arOS v2.2
Kaunter arOS {{ config('app.version') }}
</h1>
<img src="{{ asset('img/icon_pkb.png') }}" alt="logo-arrahn" style="width: 85px; margin-left: 30px;">
</div>
@@ -228,7 +228,7 @@
<script>
var api_url = "{{ $api_url }}";
var api_url = "{{ api_url_for_browser() }}";
// var kodcaw = "{{ $kodcaw }}";
// var notisid = "{{ $notisid }}";
//var nokp = "{{ $noic }}";
+1 -1
View File
@@ -389,7 +389,7 @@
</script>
<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 ?>";
$(document).ready(function(){
@@ -387,7 +387,7 @@
</script>
<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 ?>";
$(document).ready(function(){
+1 -1
View File
@@ -413,7 +413,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'] }}";
@@ -1099,7 +1099,7 @@
let pertambahpinjaman = "{{ $pertambahpinjaman }}";
var api = '<?php echo $api_url ?>';
var api = "{{ api_url_for_browser() }}";
let nw = 0;
let jenisAT = 'none';
+1 -1
View File
@@ -542,7 +542,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'] }}";
+1 -1
View File
@@ -473,7 +473,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 ?>";
+1 -1
View File
@@ -422,7 +422,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 }}";
+4 -5
View File
@@ -495,15 +495,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({
+22 -16
View File
@@ -230,7 +230,6 @@
// 4️⃣ Hantar permohonan ke backend (Laravel)
const response = await fetch("{{ route('operasi.createkelulusan-anggota') }}", {
method: 'POST',
headers: {
"Content-Type": "application/json",
@@ -238,15 +237,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();
@@ -714,18 +712,26 @@
</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({
+1 -1
View File
@@ -34,7 +34,7 @@
getPusherResponse();
async function getPusherResponse(){
let api_url = "<?php echo $api_url ?>";
let api_url = "{{ api_url_for_browser() }}";
const jsonData = {
norujukan: "{{ $errorapproval['norujukan'] }}",
kodcaw: "{{ Auth::user()->cawangan }}",
+1 -1
View File
@@ -215,7 +215,7 @@
</div>
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
$('form input').keydown(function (e) {
if (e.keyCode == 13) {
e.preventDefault();
+1 -1
View File
@@ -242,7 +242,7 @@
@endphp
@endif
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
$('form input').keydown(function (e) {
if (e.keyCode == 13) {
e.preventDefault();
+3 -3
View File
@@ -326,7 +326,7 @@
</div>
<script src="{{ asset('js/rounded-methods.js') }}"></script>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw_ujrah = "<?php echo $cawangan_info['kodcaw'] ?>";
$('form input').keydown(function (e) {
@@ -768,7 +768,7 @@
// Call API to get specific MaxMutuEmas data by karat
$.ajax({
url: '{{ config("api.url") }}/api/maxmutuemas/specific',
url: '{{ api_url_for_browser() }}/api/maxmutuemas/specific',
type: 'GET',
data: { karat: karat, nilaimarhun: nm },
success: function(response) {
@@ -1816,7 +1816,7 @@
rowsData.forEach((rowData) => {
// Call API to get margin data for each individual item
$.ajax({
url: '{{ config("api.url") }}/api/maxmutuemas/specific',
url: '{{ api_url_for_browser() }}/api/maxmutuemas/specific',
type: 'GET',
data: { karat: rowData.karat, nilaimarhun: rowData.nilaiMarhun },
success: function(response) {
+232 -15
View File
@@ -217,6 +217,68 @@
</div>
</diV>
</div>
<div class="col-12" id="cara_terima_section" style="display:none;">
<hr>
<div class="form-group row">
<div class="col-md-3">
Cara Terima Pembiayaan
</div>
<div class="col-md-9">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="cara_terima" id="cara_terima_tunai" value="TUNAI" checked>
<label class="form-check-label" for="cara_terima_tunai">Tunai</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="cara_terima" id="cara_terima_online" value="ONLINE">
<label class="form-check-label" for="cara_terima_online">Online (Akaun Bank)</label>
</div>
<small class="form-text text-muted">Pilihan Online untuk pembiayaan RM5,000 RM50,000 sahaja.</small>
</div>
</div>
<div id="bank_online_section" style="display:none;">
<div class="form-group row">
<div class="col-md-3">Modal Online</div>
<div class="col-md-9">
<div id="modal_online_status" class="mb-1">Memeriksa baki...</div>
</div>
</div>
<div class="form-group row">
<div class="col-md-3">Bank</div>
<div class="col-md-4">
@php
$banks_list = Http::withOptions(['verify' => config('app.api_verify')])
->get($api_url . '/api/bank')
->json();
@endphp
<select class="form-control" name="kodbank" id="gadai_kodbank">
<option value="">-- Pilih Bank --</option>
@foreach ($banks_list as $banks)
<option value="{{ $banks['abbreviation'] }}"
{{ ($customer_info['kodbank'] ?? '') == $banks['abbreviation'] ? 'selected' : '' }}
data-nama="{{ $banks['name'] }}">
{{ $banks['name'] }}
</option>
@endforeach
</select>
</div>
<div class="col-md-2">No. Akaun</div>
<div class="col-md-3">
<input type="text" class="form-control" name="noakaun" id="gadai_noakaun"
value="{{ $customer_info['noakaun'] ?? '' }}">
</div>
</div>
<div class="form-group row">
<div class="col-md-3">Nama Akaun</div>
<div class="col-md-9">
<input type="text" class="form-control" name="nama_akaun" id="gadai_nama_akaun"
value="{{ $customer_info['nama'] ?? '' }}">
<input type="hidden" name="nama_bank" id="gadai_nama_bank" value="">
<input type="hidden" name="nama_pelanggan" value="{{ $customer_info['nama'] ?? '' }}">
<input type="hidden" name="nopelanggan" id="nopelanggan" value="{{ $customer_info['nopelanggan'] ?? '' }}">
</div>
</div>
</div>
</div>
<div class="col-12">
<input type="text" name="norujukan_gadai" id="norujukan_gadai" value="{{ $norujukan }}" hidden>
<input type="text" name="marhun_detail" id="marhun_detail" value="" hidden>
@@ -331,7 +393,7 @@
@endif
<script src="{{ asset('js/rounded-methods.js') }}"></script>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw_ujrah = "<?php echo $cawangan_info['kodcaw'] ?>";
$('form input').keydown(function (e) {
if (e.keyCode == 13) {
@@ -684,6 +746,7 @@
var nokp = $('#nokp').val();
//console.log('DEBUG NOKP:', nokp, kadarupah);
toggleCaraTerima(pinjaman);
// var keuntungan_sebulan = pinjaman * kadarupah;
// var keuntungan_6bln = keuntungan_sebulan * 6;
@@ -1195,9 +1258,170 @@
.then(response => response.json());
}
function toggleCaraTerima(pinjaman) {
if (pinjaman >= 5000 && pinjaman <= 50000) {
$('#cara_terima_section').show();
toggleBankOnlineSection();
} else {
$('#cara_terima_section').hide();
$('#bank_online_section').hide();
$('#cara_terima_tunai').prop('checked', true);
}
}
function toggleBankOnlineSection() {
if ($('input[name="cara_terima"]:checked').val() === 'ONLINE') {
$('#bank_online_section').show();
var nama = $('#gadai_kodbank option:selected').data('nama') || '';
$('#gadai_nama_bank').val(nama);
refreshModalOnlineStatus();
} else {
$('#bank_online_section').hide();
}
}
$(document).on('change', 'input[name="cara_terima"]', function () {
toggleBankOnlineSection();
});
$(document).on('change', '#gadai_kodbank', function () {
$('#gadai_nama_bank').val($('#gadai_kodbank option:selected').data('nama') || '');
});
async function getModalOnline() {
let kodcaw = $('#kodcaw').val();
let apiUrl = api_url + '/api/modal-online/' + kodcaw;
return $.ajax({
method: 'GET',
url: apiUrl,
dataType: 'json',
});
}
async function refreshModalOnlineStatus() {
var $el = $('#modal_online_status');
$el.removeClass('text-success text-danger text-warning text-muted').addClass('text-muted').text('Memeriksa baki...');
try {
var modal = await getModalOnline();
var pending = modal.pending_request || null;
var closed = Number(modal.ditutup || 0) === 1;
var missing = !!modal.missing;
var baki = Number(modal.baki || 0);
var had = Number(modal.had || 0) + Number(modal.tambah || 0);
if (closed) {
$el.removeClass('text-muted').addClass('text-danger')
.text('Modal online hari ini sudah ditutup (EOD). Gadai online tidak dibenarkan.');
return modal;
}
if (pending) {
$el.removeClass('text-muted').addClass('text-warning')
.text('Menunggu kelulusan Operasi: RM ' + formatter.format(Number(pending.amaun || 0)) +
' (' + (pending.dimohon_oleh || '-') + ').');
} else if (missing) {
$el.removeClass('text-muted').addClass('text-danger')
.text('Belum ada had hari ini. Sila hubungi PC.');
} else {
$el.removeClass('text-muted').addClass('text-success')
.text('Baki RM ' + formatter.format(baki) + ' / Had RM ' + formatter.format(had));
}
return modal;
} catch (e) {
$el.removeClass('text-muted').addClass('text-danger').text('Gagal semak modal online.');
return null;
}
}
async function checkDisbursementFloat(pinjaman) {
var cara = $('input[name="cara_terima"]:checked').val() || 'TUNAI';
if (!(pinjaman >= 5000 && pinjaman <= 50000)) {
cara = 'TUNAI';
}
if (cara === 'ONLINE') {
var kodbank = $('#gadai_kodbank').val();
var noakaun = ($('#gadai_noakaun').val() || '').trim();
$('#gadai_nama_bank').val($('#gadai_kodbank option:selected').data('nama') || '');
if (!kodbank || !noakaun) {
Swal.fire({
icon: 'error',
title: 'Amaran!',
text: 'Sila lengkapkan maklumat bank untuk pembayaran online.'
});
return false;
}
var modal;
try {
modal = await getModalOnline();
} catch (e) {
Swal.fire({
icon: 'error',
title: 'Amaran!',
text: 'Gagal semak modal online. Sila cuba lagi.'
});
return false;
}
if (Number(modal.ditutup || 0) === 1) {
Swal.fire({
icon: 'error',
title: 'Amaran!',
text: 'Modal online hari ini sudah ditutup (EOD). Sila pilih Tunai.'
});
return false;
}
if (modal.pending_request) {
Swal.fire({
icon: 'info',
title: 'Menunggu Operasi',
text: 'Permohonan RM ' + formatter.format(Number(modal.pending_request.amaun || 0)) +
' masih PENDING. Sila tunggu kelulusan Operasi atau pilih Tunai.'
});
return false;
}
if (modal.missing) {
Swal.fire({
icon: 'error',
title: 'Amaran!',
text: 'Belum ada had modal online hari ini. Sila hubungi PC.'
});
return false;
}
if (Number(modal.baki || 0) < pinjaman) {
Swal.fire({
icon: 'error',
title: 'Amaran!',
text: 'Baki modal online tidak mencukupi. Sila hubungi PC untuk mohon tambah modal, atau pilih Tunai.'
});
return false;
}
return true;
}
let dataCawangan = await getDataCawangan();
let bakiAkhir = dataCawangan.baki;
if (bakiAkhir < pinjaman) {
Swal.fire({
icon: 'error',
title: 'Amaran!',
text: 'Baki Akhir Tunai Lebih Rendah Daripada Nilai Marhun Yang Ingin Digadaikan. Sila Tambah Pendahuluan di Laman Aliran Tunai Segera. '
});
return false;
}
return true;
}
async function verifyGadai(func){
$("#terima_gadai").prop('disabled', true);
event.preventDefault();
if (typeof event !== 'undefined' && event && event.preventDefault) {
event.preventDefault();
}
var kodcaw = $('#kodcaw').val();
var nokp = $('#nokp').val();
var nopelanggan = $('#nopelanggan').val();
@@ -1224,23 +1448,16 @@
title: 'Amaran!',
text: 'Pembiayaan Tidak Lengkap'
});
event.preventDefault();
return false;
}
let dataCawangan = await getDataCawangan();
let bakiAkhir = dataCawangan.baki;
if(bakiAkhir < pinjaman){
let floatOk = await checkDisbursementFloat(pinjaman);
if (!floatOk) {
$("#terima_gadai").prop('disabled', false);
Swal.fire({
icon: 'error',
title: 'Amaran!',
text: 'Baki Akhir Tunai Lebih Rendah Daripada Nilai Marhun Yang Ingin Digadaikan. Sila Tambah Pendahuluan di Laman Aliran Tunai Segera. '
});
event.preventDefault();
return false;
}else{
}
if(true){
if($.isNumeric(pinjaman) == false){
$("#terima_gadai").prop('disabled', false);
@@ -1981,7 +2198,7 @@
rowsData.forEach((rowData) => {
// Call API to get margin data for each individual item
$.ajax({
url: '{{ config("api.url") }}/api/maxmutuemas/specific',
url: '{{ api_url_for_browser() }}/api/maxmutuemas/specific',
type: 'GET',
data: { karat: rowData.karat, nilaimarhun: rowData.nilaiMarhun },
success: function(response) {
@@ -262,6 +262,10 @@
<a href="{{ url('pendahuluanserahan') }}"
class="btn btn-info btn-lg btn-block mb-3">Pendahuluan - Serahan</a>
</div>
<div class="row">
<a href="{{ route('pembiayaan.online.pc') }}"
class="btn btn-info btn-lg btn-block mb-3">Pembiayaan Online</a>
</div>
<div class="row">
<a href="{{ route('khazanah.indexwakil') }}"
class="btn btn-info btn-lg btn-block mb-3">Surat Wakil</a>
@@ -320,7 +324,7 @@
});
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
let kodcaw = "{{ Auth::user()->cawangan }}";
const initialambilan = [
@@ -14,13 +14,16 @@
</nav>
<div class="card-body text-center">
<a href="{{ route('operasi.kelulusananggota') }}" class="btn btn-info btn-lg">Kelulusan Anggota</a>
<a href="{{ route('operasi.kelulusan') }}" class="btn btn-info btn-lg">Kelulusan</a>
<a href="{{ route('daftar.kakitangan') }}" class="btn btn-info btn-lg">Kakitangan</a>
<a href="{{ route('parameter') }}" class="btn btn-info btn-lg">Parameter</a>
<a href="{{ route('komuditi') }}" class="btn btn-info btn-lg">Komoditi</a>
<a href="{{ route('perubatan') }}" class="btn btn-info btn-lg">Perubatan</a>
<a href="{{ route('operasi.laporan.audit') }}" class="btn btn-info btn-lg">Laporan Audit</a>
<a href="{{ route('operasi.kelulusananggota') }}" class="btn btn-info btn-lg d-inline-block m-1">Kelulusan Anggota</a>
<a href="{{ route('operasi.kelulusan') }}" class="btn btn-info btn-lg d-inline-block m-1">Kelulusan</a>
<a href="{{ route('pembiayaan.online.operasi') }}" class="btn btn-info btn-lg d-inline-block m-1">Pembiayaan Online</a>
<a href="{{ route('pembiayaan.online.operasi.topup') }}" class="btn btn-info btn-lg d-inline-block m-1">Modal Online</a>
<a href="{{ route('pembiayaan.online.operasi.eod') }}" class="btn btn-info btn-lg d-inline-block m-1">EOD Modal Online</a>
<a href="{{ route('daftar.kakitangan') }}" class="btn btn-info btn-lg d-inline-block m-1">Kakitangan</a>
<a href="{{ route('parameter') }}" class="btn btn-info btn-lg d-inline-block m-1">Parameter</a>
<a href="{{ route('komuditi') }}" class="btn btn-info btn-lg d-inline-block m-1">Komoditi</a>
<a href="{{ route('perubatan') }}" class="btn btn-info btn-lg d-inline-block m-1">Perubatan</a>
<a href="{{ route('operasi.laporan.audit') }}" class="btn btn-info btn-lg d-inline-block m-1">Laporan Audit</a>
</div>
</div>
@@ -267,7 +267,7 @@
</div>
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var cawangan = "{{ Auth::user()->cawangan }}";
var teller = "{{ Auth::user()->name }}";
@@ -18,10 +18,9 @@
</div>
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
let teller = "{{ Auth::user()->name }}";
let kodcaw = "{{ Auth::user()->cawangan }}";
function pelangganclick()
{
// $getTunai2=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/GetCurrentTunai/'.$auth_user['cawangan'],['kodlaluan' => $kodlaluan])->json();
@@ -74,7 +74,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
+1 -1
View File
@@ -315,7 +315,7 @@
const d = new Date();
let tahunsemasa = d.getFullYear();
let pusherenv = "{{ env('PUSHER_APP_KEY') }}";
let api_url = "{{ $api_url }}";
let api_url = "{{ api_url_for_browser() }}";
const formatter = new Intl.NumberFormat('en-US', {
minimumFractionDigits: 2
+1 -1
View File
@@ -230,7 +230,7 @@
</div>
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var cawangan = "{{ Auth::user()->cawangan }}";
+1 -1
View File
@@ -318,7 +318,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 ?>";
$(document).ready(function(){
+1 -1
View File
@@ -410,7 +410,7 @@
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var ppc = "{{ Auth::user()->name }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
+2 -2
View File
@@ -177,7 +177,7 @@
"scrollX": true
});
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
var kodcaw = "{{ Auth::user()->cawangan }}";
const formatter = new Intl.NumberFormat('en-US', {
@@ -271,7 +271,7 @@
async function updatelulus(e)
{
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
let kodcaw = "{{ Auth::user()->cawangan }}";
const { value: katalaluan } = await Swal.fire({
@@ -299,7 +299,7 @@
<script>
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
$(document).ready(function() {
@@ -51,7 +51,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -45,7 +45,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () {
@@ -69,7 +69,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tabletebus = $('#myTable').DataTable({
@@ -62,7 +62,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablebatalgadai = $('#myTable').DataTable({
@@ -63,7 +63,7 @@
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -47,7 +47,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -71,7 +71,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablegadai = $('#myTable').DataTable({
@@ -43,7 +43,7 @@
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () {
@@ -48,7 +48,7 @@
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () {
@@ -40,7 +40,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablebatalgadai = $('#myTable').DataTable({
@@ -67,7 +67,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -40,7 +40,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
// alert(btoa(api_url));
@@ -54,7 +54,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -69,7 +69,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tabletebus = $('#myTable').DataTable({
@@ -70,7 +70,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var panjartebus = $('#myTable').DataTable({
@@ -47,7 +47,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () {
@@ -41,7 +41,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -48,7 +48,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -53,7 +53,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
@@ -48,7 +48,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () {
@@ -77,7 +77,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -76,7 +76,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -68,7 +68,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tabletuntutbaki = $('#myTable').DataTable({
@@ -72,7 +72,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var advansurtable = $('#myTable').DataTable({
@@ -46,7 +46,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
@@ -78,7 +78,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tabletebus = $('#myTable').DataTable({
@@ -80,7 +80,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablegadai = $('#myTable').DataTable({
@@ -41,7 +41,7 @@
</div>
</div>
<script type="text/javascript">
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({
+2 -2
View File
@@ -134,7 +134,7 @@
</div>
<script src="{{ asset('js/main.js') }}"></script>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(".modal.fade").on("show.bs.modal", function(e) {
@@ -1087,7 +1087,7 @@
if (suratBtn) {
const norujukan = suratBtn.getAttribute('data-norujukan');
let gadaianDetail = await fetch("{{ config('api.url') }}" + `/api/gadai/norujukankodcaw/${kodcaw}/${norujukan}`)
let gadaianDetail = await fetch("{{ api_url_for_browser() }}" + `/api/gadai/norujukankodcaw/${kodcaw}/${norujukan}`)
.then(response => response.json());
askOperasiApproval(gadaianDetail[0][0]);
@@ -134,7 +134,7 @@
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "{{ Auth::user()->cawangan }}";
$(document).ready(function(){
@@ -304,7 +304,7 @@
<script>
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
$(document).ready(function() {
@@ -104,7 +104,7 @@
]
});
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
let kodcaw = "{{ Auth::user()->cawangan }}";
let teller = "{{ Auth::user()->name }}";
@@ -110,7 +110,7 @@
"ordering": false
});
var api_url = '{{ $api_url }}';
var api_url = '{{ api_url_for_browser() }}';
$('#PermohonanWang').on('hidden.bs.modal', function (e) {
$(this)
@@ -81,7 +81,7 @@
"ordering": false
});
var api_url = '{{ $api_url }}';
var api_url = '{{ api_url_for_browser() }}';
</script>
@endsection
+1 -1
View File
@@ -104,7 +104,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'] }}";
+1 -1
View File
@@ -139,7 +139,7 @@
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "{{ Auth::user()->cawangan }}";
$(document).ready(function(){
+1 -1
View File
@@ -179,7 +179,7 @@
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var cawangan = "{{ Auth::user()->cawangan }}";
+1 -1
View File
@@ -410,7 +410,7 @@
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var ppc = "{{ Auth::user()->name }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
+1 -1
View File
@@ -466,7 +466,7 @@
</div>
<script>
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var ppc = "{{ Auth::user()->name }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
+1 -1
View File
@@ -52,7 +52,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 ?>";
$(document).ready(function(){
+4 -2
View File
@@ -59,7 +59,7 @@
@if(Auth::user()->roles == 'ppc' || Auth::user()->roles == 'pc')
<script>
window.api = "{{ config('api.url') }}";
window.api = "{{ api_url_for_browser() }}";
window.kodcaw = "{{ Auth::user()->cawangan }}";
window.apikey = "{{ env('PUSHER_APP_KEY') }}";
</script>
@@ -199,7 +199,7 @@
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ml-auto">
@include('layouts.partials.impersonation_nav')
@php $auth_user = Auth::user(); @endphp
@if ($auth_user['roles'] == 'ppc' || $auth_user['roles'] == 'pc')
@@ -381,6 +381,7 @@
<a class="dropdown-item" href="{{ route('profile') }}">
{{ __('Profile') }}
</a>
@if(!(Auth::check() && method_exists(Auth::user(), 'isImpersonated') && Auth::user()->isImpersonated()))
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
@@ -390,6 +391,7 @@
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
@endif
</div>
</li>
@@ -105,6 +105,7 @@
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ml-auto">
@include('layouts.partials.impersonation_nav')
<!-- <li class="nav-item dropdown" style="margin-right:10px;">
<a id="navbarDropdown" class="nav-link " href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
<i id="bell" class="fa fa-bell"></i>
@@ -143,6 +144,7 @@
<a class="dropdown-item" href="{{ route('profile') }}">
{{ __('Profile') }}
</a>
@if(!(Auth::check() && method_exists(Auth::user(), 'isImpersonated') && Auth::user()->isImpersonated()))
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
@@ -152,6 +154,7 @@
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
@endif
</div>
</li>
@@ -107,6 +107,7 @@
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ml-auto">
@include('layouts.partials.impersonation_nav')
<li class="nav-item dropdown" style="margin-right:10px;">
<a id="navbarDropdown" class="nav-link " href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
<i id="bell" class="fa fa-bell"></i>
@@ -233,6 +234,7 @@
<a class="dropdown-item" href="{{ route('profile') }}">
{{ __('Profile') }}
</a>
@if(!(Auth::check() && method_exists(Auth::user(), 'isImpersonated') && Auth::user()->isImpersonated()))
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
@@ -242,6 +244,7 @@
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
@csrf
</form>
@endif
</div>
</li>
@@ -0,0 +1,11 @@
@if(Auth::check() && method_exists(Auth::user(), 'isImpersonated') && Auth::user()->isImpersonated())
<li class="nav-item" style="margin-right:10px;">
<form method="post" action="{{ route('impersonate.leave') }}" class="m-0">
@csrf
<button type="submit" class="btn btn-sm btn-warning" title="Stop impersonate">
Keluar Penyamaran
</button>
</form>
</li>
@endif
@@ -200,7 +200,7 @@
}
});
var api = '<?php echo $api_url ?>';
var api = "{{ api_url_for_browser() }}";
let nw = 0;
function wakilfunction(e)
@@ -536,7 +536,7 @@ function ubahwakil(e)
{
let norujukan = $('#norujukan').val();
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
let nowakil = nw;
let jenis = '';
@@ -627,7 +627,7 @@ function ubahwakil(e)
let norujukan = $('#norujukan').val();
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
let nowakil = 0;
let jenis = '';
let mohon = '';
+2 -2
View File
@@ -229,7 +229,7 @@
}
});
var api = '<?php echo $api_url ?>';
var api = "{{ api_url_for_browser() }}";
let nw = 0;
function wakilfunction(e)
@@ -565,7 +565,7 @@ function ubahwakil(e)
{
let norujukan = $('#norujukan').val();
let api = "{{ config('api.url') }}";
let api = "{{ api_url_for_browser() }}";
let nowakil = nw;
let jenis = '';
@@ -102,7 +102,7 @@ $(document).ready(function()
function carila()
{
var api_url = "<?php echo $api_url ?>";
var api_url = "{{ api_url_for_browser() }}";
var noic = $('#noic').val();

Some files were not shown because too many files have changed in this diff Show More