mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/shipping-portal.git
synced 2026-08-25 23:44:03 +00:00
965dfb3098
# Conflicts: # app/Classes/Modules/Billplzs/ControllersLogic/CallbackBillplzLogic.php # app/Classes/ValueObjects/Constants/TransactionType.php # routes/web.php
157 lines
6.9 KiB
PHP
157 lines
6.9 KiB
PHP
<?php
|
|
|
|
namespace App\Classes\Modules\Billplzs\ControllersLogic;
|
|
|
|
use App\Classes\Modules\Orders\Processors\UpdateDoFromVTPortalProcessor;
|
|
use App\Classes\Modules\Orders\Processors\UpdateDoFromYDPortalProcessor;
|
|
|
|
use App\Classes\Exceptions\ResourceNotFoundException;
|
|
use App\Classes\Modules\Wallets\Services\UpdatesWalletBalance;
|
|
use App\Models\User;
|
|
use App\Models\Wallet;
|
|
use Illuminate\Http\Request;
|
|
use App\Classes\Exceptions\MalformedRequestException;
|
|
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
|
use App\Classes\Modules\Billplzs\Services\GetBillplzBill;
|
|
use App\Classes\Modules\Billplzs\DataTransferObjects\BillplzXSignatureObject;
|
|
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
|
|
use App\Classes\Modules\Transactions\Processors\CreatePaymentTransactionProcessor;
|
|
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
|
|
use App\Classes\ValueObjects\Constants\PaymentMethodType;
|
|
use App\Classes\ValueObjects\Constants\TransactionType;
|
|
use App\Models\Group;
|
|
use Illuminate\Support\Facades\App;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class CallbackBillplzLogic
|
|
{
|
|
/** @var GetBillplzBill */
|
|
private $getBillplzBill;
|
|
|
|
/** @var FetchesTransaction */
|
|
private $fetchesTransaction;
|
|
|
|
/** @var UpdatesTransactionStatus */
|
|
private $updatesTransactionStatus;
|
|
|
|
/** @var UpdateDoFromVTPortalProcessor */
|
|
private $updateDoFromVTPortalProcessor;
|
|
|
|
/** @var UpdateDoFromYDPortalProcessor */
|
|
private $updateDoFromYDPortalProcessor ;
|
|
|
|
/** @var UpdatesWalletBalance */
|
|
private $updatesWalletBalance;
|
|
|
|
/** @var CreatePaymentTransactionProcessor */
|
|
private $createPaymentTransactionProcessor;
|
|
|
|
/**
|
|
* CallbackBillplzLogic constructor.
|
|
* @param GetBillplzBill $getBillplzBill
|
|
* @param FetchesTransaction $fetchesTransaction
|
|
* @param UpdatesTransactionStatus $updatesTransactionStatus
|
|
* @param UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor
|
|
* @param UpdateDoFromYDPortalProcessor $updateDoFromYDPortalProcessor
|
|
* @param CreatePaymentTransactionProcessor $createPaymentTransactionProcessor
|
|
*/
|
|
public function __construct(GetBillplzBill $getBillplzBill, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor, UpdateDoFromYDPortalProcessor $updateDoFromYDPortalProcessor, UpdatesWalletBalance $updatesWalletBalance, CreatePaymentTransactionProcessor $createPaymentTransactionProcessor)
|
|
{
|
|
$this->getBillplzBill = $getBillplzBill;
|
|
$this->fetchesTransaction = $fetchesTransaction;
|
|
$this->updatesTransactionStatus = $updatesTransactionStatus;
|
|
$this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor;
|
|
$this->updateDoFromYDPortalProcessor = $updateDoFromYDPortalProcessor;
|
|
$this->updatesWalletBalance = $updatesWalletBalance;
|
|
$this->createPaymentTransactionProcessor = $createPaymentTransactionProcessor;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param Request $request
|
|
* @return bool|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
|
* @throws MalformedRequestException
|
|
* @throws ResourceNotFoundException
|
|
* @throws \App\Classes\Exceptions\InternalServerErrorException
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
*/
|
|
public function execute(Request $request)
|
|
{
|
|
$billplzXSignatureObject = new BillplzXSignatureObject($request);
|
|
|
|
if(!$billplzXSignatureObject->isValidSignature()){
|
|
throw new MalformedRequestException('Billplz Payment validation failed.');
|
|
}
|
|
|
|
$billPlz = $this->getBillplzBill->execute($billplzXSignatureObject->getBillPlzId());
|
|
|
|
if(!$billPlz) throw new ResourceNotFoundException('Billplz bill not found.');
|
|
|
|
$transaction = $this->fetchesTransaction->execute(['payment_reference' => $billplzXSignatureObject->getBillPlzId()]);
|
|
|
|
$invoice = $transaction->owner;
|
|
$packingList = $invoice->owner;
|
|
$order = $packingList->owner;
|
|
|
|
$status = ApprovalStatus::PENDING_VERIFICATION;
|
|
|
|
if($billPlz->state === 'paid') {
|
|
$status = ApprovalStatus::APPROVED;
|
|
}
|
|
|
|
if($billPlz->state === 'due') {
|
|
$status = $billplzXSignatureObject->getStatus() === 'failed' ? ApprovalStatus::REJECTED : ApprovalStatus::PENDING_VERIFICATION;
|
|
}
|
|
|
|
$token = Auth::fromUser(User::find(1));
|
|
$request->headers->set('Authorization', 'Bearer '.$token);
|
|
|
|
// check if is wallet top up
|
|
if($transaction->owner instanceof Wallet && $status === ApprovalStatus::APPROVED &&!in_array($transaction->status, [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])) {
|
|
$this->updatesWalletBalance->execute($transaction->owner, $transaction->amount);
|
|
}
|
|
|
|
// group payment
|
|
if ($transaction->type == TransactionType::GROUP_PAYMENT && $status === ApprovalStatus::APPROVED &&!in_array($transaction->status, [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])) {
|
|
$group = Group::where('reference', $billplzXSignatureObject->getBillPlzId())->first();
|
|
|
|
foreach($group->groupTransactions as $groupTransaction) {
|
|
$invoice = $groupTransaction->transaction;
|
|
$this->createPaymentTransactionProcessor->execute($invoice, PaymentMethodType::WALLET, null);
|
|
}
|
|
|
|
$group->status = $status;
|
|
$group->save();
|
|
}
|
|
|
|
$this->updatesTransactionStatus->execute($transaction, $status);
|
|
|
|
if (!$transaction->owner instanceof Wallet) {
|
|
$totalPaidAmount = $invoice->transactions->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount');
|
|
|
|
if(($invoice->amount - $totalPaidAmount) < 0.01) {
|
|
$this->updatesTransactionStatus->execute($invoice, ApprovalStatus::COMPLETED);
|
|
|
|
$packingList->status = ApprovalStatus::APPROVED;
|
|
$packingList->save();
|
|
|
|
if(app()->environment('production')){
|
|
$this->updateDoFromVTPortalProcessor->execute($packingList);
|
|
$this->updateDoFromYDPortalProcessor->execute($packingList);
|
|
}
|
|
}
|
|
}
|
|
|
|
$company_module_marking = $transaction->owner->owner->connections? $transaction->owner->owner->connections->first()->invitee_reference: null;
|
|
|
|
if ($transaction->owner instanceof Wallet) {
|
|
$company_module_marking = $transaction->owner->owner->connections? $transaction->owner->owner->connections->first()->invitee_reference: null;
|
|
} else {
|
|
|
|
$company_module_marking = $order->companyModule->connections? $order->companyModule->connections->first()->invitee_reference: null;
|
|
}
|
|
|
|
return $request->method() === 'POST' ? true : view('pages.payments_redirect', ['marking' => $order->reference ?? null, 'company_module_marking' => $company_module_marking ?? null, 'transaction' => $transaction, 'status' => $status]);
|
|
}
|
|
}
|