67 Commits

Author SHA1 Message Date
nurafrinaalimi16 d6df3e744c fix resit tebus (diskaun promosi) 2026-09-02 16:16:15 +08:00
nurafrinaalimi16 166215b989 fix layout laporan on pc/ppc view 2026-09-02 11:32:57 +08:00
nurafrinaalimi16 f895ddb404 fix kadar rebet on teller page 2026-09-02 11:32:19 +08:00
nurafrinaalimi16 ac519f7a5f Merge remote-tracking branch 'origin/prod-kopkb' into annur-rebate 2026-09-01 11:08:05 +08:00
dev_kopkb 71537d4deb Merged in feature/kadar-anggota (pull request #403)
enable kadar anggota for all branches
2026-08-30 03:55:08 +00:00
nurafrinaalimi16 a555406b2b enable kadar anggota for all branches 2026-08-30 11:52:19 +08:00
dev_kopkb 3c9b224ad2 Merged prod-kopkb into feature/kadar-anggota 2026-08-27 02:26:21 +00:00
dev_kopkb aa8647aad4 Merged in feature/kadar-anggota (pull request #402)
feat: separate SAG versions for public and anggota
2026-08-27 02:26:03 +00:00
nurafrinaalimi16 e4d50e9e1c feat: separate SAG versions for public and anggota 2026-08-27 10:16:04 +08:00
dev_kopkb 23408d327c Merged in feature/kadar-anggota (pull request #401)
change kadar anggota to 1%
2026-08-26 15:07:45 +00:00
nurafrinaalimi16 59efddb005 change kadar anggota to 1% 2026-08-26 23:05:53 +08:00
root e1f17472eb latest stable version 2026-08-26 15:35:37 +08:00
nurafrinaalimi16 8512205b87 logo for sag latest version 2026-05-26 10:09:42 +08:00
nurafrinaalimi16 1ba51d1158 pelarasan rebate on imbang duga 2025-08-17 16:03:10 +08:00
nurafrinaalimi16 e95e7671ed fix rounded diskaun rebate 2025-05-27 12:23:23 +08:00
nurafrinaalimi16 1d4c5d47f3 fix laporan tebus 2025-05-21 16:49:24 +08:00
nurafrinaalimi16 4e5d6d4d3d fix sag hilang 2025-05-18 09:59:10 +08:00
nurafrinaalimi16 7718b137c7 fix penebusan controller 2025-05-13 11:10:10 +08:00
nurafrinaalimi16 41bacebd54 sag new version 2025-05-11 16:34:30 +08:00
nurafrinaalimi16 302584f137 rebate annur 2025-05-11 16:32:30 +08:00
nurafrinaalimi16 4ed8067239 Merge branch 'production' of https://bitbucket.org/arrahn-pkb/kaunter into annur-rebate 2025-02-05 12:18:49 +08:00
nurafrinaalimi16 a0a50b42a0 imbang duga koperasi 2025-02-03 12:14:02 +08:00
BTMS3 14677ea777 newupdatesagv2.2 2025-02-03 12:13:35 +08:00
Ain Izazi 9e840c0439 remove command 2025-02-03 12:13:35 +08:00
Ain Izazi 3d66712c4e feat audit 2025-02-03 12:13:35 +08:00
Ain Izazi 1058ece282 audit di kaunter 2025-02-03 12:13:35 +08:00
BTMS3 e5666e1106 update sag v2.2 2025-02-03 12:13:35 +08:00
Hafifie PKB 59b0118100 restore 2025-01-14 2025-02-03 12:13:35 +08:00
BTMS2 9a40c39349 tutup whatsapp 2025-02-03 12:13:35 +08:00
Hafifie PKB cbd8ea5c52 fix commit notification bawah umur 2025-02-03 12:13:35 +08:00
hafifierahman 34c06649b7 added function to detect customers that underage 2025-02-03 12:13:35 +08:00
Ain Izazi 6974e48b6e update message di khazanah dan importan work 2025-02-03 12:13:35 +08:00
Ain Izazi d52eee991b update pekerjaan lain-lain 2025-02-03 12:13:34 +08:00
Ain Izazi f2ee3b8031 add auth user di barcodescannedtebus 2025-02-03 12:13:16 +08:00
Ain Izazi ce6c2c4f3e add auth user di wakilController 2025-02-03 12:13:16 +08:00
Ain Izazi a0ed815f8e add insert record utk pendahuluan dan serah 2025-02-03 12:13:16 +08:00
Ain Izazi 330cbadeff changes funct kakitangan di khazanahcontr 2025-02-03 12:13:16 +08:00
Ain Izazi fcc61171c5 add changes di tukarcawanganupdate 2025-02-03 12:13:16 +08:00
Ain Izazi 31aaca59a9 add record password 2025-02-03 12:13:16 +08:00
BTMS2 ae417aa90d feat Log Masuk & Keluar Sistem 2025-02-03 12:13:16 +08:00
Hafifie PKB 60aac19737 fix nobaucer handle if null 2025-02-03 12:13:16 +08:00
Hafifie PKB 7927e102df added rekod tunai in aliran tunai 2025-02-03 12:13:16 +08:00
hafifierahman 887922b7da remove + 2025-02-03 12:13:16 +08:00
hafifierahman 5606c892e3 added tempblock and * for khazanah 2025-02-03 12:13:16 +08:00
hafifierahman ef9882c9c4 added block specific cawangan transaction 2025-02-03 12:13:15 +08:00
Hafifie PKB a709104090 fix bakipembiayaan + keuntungan (based on shahmi operasi) 2025-02-03 12:12:21 +08:00
Hafifie PKB d20cfa1214 fix resit PS(based on shahmin operasi) 2025-02-03 12:12:21 +08:00
Hafifie PKB 1983de4e3b added tambahpinjam 2025-02-03 12:12:21 +08:00
Hafifie PKB c77e619be5 fix bug fix 2025-02-03 12:12:20 +08:00
Hafifie PKB c388782650 added wakil in tambah pinjaman 2025-02-03 12:11:32 +08:00
Hafifie PKB d671b634ea added parameter to call in api for tebus pinjaman and auto tawarruq 2025-02-03 12:11:32 +08:00
hafifierahman 36cfb10315 added tambah pinjaman 2025-02-03 12:11:10 +08:00
hafifierahman 4e67e10d0d commit error swal fire 2025-02-03 12:10:48 +08:00
Hafifie PKB 3d1b4c7643 test AT transaction 2025-02-03 12:10:47 +08:00
hafifierahman e9f8c7ac30 added function operasi can edit perubatan asal 2025-02-03 12:10:31 +08:00
hafifierahman 5a8bc6dfed finished notification 2025-02-03 12:10:31 +08:00
Hafifie PKB 4dc4a53cdb add function in perubatan.js 2025-02-03 12:10:31 +08:00
hafifierahman e31411ae71 add scaffold for perubatan 2025-02-03 12:10:30 +08:00
Hafifie PKB 365b614020 fix perubatan 2025-02-03 12:10:30 +08:00
Hafifie PKB 9128bdbc85 added panjar 2025-02-03 12:10:30 +08:00
hafifierahman 85510305e3 addded notification 2025-02-03 12:10:30 +08:00
hafifierahman b2dfd421a7 first commit for kaunter in fixing cash deposit 2025-02-03 12:10:30 +08:00
nurafrinaalimi16 fc15e555ec imbang duga koperasi 2025-02-02 16:36:31 +08:00
nurafrinaalimi16 9031e8d7d8 imbang duga koperasi 2025-02-02 16:35:17 +08:00
nurafrinaalimi16 1ba4a1fe19 add parameter kadar rebate on index blade 2025-02-02 16:34:15 +08:00
nurafrinaalimi16 a2350d36f3 Merge branch 'production' of https://bitbucket.org/arrahn-pkb/kaunter into annur-rebate 2024-12-03 12:50:30 +08:00
dev_kopkb 9307ea5e1d add kadar rebet annur at gadai page 2024-11-19 11:38:02 +08:00
171 changed files with 2275 additions and 11984 deletions
-16
View File
@@ -1,16 +0,0 @@
.git
.gitea
node_modules
vendor
.env
.env.*
!.env.example
storage/logs
storage/framework/cache
storage/framework/sessions
storage/framework/views
storage/debugbar
npm-debug.log
Dockerfile
docker-compose.yml
docker-compose.staging.yml
-54
View File
@@ -1,54 +0,0 @@
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
-55
View File
@@ -1,55 +0,0 @@
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
# Server-side Http:: from Docker — same rules as API_URL. Defaults in config/api.php use localhost:8000 which fails inside containers.
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 -1
View File
@@ -46,5 +46,5 @@ AWS_BUCKET=
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 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=8085
MYKAD_READER_ENABLED_CAWANGAN='' # IF NO CAWANGAN STATED, ALL CAWANGAN IS ENABLED MYKAD_READER_ENABLED_CAWANGAN='' # IF NO CAWANGAN STATED, ALL CAWANGAN IS ENABLED
-58
View File
@@ -1,58 +0,0 @@
APP_NAME=Laravel
APP_ENV=staging
APP_VERSION=v2.2-staging
APP_KEY=base64:O1XZDqK4H6+3GdrODgCaLr2l+OoWvgVhYr0GJ1KizW8=
APP_DEBUG=true
APP_URL=https://staging.erahn.com.my
HTTP_PORT=8091
MYSQL_PUBLISH_PORT=3309
API_URL=https://api-staging.erahn.com.my
API_URL_KOOP=https://api-staging.erahn.com.my
API_URL_PKB=https://api-staging.erahn.com.my
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=17321
MYKAD_READER_ENABLED_CAWANGAN='' # IF NO CAWANGAN STATED, ALL CAWANGAN IS ENABLED
-49
View File
@@ -1,49 +0,0 @@
name: Build Docker Image
on:
push:
branches:
- staging
tags:
- "v*"
workflow_dispatch:
jobs:
build-frontend:
runs-on: docker
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Login to Docker registry
run: |
echo "${{ secrets.REGISTRY_PASSWORD }}" | \
docker login git.koppkb.com \
-u "${{ secrets.REGISTRY_USERNAME }}" \
--password-stdin
- name: Build & push frontend image
run: |
set -e
IMAGE="git.koppkb.com/kopkb/kaunter"
TAGS="-t ${IMAGE}:${{ gitea.sha }}"
if [ "${{ gitea.ref_type }}" = "tag" ] && echo "${{ gitea.ref_name }}" | grep -q '^v'; then
TAGS="${TAGS} -t ${IMAGE}:${{ gitea.ref_name }}"
fi
if [ "${{ gitea.ref_name }}" = "staging" ]; then
TAGS="${TAGS} -t ${IMAGE}:staging"
fi
echo "Building and pushing frontend: ${TAGS}"
docker buildx build \
--target staging \
--platform linux/amd64 \
--cache-from type=registry,ref=${IMAGE}:buildcache,ignore-error=true \
--cache-to type=registry,ref=${IMAGE}:buildcache,mode=max \
-f docker/php/Dockerfile \
${TAGS} \
--push .
-123
View File
@@ -1,123 +0,0 @@
name: Deploy to Staging
on:
workflow_dispatch:
inputs:
image_tag:
description: "Docker image tag to deploy (commit SHA, staging, or v*)"
required: true
default: "staging"
type: string
env:
APP_IMAGE: git.koppkb.com/kopkb/kaunter
DEPLOY_DIR: /home/arrahn/Project/kaunter
jobs:
deploy:
runs-on: host
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ inputs.image_tag }}
- name: Login to Docker registry
run: |
echo "${{ secrets.REGISTRY_PASSWORD }}" | \
docker login git.koppkb.com \
-u "${{ secrets.REGISTRY_USERNAME }}" \
--password-stdin
- name: Verify image exists in registry
run: |
set -e
IMAGE_TAG="${{ inputs.image_tag }}"
IMAGE="${APP_IMAGE}:${IMAGE_TAG}"
echo "Checking if image exists: ${IMAGE}"
if ! docker manifest inspect "${IMAGE}" > /dev/null 2>&1; then
echo "ERROR: Image ${IMAGE} does not exist in registry!"
echo "Run the Build Docker Image workflow first."
exit 1
fi
echo "✓ ${IMAGE} found"
- name: Pull Docker image
run: |
set -e
IMAGE_TAG="${{ inputs.image_tag }}"
docker pull "${APP_IMAGE}:${IMAGE_TAG}"
echo "✓ Image pulled successfully"
- name: Sync compose file and deploy
run: |
set -e
IMAGE_TAG="${{ inputs.image_tag }}"
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"
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
cp .env.staging "${DEPLOY_DIR}/.env.staging"
echo "Copied .env.staging from repo (first deploy). Edit ${DEPLOY_DIR}/.env.staging on the server if needed."
else
echo "ERROR: ${DEPLOY_DIR}/.env.staging is missing on the server"
exit 1
fi
fi
cd "${DEPLOY_DIR}"
export APP_IMAGE
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 --force-recreate --remove-orphans app web
echo "✓ Deployed IMAGE_TAG=${IMAGE_TAG}"
- name: Verify deployment
run: |
set -e
cd "${DEPLOY_DIR}"
echo "Waiting for services to start..."
sleep 10
for SERVICE in app web mysql; do
STATUS=$(docker compose --env-file .env.staging -f docker-compose.yml ps --status running --format '{{.Name}}' "$SERVICE" 2>/dev/null || true)
if [ -z "$STATUS" ]; then
echo "ERROR: ${SERVICE} is not running"
docker compose --env-file .env.staging -f docker-compose.yml ps
docker compose --env-file .env.staging -f docker-compose.yml logs --tail=50 "$SERVICE" || true
exit 1
fi
echo "✓ ${SERVICE} is running (${STATUS})"
done
HTTP_PORT=$(grep -E '^HTTP_PORT=' .env.staging 2>/dev/null | cut -d= -f2- | tr -d '"' || true)
HTTP_PORT=${HTTP_PORT:-8091}
check_health() {
NAME=$1
URL=$2
for i in 1 2 3 4 5 6; do
if curl -sf "$URL" > /dev/null; then
echo "✓ ${NAME} health check passed (${URL})"
return 0
fi
echo "Waiting for ${NAME}... attempt ${i}/6"
sleep 5
done
echo "ERROR: ${NAME} health check failed (${URL})"
docker compose --env-file .env.staging -f docker-compose.yml logs --tail=50 app web || true
return 1
}
check_health "kaunter" "http://127.0.0.1:${HTTP_PORT}/health"
+1 -1
View File
@@ -11,5 +11,5 @@ Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
/.vscode /.vscode
docker-compose.yml
docker_src/ docker_src/
**/.DS_Store
-50
View File
@@ -1,51 +1 @@
If you does't know what is this you probably in wrong project 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
@@ -1,27 +0,0 @@
## 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)
+4 -67
View File
@@ -1,83 +1,20 @@
<?php <?php
namespace App; namespace App;
use DateTime; use DateTime;
class Helper class Helper
{ {
public static function formatNumber($amount) public static function formatNumber($amount)
{ {
return number_format($amount, 2, '.', ','); $formattedAmount = number_format($amount, 2, '.', ',');
return $formattedAmount;
} }
public static function formatDate($date_string) public static function formatDate($date_string)
{ {
return (new DateTime($date_string))->format("d-m-Y"); return (new DateTime($date_string))->format("d-m-Y");
} }
public static function terbilangBm(int $number): string
{
$units = [
0 => 'kosong',
1 => 'satu',
2 => 'dua',
3 => 'tiga',
4 => 'empat',
5 => 'lima',
6 => 'enam',
7 => 'tujuh',
8 => 'lapan',
9 => 'sembilan',
10 => 'sepuluh',
11 => 'sebelas'
];
if ($number < 0) return 'negatif ' . self::terbilangBm(abs($number));
if ($number < 12) return $units[$number];
if ($number < 20) return self::terbilangBm($number - 10) . ' belas';
if ($number < 100) {
$tens = intdiv($number, 10);
$rest = $number % 10;
return self::terbilangBm($tens) . ' puluh' . ($rest ? ' ' . self::terbilangBm($rest) : '');
}
if ($number < 200) return 'seratus' . ($number > 100 ? ' ' . self::terbilangBm($number - 100) : '');
if ($number < 1000) {
$hundreds = intdiv($number, 100);
$rest = $number % 100;
return self::terbilangBm($hundreds) . ' ratus' . ($rest ? ' ' . self::terbilangBm($rest) : '');
}
if ($number < 2000) return 'seribu' . ($number > 1000 ? ' ' . self::terbilangBm($number - 1000) : '');
if ($number < 1000000) {
$thousands = intdiv($number, 1000);
$rest = $number % 1000;
return self::terbilangBm($thousands) . ' ribu' . ($rest ? ' ' . self::terbilangBm($rest) : '');
}
if ($number < 1000000000) {
$millions = intdiv($number, 1000000);
$rest = $number % 1000000;
return self::terbilangBm($millions) . ' juta' . ($rest ? ' ' . self::terbilangBm($rest) : '');
}
return 'terlalu besar';
}
public static function ringgitTerbilang($amount, bool $tambahSahaja = true): string
{
$formatted = number_format((float)$amount, 2, '.', '');
[$ringgitStr, $senStr] = explode('.', $formatted);
$ringgit = (int)$ringgitStr;
$sen = (int)$senStr;
$parts = [];
$parts[] = self::terbilangBm($ringgit) . ' ringgit';
if ($sen > 0) {
$parts[] = 'dan ' . self::terbilangBm($sen) . ' sen';
} elseif ($tambahSahaja) {
$parts[] = 'sahaja';
}
return trim(preg_replace('/\s+/', ' ', implode(' ', $parts)));
}
} }
+7 -67
View File
@@ -2,14 +2,12 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\User;
use App\Cawangan;
use Carbon\Carbon;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Services\CustomerService; use App\Services\CustomerService;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
class AliranTunaiController extends Controller class AliranTunaiController extends Controller
@@ -601,7 +599,7 @@ class AliranTunaiController extends Controller
return response($updateTunai); return response($updateTunai);
} }
public function LaporanAliranTunai($teller, Request $request) public function LaporanAliranTunai($teller)
{ {
$auth_user = Auth::user(); $auth_user = Auth::user();
$api_url = config('api.url'); $api_url = config('api.url');
@@ -613,6 +611,8 @@ class AliranTunaiController extends Controller
$cawangan=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/cawangan/detail/'.$auth_user['cawangan'])->json(); $cawangan=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/cawangan/detail/'.$auth_user['cawangan'])->json();
$cawangan_detail=$cawangan[0]; $cawangan_detail=$cawangan[0];
$tarikh_cetak = $current->toDateString();
$cawangan=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/cawangan/detail/'.$auth_user['cawangan'])->json(); $cawangan=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/cawangan/detail/'.$auth_user['cawangan'])->json();
$alirantunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/GetCurrentTunai/' . $auth_user['cawangan'],['kodlaluan' => $auth_user['name']])->json(); $alirantunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/GetCurrentTunai/' . $auth_user['cawangan'],['kodlaluan' => $auth_user['name']])->json();
@@ -621,67 +621,7 @@ class AliranTunaiController extends Controller
$teller = $auth_user['name']; $teller = $auth_user['name'];
$bakiLelong = Http::withOptions(['verify' =>config('app.api_verify')])->get(config('api.url') . '/api/lelong/bakilelongbyteller/'.$auth_user['cawangan'],[ return view('aliran_tunai.laporan.laporanalirantunai',compact('tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail','addtunai','alirantunai','teller'));
'tarikh' => $request->datetimepicker1
])->json();
return view('aliran_tunai.laporan.laporanalirantunai',compact('tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail','addtunai','alirantunai','teller', 'bakiLelong'));
}
public function laporanAliranTunaiTeller()
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
return view('khazanah.laporan.alirantunai', compact('api_url', 'cawangan_info'));
}
public function cetakLaporanAliranTunaiTeller(Request $request)
{
$api_url = config('api_url');
$auth_user = Auth::user();
$current = Carbon::now();
$current = new Carbon();
$tarikh_cetak = $current->toDateString();
if($request->datetimepicker1 == null){
$tarikh = $current->toDateString();
}else{
$split_date = explode('-',$request->datetimepicker1);
$tarikh = $split_date[2] . '-' . $split_date[1] . '-' . $split_date[0];
}
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
$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();
$teller = $auth_user['name'];
$bakiLelong = Http::withOptions(['verify' =>config('app.api_verify')])->get(config('api.url') . '/api/lelong/bakilelongbyteller/'.$auth_user['cawangan'],[
'tarikh' => $tarikh,
'kodlaluan' => $auth_user['name']
])->json();
$tunai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getTunaiByTarikh/',[
'kodlaluan' => $auth_user['name'],
'kodcaw' => $auth_user['cawangan'],
'tarikh' => $tarikh
])->json();
if(!$tunai)
{
return redirect()->back()->with('errormessage', 'Tiada data pada tarikh tersebut.');
}
$jumlahTambah = $tunai['tambah'] + $tunai['masuk'] + $bakiLelong['rugi_lelong'];
$jumlahTolak = $tunai['kurang'] + $tunai['keluar'] + $bakiLelong['baki_lelong'];
return view('aliran_tunai.laporan.laporanalirantunai',compact('tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail','addtunai','tunai','teller', 'bakiLelong', 'jumlahTambah', 'jumlahTolak'));
} }
public function LaporanTunaiTeller(Request $request){ public function LaporanTunaiTeller(Request $request){
@@ -1,52 +0,0 @@
<?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');
}
}
+6 -40
View File
@@ -60,7 +60,9 @@ class LoginController extends Controller
'password' => 'required|string', 'password' => 'required|string',
]); ]);
if ($this->attemptWebLogin($request)) { $credentials = $request->only('email', 'password');
if (Auth::guard('web')->attempt($credentials)) {
$auth_user = Auth::guard('web')->user(); $auth_user = Auth::guard('web')->user();
$api_url = config('api.url'); $api_url = config('api.url');
@@ -101,7 +103,9 @@ class LoginController extends Controller
'password' => 'required|string', 'password' => 'required|string',
]); ]);
if ($this->attemptDashboardLogin($request)) { $credentials = $request->only('email', 'password');
if (Auth::guard('dashboard')->attempt($credentials,true)) {
$auth_user = Auth::guard('dashboard')->user(); $auth_user = Auth::guard('dashboard')->user();
$user_login['nama'] = $auth_user['name']; $user_login['nama'] = $auth_user['name'];
@@ -183,42 +187,4 @@ class LoginController extends Controller
return response()->json($kakitangan,200); 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);
}
} }
+2 -118
View File
@@ -358,7 +358,7 @@ class CustomersController extends Controller
])->json(); ])->json();
} }
$customer_payload = [ $customer_info = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/customers/create/' . $auth_user['cawangan'], [
'kodcaw' => $auth_user['cawangan'], 'kodcaw' => $auth_user['cawangan'],
'nopelanggan' => $no_pelanggan, 'nopelanggan' => $no_pelanggan,
'nokpbaru' => $nokpbaru, 'nokpbaru' => $nokpbaru,
@@ -385,14 +385,7 @@ class CustomersController extends Controller
'nota_pekerjaan' => $request->nota_pekerjaan, 'nota_pekerjaan' => $request->nota_pekerjaan,
'notaarcc' => $request->notaarcc, 'notaarcc' => $request->notaarcc,
'tujuangadai' => $request->tujuan_gadai, 'tujuangadai' => $request->tujuan_gadai,
]; ]);
if ($request->filled('photo_base64')) {
$customer_payload['photo_base64'] = $request->input('photo_base64');
$customer_payload['photo_mime'] = $request->input('photo_mime') ?: 'image/jpeg';
}
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/customers/create/' . $auth_user['cawangan'], $customer_payload);
Session::put('customer_info', $customer_info); Session::put('customer_info', $customer_info);
Session::put('noic', $request->noic); Session::put('noic', $request->noic);
@@ -581,113 +574,4 @@ class CustomersController extends Controller
return redirect()->back()->with('error', 'Gagal mengemaskini status anggota. Sila cuba semula.'); return redirect()->back()->with('error', 'Gagal mengemaskini status anggota. Sila cuba semula.');
} }
} }
public function printMaklumat(Request $request)
{
$noic = $request->query('noic') ?: Session::get('noic');
if (empty($noic)) {
return redirect('/pelanggan');
}
$auth_user = Auth::user();
$api_url = config('api.url');
$verify = ['verify' => config('app.api_verify')];
$kodcaw = $auth_user['cawangan'];
$customer = Http::withOptions($verify)->get($api_url . '/api/customers/' . $noic)->json();
if (!is_array($customer) || (empty($customer['nama']) && empty($customer['nopelanggan']) && empty($customer['kpbaru']) && empty($customer['kplama']))) {
abort(404, 'Pelanggan tidak dijumpai.');
}
$cawanganResp = Http::withOptions($verify)->get($api_url . '/api/cawangan/detail/' . $kodcaw)->json();
$cawangan_detail = (is_array($cawanganResp) && isset($cawanganResp[0]))
? $cawanganResp[0]
: (is_array($cawanganResp) ? $cawanganResp : []);
$banks = Http::withOptions($verify)->get($api_url . '/api/bank')->json();
$pekerjaanList = Http::withOptions($verify)->get($api_url . '/api/pekerjaan')->json();
$poskodKod = $customer['poskod'] ?? '';
$poskod = [];
if ($poskodKod !== '' && $poskodKod !== null) {
$poskodResp = Http::withOptions($verify)->get($api_url . '/api/poskod/' . $poskodKod)->json();
if (is_array($poskodResp)) {
$poskod = $poskodResp;
}
}
$daerahNama = 'NIL';
$negeriNama = 'NIL';
if (!empty($poskod['koddaerah'])) {
$daerahResp = Http::withOptions($verify)->get($api_url . '/api/daerah/' . $poskod['koddaerah'])->json();
$daerahNama = is_array($daerahResp) ? ($daerahResp['namadaerah'] ?? 'NIL') : 'NIL';
}
if (!empty($poskod['kodnegeri'])) {
$negeriResp = Http::withOptions($verify)->get($api_url . '/api/negeri/' . $poskod['kodnegeri'])->json();
$negeriNama = is_array($negeriResp) ? ($negeriResp['negeri'] ?? 'NIL') : 'NIL';
}
$bankNama = $this->lookupListValue($banks, 'abbreviation', $customer['kodbank'] ?? null, 'name');
$pekerjaanNama = $this->lookupListValue($pekerjaanList, 'kodkerja', $customer['kodkerja'] ?? null, 'keterangan');
if (($customer['kodkerja'] ?? '') == '6' && !empty($customer['nota_pekerjaan'])) {
$pekerjaanNama = $customer['nota_pekerjaan'];
}
$photo_svg = '<svg xmlns="http://www.w3.org/2000/svg" width="240" height="320" viewBox="0 0 240 320">'
. '<rect fill="#d9dee5" width="240" height="320"/>'
. '<circle cx="120" cy="118" r="52" fill="#8b949e"/>'
. '<ellipse cx="120" cy="286" rx="90" ry="92" fill="#8b949e"/>'
. '</svg>';
$photo_src = 'data:image/svg+xml;base64,' . base64_encode($photo_svg);
if (!empty($customer['photo_base64'])) {
$mime = $customer['photo_mime'] ?? 'image/jpeg';
$photo_src = 'data:' . $mime . ';base64,' . $customer['photo_base64'];
}
return view('print.maklumat_pelanggan', [
'cawangan' => $cawangan_detail['namacaw'] ?? ($cawangan_detail['details_caw'] ?? $kodcaw),
'kodcaw' => $kodcaw,
'alamat1' => $cawangan_detail['alamat1'] ?? '',
'alamat2' => $cawangan_detail['alamat2'] ?? '',
'notel' => $cawangan_detail['notel'] ?? '',
'tarikh' => Carbon::now()->format('d/m/Y'),
'nama' => $this->printBlank($customer['nama'] ?? null),
'nokp' => $this->printBlank(!empty($customer['kpbaru']) ? $customer['kpbaru'] : ($customer['kplama'] ?? $noic)),
'nopelanggan' => $this->printBlank($customer['nopelanggan'] ?? null),
'status' => (!empty($customer['tag_anggota']) && $customer['tag_anggota'] == 1) ? 'Anggota Koperasi' : 'Pelanggan',
'telefon' => $this->printBlank($customer['telefon'] ?? null),
'telefon2' => $this->printBlank($customer['telefon2'] ?? null),
'alamat' => $this->printBlank($customer['alamat1'] ?? null),
'poskod' => $this->printBlank($customer['poskod'] ?? null),
'daerah' => $daerahNama,
'negeri' => $negeriNama,
'bank' => $this->printBlank($bankNama),
'noakaun' => $this->printBlank($customer['noakaun'] ?? null),
'pekerjaan' => $this->printBlank($pekerjaanNama),
'nota' => $this->printBlank($customer['nota'] ?? null),
'photo_src' => $photo_src,
]);
}
private function printBlank($value)
{
if ($value === null) {
return 'NIL';
}
$value = is_string($value) ? trim($value) : $value;
return $value === '' ? 'NIL' : $value;
}
private function lookupListValue($list, $key, $match, $nameKey)
{
if (!is_array($list) || $match === null || $match === '' || $match === '-') {
return '';
}
foreach ($list as $item) {
if (is_array($item) && ($item[$key] ?? null) == $match) {
return $item[$nameKey] ?? '';
}
}
return '';
}
} }
+3 -153
View File
@@ -201,6 +201,8 @@ class GadaianController extends Controller
'onepercent' => $onepercent, 'onepercent' => $onepercent,
'margin_semasa' => $margin_pinjaman, 'margin_semasa' => $margin_pinjaman,
'nokp' => $request->nokp, 'nokp' => $request->nokp,
'kadar_rebate' => $request->kadar_rebate,
'rebate' => $request->rebate
])->json(); ])->json();
@@ -211,169 +213,17 @@ class GadaianController extends Controller
'teller' => $auth_user['name'] 'teller' => $auth_user['name']
]); ]);
$caraTerima = strtoupper((string) $request->input('cara_terima', 'TUNAI')); $this->AliranTunaiController->alirantunaiGadai($request, $auth_user['name']);
$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'])); event(new GadaiNotify('lulus', $auth_user['cawangan']));
$request->session()->forget('page_reload'); $request->session()->forget('page_reload');
$request->session()->forget('norujukan'); $request->session()->forget('norujukan');
$request->session()->flash('activate_tab', 'SAG_baru'); $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'); return redirect()->route('customer_info');
} }
public function printBorangPengesahanOnline($norujukan)
{
$auth_user = Auth::user();
$kodcaw = $auth_user['cawangan'];
$onlineResp = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/pembiayaan-online/' . $kodcaw . '/by-norujukan/' . $norujukan);
if (!$onlineResp->successful()) {
abort(404, 'Pembiayaan online tidak dijumpai.');
}
$line = $onlineResp->json();
if (!is_array($line) || empty($line['norujukan'])) {
abort(404, 'Pembiayaan online tidak dijumpai.');
}
return $this->renderBorangPengesahanOnline($line, $kodcaw);
}
public function previewBorangPengesahanOnline(Request $request)
{
$auth_user = Auth::user();
$kodcaw = $auth_user['cawangan'];
$line = [
'norujukan' => $request->input('norujukan'),
'nokp' => $request->input('nokp'),
'nopelanggan' => $request->input('nopelanggan'),
'nama_pelanggan' => $request->input('nama_pelanggan'),
'pinjaman' => $request->input('pinjaman'),
'kodbank' => $request->input('kodbank'),
'nama_bank' => $request->input('nama_bank'),
'noakaun' => $request->input('noakaun'),
'nama_akaun' => $request->input('nama_akaun'),
'created_by' => $auth_user['name'] ?? '',
'created_at' => Carbon::now()->toDateTimeString(),
];
if (empty($line['norujukan']) || empty($line['noakaun'])) {
abort(422, 'Sila lengkapkan maklumat bank sebelum cetak borang.');
}
return $this->renderBorangPengesahanOnline($line, $kodcaw);
}
private function renderBorangPengesahanOnline(array $line, $kodcaw)
{
$auth_user = Auth::user();
$cawanganResp = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/cawangan/detail/' . $kodcaw)
->json();
$cawangan_detail = (is_array($cawanganResp) && isset($cawanganResp[0]))
? $cawanganResp[0]
: (is_array($cawanganResp) ? $cawanganResp : []);
$nokpRaw = $line['nokp'] ?? '';
$customer = [];
if ($nokpRaw !== '') {
$customerResp = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/customers/' . $nokpRaw)
->json();
if (is_array($customerResp)) {
$customer = $customerResp;
}
}
$cawangan = $cawangan_detail['namacaw']
?? $cawangan_detail['details_caw']
?? $kodcaw;
$alamat1 = $cawangan_detail['alamat1'] ?? '';
$alamat2 = $cawangan_detail['alamat2'] ?? '';
$notel = $cawangan_detail['notel'] ?? '';
$nama = $line['nama_pelanggan'] ?? ($customer['nama'] ?? '');
$nokp = !empty($customer['kpbaru']) ? $customer['kpbaru'] : ($customer['kplama'] ?? $nokpRaw);
$nopelanggan = $line['nopelanggan'] ?? ($customer['nopelanggan'] ?? '');
$telefon = $customer['telefon'] ?? '';
$teller = $line['created_by'] ?? ($auth_user['name'] ?? '');
$bank = $line['nama_bank'] ?? ($line['kodbank'] ?? '');
$noakaun = $line['noakaun'] ?? '';
$nama_akaun = $line['nama_akaun'] ?? $nama;
$pinjaman = number_format((float) ($line['pinjaman'] ?? 0), 2);
$norujukan = $line['norujukan'] ?? '';
$tarikhSumber = $line['created_at'] ?? null;
try {
$tarikh = $tarikhSumber
? Carbon::parse($tarikhSumber)->format('d/m/Y')
: Carbon::now()->format('d/m/Y');
} catch (\Exception $e) {
$tarikh = Carbon::now()->format('d/m/Y');
}
return view('print.borang_pengesahan_online', compact(
'cawangan',
'kodcaw',
'alamat1',
'alamat2',
'notel',
'norujukan',
'tarikh',
'teller',
'nama',
'nokp',
'nopelanggan',
'telefon',
'pinjaman',
'bank',
'noakaun',
'nama_akaun'
));
}
public function editstore(Request $request) public function editstore(Request $request)
{ {
$auth_user = Auth::user(); $auth_user = Auth::user();
+3 -36
View File
@@ -20,43 +20,10 @@ class KakitanganController extends Controller
public function daftarKakitangan(){ public function daftarKakitangan(){
$api_url = config('api.url'); $api_url = config('api.url');
$auth_user = Auth::user(); $auth_user = Auth::user();
$http = Http::withOptions(['verify' => config('app.api_verify')]); $cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
$cawangan_all = $http->get($api_url . '/api/cawangan')->json();
$cawangan_all = is_array($cawangan_all) ? $cawangan_all : [];
$cawangan_by_kod = collect($cawangan_all)->keyBy('kodcaw');
$cawangan_info = $cawangan_by_kod->get($auth_user['cawangan'], []);
$role = Role::get(); $role = Role::get();
$kakitangan_rows = User::where('roles', '!=', 'admin') $kakitangan = User::all();
->get() return view('operasi.daftar_kakitangan',compact('cawangan_info','api_url','role','kakitangan','auth_user'));
->values()
->map(function ($staff) use ($cawangan_by_kod) {
$kod = (string) $staff->cawangan;
if (in_array($kod, ['operasi', 'callcenter', 'admin'], true)) {
$cawangan_nama = ucwords($kod);
} else {
$cawangan_nama = ucwords((string) data_get($cawangan_by_kod, $kod . '.details_caw', $kod));
}
return [
'id' => $staff->id,
'name' => $staff->name,
'roles' => strtoupper((string) $staff->roles),
'role_harian' => $staff->role_harian ? strtoupper($staff->role_harian) : '-',
'role_asal' => $staff->role_asal ? strtoupper($staff->role_asal) : '-',
'cawangan' => $cawangan_nama,
];
});
return view('operasi.daftar_kakitangan', compact(
'cawangan_info',
'api_url',
'role',
'kakitangan_rows',
'auth_user',
'cawangan_all'
));
} }
public function registerStaff(Request $request){ public function registerStaff(Request $request){
+7 -273
View File
@@ -505,9 +505,6 @@ class KhazanahController extends Controller
public function mintakatalaluansemula(Request $request) public function mintakatalaluansemula(Request $request)
{ {
if (app()->environment('local')) {
return "True";
}
if(Hash::check($request->passsemula, Auth::user()->password)) if(Hash::check($request->passsemula, Auth::user()->password))
{ {
@@ -2462,6 +2459,7 @@ class KhazanahController extends Controller
$penghutangkaki = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/PenghutangKakitangan/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json(); $penghutangkaki = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/PenghutangKakitangan/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
$untungrugi = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/UntungRugiCalculation/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json(); $untungrugi = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/UntungRugiCalculation/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
$bayaranpendahuluan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/BayaranPendahuluan/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json(); $bayaranpendahuluan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/BayaranPendahuluan/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
$rebetpromo = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/RebetPromoCalculation/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
//Tanggungan Semasa //Tanggungan Semasa
$panjar = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/CalculationPanjar/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json(); $panjar = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/CalculationPanjar/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
@@ -2472,6 +2470,8 @@ class KhazanahController extends Controller
$cajperkhidmatan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/cajperkhidmatanterkumpul/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json(); $cajperkhidmatan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/cajperkhidmatanterkumpul/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
$hapuskira = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/CalculationHapusKira/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json(); $hapuskira = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/CalculationHapusKira/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
$xtra = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/Xtra/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json(); $xtra = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/Xtra/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
$rebetpromo = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/RebetPromoCalculation/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
$pelarasanrebate = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/PelarasanRebate/' . $auth_user['cawangan'],['tarikh' => $tarikh_imbangan2])->json();
//TunaiDitangan Sementara Upah //TunaiDitangan Sementara Upah
@@ -2523,6 +2523,8 @@ class KhazanahController extends Controller
if($imbangduga['pindahkekpkb'] > 0) array_push($hartasemasa,['glcode' => '1000/090','descpt' => 'Pindah Ke KPKB(IP)', 'amaun' => $imbangduga['pindahkekpkb']]); if($imbangduga['pindahkekpkb'] > 0) array_push($hartasemasa,['glcode' => '1000/090','descpt' => 'Pindah Ke KPKB(IP)', 'amaun' => $imbangduga['pindahkekpkb']]);
if($peruntukanhapuskira > 0) array_push($hartasemasa,['glcode' => '1000/015','descpt' => 'Peruntukan Hapus Kira', 'amaun' => $peruntukanhapuskira]); if($peruntukanhapuskira > 0) array_push($hartasemasa,['glcode' => '1000/015','descpt' => 'Peruntukan Hapus Kira', 'amaun' => $peruntukanhapuskira]);
if($belian1stop > 0) array_push($hartasemasa,['glcode' => '8000/501','descpt' => 'Belian 1 Stop', 'amaun' => $belian1stop]); if($belian1stop > 0) array_push($hartasemasa,['glcode' => '8000/501','descpt' => 'Belian 1 Stop', 'amaun' => $belian1stop]);
if($rebetpromo > 0) array_push($hartasemasa,['glcode' => '5000/242','descpt' => 'Diskaun Promosi', 'amaun' => ($rebetpromo * -1)]);
$totalhartasemasa = 0; $totalhartasemasa = 0;
foreach($hartasemasa as $index => $hs) foreach($hartasemasa as $index => $hs)
@@ -2554,6 +2556,8 @@ class KhazanahController extends Controller
if($utgterkumpulxtra > 0) array_push($tanggungansemasa,['glcode' => '7000/201','descpt' => 'Untung/Rugi Terkumpul Xtra','amaun' => $utgterkumpulxtra]); if($utgterkumpulxtra > 0) array_push($tanggungansemasa,['glcode' => '7000/201','descpt' => 'Untung/Rugi Terkumpul Xtra','amaun' => $utgterkumpulxtra]);
if($jualan1stop > 0) array_push($tanggungansemasa,['glcode' => '9000/501','descpt' => 'Jualan 1 Stop','amaun' => $jualan1stop]); if($jualan1stop > 0) array_push($tanggungansemasa,['glcode' => '9000/501','descpt' => 'Jualan 1 Stop','amaun' => $jualan1stop]);
if($hapuskira > 0) array_push($tanggungansemasa,['glcode' => '3000/011','descpt' => 'Hapus Kira','amaun' => -$hapuskira]); if($hapuskira > 0) array_push($tanggungansemasa,['glcode' => '3000/011','descpt' => 'Hapus Kira','amaun' => -$hapuskira]);
if($rebetpromo > 0) array_push($tanggungansemasa,['glcode' => '5000/242','descpt' => 'Diskaun Promosi', 'amaun' => ($rebetpromo * -1)]);
if($pelarasanrebate > 0) array_push($tanggungansemasa,['glcode' => '5000/243','descpt' => 'Pelarasan Rebate', 'amaun' => ($pelarasanrebate * -1)]);
$totaltanggungansemasa = 0; $totaltanggungansemasa = 0;
foreach($tanggungansemasa as $index => $ts) foreach($tanggungansemasa as $index => $ts)
@@ -4420,274 +4424,4 @@ class KhazanahController extends Controller
} }
public function pampasanDetail($id)
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan'])
->json();
$gadai = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/gadai/norujukan/' . '011237' . '/' . $id)
->json();
$gadai_info = is_array($gadai) && isset($gadai[0]) ? $gadai[0] : $gadai;
$customer_info = null;
if(isset($gadai_info['nokp'])) {
$customer = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/customers/' . $gadai_info['nokp'])
->json();
$customer_info = null;
if (isset($gadai_info['nokp'])) {
$customer = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/customers/' . $gadai_info['nokp'])
->json();
$customer_info = is_array($customer) && isset($customer[0]) ? $customer[0] : $customer;
}
$barang_kes = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/palsu/laporan/', ['kodcaw' => $auth_user['cawangan']])
->json();
// You may need to adjust the array index if the API returns an array of results
$gadai_info = is_array($gadai) && isset($gadai[0]) ? $gadai[0] : $gadai;
// $pampasan_info = is_array($pampasan) && isset($pampasan[0]) ? $pampasan[0] : $pampasan;
$barang_kes_collection = collect($barang_kes);
$barang_kes_info = $barang_kes_collection->where('norujukan', '=', $id)->first();
$customer_info = null;
if (isset($gadai_info['nokp'])) {
$customer = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/customers/' . $gadai_info['nokp'])
->json();
$customer_info = is_array($customer) && isset($customer[0]) ? $customer[0] : $customer;
}
$denominasi = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/DenominasiController/' . $auth_user['cawangan'])->json();
if (sizeof($denominasi) == 0) {
$denominasi = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/DenominasiCreate/' . $auth_user['cawangan'])->json();
} else {
$denominasi = $denominasi[0];
}
$pampasan = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/pampasan', ['kodcaw' => '011237', 'norujukan' => $id])
->json()['data'][0];
$baucerno = $pampasan['baucerno'];
$nilaimarhun = $barang_kes_info['nilaimarhun'] ?? 0;
$pembiayaan = $barang_kes_info['pembiayaan'] ?? 0;
$untung = $barang_kes_info['untung'] ?? 0;
$jumlah_tebus = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/tebus/norujukan/' . $auth_user['cawangan'] . '/' . $id)
->json()[0]['bakipjm'];
$jumlah_pampasan = $nilaimarhun - $pembiayaan - $untung;
$jumlahPanjar = $jumlah_tebus + $jumlah_pampasan;
return view('khazanah.pampasan_detail', compact('gadai_info', 'barang_kes_info', 'cawangan_info', 'customer_info', 'baucerno', 'denominasi', 'jumlah_pampasan', 'jumlah_tebus', 'jumlahPanjar'));
}
}
public function initiatePampasan(Request $request)
{
$norujukan = $request->input('norujukan');
$teller = auth()->user()->name;
$kodcaw = auth()->user()->cawangan;
$baucerno = $this->generateBaucer($kodcaw);
$response = Http::post(config('api.url') . '/api/pampasan/initiatePampasan', [
'norujukan' => $norujukan,
'kodcaw' => $kodcaw,
'teller' => $teller,
'baucerno' => $baucerno,
]);
if ($response->failed()) {
throw new \Exception("HTTP error! status: " . $response->status(), 1);
}
$result = $response->json();
// $jumlah_pampasan = $nilaimarhun - $pembiayaan - $untung;
// $jumlahTebus = $pembiayaan + $untung;
// $jumlahPanjar = $jumlah_pampasan + $jumlahTebus;
//return view('khazanah.pampasan_detail', compact('gadai_info', 'pampasan_info', 'cawangan_info', 'customer_info','baucerno', 'denominasi','jumlah_pampasan', 'jumlahTebus', 'jumlahPanjar') );
return response()->json($result);
}
public function generateBaucer($kodcaw)
{
$data = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url').'/api/SenaraiPanjar/list/' . $kodcaw)
->json();
$today = now();
$dd = $today->format('d');
$mm = $today->format('m');
$yy = $today->format('y');
$recno = $data['recno'] ?? 0;
$baucerno = 'B' . $yy . $mm . $dd . '-' . str_pad($recno, 4, '0', STR_PAD_LEFT);
return $baucerno;
}
public function terimaPampasan(Request $request)
{
$responsePampasan = Http::withOptions(['verify' => config('app.api_verify')])
->post(config('api.url') . '/api/pampasan/terimaPampasan',[
"norujukan" => $request->norujukan,
"kodcaw" => auth()->user()->cawangan,
"jumlah_pampasan" => $request->jumlahpampasan,
"teller" => auth()->user()->name,
"denominasi" => $request->denominasi,
]
)->json();
$jumlahTebus = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/tebus/norujukan/' . auth()->user()->cawangan .'/'.$request->norujukan)->json()[0]['bakipjm'];
$bayaranPanjar = $request->jumlahpampasan + $jumlahTebus;
$responsePanjar = Http::withOptions(['verify' => config('app.api_verify')])
->post(
config('api.url') . '/api/panjar/createpanjar/' . auth()->user()->cawangan,
array_merge(
[
'tarikhbil' => now()->format('Y-m-d'),
'jenismodal' => 'belanjaam',
'deskripsi' => 'BAYARAN PAMPASAN ' . '(' . $request->norujukan . ')',
'bayaran' => $bayaranPanjar,
'kodlaluan' => auth()->user()->name,
'baucer' => $responsePampasan['data']['baucerno'],
'tuntutan' => auth()->user()->name
],
$request->denominasi
)
)->json();
if ($responsePampasan['success'] == true) {
return redirect()->route('pampasan.resit', ["pampasan" => $responsePampasan['data']]);
} else
return redirect()->route('khazanah.panjar')->with('pampasaninformation', ['status' => 'error', 'message' => 'Baki perubatan tidak mencukupi.']);
}
public function resitPampasan(Request $request)
{
$pampasan = $request->pampasan;
$kodcaw = $pampasan['kodcaw'];
$norujukan = $pampasan['norujukan'] ?? null;
if ($norujukan) {
$gadai_info = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/gadai/norujukan/' . $kodcaw . '/' . $norujukan)
->json();
$gadai_info = is_array($gadai_info) && isset($gadai_info[0]) ? $gadai_info[0] : $gadai_info;
$customer_info = null;
if (isset($gadai_info['nokp'])) {
$customer = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/customers/' . $gadai_info['nokp'])
->json();
$customer_info = is_array($customer) && isset($customer[0]) ? $customer[0] : $customer;
}
$pampasan_info = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/palsu/laporan/', ['kodcaw' => $kodcaw])
->json();
$norujukan = $norujukan;
$pampasan_info = collect($pampasan_info)->firstWhere('norujukan', $norujukan);
$nilaimarhun = $pampasan_info['nilaimarhun'] ?? 0;
$pembiayaan = $pampasan_info['pembiayaan'] ?? 0;
$untung = $pampasan_info['untung'] ?? 0;
$jumlah_pampasan = $nilaimarhun - $pembiayaan - $untung;
$status = Http::withOptions(['verify' => config('app.api_verify')])
->put(config('api.url') . '/api/pampasan/updateStatusPampasan', ['kodcaw' => $kodcaw, 'norujukan' => $norujukan])
->json();
// dd($pampasan_info, $nilaimarhun, $pembiayaan, $untung, $jumlah_pampasan);
// dd($norujukan);
return view('print.resit.resitpampasan', compact(
'pampasan',
'gadai_info',
'customer_info',
'pampasan_info',
'nilaimarhun',
'pembiayaan',
'untung',
'jumlah_pampasan',
'status'
));
}
}
public function suratPampasan(Request $request, $norujukan)
{
$auth_user = Auth::user();
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/cawangan/'.$auth_user['cawangan'])->json();
$gadai = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/gadai/norujukan/' . '011237' . '/' . $norujukan)
->json();
$gadai_info = is_array($gadai) && isset($gadai[0]) ? $gadai[0] : $gadai;
$customer_info = null;
if(isset($gadai_info['nokp'])) {
$customer = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/customers/' . $gadai_info['nokp'])
->json();
$customer_info = is_array($customer) && isset($customer[0]) ? $customer[0] : $customer;
}
$pampasan = Http::withOptions(['verify' => config('app.api_verify')])
->get(config('api.url') . '/api/palsu/laporan/' , ['kodcaw'=>'011237'])
->json();
$pampasan_collection = collect($pampasan);
$pampasan_info = $pampasan_collection->where('norujukan', '=', $norujukan)->first();
if (!$pampasan_info) {
abort(404, 'Maklumat pampasan tidak dijumpai untuk no rujukan tersebut.');
}
$nilaimarhun = $pampasan_info['nilaimarhun'] ?? 0;
$pembiayaan = $pampasan_info['pembiayaan'] ?? 0;
$untung = $pampasan_info['untung'] ?? 0;
$jumlah_pampasan = $nilaimarhun - $pembiayaan - $untung;
$jumlah = $pampasan_info['jumlah_pampasan'] ?? 0;
$jumlah_pampasan_terbilang = Helper::ringgitTerbilang($jumlah_pampasan);
return view('print.surat_pampasan', compact('cawangan_info', 'gadai', 'gadai_info', 'customer_info', 'pampasan', 'pampasan_info','jumlah_pampasan_terbilang', 'jumlah_pampasan'));
}
} }
+8 -21
View File
@@ -99,15 +99,6 @@ class LelongController extends Controller
public function transaksituntutbaki(Request $request){ public function transaksituntutbaki(Request $request){
$auth_user = Auth::user(); $auth_user = Auth::user();
$aliranTunaiController = new AliranTunaiController();
$checkCashBox = $aliranTunaiController->periksaAliranTunai($request);
if($checkCashBox->getContent() !== 'sama')
{
return response('kemaskini', 200);
}
$lelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/TuntutBaki/resit/' . $auth_user['cawangan'] . '/' . $request->norujukan)->json(); $lelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/TuntutBaki/resit/' . $auth_user['cawangan'] . '/' . $request->norujukan)->json();
if($lelong) if($lelong)
@@ -115,18 +106,6 @@ class LelongController extends Controller
return response('Berjaya'); return response('Berjaya');
} }
$getTunai2=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/GetCurrentTunai/'.$auth_user['cawangan'],['kodlaluan' => $request->teller])->json();
$keluar = $getTunai2['keluar'];
$baki = $getTunai2['baki'];
$masuk = $getTunai2['masuk'];
$bakiakhir = $baki;
if(($bakiakhir < $request->jumlah) && $request->jenis == 'T'){
return response('Baki tidak mencukupi', 200);
}
$tuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/Tuntutbakisimpan/' . $auth_user['cawangan'], [ $tuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/Tuntutbakisimpan/' . $auth_user['cawangan'], [
'batchno' => $request->batchno, 'batchno' => $request->batchno,
'jenis' => $request->jenis, 'jenis' => $request->jenis,
@@ -143,6 +122,14 @@ class LelongController extends Controller
$updatetuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->put( config('api.url').'/api/tuntutbakiupdate/' . $auth_user['cawangan'] . '/' . $request->norujukan); $updatetuntutbaki = Http::withOptions(['verify' => config('app.api_verify')])->put( config('api.url').'/api/tuntutbakiupdate/' . $auth_user['cawangan'] . '/' . $request->norujukan);
$getTunai2=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/GetCurrentTunai/'.$auth_user['cawangan'],['kodlaluan' => $request->teller])->json();
$keluar = $getTunai2['keluar'];
$baki = $getTunai2['baki'];
$masuk = $getTunai2['masuk'];
$bakiakhir = $baki;
if($request->jenis == 'T') if($request->jenis == 'T')
{ {
$bakiakhir -= $request->jumlah; $bakiakhir -= $request->jumlah;
+5 -156
View File
@@ -87,19 +87,13 @@ class OperasiController extends Controller
'siri' => $request->siri 'siri' => $request->siri
])->json(); ])->json();
$updateData = [ $updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusan/' . $request->kodcaw . '/' . $norujukan, [
'sahkan' => 1, 'sahkan' => 1,
'namaoperasi' => $request->namaoperasi, 'namaoperasi' => $request->namaoperasi,
'siri' => $request->siri 'siri' => $request->siri
]; ])->json();
} else {
if ($request->has('actions')) { $updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateHapusAnsuran', [
$updateData['actions'] = $request->actions;
}
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusan/' . $request->kodcaw . '/' . $norujukan, $updateData)->json();
}else{
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateHapusAnsuran',[
'siri' => $request->siri, 'siri' => $request->siri,
"kodcaw" => $request->kodcaw, "kodcaw" => $request->kodcaw,
"norujukan" => $request->norujukan, "norujukan" => $request->norujukan,
@@ -145,49 +139,6 @@ class OperasiController extends Controller
return response()->json($updatelulus, 200); return response()->json($updatelulus, 200);
} }
public function createKelulusanByKhazanah(Request $request)
{
$auth_user = Auth::user();
$api_url = config('api.url');
$current = Carbon::now();
$current = new Carbon();
$norujukan = $request->norujukan;
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
$getsiri = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/ListLatestLulus/'. $auth_user['cawangan'] . '/' . $norujukan)->json();
if(isset($getsiri['siri']))
{
$siri = $getsiri['siri'] + 1;
}else{
$siri = 1;
}
$createlulus = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/CreateKelulusan/' . $auth_user['cawangan'] . '/' . $norujukan . '/roles/khazanah', [
'komen' => $request->komen,
'dategadai' => $current->toDateString(),
'bilgadai' => 1,
'siri' => $siri,
'margin' => $request->margin,
'berat' => $request->berat,
'nilaimarhun' => $request->nilaimarhun,
'status' => $request->status,
'jumpinjam' => $request->jumpinjam,
'jenistebus' => "G",
'teller' => $request->teller,
'peloperasi' => "operasi",
'pelulus' => "operasi",
'actions' => "Mohon Pengesahan Pembayaran Pampasan"
])->json();
event(new OperasiNotice($auth_user['cawangan'],$auth_user['name']));
return response()->json($siri,201);
}
public function updatekelulusananggota(Request $request) public function updatekelulusananggota(Request $request)
{ {
$auth_user = Auth::user(); $auth_user = Auth::user();
@@ -198,7 +149,7 @@ class OperasiController extends Controller
$kodcaw = $request->kodcaw; $kodcaw = $request->kodcaw;
$komen = $request->komenkelulusan; $komen = $request->komenkelulusan;
$namaoperasi = $request->namaoperasi; $namaoperasi = $request->namaoperasi;
$taglulus = $request->taglulus; // contoh: 'Y' = lulus, 'N' = batalmarginmutu() $taglulus = $request->taglulus; // contoh: 'Y' = lulus, 'N' = batal
// 1️⃣ Tentukan status kelulusan // 1️⃣ Tentukan status kelulusan
$status = ($taglulus == 'Y') ? 1 : 2; // 1 = Lulus, 2 = Batal/Tolak $status = ($taglulus == 'Y') ? 1 : 2; // 1 = Lulus, 2 = Batal/Tolak
@@ -370,9 +321,6 @@ class OperasiController extends Controller
public function mintakatalaluansemula(Request $request) public function mintakatalaluansemula(Request $request)
{ {
if (app()->environment('local')) {
return "True";
}
if (Hash::check($request->passsemula, Auth::user()->password)) { if (Hash::check($request->passsemula, Auth::user()->password)) {
return "True"; return "True";
@@ -453,103 +401,4 @@ class OperasiController extends Controller
return view('operasi.kelulusan_anggota', compact('cawangan_info', 'api_url', 'arraykelulusan')); return view('operasi.kelulusan_anggota', compact('cawangan_info', 'api_url', 'arraykelulusan'));
} }
public function marginmutu()
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
// Get MaxMutuEmas data from API
$maxmutuemas = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/maxmutuemas')->json();
return view('operasi.marginmutu', compact('cawangan_info', 'api_url', 'maxmutuemas'));
}
public function editMarginMutu()
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
return view('operasi.edit_marginmutu', compact('cawangan_info', 'api_url'));
}
public function laporanAudit()
{
$auth_user = Auth::user();
$api_url = config('api.url');
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
return view('homepage.operasi.laporan-audit', compact('cawangan_info', 'api_url'));
}
public function cetakLaporanAuditTrail(Request $request)
{
$api_url = config('api.url');
$auth_user = Auth::user();
$current = Carbon::now();
$current = new Carbon();
$tarikh_cetak = $current->toDateString();
if($request->dateaudit == null){
$date = $current->toDateString();
}else{
$split_date = explode('-', $request->dateaudit);
$date = $split_date[0] . '-' . $split_date[1] . '-' . $split_date[2];
}
if($request->dateaudit_till == null){
$date_till = $current->toDateString();
}else{
$split_date_till = explode('-', $request->dateaudit_till);
$date_till = $split_date_till[0] . '-' . $split_date_till[1] . '-' . $split_date_till[2];
}
$audittrail_raw = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url'). '/api/reports/audittrail/operasi',['date' => $date,'date_till' => $date_till])->json();
if(!$audittrail_raw){
return redirect()->back()->with('errormessage', 'Tiada data pada tarikh tersebut.');
}
// Transform the data to match view format
$audittrail = [];
foreach($audittrail_raw as $item) {
$created_at = \Carbon\Carbon::parse($item['created_at']);
// Format differences for display
$differences_text = '-';
if (isset($item['differences']) && !empty($item['differences'])) {
$diff_parts = [];
foreach ($item['differences'] as $field => $changes) {
$old = $changes['old'] ?? 'null';
$new = $changes['new'] ?? 'null';
$diff_parts[] = "{$field}: {$old}{$new}";
}
$differences_text = implode('; ', $diff_parts);
}
$audittrail[] = [
'tarikh' => $created_at->format('d/m/Y'),
'masa' => $created_at->format('H:i:s'),
'users' => $item['users'],
'actions' => $item['actions'],
'differ' => $differences_text
];
}
$cawangan_detail = [
'kodcaw' => 'operasi',
'namacaw' => 'Operasi Ar-Rahn',
'alamat1' => 'Lot 107, Jalan Parit Dalam,',
'alamat2' => 'Seksyen 8',
'poskod' => '15000',
'bandar' => 'Kota Bahru',
'negeri' => 'Kelantan',
'notel' => '03-12345678',
'nofaks' => '03-12345678',
];
return view('print.laporan_audittrail_operasi', compact('audittrail','cawangan_detail','tarikh_cetak','date','date_till','api_url'));
}
} }
@@ -1,842 +0,0 @@
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
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);
}
$payload = $res->json();
$batchNo = is_array($payload) ? ($payload['batch']['batch_no'] ?? '') : '';
$appended = is_array($payload) && !empty($payload['appended']);
$message = $appended
? ('Rekod ditambah ke batch' . ($batchNo ? ' ' . $batchNo : '') . '.')
: ('Batch dihantar ke Operasi' . ($batchNo ? ': ' . $batchNo : '.'));
return redirect()->route('pembiayaan.online.pc')->with('message', $message);
}
/**
* 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,
]);
}
/**
* Operasi: printable batch kelulusan form.
*/
public function operasiPrintBatch($kodcaw, $batchId)
{
$api_url = config('api.url');
$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.');
}
$batch = $detail['batch'];
$lines = $detail['lines'] ?? [];
if (!is_array($lines)) {
$lines = [];
}
$cawanganResp = $this->api()
->get($api_url . '/api/cawangan/detail/' . $kodcaw)
->json();
$cawangan_detail = (is_array($cawanganResp) && isset($cawanganResp[0]))
? $cawanganResp[0]
: (is_array($cawanganResp) ? $cawanganResp : []);
$cawangan = $cawangan_detail['namacaw']
?? $cawangan_detail['details_caw']
?? $cawangan_detail['nama']
?? $kodcaw;
$alamat1 = $cawangan_detail['alamat1'] ?? '';
$alamat2 = $cawangan_detail['alamat2'] ?? '';
$notel = $cawangan_detail['notel'] ?? '';
$batchNo = $batch['batch_no'] ?? '-';
$slot = $batch['slot'] ?? '-';
$status = $batch['status'] ?? '-';
$dihantarOleh = $batch['pc_submitted_by'] ?? '-';
$jumlah = (float) ($batch['jumlah_keseluruhan'] ?? 0);
if ($jumlah <= 0 && count($lines) > 0) {
$jumlah = (float) collect($lines)->sum(function ($line) {
return (float) ($line['pinjaman'] ?? 0);
});
}
$opsBy = Auth::user()['name'] ?? '';
foreach ($lines as $line) {
if (!empty($line['ops_by'])) {
$opsBy = $line['ops_by'];
break;
}
}
$tarikh = $this->formatPrintDate($batch['tarikh'] ?? null);
$dihantarPada = $this->formatPrintDate($batch['submitted_at'] ?? null, true);
return view('print.borang_batch_pembiayaan_online', compact(
'cawangan',
'kodcaw',
'alamat1',
'alamat2',
'notel',
'tarikh',
'batchNo',
'slot',
'status',
'dihantarOleh',
'dihantarPada',
'opsBy',
'lines',
'jumlah'
));
}
protected function formatPrintDate($value, $withTime = false)
{
if ($value === null || $value === '' || $value === '-') {
return '-';
}
try {
return Carbon::parse($value)->format($withTime ? 'd/m/Y H:i' : 'd/m/Y');
} catch (\Exception $e) {
return (string) $value;
}
}
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.');
}
}
+246 -196
View File
@@ -46,10 +46,7 @@ class PenebusanController extends Controller
$nilaihargasemasa = $this->tukaranhargaemas($norujukan); $nilaihargasemasa = $this->tukaranhargaemas($norujukan);
$pertambahpinjaman = 0.80; $pertambahpinjaman = 0.80;
return view('penebusan.' . $cawangan_info['version'] . '.index',compact('cawangan_info','api_url','gadai','marhun','nama','nilaihargasemasa','pertambahpinjaman'));
$pampasan = $this->getPampasanByNorujukan($norujukan);
return view('penebusan.' . $cawangan_info['version'] . '.index',compact('cawangan_info','api_url','gadai','marhun','nama','nilaihargasemasa','pertambahpinjaman', 'pampasan'));
} }
public function tebuspenuh(Request $request) public function tebuspenuh(Request $request)
@@ -281,167 +278,6 @@ class PenebusanController extends Controller
$auth_user = Auth::user(); $auth_user = Auth::user();
////////////////////////
/// UPDATE TEBUS API////
///////////////////////
$updatetebus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/updatetebus/'. $auth_user['cawangan'] .'/' . $request->norujukan,[
'nopelanggan' => $request->nopelanggan,
'jenistebus' => $request->jenistebus,
'jbg' => $request->jbg,
'kadarupah' => $request->kadarupah,
'nilai_marhun' => $request->nilai_marhun,
'pinjaman' => $request->pinjaman_lama,
'ansuran' => $request->ansuran,
'nowakil' => $request->nowakil,
'addpinjaman'=> $request->addpinjaman,
'bakipinjaman' => $request->bakipinjaman,
'bakiupah' => $request->bakiupah,
'historygadaian' => $request->historygadaian,
'marhun' => $request->marhun,
'jenisbayarantebus' => $request->jenisbayarantebus,
'jeniskeuntungan' => $request->jeniskeuntungan,
'teller' => $request->teller,
"duitpelanggan" => $request->bayaran,
"bakipelanggan" => $request->bakipelanggan,
])->json();
if($updatetebus == 'duplicate'){
return response()->json('duplicate');
}
//////////////////////
/// MAKING NEW SAG////
/////////////////////
$gadai_transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/'. $auth_user['cawangan'] . '/' . $current->toDateString())->json();
if($gadai_transaction){
$new_sirig = $gadai_transaction['sirig'] + 1;
}else{
$new_sirig = 1;
}
$new_transaction = sprintf("%04d",$new_sirig);
$norujukanbaru = strtoupper($auth_user['cawangan']) . $curent_year . $curent_month . $current_day . '-' .$new_transaction;
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/gadai/'.$auth_user['cawangan'],[
'norujukan' => $norujukanbaru,
'nopelanggan' => $request->nopelanggan,
'nokp' => $request->noic,
'sirig' => $new_sirig
]);
///////////////////////////
/// MARHUN UPDATE TABLE////
//////////////////////////
$arraymarhunbaru = [];
$marhunsediada = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/marhun/'. $request->norujukan)->json();
$marhunyangdiambil = $marhunsediada[0];
foreach($marhunyangdiambil as $index=>$marhunloop)
{
$karatbaru = str_replace('.','-',$marhunloop['karat']);
$hargabaru = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/harga_emas/'. $karatbaru)->json();
$nilaimarhun = (floatval($hargabaru['harga']) * floatval($marhunloop['berat']));
array_push($arraymarhunbaru, ["bil" => $marhunloop['bil'],"tag_permata" => $marhunloop['tag_permata'],"berat_batu_permata" => $marhunloop['berat_batu_permata'],"marhun" => $marhunloop['marhun'],"nota" => $marhunloop['nota'],"karat" => $marhunloop['karat'], "berat" => $marhunloop['berat'], "harga" => $hargabaru['harga'], "n_marhun" => $nilaimarhun]);
}
foreach($arraymarhunbaru as $array1){
$updatemarhun = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/marhun/'. $auth_user['cawangan'],[
'norujukan' => $norujukanbaru,
'marhun' => $array1['marhun'],
'nota' => $array1['nota'],
'karat' => $array1['karat'],
'berat_emas' => $array1['berat'],
'harga' => $array1['harga'],
'tag_permata' => $array1['tag_permata'],
'berat_batu_permata' => $array1['berat_batu_permata'],
'kuantiti' => $array1['bil']
])->json();
}
//////////////////////
////Update SAG BARU///
/////////////////////
$total_nilai_marhun = $request->nilai_marhun;
$margin_pinjaman = $request->pinjaman / $total_nilai_marhun;
$kadarupah = $request->kadarkeuntungan * 100;
$onepercent = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/onepercent',[
'pembiayaan' => $request->pinjaman,
'nilaimarhun' => $total_nilai_marhun,
'kadarujrah' => $request->kadarkeuntungan,
'margin' => ($margin_pinjaman*100),
'kodcaw' => Auth::user()->cawangan
])->json();
$keuntungan_sebln = $onepercent['keuntungan'];
$keuntungan_sebln = str_replace(',','',$keuntungan_sebln);
$keuntungan6bulan = $keuntungan_sebln * 6;
$keuntungan12bulan = $keuntungan_sebln * 12;
$hargajualan = $request->pinjaman + $keuntungan12bulan;
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/gadai/norujukan/'. $auth_user['cawangan'] .'/' . $norujukanbaru,[
'kodcaw' => $auth_user['cawangan'],
'nilaimarhun' => round($total_nilai_marhun, 2),
'berat' => round($request->total_berat, 2),
'pinjaman' => round($request->pinjaman, 2),
'kadarupah' => round($kadarupah, 2),
'marhun' => $request->marhun,
'percentpinj' => $margin_pinjaman,
'teller'=> $auth_user['name'],
'upah6' => $keuntungan6bulan,
'upah12' => $keuntungan12bulan,
'hargajualan' => $hargajualan,
'kuantiti_marhun' => $request->kuantiti_marhun
])->json();
$komuditi = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/komuditi/transaksi',[
'unit_komuditi' => round($request->pinjaman, 2),
'norujukan' => $norujukanbaru,
'kodcaw' => $auth_user['cawangan'],
'teller' => $auth_user['name']
]);
////////////////////////////
////Update History Gadaian///
////////////////////////////
$updatehistorygadaian = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/gadai/updatehistory/'. $auth_user['cawangan'] .'/' . $norujukanbaru,[
'historygadaian' => $request->norujukan,
'jenistebus' => $request->jenistebus,
])->json();
event(new TebusNotify('lulus',Auth::user()->cawangan));
event(new GadaiNotify('lulus',Auth::user()->cawangan));
$this->AliranTunaiController->alirantunaiTebus($request);
}
public function tambahpinjaman_latest(Request $request)
{
$api_url = config('api.url');
$current = Carbon::now();
$current = new Carbon();
$curent_year = substr($current->year,2,2);
$curent_month = sprintf("%02d", $current->month);
$current_day = sprintf("%02d", $current->day);
$auth_user = Auth::user();
//////////////////////// ////////////////////////
/// UPDATE TEBUS API//// /// UPDATE TEBUS API////
/////////////////////// ///////////////////////
@@ -512,16 +348,252 @@ class PenebusanController extends Controller
'totalbayaran' => $request->totalbayaran, 'totalbayaran' => $request->totalbayaran,
"duitpelanggan" => $request->bayaran, "duitpelanggan" => $request->bayaran,
"bakipelanggan" => $request->bakipelanggan, "bakipelanggan" => $request->bakipelanggan,
"noic" => $request->noic,
"jenisAT" => $request->jenisAT,
])->json(); ])->json();
if($updatetebus['result'] == 'success'){
$alirantunai = new AliranTunaiController(); if($updatetebus == 'duplicate'){
event(new TebusNotify('lulus',Auth::user()->cawangan)); return response()->json('duplicate');
event(new GadaiNotify('lulus',Auth::user()->cawangan));
$alirantunai->alirantunaiTebusAutoTawarruq($request);
} }
return response()->json($updatetebus['result'],200);
//////////////////////
/// MAKING NEW SAG////
/////////////////////
$gadai_transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/'. $auth_user['cawangan'] . '/' . $current->toDateString())->json();
if($gadai_transaction){
$new_sirig = $gadai_transaction['sirig'] + 1;
}else{
$new_sirig = 1;
}
$new_transaction = sprintf("%04d",$new_sirig);
$norujukanbaru = strtoupper($auth_user['cawangan']) . $curent_year . $curent_month . $current_day . '-' .$new_transaction;
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/gadai/'.$auth_user['cawangan'],[
'norujukan' => $norujukanbaru,
'nopelanggan' => $request->nopelanggan,
'nokp' => $request->noic,
'sirig' => $new_sirig
]);
///////////////////////////
/// MARHUN UPDATE TABLE////
//////////////////////////
$arraymarhunbaru = [];
$marhunsediada = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/marhun/'. $request->norujukan)->json();
$marhunyangdiambil = $marhunsediada[0];
foreach($marhunyangdiambil as $index=>$marhunloop)
{
$karatbaru = str_replace('.','-',$marhunloop['karat']);
$hargabaru = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/harga_emas/'. $karatbaru)->json();
$harga = ($request->jenisAT == 'hargalama') ? $marhunloop['harga'] : $hargabaru['harga'];
$nilaimarhun = (floatval($harga) * floatval($marhunloop['berat']));
array_push($arraymarhunbaru, ["bil" => $marhunloop['bil'],"tag_permata" => $marhunloop['tag_permata'],"berat_batu_permata" => $marhunloop['berat_batu_permata'],"marhun" => $marhunloop['marhun'],"nota" => $marhunloop['nota'],"karat" => $marhunloop['karat'], "berat" => $marhunloop['berat'], "harga" => $harga, "n_marhun" => $nilaimarhun]);
}
foreach($arraymarhunbaru as $array1){
$updatemarhun = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/marhun/'. $auth_user['cawangan'],[
'norujukan' => $norujukanbaru,
'marhun' => $array1['marhun'],
'nota' => $array1['nota'],
'karat' => $array1['karat'],
'berat_emas' => $array1['berat'],
'harga' => $array1['harga'],
'nilai_marhun' => $array1['n_marhun'],
'tag_permata' => $array1['tag_permata'],
'berat_batu_permata' => $array1['berat_batu_permata'],
'jenisAT' => $request->jenisAT,
'kuantiti' => $array1['bil']
])->json();
}
//////////////////////
////Update SAG BARU///
/////////////////////
$total_nilai_marhun = $request->total_nilai_marhun;
$margin_pinjaman = ($request->pinjaman / $total_nilai_marhun);
$onepercent = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/onepercent',[
'pembiayaan' => $request->pinjaman,
'nilaimarhun' => $total_nilai_marhun,
'kadarujrah' => $request->kadarkeuntungan,
'margin' => ($margin_pinjaman*100),
'kodcaw' => Auth::user()->cawangan
])->json();
$keuntungan_sebln = $onepercent['keuntungan'];
$keuntungan_sebln = str_replace(',','',$keuntungan_sebln);
$kadarupah = $request->kadarkeuntungan * 100;
$keuntungan6bulan = $keuntungan_sebln * 6;
$keuntungan12bulan = $keuntungan_sebln * 12;
$hargajualan = $request->pinjaman + $keuntungan12bulan;
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/gadai/norujukan/'. $auth_user['cawangan'] .'/' . $norujukanbaru,[
'kodcaw' => $auth_user['cawangan'],
'nilaimarhun' => round($total_nilai_marhun, 2),
'berat' => round($request->total_berat, 2),
'pinjaman' => round($request->pinjaman, 2),
'kadarupah' => round($kadarupah, 2),
'marhun' => $request->marhun_detail,
'percentpinj' => $margin_pinjaman,
'teller'=> $auth_user['name'],
'upah6' => $keuntungan6bulan,
'upah12' => $keuntungan12bulan,
'hargajualan' => $hargajualan,
'kuantiti_marhun' => $request->kuantiti_marhun,
]);
$komuditi = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/komuditi/transaksi',[
'unit_komuditi' => round($request->pinjaman, 2),
'norujukan' => $norujukanbaru,
'kodcaw' => $auth_user['cawangan'],
'teller' => $auth_user['name']
]);
////////////////////////////
////Update History Gadaian///
////////////////////////////
$updatehistorygadaian = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/gadai/updatehistory/'. $auth_user['cawangan'] .'/' . $norujukanbaru,[
'historygadaian' => $request->norujukan,
'jenistebus' => $request->jenistebus,
])->json();
if($updatetebus == 'duplicate'){
return response()->json('duplicate');
}
//////////////////////
/// MAKING NEW SAG////
/////////////////////
$gadai_transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/'. $auth_user['cawangan'] . '/' . $current->toDateString())->json();
if($gadai_transaction){
$new_sirig = $gadai_transaction['sirig'] + 1;
}else{
$new_sirig = 1;
}
$new_transaction = sprintf("%04d",$new_sirig);
$norujukanbaru = strtoupper($auth_user['cawangan']) . $curent_year . $curent_month . $current_day . '-' .$new_transaction;
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/gadai/'.$auth_user['cawangan'],[
'norujukan' => $norujukanbaru,
'nopelanggan' => $request->nopelanggan,
'nokp' => $request->noic,
'sirig' => $new_sirig
]);
///////////////////////////
/// MARHUN UPDATE TABLE////
//////////////////////////
$arraymarhunbaru = [];
$marhunsediada = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/marhun/'. $request->norujukan)->json();
$marhunyangdiambil = $marhunsediada[0];
foreach($marhunyangdiambil as $index=>$marhunloop)
{
$karatbaru = str_replace('.','-',$marhunloop['karat']);
$hargabaru = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/harga_emas/'. $karatbaru)->json();
$harga = ($request->jenisAT == 'hargalama') ? $marhunloop['harga'] : $hargabaru['harga'];
$nilaimarhun = (floatval($harga) * floatval($marhunloop['berat']));
array_push($arraymarhunbaru, ["bil" => $marhunloop['bil'],"tag_permata" => $marhunloop['tag_permata'],"berat_batu_permata" => $marhunloop['berat_batu_permata'],"marhun" => $marhunloop['marhun'],"nota" => $marhunloop['nota'],"karat" => $marhunloop['karat'], "berat" => $marhunloop['berat'], "harga" => $harga, "n_marhun" => $nilaimarhun]);
}
foreach($arraymarhunbaru as $array1){
$updatemarhun = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/marhun/'. $auth_user['cawangan'],[
'norujukan' => $norujukanbaru,
'marhun' => $array1['marhun'],
'nota' => $array1['nota'],
'karat' => $array1['karat'],
'berat_emas' => $array1['berat'],
'harga' => $array1['harga'],
'nilai_marhun' => $array1['n_marhun'],
'tag_permata' => $array1['tag_permata'],
'berat_batu_permata' => $array1['berat_batu_permata'],
'jenisAT' => $request->jenisAT,
'kuantiti' => $array1['bil']
])->json();
}
//////////////////////
////Update SAG BARU///
/////////////////////
$total_nilai_marhun = $request->total_nilai_marhun;
$margin_pinjaman = ($request->pinjaman / $total_nilai_marhun);
$onepercent = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/onepercent',[
'pembiayaan' => $request->pinjaman,
'nilaimarhun' => $total_nilai_marhun,
'kadarujrah' => $request->kadarkeuntungan,
'margin' => ($margin_pinjaman*100),
'kodcaw' => Auth::user()->cawangan
])->json();
$keuntungan_sebln = $onepercent['keuntungan'];
$keuntungan_sebln = str_replace(',','',$keuntungan_sebln);
$kadarupah = $request->kadarkeuntungan * 100;
$keuntungan6bulan = $keuntungan_sebln * 6;
$keuntungan12bulan = $keuntungan_sebln * 12;
$hargajualan = $request->pinjaman + $keuntungan12bulan;
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/gadai/norujukan/'. $auth_user['cawangan'] .'/' . $norujukanbaru,[
'kodcaw' => $auth_user['cawangan'],
'nilaimarhun' => round($total_nilai_marhun, 2),
'berat' => round($request->total_berat, 2),
'pinjaman' => round($request->pinjaman, 2),
'kadarupah' => round($kadarupah, 2),
'marhun' => $request->marhun_detail,
'percentpinj' => $margin_pinjaman,
'teller'=> $auth_user['name'],
'upah6' => $keuntungan6bulan,
'upah12' => $keuntungan12bulan,
'hargajualan' => $hargajualan,
'kuantiti_marhun' => $request->kuantiti_marhun,
]);
$komuditi = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/komuditi/transaksi',[
'unit_komuditi' => round($request->pinjaman, 2),
'norujukan' => $norujukanbaru,
'kodcaw' => $auth_user['cawangan'],
'teller' => $auth_user['name']
]);
////////////////////////////
////Update History Gadaian///
////////////////////////////
$updatehistorygadaian = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url').'/api/gadai/updatehistory/'. $auth_user['cawangan'] .'/' . $norujukanbaru,[
'historygadaian' => $request->norujukan,
'jenistebus' => $request->jenistebus,
])->json();
$alirantunai = new AliranTunaiController();
event(new TebusNotify('lulus',Auth::user()->cawangan));
event(new GadaiNotify('lulus',Auth::user()->cawangan));
$alirantunai->alirantunaiTebusAutoTawarruq($request);
return response()->json($updatemarhun,200);
} }
public function tebusseparuh(Request $request) public function tebusseparuh(Request $request)
@@ -621,7 +693,7 @@ class PenebusanController extends Controller
'tag_permata' => $array1['tag_permata'], 'tag_permata' => $array1['tag_permata'],
'berat_batu_permata' => $array1['berat_batu_permata'], 'berat_batu_permata' => $array1['berat_batu_permata'],
'nilai_marhun' => $array1['n_marhun'], 'nilai_marhun' => $array1['n_marhun'],
'kuantiti' => $array1['bil'] 'kuantiti' => $array1['bil']
])->json(); ])->json();
} }
@@ -789,26 +861,4 @@ class PenebusanController extends Controller
return view($view, compact('cawangan_info','api_url','gadai','marhun','nama','nilaihargasemasa')); return view($view, compact('cawangan_info','api_url','gadai','marhun','nama','nilaihargasemasa'));
} }
public function getPampasanByNorujukan($norujukan)
{
$auth_user = Auth::user();
$pampasanListResponse = Http::get(config('api.url'). '/api/palsu/laporan', [
'kodcaw' => $auth_user['cawangan'],
'status' => 'all',
]);
if($pampasanListResponse->failed()){
throw new \Exception("Something wrong with API", 1);
}
$pampasanList = array_filter($pampasanListResponse->json(), function($pampasan) use($norujukan){
return $pampasan['norujukan'] == $norujukan;
});
$pampasan = sizeof($pampasanList) == 0 ? null : array_pop($pampasanList);
return $pampasan;
}
} }
-1
View File
@@ -72,6 +72,5 @@ class Kernel extends HttpKernel
'admin' => 'App\Http\Middleware\Admin', 'admin' => 'App\Http\Middleware\Admin',
'audit' => 'App\Http\Middleware\Audit', 'audit' => 'App\Http\Middleware\Audit',
'masteradmin' => 'App\Http\Middleware\Masteradmin', 'masteradmin' => 'App\Http\Middleware\Masteradmin',
'role' => 'App\Http\Middleware\RoleAccess',
]; ];
} }
-71
View File
@@ -1,71 +0,0 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;
use Closure;
class RoleAccess
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string ...$roles
* @return mixed
*/
public function handle($request, Closure $next, ...$roles)
{
if (!Auth::check()) {
return redirect('/login');
}
$user = Auth::user();
$userRole = $user->roles;
$userRoleHarian = $user->role_harian ?? null;
// Check each allowed role
foreach ($roles as $role) {
switch ($role) {
case 'teller':
if ($userRoleHarian == 'teller' || $userRole == 'teller') {
return $next($request);
}
break;
case 'khazanah':
if ($userRole == 'pc' || $userRole == 'ppc') {
return $next($request);
}
break;
case 'admin':
if ($userRole == 'admin') {
return $next($request);
}
break;
case 'penilai':
if ($userRole == 'penilai') {
return $next($request);
}
break;
case 'operasi':
if ($userRole == 'operasi') {
return $next($request);
}
break;
case 'audit':
if ($userRole == 'audit') {
return $next($request);
}
break;
}
}
// If no roles matched, deny access
abort(403, 'Access denied. Required roles: ' . implode(', ', $roles));
}
}
+1 -1
View File
@@ -12,7 +12,7 @@ class TrustProxies extends Middleware
* *
* @var array|string|null * @var array|string|null
*/ */
protected $proxies = '*'; protected $proxies;
/** /**
* The headers that should be used to detect proxies. * The headers that should be used to detect proxies.
+1 -3
View File
@@ -23,8 +23,6 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function boot() public function boot()
{ {
if (strpos((string) config('app.url'), 'https://') === 0) { //
\Illuminate\Support\Facades\URL::forceScheme('https');
}
} }
} }
+1 -3
View File
@@ -25,8 +25,6 @@ class AuthServiceProvider extends ServiceProvider
{ {
$this->registerPolicies(); $this->registerPolicies();
Gate::define('impersonate', function ($user) { //
return $user->canImpersonate();
});
} }
} }
-12
View File
@@ -6,11 +6,9 @@ use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Lab404\Impersonate\Models\Impersonate;
class User extends Authenticatable class User extends Authenticatable
{ {
use Impersonate;
use Notifiable; use Notifiable;
protected $guard = 'web'; protected $guard = 'web';
@@ -45,14 +43,4 @@ class User extends Authenticatable
{ {
return $this->hasOne(Cawangan::class, 'kodcaw', 'cawangan'); 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
@@ -1,15 +0,0 @@
<?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,7 +14,6 @@
"fruitcake/laravel-cors": "^2.0", "fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^6.3", "guzzlehttp/guzzle": "^6.3",
"jeroennoten/laravel-adminlte": "^3.5", "jeroennoten/laravel-adminlte": "^3.5",
"lab404/laravel-impersonate": "^1.7",
"laravel/framework": "^7.24", "laravel/framework": "^7.24",
"laravel/tinker": "^2.0", "laravel/tinker": "^2.0",
"laravel/ui": "^2.4", "laravel/ui": "^2.4",
@@ -52,9 +51,6 @@
"classmap": [ "classmap": [
"database/seeds", "database/seeds",
"database/factories" "database/factories"
],
"files": [
"app/helpers.php"
] ]
}, },
"autoload-dev": { "autoload-dev": {
Generated
+4 -71
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "fa66321247398a94dc8b7f8099bb184e", "content-hash": "bfd66ab0246126c4f2cc7bbeeacca4ec",
"packages": [ "packages": [
{ {
"name": "almasaeed2010/adminlte", "name": "almasaeed2010/adminlte",
@@ -1293,73 +1293,6 @@
}, },
"time": "2022-05-18T14:12:47+00:00" "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", "name": "laravel/framework",
"version": "v7.30.6", "version": "v7.30.6",
@@ -9080,12 +9013,12 @@
], ],
"aliases": [], "aliases": [],
"minimum-stability": "dev", "minimum-stability": "dev",
"stability-flags": {}, "stability-flags": [],
"prefer-stable": true, "prefer-stable": true,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
"php": "^7.2.5" "php": "^7.2.5"
}, },
"platform-dev": {}, "platform-dev": [],
"plugin-api-version": "2.9.0" "plugin-api-version": "2.3.0"
} }
-2
View File
@@ -15,8 +15,6 @@ return [
'name' => env('APP_NAME', 'Laravel'), 'name' => env('APP_NAME', 'Laravel'),
'version' => env('APP_VERSION', ''),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Environment | Application Environment
+2 -2
View File
@@ -1,7 +1,7 @@
<?php <?php
$default_port = '17321'; $default_port = '8085';
$getReaderEndpoint = fn($x) => 'http://localhost:' . $x . '/read'; $getReaderEndpoint = fn($x) => 'http://localhost:' . $x . '/?MYKADJSON';
return[ return[
'endpoint' => env('MYKAD_READER_ENDPOINT', $getReaderEndpoint(env('MYKAD_READER_PORT', $default_port))), 'endpoint' => env('MYKAD_READER_ENDPOINT', $getReaderEndpoint(env('MYKAD_READER_PORT', $default_port))),
-62
View File
@@ -1,62 +0,0 @@
name: kaunter_staging
services:
app:
image: ${APP_IMAGE:-git.koppkb.com/kopkb/kaunter}:${IMAGE_TAG:-staging}
build:
context: .
dockerfile: docker/php/Dockerfile
target: staging
container_name: kaunter_staging_app
working_dir: /var/www/html
volumes:
- storage_staging:/var/www/html/storage
- ./.env.staging:/var/www/html/.env.staging:ro
env_file:
- .env.staging
environment:
APP_ENV: staging
USE_STAGING_ENV: "true"
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
mysql:
condition: service_healthy
restart: unless-stopped
web:
image: nginx:1.25-alpine
container_name: kaunter_staging_web
ports:
- "${HTTP_PORT:-8091}:80"
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./public:/var/www/html/public:ro
depends_on:
- app
restart: unless-stopped
mysql:
image: mysql:8.0
container_name: kaunter_staging_mysql
command: --default-authentication-plugin=mysql_native_password
ports:
- "127.0.0.1:${MYSQL_PUBLISH_PORT:-3309}:3306"
environment:
MYSQL_DATABASE: kaunter_erahn
MYSQL_USER: kaunteruser
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: root
volumes:
- mysql_staging_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-proot"]
interval: 5s
timeout: 5s
retries: 30
start_period: 20s
restart: unless-stopped
volumes:
mysql_staging_data:
storage_staging:
-43
View File
@@ -1,43 +0,0 @@
services:
app:
build:
context: .
dockerfile: docker/php/Dockerfile
target: development
working_dir: /var/www/html
volumes:
- ./:/var/www/html:cached
environment:
APP_ENV: local
APP_DEBUG: "true"
# Lets PHP resolve host.docker.internal to the host machine (Linux Docker; Desktop already provides this).
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- mysql
web:
image: nginx:1.25-alpine
ports:
- "8081:80"
volumes:
- ./:/var/www/html:cached
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
mysql:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
ports:
- "3307:3306"
environment:
MYSQL_DATABASE: kaunter_erahn
MYSQL_USER: kaunteruser
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: root
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
-39
View File
@@ -1,39 +0,0 @@
server {
listen 80;
server_name _;
root /var/www/html/public;
index index.php index.html;
charset utf-8;
client_max_body_size 50M;
location / {
# Production Apache public/.htaccess 301-strips trailing slashes.
# Nginx ignores .htaccess, so without this /path/ 404s while /path works.
rewrite ^/(.*)/$ /$1 last;
try_files $uri @php;
}
location @php {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html/public/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_read_timeout 120s;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_read_timeout 120s;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
-51
View File
@@ -1,51 +0,0 @@
FROM php:7.4-fpm AS base
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 \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j"$(nproc)" \
pdo_mysql \
mbstring \
bcmath \
zip \
exif \
gd \
&& rm -rf /var/lib/apt/lists/*
COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer
COPY docker/php/php.ini /usr/local/etc/php/conf.d/app.ini
COPY docker/php/zz-clear-env.conf /usr/local/etc/php-fpm.d/zz-clear-env.conf
COPY docker/php/entrypoint.sh /usr/local/bin/app-entrypoint.sh
RUN chmod +x /usr/local/bin/app-entrypoint.sh \
&& usermod -u 1000 www-data && groupmod -g 1000 www-data
ENTRYPOINT ["app-entrypoint.sh"]
CMD ["php-fpm"]
FROM base AS staging
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 \
&& chown -R www-data:www-data storage bootstrap/cache vendor
FROM base AS development
-35
View File
@@ -1,35 +0,0 @@
#!/bin/sh
set -e
cd /var/www/html
if [ "${USE_STAGING_ENV:-false}" = "true" ] && [ -f .env.staging ]; then
cp .env.staging .env
fi
if [ -f composer.json ]; then
if [ -f vendor/autoload.php ] && [ "${USE_STAGING_ENV:-false}" = "true" ]; then
: # vendor is baked into the staging image
elif [ "${USE_STAGING_ENV:-false}" = "true" ]; then
composer install --no-interaction --prefer-dist --no-dev --optimize-autoloader --no-scripts
else
composer install --no-interaction --prefer-dist
fi
fi
mkdir -p \
storage/logs \
storage/framework/cache/data \
storage/framework/views \
storage/framework/sessions \
storage/app/public \
bootstrap/cache
if [ -f artisan ]; then
php artisan package:discover --ansi
php artisan storage:link --force >/dev/null 2>&1 || true
fi
chown -R www-data:www-data storage bootstrap/cache
exec docker-php-entrypoint "$@"
-4
View File
@@ -1,4 +0,0 @@
memory_limit=512M
upload_max_filesize=50M
post_max_size=50M
max_execution_time=120
-3
View File
@@ -1,3 +0,0 @@
[www]
; Pass container env vars (from compose env_file) through to PHP workers.
clear_env = no
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

+254 -364
View File
@@ -1,403 +1,293 @@
let button_read_mykad = document.getElementById("button_read_mykad"); let button_read_mykad = document.getElementById("button_read_mykad");
let button_close_modal = document.querySelector("#daftar_pelanggan_mykad_reader button.btn.btn-danger"); let button_close_modal = document.querySelector("#daftar_pelanggan_mykad_reader button.btn.btn-danger");
let photo_mykad = document.querySelector("#photo-mykad"); let original_photo_loader = document.querySelector("#photo-mykad").src;
let original_photo_loader = photo_mykad ? photo_mykad.src : "";
const MYKAD_READER_TIMEOUT_MS = 45000; let showLoader = () => {
const MYKAD_READER_DEFAULT_ENDPOINT = "http://localhost:17321/read"; let pageLoader = document.getElementById('page_loader');
pageLoader.removeAttribute('class');
let showLoader = () => { pageLoader.classList.add('loading');
let pageLoader = document.getElementById('page_loader');
if (!pageLoader) {
return;
}
pageLoader.removeAttribute('class');
pageLoader.classList.add('loading');
};
let hideLoader = () => {
let pageLoader = document.getElementById('page_loader');
if (!pageLoader) {
return;
}
pageLoader.removeAttribute('class');
};
function getMyKadReaderEndpoint() {
let endpoint = (typeof mykad_reader_endpoint !== 'undefined' && mykad_reader_endpoint)
? String(mykad_reader_endpoint).trim()
: '';
if (!endpoint || endpoint.includes('MYKADJSON') || endpoint.includes(':8085')) {
return MYKAD_READER_DEFAULT_ENDPOINT;
}
return endpoint;
}
async function parseJsonResponse(response) {
let text = await response.text();
let trimmed = (text || '').trim();
if (!trimmed) {
throw new Error('Pembaca MyKad tidak memulangkan data. Sila cuba lagi.');
}
if (trimmed.charAt(0) === '<') {
throw new Error('Pembaca MyKad memulangkan halaman web, bukan data kad. Sila pastikan perkhidmatan mykad-helper sedang berjalan di localhost:17321.');
}
try {
return JSON.parse(trimmed);
} catch (error) {
throw new Error('Pembaca MyKad memulangkan data yang tidak sah. Sila cuba lagi.');
}
}
function getMyKadNumberWithoutHyphens(nric) {
return String(nric || '').replace(/-/g, '');
}
function titleCase(value) {
return String(value || '')
.toLowerCase()
.split(' ')
.filter(Boolean)
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
}
function getCodeFromValue(needle, haystack, fallback) {
let normalised = titleCase(needle);
let match = haystack.find(item => item[1].toLowerCase() === normalised.toLowerCase());
return match ? match[0] : fallback;
}
function mapGender(gender) {
let value = String(gender || '').toLowerCase();
if (['male', 'lelaki', 'l', 'm'].includes(value)) {
return 'Lelaki';
}
if (['female', 'perempuan', 'p', 'f'].includes(value)) {
return 'Perempuan';
}
return gender || '';
}
function formatDateOfBirth(dob) {
if (!dob) {
return '';
}
let hyphenated = String(dob).includes('-')
? String(dob)
: String(dob).replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3');
let [year, month, day] = hyphenated.split('-');
if (!year || !month || !day) {
return dob;
}
return day + '/' + month + '/' + year;
}
function getAgeFromDateOfBirth(dob) {
if (!dob) {
return '';
}
let hyphenated = String(dob).includes('-')
? String(dob)
: String(dob).replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3');
let birthDate = new Date(hyphenated);
if (Number.isNaN(birthDate.getTime())) {
return '';
}
let today = new Date();
let age = today.getFullYear() - birthDate.getFullYear();
let monthDiff = today.getMonth() - birthDate.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
age -= 1;
}
return age;
}
function getBumiputeraStatus(race) {
const non_bumiputera_ethnicity = ['INDIA', 'CINA', 'INDIAN', 'CHINESE'];
return !non_bumiputera_ethnicity.includes(String(race || '').toUpperCase());
}
function joinAddress(data) {
return [data.address1, data.address2, data.address3]
.map(line => String(line || '').trim())
.filter(Boolean)
.join(', ');
}
function mapReaderErrorCode(rawMessage) {
const error_handler_dictionary = {
'0x80100069': 'Tiada MyKad dikesan, sila masukkan MyKad untuk dibaca',
'0x8010000C': 'Tiada MyKad dikesan, sila masukkan MyKad untuk dibaca',
'0x80100066': 'MyKad mungkin dimasukkan terbalik, sila masukkan dengan betul',
'0x80100067': 'MyKad tidak dapat dikesan. Sila cabut dan masukkan semula kad',
'0x80100016': 'Gagal membaca MyKad. Sila pastikan kad dimasukkan dengan betul dan cuba lagi',
'0x8010002E': 'Pembaca MyKad tidak dapat dikesan, sila periksa sambungan',
'0x80100017': 'Pembaca MyKad tidak dapat dikesan, sila periksa sambungan',
}; };
let message = String(rawMessage || ''); let hideLoader = () => {
let codes = message.match(/0x[0-9a-fA-F]+/g) || []; let pageLoader = document.getElementById('page_loader');
let matched = codes.reverse().find(code => error_handler_dictionary[code]); pageLoader.removeAttribute('class');
};
return matched ? error_handler_dictionary[matched] : (message || null); function handleMyKadReader()
} {
showLoader();
function getReaderErrorMessage(payload) { WebSocketManager.init("wss://localhost:5963/mykadwebsocket");
if (!payload) { WebSocketManager.listReader(callbackDoneGetListCardReader);
return 'Pembaca MyKad tidak dapat membaca kad. Sila cuba lagi.';
} }
let raw = payload.message || payload.error || payload.detail || ''; function callbackDoneGetListCardReader(data, respcode)
return mapReaderErrorCode(raw) {
|| 'Pembaca MyKad tidak dapat membaca kad. Sila pastikan MyKad dimasukkan dengan betul.'; console.log('done get list card reader');
}
function getFetchErrorTitle(error) { if(respcode === -1){
if (error && error.name === 'AbortError') { console.log({'location': 'callbackDoneGetListCardReader', 'data' : data} );
return 'Masa menunggu pembaca MyKad telah tamat. Sila cuba lagi.';
}
return 'Pembaca MyKad tidak dapat dikesan. Sila pastikan perkhidmatan pembaca MyKad sedang berjalan.';
}
function getDisplayError(error) {
if (!error) {
return getFetchErrorTitle(error);
}
if (error.name === 'AbortError') {
return getFetchErrorTitle(error);
}
let message = String(error.message || '');
if (!message || message.startsWith('Failed to fetch') || message.includes('NetworkError')) {
return getFetchErrorTitle(error);
}
return message;
}
async function handleMyKadReader() {
showLoader();
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), MYKAD_READER_TIMEOUT_MS);
try {
const response = await fetch(getMyKadReaderEndpoint(), {
method: 'POST',
headers: {
'Accept': 'application/json',
},
signal: controller.signal,
});
const payload = await parseJsonResponse(response);
if (!response.ok) {
throw new Error(getReaderErrorMessage(payload));
} }
if (!payload || payload.ok !== true || !payload.data) { let isDevicesConnected = Object.keys(data).length > 0;
throw new Error(getReaderErrorMessage(payload));
if(! isDevicesConnected){
hideLoader();
Swal.fire({ icon: 'error', title: 'Pembaca MyKad tidak dapat dikesan, sila periksa sambungan', });
return;
} }
await handleMyKadData(payload.data); let slots = data.toString().split(',');
} catch (error) { WebSocketManager.open(doneOpenReaderConnection, slots[0]);
Swal.fire({ }
icon: 'error',
title: getDisplayError(error), function doneOpenReaderConnection()
}); {
} finally { WebSocketManager.readAllText(callBackAfterReadMykad);
clearTimeout(timeoutId); }
function handleMyKadReaderError(sw12AndApiName)
{
hideLoader(); hideLoader();
let error_handler_dictionary = {
'0x80100069' : 'Tiada MyKad dikesan, sila masukkan Mykad untuk dibaca',
'0x80100066' : 'MyKad mungkin dimasukkan terbalik, sila masukkan dengan betul',
'default' : sw12AndApiName,
};
let error_data = sw12AndApiName.split(" ");
let error_code = error_data.filter(x => x.startsWith('0x')).splice(-1)
let error_message = error_handler_dictionary['default'];
let hasDefinedError = error_handler_dictionary.hasOwnProperty(error_code);
if(hasDefinedError){
error_message = error_handler_dictionary[error_code];
}
Swal.fire({ icon: 'error', title: error_message, });
} }
}
function handleMyKadData(data) { function callBackAfterReadMykad(data, respcode, sw12AndApiName)
return checkIfMyKadExists(data.nric) {
.then(response => { if(respcode !== 0){
let isResponseArray = Array.isArray(response); handleMyKadReaderError(sw12AndApiName);
let resolved_response = isResponseArray ? response.pop() : response; return
if (!resolved_response || resolved_response === 'no-data') {
populateDaftarPelangganModal(data);
} else {
let input_search_noic = document.querySelector("form[name='frmsearch'] input[name='noic']");
let form_search_noic = document.querySelector("form[name='frmsearch']");
input_search_noic.value = getMyKadNumberWithoutHyphens(data.nric);
form_search_noic.submit();
}
})
.catch(() => {
populateDaftarPelangganModal(data);
});
}
function checkIfMyKadExists(myKadNumber) {
let myKadNumberWithoutHyphens = getMyKadNumberWithoutHyphens(myKadNumber);
let lookupUrl = new URL(wakil_caricustomer_endpoint, window.location.origin);
lookupUrl.searchParams.set('icno', myKadNumberWithoutHyphens);
const csrfToken = document.querySelector('input[name="_token"]');
return fetch(lookupUrl.toString(), {
method: 'GET',
headers: {
"Accept": "application/json",
"X-Requested-With": "XMLHttpRequest",
"X-CSRF-Token": csrfToken ? csrfToken.value : ""
},
credentials: "same-origin",
}).then(async response => {
let text = await response.text();
let trimmed = (text || '').trim();
if (!trimmed || trimmed.charAt(0) === '<') {
return 'no-data';
} }
try { checkIfMyKadExists(data.IDNum)
return JSON.parse(trimmed); .then(response => {
} catch (error) { let isResponseArray = Array.isArray(response);
return 'no-data'; resolved_response = isResponseArray ? response.pop() : response;
if (resolved_response === 'no-data') {
populateDaftarPelangganModal(data, handleReadPhoto);
} else {
let input_search_noic = document.getElementById("noic");
let form_search_noic = document.querySelector("form[name='frmsearch']");
let getMyKadNumberWithoutHypens = myKadNumber => myKadNumber.replace(/-/g, '');
input_search_noic.value = getMyKadNumberWithoutHypens(data.IDNum);
form_search_noic.submit();
}
})
.catch(error => {
Swal.fire({
icon: 'error',
title: error,
});
});
hideLoader();
}
function checkIfMyKadExists(myKadNumber) {
let myKadNumberWithoutHyphens = myKadNumber.replace(/-/g, '');
const url = wakil_caricustomer_endpoint + '/?icno=' + myKadNumberWithoutHyphens;
const connectionConfig = {
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
"X-Requested-With": "XMLHttpRequest",
"X-CSRF-Token": document.querySelector('input[name="_token"]').value
},
credentials: "same-origin",
};
return fetch(url, connectionConfig)
.then(response => response.json())
}
let populateDaftarPelangganModal = (data, callbackAfterPopulateDaftarPelanggan) => {
$('#daftar_pelanggan_mykad_reader').modal('show');
let modal_form = document.querySelector("#daftar_pelanggan_mykad_reader .modal-body .row.form-group");
const religions = [
['01', 'Islam'],
['02', 'Hindu'],
['03', 'Buddha'],
['04', 'Kristian'],
['05', 'Lain-lain'],
];
const races = [
['M', 'Melayu'],
['C', 'Cina'],
['I', 'India'],
['L', 'Lain-lain'],
];
let getCodeFromValue = (needle, haystack) => {
let title_cased_text = needle.split(' ')
.map(w => w[0].toUpperCase() + w.substring(1).toLowerCase())
.join(' ');
return haystack.filter(x => x[1] == title_cased_text)[0][0];
};
let getMyKadNumberWithoutHypens = (IDNum) => {
return IDNum.replace(/-/g, '');
} }
});
}
let populateDaftarPelangganModal = (data) => { let getFormattedDateOfBirth = (date_of_birth) => {
$('#daftar_pelanggan_mykad_reader').modal('show');
let modal_form = document.querySelector("#daftar_pelanggan_mykad_reader .modal-body .row.form-group");
const religions = [ let date_of_birth_hyphenated = date_of_birth.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3");
['01', 'Islam'],
['02', 'Hindu'],
['03', 'Buddha'],
['04', 'Kristian'],
['05', 'Lain-lain'],
];
const races = [ const [year, month, day] = date_of_birth_hyphenated.split('-');
['M', 'Melayu'], return day + '/' + month + '/' + year;
['C', 'Cina'], };
['I', 'India'],
['L', 'Lain-lain'],
];
let disablePointerEventsOnClickableInputs = () => { let getAgeFromDateOfBirth = (date_of_birth) => {
modal_form.querySelector("input[name='bumiputera']").style.pointerEvents = 'none';
modal_form.querySelector("input[name='warganegara']").style.pointerEvents = 'none';
modal_form.querySelector("select[name='bangsa']").style.pointerEvents = 'none';
modal_form.querySelector("select[name='agama']").style.pointerEvents = 'none';
};
let mykad_modal = document.querySelector("#daftar_pelanggan_mykad_reader"); let date_of_birth_hyphenated = date_of_birth.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3");
let photo_container = mykad_modal.querySelector("#photo-mykad-container");
let photo = mykad_modal.querySelector("#photo-mykad");
modal_form.querySelector("textarea[name='name']").value = data.name || data.gmpc_name || ''; const [birth_year, birth_month, birth_day] = date_of_birth_hyphenated.split('-');
modal_form.querySelector("input[name='noic']").value = getMyKadNumberWithoutHyphens(data.nric);
modal_form.querySelector("input[name='tarikh_lahir']").value = formatDateOfBirth(data.dob); let formatBirthMonth = (birth_month) => {
modal_form.querySelector("input[name='negeri_lahir']").value = data.birth_place || ''; let newbirthMonth = birth_month < 9 ? birth_month[1] : birth_month;
modal_form.querySelector("input[name='jantina']").value = mapGender(data.gender); return newbirthMonth;
modal_form.querySelector("input[name='warganegara']").checked = String(data.citizenship || '').toUpperCase() === 'WARGANEGARA'; };
modal_form.querySelector("input[name='bumiputera']").checked = getBumiputeraStatus(data.race);
modal_form.querySelector("select[name='agama']").value = getCodeFromValue(data.religion, religions, '05'); const count_leap_year = countLeapYears(birth_year, formatBirthMonth(birth_month), birth_day) - 1;
modal_form.querySelector("textarea[name='alamat']").value = joinAddress(data);
modal_form.querySelector("input[name='poskod']").value = data.postcode || ''; const start = new Date(date_of_birth_hyphenated),
modal_form.querySelector("input[name='daerah']").value = data.city || ''; end = new Date(),
modal_form.querySelector("input[name='negeri']").value = data.state || ''; diff = new Date(end - start),
modal_form.querySelector("input[name='age']").value = data.age != null && data.age !== '' days = ((diff / 1000 / 60 / 60 / 24) - count_leap_year) / 365;
? data.age
: getAgeFromDateOfBirth(data.dob); return parseInt(days);
modal_form.querySelector("select[name='bangsa']").value = getCodeFromValue(data.race, races, 'L'); };
let getBumiputeraStatus = (race) => {
const non_bumiputera_ethnicity = ['INDIA', 'CINA'];
let isBumiputera = !non_bumiputera_ethnicity.includes(race);
return isBumiputera;
};
let disablePointerEventsOnClickableInputs = () => {
modal_form.querySelector("input[name='bumiputera']").style.pointerEvents = 'none';
modal_form.querySelector("input[name='warganegara']").style.pointerEvents = 'none';
modal_form.querySelector("select[name='bangsa']").style.pointerEvents = 'none';
modal_form.querySelector("select[name='agama']").style.pointerEvents = 'none';
}
let mykad_modal = document.querySelector("#daftar_pelanggan_mykad_reader");
let photo_container = mykad_modal.querySelector("#photo-mykad-container");
modal_form.querySelector("textarea[name='name']").value = data.OrgName;
modal_form.querySelector("input[name='noic']").value = getMyKadNumberWithoutHypens(data.IDNum);
modal_form.querySelector("input[name='tarikh_lahir']").value = getFormattedDateOfBirth(data.BirthDate);
modal_form.querySelector("input[name='negeri_lahir']").value = data.BirthPlace;
modal_form.querySelector("input[name='jantina']").value = data.Gender == 'LELAKI' ? 'Lelaki' : 'Perempuan';
modal_form.querySelector("input[name='warganegara']").checked = data.Citizenship === 'WARGANEGARA' ? true : false;
modal_form.querySelector("input[name='bumiputera']").checked = getBumiputeraStatus(data.Race);
modal_form.querySelector("select[name='agama']").value = getCodeFromValue(data.Religion, religions);
modal_form.querySelector("textarea[name='alamat']").value = [data.Address1, data.Address2, data.Address3].join(", ");
let getPostCode = (postCodeCity) => postCodeCity.replace(/\D/g, '');
modal_form.querySelector("input[name='poskod']").value = getPostCode(data.PostcodeCity);
let getCityName = (postCodeCity) => postCodeCity.replace(/\d/g, '');
modal_form.querySelector("input[name='daerah']").value = getCityName(data.PostcodeCity).trim();
modal_form.querySelector("input[name='negeri']").value = data.State;
modal_form.querySelector("input[name='age']").value = getAgeFromDateOfBirth(data.BirthDate);
modal_form.querySelector("select[name='bangsa']").value = getCodeFromValue(data.Race, races);
calculatePassportAge();
if (data.has_photo && data.photo_base64) {
let mime = data.photo_mime || 'image/jpeg';
photo.src = 'data:' + mime + ';base64,' + data.photo_base64;
photo_container.classList.remove('d-none'); photo_container.classList.remove('d-none');
photo_container.classList.add('d-flex'); photo_container.classList.add('d-flex');
setMykadPhotoFields(data.photo_base64, mime);
} else { $('#daftar_pelanggan_mykad_reader').modal('show');
photo.src = original_photo_loader;
photo_container.classList.add('d-none');
photo_container.classList.remove('d-flex'); disablePointerEventsOnClickableInputs();
setMykadPhotoFields('', ''); callbackAfterPopulateDaftarPelanggan();
}
function handleReadPhoto()
{
WebSocketManager.init("wss://localhost:5963/mykadwebsocket");
WebSocketManager.listReader(callbackDoneGetListCardReader2);
}
function callbackDoneGetListCardReader2(data, respcode)
{
if(respcode === -1){
console.log({'location': 'callbackDoneGetListCardReader', 'data' : data} );
} }
disablePointerEventsOnClickableInputs(); let slots = data.toString().split(',');
$(modal_form.querySelector("input[name='poskod']")).trigger('change'); WebSocketManager.open(doneOpenReaderConnection2, slots[0]);
}; }
function doneOpenReaderConnection2()
{
WebSocketManager.readPhoto(callbackAfterReadPhoto2);
}
function callbackAfterReadPhoto2(data, RespCode, RespSW12AndApiName)
{
let mykad_modal = document.querySelector("#daftar_pelanggan_mykad_reader");
let photo = mykad_modal.querySelector("#photo-mykad");
let isDataEmpty = data
&& Object.keys(data).length === 0
&& Object.getPrototypeOf(data) === Object.prototype;
if(isDataEmpty){
photo.src = original_photo_loader;
return;
}
photo.src = 'data:image/jpeg;base64, ' + data.Base64Photo;
}
let hideMykadPhoto = () => { let hideMykadPhoto = () => {
WebSocketManager.close(() => console.log('Websocket closed'));
let photo = document.getElementById("photo-mykad"); let photo = document.getElementById("photo-mykad");
let photo_container = document.getElementById("photo-mykad-container"); let photo_container = document.getElementById("photo-mykad-container");
if (photo) { photo.src = original_photo_loader;
photo.src = original_photo_loader;
}
if (photo_container) { photo_container.classList.add('d-none');
photo_container.classList.add('d-none'); photo_container.classList.remove('d-flex');
photo_container.classList.remove('d-flex');
}
setMykadPhotoFields('', '');
}; };
function setMykadPhotoFields(base64, mime) { button_read_mykad.addEventListener("click", handleMyKadReader);
let form = document.querySelector("#daftar_pelanggan_mykad_reader form") button_close_modal.addEventListener("click", hideMykadPhoto);
|| document.getElementById("form-mykad-reader");
let photoInput = (form && form.querySelector("input[name='photo_base64']"))
|| document.getElementById("photo_base64");
let mimeInput = (form && form.querySelector("input[name='photo_mime']"))
|| document.getElementById("photo_mime");
if (photoInput) {
photoInput.value = base64 || '';
}
if (mimeInput) {
mimeInput.value = mime || '';
}
}
function copyMykadPhotoFromImage() {
let photo = document.querySelector("#daftar_pelanggan_mykad_reader #photo-mykad");
if (!photo || !photo.src || photo.src.indexOf("base64,") === -1) {
return;
}
let parts = photo.src.split("base64,");
let mimeMatch = photo.src.match(/^data:([^;]+);/);
setMykadPhotoFields(parts[1] || "", mimeMatch ? mimeMatch[1] : "image/jpeg");
}
if (button_read_mykad) {
button_read_mykad.addEventListener("click", handleMyKadReader);
}
if (button_close_modal) {
button_close_modal.addEventListener("click", hideMykadPhoto);
}
-30
View File
@@ -1,30 +0,0 @@
/**
* First we will load all of this project's JavaScript dependencies which
* includes Vue and other libraries. It is a great starting point when
* building robust, powerful web applications using Vue and Laravel.
*/
require('./bootstrap');
window.Vue = require('vue');
/**
* The following block of code may be used to automatically register your
* Vue components. It will recursively scan this directory for the Vue
* components and automatically register them with their "basename".
*
* Eg. ./components/ExampleComponent.vue -> <example-component></example-component>
*/
// const files = require.context('./', true, /\.vue$/i)
// files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))
/**
* Next, we will create a fresh Vue application instance and attach it to
* the page. Then, you may begin adding components to this application
* or customize the JavaScript scaffolding to fit your unique needs.
*/
const app = new Vue({
el: '#app',
});
+3 -3
View File
@@ -35,7 +35,7 @@ window.Pusher = require('pusher-js');
window.Echo = new Echo({ window.Echo = new Echo({
broadcaster: 'pusher', broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY, key: '26b0ec2f297f94b7aa9b',
cluster: process.env.MIX_PUSHER_APP_CLUSTER, cluster: 'ap1',
forceTLS: false forceTLS: true
}); });
@@ -306,7 +306,7 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var search = "<?php echo $search ?>"; var search = "<?php echo $search ?>";
var type_id = "<?php echo $idtype ?>"; var type_id = "<?php echo $idtype ?>";
$(document).ready(function(){ $(document).ready(function(){
@@ -157,7 +157,7 @@
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var ppc = "{{ Auth::user()->name }}"; var ppc = "{{ Auth::user()->name }}";
var ic_asal = "{{ $customer_info['kpbaru'] != null ? $customer_info['kpbaru'] : $customer_info['kplama'] }}" var ic_asal = "{{ $customer_info['kpbaru'] != null ? $customer_info['kpbaru'] : $customer_info['kplama'] }}"
+1 -1
View File
@@ -48,6 +48,6 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
</script> </script>
@endsection @endsection
+9 -5
View File
@@ -26,7 +26,7 @@
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
@php $auth_user = Auth::user();@endphp @php $auth_user = Auth::user();@endphp
<input type="hidden" id="api" value="{{ api_url_for_browser() }}"/> <input type="hidden" id="api" value="{{ $api_url }}"/>
<div class="col-md-12"> <div class="col-md-12">
@@ -348,7 +348,7 @@
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tableaddtunai = $('#tableaddtunai').DataTable({ var tableaddtunai = $('#tableaddtunai').DataTable({
@@ -558,10 +558,14 @@
function cetaklaporanalirantunai() function cetaklaporanalirantunai()
{ {
let urlroute = '{{ route("laporan.alirantunai") }}'; let teller = "{{ Auth::user()->name }}";
window.location.href = api_url + urlroute;
}
let urlroute = '{{ route("laporan.alirantunai", ":id") }}';
urlroute = urlroute.replace(':id', teller);
window.open(urlroute, '_blank');
}
function cetakserahankeseluruhan() function cetakserahankeseluruhan()
{ {
@@ -1,298 +1,211 @@
<style> <html>
#header { <head>
font-family: Arial, Helvetica, sans-serif; <style>
border-collapse: collapse; .header{
width: 100%; font-size:12px;
} font-weight: bold;
margin-left:40px;
#header td, #customers th { }
padding:4px; body {
font-size:10px; background: white;
} }
#header tr:nth-child(even){background-color: #ffffff;} page {
background: white;
#header tr:hover {background-color: #ddd;} display: block;
margin: 0 auto;
#header th { margin-bottom: 0.5cm;
padding-top: 12px; /* box-shadow: 0 0 0.5cm rgba(0,0,0,0.5); */
padding-bottom: 12px; }
text-align: left;
padding:4px;
color:black;
}
</style>
<style>
#scan {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
#scan td, #scan th {
padding: 8px;
font-size:11px;
}
#scan tr:nth-child(even){background-color: #ffffff;}
#scan tr:hover {background-color: #ddd;}
#scan th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
padding:4px;
color:black;
}
</style>
<style>
#scan {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
#scan td, #scan th {
border-collapse: collapse;
padding: 8px;
font-size:11px;
}
#scan tr:nth-child(even){background-color: #ffffff;}
#scan tr:hover {background-color: #ddd;}
#scan th {
border-collapse: collapse;
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
padding:4px;
color:black;
}
</style>
<style>
#details {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 50%;
}
#details td, #details th {
padding: 8px;
font-size:11px;
}
#details tr:nth-child(even){background-color: #ffffff;}
#details tr:hover {background-color: #ddd;}
#details th {
padding-top: 12px;
font-style:bold;
padding-bottom: 12px;
text-align: left;
padding:4px;
color:black;
}
</style>
<style>
#sign {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
#sign td, #sign th {
padding: 8px;
font-size:11px;
text-align: center;
}
#sign tr:nth-child(even){background-color: #ffffff;}
#sign tr:hover {background-color: #ddd;}
#sign th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
padding:4px;
color:black;
}
</style>
<table id="header">
<tr>
<th rowspan="4" style="width:50px"><br><img src="{{ asset('img/ARRAHN1.png') }}" style="width:70px"></img></th>
<th colspan="1">KOPERASI PERMODALAN KELANTAN BERHAD</th>
</tr>
<tr>
<td>{{ $cawangan_detail['namacaw'] }}</td>
<td></td>
</tr>
<tr>
<td>{{ $cawangan_detail['alamat1'] }}</td>
<td></td>
</tr>
<tr>
<td>{{ $cawangan_detail['alamat2'].' No Tel : '. $cawangan_detail['notel'].' No Faks : '. $cawangan_detail['nofaks'] }}</td>
<td></td>
</tr>
</table>
<br>
<table id="scan">
<tr>
<th colspan="3" style="
text-align: left;
font-size: 16px;
font-weight: bold;
text-transform: uppercase;
padding-top: 10px;
padding-bottom: 10px;
letter-spacing: 0.5px;
">
LAPORAN ALIRAN TUNAI TELLER
</th>
</tr>
<tr>
<td style="width:100px"><b>TARIKH:</b></td>
<td><b>
@php
$tarikhTeller = DateTime::createFromFormat('Y-m-d', $tunai['tarikh']);
echo $tarikhTeller->format('d-m-Y');
@endphp
</b></td>
</tr>
<tr>
<td><b>TARIKH CETAK:</b></td>
<td><b>
@php
$myDateTime = DateTime::createFromFormat('Y-m-d', $tarikh_cetak);
$formattedweddingdate = $myDateTime->format('d-m-Y');
echo $formattedweddingdate;
@endphp
</b></td>
</tr>
</table>
<br>
<table id="details">
<tr>
<th>BAKI AWAL</th>
</tr>
<tr>
<td>Baki Awal</td>
<td>:</td>
<td>RM {{ number_format($tunai['bakiawal'],2) }}</td>
</tr>
<tr>
<th>TAMBAH</th>
</tr>
<tr>
<td>Pendahuluan</td>
<td>:</td>
<td>RM {{ number_format($tunai['tambah'],2) }}</td>
</tr>
<tr>
<td>Pen. Pembiayaan / Keuntungan</td>
<td>:</td>
<td>RM {{ number_format($tunai['masuk'],2) }}</td>
</tr>
<tr>
<td>Kerugian Baki Lelong</td>
<td>:</td>
<td>RM {{ number_format($bakiLelong['rugi_lelong'],2) }}</td>
</tr>
<tr>
<td>Jumlah</td>
<td>:</td>
<td>RM {{ number_format($jumlahTambah,2) }}</td>
</tr>
<tr>
<th>TOLAK</th>
</tr>
<tr>
<td>Serahan</td>
<td>:</td>
<td>RM {{ number_format($tunai['kurang'],2) }}</td>
</tr>
<tr>
<td>Pembiayaan</td>
<td>:</td>
<td>RM {{ number_format($tunai['keluar'],2) }}</td>
</tr>
<tr>
<td>Baki Lelong</td>
<td>:</td>
<td>RM {{ number_format($bakiLelong['baki_lelong'],2) }}</td>
</tr>
<tr>
<td>Jumlah</td>
<td>:</td>
<td>RM {{ number_format($jumlahTolak,2) }}</td>
</tr>
<tr><th>BAKI AKHIR</th></tr>
<tr>
<td colspan="3" style="
border: 2px solid black;
text-align: center;
background-color: #f8f8f8;
font-weight: bold;
font-size: 13px;
padding: 10px;
">
BAKI AKHIR TELLER: RM {{ number_format($tunai['bakiawal'] + $jumlahTambah - $jumlahTolak,2) }}
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<table id="sign">
<tr>
<td></td>
<td colspan="2"> .................................................................. </td>
<td> </td>
<td colspan="2">.................................................................. </td>
<td> </td>
</tr>
<tr>
<td></td>
<td colspan="2"><B> DI SEMAK</B> </td>
<td> </td>
<td colspan="2"><B>DI SAHKAN </B></td>
<td> </td>
</tr>
</table>
page[size="A4"] {
width: 21cm;
/* height: 29.7cm; */
}
page[size="A4"][layout="landscape"] {
width: 29.7cm;
height: 21cm;
}
@media print {
body, page {
margin: 0;
box-shadow: 0;
}
}
.middleheader{
text-align: center;
}
.container{
font-family: Arial, Helvetica, sans-serif;
width: 25%;
border: 2px solid gray;
border-radius: 15px;
padding: 5px 10px 10px 30px;
margin: 0 auto;
}
#header {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
margin-left:40px;
}
#header td, #customer th {
padding:4px;
font-size:10px;
}
#header tr:nth-child(even){
background-color: #ffffff;
}
/* #header tr:hover {
background-color: #ddd;
} */
#header th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
padding:4px;
color:black;
}
.statements{
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 95%;
margin: 0 auto;
}
.statements th{
font-size:14px;
background-color: #f9ca24;
border:1px solid gray;
color:black;
padding:4px 10px 4px 10px;
}
.statements td{
border:1px solid gray;
padding:4px 4px 4px 4px;
}
.center{
position: fixed;
left: 0;
bottom: 0;
width: 100%;
color: white;
text-align: center;
}
</style>
</head>
<body onload="window.print()">
<page size="A4">
<h6 class="header">SULIT DAN PERSENDIRIAN</h6>
<table id="header">
<tr>
<th rowspan="4" style="width:50px"><br><img src="{{ asset('img/icon_pkb.png') }}" style="width:70px"></img></th>
<th colspan="1">KOPERASI PERMODALAN KELANTAN BERHAD</th>
</tr>
<tr>
<td>{{ $cawangan_detail['namacaw'] }}</td>
<td></td>
</tr>
<tr>
<td>{{ $cawangan_detail['alamat1'] }}</td>
<td></td>
</tr>
<tr>
<td>{{ $cawangan_detail['alamat2'].' No Tel : '. $cawangan_detail['notel'].' No Faks : '. $cawangan_detail['nofaks'] }}</td>
<td></td>
</tr>
</table>
<h6 class="middleheader">PENYATA ALIRAN TUNAI : {{ $teller }}</h6>
<div class="row" style="display: flex; justify-content: start;">
<div class="container" style="flex: 1; margin-left: 20px;">
<h3>Baki Awal</h3>
<span>RM {{ number_format($alirantunai['bakiawal'], 2) }}</span>
</div>
<div class="container" style="flex: 1; margin-left: 10px;">
<h3>Pendahuluan</h3>
<span>RM {{ number_format($alirantunai['tambah'], 2) }}</span>
</div>
<div class="container" style="flex: 1; margin-left: 10px;">
<h3>Penyelesaian Pem.</h3>
<span>RM {{ number_format($alirantunai['masuk'], 2) }}</span>
</div>
</div>
<div class="row" style="display: flex; justify-content: start; margin-top: 20px;">
<div class="container" style="flex: 1; margin-left: 20px;">
<h3>Baki Tunai Semasa</h3>
<span>RM {{ number_format($alirantunai['baki'], 2) }}</span>
</div>
<div class="container" style="flex: 1; margin-left: 10px;">
<h3>Serahan</h3>
<span>RM {{ number_format($alirantunai['kurang'], 2) }}</span>
</div>
<div class="container" style="flex: 1; margin-left: 10px;">
<h3>Pembiayaan</h3>
<span>RM {{ number_format($alirantunai['keluar'], 2) }}</span>
</div>
</div>
<h6 class="middleheader" style="margin-bottom:-5px;">KEMASUKAN TUNAI</h6>
<br>
<table class="statements">
<tr>
<th>TARIKH</th>
<th>DEBIT (RM)</th>
<th>KREDIT (RM)</th>
<th>NOTA</th>
</tr>
@php $totaltambah = 0; $totalkurang = 0; @endphp
@foreach($addtunai as $index=>$ad)
@php $totaltambah += $ad['tambah']; $totalkurang += $ad['kurang']; @endphp
<tr style="text-align:center;">
<td>{{ $ad['tarikh'] }}</td>
<td>{{ number_format($ad['tambah'],2) }}</td>
<td>{{ number_format($ad['kurang'],2) }}</td>
<td>{{ $ad['nota'] }}</td>
</tr>
@endforeach
<tr style="text-align:center;">
<td style="font-weight:bold;">JUMLAH</td>
<td>{{ number_format($totaltambah,2) }}</td>
<td>{{ number_format($totalkurang,2) }}</td>
<td></td>
</tr>
</table>
</page>
<script>
</script>
</body>
</html>
+2 -2
View File
@@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="icon" href="{{ asset('img/icon_pkb.png') }}"> <link rel="icon" href="{{ asset('img/icon_pkb.png') }}">
<title>arOS {{ config('app.version') }}</title> <title>arOS v2.2</title>
<style> <style>
@keyframes slide { @keyframes slide {
@@ -82,7 +82,7 @@
<div class="card-header pb-0 text-left"> <div class="card-header pb-0 text-left">
<div style="display: flex; justify-content:space-between; align-items:center"> <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;"> <h1 class="font-weight-bolder text-info text-gradient" style="word-break: break-word; white-space: nowrap;">
Kaunter arOS {{ config('app.version') }} Kaunter arOS v2.2
</h1> </h1>
<img src="{{ asset('img/icon_pkb.png') }}" alt="logo-arrahn" style="width: 85px; margin-left: 30px;"> <img src="{{ asset('img/icon_pkb.png') }}" alt="logo-arrahn" style="width: 85px; margin-left: 30px;">
</div> </div>
@@ -228,7 +228,7 @@
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "{{ $api_url }}";
// var kodcaw = "{{ $kodcaw }}"; // var kodcaw = "{{ $kodcaw }}";
// var notisid = "{{ $notisid }}"; // var notisid = "{{ $notisid }}";
//var nokp = "{{ $noic }}"; //var nokp = "{{ $noic }}";
+1 -1
View File
@@ -389,7 +389,7 @@
</script> </script>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var search = "<?php echo $search ?>"; var search = "<?php echo $search ?>";
var type_id = "<?php echo $idtype ?>"; var type_id = "<?php echo $idtype ?>";
$(document).ready(function(){ $(document).ready(function(){
@@ -387,7 +387,7 @@
</script> </script>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var search = "<?php echo $search ?>"; var search = "<?php echo $search ?>";
var type_id = "<?php echo $idtype ?>"; var type_id = "<?php echo $idtype ?>";
$(document).ready(function(){ $(document).ready(function(){
+1 -1
View File
@@ -413,7 +413,7 @@
<script> <script>
var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>"; var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>";
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}"; var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}"; var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
@@ -1099,7 +1099,7 @@
let pertambahpinjaman = "{{ $pertambahpinjaman }}"; let pertambahpinjaman = "{{ $pertambahpinjaman }}";
var api = "{{ api_url_for_browser() }}"; var api = '<?php echo $api_url ?>';
let nw = 0; let nw = 0;
let jenisAT = 'none'; let jenisAT = 'none';
+1 -1
View File
@@ -542,7 +542,7 @@
<script> <script>
var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>"; var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>";
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}"; var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}"; var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
@@ -1,137 +0,0 @@
@props([
'id',
'columns' => [],
'exportable' => true,
'filename' => '',
'skipExport' => ['Bil', 'Cetak'],
])
<style>
.erahn-datatable {
width: 100%;
max-width: 100%;
}
.erahn-datatable .dataTables_wrapper {
width: 100%;
overflow-x: auto;
}
.erahn-datatable table {
width: 100% !important;
margin: 0;
}
.erahn-datatable table th,
.erahn-datatable table td {
white-space: nowrap;
vertical-align: middle;
}
.erahn-datatable .dt-buttons {
margin: 0 0 8px 8px;
}
.erahn-datatable .dt-button {
border: 0;
border-radius: 4px;
padding: 6px 12px;
margin-left: 4px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
background: #17a2b8;
color: #fff;
}
.erahn-datatable .dt-button:hover {
opacity: 0.9;
}
.erahn-datatable .buttons-excel {
background: #28a745;
}
.erahn-datatable .buttons-csv {
background: #6c757d;
}
</style>
<script>
if (typeof window.initErahnDatatable !== 'function') {
window.initErahnDatatable = function (selector, options) {
var $table = $(selector);
var exportable = $table.data('exportable');
var filename = $table.data('export-filename') || $table.attr('id') || 'export';
var defaults = {
scrollX: true,
autoWidth: false,
language: {
emptyTable: 'Tiada rekod'
}
};
if ((exportable === undefined || exportable === 1 || exportable === true) &&
$.fn.dataTable && $.fn.dataTable.Buttons) {
defaults.dom = 'lBfrtip';
defaults.buttons = [
{
extend: 'excelHtml5',
text: 'Excel',
className: 'buttons-excel',
title: filename,
filename: filename,
exportOptions: {
columns: ':not(.no-export)',
format: {
body: function (data) {
return $('<div>').html(data).text().replace(/\s+/g, ' ').trim();
}
}
}
},
{
extend: 'csvHtml5',
text: 'CSV',
className: 'buttons-csv',
bom: true,
title: filename,
filename: filename,
exportOptions: {
columns: ':not(.no-export)',
format: {
body: function (data) {
return $('<div>').html(data).text().replace(/\s+/g, ' ').trim();
}
}
}
}
];
}
return $table.DataTable($.extend(true, {}, defaults, options || {}));
};
}
if (typeof window.adjustErahnDatatables !== 'function') {
window.adjustErahnDatatables = function () {
if (!$.fn.dataTable) {
return;
}
setTimeout(function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
}, 50);
};
}
</script>
<div class="erahn-datatable">
<table
id="{{ $id }}"
{{ $attributes->merge(['class' => 'table table-striped table-hover nowrap']) }}
style="width:100%"
data-exportable="{{ $exportable ? 1 : 0 }}"
data-export-filename="{{ $filename !== '' ? $filename : $id }}"
>
<thead class="thead-dark">
<tr>
@foreach ($columns as $column)
<th @if(in_array($column, $skipExport, true)) class="no-export" @endif>{{ $column }}</th>
@endforeach
</tr>
</thead>
<tbody></tbody>
{{ $slot }}
</table>
</div>
@@ -1,44 +0,0 @@
@props([
'showCopies' => true,
])
<style>
.print-footer {
margin-top: 14px;
font-family: Arial, Helvetica, sans-serif;
color: #222;
}
.print-footer .copies {
margin-top: 10px;
font-size: 10px;
}
.print-footer .copies span {
display: inline-block;
border: 1px solid #111;
width: 11px;
height: 11px;
margin-right: 4px;
vertical-align: -1px;
}
.print-footer .notes {
margin-top: 10px;
font-size: 9.5px;
line-height: 1.45;
}
.print-footer .notes b { font-size: 10px; }
.print-footer .notes p { margin: 2px 0; }
</style>
<div {{ $attributes->merge(['class' => 'print-footer']) }}>
@if($showCopies)
<div class="copies">
Salinan: <span></span> Kad Pengenalan &nbsp;&nbsp; <span></span> Akaun Bank/ Slip/ Penyata Bank
</div>
@endif
@if(trim($slot) !== '')
<div class="notes">
{{ $slot }}
</div>
@endif
</div>
@@ -1,101 +0,0 @@
@props([
'cawangan' => '',
'kodcaw' => '',
'alamat1' => '',
'alamat2' => '',
'notel' => '',
'tarikh' => '',
'norujukan' => '',
'rujukanLabel' => 'No. Rujukan SAG',
'showDummyBadge' => false,
])
<style>
.print-header {
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
align-items: start;
column-gap: 12px;
border-bottom: 2px solid #111;
padding-bottom: 8px;
font-family: Arial, Helvetica, sans-serif;
color: #111;
}
.print-header .org {
min-width: 0;
}
.print-header .org p {
margin: 0;
font-size: 10px;
line-height: 1.35;
}
.print-header .org .name {
font-size: 11px;
font-weight: bold;
}
.print-header .logos {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding-top: 2px;
}
.print-header .logos img {
display: block;
height: 40px;
width: auto;
max-width: 70px;
object-fit: contain;
}
.print-header .meta {
text-align: right;
font-size: 10px;
line-height: 1.4;
}
.print-header .meta .label { color: #444; }
.print-header .dummy-badge {
display: inline-block;
margin-top: 4px;
padding: 1px 6px;
border: 1px solid #c0392b;
color: #c0392b;
font-size: 9px;
font-weight: bold;
letter-spacing: 0.08em;
}
@media print {
.print-header .dummy-badge { display: none !important; }
}
</style>
<div {{ $attributes->merge(['class' => 'print-header']) }}>
<div class="org">
<p class="name">KOPERASI PERMODALAN KELANTAN BERHAD (D-5-0228)</p>
<p>Ar-Rahn {{ $cawangan }}</p>
<p>{{ $alamat1 }}</p>
<p>{{ $alamat2 }}</p>
<p>Tel: {{ $notel }}</p>
</div>
<div class="logos">
<img src="{{ asset('img/kopkb.png') }}" alt="KPKB">
<img src="{{ asset('img/logo-arrahn.jpeg') }}" alt="Ar-Rahn">
</div>
<div class="meta">
@if($kodcaw || $cawangan)
<div>
<span class="label">Cawangan</span><br>
<b>{{ trim(implode(' — ', array_filter([$kodcaw, $cawangan]))) }}</b>
</div>
@endif
@if($tarikh)
<div style="{{ ($kodcaw || $cawangan) ? 'margin-top:6px' : '' }}"><span class="label">Tarikh</span><br><b>{{ $tarikh }}</b></div>
@endif
@if($norujukan)
<div style="margin-top:6px"><span class="label">{{ $rujukanLabel }}</span><br><b>{{ $norujukan }}</b></div>
@endif
{{ $slot }}
@if($showDummyBadge)
<div class="dummy-badge">CONTOH SAHAJA</div>
@endif
</div>
</div>
@@ -1,25 +0,0 @@
<style>
.print-watermark {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
pointer-events: none;
z-index: 0;
}
.print-watermark img {
height: 160px;
max-width: 240px;
object-fit: contain;
opacity: 0.12;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
</style>
<div class="print-watermark" aria-hidden="true">
<img src="{{ asset('img/logo_kad.jpeg') }}" alt="">
<img src="{{ asset('img/logo-arrahn.jpeg') }}" alt="">
</div>
+5 -8
View File
@@ -210,17 +210,15 @@
<div class="modal fade" id="daftar_pelanggan_mykad_reader" tabindex="-1" data-backdrop="static" aria-labelledby="ModalLabel" aria-hidden="true"> <div class="modal fade" id="daftar_pelanggan_mykad_reader" tabindex="-1" data-backdrop="static" aria-labelledby="ModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg"> <div class="modal-dialog modal-lg">
<div class="modal-content"> <div class="modal-content">
<form id="form-mykad-reader" action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5> <h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="row form-group"> <div class="row form-group">
<div class="col-md-12 d-flex justify-content-center pb-3 d-none" id="photo-mykad-container"> <div class="col-md-12 d-flex justify-content-center pb-3 d-none" id="photo-mykad-container">
<img src="{{ asset('img/spinner-loader.gif') }}" alt="" id="photo-mykad" width="150" height="200" object-fit="cover"> <img src="{{ asset('img/spinner-loader.gif') }}" alt="" id="photo-mykad" width="150" height="200" object-fit="cover">
<input type="hidden" name="photo_base64" id="photo_base64" value="">
<input type="hidden" name="photo_mime" id="photo_mime" value="">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="row form-group"> <div class="row form-group">
@@ -475,7 +473,7 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var search = "<?php echo $search ?>"; var search = "<?php echo $search ?>";
var type_id = "<?php echo $idtype ?>"; var type_id = "<?php echo $idtype ?>";
var blacklist_search = "<?php echo $blacklist_search ?>"; var blacklist_search = "<?php echo $blacklist_search ?>";
@@ -813,8 +811,6 @@
function verifycustomerMyKadReader(){ function verifycustomerMyKadReader(){
copyMykadPhotoFromImage();
let myKadModal = $('#daftar_pelanggan_mykad_reader'); let myKadModal = $('#daftar_pelanggan_mykad_reader');
// Construct URLSearchParams object instance from current URL querystring. // Construct URLSearchParams object instance from current URL querystring.
@@ -1281,7 +1277,8 @@
let wakil_caricustomer_endpoint = "{{ route('wakil.caricustomer') }}"; let wakil_caricustomer_endpoint = "{{ route('wakil.caricustomer') }}";
let mykad_reader_driver_endpoint = "{{ route('mykadreader.driver') }}"; let mykad_reader_driver_endpoint = "{{ route('mykadreader.driver') }}";
</script> </script>
<script src="{{ asset('js/mykad-reader-customer.js') }}?v=4"></script> <script src="{{ asset('js/iris-mykad-websocket-client-api.js') }}"></script>
<script src="{{ asset('js/mykad-reader-customer.js') }}"></script>
<script src="{{ asset('js/postcode-concerns.js') }}"></script> <script src="{{ asset('js/postcode-concerns.js') }}"></script>
@endpush @endpush
+1 -17
View File
@@ -21,22 +21,6 @@
</ol> </ol>
</nav> </nav>
@if(session()->has('message'))
<div class="alert alert-success">{{ session('message') }}</div>
@endif
@if(!empty($customer_info['photo_base64']))
<div class="form-group row col-md-12">
<div class="col-md-12 d-flex justify-content-center pb-3">
<img src="data:{{ $customer_info['photo_mime'] ?? 'image/jpeg' }};base64,{{ $customer_info['photo_base64'] }}"
alt="Gambar MyKad"
width="120"
height="160"
style="object-fit: cover;">
</div>
</div>
@endif
<div class="form-group row col-md-12"> <div class="form-group row col-md-12">
<div class="col-md-6"> <div class="col-md-6">
<div class="form-group row"> <div class="form-group row">
@@ -438,7 +422,7 @@
<script> <script>
var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>"; var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>";
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}"; var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}"; var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
var min_komoditi = "{{ $min_komoditi }}"; var min_komoditi = "{{ $min_komoditi }}";
+11 -28
View File
@@ -102,7 +102,7 @@
<h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5> <h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form name="form-store" action="{{ route('customer.store') }}" onsubmit="verifycustomer()" method="POST"> <form action="{{ route('customer.store') }}" onsubmit="verifycustomer()" method="POST">
@csrf @csrf
<div class="row form-group"> <div class="row form-group">
<div class="col-md-6"> <div class="col-md-6">
@@ -229,17 +229,15 @@
<div class="modal fade" id="daftar_pelanggan_mykad_reader" tabindex="-1" data-backdrop="static" aria-labelledby="ModalLabel" aria-hidden="true"> <div class="modal fade" id="daftar_pelanggan_mykad_reader" tabindex="-1" data-backdrop="static" aria-labelledby="ModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg"> <div class="modal-dialog modal-lg">
<div class="modal-content"> <div class="modal-content">
<form id="form-mykad-reader" action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5> <h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form action="{{ route('customer.store') }}" onsubmit="verifycustomerMyKadReader()" method="POST">
@csrf
<div class="row form-group"> <div class="row form-group">
<div class="col-md-12 d-flex justify-content-center pb-3 d-none" id="photo-mykad-container"> <div class="col-md-12 d-flex justify-content-center pb-3 d-none" id="photo-mykad-container">
<img src="{{ asset('img/spinner-loader.gif') }}" alt="" id="photo-mykad" width="150" height="200" object-fit="cover"> <img src="{{ asset('img/spinner-loader.gif') }}" alt="" id="photo-mykad" width="150" height="200" object-fit="cover">
<input type="hidden" name="photo_base64" id="photo_base64" value="">
<input type="hidden" name="photo_mime" id="photo_mime" value="">
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="row form-group"> <div class="row form-group">
@@ -375,7 +373,7 @@
<h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5> <h5 class="modal-title" id="ModalLabel">Daftar Pelanggan</h5>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form name="form-store" action="{{ route('customer.store') }}" onsubmit="verifycustomerpassport()" method="POST"> <form action="{{ route('customer.store') }}" onsubmit="verifycustomerpassport()" method="POST">
@csrf @csrf
<div class="row form-group"> <div class="row form-group">
<div class="col-md-6"> <div class="col-md-6">
@@ -497,14 +495,15 @@
</div> </div>
<script> <script>
var api_url = @json($api_url ?? '');
var search = @json($search ?? false);
var type_id = @json($idtype ?? '');
var isAnggota = @json($isAnggota ?? false); var isAnggota = @json($isAnggota ?? false);
var isPelanggan = @json($isPelanggan ?? false); var isPelanggan = @json($isPelanggan ?? false);
var blacklist_search = @json($blacklist_search ?? false);
var showAssignAnggotaBtn = @json($showAssignAnggotaBtn ?? false); var showAssignAnggotaBtn = @json($showAssignAnggotaBtn ?? false);
var showDaftarPelangganBtn = @json($showDaftarPelangganBtn ?? 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(){ $(document).ready(function(){
// Datepicker // Datepicker
$('#passport_tarikh_lahir').datepicker({ $('#passport_tarikh_lahir').datepicker({
@@ -892,8 +891,6 @@
function verifycustomerMyKadReader(){ function verifycustomerMyKadReader(){
copyMykadPhotoFromImage();
let myKadModal = $('#daftar_pelanggan_mykad_reader'); let myKadModal = $('#daftar_pelanggan_mykad_reader');
// Construct URLSearchParams object instance from current URL querystring. // Construct URLSearchParams object instance from current URL querystring.
@@ -1395,21 +1392,6 @@
$('#pekerjaan-lain').val(''); $('#pekerjaan-lain').val('');
lainContainer.hide(); lainContainer.hide();
} }
});
document.getElementsByName('form-store')[0].addEventListener('keypress', function(e) {
// Jika tekan Enter
if (e.key === 'Enter') {
// Jika bukan butang submit dan bukan textarea
const tag = e.target.tagName.toLowerCase();
const type = e.target.type ? e.target.type.toLowerCase() : '';
if (tag !== 'textarea' && type !== 'submit') {
e.preventDefault();
return false;
}
}
}); });
</script> </script>
@push('additional_scripts') @push('additional_scripts')
@@ -1419,7 +1401,8 @@ document.getElementsByName('form-store')[0].addEventListener('keypress', functio
let wakil_caricustomer_endpoint = "{{ route('wakil.caricustomer') }}"; let wakil_caricustomer_endpoint = "{{ route('wakil.caricustomer') }}";
let mykad_reader_driver_endpoint = "{{ route('mykadreader.driver') }}"; let mykad_reader_driver_endpoint = "{{ route('mykadreader.driver') }}";
</script> </script>
<script src="{{ asset('js/mykad-reader-customer.js') }}?v=4"></script> <script src="{{ asset('js/iris-mykad-websocket-client-api.js') }}"></script>
<script src="{{ asset('js/mykad-reader-customer.js') }}"></script>
<script src="{{ asset('js/postcode-concerns.js') }}"></script> <script src="{{ asset('js/postcode-concerns.js') }}"></script>
@endpush @endpush
+140 -182
View File
@@ -22,22 +22,6 @@
</ol> </ol>
</nav> </nav>
@if(session()->has('message'))
<div class="alert alert-success">{{ session('message') }}</div>
@endif
@if(!empty($customer_info['photo_base64']))
<div class="form-group row col-md-12">
<div class="col-md-12 d-flex justify-content-center pb-3">
<img src="data:{{ $customer_info['photo_mime'] ?? 'image/jpeg' }};base64,{{ $customer_info['photo_base64'] }}"
alt="Gambar MyKad"
width="120"
height="160"
style="object-fit: cover;">
</div>
</div>
@endif
<div class="form-group row col-md-12"> <div class="form-group row col-md-12">
<div class="col-md-6"> <div class="col-md-6">
<div class="form-group row"> <div class="form-group row">
@@ -171,11 +155,6 @@
<i class="fas fa-info-circle me-1"></i> Maklumat Pelanggan <i class="fas fa-info-circle me-1"></i> Maklumat Pelanggan
</button> </button>
<button class="btn btn-info d-flex align-items-center" data-toggle="modal"
data-target="#export_maklumat_modal" style="margin-right: 12px;">
<i class="fas fa-print me-1"></i> Cetak Maklumat Pelanggan
</button>
<!-- Butang Assign Sebagai Anggota --> <!-- Butang Assign Sebagai Anggota -->
@@ -252,6 +231,7 @@
// 4️⃣ Hantar permohonan ke backend (Laravel) // 4️⃣ Hantar permohonan ke backend (Laravel)
const response = await fetch("{{ route('operasi.createkelulusan-anggota') }}", { const response = await fetch("{{ route('operasi.createkelulusan-anggota') }}", {
method: 'POST', method: 'POST',
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@@ -259,14 +239,15 @@
}, },
body: JSON.stringify({ body: JSON.stringify({
mohon: "Assign Anggota", mohon: "Assign Anggota",
nokp: noic, noic: noic,
norujukan: norujukan, norujukan: norujukan,
komen: komen, komen: komen,
teller: "{{ Auth::user()->name }}", teller: "{{ Auth::user()->name }}",
tagoperasi: 1 // 1 = tunggu kelulusan operasi tagoperasi: 1 // 1 = tunggu kelulusan operasi
}) })
console.log(`Response: ${response}`);
}); });
console.log(`Response: ${response}`);
const result = await response.json(); const result = await response.json();
@@ -368,7 +349,7 @@
</div> </div>
<div class="nav nav-tabs" id="nav-tab" role="tablist"> <div class="nav nav-tabs" id="nav-tab" role="tablist">
@php @php
$activate_tab = request()->session()->pull('activate_tab', 'SAG_baru'); $activate_tab = request()->session()->pull('activate_tab', 'SAG_lama');
$activate_tab_SAG_baru = $activate_tab === 'SAG_baru' ? 'active' : ''; $activate_tab_SAG_baru = $activate_tab === 'SAG_baru' ? 'active' : '';
$aria_selected_SAG_baru = $activate_tab === 'SAG_baru' ? 'true' : 'false'; $aria_selected_SAG_baru = $activate_tab === 'SAG_baru' ? 'true' : 'false';
@@ -387,41 +368,91 @@
</nav> </nav>
<div class="tab-content" id="navtawarruqdannottawarruq"> <div class="tab-content" id="navtawarruqdannottawarruq">
<div class="tab-pane fade {{ $activate_pane_SAG_baru }}" id="nav-tawarruq" role="tabpanel" aria-labelledby="nav-tawarruq-tab"> <div class="tab-pane fade {{ $activate_pane_SAG_baru }}" id="nav-tawarruq" role="tabpanel" aria-labelledby="nav-tawarruq-tab">
<x-datatable <table class="table table-striped table-hover" id="myTable">
id="myTable" <thead class="thead-dark">
filename="SAG_Baru" <tr>
:columns="['Bil', 'No Rujukan', 'Tarikh Pembiayaan', 'Tarikh Matang', 'Baki Harga Jualan', 'Baki Pembiayaan', 'Margin', 'Tempoh', 'Keuntungan', 'Lelong', 'Borang Online']" <th>Bil</th>
/> <th>No Rujukan</th>
<th>Tarikh Pembiayaan</th>
<th>Tarikh Matang</th>
<th>Baki Harga Jualan</th>
<th>Baki Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
<th>Keuntungan</th>
<th>Lelong</th>
</tr>
</thead>
</table>
</div> </div>
<div class="tab-pane fade {{ $activate_pane_SAG_lama }}" id="nav-xtawarruq" role="tabpanel" aria-labelledby="nav-xtawarruq-tab"> <div class="tab-pane fade {{ $activate_pane_SAG_lama }}" id="nav-xtawarruq" role="tabpanel" aria-labelledby="nav-xtawarruq-tab">
<x-datatable <table id="xtawarruq" class="table table-striped table-hover">
id="xtawarruq" <thead class="thead-dark">
filename="SAG_Lama" {{-- <tr>
:columns="['Bil', 'No Rujukan', 'Tarikh Pembiayaan', 'Tarikh Matang', 'Baki Harga Jualan', 'Baki Pembiayaan', 'Margin', 'Tempoh', 'Keuntungan', 'Lelong', 'Borang Online']" <th>Bil</th>
/> <th>No Rujukan</th>
<th>Tarikh Gadai</th>
<th>Tarikh Matang</th>
<th>Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
<th>Lelong</th>
</tr> --}}
<tr>
<th>Bil</th>
<th>No Rujukan</th>
<th>Tarikh Pembiayaan</th>
<th>Tarikh Matang</th>
<th>Baki Harga Jualan</th>
<th>Baki Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
<th>Keuntungan</th>
<th>Lelong</th>
</tr>
</thead>
</table>
</div> </div>
</div> </div>
{{-- Sudah Tebus --}} {{-- Sudah Tebus --}}
<x-datatable <table id="dahtebusTable" class="table table-striped table-hover">
id="dahtebusTable" <thead class="thead-dark">
filename="SAG_Sudah_Tebus" <tr>
:columns="['Bil', 'No Rujukan', 'Tarikh Penyelesaian Pembiayaan', 'Baki Pembiayaan', 'Margin', 'Tempoh']" <th>Bil</th>
/> <th>No Rujukan</th>
<th>Tarikh Penyelesaian Pembiayaan</th>
<th>Baki Pembiayaan</th>
<th>Margin</th>
<th>Tempoh</th>
</tr>
</thead>
</table>
<x-datatable <table id="lelongTable" class="table table-striped table-hover">
id="lelongTable" <thead class="thead-dark">
filename="SAG_Lelong" <tr>
:columns="['Bil', 'No Rujukan', 'Tarikh Lelong', 'Tarikh Tuntut', 'Pembiayaan', 'Harga Jual', 'Jum Tuntut/Bayar', 'Keuntungan', 'Caj Lelong', 'Status Tuntutan', 'Cetak']" <th>Bil</th>
/> <th>No Rujukan</th>
<th>Tarikh Lelong</th>
<th>Tarikh Tuntut</th>
<th>Pembiayaan</th>
<th>Harga Jual</th>
<th>Jum Tuntut/Bayar</th>
<th>Keuntungan</th>
<th>Caj Lelong</th>
<th>Status Tuntutan</th>
<th>Cetak</th>
</tr>
</thead>
</table>
<div class="text-center"> <div class="text-center">
<button class="btn btn-primary" onclick="ubahfunc(this)" id="button-edit-gadaian">Ubah</button> <button class="btn btn-primary" onclick="ubahfunc(this)" id="button-edit-gadaian">Ubah</button>
<button class="btn btn-primary" onclick="hapusfunc()">Hapus</button> <button class="btn btn-primary" onclick="hapusfunc()">Hapus</button>
<button class="btn btn-primary" onclick="histfunc()">Rekod Pembiayaan</button> <button class="btn btn-primary" onclick="histfunc()">Rekod Pembiayaan</button>
<button class="btn btn-primary" onclick="removeansuran(this)" id="button-remove-ansuran">Hapus Ansuran</button> <button class="btn btn-primary" onclick="removeansuran(this)" id="button-remove-ansuran">Hapus Ansuran</button>
<button class="btn btn-info" type="button" onclick="cetakBorangOnlineSelected()">Cetak Borang Online</button>
</div> </div>
</div> </div>
@@ -640,33 +671,6 @@
</div> </div>
</div> </div>
<div class="modal fade" id="export_maklumat_modal" tabindex="-1" aria-labelledby="export_maklumat_modalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered" style="max-width: 920px;">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="export_maklumat_modalLabel">Eksport Maklumat Pelanggan</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body p-0" style="height: 80vh; background: #e8eaed;">
<iframe id="export_maklumat_iframe"
src="about:blank"
title="Maklumat Pelanggan"
style="width: 100%; height: 100%; border: 0;"></iframe>
</div>
</div>
</div>
</div>
<script>
$('#export_maklumat_modal').on('show.bs.modal', function () {
$('#export_maklumat_iframe').attr('src', '{{ route('customer.print.maklumat', ['noic' => $noic]) }}');
});
$('#export_maklumat_modal').on('hidden.bs.modal', function () {
$('#export_maklumat_iframe').attr('src', 'about:blank');
});
</script>
<div class="modal fade" id="opt_modal" tabindex="-1" aria-labelledby="opt_modalLabel" aria-hidden="true"> <div class="modal fade" id="opt_modal" tabindex="-1" aria-labelledby="opt_modalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg"> <div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content"> <div class="modal-content">
@@ -711,94 +715,90 @@
</div> </div>
</div> </div>
<script> <script>
var api_arrahnbid = "<?php echo config('app.api_arrahnbid') ?>"; var api_arrahnbid = "<?php echo config('app.api_arrahnbid'); ?>";
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url; ?>";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}"; var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}"; var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
var min_komoditi = "{{ $min_komoditi }}"; var min_komoditi = "{{ $min_komoditi }}";
$('#daftar_gadai').on('click', function() { $('#daftar_gadai').on('click', function() {
$("#daftar_gadai").prop('disabled', true); $("#daftar_gadai").prop('disabled', true);
var noic = $('#noic').val(); var noic = $('#noic').val();
var iclama = "{{ $customer_info['kplama'] }}"; var iclama = "{{ $customer_info['kplama'] }}";
var icbaru = "{{ $customer_info['kpbaru'] }}"; var icbaru = "{{ $customer_info['kpbaru'] }}";
var outstanding_semasa = "{{ $outstanding_semasa }}"; 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(); event.preventDefault();
return false; if (outstanding_semasa >= 300000) {
} else { Swal.fire({
$.ajax({ icon: 'error',
method: 'get', title: 'Had Pembiayaan',
url: api_url + '/api/komuditi/check', text: 'Outstanding Pembiayaan Pelanggan Telah Melebihi Had'
success: function(data) { });
var check_komuditi = Object.keys(data).length; $("#daftar_gadai").prop('disabled', false);
if (check_komuditi == 0) { event.preventDefault();
Swal.fire({ return false;
icon: 'error', } else {
title: 'Unit Komoditi Berbaki Minima', $.ajax({
text: 'Sila Hubungi Operasi Untuk Membuat Pembelian Komoditi' method: 'get',
}); url: api_url + '/api/komuditi/check',
$("#daftar_gadai").prop('disabled', false); success: function(data) {
event.preventDefault(); var check_komuditi = Object.keys(data).length;
return false; if (check_komuditi == 0) {
} else {
if (Number(data['unit_komuditi']) <= min_komoditi) {
$("#daftar_gadai").prop('disabled', false);
Swal.fire({ Swal.fire({
icon: 'error', icon: 'error',
title: 'Unit Komoditi Berbaki Minima', title: 'Unit Komoditi Berbaki Minima',
text: 'Sila Hubungi Operasi Untuk Membuat Pembelian Komoditi' text: 'Sila Hubungi Operasi Untuk Membuat Pembelian Komoditi'
}); });
$("#daftar_gadai").prop('disabled', false);
event.preventDefault(); event.preventDefault();
return false; return false;
} else { } else {
if (icbaru.length > 0) { if (Number(data['unit_komuditi']) <= min_komoditi) {
window.location.href = $("#daftar_gadai").prop('disabled', false);
"{{ route('gadaian', ['noic' => $customer_info['kpbaru']]) }}"; Swal.fire({
icon: 'error',
title: 'Unit Komoditi Berbaki Minima',
text: 'Sila Hubungi Operasi Untuk Membuat Pembelian Komoditi'
});
event.preventDefault();
return false;
} else { } else {
window.location.href = if (icbaru.length > 0) {
"{{ route('gadaian', ['noic' => $customer_info['kplama']]) }}"; window.location.href =
"{{ route('gadaian', ['noic' => $customer_info['kpbaru']]) }}";
} else {
window.location.href =
"{{ route('gadaian', ['noic' => $customer_info['kplama']]) }}";
}
} }
} }
} }
} });
});
}
});
$('a[data-toggle="tab"]').on('shown.bs.tab', function () {
if (typeof adjustErahnDatatables === 'function') {
adjustErahnDatatables();
} }
}); });
var tablegadai = initErahnDatatable('#myTable', { $('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
order: [[1, 'desc']], // here is the new selected tab id
columnDefs: [ var selectedTabId = e.target.id;
{ targets: 0, orderable: false, width: '40px' },
{ targets: -1, orderable: false, searchable: false, width: '70px' } });
var tablegadai = $('#myTable').DataTable({
"scrollX": false,
order: [
[1, 'desc']
] ]
}); });
var xtawarruq = initErahnDatatable('#xtawarruq', { var xtawarruq = $('#xtawarruq').DataTable({
columnDefs: [ "scrollX": false
{ targets: 0, orderable: false, width: '40px' }
]
}); });
var tabledahtebus = initErahnDatatable('#dahtebusTable'); var tabledahtebus = $('#dahtebusTable').DataTable({});
var tablelelong = initErahnDatatable('#lelongTable', { var tablelelong = $('#lelongTable').DataTable({
columnDefs: [ "scrollX": false
{ targets: -1, orderable: false, searchable: false, width: '80px' }
]
}); });
var historybayarandatatable = $('#tablehistorybayaran').DataTable({ var historybayarandatatable = $('#tablehistorybayaran').DataTable({
@@ -813,41 +813,6 @@
minimumFractionDigits: 2 minimumFractionDigits: 2
}); });
function urlBorangOnline(norujukan) {
return '{{ url("/gadai/borang-pengesahan-online") }}/' + encodeURIComponent(norujukan);
}
function cetakBorangOnlineCell(gadai_detail) {
var cara = String(gadai_detail['cara_terima'] || '').toUpperCase();
if (cara !== 'ONLINE') {
return '';
}
return '<a class="btn btn-sm btn-info" href="' + urlBorangOnline(gadai_detail['norujukan']) +
'" target="_blank" title="Cetak borang pengesahan online"><i class="fas fa-print"></i></a>';
}
function cetakBorangOnlineSelected() {
var selected = $('input[name="belum"]:checked');
if (!selected.length) {
Swal.fire({
icon: 'warning',
title: 'Sila pilih SAG',
text: 'Pilih pembiayaan untuk cetak borang pengesahan.'
});
return;
}
var cara = String(selected.data('cara-terima') || '').toUpperCase();
if (cara !== 'ONLINE') {
Swal.fire({
icon: 'info',
title: 'Bukan pembiayaan online',
text: 'Borang ini hanya untuk SAG yang terima pembiayaan secara online.'
});
return;
}
window.open(urlBorangOnline(selected.val()), '_blank');
}
function getGadaiByNorujukan(norujukan) { function getGadaiByNorujukan(norujukan) {
console.log(norujukan); console.log(norujukan);
let gadai_tawarruq = fetch(api_url + '/api/gadai/norujukan/' + norujukan); let gadai_tawarruq = fetch(api_url + '/api/gadai/norujukan/' + norujukan);
@@ -1249,8 +1214,8 @@
let table_norujukan = gadai_detail["norujukan"]; let table_norujukan = gadai_detail["norujukan"];
tablegadai.row.add([ tablegadai.row.add([
'<input type="radio" value="' + gadai_detail["norujukan"] + '<input type="radio" value=' + gadai_detail["norujukan"] +
'" name="belum" data-cara-terima="' + (gadai_detail['cara_terima'] || '') + '"/>', ' name="belum"/>',
'<a href="#" onclick="checkserah(this)" data-pinjaman=' + '<a href="#" onclick="checkserah(this)" data-pinjaman=' +
gadai_detail['pinjaman'] + ' data-hargajualan=' + gadai_detail['pinjaman'] + ' data-hargajualan=' +
gadai_detail['hargajualan'] + ' data-norujukan=' + gadai_detail['hargajualan'] + ' data-norujukan=' +
@@ -1267,7 +1232,6 @@
'RM ' + formatter.format(upahsemasa['pendapatan']), 'RM ' + formatter.format(upahsemasa['pendapatan']),
'<div style="white-space: nowrap; color:red; font-weight: bolder">' + '<div style="white-space: nowrap; color:red; font-weight: bolder">' +
taglel + '</div>', taglel + '</div>',
cetakBorangOnlineCell(gadai_detail),
]).draw(); ]).draw();
} }
} else if (jenistebus == "sudah_tebus") { } else if (jenistebus == "sudah_tebus") {
@@ -1587,9 +1551,6 @@
success: function(data) { success: function(data) {
$('#myTable').parents('div.dataTables_wrapper').first().show(); $('#myTable').parents('div.dataTables_wrapper').first().show();
gadaiTable(data, "belum_tebus"); gadaiTable(data, "belum_tebus");
if (typeof adjustErahnDatatables === 'function') {
adjustErahnDatatables();
}
} }
}); });
@@ -2846,9 +2807,6 @@
url: api_url + "/api/customers/" + noic + "/gadai/belum_tebus/" + kodcaw, url: api_url + "/api/customers/" + noic + "/gadai/belum_tebus/" + kodcaw,
success: function(data) { success: function(data) {
gadaiTable(data, "belum_tebus"); gadaiTable(data, "belum_tebus");
if (typeof adjustErahnDatatables === 'function') {
adjustErahnDatatables();
}
} }
}); });
} }
@@ -1,354 +0,0 @@
<!DOCTYPE html>
<html lang="ms">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Dummy Borang Kelulusan Batch Pembiayaan Online</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
background: #e8eaed;
font-family: Arial, Helvetica, sans-serif;
color: #111;
}
.toolbar {
position: sticky;
top: 0;
z-index: 10;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 16px;
background: #1f3a5f;
color: #fff;
font-size: 13px;
}
.toolbar b { letter-spacing: 0.04em; }
.toolbar .hint { opacity: 0.85; }
.toolbar button {
border: 0;
background: #fff;
color: #1f3a5f;
font-weight: bold;
padding: 8px 16px;
cursor: pointer;
border-radius: 3px;
}
.sheet-wrap {
padding: 24px 0 48px;
}
.sheet {
width: 210mm;
min-height: 297mm;
margin: 0 auto;
background: #fff;
padding: 14mm 12mm 16mm;
box-shadow: 0 2px 12px rgba(0,0,0,.18);
}
.title {
text-align: center;
margin: 14px 0 4px;
}
.title h1 {
margin: 0;
font-size: 14px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.title p {
margin: 4px 0 0;
font-size: 10px;
color: #333;
}
.section {
margin-top: 12px;
}
.section-title {
font-size: 11px;
font-weight: bold;
background: #eef1f4;
border: 1px solid #111;
border-bottom: 0;
padding: 5px 8px;
text-transform: uppercase;
}
table.fields {
width: 100%;
border-collapse: collapse;
font-size: 11px;
}
table.fields th,
table.fields td {
border: 1px solid #111;
padding: 6px 8px;
vertical-align: top;
text-align: left;
}
table.fields th {
width: 22%;
font-weight: normal;
background: #fafbfc;
color: #222;
}
table.fields td.amt {
font-size: 14px;
font-weight: bold;
letter-spacing: 0.02em;
}
table.lines {
width: 100%;
border-collapse: collapse;
font-size: 9.5px;
}
table.lines th,
table.lines td {
border: 1px solid #111;
padding: 4px 5px;
vertical-align: top;
}
table.lines thead th {
background: #eef1f4;
font-weight: bold;
text-align: center;
text-transform: uppercase;
font-size: 8.5px;
letter-spacing: 0.02em;
}
table.lines td.num { text-align: center; }
table.lines td.amt { text-align: right; white-space: nowrap; }
table.lines tfoot td {
font-weight: bold;
background: #fafbfc;
}
.akuan {
font-size: 11px;
line-height: 1.55;
border: 1px solid #111;
padding: 10px 12px;
}
.akuan ol {
margin: 6px 0 0;
padding-left: 18px;
}
.akuan li { margin-bottom: 4px; }
.signs {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-top: 16px;
}
.sign-box {
border: 1px solid #111;
min-height: 160px;
padding: 8px 10px;
font-size: 10px;
}
.sign-box .role {
font-weight: bold;
text-align: center;
text-transform: uppercase;
border-bottom: 1px solid #ccc;
padding-bottom: 4px;
margin-bottom: 8px;
}
.sign-line {
margin-top: 72px;
border-top: 1px solid #111;
padding-top: 6px;
}
.sign-line p { margin: 2px 0; }
@page {
size: A4;
margin: 10mm;
}
@media print {
body { background: #fff; }
.toolbar { display: none !important; }
.sheet-wrap { padding: 0; }
.sheet {
width: auto;
min-height: 0;
margin: 0;
padding: 0;
box-shadow: none;
}
}
</style>
</head>
<body>
@php
$cawangan = 'KOTA BHARU 2';
$kodcaw = 'KB2';
$alamat1 = 'Lot 123, Jalan Sultan Yahya Petra';
$alamat2 = '15200 Kota Bharu, Kelantan';
$notel = '09-123 4567';
$tarikh = '03/09/2026';
$batchNo = 'KB2-PO-20260903-B1-001';
$slot = 'BATCH1';
$status = 'SUBMITTED';
$dihantarOleh = 'NUR AINA BINTI HASSAN';
$dihantarPada = '03/09/2026 10:42';
$opsBy = 'MOHD FAIZ BIN ISMAIL';
$lines = [
['norujukan' => 'KB2-260903-0001', 'nama' => 'AHMAD BIN ABDULLAH', 'nokp' => '900101-03-1234', 'bank' => 'MAYBANK', 'noakaun' => '123456789012', 'nama_akaun' => 'AHMAD BIN ABDULLAH', 'pinjaman' => 15000.00],
['norujukan' => 'KB2-260903-0004', 'nama' => 'SITI MARIAM BINTI YUSOF', 'nokp' => '850215-03-5678', 'bank' => 'CIMB', 'noakaun' => '800123456789', 'nama_akaun' => 'SITI MARIAM BINTI YUSOF', 'pinjaman' => 8200.50],
['norujukan' => 'KB2-260903-0007', 'nama' => 'MOHD RAZAK BIN ALI', 'nokp' => '780930-03-1122', 'bank' => 'BANK ISLAM', 'noakaun' => '140234567890', 'nama_akaun' => 'MOHD RAZAK BIN ALI', 'pinjaman' => 5000.00],
['norujukan' => 'KB2-260903-0010', 'nama' => 'FATIMAH BINTI OMAR', 'nokp' => '920408-03-3344', 'bank' => 'RHB', 'noakaun' => '212345678901', 'nama_akaun' => 'FATIMAH BINTI OMAR', 'pinjaman' => 12500.00],
['norujukan' => 'KB2-260903-0012', 'nama' => 'HASSAN BIN IBRAHIM', 'nokp' => '700112-03-5566', 'bank' => 'MAYBANK', 'noakaun' => '156789012345', 'nama_akaun' => 'HASSAN BIN IBRAHIM', 'pinjaman' => 3400.00],
];
$jumlah = array_sum(array_column($lines, 'pinjaman'));
@endphp
<div class="toolbar">
<div>
<b>DUMMY FORM</b>
<span class="hint"> reka bentuk borang kelulusan batch pembiayaan online (Operasi). Data ini contoh sahaja.</span>
</div>
<button type="button" onclick="window.print()">Cetak / Pratinjau</button>
</div>
<div class="sheet-wrap">
<div class="sheet">
<x-print.header
:cawangan="$cawangan"
:kodcaw="$kodcaw"
:alamat1="$alamat1"
:alamat2="$alamat2"
:notel="$notel"
:tarikh="$tarikh"
:norujukan="$batchNo"
rujukan-label="No. Batch"
:show-dummy-badge="true"
/>
<div class="title">
<h1>Borang Kelulusan Pembiayaan Online<br>Senarai Batch Pembayaran</h1>
<p>Untuk semakan Operasi dan kelulusan Pengurus Besar. Bukan untuk tandatangan pelanggan.</p>
</div>
<div class="section">
<div class="section-title">A. Maklumat Batch</div>
<table class="fields">
<tr>
<th>No. Batch</th>
<td>{{ $batchNo }}</td>
<th>Cawangan</th>
<td>{{ $kodcaw }} {{ $cawangan }}</td>
</tr>
<tr>
<th>Tarikh / Slot</th>
<td>{{ $tarikh }} &nbsp;·&nbsp; {{ $slot }}</td>
<th>Status Batch</th>
<td>{{ $status }}</td>
</tr>
<tr>
<th>Dihantar Oleh (PC)</th>
<td>{{ $dihantarOleh }}</td>
<th>Dihantar Pada</th>
<td>{{ $dihantarPada }}</td>
</tr>
<tr>
<th>Bilangan Rekod</th>
<td>{{ count($lines) }}</td>
<th>Jumlah Keseluruhan</th>
<td class="amt">RM {{ number_format($jumlah, 2) }}</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">B. Senarai Penerima Dalam Batch</div>
<table class="lines">
<thead>
<tr>
<th style="width:4%">Bil</th>
<th style="width:14%">No. SAG</th>
<th>Pelanggan</th>
<th style="width:13%">No. KP</th>
<th style="width:11%">Bank</th>
<th style="width:13%">No. Akaun</th>
<th>Nama Akaun</th>
<th style="width:12%">Pinjaman (RM)</th>
</tr>
</thead>
<tbody>
@foreach($lines as $i => $line)
<tr>
<td class="num">{{ $i + 1 }}</td>
<td class="num">{{ $line['norujukan'] }}</td>
<td>{{ $line['nama'] }}</td>
<td class="num">{{ $line['nokp'] }}</td>
<td>{{ $line['bank'] }}</td>
<td class="num">{{ $line['noakaun'] }}</td>
<td>{{ $line['nama_akaun'] }}</td>
<td class="amt">{{ number_format($line['pinjaman'], 2) }}</td>
</tr>
@endforeach
</tbody>
<tfoot>
<tr>
<td colspan="7" style="text-align:right">JUMLAH</td>
<td class="amt">{{ number_format($jumlah, 2) }}</td>
</tr>
</tfoot>
</table>
</div>
<div class="section">
<div class="section-title">C. Pengesahan Operasi</div>
<div class="akuan">
Dengan ini disahkan bahawa senarai di Bahagian B telah disemak dan amaun pembiayaan
sebanyak <b>RM {{ number_format($jumlah, 2) }}</b> ({{ count($lines) }} rekod)
bagi batch <b>{{ $batchNo }}</b> cawangan <b>{{ $cawangan }}</b> adalah lengkap
untuk proses pembayaran ke akaun bank pelanggan.
<ol>
<li>Maklumat SAG, nama, no. KP, bank dan no. akaun telah disemak terhadap rekod sistem.</li>
<li>Pembayaran akan dikreditkan ke akaun penerima seperti senarai, bukan tunai di kaunter.</li>
<li>Sebarang ralat akaun yang dikesan selepas kelulusan hendaklah dilaporkan serta-merta.</li>
</ol>
</div>
</div>
<div class="signs">
<div class="sign-box">
<div class="role">Tandatangan Operasi</div>
<div class="sign-line">
<p>Nama: {{ $opsBy }}</p>
<p>Jawatan: Operasi</p>
<p>Tarikh: {{ $tarikh }}</p>
</div>
</div>
<div class="sign-box">
<div class="role">Pengurus Besar</div>
<div class="sign-line">
<p>Nama:</p>
<p>Cop / Paraf:</p>
<p>Tarikh:</p>
</div>
</div>
</div>
<x-print.footer :show-copies="false">
<b>Nota:</b>
<p>1. Borang ini dicetak dari skrin Operasi Pembiayaan Online (Batch) untuk kelulusan pembayaran.</p>
<p>2. Hanya dua tandatangan diperlukan: Operasi dan Pengurus Besar.</p>
<p>3. Simpan salinan bersama bukti pindahan bank selepas status PAID.</p>
</x-print.footer>
</div>
</div>
</body>
</html>
@@ -1,322 +0,0 @@
<!DOCTYPE html>
<html lang="ms">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Dummy Borang Pengesahan Pembiayaan Online</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
background: #e8eaed;
font-family: Arial, Helvetica, sans-serif;
color: #111;
}
.toolbar {
position: sticky;
top: 0;
z-index: 10;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 16px;
background: #1f3a5f;
color: #fff;
font-size: 13px;
}
.toolbar b { letter-spacing: 0.04em; }
.toolbar .hint { opacity: 0.85; }
.toolbar button {
border: 0;
background: #fff;
color: #1f3a5f;
font-weight: bold;
padding: 8px 16px;
cursor: pointer;
border-radius: 3px;
}
.sheet-wrap {
padding: 24px 0 48px;
}
.sheet {
width: 210mm;
min-height: 297mm;
margin: 0 auto;
background: #fff;
padding: 14mm 14mm 16mm;
box-shadow: 0 2px 12px rgba(0,0,0,.18);
}
.title {
text-align: center;
margin: 14px 0 4px;
}
.title h1 {
margin: 0;
font-size: 14px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.title p {
margin: 4px 0 0;
font-size: 10px;
color: #333;
}
.section {
margin-top: 12px;
}
.section-title {
font-size: 11px;
font-weight: bold;
background: #eef1f4;
border: 1px solid #111;
border-bottom: 0;
padding: 5px 8px;
text-transform: uppercase;
}
table.fields {
width: 100%;
border-collapse: collapse;
font-size: 11px;
}
table.fields th,
table.fields td {
border: 1px solid #111;
padding: 6px 8px;
vertical-align: top;
text-align: left;
}
table.fields th {
width: 28%;
font-weight: normal;
background: #fafbfc;
color: #222;
}
table.fields td.amt {
font-size: 16px;
font-weight: bold;
letter-spacing: 0.02em;
}
.akuan {
font-size: 11px;
line-height: 1.55;
border: 1px solid #111;
padding: 10px 12px;
}
.akuan ol {
margin: 6px 0 0;
padding-left: 18px;
}
.akuan li { margin-bottom: 4px; }
.signs {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
margin-top: 16px;
}
.sign-box {
border: 1px solid #111;
min-height: 150px;
padding: 8px;
font-size: 10px;
}
.sign-box .role {
font-weight: bold;
text-align: center;
text-transform: uppercase;
border-bottom: 1px solid #ccc;
padding-bottom: 4px;
margin-bottom: 8px;
}
.sign-line {
margin-top: 62px;
border-top: 1px solid #111;
padding-top: 6px;
}
.sign-line p { margin: 2px 0; }
@page {
size: A4;
margin: 10mm;
}
@media print {
body { background: #fff; }
.toolbar { display: none !important; }
.sheet-wrap { padding: 0; }
.sheet {
width: auto;
min-height: 0;
margin: 0;
padding: 0;
box-shadow: none;
}
}
</style>
</head>
<body>
@php
// Dummy data — replace later with real gadai / customer / bank values
$cawangan = 'KOTA BHARU 2';
$kodcaw = 'KB2';
$alamat1 = 'Lot 123, Jalan Sultan Yahya Petra';
$alamat2 = '15200 Kota Bharu, Kelantan';
$notel = '09-123 4567';
$norujukan = 'KB2-260903-0001';
$tarikh = '03/09/2026';
$teller = 'SITI AMINAH BINTI ALI';
$nama = 'AHMAD BIN ABDULLAH';
$nokp = '900101-03-1234';
$nopelanggan = 'KB2001234';
$telefon = '012-3456789';
$pinjaman = '15,000.00';
$bank = 'Malayan Banking Berhad (MAYBANK)';
$noakaun = '123456789012';
$nama_akaun = 'AHMAD BIN ABDULLAH';
@endphp
<div class="toolbar">
<div>
<b>DUMMY FORM</b>
<span class="hint"> reka bentuk borang pengesahan pembiayaan online. Data ini contoh sahaja.</span>
</div>
<button type="button" onclick="window.print()">Cetak / Pratinjau</button>
</div>
<div class="sheet-wrap">
<div class="sheet">
<x-print.header
:cawangan="$cawangan"
:kodcaw="$kodcaw"
:alamat1="$alamat1"
:alamat2="$alamat2"
:notel="$notel"
:tarikh="$tarikh"
:show-dummy-badge="true"
/>
<div class="title">
<h1>Borang Pengesahan Penerimaan Pembiayaan<br>Secara Online (Akaun Bank)</h1>
<p>Untuk diisi dan ditandatangani oleh pelanggan semasa transaksi gadai.</p>
</div>
<div class="section">
<div class="section-title">A. Maklumat Pelanggan</div>
<table class="fields">
<tr>
<th>Nama Pelanggan</th>
<td colspan="3">{{ $nama }}</td>
</tr>
<tr>
<th>No. MyKad / Passport</th>
<td>{{ $nokp }}</td>
<th style="width:22%">No. Pelanggan</th>
<td>{{ $nopelanggan }}</td>
</tr>
<tr>
<th>No. Telefon</th>
<td>{{ $telefon }}</td>
<th>Cawangan</th>
<td>{{ $cawangan }}</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">B. Maklumat Pembiayaan</div>
<table class="fields">
<tr>
<th>No. Surat Akuan Gadai</th>
<td>{{ $norujukan }}</td>
</tr>
<tr>
<th>Amaun Pembiayaan</th>
<td class="amt">RM {{ $pinjaman }}</td>
</tr>
<tr>
<th>Cara Terima Pembiayaan</th>
<td>Online (kredit ke akaun bank) bukan tunai</td>
</tr>
<tr>
<th>Teller</th>
<td>{{ $teller }}</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">C. Maklumat Akaun Bank Penerima</div>
<table class="fields">
<tr>
<th>Nama Bank</th>
<td>{{ $bank }}</td>
</tr>
<tr>
<th>No. Akaun</th>
<td>{{ $noakaun }}</td>
</tr>
<tr>
<th>Nama Pemegang Akaun</th>
<td>{{ $nama_akaun }}</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">D. Akuan Pelanggan</div>
<div class="akuan">
Saya, <b>{{ $nama }}</b> (No. KP: <b>{{ $nokp }}</b>), dengan ini mengesahkan bahawa:
<ol>
<li>Maklumat akaun bank di Bahagian C adalah benar, tepat, dan milik saya sendiri.</li>
<li>Saya memohon supaya amaun pembiayaan gadai sebanyak <b>RM {{ $pinjaman }}</b> dikreditkan ke akaun tersebut dan <b>bukan</b> diterima secara tunai.</li>
<li>Saya faham kredit ke akaun tertakluk kepada semakan Pengurus Cawangan dan proses pembayaran pihak Koperasi.</li>
<li>Saya bertanggungjawab sepenuhnya jika maklumat akaun tidak tepat, dan tidak akan menuntut ganti rugi atas kelewatan atau ralat yang berpunca daripadanya.</li>
</ol>
</div>
</div>
<div class="signs">
<div class="sign-box">
<div class="role">Tandatangan Pelanggan</div>
<div class="sign-line">
<p>Nama: {{ $nama }}</p>
<p>No. KP: {{ $nokp }}</p>
<p>Tarikh: {{ $tarikh }}</p>
</div>
</div>
<div class="sign-box">
<div class="role">Tandatangan Teller</div>
<div class="sign-line">
<p>Nama: {{ $teller }}</p>
<p>Cop / Paraf:</p>
<p>Tarikh: {{ $tarikh }}</p>
</div>
</div>
<div class="sign-box">
<div class="role">Pengurus Cawangan</div>
<div class="sign-line">
<p>Nama:</p>
<p>Cop cawangan:</p>
<p>Tarikh:</p>
</div>
</div>
</div>
<x-print.footer>
<b>Nota:</b>
<p>1. Borang ini dicetak semasa pelanggan memilih cara terima pembiayaan secara Online.</p>
<p>2. Pembiayaan akan dikreditkan ke akaun selepas semakan PC. Pelanggan tidak menerima wang tunai di kaunter.</p>
<p>3. Sila pastikan nama pemegang akaun sepadan dengan nama pelanggan pada MyKad.</p>
</x-print.footer>
</div>
</div>
</body>
</html>
@@ -1,292 +0,0 @@
<!DOCTYPE html>
<html lang="ms">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Dummy Maklumat Pelanggan</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
background: #e8eaed;
font-family: Arial, Helvetica, sans-serif;
color: #111;
}
.toolbar {
position: sticky;
top: 0;
z-index: 10;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 16px;
background: #1f3a5f;
color: #fff;
font-size: 13px;
}
.toolbar b { letter-spacing: 0.04em; }
.toolbar .hint { opacity: 0.85; }
.toolbar button {
border: 0;
background: #fff;
color: #1f3a5f;
font-weight: bold;
padding: 8px 16px;
cursor: pointer;
border-radius: 3px;
}
.sheet-wrap {
padding: 24px 0 48px;
}
.sheet {
width: 210mm;
min-height: 297mm;
margin: 0 auto;
background: #fff;
padding: 14mm 14mm 16mm;
box-shadow: 0 2px 12px rgba(0,0,0,.18);
}
.title {
text-align: center;
margin: 14px 0 4px;
}
.title h1 {
margin: 0;
font-size: 14px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.title p {
margin: 4px 0 0;
font-size: 10px;
color: #333;
}
.identity {
display: grid;
grid-template-columns: minmax(0, 1fr) 32mm;
gap: 12px;
align-items: start;
margin-top: 12px;
}
.photo-box {
width: 32mm;
text-align: center;
}
.photo-box img {
display: block;
width: 32mm;
height: 42mm;
object-fit: cover;
border: 1px solid #111;
background: #eef1f4;
}
.photo-box .caption {
margin-top: 4px;
font-size: 8.5px;
color: #444;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.section {
margin-top: 12px;
}
.section-title {
font-size: 11px;
font-weight: bold;
background: #eef1f4;
border: 1px solid #111;
border-bottom: 0;
padding: 5px 8px;
text-transform: uppercase;
}
table.fields {
width: 100%;
border-collapse: collapse;
font-size: 11px;
}
table.fields th,
table.fields td {
border: 1px solid #111;
padding: 6px 8px;
vertical-align: top;
text-align: left;
}
table.fields th {
width: 28%;
font-weight: normal;
background: #fafbfc;
color: #222;
}
@page {
size: A4;
margin: 10mm;
}
@media print {
body { background: #fff; }
.toolbar { display: none !important; }
.sheet-wrap { padding: 0; }
.sheet {
width: auto;
min-height: 0;
margin: 0;
padding: 0;
box-shadow: none;
}
}
</style>
</head>
<body>
@php
$cawangan = 'KOTA BHARU 2';
$kodcaw = 'KB2';
$alamat1 = 'Lot 123, Jalan Sultan Yahya Petra';
$alamat2 = '15200 Kota Bharu, Kelantan';
$notel = '09-123 4567';
$tarikh = now()->format('d/m/Y');
$nama = 'AHMAD BIN ABDULLAH';
$nokp = '900101-03-1234';
$nopelanggan = 'KB2001234';
$telefon = '012-3456789';
$telefon2 = '09-765 4321';
$alamat = 'Lot 45, Kampung Sireh';
$poskod = '15050';
$daerah = 'Kota Bharu';
$negeri = 'Kelantan';
$bank = 'Malayan Banking Berhad (MAYBANK)';
$noakaun = '123456789012';
$pekerjaan = 'Kakitangan Kerajaan';
$nota = 'Pelanggan tetap cawangan KB2.';
$status = 'Anggota Koperasi';
$photo_svg = '<svg xmlns="http://www.w3.org/2000/svg" width="240" height="320" viewBox="0 0 240 320">'
. '<rect fill="#d9dee5" width="240" height="320"/>'
. '<circle cx="120" cy="118" r="52" fill="#8b949e"/>'
. '<ellipse cx="120" cy="286" rx="90" ry="92" fill="#8b949e"/>'
. '</svg>';
$photo_src = 'data:image/svg+xml;base64,' . base64_encode($photo_svg);
@endphp
<div class="toolbar">
<div>
<b>DUMMY FORM</b>
<span class="hint"> reka bentuk cetakan A4 maklumat pelanggan. Data ini contoh sahaja.</span>
</div>
<button type="button" onclick="window.print()">Cetak / Pratinjau</button>
</div>
<div class="sheet-wrap">
<div class="sheet">
<x-print.header
:cawangan="$cawangan"
:kodcaw="$kodcaw"
:alamat1="$alamat1"
:alamat2="$alamat2"
:notel="$notel"
:tarikh="$tarikh"
:norujukan="$nopelanggan"
rujukan-label="No. Pelanggan"
:show-dummy-badge="true"
/>
<div class="title">
<h1>Maklumat Pelanggan</h1>
<p>Salinan maklumat pengenalan diri pelanggan untuk rujukan cawangan.</p>
</div>
<div class="identity">
<div>
<div class="section-title">A. Pengenalan Diri</div>
<table class="fields">
<tr>
<th>Nama</th>
<td>{{ $nama }}</td>
</tr>
<tr>
<th>No. Kad Pengenalan</th>
<td>{{ $nokp }}</td>
</tr>
<tr>
<th>No. Pelanggan</th>
<td>{{ $nopelanggan }}</td>
</tr>
<tr>
<th>Status</th>
<td>{{ $status }}</td>
</tr>
</table>
</div>
<div class="photo-box">
<img src="{{ $photo_src }}" alt="Gambar MyKad">
<div class="caption">Gambar MyKad</div>
</div>
</div>
<div class="section">
<div class="section-title">B. Maklumat Hubungan &amp; Alamat</div>
<table class="fields">
<tr>
<th>No. Telefon 1</th>
<td>{{ $telefon }}</td>
<th style="width:22%">No. Telefon 2</th>
<td>{{ $telefon2 }}</td>
</tr>
<tr>
<th>Alamat</th>
<td colspan="3">{{ $alamat }}</td>
</tr>
<tr>
<th>Poskod</th>
<td>{{ $poskod }}</td>
<th>Daerah</th>
<td>{{ $daerah }}</td>
</tr>
<tr>
<th>Negeri</th>
<td colspan="3">{{ $negeri }}</td>
</tr>
</table>
</div>
<div class="section">
<div class="section-title">C. Bank &amp; Pekerjaan</div>
<table class="fields">
<tr>
<th>Bank</th>
<td colspan="3">{{ $bank }}</td>
</tr>
<tr>
<th>No. Akaun</th>
<td colspan="3">{{ $noakaun }}</td>
</tr>
<tr>
<th>Pekerjaan</th>
<td colspan="3">{{ $pekerjaan }}</td>
</tr>
<tr>
<th>Nota</th>
<td colspan="3">{{ $nota }}</td>
</tr>
</table>
</div>
<x-print.footer :show-copies="false">
<b>Nota:</b>
<p>1. Borang ini dicetak dari skrin Maklumat Pelanggan untuk rujukan cawangan.</p>
<p>2. Gambar diambil daripada rekod MyKad pelanggan dalam sistem.</p>
</x-print.footer>
</div>
</div>
</body>
</html>
+1 -1
View File
@@ -34,7 +34,7 @@
getPusherResponse(); getPusherResponse();
async function getPusherResponse(){ async function getPusherResponse(){
let api_url = "{{ api_url_for_browser() }}"; let api_url = "<?php echo $api_url ?>";
const jsonData = { const jsonData = {
norujukan: "{{ $errorapproval['norujukan'] }}", norujukan: "{{ $errorapproval['norujukan'] }}",
kodcaw: "{{ Auth::user()->cawangan }}", kodcaw: "{{ Auth::user()->cawangan }}",
+1 -1
View File
@@ -215,7 +215,7 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
$('form input').keydown(function (e) { $('form input').keydown(function (e) {
if (e.keyCode == 13) { if (e.keyCode == 13) {
e.preventDefault(); e.preventDefault();
+1 -1
View File
@@ -242,7 +242,7 @@
@endphp @endphp
@endif @endif
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
$('form input').keydown(function (e) { $('form input').keydown(function (e) {
if (e.keyCode == 13) { if (e.keyCode == 13) {
e.preventDefault(); e.preventDefault();
+11 -309
View File
@@ -24,9 +24,6 @@
</div> </div>
<div class="col-12 text-right mb-2"> <div class="col-12 text-right mb-2">
<button type="button" style="margin:auto" class="btn btn-primary" data-toggle="modal" data-target="#daftar_marhun">Daftar Marhun</button> <button type="button" style="margin:auto" class="btn btn-primary" data-toggle="modal" data-target="#daftar_marhun">Daftar Marhun</button>
<button type="button" id="toggleTableBtn" class="btn btn-info ml-2">
<i class="fas fa-exchange-alt"></i> Papar Margin
</button>
</div> </div>
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
@@ -56,33 +53,6 @@
<th colspan="5"></th> <th colspan="5"></th>
</tfoot> </tfoot>
</table> </table>
<!-- Margin Summary Table (Hidden by default) -->
<table class="table table-striped table-hover text-center" id="marginTable" style="display: none;">
<thead class="thead-dark">
<tr>
<th>Bil</th>
<th>Karat</th>
<th>Nilai Marhun</th>
<th>Margin Teller (%)</th>
<th>Margin PC (%)</th>
<th>Nilai Marhun Teller</th>
<th>Nilai Marhun PC</th>
</tr>
</thead>
<tbody id="marginTableBody">
<!-- Dynamic content will be inserted here -->
</tbody>
<tfoot class="thead-success">
<tr>
<th colspan="2" class="text-center">Jumlah</th>
<th id="totalNilaiMarhunMargin"></th>
<th colspan="2"></th>
<th id="totalNilaiTellerMargin"></th>
<th id="totalNilaiPCMargin"></th>
</tr>
</tfoot>
</table>
</div> </div>
</div> </div>
<div class="card"> <div class="card">
@@ -326,7 +296,7 @@
</div> </div>
<script src="{{ asset('js/rounded-methods.js') }}"></script> <script src="{{ asset('js/rounded-methods.js') }}"></script>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw_ujrah = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw_ujrah = "<?php echo $cawangan_info['kodcaw'] ?>";
$('form input').keydown(function (e) { $('form input').keydown(function (e) {
@@ -541,21 +511,7 @@
"visible": false, "visible": false,
"searchable": false "searchable": false
} }
], ]
"language": {
"lengthMenu": "Papar _MENU_ rekod setiap halaman",
"zeroRecords": "Tiada rekod dijumpai",
"info": "Memapar halaman _PAGE_ dari _PAGES_",
"infoEmpty": "Tiada rekod tersedia",
"infoFiltered": "(ditapis dari _MAX_ jumlah rekod)",
"search": "Cari:",
"paginate": {
"first": "Pertama",
"last": "Akhir",
"next": "Seterusnya",
"previous": "Sebelumnya"
}
}
}); });
$(".select2").select2({ $(".select2").select2({
@@ -611,7 +567,6 @@
total_berat = 0; total_berat = 0;
total_kuantiti = 0; total_kuantiti = 0;
var marhun_details = ''; var marhun_details = '';
var array_mutu = [];
tablemarhun.clear().draw(); tablemarhun.clear().draw();
$.each(data,function(index,marhun){ $.each(data,function(index,marhun){
$.each(marhun,function(index,marhun_detail){ $.each(marhun,function(index,marhun_detail){
@@ -621,7 +576,6 @@
jumlah_nilai_marhun += Number(marhun_detail['n_marhun']); jumlah_nilai_marhun += Number(marhun_detail['n_marhun']);
status_tag_permata = marhun_detail['tag_permata'] == 1 ? 'Ada' : ''; status_tag_permata = marhun_detail['tag_permata'] == 1 ? 'Ada' : '';
total_kuantiti += Number(marhun_detail['bil']); total_kuantiti += Number(marhun_detail['bil']);
array_mutu.push([marhun_detail['karat'], marhun_detail['n_marhun']]);
tablemarhun.row.add([ tablemarhun.row.add([
counter, counter,
marhun_detail['recno'], marhun_detail['recno'],
@@ -634,7 +588,7 @@
marhun_detail['harga'], marhun_detail['harga'],
status_tag_permata, status_tag_permata,
marhun_detail['berat_batu_permata'], marhun_detail['berat_batu_permata'],
"<div class='buttonpunya text-center'><button onclick='viewmarhun(this)' class='btn btn-info'><i class='fas fa-eye'></i></button> <button onclick='editmarhun(this)' class='btn btn-primary'><i class='fas fa-edit'></i></button> <button onclick='deletemarhun(this)' class='btn btn-danger'><i class='fas fa-trash-alt'></i></button></div>" "<div class='buttonpunya text-center'><button onclick='editmarhun(this)' class='btn btn-primary'><i class='fas fa-edit'></i></button> <button onclick='deletemarhun(this)' class='btn btn-danger'><i class='fas fa-trash-alt'></i></button></div>"
]).draw(); ]).draw();
count++; count++;
counter = counter + 1; counter = counter + 1;
@@ -647,7 +601,7 @@
$('#bilangan_jumlah_kuantiti').val(formatter.format(total_kuantiti)); $('#bilangan_jumlah_kuantiti').val(formatter.format(total_kuantiti));
$('#jumlah_nilai_marhun').val(formatter.format(jumlah_nilai_marhun)); $('#jumlah_nilai_marhun').val(formatter.format(jumlah_nilai_marhun));
if (count == 1){ if (count == 1){
$('.buttonpunya').html("<button onclick='viewmarhun(this)' class='btn btn-info'><i class='fas fa-eye'></i></button> <button onclick='editmarhun(this)' class='btn btn-primary'><i class='fas fa-edit'></i></button>"); $('.buttonpunya').html("<button onclick='editmarhun(this)' class='btn btn-primary'><i class='fas fa-edit'></i></button>");
} }
// if(total_nilai_marhun > 0 && total_nilai_marhun < 401){ // if(total_nilai_marhun > 0 && total_nilai_marhun < 401){
@@ -702,32 +656,25 @@
$('#keuntungan_sebulan').val(formatter.format(keuntungan_sebulan.toFixed(2))); $('#keuntungan_sebulan').val(formatter.format(keuntungan_sebulan.toFixed(2)));
$('#keuntungan_6bln').val(formatter.format(keuntungan_6bln.toFixed(2))); $('#keuntungan_6bln').val(formatter.format(keuntungan_6bln.toFixed(2)));
var max_teller = 0;
var max_pelulus = 0;
$.ajax({ $.ajax({
method:'GET', method:'GET',
url: api_url + '/api/maxpinjaman', url: api_url + '/api/maxpinjaman',
data: {
'mutu': array_mutu,
'total_nilai_marhun': total_nilai_marhun,
},
success:function(data){ success:function(data){
$.each(data,function(index,pinjaman){ $.each(data,function(index,pinjaman){
if (pinjaman['user_type'] == 'teller') { if(pinjaman['user_type'] == 'teller'){
pinjaman_teller = Number(pinjaman['max']); pinjaman_teller = Number(pinjaman['max']);
max_teller = pinjaman['teller_pinjaman'];
} }
if (pinjaman['user_type'] == 'khazanah') { if(pinjaman['user_type'] == 'khazanah'){
pinjaman_pelulus = Number(pinjaman['max']); pinjaman_pelulus = Number(pinjaman['max']);
max_pelulus = pinjaman['pc_pinjaman'];
} }
}); });
$('.span-pinjaman-max-pelulus').text(formatter.format(pinjaman_pelulus) + ' %'); $('.span-pinjaman-max-pelulus').text(formatter.format(pinjaman_pelulus) + ' %');
$('.span-pinjaman-max').text(formatter.format(pinjaman_teller) + ' %'); $('.span-pinjaman-max').text(formatter.format(pinjaman_teller) + ' %');
var max_teller = total_nilai_marhun * (pinjaman_teller/100);
var max_pelulus = total_nilai_marhun * (pinjaman_pelulus/100);
$('#pembiayaan_max_teller').val(formatter.format(max_teller)); $('#pembiayaan_max_teller').val(formatter.format(max_teller));
$('#pembiyaan_max_pelulus').val(formatter.format(max_pelulus)); $('#pembiyaan_max_pelulus').val(formatter.format(max_pelulus.toFixed(2)));
} }
}); });
} }
@@ -754,103 +701,6 @@
}); });
} }
function viewmarhun(e){
let selectedrow = $(e).closest('tr');
let recno = tablemarhun.row(selectedrow).data();
let nm = recno[3];
let karat = recno[4];
let berat = recno[5];
let harga = recno[8];
let nota = recno[7];
let kuantiti = recno[6];
let jenismarhun = recno[2];
let beratpermata = recno[10];
// Call API to get specific MaxMutuEmas data by karat
$.ajax({
url: '{{ api_url_for_browser() }}/api/maxmutuemas/specific',
type: 'GET',
data: { karat: karat, nilaimarhun: nm },
success: function(response) {
let marginInfo = '';
let marginTable = '';
if (response && response.karat) {
marginTable = `
<table class="table table-bordered table-sm mt-3">
<thead class="thead-light">
<tr><th colspan="2" class="text-center"><strong>Maklumat Margin</strong></th></tr>
</thead>
<tbody>
<tr><td><strong>Margin Teller</strong></td><td>${response.teller}%</td></tr>
<tr><td><strong>Margin PC</strong></td><td>${response.pc}%</td></tr>
<tr><td><strong>Nilai Marhun Teller</strong></td><td>RM${parseFloat(response.maxteller).toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td></tr>
<tr><td><strong>Nilai Marhun PC</strong></td><td>RM${parseFloat(response.maxpc).toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td></tr>
</tbody>
</table>
`;
}
let details = `
<table class="table table-bordered table-sm">
<thead class="thead-light">
<tr><th colspan="2" class="text-center"><strong>Maklumat Marhun</strong></th></tr>
</thead>
<tbody>
<tr><td><strong>Jenis Marhun</strong></td><td>${jenismarhun}</td></tr>
<tr><td><strong>Nilai Marhun Asal</strong></td><td>${nm}</td></tr>
<tr><td><strong>Karat</strong></td><td>${karat}</td></tr>
<tr><td><strong>Berat</strong></td><td>${berat}g</td></tr>
<tr><td><strong>Kuantiti</strong></td><td>${kuantiti}</td></tr>
<tr><td><strong>Harga</strong></td><td>RM${harga}</td></tr>
<tr><td><strong>Nota</strong></td><td>${nota}</td></tr>
<tr><td><strong>Berat Batu Permata</strong></td><td>${beratpermata}g</td></tr>
</tbody>
</table>
${marginTable}
`;
Swal.fire({
title: 'Maklumat Marhun & Margin',
html: details,
icon: 'info',
confirmButtonText: 'OK',
width: '600px'
});
},
error: function(xhr) {
// If API call fails, show basic marhun info only
let details = `
<table class="table table-bordered table-sm">
<thead class="thead-light">
<tr><th colspan="2" class="text-center"><strong>Maklumat Marhun</strong></th></tr>
</thead>
<tbody>
<tr><td><strong>Jenis Marhun</strong></td><td>${jenismarhun}</td></tr>
<tr><td><strong>Nama</strong></td><td>${nm}</td></tr>
<tr><td><strong>Karat</strong></td><td>${karat}</td></tr>
<tr><td><strong>Berat</strong></td><td>${berat}g</td></tr>
<tr><td><strong>Kuantiti</strong></td><td>${kuantiti}</td></tr>
<tr><td><strong>Harga</strong></td><td>RM${harga}</td></tr>
<tr><td><strong>Nota</strong></td><td>${nota}</td></tr>
<tr><td><strong>Berat Batu Permata</strong></td><td>${beratpermata}g</td></tr>
</tbody>
</table>
<div class="alert alert-warning text-center">
<em>Maklumat margin tidak tersedia</em>
</div>
`;
Swal.fire({
title: 'Maklumat Marhun',
html: details,
icon: 'info',
confirmButtonText: 'OK',
width: '600px'
});
}
});
}
function editmarhun(e){ function editmarhun(e){
let norujuk = $('#norujukan').val(); let norujuk = $('#norujukan').val();
let selectedrow = $(e).closest('tr'); let selectedrow = $(e).closest('tr');
@@ -1652,7 +1502,7 @@
swalWithBootstrapButtons.fire({ swalWithBootstrapButtons.fire({
title: 'Dapatkan Pengesahan Daripada Khazanah?', title: 'Dapatkan Pengesahan Daripada Khazanah?',
text: "Tetapan Margin Melebihi Limit Maksima Teller!", text: "Tetapan margin melebihi" + pinjaman_teller + "% untuk Khazanah!",
icon: 'info', icon: 'info',
showCancelButton: true, showCancelButton: true,
confirmButtonText: 'Hantar', confirmButtonText: 'Hantar',
@@ -1664,7 +1514,7 @@
let norujukan = $('#norujukan').val(); let norujukan = $('#norujukan').val();
let nm = parseFloat($('#total_nilai_marhun').val().replace(/[^0-9.-]+/g,""));let ber = $('#total_berat').val();let marg = $('.span-pinjaman').text(); let nm = parseFloat($('#total_nilai_marhun').val().replace(/[^0-9.-]+/g,""));let ber = $('#total_berat').val();let marg = $('.span-pinjaman').text();
// let komen = "Pembiayaan Melebihi Margin 70%|" + nm + "|" + ber + "|" + marg + "|"; // let komen = "Pembiayaan Melebihi Margin 70%|" + nm + "|" + ber + "|" + marg + "|";
let status = "Tetapan Margin Melebihi Limit Maksima Teller: " + pinjaman_teller + "%"; let status = "Pembiayaan Melebihi Margin " + pinjaman_teller + "%";
let jumpinjam = $('#pinjaman').val(); let jumpinjam = $('#pinjaman').val();
let teller = "{{ Auth::user()->name }}"; let teller = "{{ Auth::user()->name }}";
@@ -1768,153 +1618,5 @@
} }
} }
} }
// Toggle Table Functionality
let isMarginTableVisible = false;
$('#toggleTableBtn').on('click', function() {
if (!isMarginTableVisible) {
// Show margin table, hide main table
$('#myTable_wrapper').hide();
$('#marginTable').show();
$(this).html('<i class="fas fa-exchange-alt"></i> Papar Marhun');
loadMarginData();
isMarginTableVisible = true;
} else {
// Show main table, hide margin table
$('#marginTable_wrapper').hide();
$('#myTable_wrapper').show();
$(this).html('<i class="fas fa-exchange-alt"></i> Papar Margin');
isMarginTableVisible = false;
}
});
function loadMarginData() {
let marginData = [];
let totalNilaiMarhun = 0;
let totalNilaiTeller = 0;
let totalNilaiPC = 0;
// Process each individual row from the main table
let rowsData = [];
tablemarhun.rows().data().each(function(row, index) {
let recno = row[1]; // Recno column
let karat = row[4]; // Karat column
let nilaiMarhun = parseFloat(row[3].replace(/[^0-9.-]+/g, "")); // Nilai Marhun column
rowsData.push({
index: index,
recno: recno,
karat: karat,
nilaiMarhun: nilaiMarhun
});
});
let bil = 1;
let processedCount = 0;
let totalEntries = rowsData.length;
rowsData.forEach((rowData) => {
// Call API to get margin data for each individual item
$.ajax({
url: '{{ api_url_for_browser() }}/api/maxmutuemas/specific',
type: 'GET',
data: { karat: rowData.karat, nilaimarhun: rowData.nilaiMarhun },
success: function(response) {
if (response && response.karat) {
let nilaiTeller = parseFloat(response.maxteller) || 0;
let nilaiPC = parseFloat(response.maxpc) || 0;
marginData.push({
index: rowData.index,
bil: rowData.index + 1,
recno: rowData.recno,
karat: rowData.karat,
nilaiMarhun: rowData.nilaiMarhun,
marginTeller: response.teller,
marginPC: response.pc,
nilaiTeller: nilaiTeller,
nilaiPC: nilaiPC
});
totalNilaiMarhun += rowData.nilaiMarhun;
totalNilaiTeller += nilaiTeller;
totalNilaiPC += nilaiPC;
}
processedCount++;
if (processedCount === totalEntries) {
// Sort by original index to maintain order
marginData.sort((a, b) => a.index - b.index);
populateMarginTable(marginData, totalNilaiMarhun, totalNilaiTeller, totalNilaiPC);
}
},
error: function() {
processedCount++;
if (processedCount === totalEntries) {
// Sort by original index to maintain order
marginData.sort((a, b) => a.index - b.index);
populateMarginTable(marginData, totalNilaiMarhun, totalNilaiTeller, totalNilaiPC);
}
}
});
});
}
let marginDataTable = null;
function populateMarginTable(data, totalMarhun, totalTeller, totalPC) {
// If DataTable already exists, destroy it first
if (marginDataTable !== null) {
marginDataTable.destroy();
marginDataTable = null;
}
let tbody = $('#marginTableBody');
tbody.empty();
data.forEach(function(item) {
let row = `
<tr>
<td>${item.bil}</td>
<td>${item.karat}</td>
<td>RM${item.nilaiMarhun.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
<td>${item.marginTeller}%</td>
<td>${item.marginPC}%</td>
<td>RM${item.nilaiTeller.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
<td>RM${item.nilaiPC.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
</tr>
`;
tbody.append(row);
});
// Initialize DataTable
marginDataTable = $('#marginTable').DataTable({
"pageLength": 10,
"ordering": false,
"order": [[ 0, "asc" ]],
"responsive": true,
"language": {
"lengthMenu": "Papar _MENU_ rekod setiap halaman",
"zeroRecords": "Tiada rekod dijumpai",
"info": "Memapar halaman _PAGE_ dari _PAGES_",
"infoEmpty": "Tiada rekod tersedia",
"infoFiltered": "(ditapis dari _MAX_ jumlah rekod)",
"search": "Cari:",
"paginate": {
"first": "Pertama",
"last": "Akhir",
"next": "Seterusnya",
"previous": "Sebelumnya"
}
},
"footerCallback": function (row, data, start, end, display) {
// Update footer totals
$('#totalNilaiMarhunMargin').text('RM' + totalMarhun.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('#totalNilaiTellerMargin').text('RM' + totalTeller.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('#totalNilaiPCMargin').text('RM' + totalPC.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
}
});
}
</script> </script>
@endsection @endsection
+172 -615
View File
@@ -14,7 +14,7 @@
@endphp @endphp
@if($gadai_session != null) @if($gadai_session != null)
<div class="p-4"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-12 col-lg-12"> <div class="col-md-12 col-lg-12">
@@ -64,14 +64,6 @@
</div> </div>
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<!-- Toggle Button -->
<div class="mb-3">
<button type="button" class="btn btn-info" id="toggleTableBtn">
<i class="fas fa-exchange-alt"></i> Papar Margin
</button>
</div>
<!-- Main Marhun Table -->
<table class="table table-striped table-hover text-center" id="myTable"> <table class="table table-striped table-hover text-center" id="myTable">
<thead class="thead-dark"> <thead class="thead-dark">
<tr> <tr>
@@ -98,35 +90,6 @@
<th colspan="5"></th> <th colspan="5"></th>
</tfoot> </tfoot>
</table> </table>
<!-- Margin Summary Table (Hidden by default) -->
<table class="table table-striped table-hover text-center" id="marginTable" style="display: none;">
<thead class="thead-dark">
<tr>
<th>Bil</th>
<th>Karat</th>
<th>Nilai Marhun</th>
<th>Margin Teller (%)</th>
<th>Margin PC (%)</th>
<th>Pembiayaan Teller</th>
<th>Pembiayaan PC</th>
</tr>
</thead>
<tbody id="marginTableBody">
<!-- Data will be populated by JavaScript -->
</tbody>
<tfoot class="thead-dark">
<tr>
<th>Jumlah</th>
<th></th>
<th id="totalNilaiMarhunMargin"></th>
<th></th>
<th></th>
<th id="totalNilaiTellerMargin"></th>
<th id="totalNilaiPCMargin"></th>
</tr>
</tfoot>
</table>
</div> </div>
</div> </div>
<div class="card"> <div class="card">
@@ -218,65 +181,14 @@
</div> </div>
</diV> </diV>
</div> </div>
<div class="col-12" id="cara_terima_section" style="display:none;"> <div class="col-4">
<hr>
<div class="form-group row"> <div class="form-group row">
<div class="col-md-3"> <div class="col-md-6">
Cara Terima Pembiayaan Kadar Rebet
</div> </div>
<div class="col-md-9"> <div class="col-md-6">
<div class="form-check form-check-inline"> <input type="text" class="form-control" readonly name="rebate" id="rebate">
<input class="form-check-input" type="radio" name="cara_terima" id="cara_terima_tunai" value="TUNAI" checked> <input type="text" class="form-control" readonly name="kadar_rebate" id="kadar_rebate">
<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>
</div> </div>
@@ -290,7 +202,6 @@
<input type="text" name="nokp" id="nokp" value="{{ !empty($customer_info['kpbaru']) ? $customer_info['kpbaru'] : ($customer_info['kplama'] ?? '') }}" hidden> <input type="text" name="nokp" id="nokp" value="{{ !empty($customer_info['kpbaru']) ? $customer_info['kpbaru'] : ($customer_info['kplama'] ?? '') }}" hidden>
<a href="{{ route('gadai.batal',['norujukan'=>$norujukan]) }}" class="float-right btn btn-danger mr-2">Batal</a> <a href="{{ route('gadai.batal',['norujukan'=>$norujukan]) }}" class="float-right btn btn-danger mr-2">Batal</a>
<input type="submit" name="terima_gadai" id="terima_gadai" class="float-right btn btn-primary mr-2" value="Terima"> <input type="submit" name="terima_gadai" id="terima_gadai" class="float-right btn btn-primary mr-2" value="Terima">
<button type="button" id="cetak_borang_online" class="float-right btn btn-info mr-2" style="display:none;">Cetak Borang</button>
</div> </div>
</div> </div>
</form> </form>
@@ -395,7 +306,7 @@
@endif @endif
<script src="{{ asset('js/rounded-methods.js') }}"></script> <script src="{{ asset('js/rounded-methods.js') }}"></script>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw_ujrah = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw_ujrah = "<?php echo $cawangan_info['kodcaw'] ?>";
$('form input').keydown(function (e) { $('form input').keydown(function (e) {
if (e.keyCode == 13) { if (e.keyCode == 13) {
@@ -574,34 +485,21 @@
}) })
} }
var tablemarhun = $('#myTable').DataTable({ var tablemarhun = $('#myTable').DataTable({
"ordering": false, "ordering": false,
"columnDefs": [{ "columnDefs": [
"targets": [1], {
"visible": false, "targets": [ 1 ],
"searchable": false "visible": false,
}, "searchable": false
{
"targets": [7],
"visible": true,
"searchable": false
}
],
"language": {
"lengthMenu": "Papar _MENU_ rekod setiap halaman",
"zeroRecords": "Tiada rekod dijumpai",
"info": "Memapar halaman _PAGE_ dari _PAGES_",
"infoEmpty": "Tiada rekod tersedia",
"infoFiltered": "(ditapis dari _MAX_ jumlah rekod)",
"search": "Cari:",
"paginate": {
"first": "Pertama",
"last": "Akhir",
"next": "Seterusnya",
"previous": "Sebelumnya"
}
}, },
}); {
"targets": [ 7 ],
"visible": false,
"searchable": false
}
]
});
$(".select2").select2({ $(".select2").select2({
dropdownParent: $('#daftar_marhun'), dropdownParent: $('#daftar_marhun'),
@@ -641,57 +539,60 @@
closeOnSelect: false closeOnSelect: false
}); });
var total_nilai_marhun = 0; var total_nilai_marhun = 0;
var total_berat = 0; var total_berat = 0;
var total_kuantiti = 0; var total_kuantiti = 0;
var kadarupah = 0; var kadarupah = 0;
var jumlah_marhun = 0; var jumlah_marhun = 0;
var jumlah_nilai_marhun = 0; var jumlah_nilai_marhun = 0;
var pinjaman_pelulus = 0; var pinjaman_pelulus = 0;
var pinjaman_teller = 0; var pinjaman_teller = 0;
function marhuntable(data){
function marhuntable(data) { var counter = 1;
var counter = 1; total_nilai_marhun = 0;
total_nilai_marhun = 0; total_berat = 0;
total_berat = 0; total_kuantiti = 0;
total_kuantiti = 0; var marhun_details = '';
var marhun_details = ''; jumlah_nilai_marhun = 0;
var array_mutu = []; tablemarhun.clear().draw();
jumlah_nilai_marhun = 0; $.each(data,function(index,marhun){
tablemarhun.clear().draw(); $.each(marhun,function(index,marhun_detail){
$.each(data, function(index, marhun) { total_nilai_marhun = total_nilai_marhun + Number(marhun_detail['n_marhun']);
$.each(marhun, function(index, marhun_detail) { total_berat = total_berat + Number(marhun_detail['berat']);
total_nilai_marhun = total_nilai_marhun + Number(marhun_detail['n_marhun']); marhun_details = marhun_details + marhun_detail['bil'] + " " + marhun_detail['marhun'] +",";
total_berat = total_berat + Number(marhun_detail['berat']); jumlah_nilai_marhun += Number(marhun_detail['n_marhun']);
marhun_details = marhun_details + marhun_detail['bil'] + " " + marhun_detail['marhun'] + ","; status_tag_permata = marhun_detail['tag_permata'] == 1 ? 'Ada' : '';
jumlah_nilai_marhun += Number(marhun_detail['n_marhun']); total_kuantiti += Number(marhun_detail['bil']);
status_tag_permata = marhun_detail['tag_permata'] == 1 ? 'Ada' : ''; tablemarhun.row.add([
total_kuantiti += Number(marhun_detail['bil']); counter,
array_mutu.push([marhun_detail['karat'], marhun_detail['n_marhun']]); marhun_detail['recno'],
tablemarhun.row.add([ marhun_detail['marhun'],
counter, formatter.format(marhun_detail['n_marhun']),
marhun_detail['recno'], marhun_detail['karat'],
marhun_detail['marhun'], formatter.format(marhun_detail['berat']),
formatter.format(marhun_detail['n_marhun']), marhun_detail['bil'],
marhun_detail['karat'], marhun_detail['nota'],
formatter.format(marhun_detail['berat']), marhun_detail['harga'],
marhun_detail['bil'], status_tag_permata,
marhun_detail['nota'], marhun_detail['berat_batu_permata'],
marhun_detail['harga'], "<div class='buttonpunya text-center'><button onclick='editmarhun(this)' class='btn btn-primary'><i class='fas fa-edit'></i></button> <button onclick='deletemarhun(this)' class='btn btn-danger'><i class='fas fa-trash-alt'></i></button></div>"
status_tag_permata, ]).draw();
marhun_detail['berat_batu_permata'], counter = counter + 1;
"<div class='buttonpunya text-center'><button onclick='editmarhun(this)' class='btn btn-primary'><i class='fas fa-edit'></i></button> <button onclick='deletemarhun(this)' class='btn btn-danger'><i class='fas fa-trash-alt'></i></button></div>"
]).draw();
counter = counter + 1;
});
}); });
$('#totalberattable').text(formatter.format(total_berat)); });
$('#totalkuantititable').text(total_kuantiti); $('#totalberattable').text(formatter.format(total_berat));
$('#totalnilaimarhuntable').text(formatter.format(jumlah_nilai_marhun)); $('#totalkuantititable').text(total_kuantiti);
$('#bilangan_marhun').val(formatter.format(counter - 1)); $('#totalnilaimarhuntable').text(formatter.format(jumlah_nilai_marhun));
$('#bilangan_jumlah_kuantiti').val(formatter.format(total_kuantiti)); $('#bilangan_marhun').val(formatter.format(counter-1));
$('#jumlah_nilai_marhun').val(formatter.format(jumlah_nilai_marhun)); $('#bilangan_jumlah_kuantiti').val(formatter.format(total_kuantiti));
$('#jumlah_nilai_marhun').val(formatter.format(jumlah_nilai_marhun));
// if(total_nilai_marhun > 0 && total_nilai_marhun < 401){
// kadarupah = 1.2/100;
// }else if(total_nilai_marhun >= 401 && total_nilai_marhun < 2001){
// kadarupah = 1.5/100;
// }else if(total_nilai_marhun >= 2001 ){
// kadarupah = 1.7/100;
// }
$.ajax({ $.ajax({
method:'GET', method:'GET',
@@ -712,40 +613,33 @@
} }
}); });
$('#total_nilai_marhun').val(formatter.format(total_nilai_marhun)); $('#total_nilai_marhun').val(formatter.format(total_nilai_marhun));
$('#marhun_detail').val(marhun_details); $('#marhun_detail').val(marhun_details);
$('#total_berat').val(formatter.format(total_berat)); $('#total_berat').val(formatter.format(total_berat));
$('#kadarkeuntungan').val(formatter.format(kadarupah)); $('#kadarkeuntungan').val(formatter.format(kadarupah));
$('#kuantiti_marhun').val(formatter.format(jumlah_marhun)); $('#kuantiti_marhun').val(formatter.format(jumlah_marhun));
var max_teller = 0; $.ajax({
var max_pelulus = 0; method:'GET',
url: api_url + '/api/maxpinjaman',
$.ajax({ success:function(data){
method: 'GET', $.each(data,function(index,pinjaman){
url: api_url + '/api/maxpinjaman', if(pinjaman['user_type'] == 'teller'){
data: { pinjaman_teller = Number(pinjaman['max']);
'mutu': array_mutu, }
'total_nilai_marhun': total_nilai_marhun, if(pinjaman['user_type'] == 'khazanah'){
}, pinjaman_pelulus = Number(pinjaman['max']);
success: function(data) { }
$.each(data, function(index, pinjaman) { });
if (pinjaman['user_type'] == 'teller') { $('.span-pinjaman-max-pelulus').text(formatter.format(pinjaman_pelulus) + ' %');
pinjaman_teller = Number(pinjaman['max']); $('.span-pinjaman-max').text(formatter.format(pinjaman_teller) + ' %');
max_teller = pinjaman['teller_pinjaman']; var max_teller = total_nilai_marhun * (pinjaman_teller/100);
} var max_pelulus = total_nilai_marhun * (pinjaman_pelulus/100);
if (pinjaman['user_type'] == 'khazanah') { $('#pembiayaan_max_teller').val(formatter.format(max_teller.toFixed(2)));
pinjaman_pelulus = Number(pinjaman['max']); $('#pembiyaan_max_pelulus').val(formatter.format(max_pelulus.toFixed(2)));
max_pelulus = pinjaman['pc_pinjaman']; }
} });
}); }
$('.span-pinjaman-max-pelulus').text(formatter.format(pinjaman_pelulus) + ' %');
$('.span-pinjaman-max').text(formatter.format(pinjaman_teller) + ' %');
$('#pembiayaan_max_teller').val(formatter.format(max_teller));
$('#pembiyaan_max_pelulus').val(formatter.format(max_pelulus));
}
});
}
$('#pinjaman').on('input',function(){ $('#pinjaman').on('input',function(){
var pinjaman = Number(this.value); var pinjaman = Number(this.value);
@@ -753,7 +647,6 @@
var nokp = $('#nokp').val(); var nokp = $('#nokp').val();
//console.log('DEBUG NOKP:', nokp, kadarupah); //console.log('DEBUG NOKP:', nokp, kadarupah);
toggleCaraTerima(pinjaman);
// var keuntungan_sebulan = pinjaman * kadarupah; // var keuntungan_sebulan = pinjaman * kadarupah;
// var keuntungan_6bln = keuntungan_sebulan * 6; // var keuntungan_6bln = keuntungan_sebulan * 6;
@@ -781,12 +674,35 @@
var keuntungan_sebulan = getRoundedMethod(array_keuntungan['keuntungan']); var keuntungan_sebulan = getRoundedMethod(array_keuntungan['keuntungan']);
var keuntungan_6bln = getRoundedMethod(keuntungan_sebulan * 6); var keuntungan_6bln = getRoundedMethod(keuntungan_sebulan * 6);
var ujrah = getRoundedMethod(array_keuntungan['ujrah']);
var onepercent = getRoundedMethod(array_keuntungan['onepercent']);
// **Rebate Calculation**
let rebate, kadar_rebate;
if (pinjaman < 20000) {
rebate = keuntungan_sebulan * 0.05;
kadar_rebate = 5;
} else if (pinjaman >= 20000 && pinjaman <= 50000) {
rebate = keuntungan_sebulan * 0.10;
kadar_rebate = 10;
} else if (pinjaman > 50000 && pinjaman <= 100000) {
rebate = keuntungan_sebulan * 0.15;
kadar_rebate = 15;
} else {
rebate = keuntungan_sebulan * 0.20;
kadar_rebate = 20;
}
rebate = getRoundedMethod(rebate); // ✅ Round rebate before displaying
// **Display values**
$('.span-pinjaman').text(formatter.format(percent_pinjaman.toFixed(2)) + ' %'); $('.span-pinjaman').text(formatter.format(percent_pinjaman.toFixed(2)) + ' %');
$('#keuntungan_sebulan').val(formatter.format(keuntungan_sebulan.toFixed(2))); $('#keuntungan_sebulan').val(formatter.format(keuntungan_sebulan.toFixed(2)));
$('#keuntungan_6bln').val(formatter.format(keuntungan_6bln.toFixed(2))); $('#keuntungan_6bln').val(formatter.format(keuntungan_6bln.toFixed(2)));
$('#ujrah').val(formatter.format(getRoundedMethod(array_keuntungan['ujrah']).toFixed(2))); $('#ujrah').val(formatter.format(getRoundedMethod(array_keuntungan['ujrah']).toFixed(2)));
$('#onepercent').val(formatter.format(getRoundedMethod(array_keuntungan['onepercent']).toFixed(2))); $('#onepercent').val(formatter.format(getRoundedMethod(array_keuntungan['onepercent']).toFixed(2)));
$('#rebate').val(formatter.format(rebate.toFixed(2))); // Correctly displaying rebate
$('#kadar_rebate').val(formatter.format(kadar_rebate.toFixed(2)) + ' %');
}); });
@@ -989,9 +905,8 @@
var batu_permata_array = $('#batupermata').val(); var batu_permata_array = $('#batupermata').val();
var tag_permata = $('input[id=tagpermata]').is(':checked') ? 1 : 0; var tag_permata = $('input[id=tagpermata]').is(':checked') ? 1 : 0;
var beratpermata = $('#beratpermata').val(); var beratpermata = $('#beratpermata').val();
var kuantiti = $('#kuantiti').val(); var kuantiti = $('#kuantiti').val();
if(kuantiti > 10) if(kuantiti > 10)
{ {
@@ -1265,207 +1180,9 @@
.then(response => response.json()); .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();
$('#cetak_borang_online').hide();
$('#cara_terima_tunai').prop('checked', true);
}
}
function toggleBankOnlineSection() {
if ($('input[name="cara_terima"]:checked').val() === 'ONLINE') {
$('#bank_online_section').show();
$('#cetak_borang_online').show();
var nama = $('#gadai_kodbank option:selected').data('nama') || '';
$('#gadai_nama_bank').val(nama);
refreshModalOnlineStatus();
} else {
$('#bank_online_section').hide();
$('#cetak_borang_online').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') || '');
});
$(document).on('click', '#cetak_borang_online', function () {
var kodbank = $('#gadai_kodbank').val();
var noakaun = ($('#gadai_noakaun').val() || '').trim();
var namaAkaun = ($('#gadai_nama_akaun').val() || '').trim();
var namaBank = $('#gadai_kodbank option:selected').data('nama') || $('#gadai_nama_bank').val() || '';
var pinjaman = String($('#pinjaman').val() || '').replace(/,/g, '');
if (!kodbank || !noakaun) {
Swal.fire({
icon: 'warning',
title: 'Maklumat bank tidak lengkap',
text: 'Sila lengkapkan bank dan no. akaun sebelum cetak borang. Anda boleh betulkan dan cetak semula tanpa tekan Terima.'
});
return;
}
var form = $('<form>', {
method: 'POST',
action: '{{ route("gadai.print.borang.online.preview") }}',
target: '_blank'
});
form.append($('<input>', { type: 'hidden', name: '_token', value: '{{ csrf_token() }}' }));
form.append($('<input>', { type: 'hidden', name: 'norujukan', value: $('#norujukan_gadai').val() || $('#norujukan').val() || '' }));
form.append($('<input>', { type: 'hidden', name: 'nokp', value: $('#nokp').val() || '' }));
form.append($('<input>', { type: 'hidden', name: 'nopelanggan', value: $('#nopelanggan').val() || '' }));
form.append($('<input>', { type: 'hidden', name: 'nama_pelanggan', value: $('input[name="nama_pelanggan"]').val() || '' }));
form.append($('<input>', { type: 'hidden', name: 'pinjaman', value: pinjaman }));
form.append($('<input>', { type: 'hidden', name: 'kodbank', value: kodbank }));
form.append($('<input>', { type: 'hidden', name: 'nama_bank', value: namaBank }));
form.append($('<input>', { type: 'hidden', name: 'noakaun', value: noakaun }));
form.append($('<input>', { type: 'hidden', name: 'nama_akaun', value: namaAkaun }));
form.appendTo('body').trigger('submit').remove();
});
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){ async function verifyGadai(func){
$("#terima_gadai").prop('disabled', true); $("#terima_gadai").prop('disabled', true);
if (typeof event !== 'undefined' && event && event.preventDefault) { event.preventDefault();
event.preventDefault();
}
var kodcaw = $('#kodcaw').val(); var kodcaw = $('#kodcaw').val();
var nokp = $('#nokp').val(); var nokp = $('#nokp').val();
var nopelanggan = $('#nopelanggan').val(); var nopelanggan = $('#nopelanggan').val();
@@ -1492,16 +1209,23 @@
title: 'Amaran!', title: 'Amaran!',
text: 'Pembiayaan Tidak Lengkap' text: 'Pembiayaan Tidak Lengkap'
}); });
event.preventDefault();
return false; return false;
} }
let floatOk = await checkDisbursementFloat(pinjaman); let dataCawangan = await getDataCawangan();
if (!floatOk) { let bakiAkhir = dataCawangan.baki;
$("#terima_gadai").prop('disabled', false);
return false;
}
if(true){ if(bakiAkhir < pinjaman){
$("#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($.isNumeric(pinjaman) == false){ if($.isNumeric(pinjaman) == false){
$("#terima_gadai").prop('disabled', false); $("#terima_gadai").prop('disabled', false);
@@ -1747,24 +1471,22 @@
buttonsStyling: false buttonsStyling: false
}); });
swalWithBootstrapButtons.fire({ swalWithBootstrapButtons.fire({
title: 'Dapatkan Pengesahan Khazanah', title: 'Dapatkan Pengesahan Khazanah',
text: "Tetapan Margin Melebihi Limit Maksima Teller!", text: "Tetapan margin melebihi " + pinjaman_teller + "% untuk Khazanah!",
icon: 'info', icon: 'info',
showCancelButton: true, showCancelButton: true,
confirmButtonText: 'Hantar', confirmButtonText: 'Hantar',
cancelButtonText: 'Batal', cancelButtonText: 'Batal',
reverseButtons: true reverseButtons: true
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
let norujukan = $('#norujukan').val(); let norujukan = $('#norujukan').val();
let nm = parseFloat($('#total_nilai_marhun').val().replace(/[^0-9.-]+/g, "")); let nm = parseFloat($('#total_nilai_marhun').val().replace(/[^0-9.-]+/g,""));let ber = $('#total_berat').val();let marg = $('.span-pinjaman').text();
let ber = $('#total_berat').val(); let status = "Pembiayaan Melebihi Margin " + pinjaman_teller + "%";
let marg = $('.span-pinjaman').text(); let jumpinjam = $('#pinjaman').val();
let status = "Tetapan Margin Melebihi Limit Maksima Teller: " + pinjaman_teller + "%"; let teller = "{{ Auth::user()->name }}";
let jumpinjam = $('#pinjaman').val();
let teller = "{{ Auth::user()->name }}";
Swal.fire({ Swal.fire({
title: 'Tunggu Pengesahan Daripada Khazanah.', title: 'Tunggu Pengesahan Daripada Khazanah.',
@@ -1922,24 +1644,23 @@
let marhun = $(e).closest('tr').children('td:eq(1)').text();let selectedrow = $(e).closest('tr');let recnozz = tablemarhun.row(selectedrow).data(); let marhun = $(e).closest('tr').children('td:eq(1)').text();let selectedrow = $(e).closest('tr');let recnozz = tablemarhun.row(selectedrow).data();
let norujuk = $('#norujukan').val(); let norujuk = $('#norujukan').val();
$.ajax({ $.ajax({
method: 'put', method: 'put',
url: '{{ route("gadai.editmarhun") }}', url: '{{ route("gadai.editmarhun") }}',
data: { data: {
"_token": "{{ csrf_token() }}", "_token": "{{ csrf_token() }}",
"norujukan": norujuk, "norujukan" : norujuk,
"recno": recnozz[1], "recno" : recnozz[1],
"teller": "{{ Auth::user()->name }}" "teller": "{{ Auth::user()->name }}"
}, },
success: function(data) { success:function(data){
location.reload(); location.reload();
}, },error: function(xhr, status, error) {
error: function(xhr, status, error) { var err = eval("(" + xhr.responseText + ")");
var err = eval("(" + xhr.responseText + ")"); alert(xhr.responseText);
alert(xhr.responseText); }
} });
}); }
}
function editmarhun(e){ function editmarhun(e){
let norujuk = $('#norujukan').val(); let norujuk = $('#norujukan').val();
@@ -2177,169 +1898,5 @@
} }
}); });
// Toggle Table Functionality
let isMarginTableVisible = false;
$('#toggleTableBtn').on('click', function() {
if (!isMarginTableVisible) {
// Check if main table has data before showing margin table
let tableData = $('#myTable').DataTable().data();
if (tableData.length === 0) {
Swal.fire({
icon: 'warning',
title: 'Amaran!',
text: 'Tiada data marhun untuk papar margin. Sila daftar marhun terlebih dahulu.'
});
return;
}
// Show margin table, hide main table
$('#myTable_wrapper').hide();
$('#marginTable').show();
$(this).html('<i class="fas fa-exchange-alt"></i> Papar Marhun');
loadMarginData();
isMarginTableVisible = true;
// Disable Daftar Marhun button when margin table is visible
$('button[data-target="#daftar_marhun"]').prop('disabled', true);
} else {
// Show main table, hide margin table
$('#marginTable_wrapper').hide();
$('#myTable_wrapper').show();
$(this).html('<i class="fas fa-exchange-alt"></i> Papar Margin');
isMarginTableVisible = false;
// Enable Daftar Marhun button when main table is visible
$('button[data-target="#daftar_marhun"]').prop('disabled', false);
}
});
function loadMarginData() {
let marginData = [];
let totalNilaiMarhun = 0;
let totalNilaiTeller = 0;
let totalNilaiPC = 0;
// Process each individual row from the main table
let rowsData = [];
tablemarhun.rows().data().each(function(row, index) {
console.log(row);
let recno = row[1]; // Recno column
let karat = row[4]; // Karat column
let nilaiMarhun = parseFloat(row[3].replace(/[^0-9.-]+/g, "")); // Nilai Marhun column
rowsData.push({
index: index,
recno: recno,
karat: karat,
nilaiMarhun: nilaiMarhun
});
});
let bil = 1;
let processedCount = 0;
let totalEntries = rowsData.length;
rowsData.forEach((rowData) => {
// Call API to get margin data for each individual item
$.ajax({
url: '{{ api_url_for_browser() }}/api/maxmutuemas/specific',
type: 'GET',
data: { karat: rowData.karat, nilaimarhun: rowData.nilaiMarhun },
success: function(response) {
if (response && response.karat) {
let nilaiTeller = parseFloat(response.maxteller) || 0;
let nilaiPC = parseFloat(response.maxpc) || 0;
marginData.push({
index: rowData.index,
bil: rowData.index + 1,
recno: rowData.recno,
karat: rowData.karat,
nilaiMarhun: rowData.nilaiMarhun,
marginTeller: response.teller,
marginPC: response.pc,
nilaiTeller: nilaiTeller,
nilaiPC: nilaiPC
});
totalNilaiMarhun += rowData.nilaiMarhun;
totalNilaiTeller += nilaiTeller;
totalNilaiPC += nilaiPC;
}
processedCount++;
if (processedCount === totalEntries) {
// Sort by original index to maintain order
marginData.sort((a, b) => a.index - b.index);
populateMarginTable(marginData, totalNilaiMarhun, totalNilaiTeller, totalNilaiPC);
}
},
error: function() {
processedCount++;
if (processedCount === totalEntries) {
// Sort by original index to maintain order
marginData.sort((a, b) => a.index - b.index);
populateMarginTable(marginData, totalNilaiMarhun, totalNilaiTeller, totalNilaiPC);
}
}
});
});
}
let marginDataTable = null;
function populateMarginTable(data, totalMarhun, totalTeller, totalPC) {
// If DataTable already exists, destroy it first
if (marginDataTable !== null) {
marginDataTable.destroy();
marginDataTable = null;
}
let tbody = $('#marginTableBody');
tbody.empty();
data.forEach(function(item) {
let row = `
<tr>
<td>${item.bil}</td>
<td>${item.karat}</td>
<td>RM${item.nilaiMarhun.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
<td>${item.marginTeller}%</td>
<td>${item.marginPC}%</td>
<td>RM${item.nilaiTeller.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
<td>RM${item.nilaiPC.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td>
</tr>
`;
tbody.append(row);
});
// Initialize DataTable
marginDataTable = $('#marginTable').DataTable({
"pageLength": 10,
"ordering": false,
"order": [[ 0, "asc" ]],
"responsive": true,
"language": {
"lengthMenu": "Papar _MENU_ rekod setiap halaman",
"zeroRecords": "Tiada rekod dijumpai",
"info": "Memapar halaman _PAGE_ dari _PAGES_",
"infoEmpty": "Tiada rekod tersedia",
"infoFiltered": "(ditapis dari _MAX_ jumlah rekod)",
"search": "Cari:",
"paginate": {
"first": "Pertama",
"last": "Akhir",
"next": "Seterusnya",
"previous": "Sebelumnya"
}
},
"footerCallback": function (row, data, start, end, display) {
// Update footer totals
$('#totalNilaiMarhunMargin').text('RM' + totalMarhun.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('#totalNilaiTellerMargin').text('RM' + totalTeller.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('#totalNilaiPCMargin').text('RM' + totalPC.toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
}
});
}
</script> </script>
@endsection @endsection
@@ -262,10 +262,6 @@
<a href="{{ url('pendahuluanserahan') }}" <a href="{{ url('pendahuluanserahan') }}"
class="btn btn-info btn-lg btn-block mb-3">Pendahuluan - Serahan</a> class="btn btn-info btn-lg btn-block mb-3">Pendahuluan - Serahan</a>
</div> </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"> <div class="row">
<a href="{{ route('khazanah.indexwakil') }}" <a href="{{ route('khazanah.indexwakil') }}"
class="btn btn-info btn-lg btn-block mb-3">Surat Wakil</a> class="btn btn-info btn-lg btn-block mb-3">Surat Wakil</a>
@@ -324,7 +320,7 @@
}); });
let api = "{{ api_url_for_browser() }}"; let api = "{{ config('api.url') }}";
let kodcaw = "{{ Auth::user()->cawangan }}"; let kodcaw = "{{ Auth::user()->cawangan }}";
const initialambilan = [ const initialambilan = [
@@ -14,18 +14,13 @@
</nav> </nav>
<div class="card-body text-center"> <div class="card-body text-center">
<a href="{{ route('operasi.kelulusananggota') }}" class="btn btn-info btn-lg d-inline-block m-1">Kelulusan Anggota</a> <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 d-inline-block m-1">Kelulusan</a> <a href="{{ route('operasi.kelulusan') }}" class="btn btn-info btn-lg">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('daftar.kakitangan') }}" class="btn btn-info btn-lg">Kakitangan</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('parameter') }}" class="btn btn-info btn-lg">Parameter</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('komuditi') }}" class="btn btn-info btn-lg">Komoditi</a>
<a href="{{ route('daftar.kakitangan') }}" class="btn btn-info btn-lg d-inline-block m-1">Kakitangan</a> <a href="{{ route('perubatan') }}" class="btn btn-info btn-lg">Perubatan</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>
</div> </div>
</div> </div>
</div> </div>
@@ -1,46 +0,0 @@
@extends('layouts.app_operasi')
@section('content')
<div class="container">
<div class="row justify-content-center mt-5">
<div class="col-md-10">
<div class="card">
<nav aria-label="breadcrumb">
<ol class="breadcrumb pb-3">
<li class="breadcrumb-item"><a href="{{ route('home') }}">Home</a></li>
<li class="breadcrumb-item active" aria-current="page">Laporan Audit</li>
</ol>
</nav>
<div class="card-header">
<h4 class="text-center">Laporan Audit</h4>
</div>
<div class="card-body">
<form action="{{ route('operasi.audittrail.laporancetak') }}" method="GET">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="dateaudit">Tarikh Mula:</label>
<input type="date" class="form-control" id="dateaudit" name="dateaudit" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="dateaudit_till">Tarikh Akhir:</label>
<input type="date" class="form-control" id="dateaudit_till" name="dateaudit_till" required>
</div>
</div>
</div>
<div class="text-center">
<button type="submit" class="btn btn-info btn-lg">
<i class="fas fa-route"></i> Generate Audit Trail
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -267,7 +267,7 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var cawangan = "{{ Auth::user()->cawangan }}"; var cawangan = "{{ Auth::user()->cawangan }}";
var teller = "{{ Auth::user()->name }}"; var teller = "{{ Auth::user()->name }}";
@@ -18,9 +18,10 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
let teller = "{{ Auth::user()->name }}"; let teller = "{{ Auth::user()->name }}";
let kodcaw = "{{ Auth::user()->cawangan }}"; let kodcaw = "{{ Auth::user()->cawangan }}";
function pelangganclick() function pelangganclick()
{ {
// $getTunai2=Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url').'/api/GetCurrentTunai/'.$auth_user['cawangan'],['kodlaluan' => $kodlaluan])->json(); // $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>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({ var tablecustomers = $('#myTable').DataTable({
+1 -1
View File
@@ -315,7 +315,7 @@
const d = new Date(); const d = new Date();
let tahunsemasa = d.getFullYear(); let tahunsemasa = d.getFullYear();
let pusherenv = "{{ env('PUSHER_APP_KEY') }}"; let pusherenv = "{{ env('PUSHER_APP_KEY') }}";
let api_url = "{{ api_url_for_browser() }}"; let api_url = "{{ $api_url }}";
const formatter = new Intl.NumberFormat('en-US', { const formatter = new Intl.NumberFormat('en-US', {
minimumFractionDigits: 2 minimumFractionDigits: 2
+1 -1
View File
@@ -230,7 +230,7 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var cawangan = "{{ Auth::user()->cawangan }}"; var cawangan = "{{ Auth::user()->cawangan }}";
+1 -1
View File
@@ -318,7 +318,7 @@
</div> </div>
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var search = "<?php echo $search ?>"; var search = "<?php echo $search ?>";
var type_id = "<?php echo $idtype ?>"; var type_id = "<?php echo $idtype ?>";
$(document).ready(function(){ $(document).ready(function(){
+1 -1
View File
@@ -410,7 +410,7 @@
</div> </div>
<script> <script>
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "{{ $cawangan_info['kodcaw'] }}"; var kodcaw = "{{ $cawangan_info['kodcaw'] }}";
var ppc = "{{ Auth::user()->name }}"; var ppc = "{{ Auth::user()->name }}";
var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}"; var tagarrahnbid = "{{ $cawangan_info['tagarrahnbid'] }}";
+2 -2
View File
@@ -177,7 +177,7 @@
"scrollX": true "scrollX": true
}); });
let api = "{{ api_url_for_browser() }}"; let api = "{{ config('api.url') }}";
var kodcaw = "{{ Auth::user()->cawangan }}"; var kodcaw = "{{ Auth::user()->cawangan }}";
const formatter = new Intl.NumberFormat('en-US', { const formatter = new Intl.NumberFormat('en-US', {
@@ -271,7 +271,7 @@
async function updatelulus(e) async function updatelulus(e)
{ {
let api = "{{ api_url_for_browser() }}"; let api = "{{ config('api.url') }}";
let kodcaw = "{{ Auth::user()->cawangan }}"; let kodcaw = "{{ Auth::user()->cawangan }}";
const { value: katalaluan } = await Swal.fire({ const { value: katalaluan } = await Swal.fire({
@@ -299,7 +299,7 @@
<script> <script>
let api = "{{ api_url_for_browser() }}"; let api = "{{ config('api.url') }}";
$(document).ready(function() { $(document).ready(function() {
@@ -51,7 +51,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({ var tablecustomers = $('#myTable').DataTable({
@@ -1,63 +0,0 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="card">
<nav aria-label="breadcrumb">
<ol class="breadcrumb pb-3">
<li class="breadcrumb-item"><a href="{{ route('home') }}">Home</a></li>
<li class="breadcrumb-item active" aria-current="page">Aliran Tunai</li>
</ol>
</nav>
@if(session()->has('errormessage'))
<div class="alert alert-danger">
{{ session()->get('errormessage') }}
</div>
@endif
<div class="card-body text-center">
<div class="row form-group">
<div class="col-md-2">
</div>
<div class="col-md-10">
</div>
</div>
<div class="row">
<div class="col-md-5">
<form action="{{ route('alirantunai.laporancetak') }}" method="post">
@csrf
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1">Tarikh</span>
</div>
<input type="text" class="form-control" placeholder="Pilih Tarikh" aria-label="Tarikh" id="datetimepicker1" name="datetimepicker1" aria-describedby="basic-addon1">
<input type="submit" class="btn btn-primary ml-md-5" id="submit_button" name="submit_button" value="Cetak">
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () {
$('#datetimepicker1').datepicker({
format: 'dd-mm-yyyy'
});
});
var tablecustomers = $('#myTable').DataTable({
"ordering": false
});
</script>
@endsection
@@ -69,7 +69,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tabletebus = $('#myTable').DataTable({ var tabletebus = $('#myTable').DataTable({
@@ -62,7 +62,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablebatalgadai = $('#myTable').DataTable({ var tablebatalgadai = $('#myTable').DataTable({
@@ -63,7 +63,7 @@
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({ var tablecustomers = $('#myTable').DataTable({
@@ -47,7 +47,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({ var tablecustomers = $('#myTable').DataTable({
@@ -71,7 +71,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablegadai = $('#myTable').DataTable({ var tablegadai = $('#myTable').DataTable({
@@ -43,7 +43,7 @@
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () { $(document).ready( function () {
@@ -48,7 +48,7 @@
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
$(document).ready( function () { $(document).ready( function () {
@@ -40,7 +40,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablebatalgadai = $('#myTable').DataTable({ var tablebatalgadai = $('#myTable').DataTable({
@@ -67,7 +67,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({ var tablecustomers = $('#myTable').DataTable({
@@ -40,7 +40,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
// alert(btoa(api_url)); // alert(btoa(api_url));
@@ -54,7 +54,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tablecustomers = $('#myTable').DataTable({ var tablecustomers = $('#myTable').DataTable({
@@ -69,7 +69,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var tabletebus = $('#myTable').DataTable({ var tabletebus = $('#myTable').DataTable({
@@ -70,7 +70,7 @@
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var api_url = "{{ api_url_for_browser() }}"; var api_url = "<?php echo $api_url ?>";
var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>"; var kodcaw = "<?php echo $cawangan_info['kodcaw'] ?>";
var panjartebus = $('#myTable').DataTable({ var panjartebus = $('#myTable').DataTable({

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