Compare commits
36 Commits
fbec4b82fd
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0cb85c2375 | |||
| 2a0ffde016 | |||
| 92991f0d10 | |||
| 1f8642e230 | |||
| a825b0b467 | |||
| b0792cceb0 | |||
| 82f31baa6a | |||
| 7175d0dbcf | |||
| 15575dc8c0 | |||
| 3d3a7f35f9 | |||
| 46c7cc08a7 | |||
| 79ee2be97e | |||
| 55168f350a | |||
| 0a19fa3d4b | |||
| 03a0142066 | |||
| 5e7fe8c3ab | |||
| 358baf3453 | |||
| 7eebd79397 | |||
| f7dd2fae7b | |||
| b8cc3f38cc | |||
| c06e33bc1c | |||
| b95f68bd3f | |||
| c989197e76 | |||
| e3424e9161 | |||
| da06ff709c | |||
| d6b4685f54 | |||
| 173ce892b9 | |||
| 6af434360d | |||
| aaf784ad79 | |||
| 3456059db4 | |||
| cd9f83e21f | |||
| 1e174a48b6 | |||
| 80b8fd3a24 | |||
| 71990e7582 | |||
| 31dc30ed60 | |||
| bb8bcae8e8 |
@@ -0,0 +1,16 @@
|
|||||||
|
.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
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
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
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
APP_NAME=Laravel
|
||||||
|
APP_ENV=staging
|
||||||
|
APP_KEY=base64:O1XZDqK4H6+3GdrODgCaLr2l+OoWvgVhYr0GJ1KizW8=
|
||||||
|
APP_DEBUG=true
|
||||||
|
APP_URL=http://172.16.6.200:8091
|
||||||
|
|
||||||
|
HTTP_PORT=8091
|
||||||
|
MYSQL_PUBLISH_PORT=3309
|
||||||
|
|
||||||
|
API_URL=http://172.16.6.200:8090
|
||||||
|
API_URL_KOOP=http://172.16.6.200:8090
|
||||||
|
API_URL_PKB=http://172.16.6.200:8090
|
||||||
|
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
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
APP_NAME=Laravel
|
||||||
|
APP_ENV=local
|
||||||
|
APP_KEY=base64:WRTHcFTq5YARKVdA8YDUzsh9Ue8vD63ivgZgXNNBiGo=
|
||||||
|
APP_DEBUG=true
|
||||||
|
APP_URL=http://ujrahkopkb.erahn.com.my
|
||||||
|
API_URL=http://apiujrah-kopkb.erahn.com.my
|
||||||
|
#API_ARRAHNBID=http://lelong.test/api/
|
||||||
|
|
||||||
|
LOG_CHANNEL=stack
|
||||||
|
|
||||||
|
DB_CONNECTION=mysql
|
||||||
|
DB_HOST=127.0.0.1
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_DATABASE=kaunter_erahn
|
||||||
|
DB_USERNAME=spider
|
||||||
|
DB_PASSWORD=G0dz!ll4
|
||||||
|
|
||||||
|
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
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
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 .
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
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"
|
||||||
|
cp docker-compose.staging.yml "${DEPLOY_DIR}/docker-compose.yml"
|
||||||
|
cp docker/nginx/default.conf "${DEPLOY_DIR}/docker/nginx/default.conf"
|
||||||
|
rm -rf "${DEPLOY_DIR}/public"
|
||||||
|
cp -R public "${DEPLOY_DIR}/public"
|
||||||
|
|
||||||
|
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 --remove-orphans
|
||||||
|
|
||||||
|
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"
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Events;
|
||||||
|
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Foundation\Events\Dispatchable;
|
||||||
|
use Illuminate\Broadcasting\InteractsWithSockets;
|
||||||
|
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
|
||||||
|
|
||||||
|
class NotifikasiAnggota implements ShouldBroadcast
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithSockets, SerializesModels;
|
||||||
|
|
||||||
|
public $nokp;
|
||||||
|
public $status; // DILULUSKAN atau DITOLAK
|
||||||
|
public $komen;
|
||||||
|
public $tagoperasi;
|
||||||
|
|
||||||
|
public function __construct($nokp, $status, $komen, $tagoperasi = null)
|
||||||
|
{
|
||||||
|
$this->nokp = $nokp;
|
||||||
|
$this->status = strtoupper($status); // pastikan huruf besar DILULUSKAN/DITOLAK
|
||||||
|
$this->komen = $komen;
|
||||||
|
$this->tagoperasi = $tagoperasi;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function broadcastOn()
|
||||||
|
{
|
||||||
|
return ['notice-anggota'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function broadcastAs()
|
||||||
|
{
|
||||||
|
return 'my-anggota';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function broadcastWith()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'noic' => $this->nokp,
|
||||||
|
'status' => $this->status, // ikut format API updateAnggota
|
||||||
|
'komen' => $this->komen,
|
||||||
|
'tagoperasi' => $this->tagoperasi,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@ use Illuminate\Support\Facades\Auth;
|
|||||||
use Twilio\Rest\Client;
|
use Twilio\Rest\Client;
|
||||||
use App\Komoditi;
|
use App\Komoditi;
|
||||||
use App\Events\Dashboard\PelangganNotify;
|
use App\Events\Dashboard\PelangganNotify;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
|
||||||
@@ -24,7 +25,7 @@ class CustomersController extends Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->middleware('auth');
|
$this->middleware('auth');
|
||||||
$this->customerService = New CustomerService();
|
$this->customerService = new CustomerService();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Display a listing of the resource.
|
* Display a listing of the resource.
|
||||||
@@ -46,76 +47,233 @@ class CustomersController extends Controller
|
|||||||
return view('customers.' . $cawangan_info['version'] . '.index', compact('search', 'blacklist_search', 'cawangan_info', 'bank', 'api_url', 'idtype', 'pekerjaan'));
|
return view('customers.' . $cawangan_info['version'] . '.index', compact('search', 'blacklist_search', 'cawangan_info', 'bank', 'api_url', 'idtype', 'pekerjaan'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function info(Request $request){
|
public function info(Request $request)
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
|
|
||||||
|
|
||||||
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/customers/'. Session::get('noic'))->json();
|
// 🔹 Panggil maklumat cawangan
|
||||||
// dd($customer_info);
|
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
$pekerjaan = Http::withOptions(['verify' => config('app.api_verify')])->get($api_url . '/api/pekerjaan')->json();
|
->get($api_url . '/api/cawangan/' . $auth_user['cawangan'])
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// 🔹 Panggil maklumat pelanggan (customer)
|
||||||
|
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/customers/' . Session::get('noic'))
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// 🔹 Panggil maklumat pekerjaan
|
||||||
|
$pekerjaan = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/pekerjaan')
|
||||||
|
->json();
|
||||||
|
|
||||||
$komoditi = Komoditi::first();
|
$komoditi = Komoditi::first();
|
||||||
$min_komoditi = $komoditi['min_komoditi'];
|
$min_komoditi = $komoditi['min_komoditi'];
|
||||||
|
|
||||||
$bakilelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/bakilelong/cawangan/' . $auth_user['cawangan'] . '/' . Session::get('noic') . '/baki')->json();
|
// 🔹 Panggil baki lelong
|
||||||
$rugilelong = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/bakilelong/cawangan/' . $auth_user['cawangan'] . '/' . Session::get('noic') . '/rugi')->json();
|
$bakilelong = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/bakilelong/cawangan/' . $auth_user['cawangan'] . '/' . Session::get('noic') . '/baki')
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// 🔹 Panggil rugi lelong
|
||||||
|
$rugilelong = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/bakilelong/cawangan/' . $auth_user['cawangan'] . '/' . Session::get('noic') . '/rugi')
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// 🔹 Reset session sementara
|
||||||
$request->session()->forget('page_reload');
|
$request->session()->forget('page_reload');
|
||||||
$request->session()->forget('norujukan');
|
$request->session()->forget('norujukan');
|
||||||
|
|
||||||
$customer_page = ($cawangan_info['version'] == 'v1') ? 'customers.v1.info' : 'customers.v2.info';
|
$customer_page = ($cawangan_info['version'] == 'v1')
|
||||||
|
? 'customers.v1.info'
|
||||||
|
: 'customers.v2.info';
|
||||||
|
|
||||||
$getApprovalError = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getApproval',[
|
// Logik papar butang "Assign sebagai Anggota"
|
||||||
|
$showAssignAnggotaBtn = false;
|
||||||
|
$noic = Session::get('noic');
|
||||||
|
|
||||||
|
if (!empty($customer_info)) {
|
||||||
|
|
||||||
|
$anggota_info = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/customer/anggota', [
|
||||||
|
'noic' => $noic
|
||||||
|
])
|
||||||
|
->json();
|
||||||
|
$isAnggotaExist = isset($anggota_info) && !empty($anggota_info) && !isset($anggota_info['message']);
|
||||||
|
|
||||||
|
if ($isAnggotaExist && isset($customer_info['tag_anggota']) && $customer_info['tag_anggota'] == 0) {
|
||||||
|
$showAssignAnggotaBtn = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$getApprovalError = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/getApproval', [
|
||||||
'kodcaw' => $auth_user['cawangan'],
|
'kodcaw' => $auth_user['cawangan'],
|
||||||
'teller' => $auth_user['name'],
|
'teller' => $auth_user['name'],
|
||||||
])->json();
|
])
|
||||||
|
->json();
|
||||||
|
|
||||||
if ($request->tebus_auto_tawarruq_berjaya === 'true') {
|
if ($request->tebus_auto_tawarruq_berjaya === 'true') {
|
||||||
$request->session()->flash('activate_tab', 'SAG_baru');
|
$request->session()->flash('activate_tab', 'SAG_baru');
|
||||||
}
|
}
|
||||||
|
|
||||||
return view($customer_page,compact('cawangan_info','api_url','customer_info','bakilelong','rugilelong','min_komoditi','pekerjaan','getApprovalError'));
|
return view($customer_page, compact(
|
||||||
|
'cawangan_info',
|
||||||
|
'api_url',
|
||||||
|
'customer_info',
|
||||||
|
'bakilelong',
|
||||||
|
'rugilelong',
|
||||||
|
'min_komoditi',
|
||||||
|
'pekerjaan',
|
||||||
|
'getApprovalError',
|
||||||
|
'showAssignAnggotaBtn'
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function search(Request $request){
|
|
||||||
// dd($request->all());
|
public function search(Request $request)
|
||||||
|
{
|
||||||
$noic = $request->noic;
|
$noic = $request->noic;
|
||||||
$idtype = $request->customerIDType;
|
$idtype = $request->customerIDType;
|
||||||
Session::put('noic', $noic);
|
Session::put('noic', $noic);
|
||||||
|
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/'. $auth_user['cawangan'])->json();
|
|
||||||
$bank = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/bank')->json();
|
|
||||||
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/customers/'. $noic)->json();
|
|
||||||
$pekerjaan = Http::withOptions(['verify' => config('app.api_verify')])->get($api_url . '/api/pekerjaan')->json();
|
|
||||||
|
|
||||||
$blacklist = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/customer/blacklist',[
|
// Dapatkan maklumat asas
|
||||||
'nokp' => $noic
|
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
])->json();
|
->get($api_url . '/api/cawangan/' . $auth_user['cawangan'])
|
||||||
// if($customers_info){
|
->json();
|
||||||
// $customer_info = $customers_info[0];
|
|
||||||
// }else{
|
$bank = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
// $customer_info = $customers_info;
|
->get($api_url . '/api/bank')
|
||||||
// }
|
->json();
|
||||||
|
|
||||||
|
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/customers/' . $noic)
|
||||||
|
->json();
|
||||||
|
|
||||||
|
$pekerjaan = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/pekerjaan')
|
||||||
|
->json();
|
||||||
|
|
||||||
|
$blacklist = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/customer/blacklist', ['nokp' => $noic])
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// Reset session lama
|
||||||
$request->session()->forget('page_reload');
|
$request->session()->forget('page_reload');
|
||||||
$request->session()->forget('norujukan');
|
$request->session()->forget('norujukan');
|
||||||
|
|
||||||
$blacklist_search = false;
|
$blacklist_search = false;
|
||||||
$search = true;
|
$search = true;
|
||||||
|
|
||||||
|
// SEMAK STATUS ANGGOTA DAN PELANGGAN
|
||||||
|
$isAnggota = false;
|
||||||
|
$isPelanggan = false;
|
||||||
|
$isNewCustomer = false;
|
||||||
|
$showAssignAnggotaBtn = false;
|
||||||
|
$showDaftarPelangganBtn = false;
|
||||||
|
|
||||||
|
// Semak dalam sistem anggota
|
||||||
|
$anggota_info = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get(config('api.url') . '/api/customer/anggota', [
|
||||||
|
'noic' => $noic
|
||||||
|
])
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// Semak betul-betul jika ada rekod anggota
|
||||||
|
if (!empty($anggota_info) && isset($anggota_info['data']) && !empty($anggota_info['data'])) {
|
||||||
|
$isAnggota = true;
|
||||||
|
} elseif (isset($anggota_info['noic']) && !empty($anggota_info['noic'])) {
|
||||||
|
$isAnggota = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($customer_info && isset($customer_info['id'])) {
|
||||||
|
$isPelanggan = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tentukan butang mana nak paparkan (logik diperbetulkan)
|
||||||
|
if ($isPelanggan && !$isAnggota) {
|
||||||
|
// Pelanggan dah berdaftar tapi bukan anggota koperasi
|
||||||
|
$showAssignAnggotaBtn = true;
|
||||||
|
} elseif ($isAnggota && !$isPelanggan) {
|
||||||
|
// Anggota koperasi tapi belum berdaftar sebagai pelanggan
|
||||||
|
$showDaftarPelangganBtn = true;
|
||||||
|
} elseif (!$isAnggota && !$isPelanggan) {
|
||||||
|
// Bukan anggota dan bukan pelanggan (pelanggan baru)
|
||||||
|
$showDaftarPelangganBtn = true;
|
||||||
|
$isNewCustomer = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Debug log untuk semak nilai sebenar
|
||||||
|
// Log::info('DEBUG CUSTOMER STATUS', [
|
||||||
|
// 'noic' => $noic,
|
||||||
|
// 'isAnggota' => $isAnggota,
|
||||||
|
// 'isPelanggan' => $isPelanggan,
|
||||||
|
// 'isNewCustomer' => $isNewCustomer,
|
||||||
|
// 'showAssignAnggotaBtn' => $showAssignAnggotaBtn,
|
||||||
|
// 'showDaftarPelangganBtn' => $showDaftarPelangganBtn,
|
||||||
|
// ]);
|
||||||
|
|
||||||
if ($customer_info) {
|
if ($customer_info) {
|
||||||
|
// Ada maklumat pelanggan
|
||||||
if ($blacklist) {
|
if ($blacklist) {
|
||||||
$blacklist_search = true;
|
$blacklist_search = true;
|
||||||
return view('customers.' . $cawangan_info['version'] .'.index',compact('blacklist_search','customer_info','search','noic','cawangan_info','bank','api_url','idtype'));
|
return view('customers.' . $cawangan_info['version'] . '.index', compact(
|
||||||
|
'blacklist_search',
|
||||||
|
'customer_info',
|
||||||
|
'search',
|
||||||
|
'noic',
|
||||||
|
'cawangan_info',
|
||||||
|
'bank',
|
||||||
|
'api_url',
|
||||||
|
'idtype',
|
||||||
|
'isAnggota',
|
||||||
|
'isPelanggan',
|
||||||
|
'isNewCustomer',
|
||||||
|
'showAssignAnggotaBtn',
|
||||||
|
'showDaftarPelangganBtn',
|
||||||
|
'auth_user'
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
|
// Simpan dalam session & redirect ke paparan info pelanggan
|
||||||
Session::put('customer_info', $customer_info);
|
Session::put('customer_info', $customer_info);
|
||||||
return redirect()->route('customer_info')->with( ['customer_info' => $customer_info,'cawangan_info'=>$cawangan_info,'api_url'=>$api_url]);
|
return redirect()->route('customer_info')->with([
|
||||||
|
'customer_info' => $customer_info,
|
||||||
|
'cawangan_info' => $cawangan_info,
|
||||||
|
'api_url' => $api_url,
|
||||||
|
'isAnggota' => $isAnggota,
|
||||||
|
'isPelanggan' => $isPelanggan,
|
||||||
|
'isNewCustomer' => $isNewCustomer,
|
||||||
|
'showAssignAnggotaBtn' => $showAssignAnggotaBtn,
|
||||||
|
'showDaftarPelangganBtn' => $showDaftarPelangganBtn,
|
||||||
|
'auth_user' => $auth_user
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Tiada customer dalam sistem
|
||||||
if ($blacklist) {
|
if ($blacklist) {
|
||||||
$blacklist_search = true;
|
$blacklist_search = true;
|
||||||
return view('customers.' . $cawangan_info['version'] . '.index',compact('blacklist_search','customer_info','search','noic','cawangan_info','bank','api_url','idtype','pekerjaan'));
|
|
||||||
}else{
|
|
||||||
return view('customers.' . $cawangan_info['version'] . '.index',compact('blacklist_search','customer_info','search','noic','cawangan_info','bank','api_url','idtype','pekerjaan'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return view('customers.' . $cawangan_info['version'] . '.index', compact(
|
||||||
|
'blacklist_search',
|
||||||
|
'customer_info',
|
||||||
|
'search',
|
||||||
|
'noic',
|
||||||
|
'cawangan_info',
|
||||||
|
'bank',
|
||||||
|
'api_url',
|
||||||
|
'idtype',
|
||||||
|
'pekerjaan',
|
||||||
|
'isAnggota',
|
||||||
|
'isPelanggan',
|
||||||
|
'isNewCustomer',
|
||||||
|
'showAssignAnggotaBtn',
|
||||||
|
'showDaftarPelangganBtn',
|
||||||
|
'auth_user'
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,8 +338,7 @@ class CustomersController extends Controller
|
|||||||
|
|
||||||
if ($latest_customer == null) {
|
if ($latest_customer == null) {
|
||||||
$nosiri_latest = 1;
|
$nosiri_latest = 1;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$nosiri_latest = $latest_customer['nosiri'] + 1;
|
$nosiri_latest = $latest_customer['nosiri'] + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +356,6 @@ class CustomersController extends Controller
|
|||||||
'kodnegeri' => $request->kodnegeri,
|
'kodnegeri' => $request->kodnegeri,
|
||||||
'user' => auth()->user(),
|
'user' => auth()->user(),
|
||||||
])->json();
|
])->json();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/customers/create/' . $auth_user['cawangan'], [
|
$customer_info = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/customers/create/' . $auth_user['cawangan'], [
|
||||||
@@ -238,7 +394,8 @@ class CustomersController extends Controller
|
|||||||
return redirect()->route('customer_info')->with(['customer_info' => $customer_info]);
|
return redirect()->route('customer_info')->with(['customer_info' => $customer_info]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getOTP(Request $request){
|
public function getOTP(Request $request)
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
$expired = Carbon::now();
|
$expired = Carbon::now();
|
||||||
$expired = new Carbon();
|
$expired = new Carbon();
|
||||||
@@ -253,13 +410,68 @@ class CustomersController extends Controller
|
|||||||
$recipient = '6' . $customer['telefon'];
|
$recipient = '6' . $customer['telefon'];
|
||||||
// $recipient = '60189025461';
|
// $recipient = '60189025461';
|
||||||
//pembinaan token
|
//pembinaan token
|
||||||
function token($length) {
|
function token($length)
|
||||||
|
{
|
||||||
$characters = array(
|
$characters = array(
|
||||||
"A","B","C","D","E","F","G","H","J","K","L","M",
|
"A",
|
||||||
"N","P","Q","R","S","T","U","V","W","X","Y","Z",
|
"B",
|
||||||
"a","b","c","d","e","f","g","h","i","j","k","m",
|
"C",
|
||||||
"n","o","p","q","r","s","t","u","v","w","x","y","z",
|
"D",
|
||||||
"1","2","3","4","5","6","7","8","9");
|
"E",
|
||||||
|
"F",
|
||||||
|
"G",
|
||||||
|
"H",
|
||||||
|
"J",
|
||||||
|
"K",
|
||||||
|
"L",
|
||||||
|
"M",
|
||||||
|
"N",
|
||||||
|
"P",
|
||||||
|
"Q",
|
||||||
|
"R",
|
||||||
|
"S",
|
||||||
|
"T",
|
||||||
|
"U",
|
||||||
|
"V",
|
||||||
|
"W",
|
||||||
|
"X",
|
||||||
|
"Y",
|
||||||
|
"Z",
|
||||||
|
"a",
|
||||||
|
"b",
|
||||||
|
"c",
|
||||||
|
"d",
|
||||||
|
"e",
|
||||||
|
"f",
|
||||||
|
"g",
|
||||||
|
"h",
|
||||||
|
"i",
|
||||||
|
"j",
|
||||||
|
"k",
|
||||||
|
"m",
|
||||||
|
"n",
|
||||||
|
"o",
|
||||||
|
"p",
|
||||||
|
"q",
|
||||||
|
"r",
|
||||||
|
"s",
|
||||||
|
"t",
|
||||||
|
"u",
|
||||||
|
"v",
|
||||||
|
"w",
|
||||||
|
"x",
|
||||||
|
"y",
|
||||||
|
"z",
|
||||||
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
"5",
|
||||||
|
"6",
|
||||||
|
"7",
|
||||||
|
"8",
|
||||||
|
"9"
|
||||||
|
);
|
||||||
if ($length < 0 || $length > count($characters)) return null;
|
if ($length < 0 || $length > count($characters)) return null;
|
||||||
shuffle($characters);
|
shuffle($characters);
|
||||||
return implode("", array_slice($characters, 0, $length));
|
return implode("", array_slice($characters, 0, $length));
|
||||||
@@ -349,4 +561,17 @@ class CustomersController extends Controller
|
|||||||
return ($status);
|
return ($status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function assignAnggota(Request $request)
|
||||||
|
{
|
||||||
|
$noic = $request->noic;
|
||||||
|
|
||||||
|
$response = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->put(config('api.url') . '/api/customers/' . $noic . '/assign-anggota');
|
||||||
|
|
||||||
|
if ($response->successful()) {
|
||||||
|
return redirect()->back()->with('success', 'Pelanggan berjaya ditandakan sebagai anggota koperasi.');
|
||||||
|
} else {
|
||||||
|
return redirect()->back()->with('error', 'Gagal mengemaskini status anggota. Sila cuba semula.');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ use Carbon\Carbon;
|
|||||||
use App\Http\Controllers\AliranTunaiController;
|
use App\Http\Controllers\AliranTunaiController;
|
||||||
use App\User;
|
use App\User;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
|
|
||||||
class GadaianController extends Controller
|
class GadaianController extends Controller
|
||||||
{
|
{
|
||||||
public $AliranTunaiController;
|
public $AliranTunaiController;
|
||||||
@@ -26,11 +28,12 @@ class GadaianController extends Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->middleware('auth');
|
$this->middleware('auth');
|
||||||
$this->customerService = New CustomerService();
|
$this->customerService = new CustomerService();
|
||||||
$this->AliranTunaiController = New AliranTunaiController();
|
$this->AliranTunaiController = new AliranTunaiController();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function index(Request $request){
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
$current = Carbon::now();
|
$current = Carbon::now();
|
||||||
@@ -95,7 +98,8 @@ class GadaianController extends Controller
|
|||||||
return view('gadaian.' . $cawangan_info['version'] . '.index', compact('customer_info', 'limit_pinjaman_semasa', 'cawangan_info', 'norujukan', 'api_url', 'current'));
|
return view('gadaian.' . $cawangan_info['version'] . '.index', compact('customer_info', 'limit_pinjaman_semasa', 'cawangan_info', 'norujukan', 'api_url', 'current'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(Request $request,$norujukan){
|
public function edit(Request $request, $norujukan)
|
||||||
|
{
|
||||||
|
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
$current = Carbon::now();
|
$current = Carbon::now();
|
||||||
@@ -122,7 +126,8 @@ class GadaianController extends Controller
|
|||||||
return view('gadaian.' . $cawangan_info['version'] . '.edit', compact('customer_info', 'gadaiannorujukan', 'limit_pinjaman_semasa', 'cawangan_info', 'norujukan', 'api_url'));
|
return view('gadaian.' . $cawangan_info['version'] . '.edit', compact('customer_info', 'gadaiannorujukan', 'limit_pinjaman_semasa', 'cawangan_info', 'norujukan', 'api_url'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function editmarhun(Request $request){
|
public function editmarhun(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
|
|
||||||
@@ -135,7 +140,8 @@ class GadaianController extends Controller
|
|||||||
return $gadaiannorujukan;
|
return $gadaiannorujukan;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ubahmarhun(Request $request){
|
public function ubahmarhun(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
|
|
||||||
@@ -153,10 +159,14 @@ class GadaianController extends Controller
|
|||||||
return redirect()->back();
|
return redirect()->back();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function store(Request $request){
|
public function store(Request $request)
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
//$total_nilai_marhun = $request->total_nilai_marhun;
|
//$total_nilai_marhun = $request->total_nilai_marhun;
|
||||||
//need to get total nilai marhun by api get from table marhun
|
//need to get total nilai marhun by api get from table marhun
|
||||||
|
|
||||||
|
//Log::info('[DEBUG-GADAI] Request Input Data', $request->all());
|
||||||
|
|
||||||
$marhun = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/marhun/gadai/' . $auth_user['cawangan'] . '/' . $request->norujukan_gadai)->json();
|
$marhun = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/marhun/gadai/' . $auth_user['cawangan'] . '/' . $request->norujukan_gadai)->json();
|
||||||
$total_nilai_marhun = $marhun;
|
$total_nilai_marhun = $marhun;
|
||||||
$total_nilai_marhun = str_replace(',', '', $total_nilai_marhun);
|
$total_nilai_marhun = str_replace(',', '', $total_nilai_marhun);
|
||||||
@@ -171,6 +181,7 @@ class GadaianController extends Controller
|
|||||||
$keuntungan12bulan = $keuntungan_sebln * 12;
|
$keuntungan12bulan = $keuntungan_sebln * 12;
|
||||||
|
|
||||||
$hargajualan = $request->pinjaman + $keuntungan12bulan;
|
$hargajualan = $request->pinjaman + $keuntungan12bulan;
|
||||||
|
//Log::info('DEBUG NOKP:' . $request->nokp);
|
||||||
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/' . $auth_user['cawangan'] . '/' . $request->norujukan_gadai, [
|
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/' . $auth_user['cawangan'] . '/' . $request->norujukan_gadai, [
|
||||||
'kodcaw' => $auth_user['cawangan'],
|
'kodcaw' => $auth_user['cawangan'],
|
||||||
'nilaimarhun' => round($total_nilai_marhun, 2),
|
'nilaimarhun' => round($total_nilai_marhun, 2),
|
||||||
@@ -189,6 +200,7 @@ class GadaianController extends Controller
|
|||||||
'ujrah' => $ujrah,
|
'ujrah' => $ujrah,
|
||||||
'onepercent' => $onepercent,
|
'onepercent' => $onepercent,
|
||||||
'margin_semasa' => $margin_pinjaman,
|
'margin_semasa' => $margin_pinjaman,
|
||||||
|
'nokp' => $request->nokp,
|
||||||
])->json();
|
])->json();
|
||||||
|
|
||||||
|
|
||||||
@@ -210,7 +222,8 @@ class GadaianController extends Controller
|
|||||||
return redirect()->route('customer_info');
|
return redirect()->route('customer_info');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function editstore(Request $request){
|
public function editstore(Request $request)
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
|
|
||||||
$total_nilai_marhun = $request->total_nilai_marhun;
|
$total_nilai_marhun = $request->total_nilai_marhun;
|
||||||
@@ -257,7 +270,8 @@ class GadaianController extends Controller
|
|||||||
return redirect()->route('customer_info');
|
return redirect()->route('customer_info');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function batal(Request $request){
|
public function batal(Request $request)
|
||||||
|
{
|
||||||
$norujukan = $request->norujukan;
|
$norujukan = $request->norujukan;
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
|
|
||||||
@@ -267,7 +281,8 @@ class GadaianController extends Controller
|
|||||||
return redirect()->route('customer_info');
|
return redirect()->route('customer_info');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function batalmarhun(Request $request){
|
public function batalmarhun(Request $request)
|
||||||
|
{
|
||||||
$norujukan = $request->norujukan;
|
$norujukan = $request->norujukan;
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
|
|
||||||
@@ -278,7 +293,8 @@ class GadaianController extends Controller
|
|||||||
// return redirect()->route('customer_info');
|
// return redirect()->route('customer_info');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function cetakSAG(Request $request){
|
public function cetakSAG(Request $request)
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
|
|
||||||
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/cetak/' . $auth_user['cawangan'] . '/' . $request->norujukan_modal);
|
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/cetak/' . $auth_user['cawangan'] . '/' . $request->norujukan_modal);
|
||||||
@@ -286,7 +302,8 @@ class GadaianController extends Controller
|
|||||||
return redirect()->route('home');
|
return redirect()->route('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function serahMarhun(Request $request){
|
public function serahMarhun(Request $request)
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
$norujukan_serah = $request->norujukanpilih;
|
$norujukan_serah = $request->norujukanpilih;
|
||||||
|
|
||||||
@@ -310,7 +327,8 @@ class GadaianController extends Controller
|
|||||||
return redirect()->route('home');
|
return redirect()->route('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function printSAG(Request $request){
|
public function printSAG(Request $request)
|
||||||
|
{
|
||||||
$norujukan = $request->norujukan_modal;
|
$norujukan = $request->norujukan_modal;
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
$auth_username = $auth_user['name'];
|
$auth_username = $auth_user['name'];
|
||||||
@@ -320,13 +338,11 @@ class GadaianController extends Controller
|
|||||||
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $auth_user['cawangan'] . '/' . $norujukan)->json();
|
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $auth_user['cawangan'] . '/' . $norujukan)->json();
|
||||||
$gadai_detail = $gadai[0];
|
$gadai_detail = $gadai[0];
|
||||||
|
|
||||||
if(isset($request->jenisprint))
|
if (isset($request->jenisprint)) {
|
||||||
{
|
|
||||||
|
|
||||||
$cetak_sag = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/cetak/' . $auth_user['cawangan'] . '/' . $norujukan, [
|
$cetak_sag = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/gadai/norujukan/cetak/' . $auth_user['cawangan'] . '/' . $norujukan, [
|
||||||
'penilai' => $auth_user['name']
|
'penilai' => $auth_user['name']
|
||||||
]);
|
]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$kakitangan = User::where([['role_harian', 'khazanah'], ['cawangan', $kodcaw]])->first();
|
$kakitangan = User::where([['role_harian', 'khazanah'], ['cawangan', $kodcaw]])->first();
|
||||||
@@ -484,8 +500,7 @@ class GadaianController extends Controller
|
|||||||
|
|
||||||
$transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/' . $id)->json();
|
$transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/' . $id)->json();
|
||||||
|
|
||||||
foreach($transaction as $trans)
|
foreach ($transaction as $trans) {
|
||||||
{
|
|
||||||
$totaltransaction += $trans['duit_masuk'];
|
$totaltransaction += $trans['duit_masuk'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -528,8 +543,7 @@ class GadaianController extends Controller
|
|||||||
|
|
||||||
$transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/' . $id)->json();
|
$transaction = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/' . $id)->json();
|
||||||
|
|
||||||
foreach($transaction as $trans)
|
foreach ($transaction as $trans) {
|
||||||
{
|
|
||||||
$totaltransaction += $trans['duit_masuk'];
|
$totaltransaction += $trans['duit_masuk'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -577,8 +591,7 @@ class GadaianController extends Controller
|
|||||||
|
|
||||||
$transaction_tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/one/' . $id)->json();
|
$transaction_tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/one/' . $id)->json();
|
||||||
|
|
||||||
foreach($transaction as $trans)
|
foreach ($transaction as $trans) {
|
||||||
{
|
|
||||||
$totaltransaction += $trans['duit_masuk'];
|
$totaltransaction += $trans['duit_masuk'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -601,8 +614,9 @@ class GadaianController extends Controller
|
|||||||
|
|
||||||
$totalBayaranAnsuran = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/norujukan/total/ansuran', ['norujukan' => $id])->json();
|
$totalBayaranAnsuran = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/transaction/norujukan/total/ansuran', ['norujukan' => $id])->json();
|
||||||
|
|
||||||
// $totalrebate = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/reports/totalrebate',['norujukan'=>$id])->json();
|
$totalrebate = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/reports/totalrebate', ['norujukan' => $id])->json();
|
||||||
|
|
||||||
|
// dd($wakil);
|
||||||
$surat_wakil = [];
|
$surat_wakil = [];
|
||||||
if (sizeof($wakil) != 0) {
|
if (sizeof($wakil) != 0) {
|
||||||
$wakil = $wakil[0];
|
$wakil = $wakil[0];
|
||||||
@@ -611,12 +625,8 @@ class GadaianController extends Controller
|
|||||||
|
|
||||||
$khazanah_user = User::where('role_harian', 'khazanah')->where('cawangan', $auth_user['cawangan'])->select('name')->first();
|
$khazanah_user = User::where('role_harian', 'khazanah')->where('cawangan', $auth_user['cawangan'])->select('name')->first();
|
||||||
|
|
||||||
$ujrah_rebate = $transaction_tebus['ujrah'] - $transaction_tebus['ujrah_rebet'];
|
|
||||||
$keuntungan_rebate = $transaction_tebus['onepercent'] - $transaction_tebus['onepercent_rebet'];
|
|
||||||
|
|
||||||
|
|
||||||
if ($gadai['tagbaru'] == 1) {
|
if ($gadai['tagbaru'] == 1) {
|
||||||
return view('print.resittebus_ujrah',compact('ujrah_rebate','keuntungan_rebate','surat_wakil','transaction_tebus', 'transaction','gadai','cawangan_info','customers_info','penebusan','wakil','totaltransaction','totalBayaranAnsuran', 'khazanah_user'));
|
return view('print.resittebus_ujrah', compact('surat_wakil', 'totalrebate', 'transaction_tebus', 'transaction', 'gadai', 'cawangan_info', 'customers_info', 'penebusan', 'wakil', 'totaltransaction', 'totalBayaranAnsuran', 'khazanah_user'));
|
||||||
} else {
|
} else {
|
||||||
return view('print.resittebus', compact('surat_wakil', 'transaction_tebus', 'transaction', 'gadai', 'cawangan_info', 'customers_info', 'penebusan', 'wakil', 'totaltransaction', 'totalBayaranAnsuran', 'khazanah_user'));
|
return view('print.resittebus', compact('surat_wakil', 'transaction_tebus', 'transaction', 'gadai', 'cawangan_info', 'customers_info', 'penebusan', 'wakil', 'totaltransaction', 'totalBayaranAnsuran', 'khazanah_user'));
|
||||||
}
|
}
|
||||||
@@ -646,15 +656,12 @@ class GadaianController extends Controller
|
|||||||
|
|
||||||
// dd($penebusan['nowakil']);
|
// dd($penebusan['nowakil']);
|
||||||
|
|
||||||
if($penebusan['nowakil'] != 0)
|
if ($penebusan['nowakil'] != 0) {
|
||||||
{
|
|
||||||
$wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getwakil/' . $auth_user['cawangan'] . '/code/' . $penebusan['nowakil'])->json();
|
$wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getwakil/' . $auth_user['cawangan'] . '/code/' . $penebusan['nowakil'])->json();
|
||||||
|
|
||||||
if (sizeof($wakil) != 0)
|
if (sizeof($wakil) != 0)
|
||||||
$wakil = $wakil[0];
|
$wakil = $wakil[0];
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$wakil = [];
|
$wakil = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,9 +692,7 @@ class GadaianController extends Controller
|
|||||||
if (sizeof($wakil) != 0) {
|
if (sizeof($wakil) != 0) {
|
||||||
$wakil = $wakil[0];
|
$wakil = $wakil[0];
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$wakil = [];
|
$wakil = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,17 +728,14 @@ class GadaianController extends Controller
|
|||||||
// dd($penebusan['nowakil']);
|
// dd($penebusan['nowakil']);
|
||||||
|
|
||||||
$surat_wakil = [];
|
$surat_wakil = [];
|
||||||
if($penebusan['nowakil'] != 0)
|
if ($penebusan['nowakil'] != 0) {
|
||||||
{
|
|
||||||
$wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getwakil/' . $auth_user['cawangan'] . '/code/' . $penebusan['nowakil'])->json();
|
$wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getwakil/' . $auth_user['cawangan'] . '/code/' . $penebusan['nowakil'])->json();
|
||||||
|
|
||||||
if (sizeof($wakil) != 0) {
|
if (sizeof($wakil) != 0) {
|
||||||
$wakil = $wakil[0];
|
$wakil = $wakil[0];
|
||||||
$surat_wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getsuratwakil/' . $auth_user['cawangan'] . '/' . $id)->json();
|
$surat_wakil = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/getsuratwakil/' . $auth_user['cawangan'] . '/' . $id)->json();
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$wakil = [];
|
$wakil = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -750,28 +752,23 @@ class GadaianController extends Controller
|
|||||||
|
|
||||||
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $request->norujukan)->json();
|
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $request->norujukan)->json();
|
||||||
|
|
||||||
if(sizeof($gadai) > 0)
|
if (sizeof($gadai) > 0) {
|
||||||
{
|
|
||||||
$history = $gadai[0][0]['historygadaian'];
|
$history = $gadai[0][0]['historygadaian'];
|
||||||
$dahtebus = $gadai[0][0]['sttebus'];
|
$dahtebus = $gadai[0][0]['sttebus'];
|
||||||
$norujukan = $gadai[0][0]['norujukan'];
|
$norujukan = $gadai[0][0]['norujukan'];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$count = 0;
|
$count = 0;
|
||||||
$arrayhist = [];
|
$arrayhist = [];
|
||||||
|
|
||||||
while($history != "0" && $history != '' || $dahtebus == 'T')
|
while ($history != "0" && $history != '' || $dahtebus == 'T') {
|
||||||
{
|
if ($history != "0" && $history != '') {
|
||||||
if($history != "0" && $history != '')
|
|
||||||
{
|
|
||||||
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $history)->json();
|
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $history)->json();
|
||||||
$tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/listpenebusanhistory/' . $auth_user['cawangan'], [
|
$tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/listpenebusanhistory/' . $auth_user['cawangan'], [
|
||||||
"norujukan" => $history
|
"norujukan" => $history
|
||||||
])->json();
|
])->json();
|
||||||
|
|
||||||
if(sizeof($gadai) > 0)
|
if (sizeof($gadai) > 0) {
|
||||||
{
|
|
||||||
if ($history == $gadai[0][0]['historygadaian'])
|
if ($history == $gadai[0][0]['historygadaian'])
|
||||||
$history = 0;
|
$history = 0;
|
||||||
else {
|
else {
|
||||||
@@ -781,9 +778,7 @@ class GadaianController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
$count++;
|
$count++;
|
||||||
|
} else {
|
||||||
}
|
|
||||||
else{
|
|
||||||
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $norujukan)->json();
|
$gadai = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/gadai/norujukan/' . $norujukan)->json();
|
||||||
$tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/listpenebusanhistory/' . $auth_user['cawangan'], [
|
$tebus = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/listpenebusanhistory/' . $auth_user['cawangan'], [
|
||||||
"norujukan" => $norujukan
|
"norujukan" => $norujukan
|
||||||
@@ -813,12 +808,9 @@ class GadaianController extends Controller
|
|||||||
"norujukan" => $norujukan
|
"norujukan" => $norujukan
|
||||||
])->json();
|
])->json();
|
||||||
|
|
||||||
if(sizeof($kelulusan) > 0)
|
if (sizeof($kelulusan) > 0) {
|
||||||
{
|
|
||||||
$kelulusan = $kelulusan['benar'];
|
$kelulusan = $kelulusan['benar'];
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$kelulusan = '';
|
$kelulusan = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -872,6 +864,87 @@ class GadaianController extends Controller
|
|||||||
return response()->json($createlulus, 201);
|
return response()->json($createlulus, 201);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function createkelulusanAnggota(Request $request)
|
||||||
|
{
|
||||||
|
$auth_user = Auth::user();
|
||||||
|
$api_url = config('api.url');
|
||||||
|
$verify_ssl = config('app.api_verify');
|
||||||
|
|
||||||
|
// 🔸 Validasi asas
|
||||||
|
$request->validate([
|
||||||
|
'norujukan' => 'required|string',
|
||||||
|
'noic' => 'required|string',
|
||||||
|
'komen' => 'required|string',
|
||||||
|
'teller' => 'required|string',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$norujukan = $request->norujukan;
|
||||||
|
$current = Carbon::now();
|
||||||
|
|
||||||
|
// 1️⃣ Dapatkan info cawangan
|
||||||
|
$cawangan_info = Http::withOptions(['verify' => $verify_ssl])
|
||||||
|
->get("{$api_url}/api/cawangan/{$auth_user->cawangan}")
|
||||||
|
->json();
|
||||||
|
|
||||||
|
if (empty($cawangan_info)) {
|
||||||
|
return response()->json(['message' => 'Maklumat cawangan tidak ditemui.'], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2️⃣ Dapatkan siri terkini (supaya sistem tahu kelulusan ke berapa)
|
||||||
|
$getsiri = Http::withOptions(['verify' => $verify_ssl])
|
||||||
|
->get("{$api_url}/api/ListLatestLulus/{$auth_user->cawangan}/{$norujukan}")
|
||||||
|
->json();
|
||||||
|
|
||||||
|
$siri = isset($getsiri['siri']) ? ((int) $getsiri['siri'] + 1) : 1;
|
||||||
|
|
||||||
|
$createlulus = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url') . '/api/CreateLulus/' . $auth_user['cawangan'] . '/' . $norujukan, [
|
||||||
|
'mohon' => $request->mohon,
|
||||||
|
'teller' => $auth_user['name'],
|
||||||
|
'komen' => $request->komen,
|
||||||
|
'status' => $request->status,
|
||||||
|
'ansuran' => $request->ansuran,
|
||||||
|
'tagoperasi' => ($request->tagoperasi) ? $request->tagoperasi : 0,
|
||||||
|
])->json();
|
||||||
|
|
||||||
|
// 3️⃣ Hantar permohonan ke API utama
|
||||||
|
$payload = [
|
||||||
|
'komen' => $request->komen,
|
||||||
|
'dategadai' => $current->toDateString(),
|
||||||
|
'bilgadai' => 1,
|
||||||
|
'siri' => $siri,
|
||||||
|
'status' => 'TUNGGU KELULUSAN OPERASI',
|
||||||
|
'teller' => $request->teller,
|
||||||
|
'peloperasi' => 'operasi',
|
||||||
|
'mohon' => 'Assign Anggota',
|
||||||
|
'noic' => $request->noic,
|
||||||
|
'jenistebus' => 'A', // “A” = anggota
|
||||||
|
'tagoperasi' => 1, // 1 = tunggu kelulusan operasi
|
||||||
|
];
|
||||||
|
|
||||||
|
$createLulus = Http::withOptions(['verify' => $verify_ssl])
|
||||||
|
->post("{$api_url}/api/CreateKelulusanAnggota/{$auth_user->cawangan}/{$norujukan}/roles/operasi", $payload)
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// 4️⃣ Jika API gagal
|
||||||
|
if (isset($createLulus['error']) || !$createLulus) {
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Gagal menghantar permohonan kelulusan operasi.',
|
||||||
|
'error' => $createLulus['error'] ?? $createLulus
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5️⃣ Trigger event untuk notifikasi operasi
|
||||||
|
event(new StatusLiked($auth_user->cawangan, $auth_user->name));
|
||||||
|
|
||||||
|
// 6️⃣ Hantar respon berjaya
|
||||||
|
return response()->json([
|
||||||
|
'message' => 'Permohonan kelulusan operasi (Assign Anggota) berjaya dihantar.',
|
||||||
|
'siri' => $siri,
|
||||||
|
'api_response' => $createLulus,
|
||||||
|
], 201);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///END KELULUSAN///
|
///END KELULUSAN///
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2856,7 +2856,7 @@ class KhazanahController extends Controller
|
|||||||
event(new NotifikasiAGH($auth_user['cawangan'],'Tak boleh generate dah kerana sudah digenerate dah.','error',$auth_user['name']));
|
event(new NotifikasiAGH($auth_user['cawangan'],'Tak boleh generate dah kerana sudah digenerate dah.','error',$auth_user['name']));
|
||||||
$daftar = 400;
|
$daftar = 400;
|
||||||
}else{
|
}else{
|
||||||
$daftarpolis = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/polis/create/',[
|
$daftarpolis = Http::withOptions(['verify' => config('app.api_verify')])->post(config('api.url').'/api/polis/create',[
|
||||||
|
|
||||||
'kodcaw' =>$auth_user['cawangan'],
|
'kodcaw' =>$auth_user['cawangan'],
|
||||||
'norujukan' => $request->norujukanhidden,
|
'norujukan' => $request->norujukanhidden,
|
||||||
@@ -3933,9 +3933,9 @@ class KhazanahController extends Controller
|
|||||||
$totalhartasemasa = $array_ig->sum_harta;
|
$totalhartasemasa = $array_ig->sum_harta;
|
||||||
$totaltanggungansemasa = $array_ig->sum_tanggungan;
|
$totaltanggungansemasa = $array_ig->sum_tanggungan;
|
||||||
|
|
||||||
if($this->floatvalue(number_format($totalhartasemasa,2)) != $this->floatvalue(number_format($totaltanggungansemasa,2))){
|
// if($this->floatvalue(number_format($totalhartasemasa,2)) != $this->floatvalue(number_format($totaltanggungansemasa,2))){
|
||||||
return redirect()->route('laporan.imbangdugaakru')->with('error','Imbangduga tidak sama. Sila berhubung dengan pihak IT');
|
// return redirect()->route('laporan.imbangdugaakru')->with('error','Imbangduga tidak sama. Sila berhubung dengan pihak IT');
|
||||||
}
|
// }
|
||||||
|
|
||||||
return view('print.laporan_imbangduga-akru',compact('tarikh_imbangan', 'tarikh_imbangan2','hartasemasa','tanggungansemasa','totalhartasemasa','totaltanggungansemasa','tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail'));
|
return view('print.laporan_imbangduga-akru',compact('tarikh_imbangan', 'tarikh_imbangan2','hartasemasa','tanggungansemasa','totalhartasemasa','totaltanggungansemasa','tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail'));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ namespace App\Http\Controllers;
|
|||||||
use App\Events\OperasiNotice;
|
use App\Events\OperasiNotice;
|
||||||
use App\Events\StatusLiked;
|
use App\Events\StatusLiked;
|
||||||
use App\Events\NotifikasiKelulusan;
|
use App\Events\NotifikasiKelulusan;
|
||||||
|
use App\Events\NotifikasiAnggota;
|
||||||
use App\Events\Dashboard\KomoditiNotify;
|
use App\Events\Dashboard\KomoditiNotify;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
@@ -25,7 +26,8 @@ class OperasiController extends Controller
|
|||||||
$this->middleware('auth');
|
$this->middleware('auth');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function kelulusan(Request $request){
|
public function kelulusan(Request $request)
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan'])->json();
|
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan'])->json();
|
||||||
@@ -35,15 +37,12 @@ class OperasiController extends Controller
|
|||||||
$arraykelulusan = [];
|
$arraykelulusan = [];
|
||||||
|
|
||||||
|
|
||||||
foreach($kelulusan as $index=>$lulus)
|
foreach ($kelulusan as $index => $lulus) {
|
||||||
{
|
foreach ($lulus['kelulusanall'] as $index => $kel) {
|
||||||
foreach($lulus['kelulusanall'] as $index=>$kel)
|
|
||||||
{
|
|
||||||
array_push($arraykelulusan, ["cawangan" => $lulus['cawangan'], "cawangankod" => $lulus['cawangankod'], "namateller" => $kel['teller'], 'siri' => $kel['siri'], "norujukan" => $kel['norujukan'], 'pinjaman' => $kel['jumpinj'], 'komen' => $kel['komen'], 'nilaimarhun' => ($kel['nilaimarhun'] ?? '-'), 'berat' => ($kel['berat'] ?? '-'), 'margin' => ($kel['margin'] ?? '-'), 'status' => ($kel['status'] ?? '-'), 'pelulus' => $kel['pelulus']]);
|
array_push($arraykelulusan, ["cawangan" => $lulus['cawangan'], "cawangankod" => $lulus['cawangankod'], "namateller" => $kel['teller'], 'siri' => $kel['siri'], "norujukan" => $kel['norujukan'], 'pinjaman' => $kel['jumpinj'], 'komen' => $kel['komen'], 'nilaimarhun' => ($kel['nilaimarhun'] ?? '-'), 'berat' => ($kel['berat'] ?? '-'), 'margin' => ($kel['margin'] ?? '-'), 'status' => ($kel['status'] ?? '-'), 'pelulus' => $kel['pelulus']]);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($lulus['kelulusanMohonid'] as $index=>$mohon)
|
foreach ($lulus['kelulusanMohonid'] as $index => $mohon) {
|
||||||
{
|
|
||||||
array_push($arraykelulusan, ["mohonid" => true, "ansuran" => $mohon['ansuran'], "cawangan" => $lulus['cawangan'], "cawangankod" => $lulus['cawangankod'], "namateller" => $mohon['teller'], 'recno' => $mohon['recno'], "norujukan" => $mohon['norujukan'], 'pinjaman' => $mohon['pinjaman'], 'komen' => $mohon['katalaluan'], 'nilaimarhun' => ($mohon['nilaimarhun'] ?? '-'), 'berat' => ($mohon['berat'] ?? '-'), 'margin' => ($mohon['margin'] ?? '-'), 'status' => ($mohon['mohon'] ?? '-')]);
|
array_push($arraykelulusan, ["mohonid" => true, "ansuran" => $mohon['ansuran'], "cawangan" => $lulus['cawangan'], "cawangankod" => $lulus['cawangankod'], "namateller" => $mohon['teller'], 'recno' => $mohon['recno'], "norujukan" => $mohon['norujukan'], 'pinjaman' => $mohon['pinjaman'], 'komen' => $mohon['katalaluan'], 'nilaimarhun' => ($mohon['nilaimarhun'] ?? '-'), 'berat' => ($mohon['berat'] ?? '-'), 'margin' => ($mohon['margin'] ?? '-'), 'status' => ($mohon['mohon'] ?? '-')]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,12 +62,9 @@ class OperasiController extends Controller
|
|||||||
|
|
||||||
$kelulusan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/SenaraiDahLulus/' . $auth_user['cawangan'] . '/' . $norujukan)->json();
|
$kelulusan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/SenaraiDahLulus/' . $auth_user['cawangan'] . '/' . $norujukan)->json();
|
||||||
|
|
||||||
if(sizeof($kelulusan) > 0)
|
if (sizeof($kelulusan) > 0) {
|
||||||
{
|
|
||||||
$kelulusan = $kelulusan[0]['masalulus'];
|
$kelulusan = $kelulusan[0]['masalulus'];
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
$kelulusan = '';
|
$kelulusan = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,8 +80,7 @@ class OperasiController extends Controller
|
|||||||
$norujukan = $request->norujukan;
|
$norujukan = $request->norujukan;
|
||||||
|
|
||||||
|
|
||||||
if($request->pembatalan == null)
|
if ($request->pembatalan == null) {
|
||||||
{
|
|
||||||
if (!$request->taglulus) {
|
if (!$request->taglulus) {
|
||||||
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusanKomen/' . $request->kodcaw . '/' . $norujukan, [
|
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusanKomen/' . $request->kodcaw . '/' . $norujukan, [
|
||||||
"komen" => $request->komenkelulusan,
|
"komen" => $request->komenkelulusan,
|
||||||
@@ -114,13 +109,10 @@ class OperasiController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if($updatelulus)
|
if ($updatelulus) {
|
||||||
{
|
|
||||||
event(new NotifikasiKelulusan($norujukan, "lulus", $request->siri, $request->komenkelulusan, $request->teller));
|
event(new NotifikasiKelulusan($norujukan, "lulus", $request->siri, $request->komenkelulusan, $request->teller));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!$request->taglulus) {
|
if (!$request->taglulus) {
|
||||||
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusanKomen/' . $request->kodcaw . '/' . $norujukan, [
|
$updatelulus = Http::withOptions(['verify' => config('app.api_verify')])->put(config('api.url') . '/api/UpdateKelulusanKomen/' . $request->kodcaw . '/' . $norujukan, [
|
||||||
"komen" => $request->komenkelulusan,
|
"komen" => $request->komenkelulusan,
|
||||||
@@ -142,8 +134,7 @@ class OperasiController extends Controller
|
|||||||
])->json();
|
])->json();
|
||||||
}
|
}
|
||||||
|
|
||||||
if($updatelulus)
|
if ($updatelulus) {
|
||||||
{
|
|
||||||
event(new NotifikasiKelulusan($norujukan, "batal", $request->siri, $request->komenkelulusan, $request->teller));
|
event(new NotifikasiKelulusan($norujukan, "batal", $request->siri, $request->komenkelulusan, $request->teller));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -197,6 +188,89 @@ class OperasiController extends Controller
|
|||||||
return response()->json($siri,201);
|
return response()->json($siri,201);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function updatekelulusananggota(Request $request)
|
||||||
|
{
|
||||||
|
$auth_user = Auth::user();
|
||||||
|
$api_url = config('api.url');
|
||||||
|
|
||||||
|
// Data asas
|
||||||
|
$nokp = $request->nokp;
|
||||||
|
$kodcaw = $request->kodcaw;
|
||||||
|
$komen = $request->komenkelulusan;
|
||||||
|
$namaoperasi = $request->namaoperasi;
|
||||||
|
$taglulus = $request->taglulus; // contoh: 'Y' = lulus, 'N' = batalmarginmutu()
|
||||||
|
|
||||||
|
// 1️⃣ Tentukan status kelulusan
|
||||||
|
$status = ($taglulus == 'Y') ? 1 : 2; // 1 = Lulus, 2 = Batal/Tolak
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 2️⃣ Panggil API baru — ikut route baru dengan {kodcaw}
|
||||||
|
$endpoint = $api_url . '/api/UpdateKelulusanAnggota/' . $kodcaw;
|
||||||
|
|
||||||
|
$payload = [
|
||||||
|
'nokp' => $nokp,
|
||||||
|
'komenkelulusan' => $komen,
|
||||||
|
'namaoperasi' => $namaoperasi,
|
||||||
|
'sahkan' => $status
|
||||||
|
];
|
||||||
|
|
||||||
|
Log::info('Menghantar permintaan ke API UpdateKelulusanAnggota', [
|
||||||
|
'endpoint' => $endpoint,
|
||||||
|
'payload' => $payload
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->put($endpoint, $payload);
|
||||||
|
|
||||||
|
$updatelulus = $response->json();
|
||||||
|
|
||||||
|
// 3️⃣ Log hasil respon API
|
||||||
|
Log::info('Respon dari API UpdateKelulusanAnggota', [
|
||||||
|
'status' => $response->status(),
|
||||||
|
'body' => $updatelulus
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 4️⃣ Jika berjaya, cipta event notifikasi
|
||||||
|
if ($response->successful() && $updatelulus && isset($updatelulus['success']) && $updatelulus['success'] === true) {
|
||||||
|
// $jenis = ($status == 1) ? 'lulus' : 'batal';
|
||||||
|
// event(new NotifikasiAnggota($nokp, $jenis, null, $komen, $namaoperasi));
|
||||||
|
|
||||||
|
$statusText = ($status == 1) ? 'DILULUSKAN' : 'DITOLAK';
|
||||||
|
event(new NotifikasiAnggota($nokp, $statusText, $komen, $namaoperasi));
|
||||||
|
|
||||||
|
|
||||||
|
Log::info('Event NotifikasiAnggota dispatched', [
|
||||||
|
'nokp' => $nokp,
|
||||||
|
'komen' => $komen,
|
||||||
|
'namaoperasi' => $namaoperasi
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
Log::warning('Gagal kemas kini kelulusan anggota', [
|
||||||
|
'nokp' => $nokp,
|
||||||
|
'kodcaw' => $kodcaw,
|
||||||
|
'response' => $updatelulus
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($updatelulus, $response->status());
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
Log::error('Ralat UpdateKelulusanAnggota (frontend)', [
|
||||||
|
'message' => $e->getMessage(),
|
||||||
|
'line' => $e->getLine()
|
||||||
|
]);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
'message' => 'Ralat semasa menghantar kelulusan anggota.',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public function createkelulusan(Request $request)
|
public function createkelulusan(Request $request)
|
||||||
{
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
@@ -211,8 +285,7 @@ class OperasiController extends Controller
|
|||||||
|
|
||||||
$getsiri = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/ListLatestLulus/' . $auth_user['cawangan'] . '/' . $norujukan)->json();
|
$getsiri = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/ListLatestLulus/' . $auth_user['cawangan'] . '/' . $norujukan)->json();
|
||||||
|
|
||||||
if(isset($getsiri['siri']))
|
if (isset($getsiri['siri'])) {
|
||||||
{
|
|
||||||
$siri = $getsiri['siri'] + 1;
|
$siri = $getsiri['siri'] + 1;
|
||||||
} else {
|
} else {
|
||||||
$siri = 1;
|
$siri = 1;
|
||||||
@@ -239,18 +312,70 @@ class OperasiController extends Controller
|
|||||||
return response()->json($siri, 201);
|
return response()->json($siri, 201);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function createkelulusanAnggota(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$auth_user = Auth::user();
|
||||||
|
$api_url = config('api.url');
|
||||||
|
$current = Carbon::now();
|
||||||
|
|
||||||
|
Log::info('createkelulusanAnggota', $request->all());
|
||||||
|
|
||||||
|
// Dapatkan maklumat cawangan
|
||||||
|
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/cawangan/' . $auth_user['cawangan'])
|
||||||
|
->json();
|
||||||
|
|
||||||
|
// Generate siri baru
|
||||||
|
$getsiri = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->get($api_url . '/api/ListLatestLulus/' . $auth_user['cawangan'] . '/anggota')
|
||||||
|
->json();
|
||||||
|
|
||||||
|
$siri = isset($getsiri['siri']) ? $getsiri['siri'] + 1 : 1;
|
||||||
|
|
||||||
|
// Hantar ke API
|
||||||
|
$createlulus = Http::withOptions(['verify' => config('app.api_verify')])
|
||||||
|
->post($api_url . '/api/CreateKelulusanAnggota/' . $auth_user['cawangan'] . '/roles/operasi', [
|
||||||
|
'komen' => $request->komen,
|
||||||
|
'date_mohon' => $current->toDateString(),
|
||||||
|
'siri' => $siri,
|
||||||
|
'nokp' => $request->nokp,
|
||||||
|
'teller' => $request->teller,
|
||||||
|
'peloperasi' => 'operasi'
|
||||||
|
])
|
||||||
|
->json();
|
||||||
|
|
||||||
|
event(new StatusLiked($auth_user['cawangan'], $auth_user['name']));
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'success' => true,
|
||||||
|
'message' => 'Permohonan kelulusan anggota berjaya dihantar.',
|
||||||
|
'siri' => $siri,
|
||||||
|
'data' => $createlulus,
|
||||||
|
], 201);
|
||||||
|
|
||||||
|
Log::info('🛰️ API CreateKelulusanAnggota Response:', [
|
||||||
|
'status' => $response->status(),
|
||||||
|
'body' => $response->body(),
|
||||||
|
]);
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
Log::error('❌ createkelulusanAnggota error: ' . $th->getMessage());
|
||||||
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
'message' => $th->getMessage(),
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function mintakatalaluansemula(Request $request)
|
public function mintakatalaluansemula(Request $request)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(Hash::check($request->passsemula, Auth::user()->password))
|
if (Hash::check($request->passsemula, Auth::user()->password)) {
|
||||||
{
|
|
||||||
return "True";
|
return "True";
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return "False";
|
return "False";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function parameter()
|
public function parameter()
|
||||||
@@ -272,7 +397,8 @@ class OperasiController extends Controller
|
|||||||
return view('operasi.hargaemas', compact('cawangan_info', 'api_url', 'harga_emas'));
|
return view('operasi.hargaemas', compact('cawangan_info', 'api_url', 'harga_emas'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function margin(){
|
public function margin()
|
||||||
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
$api_url = config('api.url');
|
$api_url = config('api.url');
|
||||||
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan'])->json();
|
$cawangan_info = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/cawangan/' . $auth_user['cawangan'])->json();
|
||||||
@@ -292,10 +418,8 @@ class OperasiController extends Controller
|
|||||||
$kelulusan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/ListOperasiKelulusan/')->json();
|
$kelulusan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/ListOperasiKelulusan/')->json();
|
||||||
|
|
||||||
|
|
||||||
foreach($kelulusan as $index=>$k)
|
foreach ($kelulusan as $index => $k) {
|
||||||
{
|
foreach ($k['kelulusanall'] as $index1 => $kel) {
|
||||||
foreach($k['kelulusanall'] as $index1=>$kel)
|
|
||||||
{
|
|
||||||
$komen = explode("|", $kel['komen']);
|
$komen = explode("|", $kel['komen']);
|
||||||
|
|
||||||
$results = array_search("", $komen, true);
|
$results = array_search("", $komen, true);
|
||||||
@@ -304,12 +428,10 @@ class OperasiController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
array_push($arraykelulusan, ['norujukan' => $kel['norujukan'], 'pinjaman' => $kel['jumpinj'], 'nilaimarhun' => ($komen[1] ?? $kel['nilaimarhun'] ?? '-'), 'berat' => ($komen[2] ?? $kel['berat'] ?? '-'), 'margin' => ($komen[3] ?? $kel['margin'] ?? '-'), 'komen' => ($komen[0] ?? $kel['komen'] ?? '-'), 'status' => ($kel['status'] ?? '-'), 'pelulus' => $kel['operasi'],]);
|
array_push($arraykelulusan, ['norujukan' => $kel['norujukan'], 'pinjaman' => $kel['jumpinj'], 'nilaimarhun' => ($komen[1] ?? $kel['nilaimarhun'] ?? '-'), 'berat' => ($komen[2] ?? $kel['berat'] ?? '-'), 'margin' => ($komen[3] ?? $kel['margin'] ?? '-'), 'komen' => ($komen[0] ?? $kel['komen'] ?? '-'), 'status' => ($kel['status'] ?? '-'), 'pelulus' => $kel['operasi'],]);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('operasi.rekodtelahlulus', compact('cawangan_info', 'api_url', 'arraykelulusan'));
|
return view('operasi.rekodtelahlulus', compact('cawangan_info', 'api_url', 'arraykelulusan'));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function notifyKomoditi()
|
public function notifyKomoditi()
|
||||||
@@ -318,6 +440,17 @@ class OperasiController extends Controller
|
|||||||
event(new KomoditiNotify('lulus', $auth_user['cawangan']));
|
event(new KomoditiNotify('lulus', $auth_user['cawangan']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function kelulusananggota(Request $request)
|
||||||
|
{
|
||||||
|
$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();
|
||||||
|
|
||||||
|
$arraykelulusan = Http::withOptions(['verify' => config('app.api_verify')])->get(config('api.url') . '/api/list/approval/anggota')->json();
|
||||||
|
|
||||||
|
return view('operasi.kelulusan_anggota', compact('cawangan_info', 'api_url', 'arraykelulusan'));
|
||||||
|
}
|
||||||
|
|
||||||
public function marginmutu()
|
public function marginmutu()
|
||||||
{
|
{
|
||||||
$auth_user = Auth::user();
|
$auth_user = Auth::user();
|
||||||
@@ -338,4 +471,82 @@ class OperasiController extends Controller
|
|||||||
|
|
||||||
return view('operasi.edit_marginmutu', compact('cawangan_info', 'api_url'));
|
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'));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Imports;
|
||||||
|
|
||||||
|
use App\Anggota;
|
||||||
|
use Maatwebsite\Excel\Concerns\ToModel;
|
||||||
|
|
||||||
|
class AnggotaImport implements ToModel
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param array $row
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Database\Eloquent\Model|null
|
||||||
|
*/
|
||||||
|
public function model(array $row)
|
||||||
|
{
|
||||||
|
return new Anggota([
|
||||||
|
//
|
||||||
|
'noic' => $row['noic'],
|
||||||
|
'nama' => $row['nama'],
|
||||||
|
'status' => $row['status'] ?? 'aktif',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
return [
|
return [
|
||||||
'url' => env('API_URL'),
|
'url' => env('API_URL'),
|
||||||
'url_koop' => env('API_URL_KOOP','http://localhost:8000'),
|
'url_koop' => env('API_URL_KOOP','https://apiujrah.erahn.com.my'),
|
||||||
'url_pkb' => env('API_URL_PKB','http://localhost:8000'),
|
'url_pkb' => env('API_URL_PKB','http://localhost:8000'),
|
||||||
];
|
];
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
# Staging stack — isolated from local docker-compose.yml (8081 / 3307)
|
||||||
|
# and from api_arrahn staging (8090 / 3308).
|
||||||
|
#
|
||||||
|
# Local:
|
||||||
|
# docker compose --env-file .env.staging -f docker-compose.staging.yml up -d --build
|
||||||
|
#
|
||||||
|
# CI (image already in registry):
|
||||||
|
# APP_IMAGE=git.koppkb.com/kopkb/kaunter IMAGE_TAG=<sha> \
|
||||||
|
# docker compose --env-file .env.staging -f docker-compose.staging.yml up -d --no-build
|
||||||
|
#
|
||||||
|
# Host nginx reverse-proxies the public domain to 127.0.0.1:${HTTP_PORT}.
|
||||||
|
# See docker/nginx/host-proxy.example.conf
|
||||||
|
#
|
||||||
|
# If 8091 or 3309 is already taken, set HTTP_PORT / MYSQL_PUBLISH_PORT in .env.staging.
|
||||||
|
|
||||||
|
name: kaunter_staging
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: ${APP_IMAGE:-kaunter}:${IMAGE_TAG:-staging}
|
||||||
|
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:
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
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:
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
root /var/www/html/public;
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
charset utf-8;
|
||||||
|
client_max_body_size 50M;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
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
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#!/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 "$@"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
memory_limit=512M
|
||||||
|
upload_max_filesize=50M
|
||||||
|
post_max_size=50M
|
||||||
|
max_execution_time=120
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[www]
|
||||||
|
; Pass container env vars (from compose env_file) through to PHP workers.
|
||||||
|
clear_env = no
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 112 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
@@ -72,11 +72,26 @@
|
|||||||
</div>
|
</div>
|
||||||
@if($search == true && $blacklist_search == false)
|
@if($search == true && $blacklist_search == false)
|
||||||
<div class="text-center mt-3">
|
<div class="text-center mt-3">
|
||||||
<button type="button" style="margin:auto" class="btn btn-primary" onclick="newcustomer()">
|
|
||||||
|
{{-- ✅ Jika anggota tapi belum daftar pelanggan --}}
|
||||||
|
@if(isset($showDaftarPelangganBtn) && $showDaftarPelangganBtn)
|
||||||
|
<button type="button" style="margin:auto" class="btn btn-success" onclick="newcustomer()">
|
||||||
Daftar Pelanggan
|
Daftar Pelanggan
|
||||||
</button>
|
</button>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{{-- ✅ Jika pelanggan dah ada tapi belum anggota --}}
|
||||||
|
@if(isset($showAssignAnggotaBtn) && $showAssignAnggotaBtn)
|
||||||
|
<form action="{{ route('customers.assignAnggota') }}" method="POST" style="display:inline-block;">
|
||||||
|
@csrf
|
||||||
|
<input type="hidden" name="noic" value="{{ $noic }}">
|
||||||
|
<button type="submit" class="btn btn-primary">Assign sebagai Anggota</button>
|
||||||
|
</form>
|
||||||
|
@endif
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- Modal No KP -->
|
<!-- Modal No KP -->
|
||||||
@@ -478,42 +493,73 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var api_url = "<?php echo $api_url ?>";
|
var api_url = @json($api_url ?? '');
|
||||||
var search = "<?php echo $search ?>";
|
var search = @json($search ?? false);
|
||||||
var type_id = "<?php echo $idtype ?>";
|
var type_id = @json($idtype ?? '');
|
||||||
var blacklist_search = "<?php echo $blacklist_search ?>";
|
var isAnggota = @json($isAnggota ?? false);
|
||||||
|
var isPelanggan = @json($isPelanggan ?? false);
|
||||||
|
var blacklist_search = @json($blacklist_search ?? false);
|
||||||
|
var showAssignAnggotaBtn = @json($showAssignAnggotaBtn ?? false);
|
||||||
|
var showDaftarPelangganBtn = @json($showDaftarPelangganBtn ?? false);
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
|
// Datepicker
|
||||||
$('#passport_tarikh_lahir').datepicker({
|
$('#passport_tarikh_lahir').datepicker({
|
||||||
format: 'dd/mm/yyyy',
|
format: 'dd/mm/yyyy',
|
||||||
endDate: new Date()
|
endDate: new Date()
|
||||||
});
|
});
|
||||||
var noic = $('#noic').val();
|
|
||||||
identifyIC(noic);
|
|
||||||
|
|
||||||
if(search == true){
|
var noic = $('#noic').val();
|
||||||
if(blacklist_search == true){
|
if (typeof identifyIC === 'function') {
|
||||||
|
identifyIC(noic);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Debug: Papar semua nilai dalam console
|
||||||
|
console.log({
|
||||||
|
search,
|
||||||
|
blacklist_search,
|
||||||
|
showAssignAnggotaBtn,
|
||||||
|
showDaftarPelangganBtn
|
||||||
|
});
|
||||||
|
|
||||||
|
// Logik amaran SweetAlert
|
||||||
|
if (search === true) {
|
||||||
|
if (blacklist_search === true) {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
icon: 'warning',
|
icon: 'warning',
|
||||||
title: 'Amaran!',
|
title: 'Amaran!',
|
||||||
text: 'Pelanggan telah disenarai hitamkan dari Pembiayaan'
|
text: 'Pelanggan telah disenarai hitamkan dari Pembiayaan.'
|
||||||
});
|
});
|
||||||
event.preventDefault();
|
}
|
||||||
return false;
|
else if (isAnggota && !isPelanggan) {
|
||||||
}else{
|
Swal.fire({
|
||||||
|
icon: 'info',
|
||||||
|
title: 'Anggota Belum Didaftarkan!',
|
||||||
|
text: 'Pelanggan ini adalah anggota koperasi tetapi belum berdaftar sebagai pelanggan.'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (isPelanggan && !isAnggota) {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'info',
|
||||||
|
title: 'Pelanggan Bukan Anggota!',
|
||||||
|
text: 'Pelanggan ini berdaftar tetapi belum menjadi anggota koperasi.'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (!isAnggota && !isPelanggan) {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
icon: 'info',
|
icon: 'info',
|
||||||
title: 'Pelanggan Tiada Dalam Rekod!',
|
title: 'Pelanggan Tiada Dalam Rekod!',
|
||||||
text: 'Sila Daftar Pelanggan'
|
text: 'Sila Daftar Pelanggan.'
|
||||||
});
|
});
|
||||||
event.preventDefault();
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function calculatePassportAge(){
|
function calculatePassportAge(){
|
||||||
var passport_lahir = $('#passport_tarikh_lahir').val();
|
var passport_lahir = $('#passport_tarikh_lahir').val();
|
||||||
var split_date = passport_lahir.split('/');
|
var split_date = passport_lahir.split('/');
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -24,6 +24,9 @@
|
|||||||
</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">
|
||||||
@@ -53,6 +56,33 @@
|
|||||||
<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">
|
||||||
@@ -511,7 +541,21 @@
|
|||||||
"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({
|
||||||
@@ -658,6 +702,9 @@
|
|||||||
$('#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',
|
||||||
@@ -670,17 +717,17 @@
|
|||||||
$.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.toFixed(2)));
|
$('#pembiyaan_max_pelulus').val(formatter.format(max_pelulus));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -979,7 +1026,7 @@
|
|||||||
'harga' : harga_edit,
|
'harga' : harga_edit,
|
||||||
'n_marhun' : nilai_marhun_edit,
|
'n_marhun' : nilai_marhun_edit,
|
||||||
'marhun' : marhun_edit,
|
'marhun' : marhun_edit,
|
||||||
// 'nota' : nota,
|
'nota' : nota,
|
||||||
'tag_permata' : tagpermata_edit,
|
'tag_permata' : tagpermata_edit,
|
||||||
'berat_batu_permata' : beratpermata_edit,
|
'berat_batu_permata' : beratpermata_edit,
|
||||||
"teller": "{{ Auth::user()->name }}",
|
"teller": "{{ Auth::user()->name }}",
|
||||||
@@ -1721,5 +1768,153 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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: '{{ config("api.url") }}/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
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
<div class="form-group row col-12">
|
<div class="form-group row col-12">
|
||||||
<input type="hidden" name="kodcaw" id="kodcaw" value="{{$cawangan_info['kodcaw']}}">
|
<input type="hidden" name="kodcaw" id="kodcaw" value="{{$cawangan_info['kodcaw']}}">
|
||||||
<input type="hidden" name="nokp" id="nokp" value="{{ $customer_info['kpbaru'] }}">
|
<input type="hidden" name="nokp" id="nokp" value="{{ $customer_info['kpbaru'] }}">
|
||||||
|
<input type="hidden" name="tag_anggota" id="tag_anggota" value="{{ $customer_info['tag_anggota'] ?? 0 }}">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 mb-2">
|
<div class="col-12 mb-2">
|
||||||
@@ -63,6 +64,14 @@
|
|||||||
</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>
|
||||||
@@ -89,6 +98,35 @@
|
|||||||
<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">
|
||||||
@@ -187,6 +225,7 @@
|
|||||||
<input type="text" name="kadarkeuntungan" id="kadarkeuntungan" value="" hidden>
|
<input type="text" name="kadarkeuntungan" id="kadarkeuntungan" value="" hidden>
|
||||||
<input type="text" name="kuantiti_marhun" id="kuantiti_marhun" value="" hidden>
|
<input type="text" name="kuantiti_marhun" id="kuantiti_marhun" value="" hidden>
|
||||||
<input type="text" name="total_nilai_marhun" id="total_nilai_marhun" value="" hidden>
|
<input type="text" name="total_nilai_marhun" id="total_nilai_marhun" value="" 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">
|
||||||
</div>
|
</div>
|
||||||
@@ -474,18 +513,31 @@
|
|||||||
|
|
||||||
var tablemarhun = $('#myTable').DataTable({
|
var tablemarhun = $('#myTable').DataTable({
|
||||||
"ordering": false,
|
"ordering": false,
|
||||||
"columnDefs": [
|
"columnDefs": [{
|
||||||
{
|
|
||||||
"targets": [1],
|
"targets": [1],
|
||||||
"visible": false,
|
"visible": false,
|
||||||
"searchable": false
|
"searchable": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"targets": [7],
|
"targets": [7],
|
||||||
"visible": false,
|
"visible": true,
|
||||||
"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({
|
||||||
@@ -565,7 +617,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();
|
||||||
counter = counter + 1;
|
counter = counter + 1;
|
||||||
});
|
});
|
||||||
@@ -576,24 +628,24 @@
|
|||||||
$('#bilangan_marhun').val(formatter.format(counter - 1));
|
$('#bilangan_marhun').val(formatter.format(counter - 1));
|
||||||
$('#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(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',
|
||||||
url: api_url + '/api/kadarujrah',
|
url: api_url + '/api/kadarujrah',
|
||||||
async:false,
|
async:false,
|
||||||
data:{
|
data:{
|
||||||
|
'nokp': $('#nokp').val(),
|
||||||
'nilaimarhun' : total_nilai_marhun,
|
'nilaimarhun' : total_nilai_marhun,
|
||||||
'kodcaw' : kodcaw_ujrah
|
'kodcaw' : kodcaw_ujrah
|
||||||
},
|
},
|
||||||
success:function(data){
|
success:function(data){
|
||||||
kadarupah = data;
|
kadarupah = data;
|
||||||
|
|
||||||
|
// Jika anggota (tag_anggota = 1), kadar ujrah dipaksa 0.00
|
||||||
|
if(Number($('#tag_anggota').val()) === 1){
|
||||||
|
kadarupah = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -603,6 +655,9 @@
|
|||||||
$('#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;
|
||||||
|
var max_pelulus = 0;
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
url: api_url + '/api/maxpinjaman',
|
url: api_url + '/api/maxpinjaman',
|
||||||
@@ -614,17 +669,17 @@
|
|||||||
$.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);
|
$('#pembiayaan_max_teller').val(formatter.format(max_teller));
|
||||||
var max_pelulus = total_nilai_marhun * (pinjaman_pelulus / 100);
|
$('#pembiyaan_max_pelulus').val(formatter.format(max_pelulus));
|
||||||
$('#pembiayaan_max_teller').val(formatter.format(max_teller.toFixed(2)));
|
|
||||||
$('#pembiyaan_max_pelulus').val(formatter.format(max_pelulus.toFixed(2)));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -632,6 +687,9 @@
|
|||||||
$('#pinjaman').on('input',function(){
|
$('#pinjaman').on('input',function(){
|
||||||
var pinjaman = Number(this.value);
|
var pinjaman = Number(this.value);
|
||||||
var nilaimarhun = Number($('#jumlah_nilai_marhun').val());
|
var nilaimarhun = Number($('#jumlah_nilai_marhun').val());
|
||||||
|
var nokp = $('#nokp').val();
|
||||||
|
//console.log('DEBUG NOKP:', nokp, kadarupah);
|
||||||
|
|
||||||
|
|
||||||
// var keuntungan_sebulan = pinjaman * kadarupah;
|
// var keuntungan_sebulan = pinjaman * kadarupah;
|
||||||
// var keuntungan_6bln = keuntungan_sebulan * 6;
|
// var keuntungan_6bln = keuntungan_sebulan * 6;
|
||||||
@@ -645,6 +703,7 @@
|
|||||||
url: api_url + '/api/onepercent',
|
url: api_url + '/api/onepercent',
|
||||||
async:false,
|
async:false,
|
||||||
data:{
|
data:{
|
||||||
|
'nokp': nokp,
|
||||||
'nilaimarhun' : total_nilai_marhun,
|
'nilaimarhun' : total_nilai_marhun,
|
||||||
'pembiayaan' : pinjaman,
|
'pembiayaan' : pinjaman,
|
||||||
'kadarujrah' : kadarupah,
|
'kadarujrah' : kadarupah,
|
||||||
@@ -1627,102 +1686,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: '{{ config("api.url") }}/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>${parseFloat(response.maxteller).toLocaleString('en-MY', {minimumFractionDigits: 2, maximumFractionDigits: 2})}</td></tr>
|
|
||||||
<tr><td><strong>Nilai Marhun PC</strong></td><td>${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>Harga</strong></td><td>RM${harga}</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');
|
||||||
@@ -1959,5 +1922,169 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 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: '{{ config("api.url") }}/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
|
||||||
|
|||||||
@@ -274,11 +274,9 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<a href="{{ route('lelong') }}" class="btn btn-info btn-lg btn-block mb-3">Lelong</a>
|
<a href="{{ route('lelong') }}" class="btn btn-info btn-lg btn-block mb-3">Lelong</a>
|
||||||
</div>
|
</div>
|
||||||
@if(Auth::user()->cawangan == '011237')
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<a href="{{ url('panjar') }}" class="btn btn-info btn-lg btn-block mb-3">Perbelanjaan</a>
|
<a href="{{ url('panjar') }}" class="btn btn-info btn-lg btn-block mb-3">Perbelanjaan</a>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<a href="{{ url('alirantunai') }}" class="btn btn-info btn-lg btn-block mb-3">Aliran
|
<a href="{{ url('alirantunai') }}" class="btn btn-info btn-lg btn-block mb-3">Aliran
|
||||||
Tunai</a>
|
Tunai</a>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row justify-content-center mt-5">
|
<div class="row justify-content-center mt-5">
|
||||||
<div class="col-md-8">
|
<div class="col-md-12">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
|
|
||||||
<nav aria-label="breadcrumb">
|
<nav aria-label="breadcrumb">
|
||||||
@@ -14,12 +14,15 @@
|
|||||||
</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">Kelulusan Anggota</a>
|
||||||
<a href="{{ route('operasi.kelulusan') }}" class="btn btn-info btn-lg">Kelulusan</a>
|
<a href="{{ route('operasi.kelulusan') }}" class="btn btn-info btn-lg">Kelulusan</a>
|
||||||
<a href="{{ route('daftar.kakitangan') }}" class="btn btn-info btn-lg">Kakitangan</a>
|
<a href="{{ route('daftar.kakitangan') }}" class="btn btn-info btn-lg">Kakitangan</a>
|
||||||
<a href="{{ route('parameter') }}" class="btn btn-info btn-lg">Parameter</a>
|
<a href="{{ route('parameter') }}" class="btn btn-info btn-lg">Parameter</a>
|
||||||
<a href="{{ route('komuditi') }}" class="btn btn-info btn-lg">Komoditi</a>
|
<a href="{{ route('komuditi') }}" class="btn btn-info btn-lg">Komoditi</a>
|
||||||
<a href="{{ route('perubatan') }}" class="btn btn-info btn-lg">Perubatan</a>
|
<a href="{{ route('perubatan') }}" class="btn btn-info btn-lg">Perubatan</a>
|
||||||
|
<a href="{{ route('operasi.laporan.audit') }}" class="btn btn-info btn-lg">Laporan Audit</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
@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
|
||||||
@@ -189,6 +189,10 @@
|
|||||||
<a href="{{ route('laporan.notisperingatan') }}"
|
<a href="{{ route('laporan.notisperingatan') }}"
|
||||||
class="btn btn-dark btn-lg btn-block mb-3 custom-btn">Notis Peringatan</a>
|
class="btn btn-dark btn-lg btn-block mb-3 custom-btn">Notis Peringatan</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<a href="{{ route('laporan.imbangduga') }}"
|
||||||
|
class="btn btn-dark btn-lg btn-block mb-3 custom-btn">Imbang Duga</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">Berat</div>
|
<div class="col-md-4">Berat Bersih</div>
|
||||||
<div class="col-md-8"><input type="text" class="form-control" name="berat_edit" id="berat_edit" onkeyup="calculationharga(this)"/></div>
|
<div class="col-md-8"><input type="text" class="form-control" name="berat_edit" id="berat_edit" onkeyup="calculationharga(this)"/></div>
|
||||||
<div class="col-md-4">Harga</div>
|
<div class="col-md-4">Harga</div>
|
||||||
<div class="col-md-8"><input type="text" name="harga_edit" id="harga_edit" class="form-control" readonly/></div>
|
<div class="col-md-8"><input type="text" name="harga_edit" id="harga_edit" class="form-control" readonly/></div>
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ $(document).ready(function() {
|
|||||||
$('#pc').val(urlParams.get('pc'));
|
$('#pc').val(urlParams.get('pc'));
|
||||||
$('#operasi').val(urlParams.get('operasi'));
|
$('#operasi').val(urlParams.get('operasi'));
|
||||||
|
|
||||||
|
var username = '{{ Auth::user()->name }}';
|
||||||
|
|
||||||
$('#editMarginForm').on('submit', function(e) {
|
$('#editMarginForm').on('submit', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
@@ -78,7 +80,8 @@ $(document).ready(function() {
|
|||||||
teller: $('#teller').val(),
|
teller: $('#teller').val(),
|
||||||
pc: $('#pc').val(),
|
pc: $('#pc').val(),
|
||||||
operasi: $('#operasi').val(),
|
operasi: $('#operasi').val(),
|
||||||
_token: $('input[name="_token"]').val()
|
_token: $('input[name="_token"]').val(),
|
||||||
|
username : username
|
||||||
};
|
};
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -136,6 +139,10 @@ $(document).ready(function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('input[type="number"]').on('keydown', function(e) {
|
||||||
|
if (['e', 'E', '+', '-'].includes(e.key)) e.preventDefault();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
@@ -0,0 +1,518 @@
|
|||||||
|
@extends('layouts.app_operasi')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container col-12">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<nav aria-label="breadcrumb">
|
||||||
|
<ol class="breadcrumb pb-3">
|
||||||
|
<li class="breadcrumb-item"><a href="{{ url('/') }}">Home</a></li>
|
||||||
|
<li class="breadcrumb-item active" aria-current="page">Kelulusan Anggota</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="card-body text-center">
|
||||||
|
|
||||||
|
<div class="row mb-4">
|
||||||
|
<div class="col-2 justify-content-start">
|
||||||
|
</div>
|
||||||
|
<div class="col-8 mt-3 justify-content-center">
|
||||||
|
</div>
|
||||||
|
<div class="col-2">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class='table mt-2 table-striped table-hover' id='table-kelulusan' style="width:100%;">
|
||||||
|
<thead class="thead-dark">
|
||||||
|
<tr>
|
||||||
|
<th>Cawangan</th>
|
||||||
|
<th>No Kad Pengenalan</th>
|
||||||
|
<th>Nama Anggota</th>
|
||||||
|
<th>Status</th>
|
||||||
|
<th>Tarikh/Masa</th>
|
||||||
|
<th>Tindakan</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach ($arraykelulusan as $index => $k)
|
||||||
|
@foreach ($k['kelulusanall'] as $indexapp => $approval)
|
||||||
|
@php
|
||||||
|
$status = strtolower($approval['status'] ?? '');
|
||||||
|
$statusLabel = $approval['status'] ?? '—';
|
||||||
|
|
||||||
|
// Gunakan strpos() supaya compatible dengan PHP 7.x juga
|
||||||
|
if (
|
||||||
|
strpos($status, 'lulus') !== false ||
|
||||||
|
strpos($status, 'diluluskan') !== false ||
|
||||||
|
strpos($status, 'selesai') !== false
|
||||||
|
) {
|
||||||
|
$statusStyle = 'background-color:#7ee4b8; color:white;';
|
||||||
|
} elseif (
|
||||||
|
strpos($status, 'tolak') !== false ||
|
||||||
|
strpos($status, 'batal') !== false
|
||||||
|
) {
|
||||||
|
$statusStyle = 'background-color:#f58c8c; color:white;';
|
||||||
|
} elseif (
|
||||||
|
strpos($status, 'menunggu') !== false ||
|
||||||
|
strpos($status, 'pending') !== false
|
||||||
|
) {
|
||||||
|
$statusStyle = 'background-color:#ffd166; color:#333;';
|
||||||
|
} else {
|
||||||
|
$statusStyle = 'background-color:#d1d5db; color:#333;';
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>{{ $k['cawangan'] }}</td>
|
||||||
|
<td>{{ $approval['nokp'] }}</td>
|
||||||
|
<td>{{ $approval['nama'] ?? '-' }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="px-3 py-2 d-inline-block text-center fw-bold"
|
||||||
|
style="{{ $statusStyle }} border-radius:8px; min-width:130px; display:inline-block;">
|
||||||
|
{{ $statusLabel }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ \Carbon\Carbon::parse($approval['created_at'])->timezone('Asia/Kuala_Lumpur')->format('d/m/Y h:i A') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
@if ($statusLabel != 'DILULUSKAN')
|
||||||
|
<!-- Button Lulus -->
|
||||||
|
<button class="btn btn-success btn-sm me-2"
|
||||||
|
onclick="updatelulusAnggota(this)"
|
||||||
|
data-nokp="{{ $approval['nokp'] }}"
|
||||||
|
data-kodcaw="{{ $k['cawangankod'] }}" data-taglulus="Y"
|
||||||
|
title="Lulus Anggota">
|
||||||
|
<i class="fas fa-thumbs-up"></i>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<!-- Button Tolak -->
|
||||||
|
<button class="btn btn-danger btn-sm" onclick="updatelulusAnggota(this)"
|
||||||
|
data-nokp="{{ $approval['nokp'] }}"
|
||||||
|
data-kodcaw="{{ $k['cawangankod'] }}" data-taglulus="N"
|
||||||
|
title="Batal / Tolak Kelulusan">
|
||||||
|
<i class="fas fa-thumbs-down"></i>
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
var tablekelulusan = $('#table-kelulusan').DataTable({
|
||||||
|
"scrollX": true
|
||||||
|
});
|
||||||
|
|
||||||
|
let api = "{{ config('api.url') }}";
|
||||||
|
|
||||||
|
const formatter = new Intl.NumberFormat('en-US', {
|
||||||
|
minimumFractionDigits: 2
|
||||||
|
});
|
||||||
|
|
||||||
|
var audio = new Audio("{{ asset('sound/3.wav') }}");
|
||||||
|
|
||||||
|
if (tablekelulusan.data().any()) {
|
||||||
|
audio.play();
|
||||||
|
audio.addEventListener('ended', function() {
|
||||||
|
this.currentTime = 0;
|
||||||
|
this.play();
|
||||||
|
}, false);
|
||||||
|
} else {
|
||||||
|
audio.loop = false;
|
||||||
|
audio.muted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$('#kelulusanmodal').on('show.bs.modal', function(event) {
|
||||||
|
let button = $(event.relatedTarget);
|
||||||
|
let norujukan = $(button).data('norujukan');
|
||||||
|
let kodcaw = $(button).data('kodcawangan');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'GET',
|
||||||
|
url: api + '/api/gadai/norujukan/' + norujukan,
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(datagadaiwithnorujukan) {
|
||||||
|
|
||||||
|
let nokp = datagadaiwithnorujukan[0][0].nokp;
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'GET',
|
||||||
|
url: api + '/api/customers/' + nokp,
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(datagadaiwithnokp) {
|
||||||
|
|
||||||
|
let nama = datagadaiwithnokp.nama;
|
||||||
|
|
||||||
|
$('#namalanjut').text(nama);
|
||||||
|
$('#nokplanjut').text(nokp);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'GET',
|
||||||
|
url: api + '/api/gadai/customers/' + nokp +
|
||||||
|
'/outstandingsemasa/' + kodcaw,
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(outstandingsemasa) {
|
||||||
|
|
||||||
|
$('#pinjterkumpul').text('RM' + formatter
|
||||||
|
.format(outstandingsemasa));
|
||||||
|
|
||||||
|
},
|
||||||
|
error: function(xhr, status, error) {
|
||||||
|
var err = eval("(" + xhr.responseText +
|
||||||
|
")");
|
||||||
|
alert(xhr.responseText);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'GET',
|
||||||
|
url: api + '/api/customers/' + nokp + '/gadai/belum_tebus',
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
let bilanganaktif = 0;
|
||||||
|
if (data == null) {
|
||||||
|
bilanganaktif = 0;
|
||||||
|
} else {
|
||||||
|
bilanganaktif = data[0].length;
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#bilaktif').text(bilanganaktif);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'GET',
|
||||||
|
url: api + '/api/customers/' + nokp + '/gadai/lelong',
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
|
||||||
|
let bilanganlelong = 0;
|
||||||
|
|
||||||
|
if (data == null) {
|
||||||
|
bilanganlelong = 0;
|
||||||
|
} else {
|
||||||
|
bilanganlelong = data.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$('#billelong').text(bilanganlelong);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
async function updatelulus(e) {
|
||||||
|
console.log(e);
|
||||||
|
return;
|
||||||
|
|
||||||
|
const {
|
||||||
|
value: katalaluan
|
||||||
|
} = await Swal.fire({
|
||||||
|
title: 'Masukkan Katalaluan Semula',
|
||||||
|
input: 'password',
|
||||||
|
inputPlaceholder: 'Katalaluan',
|
||||||
|
confirmButtonText: 'Hantar',
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonText: 'Batal',
|
||||||
|
allowOutsideClick: true
|
||||||
|
})
|
||||||
|
|
||||||
|
let dataminta = '';
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'get',
|
||||||
|
url: "{{ route('operasi.getmintasemulakelulusan') }}",
|
||||||
|
async: false,
|
||||||
|
data: {
|
||||||
|
passsemula: katalaluan
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
if (data == "False") {
|
||||||
|
dataminta = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dataminta == 'False') {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'error',
|
||||||
|
title: 'Pengesahan Katalaluan Tidak Berjaya'
|
||||||
|
})
|
||||||
|
event.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// var { value: komenkelulusan } = await Swal.fire({
|
||||||
|
// title: 'Masukkan Komen!',
|
||||||
|
// input: 'radio',
|
||||||
|
// customClass: {
|
||||||
|
// input: 'custom-radio'
|
||||||
|
// },
|
||||||
|
// inputOptions: {
|
||||||
|
// 'Pelanggan Baru': 'Pelanggan Baru',
|
||||||
|
// 'Pelanggan Tetap': 'Pelanggan Tetap',
|
||||||
|
// 'Rekod Gadaian Baik': 'Rekod Gadaian Baik',
|
||||||
|
// 'Lain2': 'Lain-Lain'
|
||||||
|
// },
|
||||||
|
// confirmButtonText: 'Hantar',
|
||||||
|
// showCancelButton:false,
|
||||||
|
// allowOutsideClick: false
|
||||||
|
// })
|
||||||
|
|
||||||
|
// if(komenkelulusan === 'Lain2')
|
||||||
|
// {
|
||||||
|
// var { value: komenkelulusan } = await Swal.fire({
|
||||||
|
// title: 'Masukkan Komen!',
|
||||||
|
// input: 'text',
|
||||||
|
// inputPlaceholder: 'Komen',
|
||||||
|
// confirmButtonText: 'Hantar',
|
||||||
|
// showCancelButton:false,
|
||||||
|
// allowOutsideClick: false
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
const {
|
||||||
|
value: komenkelulusan
|
||||||
|
} = await Swal.fire({
|
||||||
|
title: 'Masukkan Komen!',
|
||||||
|
input: 'text',
|
||||||
|
inputPlaceholder: 'Komen',
|
||||||
|
confirmButtonText: 'Hantar',
|
||||||
|
showCancelButton: false,
|
||||||
|
allowOutsideClick: false
|
||||||
|
})
|
||||||
|
|
||||||
|
let norujukan = $(e).data('norujukan');
|
||||||
|
let cawangankod = $(e).data('kodcaw');
|
||||||
|
let siri = $(e).data('siri');
|
||||||
|
let namaoperasi = "{{ Auth::user()->name }}";
|
||||||
|
let teller = $(e).closest('tr').children('td:eq(2)').text();
|
||||||
|
let taglulus = $(e).data('taglulus');
|
||||||
|
|
||||||
|
teller = String(teller);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'put',
|
||||||
|
url: "{{ route('operasi.updatekelulusan') }}",
|
||||||
|
data: {
|
||||||
|
"_token": "{{ csrf_token() }}",
|
||||||
|
"taglulus": taglulus,
|
||||||
|
"norujukan": norujukan,
|
||||||
|
"kodcaw": cawangankod,
|
||||||
|
"komenkelulusan": komenkelulusan,
|
||||||
|
"siri": siri,
|
||||||
|
'namaoperasi': namaoperasi,
|
||||||
|
'teller': teller
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
console.log(data);
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'success',
|
||||||
|
title: 'Pengesahan Berjaya'
|
||||||
|
}).then(function() {
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
error: function(xhr, status, error) {
|
||||||
|
var err = eval("(" + xhr.responseText + ")");
|
||||||
|
alert(xhr.responseText);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updatelulusAnggota(e) {
|
||||||
|
|
||||||
|
// 1️⃣ Semak katalaluan semula
|
||||||
|
const {
|
||||||
|
value: katalaluan
|
||||||
|
} = await Swal.fire({
|
||||||
|
title: 'Masukkan Katalaluan Semula',
|
||||||
|
input: 'password',
|
||||||
|
inputPlaceholder: 'Katalaluan',
|
||||||
|
confirmButtonText: 'Hantar',
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonText: 'Batal',
|
||||||
|
allowOutsideClick: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!katalaluan) return;
|
||||||
|
|
||||||
|
let sah = true;
|
||||||
|
await $.ajax({
|
||||||
|
method: 'get',
|
||||||
|
url: "{{ route('operasi.getmintasemulakelulusan') }}",
|
||||||
|
async: false,
|
||||||
|
data: {
|
||||||
|
passsemula: katalaluan
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
if (data == "False") sah = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!sah) {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'error',
|
||||||
|
title: 'Pengesahan Katalaluan Tidak Berjaya'
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2️⃣ Dapatkan komen kelulusan
|
||||||
|
const {
|
||||||
|
value: komenkelulusan
|
||||||
|
} = await Swal.fire({
|
||||||
|
title: 'Masukkan Komen Kelulusan',
|
||||||
|
input: 'text',
|
||||||
|
inputPlaceholder: 'Contoh: Anggota layak diluluskan',
|
||||||
|
confirmButtonText: 'Hantar',
|
||||||
|
showCancelButton: false,
|
||||||
|
allowOutsideClick: false
|
||||||
|
});
|
||||||
|
|
||||||
|
// 3️⃣ Ambil data daripada butang / row
|
||||||
|
let nokp = $(e).data('nokp'); // data-nokp perlu ada dalam butang
|
||||||
|
let kodcaw = $(e).data('kodcaw');
|
||||||
|
let siri = $(e).data('siri');
|
||||||
|
let taglulus = $(e).data('taglulus');
|
||||||
|
let namaoperasi = "{{ Auth::user()->name }}";
|
||||||
|
|
||||||
|
// 4️⃣ Hantar ke backend (route khas kelulusan anggota)
|
||||||
|
$.ajax({
|
||||||
|
method: 'put',
|
||||||
|
url: "{{ route('operasi.updatekelulusananggota') }}",
|
||||||
|
data: {
|
||||||
|
"_token": "{{ csrf_token() }}",
|
||||||
|
"nokp": nokp,
|
||||||
|
"kodcaw": kodcaw,
|
||||||
|
"siri": siri,
|
||||||
|
"taglulus": taglulus,
|
||||||
|
"komenkelulusan": komenkelulusan,
|
||||||
|
"namaoperasi": namaoperasi
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'success',
|
||||||
|
title: 'Kelulusan Anggota Berjaya'
|
||||||
|
}).then(function() {
|
||||||
|
location.reload();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function(xhr, status, error) {
|
||||||
|
alert("Ralat: " + xhr.responseText);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function updatebatal(e) {
|
||||||
|
const {
|
||||||
|
value: katalaluan
|
||||||
|
} = await Swal.fire({
|
||||||
|
title: 'Masukkan Katalaluan Semula',
|
||||||
|
input: 'password',
|
||||||
|
inputPlaceholder: 'Katalaluan',
|
||||||
|
confirmButtonText: 'Hantar',
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonText: 'Batal',
|
||||||
|
allowOutsideClick: true
|
||||||
|
})
|
||||||
|
|
||||||
|
let dataminta = '';
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'get',
|
||||||
|
url: "{{ route('operasi.getmintasemulakelulusan') }}",
|
||||||
|
async: false,
|
||||||
|
data: {
|
||||||
|
passsemula: katalaluan
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
if (data == "False") {
|
||||||
|
dataminta = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dataminta == 'False') {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'error',
|
||||||
|
title: 'Pengesahan Katalaluan Tidak Berjaya'
|
||||||
|
})
|
||||||
|
event.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
value: komenkelulusan
|
||||||
|
} = await Swal.fire({
|
||||||
|
title: 'Masukkan Komen',
|
||||||
|
input: 'text',
|
||||||
|
inputPlaceholder: 'Komen',
|
||||||
|
confirmButtonText: 'Hantar',
|
||||||
|
showCancelButton: false,
|
||||||
|
allowOutsideClick: false
|
||||||
|
})
|
||||||
|
|
||||||
|
let norujukan = $(e).data('norujukan');
|
||||||
|
let siri = $(e).data('siri');
|
||||||
|
let cawangankod = $(e).data('kodcaw');
|
||||||
|
let namaoperasi = "{{ Auth::user()->name }}";
|
||||||
|
let teller = $(e).closest('tr').children('td:eq(2)').text();
|
||||||
|
|
||||||
|
teller = String(teller);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'put',
|
||||||
|
url: "{{ route('operasi.updatekelulusan') }}",
|
||||||
|
data: {
|
||||||
|
"_token": "{{ csrf_token() }}",
|
||||||
|
"norujukan": norujukan,
|
||||||
|
"siri": siri,
|
||||||
|
"kodcaw": cawangankod,
|
||||||
|
"komenkelulusan": komenkelulusan,
|
||||||
|
"pembatalan": "batal",
|
||||||
|
'namaoperasi': namaoperasi,
|
||||||
|
'teller': teller
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'success',
|
||||||
|
title: 'Pengesahan Berjaya'
|
||||||
|
}).then(function() {
|
||||||
|
location.reload();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
error: function(xhr, status, error) {
|
||||||
|
var err = eval("(" + xhr.responseText + ")");
|
||||||
|
alert(xhr.responseText);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,261 @@
|
|||||||
|
<style>
|
||||||
|
#header {
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header td, #customers 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;
|
||||||
|
}
|
||||||
|
</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: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#details td, #details th {
|
||||||
|
|
||||||
|
padding: 8px;
|
||||||
|
font-size:8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
.new-page {
|
||||||
|
page-break-before: always;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</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 style="font-size:20px;font-weight:bold;">{{ $cawangan_detail['namacaw'] }}</td>
|
||||||
|
<th colspan="1">{{ $cawangan_detail['namacaw'] }}</th>
|
||||||
|
</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 ="5"><b>LAPORAN AUDIT TRAIL OPERASI (arOS V3)</b></th>
|
||||||
|
<th> </th>
|
||||||
|
<th> </th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th colspan="5"><b> TARIKH CETAK:</b>
|
||||||
|
@php
|
||||||
|
$myDateTime = DateTime::createFromFormat('Y-m-d', $tarikh_cetak);
|
||||||
|
$formattedweddingdate = $myDateTime->format('d-m-Y');
|
||||||
|
echo($formattedweddingdate);
|
||||||
|
@endphp
|
||||||
|
</th>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width:20px"> <b>TARIKH MULA:</b></td>
|
||||||
|
<td>@php
|
||||||
|
$myDateTime = DateTime::createFromFormat('Y-m-d', $date);
|
||||||
|
$formattedweddingdate = $myDateTime->format('d-m-Y');
|
||||||
|
echo($formattedweddingdate);
|
||||||
|
@endphp</td>
|
||||||
|
<td style="width:20px"> <b>HINGGA:</b></td>
|
||||||
|
<td>@php
|
||||||
|
$myDateTime = DateTime::createFromFormat('Y-m-d', $date_till);
|
||||||
|
$formattedweddingdate = $myDateTime->format('d-m-Y');
|
||||||
|
echo($formattedweddingdate);
|
||||||
|
@endphp</td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<table id="details">
|
||||||
|
<tr>
|
||||||
|
<th>Bil</th>
|
||||||
|
<th>Tarikh</th>
|
||||||
|
<th>Masa</th>
|
||||||
|
<th>Pengguna</th>
|
||||||
|
<th>Tindakan</th>
|
||||||
|
<th>Perbezaan</th>
|
||||||
|
</tr>
|
||||||
|
@php $counter = 1; @endphp
|
||||||
|
@foreach($audittrail as $index=>$item)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $counter }}</td>
|
||||||
|
<td>{{ $item['tarikh'] }}</td>
|
||||||
|
<td>{{ $item['masa'] }}</td>
|
||||||
|
<td>{{ $item['users'] }}</td>
|
||||||
|
<td>{{ $item['actions'] }}</td>
|
||||||
|
<td>{{ $item['differ'] }}</td>
|
||||||
|
</tr>
|
||||||
|
@php $counter++;@endphp
|
||||||
|
@endforeach
|
||||||
|
</table>
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<br><br><br>
|
||||||
|
<table id="sign">
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td colspan="2"> .................................................................. </td>
|
||||||
|
<td> </td>
|
||||||
|
<td colspan="2"> .................................................................. </td>
|
||||||
|
<td> </td>
|
||||||
|
<td colspan="2">.................................................................. </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td colspan="2"><B> Disediakan </B> </td>
|
||||||
|
<td></td>
|
||||||
|
<td colspan="2"><B> Disemak </B> </td>
|
||||||
|
<td> </td>
|
||||||
|
<td colspan="2"><B> Disahkan </B></td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
@@ -201,7 +201,7 @@
|
|||||||
@foreach($senaraipelanggan as $index=>$item)
|
@foreach($senaraipelanggan as $index=>$item)
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ $counter }}</td>
|
<td>{{ $counter }}</td>
|
||||||
<td>{{$item['kpbaru']}}</td>
|
<td>{{ !empty($item['kpbaru']) ? $item['kpbaru'] : $item['kplama'] }}</td>
|
||||||
<td>{{ $item['nama']}}</td>
|
<td>{{ $item['nama']}}</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<td style="vertical-align:top;">{{ $cawangan_detail['alamat2'] }}</td>
|
<td style="vertical-align:top;">{{ $cawangan_detail['alamat2'] }}</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="vertical-align:top;">{{ $cawangan_detail['alamat3'] }}</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="vertical-align:top;">{{ ' No Tel : '. $cawangan_detail['notel'] . ' No Faks : '. $cawangan_detail['nofaks'] }}</td>
|
<td style="vertical-align:top;">{{ ' No Tel : '. $cawangan_detail['notel'] . ' No Faks : '. $cawangan_detail['nofaks'] }}</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
|||||||
@@ -625,7 +625,7 @@
|
|||||||
<table id="payment" class="{{ sizeof($wakil) != 0 ? 'custom-table-right' : '' }}">
|
<table id="payment" class="{{ sizeof($wakil) != 0 ? 'custom-table-right' : '' }}">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:10px">Baki Pembiayaan</td>
|
<td style="width:10px">Baki Pembiayaan</td>
|
||||||
<td style="width:10px">: RM {{ number_format($gadai['bakipjm'], 2) }} </td>
|
<td style="width:10px">: <strong>RM {{ number_format($gadai['bakipjm'], 2) }} </td></strong>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:10px">Keuntungan</td>
|
<td style="width:10px">Keuntungan</td>
|
||||||
@@ -647,7 +647,10 @@
|
|||||||
{{ number_format($ujrah_rebate, 2) }} </td>
|
{{ number_format($ujrah_rebate, 2) }} </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td style="width:10px">Jumlah Keuntungan + Lain-Lain Caj</td>
|
||||||
|
<td style="width:10px">: <strong>RM
|
||||||
|
{{ number_format($penebusan['onepercent'] + $penebusan['ujrah'], 2) }}</strong>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
@@ -855,7 +858,7 @@
|
|||||||
<table id="payment" class="{{ sizeof($wakil) != 0 ? 'custom-table-right' : '' }}">
|
<table id="payment" class="{{ sizeof($wakil) != 0 ? 'custom-table-right' : '' }}">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:10px">Baki Pembiayaan</td>
|
<td style="width:10px">Baki Pembiayaan</td>
|
||||||
<td style="width:10px">: RM {{ number_format($gadai['bakipjm'], 2) }} </td>
|
<td style="width:10px">: <strong>RM {{ number_format($gadai['bakipjm'], 2) }} </strong></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:10px">Keuntungan</td>
|
<td style="width:10px">Keuntungan</td>
|
||||||
@@ -876,6 +879,12 @@
|
|||||||
<td style="width:10px">: RM
|
<td style="width:10px">: RM
|
||||||
{{ number_format($ujrah_rebate, 2) }} </td>
|
{{ number_format($ujrah_rebate, 2) }} </td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width:10px">Jumlah Keuntungan + Lain-Lain Caj</td>
|
||||||
|
<td style="width:10px">: <strong>RM
|
||||||
|
{{ number_format($penebusan['onepercent'] + $penebusan['ujrah'], 2) }}</strong>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -12,17 +12,19 @@
|
|||||||
<style>
|
<style>
|
||||||
.grid-container {
|
.grid-container {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid: 75px / 33% 33% 33%;
|
grid-template-columns: 45% 25% 30%;
|
||||||
|
align-items: start;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#header_surat1 {
|
#header_surat1 {
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#header_surat1 p {
|
#header_surat1 p {
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
}
|
}
|
||||||
@@ -107,7 +109,7 @@
|
|||||||
|
|
||||||
<div class="grid-container" style="margin-bottom: 10px">
|
<div class="grid-container" style="margin-bottom: 10px">
|
||||||
<div id="header_surat1">
|
<div id="header_surat1">
|
||||||
<p style="text-wrap:nowrap">KOPERASI PERMODALAN KELANTAN BERHAD (D-5-0228)</p>
|
<p style="word-break: break-word;">KOPERASI PERMODALAN KELANTAN BERHAD (D-5-0228)</p>
|
||||||
<p>{{ $cawangan_detail['namacaw'] }}</p>
|
<p>{{ $cawangan_detail['namacaw'] }}</p>
|
||||||
<p style="text-wrap:nowrap">{{ $cawangan_detail['alamat1'] }}</p>
|
<p style="text-wrap:nowrap">{{ $cawangan_detail['alamat1'] }}</p>
|
||||||
<p>{{ $cawangan_detail['alamat2'] }}</p>
|
<p>{{ $cawangan_detail['alamat2'] }}</p>
|
||||||
|
|||||||
+12
-1
@@ -15,6 +15,10 @@ use Illuminate\Support\Facades\Storage;
|
|||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
Route::get('/health', function () {
|
||||||
|
return response()->json(['status' => 'ok']);
|
||||||
|
});
|
||||||
|
|
||||||
Route::get('/',['as'=>'login','uses'=>'HomeController@index']);
|
Route::get('/',['as'=>'login','uses'=>'HomeController@index']);
|
||||||
|
|
||||||
Route::get('/testtry',function(ImbangdugaServices $imbangduga){
|
Route::get('/testtry',function(ImbangdugaServices $imbangduga){
|
||||||
@@ -111,6 +115,7 @@ Route::post('/createwakil',['as'=>'wakil.create','uses'=>'PenebusanController@cr
|
|||||||
Route::get('/firstwakil',['as'=>'wakil.first','uses'=>'PenebusanController@getfirstWakil'])->middleware('auth','teller');
|
Route::get('/firstwakil',['as'=>'wakil.first','uses'=>'PenebusanController@getfirstWakil'])->middleware('auth','teller');
|
||||||
Route::get('/history',['as'=>'gadai.history','uses'=>'GadaianController@history'])->middleware('auth','teller');
|
Route::get('/history',['as'=>'gadai.history','uses'=>'GadaianController@history'])->middleware('auth','teller');
|
||||||
Route::get('/history/khazanah',['as'=>'gadai.history.khazanah','uses'=>'GadaianController@history'])->middleware('auth','khazanah');
|
Route::get('/history/khazanah',['as'=>'gadai.history.khazanah','uses'=>'GadaianController@history'])->middleware('auth','khazanah');
|
||||||
|
Route::post('/customer/assign-anggota', ['as' => 'customer.assignAnggota','uses' => 'CustomersController@assignAnggota'])->middleware('auth', 'teller');
|
||||||
|
|
||||||
//Laporan Aliran Tunai Teller
|
//Laporan Aliran Tunai Teller
|
||||||
Route::get('/laporan/alirantunai', ['as' => 'laporan.alirantunai', 'uses'=> 'AliranTunaiController@laporanAliranTunaiTeller'])->middleware('auth','teller');
|
Route::get('/laporan/alirantunai', ['as' => 'laporan.alirantunai', 'uses'=> 'AliranTunaiController@laporanAliranTunaiTeller'])->middleware('auth','teller');
|
||||||
@@ -208,6 +213,8 @@ Route::post('/deletependahuluanserahan',['as'=>'khazanah.deletependser','uses'=>
|
|||||||
//Ubah dan Hapus
|
//Ubah dan Hapus
|
||||||
Route::get('/getkelulu',['as'=>'teller.getkelulusan','uses'=>'GadaianController@getkelulusan'])->middleware('auth','teller');
|
Route::get('/getkelulu',['as'=>'teller.getkelulusan','uses'=>'GadaianController@getkelulusan'])->middleware('auth','teller');
|
||||||
Route::post('/createkelulu',['as'=>'teller.createkelulusan','uses'=>'GadaianController@createkelulusan'])->middleware('auth');
|
Route::post('/createkelulu',['as'=>'teller.createkelulusan','uses'=>'GadaianController@createkelulusan'])->middleware('auth');
|
||||||
|
Route::post('/createkeluluanggota',['as'=>'teller.createkelulusan-anggota','uses'=>'GadaianController@createkelulusanAnggota'])->middleware('auth');
|
||||||
|
|
||||||
Route::put('/updatekelulu',['as'=>'teller.updatekelulusan','uses'=>'GadaianController@updatekelulusan'])->middleware('auth','khazanah');
|
Route::put('/updatekelulu',['as'=>'teller.updatekelulusan','uses'=>'GadaianController@updatekelulusan'])->middleware('auth','khazanah');
|
||||||
|
|
||||||
|
|
||||||
@@ -269,6 +276,8 @@ Route::post('laporan/saghilang/cetak',['as'=>'saghilang.laporancetak','uses'=>'K
|
|||||||
// Route::get('/laporan/agingbulanan', [ 'as'=>'laporan.agingbulanan', 'uses'=>'KhazanahController@laporanAging_Bulanan'])->middleware('auth','khazanah');
|
// Route::get('/laporan/agingbulanan', [ 'as'=>'laporan.agingbulanan', 'uses'=>'KhazanahController@laporanAging_Bulanan'])->middleware('auth','khazanah');
|
||||||
// Route::post('/laporan/agingbulanan/cetak', ['as'=>'agingbulan.cetaklaporan', 'uses'=>'KhazanahController@cetaklaporang_Aging'])->middleware('auth','khazanah');
|
// Route::post('/laporan/agingbulanan/cetak', ['as'=>'agingbulan.cetaklaporan', 'uses'=>'KhazanahController@cetaklaporang_Aging'])->middleware('auth','khazanah');
|
||||||
|
|
||||||
|
Route::get('laporan/operasi/audittrail/cetak',['as'=>'operasi.audittrail.laporancetak','uses'=>'OperasiController@cetakLaporanAuditTrail'])->middleware('auth','operasi');
|
||||||
|
|
||||||
Route::get('/laporan/stokauditbackdate',['as'=>'laporan.stokauditbackdate','uses'=>'KhazanahController@laporanStokAuditBackdate'])->middleware('auth','khazanah');
|
Route::get('/laporan/stokauditbackdate',['as'=>'laporan.stokauditbackdate','uses'=>'KhazanahController@laporanStokAuditBackdate'])->middleware('auth','khazanah');
|
||||||
Route::get('laporan/stokauditbackdate/cetak',['as'=>'stokauditbackdate.laporancetak','uses'=>'KhazanahController@cetakLaporanStokAuditBackdate'])->middleware('auth','khazanah');
|
Route::get('laporan/stokauditbackdate/cetak',['as'=>'stokauditbackdate.laporancetak','uses'=>'KhazanahController@cetakLaporanStokAuditBackdate'])->middleware('auth','khazanah');
|
||||||
|
|
||||||
@@ -339,11 +348,13 @@ Route::post('/barcodescanned',['as'=>'barcode.scanned','uses'=>'KhazanahControll
|
|||||||
|
|
||||||
//Operasi
|
//Operasi
|
||||||
Route::get('/operasi/kelulusan','OperasiController@kelulusan')->name('operasi.kelulusan')->middleware('auth','operasi');
|
Route::get('/operasi/kelulusan','OperasiController@kelulusan')->name('operasi.kelulusan')->middleware('auth','operasi');
|
||||||
|
Route::get('/operasi/kelulusan/anggota','OperasiController@kelulusanAnggota')->name('operasi.kelulusananggota')->middleware('auth','operasi');
|
||||||
Route::post('/operasi/createkelulusan',['as'=>'operasi.createkelulusan','uses'=>'OperasiController@createkelulusan'])->middleware('auth','teller');
|
Route::post('/operasi/createkelulusan',['as'=>'operasi.createkelulusan','uses'=>'OperasiController@createkelulusan'])->middleware('auth','teller');
|
||||||
Route::post('/operasi/createkelulusan-by-khazanah',['as'=>'operasi.createkelulusan-by-khazanah','uses'=>'OperasiController@createkelulusanByKhazanah'])->middleware('auth', 'khazanah');
|
|
||||||
Route::get('/operasi/getkelulusan',['as'=>'operasi.getkelulusan','uses'=>'OperasiController@getkelulusan'])->middleware('auth','teller');
|
Route::get('/operasi/getkelulusan',['as'=>'operasi.getkelulusan','uses'=>'OperasiController@getkelulusan'])->middleware('auth','teller');
|
||||||
Route::put('/operasi/updatekelulusan',['as'=>'operasi.updatekelulusan','uses'=>'OperasiController@updatekelulusan'])->middleware('auth','operasi');
|
Route::put('/operasi/updatekelulusan',['as'=>'operasi.updatekelulusan','uses'=>'OperasiController@updatekelulusan'])->middleware('auth','operasi');
|
||||||
|
Route::put('/operasi/updatekelulusananggota',['as'=>'operasi.updatekelulusananggota','uses'=>'OperasiController@updatekelulusananggota'])->middleware('auth','operasi');
|
||||||
Route::get('/operasi/parameter','OperasiController@parameter')->name('parameter')->middleware('auth','operasi');
|
Route::get('/operasi/parameter','OperasiController@parameter')->name('parameter')->middleware('auth','operasi');
|
||||||
|
Route::get('/operasi/laporan-audit','OperasiController@laporanAudit')->name('operasi.laporan.audit')->middleware('auth','operasi');
|
||||||
Route::get('/operasi/hargaemas',['as'=>'operasi.hargaemas','uses'=>'OperasiController@hargaemas'])->middleware('auth','operasi');
|
Route::get('/operasi/hargaemas',['as'=>'operasi.hargaemas','uses'=>'OperasiController@hargaemas'])->middleware('auth','operasi');
|
||||||
Route::post('/operasi/hargaemas/update',['as'=>'hargaemas.update','uses'=>'OperasiController@updatehargaemas'])->middleware('auth','operasi');
|
Route::post('/operasi/hargaemas/update',['as'=>'hargaemas.update','uses'=>'OperasiController@updatehargaemas'])->middleware('auth','operasi');
|
||||||
Route::post('/operasi/hargaemas',['as'=>'hargaemas.create','uses'=>'OperasiController@createhargaemas'])->middleware('auth','operasi');
|
Route::post('/operasi/hargaemas',['as'=>'hargaemas.create','uses'=>'OperasiController@createhargaemas'])->middleware('auth','operasi');
|
||||||
|
|||||||
Reference in New Issue
Block a user