getBillplzBill = $getBillplzBill; $this->fetchesTransaction = $fetchesTransaction; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->updatesWalletBalance = $updatesWalletBalance; $this->createCashBackTransactionProcessor = $createCashBackTransactionProcessor; $this->recalculatesWalletBalance = $recalculatesWalletBalance; } /** * @param Request $request * @return bool|\Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws MalformedRequestException * @throws ResourceNotFoundException */ 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()]); if($billPlz->state === 'paid') { $status = ApprovalStatus::APPROVED; } if($billPlz->state === 'due') { $status = $billplzXSignatureObject->getStatus() === 'failed' ? ApprovalStatus::REJECTED : ApprovalStatus::PENDING_VERIFICATION; } if($transaction->status !== ApprovalStatus::COMPLETED && $transaction->status !== ApprovalStatus::APPROVED){ $this->updatesTransactionStatus->execute($transaction, $status); } if($transaction->owner instanceof Wallet) { $this->updatesWalletBalance->execute($transaction->owner, $transaction->amount); } // if ($transaction->type == TransactionType::PAYMENT) { // $cash_back_transaction = $this->createCashBackTransactionProcessor->execute($transaction); // } $token = Auth::fromUser(User::find(1)); $request->headers->set('Authorization', 'Bearer '.$token); $marking = $transaction->owner instanceof Booking ? $transaction->booking->marking : (count($transaction->owner->owner->bookings()->get())? $transaction->owner->owner->bookings()->orderBy('id', 'DESC')->first()->marking: null); return $request->method() === 'POST' ? true : view('pages.payments_redirect', ['marking' => $marking ?? null, 'transaction' => $transaction, 'status' => $status]); } }