diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php new file mode 100644 index 00000000..8999832d --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -0,0 +1,100 @@ + 'Create Refund Booking', + 'message' => 'You have successfully created a refund booking' + ]; + } + + /** @var FetchesTransaction */ + private $fetchesTransaction; + + /** @var FetchesCompanyPaymentAttemptLimit */ + private $fetchesCompanyPaymentAttemptLimit; + + /** @var GeneratesTransactionBillNumber */ + private $generatesTransactionBillNumber; + + /** @var CreatesTransaction */ + private $createsTransaction; + + /** @var CreatesTransactionDetail */ + private $createsTransactionDetail; + + /** + * CreateBookingPaymentLogic constructor. + * @param FetchesTransaction $fetchesTransaction + * + * @param FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit + * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + * @param CreatesTransaction $createsTransaction + */ + public function __construct(FetchesTransaction $fetchesTransaction, FetchesCompanyPaymentAttemptLimit $fetchesCompanyPaymentAttemptLimit, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, CreatesTransactionDetail $createsTransactionDetail) + { + $this->fetchesTransaction = $fetchesTransaction; + $this->fetchesCompanyPaymentAttemptLimit = $fetchesCompanyPaymentAttemptLimit; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + $this->createsTransaction = $createsTransaction; + $this->createsTransactionDetail = $createsTransactionDetail; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + + $booking = Booking::find($request->route('id')); + + $transaction = $this->fetchesTransaction->execute(['id' => $request->input('payment_id')]); + + $paymentAttemptLimit = $this->fetchesCompanyPaymentAttemptLimit->execute($booking->company); + + $billNumber = $this->generatesTransactionBillNumber->execute('RFD-'); + + $object = new TransactionObject($billNumber, TransactionType::REFUND, 1, $booking->company->id, + $booking->bank_id, $transaction->payment_method, + $transaction->amount, $transaction->original_amount, 1, + $transaction->original_currency_id, $transaction->currency_rate, + $transaction->tax, $transaction->service_charge, Carbon::now()->addMinutes($paymentAttemptLimit), ApprovalStatus::PENDING_VERIFICATION); + + $transaction = $this->createsTransaction->execute($booking, $object); + + $detailObject = new TransactionDetailObject($transaction->bill_no, 'Payment refund for '.$transaction->bill_no, 1, $transaction->original_amount); + + $this->createsTransactionDetail->execute($transaction, $detailObject); + + return $this->resourceResponse(new TransactionResource($transaction)); + } + + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/CalculatesBookingRefundAmount.php b/app/Classes/Modules/Bookings/Services/CalculatesBookingRefundAmount.php new file mode 100644 index 00000000..2dec77fa --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/CalculatesBookingRefundAmount.php @@ -0,0 +1,18 @@ +transactions()->refunds()->complete()->sum('original_amount'); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Bookings/CreateBookingRefundController.php b/app/Http/Controllers/Bookings/CreateBookingRefundController.php new file mode 100644 index 00000000..e15b8ff8 --- /dev/null +++ b/app/Http/Controllers/Bookings/CreateBookingRefundController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 002d7611..9d1ed5b9 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -84,6 +84,15 @@ class Transaction extends AbstractModel implements Documentable return $query->where('type', TransactionType::BILL); } + /** + * @param Builder $query + * @return Builder + */ + public function scopeRefunds(Builder $query) + { + return $query->where('type', TransactionType::REFUND); + } + /** * @param Builder $query diff --git a/routes/booking.php b/routes/booking.php index 03f9bb3f..5bf7ddba 100644 --- a/routes/booking.php +++ b/routes/booking.php @@ -16,6 +16,14 @@ Route::group(['prefix' => 'booking', 'as' => 'booking.', 'namespace' => 'Booking Route::put('/{payment_id}/approval/{status}', 'ApprovePaymentVerificationController@approve')->where('status', 'approve|reject')->name('approval'); }); + Route::group(['prefix' => '{id}/refund', 'as' => 'refund.'], function () { + Route::post('create', 'CreateBookingRefundController@create')->name('create'); + }); + + Route::group(['prefix' => '{id}/refund', 'as' => 'refund.'], function () { + Route::post('{payment_id}create', 'CreateBookingRefundController@create')->name('create'); + }); + Route::post('{id}/purchase_order/verification', 'ApprovePurchaseOrderController@approve')->name('po.approval'); Route::post('/merge', 'MergeBookingController@merge')->name('merge');