Files
exchange-2.0/app/Classes/Modules/Transactions/Processors/CreateCashBackTransactionProcessor.php
T
glovetleong 3fcfcf9de9 cash back
2022-04-01 10:12:23 +08:00

141 lines
5.3 KiB
PHP

<?php
namespace App\Classes\Modules\Transactions\Processors;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
use App\Classes\Modules\Transactions\Services\CreatesTransactionDetail;
use App\Classes\Modules\Transactions\Services\DeletesTransactionDetails;
use App\Classes\Modules\Transactions\Services\UpdatesTransaction;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Classes\Modules\Wallets\Processors\CreditWalletProcessor;
use App\Classes\Modules\Wallets\Services\CreatesWallet;
use App\Classes\Modules\Wallets\Services\GeneratesWalletCode;
use App\Classes\ValueObjects\Constants\CashBack;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Models\Booking;
use App\Models\Transaction;
use Carbon\Carbon;
class CreateCashBackTransactionProcessor
{
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CreatesTransaction */
private $createsTransaction;
/** @var CreatesTransactionDetail */
private $createsTransactionDetail;
/** @var UpdatesTransaction */
private $updatesTransaction;
/** @var DeletesTransactionDetails */
private $deletesTransactionDetails;
/** @var GeneratesTransactionBillNumber */
private $generatesTransactionBillNumber;
/** @var CreatesWallet */
private $createsWallet;
/** @var GeneratesWalletCode */
private $generatesWalletCode;
/** @var CreditWalletProcessor */
private $creditWalletProcessor;
/**
* CreateCashBackTransactionProcessor constructor.
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CreatesTransaction $createsTransaction
* @param CreatesTransactionDetail $createsTransactionDetail
* @param UpdatesTransaction $updatesTransaction
* @param DeletesTransactionDetails $deletesTransactionDetails
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
*/
public function __construct(UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesTransactionDetail $createsTransactionDetail, UpdatesTransaction $updatesTransaction, DeletesTransactionDetails $deletesTransactionDetails, GeneratesTransactionBillNumber $generatesTransactionBillNumber, GeneratesWalletCode $generatesWalletCode, CreditWalletProcessor $creditWalletProcessor)
{
$this->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;
}
}
}
}