diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..32264f9
--- /dev/null
+++ b/.dockerignore
@@ -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
diff --git a/.env.docker.example b/.env.docker.example
index 952c623..e889c2f 100644
--- a/.env.docker.example
+++ b/.env.docker.example
@@ -2,10 +2,11 @@ APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:I+gVCBqCeGsUQ3vwwW23D5wVgdgMqwM2ozBkqDFY9o0=
APP_DEBUG=true
-APP_URL=http://adminv3.localhost
-API_URL=http://apiv3.localhost
-API_URL_KOOP=http://apiv3.localhost
-API_URL_PKB=http://apiv2.localhost
+APP_URL=http://localhost:8082
+API_BROWSER_URL=http://localhost:8080
+API_URL=http://api_arrahn-app-1:8000
+API_URL_KOOP=http://api_arrahn-app-1:8000
+API_URL_PKB=http://api_arrahn-app-1:8000
API_ARRAHN_PORTAL_URL=http://pay.arrahn.com.my
ADMIN_VERSION=V3
@@ -14,11 +15,13 @@ LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
-DB_HOST=database_arosv3
+DB_HOST=host.docker.internal
DB_PORT=3306
-DB_DATABASE=kaunterpkb
+DB_DATABASE=kaunter_erahn
DB_USERNAME=root
-DB_PASSWORD=secret
+DB_PASSWORD=root
+# Windows host IP from WSL: ip route | awk '/default/{print $3}'
+LARAGON_HOST=172.28.0.1
BROADCAST_DRIVER=pusher
CACHE_DRIVER=file
@@ -56,7 +59,7 @@ MIX_USE_DOCKER=true
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
# MIX_API_URL=http://api.arrahn
-MIX_API_URL=http://apiv3.localhost
-MIX_API_URL_ZONE1=http://apiv3.localhost
-MIX_API_URL_ZONE2=http://apiv3.localhost
-MIX_API_URL_ZONE3=http://apiv3.localhost
+MIX_API_URL=http://localhost:8080
+MIX_API_URL_ZONE1=http://localhost:8080
+MIX_API_URL_ZONE2=http://localhost:8080
+MIX_API_URL_ZONE3=http://localhost:8080
diff --git a/app/Http/Controllers/AkaunController.php b/app/Http/Controllers/AkaunController.php
index 15a5f66..b1194fc 100644
--- a/app/Http/Controllers/AkaunController.php
+++ b/app/Http/Controllers/AkaunController.php
@@ -43,24 +43,23 @@ class AkaunController extends Controller
$current = Carbon::now();
$current = new Carbon();
$tarikh_cetak = $current->toDateString();
+ $tarikh_mula = $tarikh_cetak;
+ $tarikh_akhir = $tarikh_cetak;
- if($request->datemula == null){
- $tarikh_cetak = $current->toDateString();
- }else {
- $split_date = explode('-',$request->datemula);
- // $tarikh_mula = $split_date[2] . '-' . $split_date[1] . '-' . $split_date[0];
- $tarikh_mula = $request->datemula;
+ if($request->datemula != null){
+ $tarikh_mula = $request->datemula;
}
- if($request->datehingga == null){
- $tarikh_cetak = $current->toDateString();
- }
- else{
- $split_date = explode('-',$request->datehingga);
- // $tarikh_akhir = $split_date[2] . '-' . $split_date[1] . '-' . $split_date[0];
+ if($request->datehingga != null){
$tarikh_akhir = $request->datehingga;
}
+ $had_response = Http::get($request->hostname . '/api/ModalOnlineLejer/' . $request->kodcaw, [
+ 'mula' => $tarikh_mula,
+ 'hingga' => $tarikh_akhir,
+ ])->json();
+ $had_modal_online = $had_response['had'] ?? 0;
+
$lejeramdata = Lejeram::orderBy('glcode')->get();
$lejeram = array();
$len = count($lejeramdata);
@@ -100,6 +99,11 @@ class AkaunController extends Controller
$kredit = ${$lejer['variable']}[$lejer->namakredit];
}
+ if($lejer->glcode == '7000/102')
+ {
+ $kredit = floatval($kredit) + $had_modal_online;
+ }
+
$totalkredit += floatval($kredit);
}
@@ -192,7 +196,14 @@ class AkaunController extends Controller
$hapuskira = Http::get($request->hostname.'/api/CalculationHapusKira/' . $request->kodcaw,['tarikh' => $tarikh_imbangan2])->json();
$xtra = Http::get($request->hostname.'/api/Xtra/' . $request->kodcaw,['tarikh' => $tarikh_imbangan2])->json();
-
+ $rebetAnnur = !empty(($cawangan_info['features'] ?? [])['rebet_annur']);
+ $rebetpromo = 0;
+ $pelarasanrebate = 0;
+ if ($rebetAnnur) {
+ $rebetpromo = Http::get($request->hostname.'/api/RebetPromoCalculation/' . $request->kodcaw,['tarikh' => $tarikh_imbangan2])->json();
+ $pelarasanrebate = Http::get($request->hostname.'/api/PelarasanRebate/' . $request->kodcaw,['tarikh' => $tarikh_imbangan2])->json();
+ }
+
//TunaiDitangan Sementara Upah
if($tarikh_imbangan2 >= '2021-04-22' && $tarikh_imbangan2 < '2021-05-05')
{
@@ -229,24 +240,10 @@ class AkaunController extends Controller
$untungrugiterkumpul = Http::get($request->hostname. '/api/UntungRugiTerkumpul/'. $request->kodcaw,['tarikh' => $tarikh_imbangan2])->json();
$hartasemasa = [];
-
- if($request->kodcaw == '010219')
- {
- if($tarikh_imbangan2 >= '2023-02-16')
- {
- $hutang = Http::withOptions(['verify' => config('app.api_verify')])->get($request->hostname.'/admin/ig/penghutang' ,['kodcaw' => $request->kodcaw, 'tarikh' => $tarikh_imbangan2])->json();
- $bayaran_hutang = Http::withOptions(['verify' => config('app.api_verify')])->get($request->hostname.'/admin/ig/bayaran_penghutang' ,['kodcaw' => $request->kodcaw, 'tarikh' => $tarikh_imbangan2])->json();
- //if($bayaran_hutang > 0) array_push($hartasemasa,['glcode' => '8000/501','descpt' => 'Bayaran Penghutang', 'amaun' => $bayaran_hutang]);
- $totaltunaiditangan = $totaltunaiditangan;
- $penghutangkaki = $hutang['bakihutang'] - $bayaran_hutang;
- }else{
- $penghutangkaki = $penghutangkaki;
- }
- }
// $hartasemasa = ['serahan' => $imbangduga['serahan'],'pinjamankoop' => $pinjamandiberi['pinjamankoop'],'emaspalsu' => $pinjamandiberi['emaspalsu'],'tunaiditangan' => $tunaiditangan['bakiakhir']];
-
- if($totaltunaiditangan > 0) array_push($hartasemasa,['glcode' => '1000/011','descpt' => 'Tunai Di Tangan', 'amaun' => $totaltunaiditangan]);
- if($pembiayaantawarruq > 0) array_push($hartasemasa,['glcode' => '1000/021','descpt' => 'Pembiayaan Di Bawah Tawarruq', 'amaun' => $pembiayaantawarruq]);
+
+ if($totaltunaiditangan > 0) array_push($hartasemasa,['glcode' => '1000/010','descpt' => 'Tunai Di Tangan', 'amaun' => $totaltunaiditangan]);
+ if($pembiayaantawarruq > 0) array_push($hartasemasa,['glcode' => '1000/010','descpt' => 'Pembiayaan Di Bawah Tawarruq', 'amaun' => $pembiayaantawarruq]);
if($penghutangkaki > 0) array_push($hartasemasa,['glcode' => '1000/011','descpt' => 'Penghutang Kakitangan', 'amaun' => $penghutangkaki]);
//array_push($hartasemasa,['glcode' => '1000/045','descpt' => 'Serahan Bayaran Online', 'amaun' => 0.00]);
if($keuntungan > 0) array_push($hartasemasa,['glcode' => '1000/211','descpt' => 'Keuntungan Tertangguh', 'amaun' => $keuntungan]);
@@ -258,6 +255,7 @@ class AkaunController extends Controller
if($imbangduga['pindahkekpkb'] > 0) array_push($hartasemasa,['glcode' => '1000/090','descpt' => 'Pindah Ke KPKB(IP)', 'amaun' => $imbangduga['pindahkekpkb']]);
if($peruntukanhapuskira > 0) array_push($hartasemasa,['glcode' => '1000/015','descpt' => 'Peruntukan Hapus Kira', 'amaun' => $peruntukanhapuskira]);
if($belian1stop > 0) array_push($hartasemasa,['glcode' => '8000/501','descpt' => 'Belian 1 Stop', 'amaun' => $belian1stop]);
+ if($rebetpromo > 0) array_push($hartasemasa,['glcode' => '5000/242','descpt' => 'Diskaun Promosi', 'amaun' => ($rebetpromo * -1)]);
$totalhartasemasa = 0;
foreach($hartasemasa as $index => $hs)
@@ -278,7 +276,7 @@ class AkaunController extends Controller
if($panjar['keraian'] > 0) array_push($tanggungansemasa,['glcode' => '3000/019','descpt' => 'Panjar - Keraian Dan Promosi','amaun' => -$panjar['keraian']]);
if($bakilelong['bakilelong'] != 0) array_push($tanggungansemasa,['glcode' => '7000/090','descpt' => 'Baki Lelong','amaun' => $bakilelong['bakilelong']]);
if($bakilelong['rugilelong'] != 0) array_push($tanggungansemasa,['glcode' => '3000/020','descpt' => 'Kerugian Lelong','amaun' => $bakilelong['rugilelong']]);
- if($wtd > 0) array_push($tanggungansemasa,['glcode' => '3000/021','descpt' => 'Wang Tak Dituntut','amaun' => $wtd]);
+ if($wtd > 0) array_push($tanggungansemasa,['glcode' => '3000/021','descpt' => 'SERAHAN WANG TAK DITUNTUT','amaun' => $wtd]);
if($cajlelong > 0) array_push($tanggungansemasa,['glcode' => '5000/213','descpt' => 'Pendapatan Caj Lelong','amaun' => $cajlelong]);
if($untungrugiterkumpul != 0) array_push($tanggungansemasa,['glcode' => '7000/101','descpt' => 'Untung/Rugi Terkumpul','amaun' => $untungrugiterkumpul]);
if($cajperkhidmatan > 0) array_push($tanggungansemasa,['glcode' => '5000/213','descpt' => 'Caj Perkhidmatan Terkumpul','amaun' => $cajperkhidmatan]);
@@ -289,6 +287,8 @@ class AkaunController extends Controller
if($utgterkumpulxtra > 0) array_push($tanggungansemasa,['glcode' => '7000/201','descpt' => 'Untung/Rugi Terkumpul Xtra','amaun' => $utgterkumpulxtra]);
if($jualan1stop > 0) array_push($tanggungansemasa,['glcode' => '9000/501','descpt' => 'Jualan 1 Stop','amaun' => $jualan1stop]);
if($hapuskira > 0) array_push($tanggungansemasa,['glcode' => '3000/011','descpt' => 'Hapus Kira','amaun' => -$hapuskira]);
+ if($rebetpromo > 0) array_push($tanggungansemasa,['glcode' => '5000/242','descpt' => 'Diskaun Promosi', 'amaun' => ($rebetpromo * -1)]);
+ if($pelarasanrebate > 0) array_push($tanggungansemasa,['glcode' => '5000/243','descpt' => 'Pelarasan Rebate', 'amaun' => ($pelarasanrebate * -1)]);
$totaltanggungansemasa = 0;
foreach($tanggungansemasa as $index => $ts)
@@ -303,18 +303,15 @@ class AkaunController extends Controller
$totaluntungrugi = 0;
$totaluntungrugi = $totaltanggungansemasa + $untungrugi;
- if(isset($request->jenis))
+ $viewData = compact('tarikh_imbangan', 'tarikh_imbangan2','hartasemasa','untungrugifield','tanggungansemasa','totalhartasemasa','totaluntungrugi','totaltanggungansemasa','tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail');
+
+ if($request->jenis == 'pdf')
{
- if($request->jenis == 'pdf')
- {
- $pdf = PDF::loadView('akaun.laporan_imbanduga',compact('tarikh_imbangan', 'tarikh_imbangan2','hartasemasa','untungrugifield','tanggungansemasa','totalhartasemasa','totaluntungrugi','totaltanggungansemasa','tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail'))->setPaper('a4', 'potrait');
- return $pdf->download('laporan_imbangduga_' . $request->kodcaw .'_'. $tarikh_imbangan2 . '.pdf');
- }else{
- return view('akaun.laporan_imbanduga',compact('tarikh_imbangan', 'tarikh_imbangan2','hartasemasa','untungrugifield','tanggungansemasa','totalhartasemasa','totaluntungrugi','totaltanggungansemasa','tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail'));
- }
+ $pdf = PDF::loadView('akaun.laporan_imbanduga', $viewData)->setPaper('a4', 'potrait');
+ return $pdf->download('laporan_imbangduga_' . $request->kodcaw .'_'. $tarikh_imbangan2 . '.pdf');
}
- // return view('akaun.laporan_imbanduga',compact('tarikh_imbangan', 'tarikh_imbangan2','hartasemasa','untungrugifield','tanggungansemasa','totalhartasemasa','totaluntungrugi','totaltanggungansemasa','tarikh_cetak','cawangan_info','cawangan','api_url','cawangan_detail'));
+ return view('akaun.laporan_imbanduga', $viewData);
}
////ainizazi
public function cetakLaporanGadai(Request $request){
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index f5dddd6..76f2d09 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -30,6 +30,7 @@ class Kernel extends HttpKernel
*/
protected $middlewareGroups = [
'web' => [
+ \App\Http\Middleware\RewriteApiHostname::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
diff --git a/app/Http/Middleware/RewriteApiHostname.php b/app/Http/Middleware/RewriteApiHostname.php
new file mode 100644
index 0000000..d7b948c
--- /dev/null
+++ b/app/Http/Middleware/RewriteApiHostname.php
@@ -0,0 +1,28 @@
+has('hostname')) {
+ $request->merge([
+ 'hostname' => api_url_for_server($request->input('hostname')),
+ ]);
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/helpers.php b/app/helpers.php
new file mode 100644
index 0000000..d0eab6d
--- /dev/null
+++ b/app/helpers.php
@@ -0,0 +1,55 @@
+ env('API_URL'),
+ 'browser_url' => env('API_BROWSER_URL'),
'url_koop' => env('API_URL_KOOP'),
'url_pkb' => env('API_URL_PKB'),
'url_arrahn_portal' => env('API_ARRAHN_PORTAL_URL'),
diff --git a/docker-compose.staging.yml b/docker-compose.staging.yml
new file mode 100644
index 0000000..ac45295
--- /dev/null
+++ b/docker-compose.staging.yml
@@ -0,0 +1,62 @@
+name: admin_erahn_staging
+
+services:
+ app:
+ image: ${APP_IMAGE:-git.koppkb.com/kopkb/admin-erahn}:${IMAGE_TAG:-staging}
+ build:
+ context: .
+ dockerfile: docker/php/Dockerfile
+ target: staging
+ container_name: admin_erahn_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: admin_erahn_staging_web
+ ports:
+ - "${HTTP_PORT:-8092}: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: admin_erahn_staging_mysql
+ command: --default-authentication-plugin=mysql_native_password
+ ports:
+ - "127.0.0.1:${MYSQL_PUBLISH_PORT:-3310}:3306"
+ environment:
+ MYSQL_DATABASE: admin_erahn
+ MYSQL_USER: adminuser
+ 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:
diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf
new file mode 100644
index 0000000..182f324
--- /dev/null
+++ b/docker/nginx/default.conf
@@ -0,0 +1,39 @@
+server {
+ listen 80;
+ server_name _;
+
+ root /var/www/html/public;
+ index index.php index.html;
+
+ charset utf-8;
+ client_max_body_size 50M;
+
+ location / {
+ # Production Apache public/.htaccess 301-strips trailing slashes.
+ # Nginx ignores .htaccess, so without this /path/ 404s while /path works.
+ rewrite ^/(.*)/$ /$1 last;
+ try_files $uri @php;
+ }
+
+ location @php {
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME /var/www/html/public/index.php;
+ fastcgi_param PATH_INFO $fastcgi_path_info;
+ fastcgi_pass app:9000;
+ fastcgi_index index.php;
+ fastcgi_read_timeout 120s;
+ }
+
+ location ~ \.php$ {
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ fastcgi_param PATH_INFO $fastcgi_path_info;
+ fastcgi_pass app:9000;
+ fastcgi_index index.php;
+ fastcgi_read_timeout 120s;
+ }
+
+ location ~ /\.(?!well-known).* {
+ deny all;
+ }
+}
diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile
new file mode 100644
index 0000000..e5d5b98
--- /dev/null
+++ b/docker/php/Dockerfile
@@ -0,0 +1,60 @@
+FROM php:7.4-fpm AS base
+
+WORKDIR /var/www/html
+
+# PHP 7.4 uses Debian Bullseye; use its archived package repositories.
+# Archived security metadata expires, but package signatures remain verified.
+RUN printf '%s\n' \
+ 'deb https://archive.debian.org/debian bullseye main' \
+ 'deb [check-valid-until=no] https://archive.debian.org/debian-security bullseye-security main' \
+ > /etc/apt/sources.list \
+ && rm -rf /var/lib/apt/lists/* \
+ && apt-get -o Acquire::Retries=3 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
+
+# Normalize Windows checkout line endings before executing the script.
+RUN sed -i 's/\r$//' /usr/local/bin/app-entrypoint.sh \
+ && 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
diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh
new file mode 100644
index 0000000..333adab
--- /dev/null
+++ b/docker/php/entrypoint.sh
@@ -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 "$@"
diff --git a/docker/php/php.ini b/docker/php/php.ini
new file mode 100644
index 0000000..3e9df60
--- /dev/null
+++ b/docker/php/php.ini
@@ -0,0 +1,4 @@
+memory_limit=512M
+upload_max_filesize=50M
+post_max_size=50M
+max_execution_time=120
diff --git a/docker/php/zz-clear-env.conf b/docker/php/zz-clear-env.conf
new file mode 100644
index 0000000..edbfb22
--- /dev/null
+++ b/docker/php/zz-clear-env.conf
@@ -0,0 +1,3 @@
+[www]
+; Pass container env vars (from compose env_file) through to PHP workers.
+clear_env = no
diff --git a/resources/js/Akaun/Imbangduga.vue b/resources/js/Akaun/Imbangduga.vue
index b2f9132..72f4dc2 100644
--- a/resources/js/Akaun/Imbangduga.vue
+++ b/resources/js/Akaun/Imbangduga.vue
@@ -55,15 +55,13 @@
-