Skip to content

Commit

Permalink
Return a collection of all related WalletLog for successfull call to …
Browse files Browse the repository at this point in the history
…the pay() method.
  • Loading branch information
3m1n3nc3 committed Jun 29, 2024
1 parent 166bbe2 commit ef127e9
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 17 deletions.
4 changes: 2 additions & 2 deletions src/Facades/LaravelPayPocket.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
/**
* @see \HPWebdeveloper\LaravelPayPocket\Services\PocketServices
*
* @method static void pay(WalletOperations $user, int|float $orderValue, ?string $notes = null)
* @method static \Illuminate\Support\Collection pay(WalletOperations $user, int|float $orderValue, ?string $notes = null)
* @method static bool deposit(WalletOperations $user, string $type, int|float $amount, ?string $notes = null)
* @method static int|float checkBalance(WalletOperations $user)
* @method static int|float walletBalanceByType(WalletOperations $user, string $type)
Expand All @@ -19,4 +19,4 @@ protected static function getFacadeAccessor(): string
{
return \HPWebdeveloper\LaravelPayPocket\Services\PocketServices::class;
}
}
}
8 changes: 6 additions & 2 deletions src/Interfaces/WalletOperations.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,13 @@ public function hasSufficientBalance(int|float $value): bool;
/**
* Pay the order value from the user's wallets.
*
* @param int|float $orderValue
* @param ?string $notes
*
* @throws InsufficientBalanceException
* @return \Illuminate\Support\Collection<TKey,WalletsLog>
*/
public function pay(int|float $orderValue, ?string $notes = null): void;
public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\Support\Collection;

/**
* Deposit an amount to the user's wallet of a specific type.
Expand All @@ -37,4 +41,4 @@ public function deposit(string $type, int|float $amount, ?string $notes = null):
* Get user's wallet balance.
*/
public function getWalletBalance(): int|float;
}
}
11 changes: 8 additions & 3 deletions src/Services/PocketServices.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,16 @@ public function deposit(WalletOperations $user, string $type, int|float $amount,
/**
* Pay the order value from the user's wallets.
*
* @param WalletOperations $user
* @param int|float $orderValue
* @param ?string $notes
*
* @throws InsufficientBalanceException
* @return \Illuminate\Support\Collection<TKey,WalletsLog>
*/
public function pay(WalletOperations $user, int|float $orderValue, ?string $notes = null): void
public function pay(WalletOperations $user, int|float $orderValue, ?string $notes = null): \Illuminate\Support\Collection
{
$user->pay($orderValue, $notes);
return $user->pay($orderValue, $notes);
}

/**
Expand All @@ -40,4 +45,4 @@ public function walletBalanceByType(WalletOperations $user, string $type): int|f
{
return $user->getWalletBalanceByType($type);
}
}
}
10 changes: 6 additions & 4 deletions src/Traits/BalanceOperation.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,21 @@ public function hasBalance(): bool
/**
* Decrement Balance and create a log entry.
*/
public function decrementAndCreateLog(int|float $value, ?string $notes = null): void
public function decrementAndCreateLog(int|float $value, ?string $notes = null): WalletsLog
{
$this->createLog('dec', $value, $notes);
$this->decrement('balance', $value);
return $this->createdLog;
}

/**
* Increment Balance and create a log entry.
*/
public function incrementAndCreateLog(int|float $value, ?string $notes = null): void
public function incrementAndCreateLog(int|float $value, ?string $notes = null): WalletsLog
{
$this->createLog('inc', $value, $notes);
$this->increment('balance', $value);
return $this->createdLog;
}

/**
Expand Down Expand Up @@ -68,12 +70,12 @@ protected function generateReference(): string
$params = (array)config('pay-pocket.log_reference_params', [12]);
$prefix = config('pay-pocket.log_reference_prefix');

if (! is_callable([$className, $methodName])) {
if (!is_callable([$className, $methodName])) {
throw new InvalidArgumentException('Invalid configuration: The combination of log_reference_generator_class and log_reference_generator_method is not callable.');
}

$reference = call_user_func([$className, $methodName], ...$params);

return $prefix . $reference;
}
}
}
21 changes: 15 additions & 6 deletions src/Traits/HandlesPayment.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,43 @@
namespace HPWebdeveloper\LaravelPayPocket\Traits;

use HPWebdeveloper\LaravelPayPocket\Exceptions\InsufficientBalanceException;
use HPWebdeveloper\LaravelPayPocket\Models\WalletsLog;
use Illuminate\Support\Facades\DB;

trait HandlesPayment
{
/**
* Pay the order value from the user's wallets.
*
* @param int|float $orderValue
* @param ?string $notes
*
* @throws InsufficientBalanceException
* @return \Illuminate\Support\Collection<TKey,WalletsLog>
*/
public function pay(int|float $orderValue, ?string $notes = null): void
public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\Database\Eloquent\Collection
{
if (! $this->hasSufficientBalance($orderValue)) {
if (!$this->hasSufficientBalance($orderValue)) {
throw new InsufficientBalanceException('Insufficient balance to cover the order.');
}

DB::transaction(function () use ($orderValue, $notes) {
return DB::transaction(function () use ($orderValue, $notes) {
$remainingOrderValue = $orderValue;

/**
* @var \Illuminate\Support\Collection<TKey, \HPWebdeveloper\LaravelPayPocket\Models\Wallet>
*/
$walletsInOrder = $this->wallets()->whereIn('type', $this->walletsInOrder())->get();

$logs = (new WalletsLog())->newCollection();

foreach ($walletsInOrder as $wallet) {
if (! $wallet || ! $wallet->hasBalance()) {
if (!$wallet || !$wallet->hasBalance()) {
continue;
}

$amountToDeduct = min($wallet->balance, $remainingOrderValue);
$wallet->decrementAndCreateLog($amountToDeduct, $notes);
$logs->push($wallet->decrementAndCreateLog($amountToDeduct, $notes));
$remainingOrderValue -= $amountToDeduct;

if ($remainingOrderValue <= 0) {
Expand All @@ -43,6 +50,8 @@ public function pay(int|float $orderValue, ?string $notes = null): void
if ($remainingOrderValue > 0) {
throw new InsufficientBalanceException('Insufficient total wallet balance to cover the order.');
}

return $logs;
});
}
}
}
12 changes: 12 additions & 0 deletions tests/OperationsWithFacadeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,15 @@

expect(WalletsLog::whereNotNull('reference')->exists())->toBe(true);
});

test('Payment returns log', function () {
$user = User::factory()->create();

$type = 'wallet_2';

LaravelPayPocket::deposit($user, $type, 234.56);

$log = LaravelPayPocket::pay($user, 100.16);

expect($log->sum('value'))->toBe(100.16);
});
12 changes: 12 additions & 0 deletions tests/OperationsWithoutFacadeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,15 @@

expect(WalletsLog::whereNotNull('reference')->exists())->toBe(true);
});

test('Payment returns log', function () {
$user = User::factory()->create();

$type = 'wallet_2';

$user->deposit($type, 234.56);

$log = $user->pay(100.16);

expect($log->sum('value'))->toBe(100.16);
});

0 comments on commit ef127e9

Please sign in to comment.