getBillplzBill = $getBillplzBill; $this->fetchesTransaction = $fetchesTransaction; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor; $this->updateDoFromYDPortalProcessor = $updateDoFromYDPortalProcessor; } /** * @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); $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::APPROVED); if(($invoice->amount - $transaction->amount) < 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); } } return $request->method() === 'POST' ? true : view('pages.payments_redirect', ['marking' => $order->reference, 'transaction' => $transaction, 'status' => $status]); } }