From 3fcfcf9de906fb83ae5282630d777170a2493bda Mon Sep 17 00:00:00 2001 From: glovetleong Date: Fri, 1 Apr 2022 10:12:23 +0800 Subject: [PATCH] cash back --- .../ControllersLogic/CallbackBillplzLogic.php | 8 +- .../ApprovePaymentVerificationLogic.php | 15 +- .../FetchBookingPaymentQuotationLogic.php | 1 - .../CreateCashBackTransactionProcessor.php | 141 ++++++++++++++++++ .../Processors/CreditWalletProcessor.php | 2 +- .../ValueObjects/Constants/CashBack.php | 55 +++++++ .../Constants/TransactionType.php | 2 + 7 files changed, 215 insertions(+), 9 deletions(-) create mode 100644 app/Classes/Modules/Transactions/Processors/CreateCashBackTransactionProcessor.php create mode 100644 app/Classes/ValueObjects/Constants/CashBack.php diff --git a/app/Classes/Modules/Billplzs/ControllersLogic/CallbackBillplzLogic.php b/app/Classes/Modules/Billplzs/ControllersLogic/CallbackBillplzLogic.php index 2230343f..b7e7d8a0 100644 --- a/app/Classes/Modules/Billplzs/ControllersLogic/CallbackBillplzLogic.php +++ b/app/Classes/Modules/Billplzs/ControllersLogic/CallbackBillplzLogic.php @@ -4,6 +4,7 @@ namespace App\Classes\Modules\Billplzs\ControllersLogic; use App\Classes\Modules\Wallets\DataTransferObjects\WalletObject; use App\Classes\Modules\Wallets\Services\UpdatesWallet; +use App\Classes\Modules\Transactions\Processors\CreateCashBackTransactionProcessor; use App\Classes\Exceptions\ResourceNotFoundException; use App\Classes\Modules\Wallets\Services\UpdatesWalletBalance; @@ -16,6 +17,7 @@ use Illuminate\Http\JsonResponse; use App\Classes\Exceptions\MalformedRequestException; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\Modules\Billplzs\Services\GetBillplzBill; use App\Classes\Modules\Billplzs\DataTransferObjects\BillplzXSignatureObject; use App\Classes\General\Abstracts\AbstractControllerLogic; @@ -47,12 +49,13 @@ class CallbackBillplzLogic * @param UpdatesTransactionStatus $updatesTransactionStatus * @param UpdatesWalletBalance $updatesWalletBalance */ - public function __construct(GetBillplzBill $getBillplzBill, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, UpdatesWalletBalance $updatesWalletBalance) + public function __construct(GetBillplzBill $getBillplzBill, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, UpdatesWalletBalance $updatesWalletBalance, CreateCashBackTransactionProcessor $createCashBackTransactionProcessor) { $this->getBillplzBill = $getBillplzBill; $this->fetchesTransaction = $fetchesTransaction; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->updatesWalletBalance = $updatesWalletBalance; + $this->createCashBackTransactionProcessor = $createCashBackTransactionProcessor; } @@ -93,6 +96,9 @@ class CallbackBillplzLogic } + if ($transaction->type == TransactionType::PAYMENT) { + $cash_back_transaction = $this->createCashBackTransactionProcessor->execute($transaction); + } $token = Auth::fromUser(User::find(1)); $request->headers->set('Authorization', 'Bearer '.$token); diff --git a/app/Classes/Modules/Bookings/ControllersLogic/ApprovePaymentVerificationLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/ApprovePaymentVerificationLogic.php index b0a01562..d5810e12 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/ApprovePaymentVerificationLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/ApprovePaymentVerificationLogic.php @@ -2,16 +2,16 @@ namespace App\Classes\Modules\Bookings\ControllersLogic; - use App\Classes\General\Abstracts\AbstractControllerLogic; - use App\Classes\Modules\Documents\Services\ApprovesDocument; use App\Classes\Modules\Documents\Services\FetchesDocument; use App\Classes\Modules\Documents\Services\RejectsDocument; use App\Classes\Modules\Transactions\Services\FetchesTransaction; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; +use App\Classes\Modules\Transactions\Processors\CreateCashBackTransactionProcessor; + use App\Classes\ValueObjects\Constants\ApprovalStatus; use Illuminate\Http\JsonResponse; @@ -26,14 +26,15 @@ class ApprovePaymentVerificationLogic extends AbstractControllerLogic * @param ApprovesDocument $approvesDocument * @param RejectsDocument $rejectsDocument * @param FetchesDocument $fetchesDocument - * @param CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor + * @param CreateCashBackTransactionProcessor $createCashBackTransactionProcessor */ - public function __construct(FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, ApprovesDocument $approvesDocument, RejectsDocument $rejectsDocument, FetchesDocument $fetchesDocument) + public function __construct(FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, ApprovesDocument $approvesDocument, RejectsDocument $rejectsDocument, FetchesDocument $fetchesDocument, CreateCashBackTransactionProcessor $createCashBackTransactionProcessor) { $this->fetchesTransaction = $fetchesTransaction; $this->updatesTransactionStatus = $updatesTransactionStatus; $this->approvesDocument = $approvesDocument; $this->rejectsDocument = $rejectsDocument; + $this->createCashBackTransactionProcessor = $createCashBackTransactionProcessor; } /** @@ -58,6 +59,9 @@ class ApprovePaymentVerificationLogic extends AbstractControllerLogic /** @var RejectsDocument */ private $rejectsDocument; + /** @var CreateCashBackTransactionProcessor */ + private $createCashBackTransactionProcessor; + /** * @param Request $request * @return JsonResponse @@ -65,7 +69,6 @@ class ApprovePaymentVerificationLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $status = $request->route('status'); $transaction = $this->fetchesTransaction->execute(['id' => $request->route('payment_id')]); @@ -74,7 +77,7 @@ class ApprovePaymentVerificationLogic extends AbstractControllerLogic $this->updatesTransactionStatus->execute($transaction, $status === 'approve' ? ApprovalStatus::APPROVED : ApprovalStatus::REJECTED); - // $this->createInvoiceTransactionProcessor->execute($transaction->booking); + $this->createCashBackTransactionProcessor->execute($transaction); return $this->response([]); } diff --git a/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php index eaac0adc..3a981946 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/FetchBookingPaymentQuotationLogic.php @@ -62,7 +62,6 @@ class FetchBookingPaymentQuotationLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $booking = Booking::find($request->route('id')); $conversionObject = new CurrencyConversionObject(floatval(str_replace(',', '', $request->input('amount'))), $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0:1, PaymentMethodType::PAYMENT_METHODS[$request->input('payment_method')]); diff --git a/app/Classes/Modules/Transactions/Processors/CreateCashBackTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateCashBackTransactionProcessor.php new file mode 100644 index 00000000..33aaa3a9 --- /dev/null +++ b/app/Classes/Modules/Transactions/Processors/CreateCashBackTransactionProcessor.php @@ -0,0 +1,141 @@ +createsTransaction = $createsTransaction; + $this->createsTransactionDetail = $createsTransactionDetail; + $this->updatesTransaction = $updatesTransaction; + $this->deletesTransactionDetails = $deletesTransactionDetails; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + + $this->generatesWalletCode = $generatesWalletCode; + + $this->creditWalletProcessor = $creditWalletProcessor; + } + + + /** + * @param Booking $booking + * @param TransactionObject $object + * @return Transaction|\Illuminate\Database\Eloquent\Model + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(Transaction $transaction) + { + $current_total_cash_back = Transaction:: + where('type', TransactionType::CASH_BACK) + ->whereMonth('created_at', Carbon::now()->month)->sum('amount'); + + if ($current_total_cash_back < CashBack::MAX) { + + $cash_back_segemnt = CashBack::SEGMENT; + + foreach ($cash_back_segemnt as $key => $row) { + if ($row['max_value'] > $transaction->amount && $row['min_value'] <= $transaction->amount) { + + $method = $this->getRandomWeightedElement($row['weight']); + + $total = $transaction->amount * $row['percent'][$method]; + + $billNumber = $this->generatesTransactionBillNumber->execute('CBACK-'); + + $object = new TransactionObject( + $billNumber, + TransactionType::CASH_BACK, + $transaction->issuer, + 1, + 1, + PaymentMethodType::WALLET, + $total, + $total, + $transaction->currency_id, + $transaction->currency_id, + 1, + 0, + 0, + null, + ApprovalStatus::APPROVED, + ); + + $cash_back_transaction = $this->createsTransaction->execute($transaction, $object); + + $credit = $this->creditWalletProcessor->execute($company, $transaction->type, $cash_back_transaction->amount, ''); + + } + } + } + + return $transaction; + } + + public function getRandomWeightedElement(array $weightedValues) { + $rand = mt_rand(1, (int) array_sum($weightedValues)); + foreach ($weightedValues as $key => $value) { + $rand -= $value; + if ($rand <= 0) { + return $key; + } + } + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php b/app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php index d86a4465..65f3b9b6 100644 --- a/app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php +++ b/app/Classes/Modules/Wallets/Processors/CreditWalletProcessor.php @@ -78,7 +78,7 @@ class CreditWalletProcessor $transaction_object = new TransactionObject($billNumber, $transactionType === 2 ? TransactionType::DEBIT_NOTE : TransactionType::CREDIT_NOTE, 1, $wallet->owner->id, 1, PaymentMethodType::CASH, $amount, $amount, 1, 1, 1, 0, 0, null, ApprovalStatus::APPROVED, [], $reference); $transaction = $this->createsTransaction->execute($wallet, $transaction_object); - + $updateWalletAmount = $transactionType === 2 ? ($wallet->amount - $transaction->amount) : ($wallet->amount + $transaction->amount); $walletObject = new WalletObject($wallet->owner->id, $wallet->currency_id, $wallet->code, $updateWalletAmount); diff --git a/app/Classes/ValueObjects/Constants/CashBack.php b/app/Classes/ValueObjects/Constants/CashBack.php new file mode 100644 index 00000000..0fdc3df9 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/CashBack.php @@ -0,0 +1,55 @@ + [ + 'min_value' => 0, + 'max_value' => 2000, + 'weight' => [ + '0' => 80, + '1' => 18, + '2' => 2, + ], + 'percent' => [ + '0' => 0.002, + '1' => 0.005, + '2' => 0.02, + ] + ], + '1' => [ + 'min_value' => 2001, + 'max_value' => 10000, + 'weight' => [ + '0' => 85, + '1' => 10, + '2' => 5, + ], + 'percent' => [ + '0' => 0.002, + '1' => 0.005, + '2' => 0.02, + ] + ], + '2' => [ + 'min_value' => 10001, + 'max_value' => 100000, + 'weight' => [ + '0' => 70, + '1' => 20, + '2' => 10, + ], + 'percent' => [ + '0' => 0.002, + '1' => 0.005, + '2' => 0.02, + ] + ], + ]; +} diff --git a/app/Classes/ValueObjects/Constants/TransactionType.php b/app/Classes/ValueObjects/Constants/TransactionType.php index 107f2049..5221e8a2 100644 --- a/app/Classes/ValueObjects/Constants/TransactionType.php +++ b/app/Classes/ValueObjects/Constants/TransactionType.php @@ -29,4 +29,6 @@ final class TransactionType { public const WITHDRAW = 10; public const TRANSFER_FEE = 11; + + public const CASH_BACK = 12; }