499 lines
18 KiB
PHP
499 lines
18 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\PaymentRequest;
|
|
use App\Models\CompanyStatus;
|
|
use App\Models\PersonalCarts;
|
|
use App\Models\TransactionOnlineStatus;
|
|
use App\Services\BillplzService;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Client\Pool;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Money\Money;
|
|
use App\Services\OnlineTransactionLoggerService;
|
|
use Illuminate\Support\Facades\Session;
|
|
|
|
class BayaranController extends Controller
|
|
{
|
|
public $CallableHttp;
|
|
|
|
public function PembayaranAction(PaymentRequest $request)
|
|
{
|
|
|
|
$exist_carts = $this->checkCarts();
|
|
$exist_carts = optional($exist_carts)->toArray();
|
|
|
|
if($exist_carts){
|
|
/* Do Have Carts. */
|
|
$list_pkb = json_decode($exist_carts['list_pkb'],true);
|
|
$list_koop = json_decode($exist_carts['list_koop'],true);
|
|
|
|
if($exist_carts['status_pkb'] == 'PENDING') $list_pkb = ($list_pkb) ? $this->setUpahTawarruq($list_pkb) : []; else $list_pkb = [];
|
|
if($exist_carts['status_koop'] == 'PENDING') $list_koop = ($list_koop) ? $this->setUpahTawarruq($list_koop) : []; else $list_koop = [];
|
|
|
|
}else{
|
|
/* Doesn't Have Carts. First Timer */
|
|
$request->validated();
|
|
|
|
$arraybayar = $this->setUpahTawarruq($request->getPembiayaanFromNorujukan());
|
|
|
|
$list_pkb = array_filter(array_map(function ($x){
|
|
return ($x['tag_syarikat'] == CompanyStatus::COM_PKB) ? $x : null;
|
|
},$arraybayar));
|
|
|
|
$list_koop = array_filter(array_map(function ($x){
|
|
return ($x['tag_syarikat'] == CompanyStatus::COM_KOOPPKB) ? $x : null;
|
|
},$arraybayar));
|
|
|
|
$personal_carts = new PersonalCarts();
|
|
$personal_carts->ic_no = Auth::user()->icno;
|
|
$personal_carts->list_koop = json_encode($list_koop);
|
|
$personal_carts->list_pkb = json_encode($list_pkb);
|
|
$personal_carts->status_pkb = ($list_pkb) ? 'PENDING' : 'NONE';
|
|
$personal_carts->status_koop = ($list_koop) ? 'PENDING' : 'NONE';
|
|
$personal_carts->user_id = Auth::user()->id;
|
|
$personal_carts->save();
|
|
}
|
|
|
|
return view('includes.bayaran.pembayaransag', compact('list_pkb','list_koop'));
|
|
}
|
|
|
|
public function PembayaranEngine(Request $request)
|
|
{
|
|
['email' => $customerEmail, 'notel' => $customerPhoneNumber, 'name' => $customerName, 'icno' => $customerIcno] = auth()->user()->toArray();
|
|
|
|
$bayaranArrahn = array_filter($request->txtjenisbayaran, fn($x) => $x == 'arrahn');
|
|
$bayaranOthers = array_filter($request->txtjenisbayaran, fn($x) => $x != 'arrahn');
|
|
|
|
$bayaranArrahnArray = array_map(function ($x) use ($customerName, $customerIcno, $request) {
|
|
return [
|
|
'customer_name' => $customerName,
|
|
'nokp' => $customerIcno,
|
|
'kodcaw' => $request->txtkodcawhidden[$x],
|
|
'norujukan' => $request->txtnorujukanhidden[$x],
|
|
'bayaran' => round($request->txtbayaranhidden[$x], 1),
|
|
'txtjbghidden' => $request->txtjbghidden[$x],
|
|
'txtupahhidden' => $request->txtupahhidden[$x],
|
|
];
|
|
}, array_keys($bayaranArrahn));
|
|
|
|
$bayaranOthersArray = array_map(function ($x) use ($customerName, $customerIcno, $request) {
|
|
return [
|
|
'customer_name' => $customerName,
|
|
'nokp' => $customerIcno,
|
|
'kodcaw' => $request->txtkodcawhidden[$x],
|
|
'norujukan' => $request->txtnorujukanhidden[$x],
|
|
'bayaran' => round($request->txtbayaranhidden[$x], 1),
|
|
];
|
|
}, array_keys($bayaranOthers));
|
|
|
|
$paymentArray = array_merge($bayaranArrahnArray, $bayaranOthersArray);
|
|
|
|
$getPaymentSum = function () use ($paymentArray) {
|
|
$billPlzTransactionFee = Money::MYR(100);
|
|
$sum = fn() => array_reduce($paymentArray, fn($accumulator, $currentItem) => $accumulator + $currentItem['bayaran'], 0) * 100;
|
|
return Money::MYR($sum())->add($billPlzTransactionFee);
|
|
};
|
|
|
|
$company = strtoupper($request->txtcompany);
|
|
$billplzService = new BillplzService($company);
|
|
$bill = $billplzService->createBill([$customerEmail, $customerPhoneNumber, $customerName, $getPaymentSum()],$company);
|
|
|
|
Session::put('company', $company);
|
|
$this->serviceCallHttp($company);
|
|
|
|
$isRecordTransactionSuccess = $this->recordTransaction($paymentArray, $bill,$company);
|
|
|
|
if ($isRecordTransactionSuccess) {
|
|
session([
|
|
'array_payment' => $paymentArray,
|
|
'payment_method' => 'login',
|
|
]);
|
|
|
|
return redirect($bill['url'] . '?auto_submit=true');
|
|
}
|
|
}
|
|
|
|
public function recordTransaction($paymentArray, $bill,$company = 'PKB')
|
|
{
|
|
['name' => $customerName, 'icno' => $customerIcno] = auth()->user()->toArray();
|
|
|
|
$getlatestNoSiri = function () {
|
|
$previous_siri = $this->CallableHttp->get('/api/online/transaction')->json();
|
|
if ($previous_siri) {
|
|
return $previous_siri['nosiri'] + 1;
|
|
} else {
|
|
return 1;
|
|
}
|
|
};
|
|
|
|
$generateTransactionReferenceNumber = function () use ($getlatestNoSiri) {
|
|
[$day, $month, $year] = [now()->day, now()->month, now()->format('y')];
|
|
|
|
return 'APKB' . $day . $month . $year . sprintf('%08d', $getlatestNoSiri());
|
|
};
|
|
|
|
$serviceCallable = $company == 'PKB'
|
|
? fn(Pool $pool) => $pool->arrahn()
|
|
: fn(Pool $pool) => $pool->arrahn_koop();
|
|
try {
|
|
Http::pool(
|
|
fn(Pool $pool) => collect($paymentArray)->map(
|
|
fn($payment) => $serviceCallable($pool)->post('/api/online/transaction', [
|
|
'nokp' => $customerIcno,
|
|
'reference_no' => $generateTransactionReferenceNumber(),
|
|
'nosiri' => $getlatestNoSiri(),
|
|
'billplz_id' => $bill['id'],
|
|
'norujukan' => $payment['norujukan'],
|
|
'kodcaw' => $payment['kodcaw'],
|
|
'total_payment' => $payment['bayaran'],
|
|
'customer_name' => $customerName,
|
|
'jenisbayaran' => 'A',
|
|
]),
|
|
),
|
|
);
|
|
|
|
OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, 1, TransactionOnlineStatus::INITIALIZED_TRANSACTION);
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, $e->getMessage(), TransactionOnlineStatus::INITIALIZED_TRANSACTION);
|
|
|
|
throw $e;
|
|
}
|
|
|
|
try {
|
|
$response = $this->CallableHttp
|
|
->put('/api/transaction/online/tagportal', [
|
|
'billplz_id' => $bill['id'],
|
|
])
|
|
->json();
|
|
|
|
OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, $response, TransactionOnlineStatus::UPDATED_TAG_PORTAL);
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
OnlineTransactionLoggerService::logs($bill['id'], $paymentArray, $e->getMessage(), TransactionOnlineStatus::UPDATED_TAG_PORTAL);
|
|
|
|
throw $e;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function ResitBayaran(Request $request)
|
|
{
|
|
$this->serviceCallHttp(Session::get('company'));
|
|
$payment_details = $request->payment;
|
|
|
|
$kpbaru = Auth::User()->icno;
|
|
|
|
$customer = $this->CallableHttp
|
|
->get('/api/customers/' . $kpbaru)
|
|
->json();
|
|
$customer_details = $customer;
|
|
|
|
$current = Carbon::now();
|
|
$current = new Carbon();
|
|
$date = $current->toDateTimeString();
|
|
|
|
$cawangan_info = $this->CallableHttp
|
|
->get('/api/cawangan/' . $payment_details['kodcaw'])
|
|
->json();
|
|
$cawangan = $this->CallableHttp
|
|
->get('/api/cawangan/detail/' . $payment_details['kodcaw'])
|
|
->json();
|
|
$cawangan_detail = $cawangan[0];
|
|
$nama_cawangan = $cawangan_info['details_caw'];
|
|
|
|
$gadai_details = $this->CallableHttp
|
|
->get('/api/gadai/norujukan/' . $payment_details['norujukan'])
|
|
->json();
|
|
$gadai = $gadai_details[0][0];
|
|
|
|
return view('pembayaran.resit.resitportal', compact('customer_details', 'payment_details', 'cawangan_detail', 'nama_cawangan', 'gadai'));
|
|
}
|
|
|
|
public function callback(Request $request)
|
|
{
|
|
$billplzService = new BillplzService(Session::get('company'));
|
|
$data = $billplzService->webhook($request->toArray());
|
|
|
|
$isBillUnpaid = $data['paid'] !== true;
|
|
|
|
if ($isBillUnpaid) {
|
|
$this->CallableHttp->put('/api/online/transaction', [
|
|
'billplz_id' => $data['id'],
|
|
'status' => 'UNSUCCESSFUL',
|
|
'paid_at' => null,
|
|
]);
|
|
|
|
return response(200);
|
|
}
|
|
|
|
$this->CallableHttp->put('/api/online/transaction', [
|
|
'billplz_id' => $data['id'],
|
|
'status' => 'PAID',
|
|
'paid_at' => $data['paid_at']->format('Y-m-d H:i:s'),
|
|
]);
|
|
|
|
$column_updated = (Session::get('company') == 'PKB') ? 'status_pkb' : 'status_koop';
|
|
$value_paid = 'PAID';
|
|
|
|
$exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno)
|
|
->where('user_id', Auth::user()->id)
|
|
->where(function ($query) {
|
|
$query->where('status_pkb', 'PENDING')
|
|
->orWhere('status_koop', 'PENDING');
|
|
})
|
|
->update([
|
|
$column_updated => $value_paid,
|
|
]);
|
|
|
|
return response(200);
|
|
}
|
|
|
|
public function response(Request $request)
|
|
{
|
|
$billplzService = new BillplzService(Session::get('company'));
|
|
$data = $billplzService->redirect($request->toArray());
|
|
$this->serviceCallHttp($billplzService->company);
|
|
$isBillUnpaid = $data['paid'] !== true;
|
|
|
|
if ($isBillUnpaid) {
|
|
$this->CallableHttp->put('/api/online/transaction', [
|
|
'billplz_id' => $data['id'],
|
|
'status' => 'UNSUCCESSFUL',
|
|
'paid_at' => null,
|
|
]);
|
|
|
|
$transactionOnline = $this->CallableHttp
|
|
->get('/api/transaction/online/login', [
|
|
'billplz_id' => $data['id'],
|
|
])
|
|
->json();
|
|
|
|
return redirect()->route('pay.failed');
|
|
}
|
|
|
|
$this->CallableHttp->put('/api/online/transaction', [
|
|
'billplz_id' => $data['id'],
|
|
'status' => 'PAID',
|
|
'paid_at' => $data['paid_at']->format('Y-m-d H:i:s'),
|
|
]);
|
|
|
|
$column_updated = (Session::get('company') == 'PKB') ? 'status_pkb' : 'status_koop';
|
|
$value_paid = 'PAID';
|
|
$column_payment_updated = (Session::get('company') == 'PKB') ? 'payment_pkb' : 'payment_koop';
|
|
|
|
$transactionOnline = $this->CallableHttp
|
|
->get('/api/transaction/online/login', [
|
|
'billplz_id' => $data['id'],
|
|
])
|
|
->json();
|
|
|
|
$exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno)
|
|
->where('user_id', Auth::user()->id)
|
|
->where(function ($query) {
|
|
$query->where('status_pkb', 'PENDING')
|
|
->orWhere('status_koop', 'PENDING');
|
|
})
|
|
->update([
|
|
$column_updated => $value_paid,
|
|
$column_payment_updated => json_encode($transactionOnline)
|
|
]);
|
|
|
|
return redirect()->route('pay.success', [
|
|
'transactionOnline' => $transactionOnline,
|
|
]);
|
|
}
|
|
|
|
public function successPayment(Request $request)
|
|
{
|
|
$this->serviceCallHttp(Session::get('company'));
|
|
$transactionOnline = $request->transactionOnline;
|
|
|
|
$exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno)
|
|
->where('user_id', Auth::user()->id)
|
|
->where(function ($query) {
|
|
$query->where('status_pkb', 'PENDING')
|
|
->orWhere('status_koop', 'PENDING');
|
|
})
|
|
->first();
|
|
|
|
$exist_carts = optional($exist_carts)->toArray();
|
|
|
|
if(!$exist_carts){
|
|
$paid_carts = PersonalCarts::where('ic_no', Auth::user()->icno)
|
|
->where('user_id', Auth::user()->id)
|
|
->where(function ($query) {
|
|
$query->where('status_pkb', 'PAID')
|
|
->where('status_koop', 'PAID');
|
|
})
|
|
->first();
|
|
$paid_carts = optional($paid_carts)->toArray();
|
|
if($paid_carts){
|
|
|
|
$trans_pkb = json_decode($paid_carts['payment_pkb'],true);
|
|
$trans_koop = json_decode($paid_carts['payment_koop'],true);
|
|
|
|
$trans_pkb = array_map(function ($item) {
|
|
$item['tag_syarikat'] = CompanyStatus::COM_PKB;
|
|
return $item;
|
|
}, $trans_pkb);
|
|
|
|
$trans_koop = array_map(function ($item) {
|
|
$item['tag_syarikat'] = CompanyStatus::COM_KOOPPKB;
|
|
return $item;
|
|
}, $trans_koop);
|
|
|
|
$transactionOnline = array_merge($trans_pkb,$trans_koop);
|
|
|
|
$arraycawangan = array_map(
|
|
fn($x) => $x['tag_syarikat'] == CompanyStatus::COM_PKB
|
|
? Http::arrahn()
|
|
->get('/api/cawangan/detail/' . $x['kodcaw'])
|
|
->json()[0]
|
|
: Http::arrahn_koop()
|
|
->get('/api/cawangan/detail/' . $x['kodcaw'])
|
|
->json()[0],
|
|
$transactionOnline
|
|
);
|
|
|
|
|
|
return view('pembayaran.result.berjayaportal', compact('transactionOnline', 'arraycawangan','exist_carts'));
|
|
}
|
|
}
|
|
|
|
$arraygadai = array_map(
|
|
fn($x) => $this->CallableHttp
|
|
->get('/api/gadai/norujukan/' . $x['norujukan'])
|
|
->json()[0][0],
|
|
$transactionOnline,
|
|
);
|
|
|
|
$arraycawangan = array_map(
|
|
fn($x) => $this->CallableHttp
|
|
->get('/api/cawangan/detail/' . $x['kodcaw'])
|
|
->json()[0],
|
|
$transactionOnline,
|
|
);
|
|
|
|
return view('pembayaran.result.berjayaportal', compact('transactionOnline', 'arraycawangan', 'arraygadai','exist_carts'));
|
|
}
|
|
|
|
public function failedPayment()
|
|
{
|
|
return view('pembayaran.result.gagalportal');
|
|
}
|
|
|
|
public function SenaraiPembayaran()
|
|
{
|
|
$api_url = config('api.url');
|
|
|
|
$arraysag = [];
|
|
|
|
$auth_user = Auth::user();
|
|
|
|
$belum_tebus = $this->CallableHttp
|
|
->get('/api/customers/' . $auth_user['icno'] . '/gadai/' . 'belum_tebus')
|
|
->json();
|
|
|
|
if (is_array($belum_tebus)) {
|
|
if (sizeof($belum_tebus) > 0) {
|
|
foreach ($belum_tebus as $index => $bt) {
|
|
foreach ($bt as $index1 => $bet) {
|
|
array_push($arraysag, $bet);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$belum_tebus = $arraysag;
|
|
|
|
return view('includes.bayaran.senaraibayaransag', compact('belum_tebus', 'api_url'));
|
|
}
|
|
|
|
private function setUpahTawarruq($pembiayaan)
|
|
{
|
|
$getJenisKeuntungan = function ($x) {
|
|
$jenisKeuntungan = [
|
|
'1' => 'onepercent',
|
|
'0' => 'asal',
|
|
];
|
|
|
|
return $jenisKeuntungan[$x['tagbaru']];
|
|
};
|
|
|
|
$getUpahTawarruqPerPembiayaan = function ($x) use ($getJenisKeuntungan) {
|
|
$jenisKeuntungan = $getJenisKeuntungan($x);
|
|
$CallableHttp = $x['tag_syarikat'] == CompanyStatus::COM_PKB
|
|
? Http::arrahn()
|
|
: Http::arrahn_koop();
|
|
|
|
$upahTawarruq = $CallableHttp
|
|
->get('/api/upahtawarruq/' . $x['kodcaw'] . '/' . $x['norujukan'], ['jeniskeuntungan' => $jenisKeuntungan])
|
|
->json();
|
|
|
|
if ($jenisKeuntungan == 'onepercent') {
|
|
$x['upah_tawarruq'] = $upahTawarruq['keuntungan'] + $upahTawarruq['ujrah'];
|
|
}
|
|
|
|
if ($jenisKeuntungan == 'asal') {
|
|
$x['upah_tawarruq'] = $upahTawarruq;
|
|
}
|
|
|
|
return $x;
|
|
};
|
|
|
|
return array_map($getUpahTawarruqPerPembiayaan, $pembiayaan);
|
|
}
|
|
|
|
public function checkCarts(){
|
|
$exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno)
|
|
->where('user_id', Auth::user()->id)
|
|
->where(function ($query) {
|
|
$query->where('status_pkb', 'PENDING')
|
|
->orWhere('status_koop', 'PENDING');
|
|
})
|
|
->first();
|
|
|
|
return $exist_carts;
|
|
}
|
|
|
|
public function UserCheckCarts(){
|
|
$exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno)
|
|
->where('user_id', Auth::user()->id)
|
|
->where(function ($query) {
|
|
$query->where('status_pkb', 'PENDING')
|
|
->orWhere('status_koop', 'PENDING');
|
|
})
|
|
->first();
|
|
|
|
return response()->json($exist_carts);
|
|
}
|
|
|
|
public function removeCarts(){
|
|
$exist_carts = PersonalCarts::where('ic_no', Auth::user()->icno)
|
|
->where('user_id', Auth::user()->id)
|
|
->first();
|
|
|
|
if ($exist_carts) {
|
|
$exist_carts->delete();
|
|
}
|
|
|
|
return response()->json($exist_carts);
|
|
}
|
|
|
|
public function serviceCallHttp($company){
|
|
$this->CallableHttp = $company == 'PKB'
|
|
? Http::arrahn()
|
|
: Http::arrahn_koop();
|
|
|
|
}
|
|
}
|