Files
admin-erahn/app/Http/Controllers/BillplzTransactionSummaryController.php
T
2025-04-27 10:58:23 +08:00

150 lines
5.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Carbon\Carbon;
use Illuminate\Support\Facades\Log;
class BillplzTransactionSummaryController extends Controller
{
public function index(Request $request)
{
$date = $request->selectedDate ?? Carbon::now()->toDateString();
$transactionDataPKB = collect( Http::arrahn()->get('/api/transaction/online/query', ['date' => $date, 'status' => 'paid'])->json() );
$transactionDataPKB = $transactionDataPKB->map(function($x){
$x['account_own_by'] = 'PKB';
return $x;
});
$transactionDataKOOP = collect( Http::arrahn_koop()->get('/api/transaction/online/query', ['date' => $date, 'status' => 'paid'])->json() );
$transactionDataKOOP = $transactionDataKOOP->map(function($x){
$x['account_own_by'] = 'KOOP';
return $x;
});
$transactionData = $transactionDataPKB->merge($transactionDataKOOP);
$transactionDataPKB = $this->processArrahnTransactions($transactionDataPKB);
$transactionDataKOOP = $this->processArrahnTransactions($transactionDataKOOP);
$transactionData = $this->processArrahnTransactions($transactionData);
$billIds = $transactionData->map(fn($x) => ['bill_id' => $x['bill_id'], 'account_own_by' => $x['account_own_by']]);
$billIds = $billIds->chunk(40);
$queryBillIdsURL = $billIds->map(fn($x) => url(config('api.url_arrahn_portal') . '/api/billplz', ['bill_ids' => json_encode($x)]));
$getBillplzPromise = function($url){
return Http::async()->get($url);
};
$resolveBillplzPromise = function($promise){
$billplzBillsPromise = $promise->wait()->json();
if($billplzBillsPromise->failed()) {
Log::error("ArrahnPay Portal API request failed for URL: {$$billplzBillsPromise->effectiveUri()->__toString()}", [
'status' => $billplzBillsPromise->status(),
'body' => $billplzBillsPromise->body(),
]);
abort( response('Portal ArrahnPay kemungkinan tidak beroperasi. Waktu Operasi Portal ArrahnPay adalah dari 7.30 AM hingga 11.30 PM', 503) );
}
return $billplzBillsPromise;
};
$queryBillIdsURL = $queryBillIdsURL->map(fn($x) => $getBillplzPromise($x))
->map(fn($x) => $resolveBillplzPromise($x));
dd($queryBillIdsURL->all());
$mergeBillplzResponse = function($externalArray) {
$merged = [];
foreach ($externalArray as $key => $subArray) {
foreach (['KOPKB', 'PKB'] as $type) {
if (!isset($merged[$type])) {
$merged[$type] = [];
}
$merged[$type] = array_merge($merged[$type], $subArray[$type]);
}
}
return array_map('array_values', $merged);
};
$billplzBillsResponse = $billIds->map(fn($x) => $getBillplzResponse($x));
$billplzBills = $mergeBillplzResponse($billplzBillsResponse);
$data = array_map(fn($x, $y) => $this->processBillplzBills($x, $y), $billplzBills, [$transactionDataKOOP, $transactionDataPKB]);
[$billPlzTransactionSummaryKOOP, $billPlzTransactionSummaryPKB] = $data;
return view('online.billplz-transaction-summary.index', compact('billPlzTransactionSummaryPKB' ,'billPlzTransactionSummaryKOOP', 'date'));
}
public function processArrahnTransactions($transactionData)
{
// Group transactionData by bill_id
$transactionData = $transactionData->groupBy(function($transaction) {
return $transaction['billplz_id'];
})->toArray();
$transactionData = array_map(fn($x) => ['arrahn_transactions' => $x], $transactionData);
$transactionData = array_map(function($x){
$x['bill_id'] = current($x['arrahn_transactions'])['billplz_id'];
$x['account_own_by'] = current($x['arrahn_transactions'])['account_own_by'];
return $x;
}, $transactionData);
$transactionData = collect($transactionData);
return $transactionData;
}
public function processBillplzBills($bills_group, $transactionData)
{
$bills_group = collect($bills_group)->map(function($bill) {
$bill['paid_amount_formatted'] = floatval($bill['paid_amount']['amount']) / 100;
return $bill;
});
$sumOfArrahnTransactions = $transactionData->sum(fn($x) => array_reduce($x['arrahn_transactions'], fn($carry, $item) => $carry + $item['total_payment'], 0));
$sumOfBillplzTransactions = collect($bills_group)->sum(fn($x) => $x['paid_amount_formatted']);
$numberOfArrahnTransactions = $transactionData->count();
$paymentGatewayCost = 'RM ' . number_format($sumOfBillplzTransactions - $sumOfArrahnTransactions, 2);
$sumOfArrahnTransactions = 'RM ' . number_format($sumOfArrahnTransactions, 2);
$sumOfBillplzTransactions = 'RM ' . number_format($sumOfBillplzTransactions, 2);
if ($transactionData->count() !== count($bills_group)) {
throw new \Exception("The number of items in transactionData and bills_group must be the same.");
}
$billPlzTransactionSummary = $transactionData->zip($bills_group)->map(function ($zippedItem) {
[$transactionData, $billplzBill] = $zippedItem;
$transactionData['billplz_bill'] = $billplzBill;
return $transactionData;
});
return[
'billPlzTransactionSummary' => $billPlzTransactionSummary,
'sumOfArrahnTransactions' => $sumOfArrahnTransactions,
'sumOfBillplzTransactions' => $sumOfBillplzTransactions,
'paymentGatewayCost' => $paymentGatewayCost,
'numberOfArrahnTransactions' => $numberOfArrahnTransactions,
];
}
}