'Credit into Company Wallet', 'message' => 'You have successfully credit company wallet' ]; } /** @var FetchesCompany */ private $fetchesCompany; /** @var GeneratesWalletCode */ private $generatesWalletCode; /** @var CreatesWallet */ private $createsWallet; /** @var GeneratesTransactionBillNumber */ private $generatesTransactionBillNumber; /** @var CreatesTransaction */ private $createsTransaction; /** @var UpdatesWallet */ private $updatesWallet; /** * CreateWalletLogic constructor. * @param FetchesCompany $fetchesCompany * @param GeneratesWalletCode $generatesWalletCode * @param CreatesWallet $createsWallet * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber * @param CreatesTransaction $createsTransaction * @param UpdatesWallet $updatesWallet */ public function __construct( FetchesCompany $fetchesCompany, GeneratesWalletCode $generatesWalletCode, CreatesWallet $createsWallet, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, UpdatesWallet $updatesWallet ) { $this->fetchesCompany = $fetchesCompany; $this->generatesWalletCode = $generatesWalletCode; $this->createsWallet = $createsWallet; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createsTransaction = $createsTransaction; $this->updatesWallet = $updatesWallet; } /** * @param Request $request * @return JsonResponse * @throws \App\Classes\Exceptions\MalformedRequestException */ public function logic(Request $request) : JsonResponse { $amount = floatval(str_replace(',', '', $request->input('amount'))); $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); $reference = $request->input('reference'); $type = $request->input('transaction_type'); if (!$company->wallets()->first()) { $object = new WalletObject($company->id, 1, $this->generatesWalletCode->execute()); $this->createsWallet->execute($object, $company); } $wallet = $company->wallets()->first(); $billNumber = $this->generatesTransactionBillNumber->execute($type === 2 ? 'DEBIT-NOTE-' : 'CREDIT-NOTE-'); $transaction_object = new TransactionObject($billNumber, $type === 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 = $type === 2 ? ($wallet->amount - $transaction->amount) : ($wallet->amount + $transaction->amount); $walletObject = new WalletObject($wallet->owner->id, $wallet->currency_id, $wallet->code, $updateWalletAmount); $wallet = $this->updatesWallet->execute($wallet, $walletObject); return $this->resourceResponse(new WalletResource($wallet)); } }