27 Commits

Author SHA1 Message Date
ismailmasseran 93b99c6eb0 DONE: create dump db into migration for all used database; WIP: merge bsas and api, add feature flags for commodity 2026-10-27 08:45:33 +08:00
ismailmasseran 1385539d31 Merge branch 'main' of https://git.koppkb.com/KoPKB/api_arrahn into feature/shoraka-integration 2026-10-26 15:41:22 +08:00
ismailmasseran 0451ad3dbe Feature/bsas integration (#24)
Reviewed-on: #24
Co-authored-by: ISMAIL MASSERAN <ismail@koppkb.com>
Co-committed-by: ISMAIL MASSERAN <ismail@koppkb.com>
2026-10-26 15:35:48 +08:00
ismailmasseran d5cfe503c5 Merge branch 'main' of https://git.koppkb.com/KoPKB/api_arrahn into feature/shoraka-integration 2026-10-26 15:25:11 +08:00
ismailmasseran 8dd8def358 DONE: drop table shoraka financings, and improve UI checking on shoraka order status 2026-10-26 15:04:43 +08:00
ismailmasseran e3e7694b54 DONE: remove cache, and remove dto financing 2026-10-26 12:49:57 +08:00
ismailmasseran 2786b3be0c Fix/gadai online details (#23)
Build Docker Image / build-backend (push) Successful in 17s
Deploy to Staging / deploy (push) Successful in 19s
Co-authored-by: afrina <afrina@koppkb.com>
Reviewed-on: #23
2026-10-22 11:52:27 +08:00
afrina 4648c7072b fix(shoraka): reuse batal gadai norujukan 2026-10-21 10:32:54 +08:00
afrina ac57e04eac refactor(shoraka): move financing records to master database 2026-10-19 13:31:06 +08:00
afrina a8888e66d1 feat(shoraka): defer gadai persistence until commodity confirmation and add simulation support 2026-10-19 13:02:13 +08:00
ismailmasseran d0f08545d1 DONE: add sectigo certs to docker container 2026-10-11 14:58:02 +08:00
nurafrinaalimi16 6c9f2f4f0f feat(shoraka): integrate transactions with Shoraka API 2026-10-08 12:30:02 +08:00
nurafrinaalimi16 5d208f7a79 Merge remote-tracking branch 'origin/main' into feature/shoraka-integration 2026-10-05 11:02:54 +08:00
afrina aac29bc199 Merge pull request 'fix: recalculate gadai totals after marhun edits' (#21) from fix/marhun-edit-gadai-totals into main
Build Docker Image / build-backend (push) Successful in 18s
Deploy to Staging / deploy (push) Successful in 17s
Reviewed-on: #21
2026-10-05 10:43:45 +08:00
nurafrinaalimi16 9e73f6ad32 fix: recalculate gadai totals after marhun edits 2026-10-05 10:39:19 +08:00
ISMAIL MASSERAN ff21d82af5 DONE: remove nginx for local docker compose 2026-10-01 13:45:34 +08:00
ismailmasseran 62c6d240ce Merge pull request 'DONE: update cicd to auto deploy on staging, clean up garbage files' (#20) from cicd/auto-deploy-staging into main
Build Docker Image / build-backend (push) Successful in 17s
Deploy to Staging / deploy (push) Successful in 17s
Reviewed-on: #20
2026-10-01 12:01:34 +08:00
ISMAIL MASSERAN 1ee7edefff DONE: update cicd to auto deploy on staging, clean up garbage files 2026-10-01 12:00:09 +08:00
ismailmasseran b52f4b6919 Merge pull request 'DONE: add password on laravel log viewer' (#19) from feature/add-pass-logviewer into main
Build Docker Image / build-backend (push) Successful in 18s
Reviewed-on: #19
2026-09-28 16:27:55 +08:00
ISMAIL MASSERAN b8e3e2b369 DONE: add password on laravel log viewer 2026-09-28 16:26:50 +08:00
ismailmasseran 3a86ba5b26 Merge pull request 'DONE: add env based checking for whatsapp before testing at staging' (#18) from feature/env-based-whatsapp-cloud into main
Build Docker Image / build-backend (push) Successful in 18s
Reviewed-on: #18
2026-09-28 10:30:11 +08:00
ISMAIL MASSERAN b1934e1627 DONE: add env based checking for whatsapp before testing at staging 2026-09-28 10:26:06 +08:00
ISMAIL MASSERAN 583d936fd2 DONE: update whatsapp message template
Build Docker Image / build-backend (push) Successful in 17s
2026-09-27 15:57:50 +08:00
ISMAIL MASSERAN 1076ecbaf2 DONE: update env.staging
Build Docker Image / build-backend (push) Successful in 26s
2026-09-26 18:51:47 +08:00
ismailmasseran 92894bad44 Merge pull request 'fix: change pembiayaan online batch 2 cutoff from 16:30 to 15:00' (#17) from fix/pembiayaan-online-batch2-cutoff into main
Reviewed-on: #17
2026-09-24 16:15:43 +08:00
nurafrinaalimi16 9916e81dba fix: change pembiayaan online batch 2 cutoff from 16:30 to 15:00 2026-09-24 16:14:44 +08:00
nurafrinaalimi16 50cf966da7 feature/shoraka-integration 2026-09-17 15:08:43 +08:00
174 changed files with 8296 additions and 8089 deletions
+12 -1
View File
@@ -68,4 +68,15 @@ KAUNTER_URL=http://host.docker.internal:8081
INTERNAL_NOTIFICATION_SECRET=erahn-local-notification-secret
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
QUEUE_CONNECTION=sync
BSAS_BASE_URL=https://bsasdevapi.bursamalaysia.com/api
BSAS_TOKEN_URL=https://bsasdevapi.bursamalaysia.com/oauth/token
BSAS_CLIENT_ID=
BSAS_CLIENT_SECRET=
BSAS_MEMBER_SHORT_NAME=KOOPPKB
BSAS_PRODUCT_CODE=CPO-MSIA-09
BSAS_TENOR=00088
BSAS_MAX_WAIT_TIME=10
BSAS_HTTP_TIMEOUT=30
BSAS_ORDER_RESULT_RETRIES=2
+15 -1
View File
@@ -89,6 +89,7 @@ DB_PASSWORD_11=G0dz!ll42020
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
MAX_MUTUEMAS=true
TENNANT_MASTER_DB=master_erahn
@@ -97,6 +98,8 @@ TENNANT_KAUNTER_DB=kaunter_erahn
KAUNTER_URL=http://host.docker.internal:8081
INTERNAL_NOTIFICATION_SECRET=
LOGVIEWER_PASSWORD=
WHATSAPP_TOKEN= # Paste token from Graph API explorer.
WHATSAPP_PHONE_NUMBER_ID=1323449077519027
WHATSAPP_API_VERSION=v25.0
@@ -104,4 +107,15 @@ WHATSAPP_TEMPLATE=hello_world
WHATSAPP_TEMPLATE_LANG=en_US
WHATSAPP_VERIFY_TOKEN= # webhook verify token
WHATSAPP_APP_SECRET= # X-Hub-Signature-256 checks; need to be enable first
ADMIN_PHONE_NUMBER=60193450165
ADMIN_PHONE_NUMBER=60193450165
BSAS_BASE_URL=https://bsasdevapi.bursamalaysia.com/api
BSAS_TOKEN_URL=https://bsasdevapi.bursamalaysia.com/oauth/token
BSAS_CLIENT_ID=
BSAS_CLIENT_SECRET=
BSAS_MEMBER_SHORT_NAME=KOOPPKB
BSAS_PRODUCT_CODE=CPO-MSIA-09
BSAS_TENOR=00088
BSAS_MAX_WAIT_TIME=10
BSAS_HTTP_TIMEOUT=30
BSAS_ORDER_RESULT_RETRIES=2
+6 -4
View File
@@ -9,6 +9,7 @@ API_ARRAHNBID_ANNUR=https://adminbid-annur.erahn.com.my/api/
LOG_CHANNEL=stack
LOG_SLACK_WEBHOOK_URL=
LOGVIEWER_PASSWORD="$2y$10$k7eiUyZdm3BruwAaT1gbmelTm.PPgZptOEQT1nlBjyiR84a4KBMlm"
DB_CONNECTION_2=mysql
DB_HOST_2=192.168.1.216
@@ -77,11 +78,12 @@ TENNANT_KAUNTER_DB=kaunter_erahn
KAUNTER_URL=https://ujrah.erahn.com.my
INTERNAL_NOTIFICATION_SECRET="nIDTe(u@6[)VLJyd"
WHATSAPP_TOKEN=EAAZAonT56AO0BSlxZAKa8QX6HIWJpp5Czsz2KQ8BYE4iyZAe5fg8ZAmaSwZCXZCPf44xazDZAhaXLHJKHKUrUZCxei86EWl6Ar3RingfybZAlXp79Yd6WwOG5IZAnu9o5mevm895ygrs39H11G01fpYU2lYRpIWdn6URkTA0kMJdqZAlTaRILTjUM5KhvV05Q4lLAZDZD
WHATSAPP_PHONE_NUMBER_ID=1323449077519027
WHATSAPP_CLOUD_ENABLED=true
WHATSAPP_TOKEN=EAAZAonT56AO0BSnZAhWLi4UXDRT6iAldbiybxSQZAnGrzIke1QiNWvQkZAbQQTjWeVZC5bL1gEBhW6ff3Shf79nowXiTQEwyxqgZAZB6ZATwFCeTs8MZA5H6ZA76IJBuVqRiAZBvZCfkeSurbUNpEWyi9W7zsT2GWiZCLX8meX0KCfDHu7cp4aBgVu1Ps5ZCRO3bP4ZCQZDZD
WHATSAPP_PHONE_NUMBER_ID=1375899418935337
WHATSAPP_API_VERSION=v25.0
WHATSAPP_TEMPLATE=pembiayaan_online_paid
WHATSAPP_TEMPLATE=hebahan_pembiayaan_online
WHATSAPP_TEMPLATE_LANG=ms
WHATSAPP_VERIFY_TOKEN=418ed86d49422071681c76bed25ae1cb7e90456c794a92f1c9ea417945a35a0a
WHATSAPP_APP_SECRET=
ADMIN_PHONE_NUMBER=60193450165
ADMIN_PHONE_NUMBER=
+26 -12
View File
@@ -4,17 +4,16 @@ APP_KEY=WbPGkYNmXZ6ZQplGlvl0iZ7zyW1b09xa
APP_DEBUG=true
APP_URL=http://127.0.0.1:8090
APP_TIMEZONE=Asia/Kuala_Lumpur
API_ARRAHNBID=http://lelong.test/api/
API_ARRAHNBID_ANNUR=http://lelong-annur.test/api/
# Unique host ports — change these if they collide with other containers on the server.
# Host nginx should proxy the staging domain to 127.0.0.1:${HTTP_PORT}
HTTP_PORT=8090
MYSQL_PUBLISH_PORT=3308
MAX_MUTUEMAS=true
LOG_CHANNEL=stack
LOG_LEVEL=debug
LOG_SLACK_WEBHOOK_URL=
LOGVIEWER_PASSWORD=test123
DB_CONNECTION=mysql
DB_HOST=mysql
@@ -72,15 +71,30 @@ DB_DATABASE_6=erahn_test
DB_USERNAME_6=root
DB_PASSWORD_6=root
# DB_CONNECTION_8=mysql
# DB_HOST_8=mysql
# DB_PORT_8=3306
# DB_DATABASE_8=arrahn_klanas
# DB_USERNAME_8=spider
# DB_PASSWORD_8=G0dz!ll42020
DB_CONNECTION_9=mysql
DB_HOST_9=mysql
DB_PORT_9=3306
DB_DATABASE_9=annur_tampoi
DB_USERNAME_9=root
DB_PASSWORD_9=root
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
MAX_MUTUEMAS=true
TENNANT_MASTER_DB=master_erahn
TENNANT_KAUNTER_DB=kaunter_erahn
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
KAUNTER_URL=https://staging.erahn.com.my/login
INTERNAL_NOTIFICATION_SECRET=staging_noti_secret
WHATSAPP_CLOUD_ENABLED=false
WHATSAPP_TOKEN=EAAZAonT56AO0BSnZAhWLi4UXDRT6iAldbiybxSQZAnGrzIke1QiNWvQkZAbQQTjWeVZC5bL1gEBhW6ff3Shf79nowXiTQEwyxqgZAZB6ZATwFCeTs8MZA5H6ZA76IJBuVqRiAZBvZCfkeSurbUNpEWyi9W7zsT2GWiZCLX8meX0KCfDHu7cp4aBgVu1Ps5ZCRO3bP4ZCQZDZD
WHATSAPP_PHONE_NUMBER_ID=1375899418935337
WHATSAPP_API_VERSION=v25.0
WHATSAPP_TEMPLATE=hebahan_pembiayaan_online
WHATSAPP_TEMPLATE_LANG=ms
WHATSAPP_VERIFY_TOKEN=418ed86d49422071681c76bed25ae1cb7e90456c794a92f1c9ea417945a35a0a
WHATSAPP_APP_SECRET=
ADMIN_PHONE_NUMBER=
+37 -18
View File
@@ -1,6 +1,9 @@
name: Deploy to Staging
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
image_tag:
@@ -18,10 +21,22 @@ jobs:
runs-on: host
steps:
- name: Resolve image tag
id: resolve
run: |
set -e
if [ "${{ gitea.event_name }}" = "workflow_dispatch" ]; then
IMAGE_TAG="${{ inputs.image_tag }}"
else
IMAGE_TAG="${{ gitea.ref_name }}"
fi
echo "IMAGE_TAG=${IMAGE_TAG}" >> "$GITHUB_OUTPUT"
echo "Deploying image tag: ${IMAGE_TAG}"
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ inputs.image_tag }}
ref: ${{ steps.resolve.outputs.IMAGE_TAG }}
- name: Login to Docker registry
run: |
@@ -33,43 +48,47 @@ jobs:
- name: Verify image exists in registry
run: |
set -e
IMAGE_TAG="${{ inputs.image_tag }}"
IMAGE_TAG="${{ steps.resolve.outputs.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"
# Tag pushes build in parallel — wait for the image to appear
for i in $(seq 1 30); do
if docker manifest inspect "${IMAGE}" > /dev/null 2>&1; then
echo "✓ ${IMAGE} found"
exit 0
fi
echo "Image not ready yet (attempt ${i}/30), waiting 20s..."
sleep 20
done
echo "ERROR: Image ${IMAGE} does not exist in registry after waiting!"
echo "Run the Build Docker Image workflow first."
exit 1
- name: Pull Docker image
run: |
set -e
IMAGE_TAG="${{ inputs.image_tag }}"
IMAGE_TAG="${{ steps.resolve.outputs.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 }}"
IMAGE_TAG="${{ steps.resolve.outputs.IMAGE_TAG }}"
mkdir -p "${DEPLOY_DIR}/docker/nginx" "${DEPLOY_DIR}/docker/mysql"
cp docker-compose.staging.yml "${DEPLOY_DIR}/docker-compose.yml"
cp docker/nginx/default.conf "${DEPLOY_DIR}/docker/nginx/default.conf"
cp -R docker/mysql/init "${DEPLOY_DIR}/docker/mysql/"
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
if [ ! -f .env.staging ]; then
echo "ERROR: .env.staging is missing in the repository"
exit 1
fi
cp .env.staging "${DEPLOY_DIR}/.env.staging"
echo "✓ Synced .env.staging from repo"
cd "${DEPLOY_DIR}"
+44
View File
@@ -0,0 +1,44 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class BsasOrder extends Model
{
protected $connection = 'mysql7';
protected $table = 'bsas_orders';
protected $fillable = [
'uuid',
'norujukan',
'kodcaw',
'serial_number',
'product_code',
'bid_value',
'otc_murabaha_value',
'otc_counter_party',
'status',
'status_code',
'status_message',
'e_cert_no',
'bid_ecert_response',
'otc_ecert_response',
'stb_ecert_response',
'request_payload',
'order_response',
'result_response',
'created_by',
];
protected $casts = [
'bid_value' => 'decimal:2',
'otc_murabaha_value' => 'decimal:2',
'request_payload' => 'array',
'order_response' => 'array',
'result_response' => 'array',
'bid_ecert_response' => 'array',
'otc_ecert_response' => 'array',
'stb_ecert_response' => 'array',
];
}
+3 -2
View File
@@ -31,11 +31,12 @@ class WhatsappTestSend extends Command
$bodyParams = [];
if (strtolower($template) !== 'hello_world') {
// pembiayaan_online_paid: SAG, amaun, bank, 4 digit akhir, tarikh, rujukan
$bodyParams = [
'Tampoi',
'TEST-SAG',
'100.00',
'Maybank ****1234',
'Maybank',
'1234',
date('d/m/Y'),
'TEST-REF',
];
+24 -6
View File
@@ -158,7 +158,6 @@ class GadaiController extends Controller
}
public function create($kodcaw,Request $request){
$master = new MasterServices($kodcaw);
$response = $master->createGadai($request);
@@ -228,11 +227,14 @@ class GadaiController extends Controller
}
public function daftarGadaiMarhun($norujukan,Request $request){
// dd("ggwp");
$master = new MasterServices($request->kodcaw);
$response = $master->createMarhunGadai($request->norujukan,$request);
public function daftarGadaiMarhun($kodcaw, $norujukan, Request $request)
{
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()) {
abort(409, 'Kontrak telah dihantar ke Shoraka dan tidak boleh diubah.');
}
$request->merge(['kodcaw' => $kodcaw, 'norujukan' => $norujukan]);
$master = new MasterServices($kodcaw);
$response = $master->createMarhunGadai($norujukan, $request);
return response()->json($response, 200);
}
@@ -369,6 +371,9 @@ class GadaiController extends Controller
}
public function batalGadai($kodcaw, $norujukan,Request $request){
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()) {
abort(409, 'Transaksi Shoraka telah dihantar. Semakan operasi diperlukan sebelum pembatalan.');
}
$current = Carbon::now();
$current = new Carbon();
@@ -406,6 +411,11 @@ class GadaiController extends Controller
}
public function pembelianKomuditi($kodcaw,$norujukan){
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()
|| !\App\KomuditiTransaksi::on('mysql7')->where('norujukan', $norujukan)->exists()) {
app(\App\Services\ShorakaGadaiService::class)->assertCompleted($kodcaw, $norujukan);
}
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
$gadai = Gadai::on($cawangan['mysql'])
@@ -418,6 +428,10 @@ class GadaiController extends Controller
}
public function cetakSAG($kodcaw,$norujukan,Request $request){
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()) {
app(\App\Services\ShorakaGadaiService::class)->assertCompleted($kodcaw, $norujukan);
}
$harini = Carbon::now();
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
@@ -442,6 +456,10 @@ class GadaiController extends Controller
}
public function serahMarhun($kodcaw,$norujukan){
if (\App\ShorakaTransaction::where('norujukan', $norujukan)->exists()) {
app(\App\Services\ShorakaGadaiService::class)->assertCompleted($kodcaw, $norujukan);
}
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
$gadai = Gadai::on($cawangan['mysql'])
->where('norujukan','=',$norujukan)
+208 -28
View File
@@ -3,15 +3,18 @@
namespace App\Http\Controllers;
use App\Audit;
use App\BsasOrder;
use App\Komuditi;
use App\KomuditiPurchase;
use App\KomuditiTransaksi;
use App\KomuditiProduk;
use App\Cawangan;
use App\Services\Bsas\BsasOrderService;
use DB;
use Illuminate\Http\Request;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
class KomuditiController extends Controller
{
@@ -117,6 +120,9 @@ class KomuditiController extends Controller
}
public function updateKomuditi(Request $request){
if (\App\ShorakaTransaction::where('norujukan', $request->norujukan)->exists()) {
abort(409, 'Transaksi Shoraka memerlukan semakan operasi; stok lama tidak boleh diubah.');
}
$current = Carbon::now();
$current = new Carbon();
@@ -138,37 +144,20 @@ class KomuditiController extends Controller
return response()->json($komuditi_transaksi);
}
public function transaksiKomuditi(Request $request){
$current = Carbon::now();
$current = new Carbon();
$komuditi_current = KomuditiPurchase::on('mysql7')->where('date_purchase','=',$current->toDateString())->orderBy('created_at','desc')->first();
$unit_current = $komuditi_current['unit_komuditi'];
$update_unit = $unit_current - $request->unit_komuditi;
$unit_current = round((float) $komuditi_current['unit_komuditi'], 2);
$unit_komuditi = round((float) $request->unit_komuditi, 2);
$update_unit = round($unit_current - $unit_komuditi, 2);
$update_komuditi = KomuditiPurchase::on('mysql7')->where('id','=',$komuditi_current['id'])->update([
'unit_komuditi' => $update_unit
]);
$komuditi_transaksi = KomuditiTransaksi::on('mysql7')->create([
'unit_komuditi' => $unit_komuditi,
'nosijil'=>$komuditi_current['no_sijil'],
'norujukan' => $request->norujukan,
'kodcaw' => $request->kodcaw ,
'teller' => $request->teller ,
'masa' => $current->toTimeString(),
'tarikh' => $current->toDateString()
]);
return response()->json($komuditi_transaksi);
public function transaksiKomuditi(Request $request)
{
$this->validate($request, ['kodcaw' => 'required|string', 'norujukan' => 'required|string']);
return app(ShorakaGadaiController::class)->submitGadai(
$request->kodcaw, $request->norujukan,
app(\App\Services\ShorakaGadaiService::class),
app(\App\Services\ShorakaService::class)
);
}
public function batalKomuditi(Request $request){
if (\App\ShorakaTransaction::where('norujukan', $request->norujukan)->exists()) {
abort(409, 'Transaksi Shoraka memerlukan semakan operasi; stok lama tidak boleh diubah.');
}
$komuditi_current = KomuditiPurchase::on('mysql7')->orderBy('created_at','desc')->first();
@@ -338,4 +327,195 @@ class KomuditiController extends Controller
return response()->json($rekodkomoditi);
}
/**
* List BSAS commodity orders for operasi rekod view.
*/
public function listBsasOrders(Request $request)
{
$query = BsasOrder::on('mysql7')
->select([
'id',
'uuid',
'norujukan',
'kodcaw',
'serial_number',
'product_code',
'bid_value',
'otc_murabaha_value',
'otc_counter_party',
'status',
'status_code',
'status_message',
'e_cert_no',
'bid_ecert_response',
'otc_ecert_response',
'stb_ecert_response',
'created_by',
'created_at',
'updated_at',
])
->orderBy('created_at', 'desc')
->orderBy('id', 'desc');
if ($request->filled('status')) {
$query->where('status', $request->input('status'));
}
if ($request->filled('kodcaw')) {
$query->where('kodcaw', $request->input('kodcaw'));
}
if ($request->filled('limit_view')) {
$query->limit((int) $request->input('limit_view'));
}
$rows = $query->get()->map(function (BsasOrder $order) {
$payload = $order->toArray();
$payload['has_bid_ecert'] = !empty($order->bid_ecert_response);
$payload['has_otc_ecert'] = !empty($order->otc_ecert_response);
$payload['has_stb_ecert'] = !empty($order->stb_ecert_response);
unset($payload['bid_ecert_response'], $payload['otc_ecert_response'], $payload['stb_ecert_response']);
return $payload;
});
return response()->json($rows);
}
/**
* SAG-ready komoditi/product payload from confirmed BSAS order for a norujukan.
* Replaces daily KomuditiPurchase lookup for per-Terima BSAS purchases.
*/
public function getBsasOrderByNorujukan($norujukan)
{
$order = BsasOrder::on('mysql7')
->where('norujukan', $norujukan)
->where('status', 'confirmed')
->orderBy('id', 'desc')
->first();
if (!$order) {
return response()->json(['message' => 'BSAS order tidak dijumpai untuk norujukan ini.'], 404);
}
$otc = is_array($order->otc_ecert_response) ? $order->otc_ecert_response : [];
$productCode = (string) ($order->product_code ?: config('bsas.product_code'));
$description = trim((string) ($otc['PNAME'] ?? ''));
if ($description === '') {
$produk = KomuditiProduk::on('mysql7')->where('kodproduk', $productCode)->first();
$description = $produk ? (string) $produk->description : $productCode;
}
$price = (float) ($otc['PRICE_MYR_EQUIVALENT'] ?? $otc['PRICE'] ?? 0);
$volume = (float) ($otc['PVOLUME'] ?? 0);
$pinjaman = (float) $order->bid_value;
if ($volume <= 0 && $price > 0 && $pinjaman > 0) {
$volume = round($pinjaman / $price, 4);
}
return response()->json([
'source' => 'bsas',
'uuid' => $order->uuid,
'komoditi' => [
'no_sijil' => $order->e_cert_no ?: $order->uuid,
'kodproduct' => $productCode,
'nilai' => $price > 0 ? $price : null,
],
'product' => [
'product_code' => $productCode,
'kodproduk' => $productCode,
'description' => $description,
'unit' => 'TAN',
],
'kuantiti' => $volume,
]);
}
/**
* Return stored BSAS eCert payload only (no live BSAS refresh).
*/
public function getBsasOrderEcert($uuid)
{
$order = BsasOrder::on('mysql7')->where('uuid', $uuid)->first();
if (!$order) {
return response()->json(['message' => 'BSAS order tidak dijumpai.'], 404);
}
if (empty($order->bid_ecert_response) && empty($order->otc_ecert_response) && empty($order->stb_ecert_response)) {
return response()->json(['message' => 'eCert belum tersedia untuk order ini.'], 404);
}
return response()->json([
'uuid' => $order->uuid,
'norujukan' => $order->norujukan,
'e_cert_no' => $order->e_cert_no,
'serial_number' => $order->serial_number,
'product_code' => $order->product_code,
'bid_value' => $order->bid_value,
'otc_murabaha_value' => $order->otc_murabaha_value,
'otc_counter_party' => $order->otc_counter_party,
'bid_ecert' => $order->bid_ecert_response,
'otc_ecert' => $order->otc_ecert_response,
'stb_ecert' => $order->stb_ecert_response,
]);
}
/**
* Place BSAS commodity order for a gadai Terima, long-poll result, fetch eCert.
*/
public function placeBsasOrder(Request $request)
{
try {
$service = new BsasOrderService();
$order = $service->placeAndConfirm([
'norujukan' => $request->input('norujukan'),
'kodcaw' => $request->input('kodcaw'),
'pinjaman' => $request->input('pinjaman'),
'hargajualan' => $request->input('hargajualan'),
'nama_pelanggan' => $request->input('nama_pelanggan'),
'teller' => $request->input('teller'),
]);
return response()->json([
'message' => 'BSAS order confirmed',
'order' => $order,
], 200);
} catch (\Throwable $e) {
Log::error('BSAS place order failed', [
'norujukan' => $request->input('norujukan'),
'error' => $e->getMessage(),
]);
return response()->json([
'message' => $e->getMessage() ?: 'Gagal pembelian komoditi BSAS.',
], 422);
}
}
/**
* Re-query BSAS orderResult / retry eCert by stored uuid.
*/
public function getBsasOrder($uuid)
{
try {
$service = new BsasOrderService();
$order = $service->refreshByUuid($uuid);
return response()->json([
'message' => 'OK',
'order' => $order,
], 200);
} catch (\Throwable $e) {
Log::error('BSAS refresh order failed', [
'uuid' => $uuid,
'error' => $e->getMessage(),
]);
return response()->json([
'message' => $e->getMessage() ?: 'Gagal semak status BSAS.',
], 422);
}
}
}
+57 -28
View File
@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Marhun;
use App\Gadai;
use App\Jemas;
use App\Cawangan;
use Illuminate\Http\Request;
@@ -58,6 +59,11 @@ class MarhunController extends Controller
public function create($kodcaw,Request $request)
{
$order = \App\ShorakaTransaction::where('norujukan', $request->norujukan)->first();
if ($order) {
abort(409, 'Kontrak Shoraka telah dihantar dan tidak boleh diubah.');
}
$current = Carbon::now();
$current = new Carbon();
@@ -126,6 +132,10 @@ class MarhunController extends Controller
public function deletemarhun($kodcaw,$norujukan,Request $request)
{
$order = \App\ShorakaTransaction::where('norujukan', $norujukan)->first();
if ($order) {
abort(409, 'Kontrak Shoraka telah dihantar dan tidak boleh diubah.');
}
$current = Carbon::now();
$current = new Carbon();
@@ -151,6 +161,11 @@ class MarhunController extends Controller
public function editmarhun($kodcaw,$norujukan,Request $request)
{
$order = \App\ShorakaTransaction::where('norujukan', $norujukan)->first();
if ($order) {
abort(409, 'Kontrak Shoraka telah dihantar dan tidak boleh diubah.');
}
$current = Carbon::now();
$current = new Carbon();
@@ -160,39 +175,53 @@ class MarhunController extends Controller
$cawangan = Cawangan::on('mysql7')->where('kodcaw','=',$kodcaw)->first();
$old_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->first();
// Lock the parent first so concurrent edits to this SAG are serialized.
(new Marhun)->setConnection($cawangan['mysql'])->getConnection()->transaction(function () use ($cawangan, $norujukan, $request, $harga, $nilai_marhun, $kodcaw, $current) {
Gadai::on($cawangan['mysql'])->where('norujukan', $norujukan)->lockForUpdate()->firstOrFail();
$old_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->firstOrFail();
$marhunToUpdate = [
'karat' => $request->karat,
'marhun' => $request->marhun,
'nota' => $request->nota,
'tag_permata' => $request->tag_permata,
'berat_batu_permata' => $request->berat_batu_permata,
'berat' => $request->berat,
'harga' => $harga['harga'],
'n_marhun' => $nilai_marhun,
'bil' => $request->kuantiti,
];
$marhunToUpdate = [
'karat' => $request->karat,
'marhun' => $request->marhun,
'nota' => $request->nota,
'tag_permata' => $request->tag_permata,
'berat_batu_permata' => $request->berat_batu_permata,
'berat' => $request->berat,
'harga' => $harga['harga'],
'n_marhun' => $nilai_marhun,
'bil' => $request->kuantiti,
];
// Set value berat_batu_permata to null if value passed is null
if($marhunToUpdate['berat_batu_permata'] == '') {
$marhunToUpdate['berat_batu_permata'] = null;
};
// Set value berat_batu_permata to null if value passed is null
if($marhunToUpdate['berat_batu_permata'] == '') {
$marhunToUpdate['berat_batu_permata'] = null;
};
$jemas = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->update($marhunToUpdate);
$jemas = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->update($marhunToUpdate);
$new_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->first();
// Recalculate from every item belonging to this SAG, after the edit.
$totals = Marhun::on($cawangan['mysql'])->where('norujukan', $norujukan)
->selectRaw('COALESCE(SUM(berat), 0) AS total_berat, COALESCE(SUM(n_marhun), 0) AS total_nilai, COALESCE(SUM(bil), 0) AS total_kuantiti')
->first();
Gadai::on($cawangan['mysql'])->where('norujukan', $norujukan)->update([
'berat' => $totals->total_berat,
'nilaimarhun' => $totals->total_nilai,
'kuantiti' => $totals->total_kuantiti,
]);
$audit = new Audit();
$audit->users = $request->teller;
$audit->actions = 'Ubah Marhun';
$audit->norujukan = $norujukan;
$audit->old_data = $old_data;
$audit->new_data = $new_data;
$audit->kodcaw = $kodcaw;
$audit->created_at = $current;
$audit->updated_at = $current;
$audit->save();
$new_data = Marhun::on($cawangan['mysql'])->where([['recno','=',$request->recno],['norujukan','=',$norujukan]])->first();
$audit = new Audit();
$audit->users = $request->teller;
$audit->actions = 'Ubah Marhun';
$audit->norujukan = $norujukan;
$audit->old_data = $old_data;
$audit->new_data = $new_data;
$audit->kodcaw = $kodcaw;
$audit->created_at = $current;
$audit->updated_at = $current;
$audit->save();
});
return response('Edit Successfully', 200);
}
@@ -62,6 +62,7 @@ class PembiayaanOnlineController extends Controller
'kodbank', 'noakaun', 'nama_bank', 'nama_akaun', 'nota',
'bukti_akaun_file_id', 'borang_file_id', 'update_customer_bank',
'bukti_akaun_data', 'bukti_akaun_filename', 'bukti_akaun_type',
'borang_data', 'borang_filename', 'borang_type',
] as $key) {
if ($request->has($key)) {
$input[$key] = $request->input($key);
@@ -214,6 +215,14 @@ class PembiayaanOnlineController extends Controller
return $this->respond($this->service->getBuktiAkaun($kodcaw, $id));
}
/**
* GET /api/pembiayaan-online/{kodcaw}/lines/{id}/borang
*/
public function getBorang($kodcaw, $id)
{
return $this->respond($this->service->getBorang($kodcaw, $id));
}
/**
* GET /api/pembiayaan-online/{kodcaw}/paid?blast_sent=0
*/
+291
View File
@@ -0,0 +1,291 @@
<?php
namespace App\Http\Controllers;
use App\ShorakaTransaction;
use App\Services\ShorakaService;
use Carbon\Carbon;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Throwable;
class ShorakaController extends Controller
{
public function index(Request $request)
{
$this->validate($request, [
'kodcaw' => 'nullable|string|max:30',
'norujukan' => 'nullable|string|max:100',
'status' => 'nullable|string|max:30',
'date_from' => 'nullable|date_format:Y-m-d',
'date_to' => 'nullable|date_format:Y-m-d',
'per_page' => 'nullable|integer|min:1|max:100',
'page' => 'nullable|integer|min:1',
'branch_scope' => 'nullable|string|max:30',
]);
$query = ShorakaTransaction::query();
foreach (['kodcaw', 'norujukan', 'status'] as $field) {
if ($request->filled($field)) {
$query->where($field, $request->input($field));
}
}
if ($request->filled('date_from')) {
$query->where('created_at', '>=', $request->input('date_from') . ' 00:00:00');
}
if ($request->filled('date_to')) {
$query->where('created_at', '<', Carbon::parse($request->input('date_to'))->addDay()->format('Y-m-d') . ' 00:00:00');
}
$records = $query->orderByDesc('created_at')->orderByDesc('id')
->paginate(min(100, max(1, (int) $request->input('per_page', 25))));
$payload = [
'data' => $records->getCollection()->map(function (ShorakaTransaction $record) {
return [
'id' => $record->id,
'kodcaw' => $record->kodcaw,
'norujukan' => $record->norujukan,
'teller' => $record->teller,
'status' => $record->status,
'order_id' => $record->order_id,
'created_at' => optional($record->created_at)->toDateTimeString(),
'updated_at' => optional($record->updated_at)->toDateTimeString(),
];
})->values(),
'total' => $records->total(),
'current_page' => $records->currentPage(),
'per_page' => $records->perPage(),
'last_page' => $records->lastPage(),
];
if ($request->input('with_branches')) {
$branches = ShorakaTransaction::query()->whereNotNull('kodcaw');
if ($request->filled('branch_scope')) {
$branches->where('kodcaw', $request->input('branch_scope'));
}
$payload['branches'] = $branches->distinct()->orderBy('kodcaw')->pluck('kodcaw')->values();
}
return response()->json($payload);
}
public function submit(Request $request, ShorakaService $shoraka)
{
$validated = $this->validate($request, [
'norujukan' => 'required|string|max:255',
'ownership' => 'required|string|max:255',
'order_amount' => 'required|numeric|min:0.01|max:9999999999999.99',
'murabaha_amount' => 'required|numeric|min:0.01|max:9999999999999.99',
'tenor_other' => 'required|integer|min:1',
'teller' => 'nullable|string|max:255',
]);
if (!$shoraka->configured()) {
return $this->unconfigured();
}
$existing = ShorakaTransaction::where('norujukan', $validated['norujukan'])->first();
if ($existing) {
return $this->duplicate($existing);
}
$payload = [
'product_type' => 'FINANCING',
'commodity_type' => '000-COPPER',
'ownership' => $validated['ownership'],
'ownership_doc_no' => $validated['norujukan'],
'value_date' => Carbon::now()->format('d/m/Y'),
'order_currency' => 'MYR',
'order_amount' => number_format((float) $validated['order_amount'], 2, '.', ''),
'murabaha_amount' => number_format((float) $validated['murabaha_amount'], 2, '.', ''),
// Appendix codes in v1.5: OTHERS and MONTH.
'tenor' => 'OTHERS',
'tenor_other' => $validated['tenor_other'],
'tenor_other_unit' => 'MONTH',
'order_type' => 'Buy & Sell',
];
try {
// The unique norujukan index is the atomic claim for concurrent submissions.
$attributes = [
'norujukan' => $validated['norujukan'],
'kodcaw' => $request->attributes->get('shoraka_kodcaw'),
'teller' => $validated['teller'] ?? null,
'status' => 'PENDING',
'product_type' => $payload['product_type'],
'commodity_type' => $payload['commodity_type'],
'ownership_name' => $payload['ownership'],
'ownership_doc_no' => $payload['ownership_doc_no'],
'order_amount' => $payload['order_amount'],
'murabaha_amount' => $payload['murabaha_amount'],
'request_payload' => $payload,
'attempt_count' => 1,
];
$transaction = ShorakaTransaction::create($attributes);
} catch (QueryException $exception) {
$existing = ShorakaTransaction::where('norujukan', $validated['norujukan'])->first();
if ($existing) {
return $this->duplicate($existing);
}
throw $exception;
}
try {
$response = $shoraka->submitOrder($payload);
$this->saveOrder($transaction, $response);
return response()->json([
'success' => true,
'message' => 'Order berjaya dihantar ke Shoraka.',
'data' => $this->orderData($transaction),
]);
} catch (Throwable $exception) {
// A timeout or invalid response does not prove the remote trade failed.
// Block resubmission until this reference has been reconciled with Shoraka.
$transaction->update([
'status' => $transaction->order_id ? $transaction->status : 'UNKNOWN',
'error_message' => 'Submission outcome requires reconciliation with Shoraka.',
]);
return $this->upstreamError('submit', $transaction, $exception);
}
}
public function refresh(string $norujukan, ShorakaService $shoraka)
{
if (!$shoraka->configured()) {
return $this->unconfigured();
}
$transaction = ShorakaTransaction::where('norujukan', $norujukan)->firstOrFail();
if (!$transaction->order_id) {
return $this->missingOrderId();
}
try {
$response = $shoraka->orderStatus($transaction->order_id);
$this->saveOrder($transaction, $response);
return response()->json(['success' => true, 'data' => $this->orderData($transaction)]);
} catch (Throwable $exception) {
return $this->upstreamError('status', $transaction, $exception);
}
}
public function certificate(string $norujukan, ShorakaService $shoraka)
{
if (!$shoraka->configured()) {
return $this->unconfigured();
}
$transaction = ShorakaTransaction::where('norujukan', $norujukan)->firstOrFail();
if (!$transaction->order_id) {
return $this->missingOrderId();
}
try {
$pdf = $shoraka->certificate($transaction->order_id);
return response($pdf, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="shoraka-' . $transaction->id . '.pdf"',
'Cache-Control' => 'private, no-store',
]);
} catch (Throwable $exception) {
return $this->upstreamError('certificate', $transaction, $exception);
}
}
public function callback(Request $request, ShorakaService $shoraka)
{
if (!$shoraka->configured()) {
return $this->unconfigured();
}
$payload = $request->json()->all();
if (!$shoraka->validCallback($payload)) {
return response()->json(['success' => false, 'message' => 'Invalid callback signature.'], 401);
}
// ownershipDocNo and certificateUrl are NOT signed. Never use them to link
// a callback to a local record or download a file.
$transaction = ShorakaTransaction::where('order_id', $payload['orderId'])->first();
if (!$transaction) {
return response()->json(['success' => false, 'message' => 'Order not found.'], 404);
}
try {
// There is no signed callback timestamp. Query the current order so a
// delayed/replayed callback cannot directly restore an old status.
$response = $shoraka->orderStatus($transaction->order_id);
unset($payload['signature']);
$this->saveOrder($transaction, $response, ['callback_payload' => $payload]);
// Exact acknowledgement required by section 6.
return response('OK', 200, ['Content-Type' => 'text/plain']);
} catch (Throwable $exception) {
return $this->upstreamError('callback', $transaction, $exception);
}
}
protected function saveOrder(ShorakaTransaction $transaction, array $response, array $extra = []): void
{
$transaction->update(array_merge([
'order_id' => (string) $response['orderId'],
'status' => $response['status'],
'certificate_url' => $response['certificateUrl'] ?? null,
'response_payload' => $response,
'submitted_at' => $transaction->submitted_at ?: Carbon::now(),
'completed_at' => $response['status'] === 'Completed'
? ($transaction->completed_at ?: Carbon::now()) : $transaction->completed_at,
'error_message' => null,
], $extra));
app(\App\Services\ShorakaGadaiService::class)->sync($transaction);
}
protected function orderData(ShorakaTransaction $transaction): array
{
return [
'norujukan' => $transaction->norujukan,
'kodcaw' => $transaction->kodcaw,
'teller' => $transaction->teller,
'order_id' => $transaction->order_id,
'status' => $transaction->status,
'certificate_url' => $transaction->certificate_url,
];
}
protected function duplicate(ShorakaTransaction $transaction)
{
return response()->json([
'success' => false,
'message' => 'Transaksi telah direkodkan. Semak status dengan Shoraka sebelum penghantaran semula.',
'data' => $this->orderData($transaction),
], 409);
}
protected function missingOrderId()
{
return response()->json([
'success' => false,
'message' => 'Order ID belum tersedia. Semakan dengan Shoraka diperlukan.',
], 409);
}
protected function unconfigured()
{
return response()->json([
'success' => false,
'message' => 'API ID dan Secret Key Shoraka belum dikonfigurasi.',
], 503);
}
protected function upstreamError(string $operation, ShorakaTransaction $transaction, Throwable $exception)
{
// Connection exceptions may include request details; log only the class.
Log::error('Shoraka request failed', [
'operation' => $operation,
'transaction_id' => $transaction->id,
'exception_type' => get_class($exception),
]);
return response()->json([
'success' => false,
'message' => 'Permintaan Shoraka gagal. Semak status transaksi sebelum mencuba semula.',
], 502);
}
}
@@ -0,0 +1,76 @@
<?php
namespace App\Http\Controllers;
use App\KomuditiTransaksi;
use App\Services\ShorakaGadaiService;
use App\Services\ShorakaService;
use Illuminate\Http\Request;
class ShorakaGadaiController extends ShorakaController
{
public function readiness(ShorakaService $shoraka)
{
try {
\App\ShorakaTransaction::query()->limit(1)->exists();
$storeReady = true;
} catch (\Throwable $exception) {
$storeReady = false;
}
return response()->json(['provider' => 'shoraka', 'ready' => $storeReady && $shoraka->configured()]);
}
public function showGadai(string $kodcaw, string $norujukan, ShorakaGadaiService $gadaiService)
{
$gadai = $gadaiService->gadai($kodcaw, $norujukan);
$order = $gadaiService->transaction($kodcaw, $norujukan);
return response()->json([
'success' => true,
'data' => [
'norujukan' => $norujukan, 'kodcaw' => $kodcaw,
'order_amount' => $gadai->pinjaman, 'murabaha_amount' => $gadai->hargajualan,
'order' => $order ? $this->orderData($order) : null,
'details' => $order ? $order->response_payload : null,
'simulation' => $order && strpos((string) $order->order_id, 'SIM-') === 0,
'can_complete' => $gadai->exists && $order && $order->status === 'Completed'
&& number_format((float) $gadai->pinjaman, 2, '.', '') === $order->order_amount
&& number_format((float) $gadai->hargajualan, 2, '.', '') === $order->murabaha_amount,
],
]);
}
public function submitGadai(string $kodcaw, string $norujukan, Request $request, ShorakaGadaiService $gadaiService, ShorakaService $shoraka)
{
$gadai = $gadaiService->gadai($kodcaw, $norujukan);
$existing = $gadaiService->transaction($kodcaw, $norujukan);
if ($existing) {
return $this->duplicate($existing);
}
// Historical commodity purchases must never be traded again.
if (KomuditiTransaksi::on('mysql7')->where('norujukan', $norujukan)->exists()
|| $gadai->cetak || $gadai->sttebus) {
abort(409, 'Gadaian lama atau telah selesai tidak boleh dihantar sebagai order baharu.');
}
$payload = $gadaiService->payload($gadai);
$teller = $request->input('teller');
if (is_string($teller) && $teller !== '') {
$payload['teller'] = $teller;
}
$submission = new Request($payload);
$submission->attributes->set('shoraka_kodcaw', $kodcaw);
return $this->submit($submission, $shoraka);
}
public function refreshGadai(string $kodcaw, string $norujukan, ShorakaGadaiService $gadaiService, ShorakaService $shoraka)
{
$gadaiService->gadai($kodcaw, $norujukan);
$gadaiService->transaction($kodcaw, $norujukan);
return $this->refresh($norujukan, $shoraka);
}
public function certificateGadai(string $kodcaw, string $norujukan, ShorakaGadaiService $gadaiService, ShorakaService $shoraka)
{
$gadaiService->assertCompleted($kodcaw, $norujukan);
return $this->certificate($norujukan, $shoraka);
}
}
+32
View File
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Middleware;
use Closure;
class LogViewerPassword
{
public function handle($request, Closure $next)
{
$passwordHash = config('logviewer.password');
if (!is_string($passwordHash) || $passwordHash === '') {
return response('Akses log belum dikonfigurasi.', 503)
->header('Cache-Control', 'no-store');
}
$provided = $request->getPassword();
if ($request->getUser() !== 'logviewer' || !is_string($provided) ||
!password_verify($provided, $passwordHash)) {
return response('Kata laluan diperlukan untuk mengakses log.', 401, [
'WWW-Authenticate' => 'Basic realm="Log Viewer", charset="UTF-8"',
'Cache-Control' => 'no-store',
]);
}
$response = $next($request);
$response->headers->set('Cache-Control', 'no-store');
return $response;
}
}
+12 -10
View File
@@ -54,10 +54,10 @@ class WhatsappPembiayaanOnlinePaid extends Job
$storedPhone = $customer ? ($customer->telefon ?: $customer->telefon2) : null;
$to = $client->normalizeMsisdn($storedPhone);
if (env('APP_ENV') !== 'production') {
if (!config('whatsapp.whatsapp_cloud_enabled')) {
$admin = $client->normalizeMsisdn(env('ADMIN_PHONE_NUMBER'));
if (!$admin) {
Log::warning('WhatsApp Cloud skipped: ADMIN_PHONE_NUMBER required when not production', [
Log::warning('WhatsApp Cloud skipped: ADMIN_PHONE_NUMBER required when WHATSAPP_ENABLED is false', [
'norujukan' => $this->norujukan,
]);
$this->logBlast($now, $storedPhone, 'skipped: ADMIN_PHONE_NUMBER empty');
@@ -96,27 +96,29 @@ class WhatsappPembiayaanOnlinePaid extends Job
}
/**
* Matches pembiayaan_online_paid body: cawangan, SAG, amaun, akaun, tarikh, rujukan.
* Matches Meta template pembiayaan_online_paid (ms):
* AR-RAHN KoPKB: Pembiayaan bagi No. SAG *{{1}}* sebanyak *RM{{2}}*
* telah berjaya dikreditkan ke akaun *{{3}}* berakhir *{{4}}* pada *{{5}}*.
* Rujukan: *{{6}}*
*
* {{1}} SAG, {{2}} amaun, {{3}} nama bank/akaun, {{4}} 4 digit akhir, {{5}} tarikh, {{6}} rujukan bayaran
*
* @return array<int,string>
*/
protected function bodyParams()
{
$akaun = trim((string) $this->namaBank);
$bank = trim((string) $this->namaBank);
$tail = $this->accountTail($this->noakaun);
if ($tail !== '') {
$akaun = trim($akaun . ' ' . $tail);
}
$tarikh = $this->tarikhBayaran
? Carbon::parse($this->tarikhBayaran)->format('d/m/Y')
: Carbon::now()->format('d/m/Y');
return [
$this->cawName ?: $this->kodcaw,
$this->norujukan ?: '-',
number_format((float) $this->pinjaman, 2, '.', ''),
$akaun !== '' ? $akaun : '-',
$bank !== '' ? $bank : '-',
$tail !== '' ? $tail : '-',
$tarikh,
$this->noRujukanBayaran ?: '-',
];
@@ -129,7 +131,7 @@ class WhatsappPembiayaanOnlinePaid extends Job
return '';
}
return '****' . substr($digits, -4);
return substr($digits, -4);
}
protected function logBlast($now, $telefon, $status)
+193
View File
@@ -0,0 +1,193 @@
<?php
namespace App\Services\Bsas;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use RuntimeException;
class BsasClient
{
const TOKEN_CACHE_KEY = 'bsas.oauth.token';
const TOKEN_CACHE_SECONDS = 82800; // 23 hours
public function getAccessToken(): string
{
$cached = Cache::get(self::TOKEN_CACHE_KEY);
if (is_string($cached) && $cached !== '') {
return $cached;
}
// Drop bad cache entries (e.g. whole JSON array accidentally stored).
if ($cached !== null) {
Cache::forget(self::TOKEN_CACHE_KEY);
}
$tokenUrl = config('bsas.token_url');
$clientId = config('bsas.client_id');
$clientSecret = config('bsas.client_secret');
if (!$tokenUrl || !$clientId || !$clientSecret) {
throw new RuntimeException('BSAS OAuth is not configured (token_url / client_id / client_secret).');
}
$response = $this->http()
->asForm()
->post($tokenUrl, [
'grant_type' => 'client_credentials',
'client_id' => $clientId,
'client_secret' => $clientSecret,
]);
$payload = $response->json();
if (!is_array($payload)) {
$payload = [];
}
if (!$response->successful()) {
Log::error('BSAS OAuth token request failed', [
'status' => $response->status(),
'body' => $payload ?: $response->body(),
]);
throw new RuntimeException('Gagal mendapatkan BSAS access token.');
}
$token = $payload['access_token'] ?? null;
if (!is_string($token) || $token === '') {
Log::error('BSAS OAuth response missing string access_token', [
'body' => $payload,
]);
throw new RuntimeException('BSAS OAuth response missing access_token.');
}
$expiresIn = (int) ($payload['expires_in'] ?? self::TOKEN_CACHE_SECONDS);
$ttl = max(60, min(self::TOKEN_CACHE_SECONDS, $expiresIn - 300));
Cache::put(self::TOKEN_CACHE_KEY, $token, $ttl);
return $token;
}
public function placeOrder(array $payload): array
{
return $this->requestJson('post', '/process/svc/bsas/order', $payload);
}
public function orderResult(string $uuid, array $body = []): array
{
$maxWait = (string) ($body['maxWaitTime'] ?? config('bsas.max_wait_time', 10));
$payload = [
'header' => [
'memberShortName' => config('bsas.member_short_name'),
'uuid' => $uuid,
],
'body' => [
'serialNumbers' => (string) ($body['serialNumbers'] ?? '1'),
'forceYN' => (string) ($body['forceYN'] ?? 'Y'),
'maxWaitTime' => $maxWait,
'waitAllDoneYN' => (string) ($body['waitAllDoneYN'] ?? 'Y'),
],
];
// Long poll: client timeout must exceed BSAS maxWaitTime.
$timeout = max(
(int) config('bsas.http_timeout', 30),
(int) $maxWait + 20
);
return $this->requestJson('get', '/process/svc/bsas/orderResult', $payload, $timeout);
}
public function getBidEcert(string $ecertNo): array
{
return $this->requestEcert('/process/svc/bsas/bidXML', $ecertNo);
}
public function getOtcEcert(string $ecertNo): array
{
return $this->requestEcert('/process/svc/bsas/otcXML', $ecertNo);
}
public function getStbEcert(string $ecertNo): array
{
return $this->requestEcert('/process/svc/bsas/stbXML', $ecertNo);
}
protected function requestEcert(string $path, string $ecertNo): array
{
$payload = [
'input' => [
'ecertno' => $ecertNo,
'membershortname' => config('bsas.member_short_name'),
],
];
return $this->requestJson('get', $path, $payload);
}
protected function requestJson(string $method, string $path, array $payload, ?int $timeout = null): array
{
$url = rtrim(config('bsas.base_url'), '/') . '/' . ltrim($path, '/');
$timeout = $timeout ?? (int) config('bsas.http_timeout', 30);
$token = $this->getAccessToken();
$pending = $this->http($timeout)
->withToken($token)
->acceptJson();
if (strtolower($method) === 'get') {
$response = $pending
->withHeaders(['Content-Type' => 'application/json'])
->send('GET', $url, [
'body' => json_encode($payload),
]);
} else {
$response = $pending->asJson()->post($url, $payload);
}
$json = $response->json();
if (!is_array($json)) {
$body = $response->body();
$cloudflare = stripos($body, 'cloudflare') !== false || stripos($body, 'Attention Required') !== false;
if ($cloudflare) {
throw new RuntimeException(
'BSAS blocked by Cloudflare (check IP whitelist). HTTP ' . $response->status()
);
}
throw new RuntimeException('BSAS returned invalid JSON response.');
}
if (!$response->successful()) {
Log::error('BSAS HTTP error', [
'method' => $method,
'url' => $url,
'status' => $response->status(),
'body' => $json,
]);
throw new RuntimeException('BSAS request failed (HTTP ' . $response->status() . ').');
}
Log::info('BSAS API call', [
'method' => $method,
'path' => $path,
'status' => $response->status(),
'header' => $json['header'] ?? null,
]);
return $json;
}
protected function http(?int $timeout = null): PendingRequest
{
$timeout = $timeout ?? (int) config('bsas.http_timeout', 30);
return Http::withOptions([
'timeout' => $timeout,
'connect_timeout' => min(15, $timeout),
]);
}
}
+374
View File
@@ -0,0 +1,374 @@
<?php
namespace App\Services\Bsas;
use App\BsasOrder;
use App\KomuditiTransaksi;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
use RuntimeException;
class BsasOrderService
{
/** @var BsasClient */
protected $client;
public function __construct(BsasClient $client = null)
{
$this->client = $client ?: new BsasClient();
}
/**
* Place BSAS order for a gadai Terima, long-poll result, fetch eCert.
*
* @param array $input norujukan, kodcaw, pinjaman, hargajualan, nama_pelanggan, teller
* @return BsasOrder
*/
public function placeAndConfirm(array $input): BsasOrder
{
$norujukan = (string) ($input['norujukan'] ?? '');
$kodcaw = (string) ($input['kodcaw'] ?? '');
$pinjaman = round((float) ($input['pinjaman'] ?? 0), 2);
$hargajualan = round((float) ($input['hargajualan'] ?? 0), 2);
$counterParty = trim((string) ($input['nama_pelanggan'] ?? ''));
$createdBy = (string) ($input['teller'] ?? '');
if ($norujukan === '' || $kodcaw === '' || $pinjaman <= 0) {
throw new RuntimeException('BSAS order requires norujukan, kodcaw and pinjaman.');
}
$existing = BsasOrder::on('mysql7')
->where('norujukan', $norujukan)
->orderBy('id', 'desc')
->first();
if ($existing && $existing->status === 'confirmed') {
if ($this->needsEcertFetch($existing)) {
$this->fetchAndStoreEcert($existing);
}
$this->ensureKomuditiTransaksi($existing, $createdBy);
return $existing->fresh();
}
if ($existing && in_array($existing->status, ['pending', 'submitted'], true) && !empty($existing->uuid)) {
return $this->completeSubmittedOrder($existing, $createdBy);
}
$serial = '1';
$payload = $this->buildOrderPayload($pinjaman, $hargajualan, $counterParty, $serial);
$order = BsasOrder::on('mysql7')->create([
'uuid' => null,
'norujukan' => $norujukan,
'kodcaw' => $kodcaw,
'serial_number' => $serial,
'product_code' => config('bsas.product_code'),
'bid_value' => $pinjaman,
'otc_murabaha_value' => $hargajualan,
'otc_counter_party' => $counterParty,
'status' => 'pending',
'request_payload' => $payload,
'created_by' => $createdBy,
]);
try {
$orderResponse = $this->client->placeOrder($payload);
} catch (\Throwable $e) {
$order->status = 'failed';
$order->status_message = $e->getMessage();
$order->save();
throw $e;
}
$order->order_response = $orderResponse;
$uuid = data_get($orderResponse, 'header.uuid');
$errorCode = trim((string) data_get($orderResponse, 'header.errorCode', ''));
$errorMsg = trim((string) data_get($orderResponse, 'header.errorMsg', ''));
if ($errorCode !== '' || !$uuid) {
$order->status = 'failed';
$order->status_message = $errorMsg !== '' ? $errorMsg : 'BSAS order rejected (missing uuid or errorCode set).';
$order->save();
throw new RuntimeException($order->status_message);
}
$bodyStatus = data_get($orderResponse, 'body.0.statusCode');
if ($bodyStatus !== null && (int) $bodyStatus !== 0) {
$order->uuid = $uuid;
$order->status = 'failed';
$order->status_code = (int) $bodyStatus;
$order->status_message = (string) data_get($orderResponse, 'body.0.statusMessage', 'BSAS order body statusCode != 0');
$order->save();
throw new RuntimeException($order->status_message);
}
$order->uuid = $uuid;
$order->status = 'submitted';
$order->save();
return $this->completeSubmittedOrder($order, $createdBy);
}
/**
* Re-query orderResult / eCert for an existing uuid.
*/
public function refreshByUuid(string $uuid): BsasOrder
{
$order = BsasOrder::on('mysql7')->where('uuid', $uuid)->first();
if (!$order) {
throw new RuntimeException('BSAS order not found for uuid.');
}
if ($order->status === 'confirmed') {
if ($this->needsEcertFetch($order)) {
$this->fetchAndStoreEcert($order);
}
return $order->fresh();
}
return $this->completeSubmittedOrder($order, (string) $order->created_by);
}
protected function completeSubmittedOrder(BsasOrder $order, string $createdBy): BsasOrder
{
if (empty($order->uuid)) {
throw new RuntimeException('BSAS order has no uuid to poll.');
}
$result = $this->longPollOrderResult($order->uuid, (string) $order->serial_number);
$order->result_response = $result;
$headerError = trim((string) data_get($result, 'header.errorCode', ''));
$headerMsg = trim((string) data_get($result, 'header.errorMsg', ''));
$statusCode = data_get($result, 'body.0.statusCode');
$statusMessage = (string) data_get($result, 'body.0.statusMessage', '');
$bidErrNo = trim((string) data_get($result, 'body.0.bidErrNo', ''));
$otcErrNo = trim((string) data_get($result, 'body.0.otcErrNo', ''));
$stbErrNo = trim((string) data_get($result, 'body.0.stbErrNo', ''));
$bidMsg = trim((string) data_get($result, 'body.0.bidMsg', ''));
$otcMsg = trim((string) data_get($result, 'body.0.otcMsg', ''));
$stbMsg = trim((string) data_get($result, 'body.0.stbMsg', ''));
$ecertNo = $this->extractEcertNo($result, $order->order_response);
if ($headerError !== '') {
$order->status = 'failed';
$order->status_code = is_numeric($statusCode) ? (int) $statusCode : null;
$order->status_message = $headerMsg !== '' ? $headerMsg : 'BSAS orderResult header errorCode set.';
$order->save();
throw new RuntimeException($order->status_message);
}
// Live BSAS result often has no statusCode; success is ecertNo and/or bid/otc/stb ErrNo=999 (OK).
$successByStatusCode = $statusCode !== null && (int) $statusCode === 0;
$successByErrNo = ($bidErrNo === '999' || strtoupper($bidMsg) === 'OK')
&& ($otcErrNo === '999' || strtoupper($otcMsg) === 'OK')
&& ($stbErrNo === '999' || strtoupper($stbMsg) === 'OK');
$successByEcert = $ecertNo !== null && $ecertNo !== '';
if (!$successByStatusCode && !$successByErrNo && !$successByEcert) {
if ($statusCode !== null && (int) $statusCode !== 0) {
$order->status = 'failed';
$order->status_code = (int) $statusCode;
$order->status_message = $statusMessage !== '' ? $statusMessage : 'BSAS orderResult statusCode != 0';
$order->save();
throw new RuntimeException($order->status_message);
}
$order->status = 'submitted';
$order->status_message = 'BSAS orderResult belum selesai / tiada ecert.';
$order->save();
throw new RuntimeException('BSAS orderResult belum selesai. Sila cuba semula.');
}
$order->status_code = $statusCode !== null ? (int) $statusCode : 0;
$order->status_message = $statusMessage !== '' ? $statusMessage : ($bidMsg ?: 'OK');
$order->status = 'confirmed';
if ($ecertNo) {
$order->e_cert_no = $ecertNo;
}
$order->save();
if ($this->needsEcertFetch($order)) {
$this->fetchAndStoreEcert($order);
}
if (empty($order->e_cert_no)) {
Log::warning('BSAS order confirmed but ecertno missing', [
'norujukan' => $order->norujukan,
'uuid' => $order->uuid,
]);
}
$this->ensureKomuditiTransaksi($order, $createdBy);
return $order->fresh();
}
protected function longPollOrderResult(string $uuid, string $serial): array
{
$retries = max(1, (int) config('bsas.order_result_retries', 2));
$last = [];
for ($i = 0; $i < $retries; $i++) {
$last = $this->client->orderResult($uuid, [
'serialNumbers' => $serial,
'forceYN' => 'Y',
'maxWaitTime' => (string) config('bsas.max_wait_time', 10),
'waitAllDoneYN' => 'Y',
]);
// Done when statusCode is set, or bid, OTC and STB have all reported.
$bidDone = trim((string) data_get($last, 'body.0.bidErrNo', '')) !== '';
$otcDone = trim((string) data_get($last, 'body.0.otcErrNo', '')) !== '';
$stbDone = trim((string) data_get($last, 'body.0.stbErrNo', '')) !== '';
$hasEcert = trim((string) data_get($last, 'body.0.ecertNo', '')) !== ''
|| trim((string) data_get($last, 'body.0.eCertNo', '')) !== '';
if (
data_get($last, 'body.0.statusCode') !== null
|| ($bidDone && $otcDone && $stbDone)
|| ($hasEcert && $stbDone)
) {
return $last;
}
}
return $last;
}
protected function needsEcertFetch(BsasOrder $order): bool
{
return empty($order->bid_ecert_response)
|| empty($order->otc_ecert_response)
|| empty($order->stb_ecert_response);
}
protected function fetchAndStoreEcert(BsasOrder $order): void
{
$ecertNo = $order->e_cert_no;
if (!$ecertNo) {
$ecertNo = $this->extractEcertNo($order->result_response, $order->order_response);
if ($ecertNo) {
$order->e_cert_no = $ecertNo;
$order->save();
}
}
if (!$ecertNo) {
return;
}
$calls = [
'bid_ecert_response' => 'getBidEcert',
'otc_ecert_response' => 'getOtcEcert',
'stb_ecert_response' => 'getStbEcert',
];
foreach ($calls as $column => $method) {
if (!empty($order->{$column})) {
continue;
}
try {
$ecert = $this->client->{$method}($ecertNo);
$order->{$column} = $ecert;
if ($column === 'otc_ecert_response' && empty($order->e_cert_no) && !empty($ecert['ECERTNO'])) {
$order->e_cert_no = $ecert['ECERTNO'];
}
$order->save();
} catch (\Throwable $e) {
Log::error('BSAS eCert fetch failed after confirmed order', [
'norujukan' => $order->norujukan,
'uuid' => $order->uuid,
'e_cert_no' => $ecertNo,
'certificate' => $column,
'error' => $e->getMessage(),
]);
}
}
}
protected function ensureKomuditiTransaksi(BsasOrder $order, string $teller): void
{
$exists = KomuditiTransaksi::on('mysql7')
->where('norujukan', $order->norujukan)
->first();
if ($exists) {
return;
}
$current = Carbon::now();
KomuditiTransaksi::on('mysql7')->create([
'unit_komuditi' => round((float) $order->bid_value, 2),
'nosijil' => $order->e_cert_no ?: $order->uuid,
'norujukan' => $order->norujukan,
'kodcaw' => $order->kodcaw,
'teller' => $teller !== '' ? $teller : $order->created_by,
'masa' => $current->toTimeString(),
'tarikh' => $current->toDateString(),
]);
}
protected function buildOrderPayload(float $pinjaman, float $hargajualan, string $counterParty, string $serial): array
{
return [
'header' => [
'memberShortName' => config('bsas.member_short_name'),
'uuid' => $this->uuidV4(),
],
'body' => [
'serialNumber' => $serial,
'bidOption' => 'Y',
'otcOption' => 'Y',
'stbOption' => 'Y',
'productCode' => config('bsas.product_code'),
'purchaseType' => 'P',
'clientName' => '',
'currency' => 'MYR',
'bidValue' => number_format($pinjaman, 2, '.', ''),
'valueDate' => Carbon::now()->format('Ymd'),
'tenor' => config('bsas.tenor'),
'otcCounterParty' => $counterParty,
'otcMurabaha' => '',
'otcMurabahaValue' => number_format($hargajualan, 2, '.', ''),
'eCertNo' => '',
],
];
}
/**
* Best-effort extract ecert number from result/order payloads.
*/
protected function extractEcertNo($result, $orderResponse): ?string
{
$candidates = [
data_get($result, 'body.0.eCertNo'),
data_get($result, 'body.0.ecertNo'),
data_get($result, 'body.0.ECERTNO'),
data_get($result, 'body.0.ecertno'),
data_get($result, 'body.0.certificateNo'),
data_get($orderResponse, 'body.0.eCertNo'),
data_get($orderResponse, 'body.0.ecertNo'),
data_get($orderResponse, 'body.0.ECERTNO'),
];
foreach ($candidates as $value) {
$value = trim((string) $value);
if ($value !== '') {
return $value;
}
}
return null;
}
protected function uuidV4(): string
{
$data = random_bytes(16);
$data[6] = chr((ord($data[6]) & 0x0f) | 0x40);
$data[8] = chr((ord($data[8]) & 0x3f) | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
}
@@ -415,6 +415,19 @@ class PembiayaanOnlineService
$fields['bukti_akaun_file_id'] = $saved['payload']['id'];
}
if (!empty($input['borang_data'])) {
$saved = $this->storeBuktiFile([
'data' => $input['borang_data'],
'filename' => $input['borang_filename'] ?? null,
'type' => $input['borang_type'] ?? null,
]);
if (!$saved['ok']) {
$saved['payload']['message'] = 'Borang pengesahan diperlukan: fail, nama fail dan jenis fail.';
return $saved;
}
$fields['borang_file_id'] = $saved['payload']['id'];
}
if (empty($fields)) {
return [
'ok' => false,
@@ -694,6 +707,26 @@ class PembiayaanOnlineService
->orderBy('id', 'asc')
->get();
// Fetch customer phone numbers in one query for the batch approval form.
$identityNumbers = $lines->pluck('nokp')->filter()->unique()->values()->all();
$phones = [];
if ($identityNumbers) {
$customers = Customer::on('mysql7')->select('kpbaru', 'kplama', 'telefon')
->where(function ($query) use ($identityNumbers) {
$query->whereIn('kpbaru', $identityNumbers)->orWhereIn('kplama', $identityNumbers);
})->get();
foreach ($customers as $customer) {
foreach ([$customer->kpbaru, $customer->kplama] as $identity) {
if ($identity !== null && $identity !== '') {
$phones[(string) $identity] = $customer->telefon;
}
}
}
}
foreach ($lines as $line) {
$line->setAttribute('telefon', $phones[(string) $line->nokp] ?? null);
}
return [
'ok' => true,
'status' => 200,
@@ -1739,6 +1772,65 @@ class PembiayaanOnlineService
];
}
/**
* Get attached signed online-financing confirmation form (borang_file_id).
*
* @return array{ok:bool,status:int,payload:mixed}
*/
public function getBorang($kodcaw, $id)
{
$resolved = $this->resolveMysql($kodcaw);
if (!$resolved['ok']) {
return $resolved;
}
$line = PembiayaanOnline::on($resolved['mysql'])
->where('kodcaw', $kodcaw)
->where('id', $id)
->first();
if (!$line) {
return [
'ok' => false,
'status' => 404,
'payload' => ['message' => 'Pembiayaan online tidak dijumpai'],
];
}
if (empty($line->borang_file_id)) {
return [
'ok' => false,
'status' => 404,
'payload' => ['message' => 'Borang pengesahan belum dimuat naik'],
];
}
$file = ARFiles::on('mysql7')->where('id', $line->borang_file_id)->first();
if (!$file) {
return [
'ok' => false,
'status' => 404,
'payload' => ['message' => 'Fail borang pengesahan tidak dijumpai'],
];
}
return [
'ok' => true,
'status' => 200,
'payload' => [
'pembiayaan_online_id' => $line->id,
'norujukan' => $line->norujukan,
'file' => [
'id' => $file->id,
'filename' => $file->filename,
'type' => $file->type,
'tarikhmasa' => $file->tarikhmasa,
'data' => $file->data,
],
],
];
}
/**
* PC list of PAID lines awaiting blast / tally.
*
@@ -1992,7 +2084,7 @@ class PembiayaanOnlineService
'slot' => 'BATCH2',
'label' => 'Batch 2',
'mula' => '11:00',
'cutoff' => '16:30',
'cutoff' => '15:00',
'proses' => '16:30',
],
];
+77
View File
@@ -0,0 +1,77 @@
<?php
namespace App\Services;
use App\Cawangan;
use App\Customer;
use App\Gadai;
use App\ShorakaTransaction;
use Illuminate\Validation\ValidationException;
class ShorakaGadaiService
{
public function gadai(string $kodcaw, string $norujukan): Gadai
{
$branch = Cawangan::on('mysql7')->where('kodcaw', $kodcaw)->firstOrFail();
return Gadai::on($branch->mysql)->where('kodcaw', $kodcaw)->where('norujukan', $norujukan)->first()
?? abort(404, 'Maklumat gadaian tidak tersedia. Semakan diperlukan.');
}
public function payload(Gadai $gadai): array
{
$customer = Customer::on('mysql7')->where(function ($query) use ($gadai) {
$query->where('kpbaru', $gadai->nokp)->orWhere('kplama', $gadai->nokp);
})->firstOrFail();
if (!$customer->nama || $gadai->pinjaman <= 0 || $gadai->hargajualan < $gadai->pinjaman) {
throw ValidationException::withMessages([
'norujukan' => 'Nama pelanggan, pembiayaan dan harga jualan mesti lengkap.',
]);
}
return [
'norujukan' => $gadai->norujukan,
'ownership' => $customer->nama,
'order_amount' => $gadai->pinjaman,
'murabaha_amount' => $gadai->hargajualan,
// Both GadaiV1 and GadaiV2 price the contract using upah12.
// "tempoh" is elapsed charge time, NOT the contractual tenor.
'tenor_other' => 12,
];
}
public function transaction(string $kodcaw, string $norujukan)
{
$order = ShorakaTransaction::where('norujukan', $norujukan)->first();
if ($order && (string) $order->kodcaw !== $kodcaw) {
abort(409, 'Rekod Shoraka tidak dipadankan dengan cawangan ini.');
}
return $order;
}
public function sync(ShorakaTransaction $order): void
{
if (!$order->kodcaw) {
return;
}
$gadai = $this->gadai($order->kodcaw, $order->norujukan);
if (!$gadai->exists) {
return;
}
$sameAmounts = number_format((float) $gadai->pinjaman, 2, '.', '') === $order->order_amount
&& number_format((float) $gadai->hargajualan, 2, '.', '') === $order->murabaha_amount;
$gadai->getConnection()->table('gadai')->where('norujukan', $order->norujukan)->update([
'tagkomuditi' => $order->status === 'Completed' && $sameAmounts ? 1 : 0,
]);
}
public function assertCompleted(string $kodcaw, string $norujukan): void
{
$gadai = $this->gadai($kodcaw, $norujukan);
$order = $this->transaction($kodcaw, $norujukan);
if (!$gadai->exists || !$order || $order->status !== 'Completed'
|| number_format((float) $gadai->pinjaman, 2, '.', '') !== $order->order_amount
|| number_format((float) $gadai->hargajualan, 2, '.', '') !== $order->murabaha_amount) {
abort(409, 'Pembiayaan dan SAG ditahan sehingga transaksi Shoraka selesai dan amaun sepadan.');
}
}
}
+220
View File
@@ -0,0 +1,220 @@
<?php
namespace App\Services;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use RuntimeException;
class ShorakaService
{
const STATUSES = ['Active', 'Completed', 'Cancelled', 'Pending Sell', 'Take Delivery'];
const CALLBACK_FIELDS = [
'orderId', 'status', 'bankName', 'ownershipName', 'commodityType',
'unit', 'volume', 'productType', 'valueDate', 'cancelDate', 'orderType',
'orderCurrency', 'orderAmount', 'murabahaAmount', 'tenor',
'tenorOther', 'tenorOtherUnit',
];
protected $baseUrl;
protected $apiId;
protected $secretKey;
protected $timeout;
public function __construct()
{
$this->baseUrl = rtrim((string) config('services.shoraka.base_url'), '/');
$this->apiId = (string) config('services.shoraka.api_id');
$this->secretKey = (string) config('services.shoraka.secret_key');
$this->timeout = (int) config('services.shoraka.timeout', 60);
}
public function configured(): bool
{
if ($this->simulationRequested()) {
return $this->simulationAllowed() && in_array($this->simulationMode(), ['failed', 'pending'], true);
}
return $this->apiId !== '' && $this->secretKey !== '';
}
protected function simulationAllowed(): bool
{
return app()->environment('local', 'testing');
}
protected function simulationMode(): string
{
return strtolower(trim((string) config('services.shoraka.simulation', 'off')));
}
protected function simulationRequested(): bool
{
return !in_array($this->simulationMode(), ['', 'off'], true);
}
private function simulatedResponse(string $orderId): array
{
if (!$this->simulationAllowed()) {
throw new RuntimeException('Shoraka simulation is restricted to local/testing.');
}
if (strpos($orderId, 'SIM-FAILED-') === 0) {
return ['orderId' => $orderId, 'status' => 'Cancelled'];
}
if (strpos($orderId, 'SIM-PENDING-') === 0) {
return ['orderId' => $orderId, 'status' => 'Active'];
}
throw new RuntimeException('Invalid simulation order ID.');
}
public function submitOrder(array $data): array
{
if ($this->simulationRequested()) {
if (!$this->simulationAllowed() || !in_array($this->simulationMode(), ['failed', 'pending'], true)) {
throw new RuntimeException('Shoraka simulation configuration is not allowed.');
}
return $this->simulatedResponse('SIM-' . strtoupper($this->simulationMode()) . '-' . bin2hex(random_bytes(12)));
}
$payload = ['api_id' => $this->apiId];
foreach ([
'product_type', 'commodity_type', 'ownership', 'value_date',
'order_currency', 'order_amount', 'murabaha_amount', 'tenor',
'tenor_other', 'tenor_other_unit', 'order_type', 'ownership_doc_no',
] as $field) {
$payload[$field] = $data[$field] ?? '';
}
foreach (['order_amount', 'murabaha_amount'] as $field) {
$payload[$field] = number_format((float) $payload[$field], 2, '.', '');
}
// ownership_doc_no is deliberately excluded by the v1.5 signature contract.
$signed = $payload;
unset($signed['api_id'], $signed['ownership_doc_no']);
$payload['signature'] = $this->signature(array_values($signed));
return $this->orderResponse($this->request()->post(
$this->baseUrl . '/api/submitorder', $payload
));
}
public function orderStatus(string $orderId): array
{
if (strpos($orderId, 'SIM-') === 0) {
return $this->simulatedResponse($orderId); // Never send simulated references to the real provider.
}
if ($this->simulationRequested()) {
throw new RuntimeException('Real order status is unavailable while simulation is enabled.');
}
return $this->orderResponse($this->request()->post(
$this->baseUrl . '/api/orderstatus', $this->orderPayload($orderId)
), $orderId);
}
public function certificate(string $orderId): string
{
if ($this->simulationRequested() || strpos($orderId, 'SIM-') === 0) {
throw new RuntimeException('Certificates are unavailable for simulation.');
}
// Section 5 specifies POST, despite GET in the document history.
$response = $this->request()->accept('application/pdf')->post(
$this->baseUrl . '/api/certificate', $this->orderPayload($orderId)
);
$this->checkResponse($response);
$type = strtolower(trim(explode(';', $response->header('Content-Type'))[0]));
if ($type !== 'application/pdf' || substr($response->body(), 0, 5) !== '%PDF-') {
throw new RuntimeException('Shoraka returned an invalid PDF certificate.');
}
return $response->body();
}
public function validCallback(array $payload): bool
{
if ($this->simulationRequested() || strpos((string) ($payload['orderId'] ?? ''), 'SIM-') === 0) {
return false;
}
if (!$this->configured()
|| !isset($payload['apiId'], $payload['signature'])
|| !is_string($payload['apiId'])
|| !hash_equals($this->apiId, $payload['apiId'])
|| !is_string($payload['signature'])
|| !preg_match('/\A[0-9a-fA-F]{64}\z/', $payload['signature'])) {
return false;
}
$values = [];
foreach (self::CALLBACK_FIELDS as $field) {
// Preserve the original strings: decimal formatting affects the hash.
if (!array_key_exists($field, $payload) || !is_string($payload[$field])) {
return false;
}
$values[] = $payload[$field];
}
return $payload['orderId'] !== ''
&& in_array($payload['status'], self::STATUSES, true)
&& hash_equals($this->signature($values), strtolower($payload['signature']));
}
protected function signature(array $values): string
{
return hash('sha256', implode(';', array_merge(
[$this->secretKey, $this->apiId], $values
)));
}
protected function orderPayload(string $orderId): array
{
if ($orderId === '') {
throw new RuntimeException('Shoraka order ID is required.');
}
return [
'api_id' => $this->apiId,
'order_id' => $orderId,
'signature' => $this->signature([$orderId]),
];
}
protected function request()
{
if (!$this->configured()) {
throw new RuntimeException('Shoraka credentials are not configured.');
}
// Never forward signed requests through redirects or retry a trade automatically.
return Http::asForm()->acceptJson()->timeout($this->timeout)
->withOptions(['allow_redirects' => false]);
}
protected function checkResponse(Response $response): void
{
if (!$response->successful()) {
// Do not expose upstream bodies which may contain credentials or customer data.
throw new RuntimeException('Shoraka request failed. HTTP ' . $response->status());
}
}
protected function orderResponse(Response $response, string $expectedId = null): array
{
$this->checkResponse($response);
$data = $response->json();
if (!is_array($data)
|| !isset($data['orderId'], $data['status'])
|| !(is_string($data['orderId']) || is_int($data['orderId']))
|| (string) $data['orderId'] === ''
|| !in_array($data['status'], self::STATUSES, true)
|| ($expectedId !== null && (string) $data['orderId'] !== $expectedId)) {
throw new RuntimeException('Shoraka returned an invalid order response.');
}
if (isset($data['certificateUrl']) && !is_string($data['certificateUrl'])) {
throw new RuntimeException('Shoraka returned an invalid certificate URL.');
}
return $data;
}
}
+41
View File
@@ -0,0 +1,41 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class ShorakaTransaction extends Model
{
protected $fillable = [
'norujukan',
'kodcaw',
'teller',
'order_id',
'status',
'product_type',
'commodity_type',
'ownership_name',
'ownership_doc_no',
'order_amount',
'murabaha_amount',
'certificate_url',
'certificate_path',
'request_payload',
'response_payload',
'callback_payload',
'attempt_count',
'error_message',
'submitted_at',
'completed_at',
];
protected $casts = [
'order_amount' => 'decimal:2',
'murabaha_amount' => 'decimal:2',
'request_payload' => 'array',
'response_payload' => 'array',
'callback_payload' => 'array',
'submitted_at' => 'datetime',
'completed_at' => 'datetime',
];
}
+3 -4
View File
@@ -88,9 +88,7 @@ class GadaiV1
$hargajualan = $request->pinjaman + $upah12;
$gadai = Gadai::on($cawangan['mysql'])
->where('norujukan','=',$norujukan)
->update(array(
$gadaiFields = array(
'nilaimarhun' => $total_nilai_marhun,
'berat'=> $total_berat,
'pinjaman' => $request->pinjaman,
@@ -115,7 +113,8 @@ class GadaiV1
'upahdibayar' => 0.00,
'tempohbayar' => 0.00,
'lelong_tawarruq' => 1
));
);
$gadai = Gadai::on($cawangan['mysql'])->where('norujukan', $norujukan)->update($gadaiFields);
$new_data = Gadai::on($cawangan['mysql'])->where('norujukan','=',$norujukan)->first();
+6 -35
View File
@@ -11,8 +11,6 @@ use Carbon\Carbon;
use App\Gadai;
use App\HargaEmas;
use App\InOutMar;
use App\KomuditiPurchase;
use App\KomuditiTransaksi;
use App\Marhun;
use App\Moratorium;
use App\Palsu;
@@ -809,19 +807,18 @@ class Penebusan
$array_tebus = $request->only(['jeniskeuntungan', 'nopelanggan','jenistebus','addpinjaman','nowakil','marhun','teller','bakipinjaman','bakiupah']);
$array_trans = $request->only(['nopelanggan', 'noic','jenisAT','pinjaman','pinjamanbaru','marhun','teller','jenistebus']);
$array_tebus_base = $request->only(['totalbayaran', 'bakiupah','jeniskeuntungan','bakipinjaman','jenistebus','teller','nowakil','duitpelanggan']);
$array_trans_base = $request->only(['pinjaman','teller','pinjamanbaru']);
try{
DB::connection($cawangan['mysql'])->beginTransaction();
$this->saveTebus($kodcaw,$norujukan,$gadai,$cawangan,$array_tebus);
$this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans);
$newReference = $this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans);
DB::connection('mysql7')->beginTransaction();
$this->saveTebusBase($kodcaw,$norujukan,$gadai,$array_tebus_base);
$this->createTransactionBase($norujukan,$kodcaw,$array_trans_base);
$array_response = [
'result' => 'success',
'data' => 1
'data' => 1,
'norujukan_baru' => $newReference
];
DB::connection($cawangan['mysql'])->commit();
@@ -949,7 +946,7 @@ class Penebusan
$gadaiTransaction = Gadai::on($cawangan['mysql'])->where('t_gadai','=',$current->toDateString())->orderBy('sirig', 'desc')->first();
$gadaiTransaction = optional($gadaiTransaction)->toArray();
$new_sirig = ($gadaiTransaction) ? $gadaiTransaction['sirig'] + 1 : 1;
$new_sirig = (int) ($gadaiTransaction['sirig'] ?? 0) + 1;
$curent_year = substr($current->year,2,2);
$curent_month = sprintf("%02d", $current->month);
$current_day = sprintf("%02d", $current->day);
@@ -1077,37 +1074,11 @@ class Penebusan
't_update' => $current->toDateString(),
));
return $new_sag_number;
}catch(\Exception $e){
throw new \Exception("Error in Transaction: " . $e->getMessage());
}
}
private function createTransactionBase($norujukan,$kodcaw,$array_trans_base){
$current = Carbon::now();
$komuditi_current = KomuditiPurchase::on('mysql7')->where('date_purchase','=',$current->toDateString())->orderBy('created_at','desc')->first();
$unit_current = isset($komuditi_current['unit_komuditi']) ? $komuditi_current['unit_komuditi']: 0;
try{
$update_unit = $unit_current - $array_trans_base['pinjamanbaru'];
KomuditiPurchase::on('mysql7')->where('id','=',$komuditi_current['id'])->update([
'unit_komuditi' => $update_unit
]);
KomuditiTransaksi::on('mysql7')->create([
'unit_komuditi' => $update_unit,
'nosijil'=>$komuditi_current['no_sijil'],
'norujukan' => $norujukan,
'kodcaw' => $kodcaw,
'teller' => $array_trans_base['teller'],
'masa' => $current->toTimeString(),
'tarikh' => $current->toDateString()
]);
}catch(\Exception $e){
throw new \Exception("Error in TransactionBase: " . $e->getMessage());
}
}
}
}
+9 -41
View File
@@ -12,8 +12,6 @@ use Carbon\Carbon;
use App\Gadai;
use App\HargaEmas;
use App\InOutMar;
use App\KomuditiPurchase;
use App\KomuditiTransaksi;
use App\Marhun;
use App\FailoverTransaction;
use App\FailoverTransactionFailed;
@@ -984,20 +982,19 @@ class Penebusan
$array_tebus = $request->only(['jeniskeuntungan', 'nopelanggan','jenistebus','addpinjaman','nowakil','marhun','teller']);
$array_trans = $request->only(['nopelanggan', 'noic','jenisAT','pinjaman','pinjamanbaru','marhun','teller','jenistebus']);
$array_tebus_base = $request->only(['totalbayaran', 'bakiupah','jeniskeuntungan','bakipinjaman','jenistebus','teller','nowakil','duitpelanggan']);
$array_trans_base = $request->only(['pinjaman','teller','pinjamanbaru']);
try{
DB::connection($cawangan['mysql'])->beginTransaction();
$this->saveTebus($kodcaw,$norujukan,$gadai,$cawangan,$array_tebus);
$this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans);
$newReference = $this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans);
DB::connection('mysql7')->beginTransaction();
$this->saveTebusBase($kodcaw,$norujukan,$gadai,$array_tebus_base);
$this->createTransactionBase($norujukan,$kodcaw,$array_trans_base);
$array_response = [
'result' => 'success',
'data' => 1
'data' => 1,
'norujukan_baru' => $newReference
];
DB::connection($cawangan['mysql'])->commit();
@@ -1044,19 +1041,18 @@ class Penebusan
$array_tebus = $request->only(['jeniskeuntungan', 'nopelanggan','jenistebus','addpinjaman','nowakil','marhun','teller']);
$array_trans = $request->only(['nopelanggan', 'noic','pinjaman','pinjamanbaru','marhun','teller','jenistebus']);
$array_tebus_base = $request->only(['totalbayaran', 'bakiupah','jeniskeuntungan','bakipinjaman','jenistebus','teller','nowakil','duitpelanggan']);
$array_trans_base = $request->only(['pinjaman','teller','pinjamanbaru']);
try{
DB::connection($cawangan['mysql'])->beginTransaction();
$this->saveTebus($kodcaw,$norujukan,$gadai,$cawangan,$array_tebus);
$this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans);
$newReference = $this->createTransaction($cawangan,$kodcaw,$norujukan,$array_trans);
DB::connection('mysql7')->beginTransaction();
$this->saveTebusBase($kodcaw,$norujukan,$gadai,$array_tebus_base);
$this->createTransactionBase($norujukan,$kodcaw,$array_trans_base);
$array_response = [
'result' => 'success',
'data' => 1
'data' => 1,
'norujukan_baru' => $newReference
];
DB::connection($cawangan['mysql'])->commit();
@@ -1228,7 +1224,7 @@ class Penebusan
$gadaiTransaction = Gadai::on($cawangan['mysql'])->where('t_gadai','=',$current->toDateString())->orderBy('sirig', 'desc')->first();
$gadaiTransaction = optional($gadaiTransaction)->toArray();
$new_sirig = ($gadaiTransaction) ? $gadaiTransaction['sirig'] + 1 : 1;
$new_sirig = (int) ($gadaiTransaction['sirig'] ?? 0) + 1;
$curent_year = substr($current->year,2,2);
$curent_month = sprintf("%02d", $current->month);
$current_day = sprintf("%02d", $current->day);
@@ -1356,39 +1352,11 @@ class Penebusan
't_update' => $current->toDateString(),
));
return $new_sag_number;
}catch(\Exception $e){
throw new \Exception("Error in Transaction: " . $e->getMessage());
}
}
private function createTransactionBase($norujukan,$kodcaw,$array_trans_base){
$current = Carbon::now();
$komuditi_current = KomuditiPurchase::on('mysql7')->where('date_purchase','=',$current->toDateString())->orderBy('created_at','desc')->first();
$unit_current = isset($komuditi_current['unit_komuditi']) ? $komuditi_current['unit_komuditi']: 0;
try{
$update_unit = $unit_current - $array_trans_base['pinjamanbaru'];
KomuditiPurchase::on('mysql7')->where('id','=',$komuditi_current['id'])->update([
'unit_komuditi' => $update_unit
]);
KomuditiTransaksi::on('mysql7')->create([
'unit_komuditi' => $update_unit,
'nosijil'=>$komuditi_current['no_sijil'],
'norujukan' => $norujukan,
'kodcaw' => $kodcaw,
'teller' => $array_trans_base['teller'],
'masa' => $current->toTimeString(),
'tarikh' => $current->toDateString()
]);
}catch(\Exception $e){
throw new \Exception("Error in TransactionBase: " . $e->getMessage());
}
}
}
}
+9 -3
View File
@@ -87,7 +87,9 @@ $app->singleton(
*/
$app->configure('app');
$app->configure('services');
$app->configure('logging');
$app->configure('logviewer');
$app->configure('tinker');
$app->configure('tennant_database');
$app->configure('report');
@@ -95,6 +97,7 @@ $app->configure('app_parameter');
$app->configure('parameter');
$app->configure('whatsapp');
$app->configure('kaunter');
$app->configure('bsas');
/*
|--------------------------------------------------------------------------
| Register Middleware
@@ -110,9 +113,9 @@ $app->configure('kaunter');
// App\Http\Middleware\ExampleMiddleware::class
// ]);
// $app->routeMiddleware([
// 'auth' => App\Http\Middleware\Authenticate::class,
// ]);
$app->routeMiddleware([
'logviewer.password' => App\Http\Middleware\LogViewerPassword::class,
]);
/*
|--------------------------------------------------------------------------
@@ -155,4 +158,7 @@ $app->middleware([
$app->register(\Rap2hpoutre\LaravelLogViewer\LaravelLogViewerServiceProvider::class);
$app->register(\Laravel\Tinker\TinkerServiceProvider::class);
$app->register(\App\Providers\AppServiceProvider::class);
$app->register(\KitLoong\MigrationsGenerator\MigrationsGeneratorServiceProvider::class);
return $app;
+1
View File
@@ -15,6 +15,7 @@
},
"require-dev": {
"fzaninotto/faker": "^1.9.1",
"kitloong/laravel-migrations-generator": "^6.11",
"mockery/mockery": "^1.3.1",
"phpunit/phpunit": "^8.5"
},
Generated
+142 -4
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "2a35e67752107934701ceea957a4fd34",
"content-hash": "64c3d9455edb548f4cd5ec1f8d9f77be",
"packages": [
{
"name": "auth0/auth0-php",
@@ -6686,6 +6686,81 @@
},
"time": "2020-07-09T08:09:16+00:00"
},
{
"name": "kitloong/laravel-migrations-generator",
"version": "v6.11.1",
"source": {
"type": "git",
"url": "https://github.com/kitloong/laravel-migrations-generator.git",
"reference": "0f007e86dce6e0cfd71dc0b757da18851c376c3b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/kitloong/laravel-migrations-generator/zipball/0f007e86dce6e0cfd71dc0b757da18851c376c3b",
"reference": "0f007e86dce6e0cfd71dc0b757da18851c376c3b",
"shasum": ""
},
"require": {
"doctrine/dbal": "^2.4|^3.0",
"ext-pdo": "*",
"illuminate/support": "^5.6|^6.0|^7.0|^8.0|^9.0|^10.0",
"myclabs/php-enum": "^1.6|^1.7|^1.8",
"php": ">=7.1.3"
},
"require-dev": {
"barryvdh/laravel-ide-helper": "^2.5",
"friendsofphp/php-cs-fixer": "^2.19.0|^3.1",
"larastan/larastan": "^0.4|^0.5|^0.6|^0.7|^1.0|^2.0",
"mockery/mockery": "^1.0",
"orchestra/testbench": "^3.6|^4.0|^5.0|^6.0|^7.0|^8.0",
"phpmd/phpmd": "^2.10",
"slevomat/coding-standard": "^6.0|^7.0|^8.5",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"KitLoong\\MigrationsGenerator\\MigrationsGeneratorServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"KitLoong\\MigrationsGenerator\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Kit Loong",
"email": "kitloong1008@gmail.com"
}
],
"description": "Generates Laravel Migrations from an existing database",
"keywords": [
"artisan",
"generator",
"laravel",
"lumen",
"migration",
"migrations"
],
"support": {
"issues": "https://github.com/kitloong/laravel-migrations-generator/issues",
"source": "https://github.com/kitloong/laravel-migrations-generator/tree/v6.11.1"
},
"funding": [
{
"url": "https://www.buymeacoffee.com/kitloong",
"type": "custom"
}
],
"time": "2024-02-06T14:42:33+00:00"
},
{
"name": "mockery/mockery",
"version": "1.5.0",
@@ -6817,6 +6892,69 @@
],
"time": "2022-03-03T13:19:32+00:00"
},
{
"name": "myclabs/php-enum",
"version": "1.8.5",
"source": {
"type": "git",
"url": "https://github.com/myclabs/php-enum.git",
"reference": "e7be26966b7398204a234f8673fdad5ac6277802"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/php-enum/zipball/e7be26966b7398204a234f8673fdad5ac6277802",
"reference": "e7be26966b7398204a234f8673fdad5ac6277802",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": "^7.3 || ^8.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5",
"squizlabs/php_codesniffer": "1.*",
"vimeo/psalm": "^4.6.2 || ^5.2"
},
"type": "library",
"autoload": {
"psr-4": {
"MyCLabs\\Enum\\": "src/"
},
"classmap": [
"stubs/Stringable.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP Enum contributors",
"homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
}
],
"description": "PHP Enum implementation",
"homepage": "https://github.com/myclabs/php-enum",
"keywords": [
"enum"
],
"support": {
"issues": "https://github.com/myclabs/php-enum/issues",
"source": "https://github.com/myclabs/php-enum/tree/1.8.5"
},
"funding": [
{
"url": "https://github.com/mnapoli",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
"type": "tidelift"
}
],
"time": "2025-01-14T11:49:03+00:00"
},
{
"name": "phar-io/manifest",
"version": "2.0.3",
@@ -8389,12 +8527,12 @@
],
"aliases": [],
"minimum-stability": "dev",
"stability-flags": [],
"stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^7.2.5"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
"platform-dev": {},
"plugin-api-version": "2.9.0"
}
-44
View File
@@ -1,44 +0,0 @@
{
"name": "laravel/lumen",
"description": "The Laravel Lumen Framework.",
"keywords": ["framework", "laravel", "lumen"],
"license": "MIT",
"type": "project",
"require": {
"php": "^7.2.5",
"auth0/auth0-php": "^7.4",
"laravel/lumen-framework": "^7.0",
"rap2hpoutre/laravel-log-viewer": "^1.7"
},
"require-dev": {
"fzaninotto/faker": "^1.9.1",
"mockery/mockery": "^1.3.1",
"phpunit/phpunit": "^8.5"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
},
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
]
}
}
-7182
View File
File diff suppressed because it is too large Load Diff
+14
View File
@@ -0,0 +1,14 @@
<?php
return [
'base_url' => rtrim(env('BSAS_BASE_URL', 'https://bsasdevapi.bursamalaysia.com/api'), '/'),
'token_url' => env('BSAS_TOKEN_URL', 'https://bsasdevapi.bursamalaysia.com/oauth/token'),
'client_id' => env('BSAS_CLIENT_ID'),
'client_secret' => env('BSAS_CLIENT_SECRET'),
'member_short_name' => env('BSAS_MEMBER_SHORT_NAME', 'KOOPPKB'),
'product_code' => env('BSAS_PRODUCT_CODE', 'CPO-MSIA-09'),
'tenor' => env('BSAS_TENOR', '00088'),
'max_wait_time' => (int) env('BSAS_MAX_WAIT_TIME', 10),
'http_timeout' => (int) env('BSAS_HTTP_TIMEOUT', 30),
'order_result_retries' => (int) env('BSAS_ORDER_RESULT_RETRIES', 2),
];
+16
View File
@@ -0,0 +1,16 @@
<?php
return [
'password' => env('LOGVIEWER_PASSWORD'),
/*
|--------------------------------------------------------------------------
| Pattern and storage path settings
|--------------------------------------------------------------------------
|
| The env key for pattern and storage path with a default value
|
*/
'max_file_size' => 52428800, // size in Byte
'pattern' => env('LOGVIEWER_PATTERN', '*.log'),
'storage_path' => env('LOGVIEWER_STORAGE_PATH', storage_path('logs')),
];
+23
View File
@@ -0,0 +1,23 @@
<?php
return [
'shoraka' => [
// Local UI tests only: off, failed or pending. Success is deliberately excluded.
'simulation' => env('SHORAKA_SIMULATION', 'off'),
'base_url' => env(
'SHORAKA_BASE_URL',
'https://uat2.shorakagroup.com'
),
'api_id' => env('SHORAKA_API_ID'),
'secret_key' => env('SHORAKA_SECRET_KEY'),
'timeout' => env(
'SHORAKA_TIMEOUT',
60
),
],
];
+1
View File
@@ -1,6 +1,7 @@
<?php
return [
'whatsapp_cloud_enabled' => env('WHATSAPP_CLOUD_ENABLED', true),
'token' => env('WHATSAPP_TOKEN'),
'phone_number_id' => env('WHATSAPP_PHONE_NUMBER_ID'),
'api_version' => env('WHATSAPP_API_VERSION', 'v25.0'),
@@ -0,0 +1,87 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateShorakaTransactionsTable extends Migration
{
public function up()
{
Schema::create(
'shoraka_transactions',
function (Blueprint $table) {
$table->id();
// Rujukan pembiayaan dalam eRahn
$table->string('norujukan')->unique();
// Maklumat daripada Shoraka
$table->string('order_id')
->nullable()
->unique();
$table->string('status')
->default('PENDING');
$table->string('product_type')
->default('FINANCING');
$table->string('commodity_type');
$table->string('ownership_name');
$table->string('ownership_doc_no')
->nullable();
$table->decimal(
'order_amount',
15,
2
);
$table->decimal(
'murabaha_amount',
15,
2
);
$table->string('certificate_url')
->nullable();
$table->string('certificate_path')
->nullable();
// Simpan payload untuk audit dan troubleshooting
$table->json('request_payload')
->nullable();
$table->json('response_payload')
->nullable();
$table->json('callback_payload')
->nullable();
$table->unsignedInteger('attempt_count')
->default(0);
$table->text('error_message')
->nullable();
$table->timestamp('submitted_at')
->nullable();
$table->timestamp('completed_at')
->nullable();
$table->timestamps();
$table->index('status');
}
);
}
public function down()
{
Schema::dropIfExists('shoraka_transactions');
}
}
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddKodcawToShorakaTransactions extends Migration
{
public function up()
{
Schema::table('shoraka_transactions', function (Blueprint $table) {
$table->string('kodcaw', 20)->nullable()->index();
});
}
public function down()
{
Schema::table('shoraka_transactions', function (Blueprint $table) {
$table->dropColumn('kodcaw');
});
}
}
@@ -0,0 +1,49 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBsasOrdersTable extends Migration
{
/**
* Master DB (mysql7) — per-Terima BSAS commodity orders.
*/
public function up()
{
if (Schema::connection('mysql7')->hasTable('bsas_orders')) {
return;
}
Schema::connection('mysql7')->create('bsas_orders', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('uuid', 64)->nullable()->unique();
$table->string('norujukan', 50)->index();
$table->string('kodcaw', 20)->index();
$table->string('serial_number', 20)->default('1');
$table->string('product_code', 50)->nullable();
$table->decimal('bid_value', 14, 2)->nullable();
$table->decimal('otc_murabaha_value', 14, 2)->nullable();
$table->string('otc_counter_party', 150)->nullable();
$table->string('status', 30)->default('pending')->index();
$table->integer('status_code')->nullable();
$table->string('status_message', 255)->nullable();
$table->string('e_cert_no', 100)->nullable()->index();
$table->json('bid_ecert_response')->nullable();
$table->json('otc_ecert_response')->nullable();
$table->json('stb_ecert_response')->nullable();
$table->json('request_payload')->nullable();
$table->json('order_response')->nullable();
$table->json('result_response')->nullable();
$table->string('created_by', 100)->nullable();
$table->timestamps();
$table->index(['norujukan', 'status']);
});
}
public function down()
{
Schema::connection('mysql7')->dropIfExists('bsas_orders');
}
}
@@ -0,0 +1,23 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class AddTellerToShorakaTransactions extends Migration
{
public function up()
{
Schema::table('shoraka_transactions', function (Blueprint $table) {
$table->string('teller')->nullable();
});
}
public function down()
{
Schema::table('shoraka_transactions', function (Blueprint $table) {
$table->dropColumn('teller');
});
}
}
@@ -0,0 +1,170 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
class DropUnusedCawanganTables extends Migration
{
/**
* Empty legacy tables on every branch database.
* mysql7 is the master database and is skipped.
*/
public function up()
{
$tables = [
'advansur',
'alert',
'ansrugi',
'auditbarcode',
'auditdaftar',
'auditrekodsemakan',
'audtrail',
'bajet',
'bakipelanggan',
'batchlel_xtra',
'bayaranpenebusan',
'belian',
'budgetgadai',
'budgettebus',
'budgetupah',
'checker',
'configkaunter',
'coordination',
'customer',
'gadaisimulasi',
'gadaitemp',
'gadaixtra',
'glejer',
'hapusgadaionline',
'hapuskira',
'hargaemasbeli',
'hargaemasjual',
'imbangan',
'imbang_duga_lama',
'inoutmarxtra',
'jemas00',
'jemasbeli',
'jemasxtra',
'jualan',
'jualemas',
'jumlahtebus',
'karatbeli',
'karatjual',
'karatxtra',
'kawalanstok',
'kawalanstokxtra',
'kawalanstok_lama',
'kumpulan',
'kurangxtra',
'ku_nm',
'ku_nmbaru',
'ku_nmxtra',
'lapringkasan',
'lapterkumpul',
'lapterkumpulharian',
'lelkarat',
'lelmarhun_xtra',
'lelongxtra',
'marhunbeli',
'marhunjual',
'marhunsimulasi',
'marhunxtra',
'model',
'outmarhun',
'outmarhunxtra',
'parameter',
'pelelong',
'pembeliemas',
'pemeriksaan',
'pengesahangadai',
'pengguna',
'percentonline',
'polisxtra',
'poskod',
'ramalan',
'rekodtangguh',
'sahabat',
'senhitam',
'serahbaki',
'simpanan',
'simulasi_batchlel',
'simulasi_batchlelxtra',
'simulasi_lelmarhun',
'simulasi_lelongxtra',
'syarikat',
'tagpelanggan',
'tebuslelong',
'tebus_xtra',
'tempimbang',
'tempnosiri',
'tempnosirixtra',
'temppwd',
'temptarikhaging',
'temp_ic',
'tunaigadteb',
'tuntutan',
'tuntutbakixtra',
'ubs_code',
'zparameter',
'zparameter1',
];
foreach ($this->getActiveDB() as $connection) {
$this->dropTables($connection, $tables);
}
}
public function down()
{
// Original table definitions are not kept. This drop cannot be reversed.
}
private function getActiveDB()
{
$config_db = array_keys(config('database.connections'));
return array_filter($config_db, function ($connection) {
try {
if ($connection === 'mysql7') {
return false;
}
DB::connection($connection)->getPdo();
return true;
} catch (\Exception $e) {
return false;
}
});
}
private function dropTables($connection, array $tables)
{
$db = DB::connection($connection);
$placeholders = implode(',', array_fill(0, count($tables), '?'));
$rows = $db->select(
"SELECT TABLE_NAME AS table_name
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_TYPE = 'BASE TABLE'
AND LOWER(TABLE_NAME) IN ($placeholders)",
$tables
);
if (count($rows) === 0) {
return;
}
$quoted = array_map(function ($row) {
return '`'.str_replace('`', '``', $row->table_name).'`';
}, $rows);
$db->statement('SET FOREIGN_KEY_CHECKS=0');
try {
$db->statement('DROP TABLE IF EXISTS '.implode(', ', $quoted));
} finally {
$db->statement('SET FOREIGN_KEY_CHECKS=1');
}
}
}
@@ -0,0 +1,60 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
class DropUnusedMasterTables extends Migration
{
/**
* Empty legacy tables on the master database (mysql7).
*/
public function up()
{
$tables = [
'approval_withdrawal',
'cawangan00',
'cawangan_notis',
'coordination',
'customers_main',
'log_blast_sms',
'log_blast_wasap',
'mobile_payment_info',
'mobile_payment_log',
'moratorium',
'otp_token',
'tac_express_payment',
];
$db = DB::connection('mysql7');
$placeholders = implode(',', array_fill(0, count($tables), '?'));
$rows = $db->select(
"SELECT TABLE_NAME AS table_name
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_TYPE = 'BASE TABLE'
AND LOWER(TABLE_NAME) IN ($placeholders)",
$tables
);
if (count($rows) === 0) {
return;
}
$quoted = array_map(function ($row) {
return '`'.str_replace('`', '``', $row->table_name).'`';
}, $rows);
$db->statement('SET FOREIGN_KEY_CHECKS=0');
try {
$db->statement('DROP TABLE IF EXISTS '.implode(', ', $quoted));
} finally {
$db->statement('SET FOREIGN_KEY_CHECKS=1');
}
}
public function down()
{
// Original table definitions are not kept. This drop cannot be reversed.
}
}
@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAddtunaiTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('addtunai', function (Blueprint $table) {
$table->integer('recno');
$table->date('tarikh')->nullable();
$table->string('kodcaw', 10)->nullable()->default('');
$table->string('kodlaluan', 100)->nullable()->default('');
$table->decimal('tambah', 11)->nullable()->default(0);
$table->decimal('kurang', 11)->nullable()->default(0);
$table->string('nota', 40)->nullable()->default('');
$table->integer('bil')->default(0);
$table->timestamp('created_at');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('addtunai');
}
}
@@ -0,0 +1,42 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAkruNetPecahanTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('akru_net_pecahan', function (Blueprint $table) {
$table->unsignedBigInteger('id');
$table->integer('tahun');
$table->integer('bulan');
$table->decimal('persen_semasa', 9);
$table->decimal('ujrah_semasa', 9);
$table->decimal('persen_sebelum', 9);
$table->decimal('ujrah_sebelum', 9);
$table->decimal('keuntungan_semasa_1persen', 9);
$table->decimal('keuntungan_semasa_ujrah', 9);
$table->decimal('baki_keun_blm_byr_1persen', 9);
$table->decimal('baki_keun_blm_byr_ujrah', 9);
$table->decimal('pend_akru_1persen', 9);
$table->decimal('pend_akru_ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('akru_net_pecahan');
}
}
@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAkruNetTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('akru_net', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->decimal('jumlah', 9)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('akru_net');
}
}
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBandarTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('bandar', function (Blueprint $table) {
$table->string('kodbandar', 10)->nullable();
$table->string('namabandar', 30)->nullable();
$table->string('kodnegeri', 3)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('bandar');
}
}
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBankTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('bank', function (Blueprint $table) {
$table->string('bankcode', 10)->nullable();
$table->string('bankdesc', 30)->nullable();
$table->string('note', 30)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('bank');
}
}
@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBatalgadaiTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('batalgadai', function (Blueprint $table) {
$table->integer('recno');
$table->string('norujukan', 20)->nullable();
$table->string('tellerid', 50)->nullable();
$table->string('namateller', 30)->nullable();
$table->date('tarikh');
$table->time('masa');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('batalgadai');
}
}
@@ -0,0 +1,42 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBatchPembiayaanOnlineTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('batch_pembiayaan_online', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('batch_no', 50);
$table->string('kodcaw', 20);
$table->date('tarikh');
$table->string('slot', 20)->nullable()->comment('BATCH1 / BATCH2');
$table->integer('bilangan')->default(0);
$table->decimal('jumlah_keseluruhan', 12)->default(0);
$table->string('status', 30)->default('DRAFT');
$table->string('pc_submitted_by', 100)->nullable();
$table->timestamp('submitted_at')->nullable();
$table->timestamps();
$table->index(['kodcaw', 'tarikh', 'status']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('batch_pembiayaan_online');
}
}
@@ -0,0 +1,51 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBatchlelTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('batchlel', function (Blueprint $table) {
$table->integer('recno');
$table->string('kodcaw', 10)->default('');
$table->integer('batchno');
$table->date('tarikh')->nullable()->default('0000-00-00');
$table->date('tarikh2')->nullable()->default('0000-00-00');
$table->time('masadari')->nullable()->default('00:00:00');
$table->time('masahingga')->nullable()->default('00:00:00');
$table->string('pilihankos', 1)->default('');
$table->decimal('pcntkos', 5)->default(0);
$table->decimal('koslelong', 7)->default(0);
$table->decimal('jumnm', 11)->default(0);
$table->decimal('diskaun', 5)->default(0);
$table->string('alamat1', 40)->default('');
$table->string('alamat2', 40)->default('');
$table->string('alamat3', 40)->default('');
$table->string('alamat4', 20)->default('');
$table->string('telefon', 30)->default('');
$table->integer('nopelelong')->default(0);
$table->decimal('percentgst', 3)->default(6);
$table->decimal('percentgst_hj', 3)->default(0);
$table->date('t_daftar')->nullable();
$table->integer('tag_sms')->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('batchlel');
}
}
@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBrandTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('brand', function (Blueprint $table) {
$table->integer('brandNo');
$table->string('brand', 30);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('brand');
}
}
@@ -0,0 +1,53 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCawanganTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('cawangan', function (Blueprint $table) {
$table->string('kodcaw', 10);
$table->string('kodnegeri', 3)->nullable();
$table->string('namacaw', 80)->nullable();
$table->string('alamat1', 60)->nullable();
$table->string('alamat2', 60)->nullable();
$table->string('alamat3', 60)->nullable();
$table->string('alamat4', 60)->nullable();
$table->string('notel', 40)->nullable();
$table->string('nofaks', 11);
$table->date('systemdate')->nullable();
$table->decimal('cajkhidmat', 7)->nullable()->default(0);
$table->tinyInteger('openst')->nullable()->default(0);
$table->string('prkod', 2)->nullable();
$table->string('nokotak', 10)->nullable();
$table->string('murtahin', 60)->nullable();
$table->string('saksi', 60)->nullable();
$table->string('glus', 15)->nullable();
$table->string('glut', 15)->nullable();
$table->decimal('ut_kasar', 15)->default(0);
$table->decimal('belanjat', 15)->default(0);
$table->decimal('ut_bersih', 15)->default(0);
$table->string('msword', 80)->nullable();
$table->date('t_aging');
$table->string('cawangan', 20)->nullable()->default('Wakaf Bharu');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('cawangan');
}
}
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateDaerahTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('daerah', function (Blueprint $table) {
$table->integer('koddaerah')->nullable()->default(0);
$table->string('namadaerah', 30)->nullable();
$table->string('kodnegeri', 3)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('daerah');
}
}
@@ -0,0 +1,78 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateDenominasiTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('denominasi', function (Blueprint $table) {
$table->date('tarikh')->nullable();
$table->integer('bd1')->default(0);
$table->decimal('b1', 11)->default(0);
$table->integer('bd5')->default(0);
$table->decimal('b5', 11)->default(0);
$table->integer('bd10')->default(0);
$table->decimal('b10', 11)->default(0);
$table->integer('bd20')->default(0);
$table->decimal('b20', 11)->default(0);
$table->integer('bd50')->default(0);
$table->decimal('b50', 11)->default(0);
$table->integer('bd100')->default(0);
$table->decimal('b100', 11)->default(0);
$table->integer('txtring1')->default(0);
$table->decimal('k1', 11)->default(0);
$table->integer('txtring5')->default(0);
$table->decimal('k5', 11)->default(0);
$table->integer('txtsen1')->default(0);
$table->decimal('k01', 11)->default(0);
$table->integer('txtsen5')->default(0);
$table->decimal('k05', 11)->default(0);
$table->integer('txtsen10')->default(0);
$table->decimal('k010', 11)->default(0);
$table->integer('txtsen20')->default(0);
$table->decimal('k020', 11)->default(0);
$table->integer('txtsen50')->default(0);
$table->decimal('k050', 11)->default(0);
$table->integer('txtring10')->default(0);
$table->decimal('k10', 11)->default(0);
$table->integer('txtring20')->default(0);
$table->decimal('k20', 11)->default(0);
$table->integer('txtring50')->default(0);
$table->decimal('k50', 11)->default(0);
$table->integer('txtring100')->default(0);
$table->decimal('k100', 11)->default(0);
$table->integer('txtring1000')->default(0);
$table->decimal('k1000', 11)->default(0);
$table->decimal('jumlahbundle', 11)->default(0);
$table->decimal('txtjumlah', 11)->default(0);
$table->string('nota', 100)->nullable();
$table->decimal('jumlahkeping', 11)->default(0);
$table->decimal('lebihan', 11)->default(0);
$table->integer('sd1')->default(0);
$table->integer('sd2')->default(0);
$table->integer('sd5')->default(0);
$table->decimal('s1', 11)->default(0);
$table->decimal('s2', 11)->default(0);
$table->decimal('s5', 11)->default(0);
$table->integer('recno');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('denominasi');
}
}
@@ -0,0 +1,169 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGadaiTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('gadai', function (Blueprint $table) {
$table->string('kodcaw', 10)->nullable();
$table->string('norujukan', 20);
$table->string('prkod', 2)->nullable();
$table->string('nopelanggan', 12)->nullable();
$table->string('nokp', 14)->nullable();
$table->date('t_gadai')->nullable();
$table->time('masa')->nullable();
$table->integer('sirig')->nullable()->default(0);
$table->decimal('nilaimarhun', 9)->nullable()->default(0);
$table->decimal('n_marhuns', 9)->nullable()->default(0);
$table->decimal('berat', 7)->nullable()->default(0);
$table->decimal('pinjaman', 9)->nullable()->default(0);
$table->string('cara_terima', 20)->nullable();
$table->decimal('telahbayar', 7)->nullable()->default(0);
$table->decimal('upahtelahbyr', 7)->default(0);
$table->decimal('cajtelahbyr', 7)->nullable()->default(0);
$table->decimal('ansuran', 9)->nullable()->default(0);
$table->decimal('ansupah', 7)->nullable()->default(0);
$table->decimal('kadarupah', 5)->nullable()->default(0);
$table->decimal('tempoh', 10)->default(0);
$table->date('t_lanjut1')->nullable();
$table->date('t_lanjut2')->nullable();
$table->date('t_matang')->nullable();
$table->date('t_matang1')->nullable();
$table->date('t_matang2')->nullable();
$table->date('t_notis1')->nullable();
$table->date('t_notis2')->nullable();
$table->date('t_notis3')->nullable();
$table->date('t_lelong')->nullable();
$table->date('t_hapus')->nullable();
$table->string('sttebus', 1)->nullable();
$table->string('terima', 1)->nullable();
$table->integer('cetak')->nullable()->default(0);
$table->string('tncek', 1)->nullable();
$table->string('nocek', 10)->nullable();
$table->string('bkcode', 4)->nullable();
$table->string('glcode', 15)->nullable();
$table->string('teller', 100)->nullable();
$table->string('pelulus', 50)->nullable();
$table->string('pelulust', 7)->nullable();
$table->string('disburseid', 7)->nullable();
$table->time('disbursetime')->nullable();
$table->string('cancelid', 7)->nullable();
$table->time('canceltime')->nullable();
$table->string('f_lulus', 1)->nullable();
$table->string('tag', 1)->nullable();
$table->decimal('jbg', 9)->nullable()->default(0);
$table->decimal('bakipjm', 9)->nullable()->default(0);
$table->decimal('bakiupah', 9)->nullable()->default(0);
$table->decimal('cajlain', 7)->nullable()->default(0);
$table->string('marhun')->nullable();
$table->string('jenisupah', 1)->nullable();
$table->decimal('cajkhidmat', 7)->nullable()->default(0);
$table->tinyInteger('stcajkhidmat')->nullable()->default(0);
$table->string('kodgl', 15)->nullable();
$table->tinyInteger('taglel')->nullable()->default(0);
$table->integer('instno')->nullable()->default(0);
$table->integer('currInstno')->nullable()->default(0);
$table->decimal('ansakhir', 7)->nullable()->default(0);
$table->decimal('ansupahakhir', 7)->nullable()->default(0);
$table->decimal('jumupahaz', 7)->nullable()->default(0);
$table->decimal('tunggakan', 7)->nullable()->default(0);
$table->date('t_update')->nullable();
$table->string('jantina', 1)->nullable();
$table->string('bangsa', 1)->nullable();
$table->integer('sirit')->nullable()->default(0);
$table->tinyInteger('jenisansur')->nullable()->default(0);
$table->string('nokotak', 10)->nullable();
$table->tinyInteger('tiada')->nullable()->default(0);
$table->integer('tagtbaki')->default(0);
$table->string('penilai', 50)->nullable();
$table->string('namapenilai', 30)->nullable();
$table->integer('tagserah')->default(0);
$table->date('tempTarikhAging')->nullable();
$table->string('jenistebus', 1);
$table->string('namapelulus', 50)->nullable();
$table->decimal('percentpinj', 9)->default(0);
$table->integer('kuantiti')->default(0);
$table->string('namateller', 30)->nullable();
$table->decimal('jumtebus', 11)->nullable()->default(0);
$table->decimal('upahnotis', 9)->nullable()->default(0);
$table->decimal('upahpercuma', 11);
$table->integer('tagpalsu')->default(0);
$table->decimal('upahdibayar', 10)->default(0);
$table->integer('tagcetak');
$table->integer('tag_sms')->default(0);
$table->string('semakbarcode', 40)->default('Tidak Lulus');
$table->integer('wangkeluarteller')->default(0);
$table->integer('semakpetibesi')->default(0);
$table->integer('semakaudit')->default(0);
$table->string('historygadaian', 20)->default('0');
$table->integer('tagkiratebus')->default(0);
$table->integer('checkbp')->default(0);
$table->decimal('pampasan', 9)->default(0);
$table->integer('lel1stop')->default(0);
$table->string('tellernew', 40);
$table->string('idjompay', 25)->default('0');
$table->integer('tangguh')->default(0);
$table->date('tebus')->nullable();
$table->decimal('upahSim', 7)->default(0);
$table->decimal('jbgakru', 5)->default(0);
$table->decimal('upahakru', 7)->default(0);
$table->integer('tagpalsu2')->default(0);
$table->integer('tagcall')->default(0);
$table->decimal('upah_semasa', 11)->nullable()->default(0);
$table->decimal('simulasi_hargaasas', 11)->nullable()->default(0);
$table->decimal('simulasi_cajlelong', 11)->nullable()->default(0);
$table->decimal('simulasi_bakilelong', 11)->nullable()->default(0);
$table->decimal('sim_hargaasas', 9)->nullable()->default(0);
$table->decimal('sim_cajlelong', 9)->nullable()->default(0);
$table->decimal('sim_upahlelong', 9)->nullable()->default(0);
$table->decimal('sim_bakilelong', 9)->nullable()->default(0);
$table->decimal('percentrebet', 9)->nullable()->default(0);
$table->decimal('rebet', 9)->nullable()->default(0);
$table->decimal('upahlpsrebet', 9)->nullable()->default(0);
$table->integer('taguploadslip')->nullable()->default(0);
$table->integer('tagsahupahonline')->nullable()->default(0);
$table->decimal('bayarupahonline', 9)->nullable()->default(0);
$table->date('tbayaronline')->nullable();
$table->decimal('upahsebenar', 9)->nullable()->default(0);
$table->integer('tagupdatedbonline')->nullable()->default(0);
$table->decimal('bayarpinjamanonline', 9)->nullable()->default(0);
$table->string('jenis_bayaran', 5)->nullable();
$table->decimal('upah12', 9)->nullable();
$table->decimal('hargajualan', 9)->nullable();
$table->decimal('bakihargajualan', 9)->nullable();
$table->tinyInteger('tagkomuditi')->nullable();
$table->tinyInteger('lelong_tawarruq')->nullable()->default(1);
$table->float('tempohbayar', 10)->default(0);
$table->char('tag_tebus', 2);
$table->decimal('kadarujrah', 5);
$table->decimal('ujrah', 9);
$table->decimal('onepercent', 9);
$table->decimal('margin_semasa', 5);
$table->tinyInteger('tagbaru')->default(0);
$table->decimal('tunggakanujrah', 9);
$table->decimal('tunggakanonepercent', 9);
$table->tinyInteger('tagnotis')->default(0);
$table->decimal('kadarrebet', 8, 4)->nullable()->default(0);
$table->decimal('diskaun', 12)->nullable()->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('gadai');
}
}
@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGlcodeTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('glcode', function (Blueprint $table) {
$table->integer('recno');
$table->string('kodcaw', 10)->nullable();
$table->string('glcode', 15)->nullable();
$table->string('descpt', 40)->nullable();
$table->string('acttype', 1)->nullable();
$table->string('jenisakaun', 10)->nullable();
$table->tinyInteger('bayaran')->nullable()->default(0);
$table->date('tarikh')->nullable();
$table->decimal('amaun', 15)->nullable()->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('glcode');
}
}
@@ -0,0 +1,47 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGldetailTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('gldetail', function (Blueprint $table) {
$table->string('kodcaw', 10)->nullable();
$table->integer('recno');
$table->date('tarikh')->nullable();
$table->string('dtacct', 15)->nullable();
$table->string('ktacct', 15)->nullable();
$table->string('descpt', 40)->nullable();
$table->string('acttype', 1)->nullable();
$table->string('fracttype', 1)->nullable();
$table->decimal('amaun', 13)->default(0);
$table->string('teller', 7)->nullable();
$table->string('pelulus', 7)->nullable();
$table->string('terima', 1)->nullable();
$table->string('jenisbyr', 2)->nullable();
$table->string('bkcode', 4)->nullable();
$table->string('nocek', 6)->nullable();
$table->decimal('pendahuluan', 13)->nullable()->default(0);
$table->decimal('serahan', 13)->nullable()->default(0);
$table->timestamp('date_created');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('gldetail');
}
}
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateHargaemasTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('hargaemas', function (Blueprint $table) {
$table->string('karat', 5)->nullable();
$table->date('t_efektif')->nullable();
$table->decimal('harga', 7)->nullable()->default(0);
$table->time('m_efektif');
$table->decimal('harga2', 5);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('hargaemas');
}
}
@@ -0,0 +1,68 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateImbangDugaBackupTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('imbang_duga_backup', function (Blueprint $table) {
$table->integer('recno');
$table->string('kodcaw', 10)->nullable();
$table->date('tarikh')->nullable();
$table->decimal('tunaiditangan', 11)->nullable();
$table->decimal('pembiayaantawarruq', 11)->nullable();
$table->decimal('bayaranpendahuluan', 11)->nullable();
$table->decimal('pinjamankoop', 11)->nullable();
$table->decimal('emaspalsu', 11)->nullable();
$table->decimal('serahan', 11)->nullable();
$table->decimal('bds', 11)->nullable();
$table->decimal('perubatan', 11)->nullable();
$table->decimal('keraian', 11)->nullable();
$table->decimal('rugilelong', 11)->nullable();
$table->decimal('bakilelong', 11)->nullable();
$table->decimal('wtd', 11)->nullable();
$table->decimal('untungrugiterkumpul', 11)->nullable();
$table->decimal('keun_sebenar', 11)->nullable();
$table->decimal('pendahuluan', 11)->nullable();
$table->decimal('cajlelong', 11)->nullable();
$table->decimal('pindahkekpkb', 11)->nullable();
$table->decimal('penghutangkaki', 11)->nullable();
$table->decimal('phapuskira', 11)->nullable();
$table->decimal('belian1stop', 11)->nullable();
$table->decimal('keun_penggadai', 11)->nullable();
$table->decimal('pend_terakru', 11)->nullable();
$table->decimal('cajperkhidmatan', 11)->nullable();
$table->decimal('cajlelongxtra', 11)->nullable();
$table->decimal('upahsimpanxtra', 11)->nullable();
$table->decimal('bakilelongxtra', 11)->nullable();
$table->decimal('rugilelongxtra', 11)->nullable();
$table->decimal('utgterkumpulxtra', 11)->nullable();
$table->decimal('jualan1stop', 11)->nullable();
$table->decimal('hapuskira', 11)->nullable();
$table->decimal('totalharta', 11)->nullable();
$table->decimal('totaltanggungan', 11)->nullable();
$table->integer('tagtally')->nullable();
$table->timestamps();
$table->decimal('ujrah', 9);
$table->decimal('onepercent', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('imbang_duga_backup');
}
}
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateInoutmarTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('inoutmar', function (Blueprint $table) {
$table->date('tarikh')->nullable();
$table->time('masa')->nullable();
$table->string('norujukan', 14)->nullable();
$table->decimal('nm', 9)->nullable();
$table->string('kpd', 20)->nullable();
$table->string('drp', 20)->nullable();
$table->decimal('bln', 3, 0)->nullable();
$table->decimal('thn', 5, 0)->nullable();
$table->tinyInteger('tag')->nullable();
$table->string('jenistebus', 2);
$table->string('namateller', 30);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('inoutmar');
}
}
@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateJemasTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('jemas', function (Blueprint $table) {
$table->integer('recno');
$table->string('marhun', 30)->nullable();
$table->string('descpt', 30)->nullable();
$table->integer('ordernum');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('jemas');
}
}
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateJenisakaunTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('jenisakaun', function (Blueprint $table) {
$table->integer('recno')->default(0);
$table->string('kod', 1)->nullable();
$table->string('keterangan', 20)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('jenisakaun');
}
}
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateKaratTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('karat', function (Blueprint $table) {
$table->string('karat', 10)->nullable();
$table->string('keterangan', 20)->nullable();
$table->decimal('harga', 5)->nullable();
$table->integer('recno');
$table->decimal('harga2', 5)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('karat');
}
}
@@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLelmarhunTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('lelmarhun', function (Blueprint $table) {
$table->string('kodcaw', 10)->nullable();
$table->string('norujukan', 20)->nullable();
$table->date('t_gadai')->nullable();
$table->decimal('bil', 3, 0)->nullable();
$table->string('marhun', 30)->nullable();
$table->string('nota', 30)->nullable();
$table->string('karat', 10)->nullable();
$table->decimal('berat', 7)->nullable();
$table->decimal('harga', 5)->nullable();
$table->decimal('n_marhun', 9)->nullable();
$table->integer('batch_no')->nullable();
$table->decimal('hargaasas', 11)->nullable();
$table->integer('recno');
$table->decimal('hargaasas_sim', 7)->nullable();
$table->decimal('beratasal', 11)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('lelmarhun');
}
}
@@ -0,0 +1,119 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLelongTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('lelong', function (Blueprint $table) {
$table->integer('batchno')->default(0);
$table->integer('sirilel')->nullable();
$table->string('kodcaw', 10)->nullable();
$table->string('norujukan', 20)->nullable();
$table->date('t_lelong')->nullable();
$table->decimal('hargaasas', 9)->nullable()->default(0);
$table->decimal('sandaran', 11)->default(0);
$table->decimal('hargajual', 9)->nullable()->default(0);
$table->string('glcode', 15)->nullable();
$table->date('t_jual')->nullable();
$table->integer('nopembeli')->nullable()->default(0);
$table->decimal('jbg', 7)->nullable()->default(0);
$table->decimal('kadarupah', 5)->default(0);
$table->decimal('upahsimpan', 7)->nullable();
$table->decimal('ansuran', 9)->nullable();
$table->decimal('nilaimarhun', 9)->default(0);
$table->decimal('pinjaman', 9)->default(0);
$table->decimal('bakipjmas', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('bakiupahas', 7)->nullable();
$table->decimal('bakiupah', 9)->default(0);
$table->decimal('cajlainas', 7)->nullable();
$table->decimal('cajlain', 7)->nullable();
$table->decimal('cajlelongas', 7)->nullable();
$table->decimal('cajlelong', 7)->default(0);
$table->decimal('baki', 9)->default(0);
$table->string('terima', 1)->nullable();
$table->tinyInteger('cetak')->default(0);
$table->string('teller', 20)->nullable();
$table->string('pelulus', 20)->nullable();
$table->string('pelulust', 7)->nullable();
$table->string('f_lulus', 1)->nullable();
$table->string('type', 1)->nullable();
$table->string('prkod', 2)->nullable();
$table->tinyInteger('tagsurat')->nullable();
$table->date('trkhtuntut')->nullable();
$table->string('tellertb', 7)->nullable();
$table->string('pelulustb', 7)->nullable();
$table->string('terimatb', 1)->nullable();
$table->date('t_hapuskira')->nullable();
$table->decimal('hapuskira', 7)->nullable();
$table->decimal('hkpjm', 9)->nullable();
$table->string('cancelid', 7)->nullable();
$table->time('canceltime')->nullable();
$table->string('kodgl', 15)->nullable();
$table->date('t_update')->nullable();
$table->decimal('berat', 7)->default(0);
$table->string('marhun')->nullable();
$table->integer('recno');
$table->decimal('lebihkurang', 9)->default(0);
$table->decimal('nilaimarhuns', 9)->default(0);
$table->integer('tagaid')->nullable();
$table->decimal('gst_hj', 7)->nullable();
$table->decimal('gst_cl', 7)->nullable();
$table->decimal('hargajual_sim', 7)->nullable();
$table->decimal('cajlelong_sim', 7)->nullable();
$table->decimal('gst_hj_sim', 7)->nullable();
$table->decimal('gst_cl_sim', 7)->nullable();
$table->decimal('bakiupah_sim', 7)->nullable();
$table->decimal('hargaasas_sim', 7)->nullable();
$table->string('mutu_terendah', 10)->nullable();
$table->decimal('harga_baru', 7)->nullable();
$table->decimal('turun', 7)->nullable();
$table->decimal('percent', 7)->nullable();
$table->decimal('baki_sim', 7)->nullable();
$table->decimal('hargalama', 7)->nullable();
$table->date('t_lelong_sim')->nullable();
$table->integer('tag_gst')->nullable();
$table->decimal('makan_pinj', 7)->nullable();
$table->decimal('baki_upah6', 7)->nullable();
$table->decimal('baki6', 7)->nullable();
$table->decimal('rugi_asal', 9)->default(0);
$table->string('tagpelanggan', 20)->nullable()->default('99');
$table->integer('fasa')->default(0);
$table->decimal('pmt', 11)->nullable();
$table->string('tagpmt', 20)->nullable();
$table->decimal('hargaasasasal', 11)->nullable();
$table->decimal('beratasal', 11)->default(0);
$table->integer(' loopsemak')->nullable();
$table->integer('lel1stop')->default(0);
$table->integer('jbg_lelong')->default(0);
$table->decimal('berat_plastik', 11)->nullable()->default(0);
$table->integer('status_bida_online')->default(0);
$table->string('nopelanggan', 14)->nullable();
$table->integer('tag_tbaki')->nullable();
$table->string('pel_tbaki', 20)->default('0');
$table->integer('tagcall')->default(0);
$table->decimal('ujrah', 9);
$table->decimal('onepercent', 9);
$table->tinyInteger('tagujrah')->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('lelong');
}
}
@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLelongTebusTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('lelong_tebus', function (Blueprint $table) {
$table->integer('recno');
$table->date('tarikh')->nullable();
$table->string('teller', 100)->nullable();
$table->string('norujukan', 30)->nullable();
$table->string('batch_no', 10)->nullable();
$table->decimal('nilai_marhun', 11)->nullable();
$table->decimal('pinjaman', 11)->nullable();
$table->decimal('upah', 11)->nullable();
$table->integer('jbg')->nullable();
$table->string('jenis_tebus', 10)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('lelong_tebus');
}
}
@@ -0,0 +1,50 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMarhunTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('marhun', function (Blueprint $table) {
$table->string('kodcaw', 3)->nullable();
$table->string('norujukan', 20)->nullable();
$table->date('t_gadai')->nullable();
$table->decimal('bil', 3, 0)->nullable();
$table->string('marhun', 30)->nullable();
$table->string('nota', 30)->nullable();
$table->string('karat', 10)->nullable();
$table->decimal('berat', 7)->nullable();
$table->decimal('harga', 5)->nullable();
$table->decimal('n_marhun', 9)->nullable();
$table->tinyInteger('tags')->nullable();
$table->tinyInteger('cfmlelong')->nullable();
$table->decimal('hargas', 5)->nullable();
$table->decimal('n_marhuns', 7)->nullable();
$table->integer('recno');
$table->integer('new')->nullable();
$table->date('ttag')->nullable();
$table->decimal('hel', 9)->nullable();
$table->decimal('nml', 9)->nullable();
$table->decimal('berat_batu_permata', 7)->nullable();
$table->integer('tag_permata')->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('marhun');
}
}
@@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateModalOnlineTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('modal_online', function (Blueprint $table) {
$table->bigIncrements('id');
$table->date('tarikh');
$table->string('kodcaw', 20);
$table->decimal('had', 12)->default(100000);
$table->decimal('digunakan', 12)->default(0);
$table->decimal('baki', 12)->default(100000);
$table->decimal('tambah', 12)->default(0);
$table->decimal('kurang', 12)->default(0);
$table->tinyInteger('ditutup')->default(0);
$table->string('ditutup_oleh', 100)->nullable();
$table->timestamp('ditutup_at')->nullable();
$table->timestamps();
$table->unique(['tarikh', 'kodcaw']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('modal_online');
}
}
@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMohonAnggotaTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('mohon_anggota', function (Blueprint $table) {
$table->unsignedBigInteger('id');
$table->date('tarikh')->nullable();
$table->string('nokp', 20)->nullable();
$table->string('nama', 100)->nullable();
$table->string('status', 50)->default('MENUNGGU OPERASI');
$table->text('komen')->nullable();
$table->string('teller', 100)->nullable();
$table->string('peloperasi', 100)->nullable();
$table->dateTime('datetime_pelulus')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('mohon_anggota');
}
}
@@ -0,0 +1,48 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMohonTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('mohon', function (Blueprint $table) {
$table->integer('id');
$table->date('tarikh')->nullable();
$table->string('norujukan', 20);
$table->decimal('siri', 9, 0)->default(0);
$table->mediumText('komen')->nullable();
$table->date('lastdategadai')->nullable();
$table->integer('bilgad')->default(0);
$table->decimal('jumpinj', 9)->default(0);
$table->string('jenistebus', 2);
$table->string('teller', 100)->nullable();
$table->string('pelulus', 100);
$table->string('peloperasi', 100);
$table->string('masalulus', 100);
$table->string('khazanah', 100);
$table->string('operasi', 100);
$table->decimal('margin', 10)->nullable();
$table->decimal('nilaimarhun', 10)->nullable();
$table->decimal('berat', 10)->nullable();
$table->string('status', 100)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('mohon');
}
}
@@ -0,0 +1,48 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMohonidTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('mohonid', function (Blueprint $table) {
$table->integer('recno');
$table->date('tarikh')->nullable();
$table->time('masa')->nullable()->comment('Time period');
$table->string('onlineid', 40)->nullable();
$table->string('mohon', 40)->nullable();
$table->string('norujukan', 20)->nullable();
$table->string('id', 40)->nullable();
$table->timestamp('timestamp_approved_by_pc')->nullable()->comment('Time Approved by PC');
$table->string('katalaluan', 50)->nullable();
$table->integer('benar')->nullable();
$table->string('teller', 100)->nullable();
$table->decimal('pinjaman', 10)->nullable();
$table->decimal('ansuran', 10)->default(0)->comment('Ansuran Amount');
$table->decimal('nilaimarhun', 10)->nullable();
$table->decimal('berat', 10)->nullable();
$table->decimal('margin', 4)->nullable();
$table->boolean('tagoperasi')->default(false)->comment('Tag Operasi');
$table->string('operasi')->nullable()->comment('Nama Operasi');
$table->timestamp('timestamp_approved_by_operasi')->nullable()->comment('Time approved by Operasi');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('mohonid');
}
}
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateNegeriTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('negeri', function (Blueprint $table) {
$table->string('kodnegeri', 3)->nullable();
$table->string('negeri', 25)->nullable();
$table->string('cutiumum', 1)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('negeri');
}
}
@@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePalsuTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('palsu', function (Blueprint $table) {
$table->integer('recno');
$table->string('kodcaw', 10)->nullable();
$table->date('tarikh')->nullable();
$table->string('norujukan', 20)->nullable();
$table->string('teller', 20)->nullable();
$table->string('nota', 100)->nullable();
$table->decimal('pembiayaan', 11)->nullable()->comment('Pembiayaan amount');
$table->decimal('nilaimarhun', 11)->nullable()->comment('Nilai marhun amount');
$table->double('jbg', 4, 2)->nullable()->comment('JBG value');
$table->decimal('untung', 11)->nullable()->comment('Untung amount');
$table->decimal('untungonepercent', 11)->nullable()->comment('Satu Persen amount');
$table->decimal('untungcajlain', 11)->nullable()->comment('Caj Lain-Lain amount');
$table->string('jenis', 50)->nullable()->comment('Jenis/Type classification');
$table->unsignedSmallInteger('status')->default(0)->comment('Status value');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('palsu');
}
}
@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePampasanTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('pampasan', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('norujukan', 50)->unique();
$table->string('baucerno', 30)->index();
$table->string('kodcaw', 20)->index();
$table->decimal('jumlah_pampasan', 11);
$table->json('denominasi')->nullable();
$table->string('teller', 100);
$table->tinyInteger('status')->default(0)->comment('0 = belum dituntut, 1 = dituntut');
$table->timestamps();
$table->timestamp('agreement_printed_at')->nullable()->comment('Timestamp when agreement was printed');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('pampasan');
}
}
@@ -0,0 +1,42 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePanjarTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('panjar', function (Blueprint $table) {
$table->integer('recno');
$table->date('tarikh')->nullable();
$table->string('deskripsi', 100)->nullable();
$table->decimal('bayaran', 11)->nullable();
$table->longText('nota')->nullable();
$table->integer('tag')->nullable();
$table->string('kategori', 40)->nullable();
$table->string('nama', 40);
$table->string('id', 40)->nullable();
$table->decimal('bakiperubatan', 11)->nullable();
$table->string('nobaucer', 15)->nullable();
$table->integer('nobil')->nullable();
$table->string('tuntutoleh', 40)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('panjar');
}
}
@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePekerjaanTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('pekerjaan', function (Blueprint $table) {
$table->string('kodkerja', 2)->nullable();
$table->string('keterangan', 30)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('pekerjaan');
}
}
@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePembeliTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('pembeli', function (Blueprint $table) {
$table->integer('nopembeli');
$table->string('nokp', 14)->nullable();
$table->string('nama', 100)->nullable();
$table->string('alamat1', 300)->nullable();
$table->string('alamat2', 40)->nullable();
$table->string('alamat3', 40)->nullable();
$table->string('alamat4', 20)->nullable();
$table->string('telefon', 20)->nullable();
$table->integer('tag_syarikat')->nullable()->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('pembeli');
}
}
@@ -0,0 +1,61 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePembiayaanOnlineTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('pembiayaan_online', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('norujukan', 50)->index();
$table->string('nokp', 20);
$table->string('nopelanggan', 50)->nullable();
$table->string('nama_pelanggan', 150)->nullable();
$table->string('kodcaw', 20);
$table->decimal('pinjaman', 12);
$table->string('kodbank', 20)->nullable();
$table->string('nama_bank', 100)->nullable();
$table->string('noakaun', 50)->nullable();
$table->string('nama_akaun', 150)->nullable();
$table->unsignedBigInteger('bukti_akaun_file_id')->nullable();
$table->unsignedBigInteger('borang_file_id')->nullable();
$table->string('status', 30)->default('PENDING_PC');
$table->text('reject_reason')->nullable();
$table->string('rejected_by', 100)->nullable();
$table->timestamp('rejected_at')->nullable();
$table->unsignedBigInteger('batch_id')->nullable()->index();
$table->unsignedBigInteger('bukti_file_id')->nullable();
$table->string('no_rujukan_bayaran', 100)->nullable();
$table->date('tarikh_bayaran')->nullable();
$table->timestamp('paid_at')->nullable();
$table->string('created_by', 100)->nullable();
$table->string('pc_submitted_by', 100)->nullable();
$table->string('pc_verified_by', 100)->nullable();
$table->timestamp('pc_verified_at')->nullable();
$table->string('ops_by', 100)->nullable();
$table->text('nota')->nullable();
$table->tinyInteger('blast_sent')->default(0);
$table->timestamps();
$table->index(['kodcaw', 'status']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('pembiayaan_online');
}
}
@@ -0,0 +1,98 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePeratusanTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('peratusan', function (Blueprint $table) {
$table->string('kodcaw', 10)->nullable();
$table->date('tarikhawal')->nullable();
$table->date('tarikhakhir')->nullable();
$table->decimal('upah', 11)->nullable();
$table->decimal('gadai', 11)->nullable();
$table->decimal('tebus', 11)->nullable();
$table->decimal('bakipb', 11)->nullable();
$table->decimal('nmgad', 9)->nullable();
$table->decimal('nmteb', 9)->nullable();
$table->integer('statgad')->nullable();
$table->integer('statteb')->nullable();
$table->integer('statpel')->nullable();
$table->decimal('per', 9)->nullable();
$table->integer('bilper')->nullable();
$table->integer('perbilper')->nullable();
$table->decimal('pinj', 9)->nullable();
$table->integer('perpinj')->nullable();
$table->decimal('nm', 9)->nullable();
$table->decimal('overpinj', 9)->nullable();
$table->decimal('pinjover', 9)->nullable();
$table->integer('bilpinjover')->nullable();
$table->decimal('nmover', 9)->nullable();
$table->decimal('berat14', 7)->nullable();
$table->decimal('nm14', 9)->nullable();
$table->decimal('nms14', 9)->nullable();
$table->decimal('beratm14', 7)->nullable();
$table->decimal('nmsm14', 9)->nullable();
$table->decimal('berat18', 7, 1)->nullable();
$table->decimal('nm18', 9)->nullable();
$table->decimal('nms18', 9)->nullable();
$table->decimal('beratm18', 7)->nullable();
$table->decimal('nmsm18', 9)->nullable();
$table->decimal('berat20', 7)->nullable();
$table->decimal('nm20', 9)->nullable();
$table->decimal('nms20', 9)->nullable();
$table->decimal('beratm20', 7)->nullable();
$table->decimal('nmsm20', 9)->nullable();
$table->decimal('berat21', 7)->nullable();
$table->decimal('nm21', 9)->nullable();
$table->decimal('nms21', 9)->nullable();
$table->decimal('beratm21', 7)->nullable();
$table->decimal('nmsm21', 9)->nullable();
$table->decimal('berat22', 7)->nullable();
$table->decimal('nm22', 9)->nullable();
$table->decimal('nms22', 9)->nullable();
$table->decimal('beratm22', 7)->nullable();
$table->decimal('nmsm22', 9)->nullable();
$table->decimal('berat23', 7)->nullable();
$table->decimal('nm23', 9)->nullable();
$table->decimal('nms23', 9)->nullable();
$table->decimal('beratm23', 7)->nullable();
$table->decimal('nmsm23', 9)->nullable();
$table->decimal('berat24', 7)->nullable();
$table->decimal('nm24', 9)->nullable();
$table->decimal('nms24', 9)->nullable();
$table->decimal('beratm24', 7)->nullable();
$table->decimal('nmsm24', 9)->nullable();
$table->decimal('jumberat', 7)->nullable();
$table->decimal('jumnm', 9)->nullable();
$table->decimal('jumnms', 9)->nullable();
$table->decimal('jumberatm', 7)->nullable();
$table->decimal('jumnmsm', 9)->nullable();
$table->decimal('bezarm', 10)->nullable();
$table->decimal('bezaper', 3)->nullable();
$table->decimal('jumberath', 11)->nullable();
$table->decimal('jumnmh', 11)->nullable();
$table->decimal('jumnmsh', 11)->nullable();
$table->decimal('jumberatb', 11)->nullable();
$table->decimal('jumnmsb', 11)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('peratusan');
}
}
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePolisTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('polis', function (Blueprint $table) {
$table->date('tarikh')->nullable();
$table->string('kodcaw', 10)->nullable();
$table->string('norujukan', 20)->nullable();
$table->string('komen1', 30)->nullable();
$table->string('komen2', 30)->nullable();
$table->tinyInteger('tebus')->nullable();
$table->integer('recno');
$table->string('teller', 100)->nullable();
$table->decimal('caj', 9)->default(0);
$table->string('kodnegeri', 3)->nullable();
$table->string('koddaerah', 3)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('polis');
}
}
@@ -0,0 +1,89 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProductTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('product', function (Blueprint $table) {
$table->string('prkod', 2);
$table->string('database', 8)->nullable();
$table->string('keterangan', 20)->nullable();
$table->integer('tempoh')->nullable();
$table->integer('tempohmax')->nullable();
$table->decimal('pinjaman', 7)->nullable();
$table->decimal('pinjaman2', 7)->nullable();
$table->decimal('marginmin', 5)->nullable();
$table->decimal('marginmax', 5)->nullable();
$table->decimal('marginansur', 7)->nullable();
$table->string('laporan', 40)->nullable();
$table->integer('lanjut1')->nullable();
$table->integer('lanjut2')->nullable();
$table->integer('matang')->nullable();
$table->integer('notis1')->nullable();
$table->integer('notis2')->nullable();
$table->integer('notis3')->nullable();
$table->tinyInteger('nt1')->nullable();
$table->tinyInteger('nt2')->nullable();
$table->tinyInteger('nt3')->nullable();
$table->tinyInteger('nt1a')->nullable();
$table->tinyInteger('nt2a')->nullable();
$table->tinyInteger('nt3a')->nullable();
$table->decimal('cajnotis3', 5)->nullable();
$table->decimal('cajnotis', 5)->nullable();
$table->integer('sks1')->nullable();
$table->integer('sks2')->nullable();
$table->integer('sks3')->nullable();
$table->integer('sks4')->nullable();
$table->integer('sks5')->nullable();
$table->integer('sks6')->nullable();
$table->tinyInteger('sks1n')->nullable();
$table->tinyInteger('sks2n')->nullable();
$table->tinyInteger('sks3n')->nullable();
$table->tinyInteger('sks4n')->nullable();
$table->tinyInteger('sks5n')->nullable();
$table->tinyInteger('sks6n')->nullable();
$table->string('pkadarupah', 1)->nullable();
$table->integer('hari')->nullable();
$table->string('kodgl', 15)->nullable();
$table->string('glcode', 15)->nullable();
$table->string('glcodebk', 15)->nullable();
$table->string('glcode_up', 15)->nullable();
$table->string('glcode_kc', 15)->nullable();
$table->string('glcode_cn', 15)->nullable();
$table->string('glcode_cl', 15)->nullable();
$table->string('glcode_hk', 15)->nullable();
$table->string('glcode_sc', 15)->nullable();
$table->string('glcode_up_jmc', 10)->default('5000/016');
$table->string('pilihtempoh', 1)->default('0');
$table->integer('harisebulan')->default(0);
$table->integer('hari15')->default(0);
$table->tinyInteger('jenisansur')->nullable();
$table->dateTime('tarikh')->nullable();
$table->string('gl_phk', 10)->nullable();
$table->string('gl_bp', 10)->nullable();
$table->string('gl_belumbp', 10)->nullable();
$table->string('glcode_upxtra', 15);
$table->string('glcode_clxtra', 15);
$table->string('glpd_xtra', 15);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('product');
}
}
@@ -0,0 +1,61 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSimulasiLelongTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('simulasi_lelong', function (Blueprint $table) {
$table->integer('recNo');
$table->smallInteger('BatchNo')->nullable()->default(0);
$table->integer('SiriLel')->nullable()->default(0);
$table->string('KodCaw', 3)->nullable();
$table->string('NoRujukan', 20)->nullable();
$table->date('T_Lelong')->nullable();
$table->decimal('HargaAsas', 9)->nullable()->default(0);
$table->decimal('HargaJual', 9)->nullable()->default(0);
$table->date('T_Jual')->nullable();
$table->integer('NoPembeli')->nullable()->default(0);
$table->decimal('Jbg', 7)->nullable()->default(0);
$table->decimal('KadarUpah', 5)->nullable()->default(0);
$table->decimal('NilaiMarhun', 9)->nullable()->default(0);
$table->decimal('NilaiMarhunS', 9)->default(0);
$table->decimal('Pinjaman', 9)->nullable()->default(0);
$table->decimal('BakiUpah', 7)->nullable()->default(0);
$table->decimal('CajLain', 7)->nullable()->default(0);
$table->decimal('CajLelong', 7)->nullable()->default(0);
$table->decimal('Baki', 9)->nullable()->default(0);
$table->string('Terima', 1)->nullable();
$table->tinyInteger('Cetak')->nullable()->default(0);
$table->string('Teller', 7)->nullable();
$table->string('Pelulus', 7)->nullable();
$table->tinyInteger('TagSurat')->nullable()->default(0);
$table->date('TrkhTuntut')->nullable();
$table->decimal('Berat', 7)->nullable()->default(0);
$table->string('Marhun', 30)->nullable();
$table->decimal('percent', 9)->default(0);
$table->decimal('turun', 11)->default(0);
$table->decimal('hargalama', 11)->default(0);
$table->string('mutu_terendah', 4);
$table->decimal('harga_baru', 11)->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('simulasi_lelong');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit10Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit10', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit10');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit11Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit11', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit11');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit12Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit12', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit12');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit1Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit1', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit1');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit2Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit2', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit2');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit3Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit3', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit3');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit4Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit4', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit4');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit5Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit5', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit5');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit6Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit6', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit6');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit7Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit7', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit7');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit8Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit8', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit8');
}
}
@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStokaudit9Table extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('stokaudit9', function (Blueprint $table) {
$table->integer('id');
$table->integer('tahun')->nullable();
$table->integer('bulan')->nullable();
$table->string('norujukan', 199)->nullable();
$table->decimal('tempoh', 9)->nullable();
$table->string('nokp', 199)->nullable();
$table->decimal('berat', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->nullable();
$table->decimal('kadarupah', 9)->nullable();
$table->decimal('tempohblmbyar', 9)->nullable();
$table->decimal('upahblmbyar', 9)->nullable();
$table->integer('lanjutan')->nullable();
$table->decimal('utgonepercent', 9);
$table->decimal('ujrah', 9);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('stokaudit9');
}
}
@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTangguhlelongTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('tangguhlelong', function (Blueprint $table) {
$table->integer('recno');
$table->smallInteger('batchno')->nullable();
$table->string('norujukan', 20)->nullable();
$table->date('tarikhtangguh')->nullable();
$table->string('nota', 30)->nullable();
$table->decimal('pinjaman', 11)->nullable();
$table->decimal('percentpinj', 9)->nullable();
$table->integer('jbg')->nullable();
$table->decimal('berat', 7)->nullable();
$table->integer('fasa')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('tangguhlelong');
}
}
@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTarafTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('taraf', function (Blueprint $table) {
$table->string('taraf', 2)->nullable();
$table->string('keterangan', 25)->nullable();
$table->decimal('pinjmax', 5)->nullable();
$table->decimal('limittunait', 9)->nullable();
$table->decimal('limittunaip', 9)->nullable();
$table->decimal('maxpinjmohon', 9)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('taraf');
}
}
@@ -0,0 +1,86 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTebusTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('tebus', function (Blueprint $table) {
$table->integer('sirit');
$table->string('kodcaw', 10)->nullable();
$table->string('norujukan', 20)->nullable();
$table->string('nopelanggan', 12)->nullable();
$table->string('jenisbyr', 2)->nullable();
$table->string('jenistebus', 1)->nullable();
$table->string('jeniscek', 2)->nullable();
$table->string('bankcode', 4)->nullable();
$table->string('nocek', 20)->nullable();
$table->decimal('cajcek', 5)->nullable()->default(0);
$table->string('glcode', 15)->nullable();
$table->date('t_jangka')->nullable();
$table->date('t_lunas')->nullable();
$table->date('t_tendang')->nullable();
$table->date('t_tebus')->nullable();
$table->decimal('jbg', 7)->nullable();
$table->decimal('kadarupah', 5)->nullable();
$table->decimal('upahsimpan', 7)->nullable();
$table->decimal('ansuran', 9)->nullable();
$table->decimal('nilaimarhun', 9)->nullable();
$table->decimal('addpinjaman', 7)->nullable();
$table->decimal('pinjaman', 9)->nullable();
$table->decimal('bakipjm', 9)->default(0);
$table->decimal('bakiupah', 7)->nullable();
$table->decimal('cajlain', 7)->nullable()->default(0);
$table->string('terima', 1)->nullable();
$table->integer('cetak')->nullable();
$table->string('teller', 100)->nullable();
$table->string('pelulus', 7)->nullable();
$table->string('pelulust', 7)->nullable();
$table->string('f_lulus', 1)->nullable();
$table->integer('nowakil')->nullable();
$table->string('prkod', 2)->nullable();
$table->string('cancelid', 7)->nullable();
$table->time('canceltime')->nullable();
$table->string('kodgl', 15)->nullable();
$table->decimal('upahasal', 7)->nullable()->default(0);
$table->string('nota', 30)->nullable();
$table->decimal('rebate', 7)->nullable();
$table->string('marhuntebus', 80)->nullable();
$table->tinyInteger('tiada')->nullable()->default(0);
$table->decimal('gantirugi', 9)->nullable()->default(0);
$table->date('trkhupah')->nullable();
$table->integer('tagterima')->nullable()->default(0);
$table->string('hubungan', 10)->nullable();
$table->decimal('upahpercuma', 11)->nullable();
$table->decimal('upahdibayar', 11)->default(0);
$table->string('historygadaian', 20)->nullable();
$table->decimal('pinjamanterkini', 11)->nullable();
$table->decimal('bayaranpampasan', 9)->nullable();
$table->decimal('byrnonline', 9)->nullable();
$table->decimal('byrnlebih', 9)->nullable();
$table->decimal('byrnkurang', 9)->nullable();
$table->date('tarikhbyrn')->nullable();
$table->decimal('ujrah', 9);
$table->decimal('onepercent', 9);
$table->decimal('diskaun_rebate', 12)->nullable()->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('tebus');
}
}
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTunaiTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('tunai', function (Blueprint $table) {
$table->date('tarikh')->nullable();
$table->string('kodcaw', 10)->nullable();
$table->string('kodlaluan', 100)->nullable();
$table->decimal('bakiawal', 11)->default(0);
$table->decimal('masuk', 11)->default(0);
$table->decimal('yuran', 7)->default(0);
$table->decimal('keluar', 11)->default(0);
$table->decimal('baki', 11)->default(0);
$table->decimal('tambah', 11)->default(0);
$table->decimal('kurang', 11)->default(0);
$table->integer('recno');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('tunai');
}
}
@@ -0,0 +1,51 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTuntutbakiTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('tuntutbaki', function (Blueprint $table) {
$table->integer('recno');
$table->integer('batchno')->nullable()->default(0);
$table->string('jenis', 1)->nullable();
$table->string('kodcaw', 10)->nullable();
$table->string('norujukan', 20)->nullable();
$table->date('tarikh')->nullable();
$table->string('prkod', 2)->nullable();
$table->string('teller', 100)->nullable();
$table->string('pelulus', 20)->nullable();
$table->decimal('bakipjm', 9)->default(0);
$table->decimal('bakiupah', 7)->default(0);
$table->decimal('cajlain', 7)->default(0);
$table->decimal('cajlelong', 7)->default(0);
$table->string('kodgl', 15)->nullable();
$table->string('glcode', 15)->nullable();
$table->string('terima', 1)->nullable();
$table->string('f_lulus', 1)->nullable();
$table->decimal('jumlah', 7)->default(0);
$table->integer('nowakil')->default(0);
$table->decimal('hargajual', 9)->default(0);
$table->decimal('gst_cl', 9)->nullable()->default(0);
$table->decimal('gst_hj', 9)->nullable()->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('tuntutbaki');
}
}
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUgamaTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('ugama', function (Blueprint $table) {
$table->string('kodugama', 2)->nullable();
$table->string('keterangan', 15)->nullable();
$table->integer('recno')->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('ugama');
}
}
@@ -0,0 +1,49 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUpdateserverTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('updateserver', function (Blueprint $table) {
$table->date('tarikh')->nullable();
$table->decimal('gadai', 11)->nullable();
$table->decimal('bajetgadai', 11)->default(0);
$table->decimal('variansgadai', 11)->default(0);
$table->decimal('tebus', 11)->nullable();
$table->decimal('bajettebus', 11)->default(0);
$table->decimal('varianstebus', 11)->default(0);
$table->decimal('upah', 11)->nullable();
$table->decimal('upahbajet', 11)->default(0);
$table->decimal('variansupah', 11)->default(0);
$table->decimal('pinjamangadai', 11)->nullable();
$table->integer('customerbaru')->nullable();
$table->decimal('bakipetibesi', 11)->nullable();
$table->decimal('nilaimarhuntotal', 11)->nullable();
$table->decimal('vgadai', 11)->nullable();
$table->decimal('vtebus', 11)->nullable();
$table->decimal('vupah', 11)->nullable();
$table->decimal('vsumgadai', 11)->nullable();
$table->decimal('vsumtebus', 11)->nullable();
$table->decimal('vsumupah', 11)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('updateserver');
}
}
@@ -0,0 +1,53 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateVaultTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('vault', function (Blueprint $table) {
$table->string('kodcaw', 10)->nullable();
$table->date('tarikh')->nullable();
$table->decimal('bakiawal', 11)->default(0);
$table->decimal('keluar', 11)->default(0);
$table->decimal('masuk', 11)->default(0);
$table->decimal('bakiakhir', 11)->default(0);
$table->decimal('bakieod', 11)->default(0);
$table->integer('recno');
$table->decimal('pendahuluan', 11)->default(0);
$table->decimal('serahan', 11)->default(0);
$table->integer('1sen')->default(0);
$table->integer('5sen')->default(0);
$table->integer('10sen')->default(0);
$table->integer('20sen')->default(0);
$table->integer('50sen')->default(0);
$table->integer('rm1')->default(0);
$table->integer('rm2')->default(0);
$table->integer('rm5')->default(0);
$table->integer('rm10')->default(0);
$table->integer('rm20')->default(0);
$table->integer('rm50')->default(0);
$table->integer('rm100')->default(0);
$table->integer('rm1000')->default(0);
$table->decimal('totpanjar', 11)->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('vault');
}
}
@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateWakilSuratTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('mysql2')->create('wakil_surat', function (Blueprint $table) {
$table->unsignedBigInteger('id');
$table->string('nosiri')->nullable();
$table->string('no_surat')->nullable();
$table->string('norujukan')->nullable();
$table->string('t_cetak')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('mysql2')->dropIfExists('wakil_surat');
}
}

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