From 60ed755b7ccedeec311ee17f5c63fc9d554bf612 Mon Sep 17 00:00:00 2001 From: Legacy <52163001+3m1n3nc3@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:08:20 +0100 Subject: [PATCH 1/7] Update: Change log_reference_length to log_reference_params to allow passing additional parameters to the log reference generator --- src/Traits/BalanceOperation.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Traits/BalanceOperation.php b/src/Traits/BalanceOperation.php index c0ec100..16fde2d 100644 --- a/src/Traits/BalanceOperation.php +++ b/src/Traits/BalanceOperation.php @@ -65,15 +65,15 @@ protected function generateReference(): string { $className = config('pay-pocket.log_reference_generator_class'); $methodName = config('pay-pocket.log_reference_generator_method'); - $length = config('pay-pocket.log_reference_length'); + $params = (array)config('pay-pocket.log_reference_params', [12]); $prefix = config('pay-pocket.log_reference_prefix'); 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], $length); + $reference = call_user_func([$className, $methodName], ...$params); - return $prefix.$reference; + return $prefix . $reference; } } From 166bbe2830f282f50c094d3f4bccfce87f88f7eb Mon Sep 17 00:00:00 2001 From: Legacy <52163001+3m1n3nc3@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:09:12 +0100 Subject: [PATCH 2/7] Update: Change log_reference_length to log_reference_params to allow passing additional parameters to the log reference generator --- config/pay-pocket.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/pay-pocket.php b/config/pay-pocket.php index bc74b57..2b6a8a8 100644 --- a/config/pay-pocket.php +++ b/config/pay-pocket.php @@ -12,17 +12,17 @@ | This configuration allows you to customize the generation of log reference strings | within the LaravelPayPocket package. | - | - log_reference_length: The length of the generated reference string. - | - log_reference_prefix: The prefix for the generated reference string. - | - log_reference_generator_class: The fully qualified name of the class containing static methods for generation. - | - log_reference_generator_method: The name of the static method available in the generator class. + | - [array] log_reference_params: The parameters to pass to the log reference generator. + | - [string] log_reference_prefix: The prefix for the generated reference string. + | - [class-string] log_reference_generator_class: The fully qualified name of the class containing static methods for generation. + | - [string] log_reference_generator_method: The name of the static method available in the generator class. | | This is how it works by default in the code: | Illuminate\Support\Str::random(12) | */ - 'log_reference_length' => 12, + 'log_reference_params' => [12], 'log_reference_prefix' => '', 'log_reference_generator_class' => Illuminate\Support\Str::class, 'log_reference_generator_method' => 'random', From ef127e97a0548bd076ef2ed9e1aff607e8513981 Mon Sep 17 00:00:00 2001 From: 3m1n3nc3 Date: Sat, 29 Jun 2024 21:02:52 +0100 Subject: [PATCH 3/7] Return a collection of all related WalletLog for successfull call to the pay() method. --- src/Facades/LaravelPayPocket.php | 4 ++-- src/Interfaces/WalletOperations.php | 8 ++++++-- src/Services/PocketServices.php | 11 ++++++++--- src/Traits/BalanceOperation.php | 10 ++++++---- src/Traits/HandlesPayment.php | 21 +++++++++++++++------ tests/OperationsWithFacadeTest.php | 12 ++++++++++++ tests/OperationsWithoutFacadeTest.php | 12 ++++++++++++ 7 files changed, 61 insertions(+), 17 deletions(-) diff --git a/src/Facades/LaravelPayPocket.php b/src/Facades/LaravelPayPocket.php index 8d7092a..502c28c 100644 --- a/src/Facades/LaravelPayPocket.php +++ b/src/Facades/LaravelPayPocket.php @@ -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) @@ -19,4 +19,4 @@ protected static function getFacadeAccessor(): string { return \HPWebdeveloper\LaravelPayPocket\Services\PocketServices::class; } -} +} \ No newline at end of file diff --git a/src/Interfaces/WalletOperations.php b/src/Interfaces/WalletOperations.php index 572bf82..b70134b 100644 --- a/src/Interfaces/WalletOperations.php +++ b/src/Interfaces/WalletOperations.php @@ -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 */ - 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. @@ -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; -} +} \ No newline at end of file diff --git a/src/Services/PocketServices.php b/src/Services/PocketServices.php index 71f5244..cc8a5cc 100644 --- a/src/Services/PocketServices.php +++ b/src/Services/PocketServices.php @@ -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 */ - 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); } /** @@ -40,4 +45,4 @@ public function walletBalanceByType(WalletOperations $user, string $type): int|f { return $user->getWalletBalanceByType($type); } -} +} \ No newline at end of file diff --git a/src/Traits/BalanceOperation.php b/src/Traits/BalanceOperation.php index 16fde2d..678d6a3 100644 --- a/src/Traits/BalanceOperation.php +++ b/src/Traits/BalanceOperation.php @@ -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; } /** @@ -68,7 +70,7 @@ 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.'); } @@ -76,4 +78,4 @@ protected function generateReference(): string return $prefix . $reference; } -} +} \ No newline at end of file diff --git a/src/Traits/HandlesPayment.php b/src/Traits/HandlesPayment.php index 2ea0a44..5055c24 100644 --- a/src/Traits/HandlesPayment.php +++ b/src/Traits/HandlesPayment.php @@ -3,6 +3,7 @@ namespace HPWebdeveloper\LaravelPayPocket\Traits; use HPWebdeveloper\LaravelPayPocket\Exceptions\InsufficientBalanceException; +use HPWebdeveloper\LaravelPayPocket\Models\WalletsLog; use Illuminate\Support\Facades\DB; trait HandlesPayment @@ -10,15 +11,19 @@ trait HandlesPayment /** * Pay the order value from the user's wallets. * + * @param int|float $orderValue + * @param ?string $notes + * * @throws InsufficientBalanceException + * @return \Illuminate\Support\Collection */ - 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; /** @@ -26,13 +31,15 @@ public function pay(int|float $orderValue, ?string $notes = null): void */ $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) { @@ -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; }); } -} +} \ No newline at end of file diff --git a/tests/OperationsWithFacadeTest.php b/tests/OperationsWithFacadeTest.php index 2421416..33f2b9b 100644 --- a/tests/OperationsWithFacadeTest.php +++ b/tests/OperationsWithFacadeTest.php @@ -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); +}); \ No newline at end of file diff --git a/tests/OperationsWithoutFacadeTest.php b/tests/OperationsWithoutFacadeTest.php index e64143f..dd71986 100644 --- a/tests/OperationsWithoutFacadeTest.php +++ b/tests/OperationsWithoutFacadeTest.php @@ -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); +}); \ No newline at end of file From 1a461c85e6f6d7b03fec240a0bfd69dfc4f555dd Mon Sep 17 00:00:00 2001 From: 3m1n3nc3 Date: Sat, 29 Jun 2024 21:16:06 +0100 Subject: [PATCH 4/7] Fix missing class references --- src/Interfaces/WalletOperations.php | 3 ++- src/Services/PocketServices.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Interfaces/WalletOperations.php b/src/Interfaces/WalletOperations.php index 516513e..543764b 100644 --- a/src/Interfaces/WalletOperations.php +++ b/src/Interfaces/WalletOperations.php @@ -3,6 +3,7 @@ namespace HPWebdeveloper\LaravelPayPocket\Interfaces; use HPWebdeveloper\LaravelPayPocket\Exceptions\InsufficientBalanceException; +use HPWebdeveloper\LaravelPayPocket\Models\WalletsLog; interface WalletOperations { @@ -40,4 +41,4 @@ public function deposit(string $type, int|float $amount, ?string $notes = null): * Get user's wallet balance. */ public function getWalletBalance(): int|float; -} +} \ No newline at end of file diff --git a/src/Services/PocketServices.php b/src/Services/PocketServices.php index d696ab3..abe72ab 100644 --- a/src/Services/PocketServices.php +++ b/src/Services/PocketServices.php @@ -4,6 +4,7 @@ use HPWebdeveloper\LaravelPayPocket\Exceptions\InsufficientBalanceException; use HPWebdeveloper\LaravelPayPocket\Interfaces\WalletOperations; +use HPWebdeveloper\LaravelPayPocket\Models\WalletsLog; class PocketServices { @@ -43,4 +44,4 @@ public function walletBalanceByType(WalletOperations $user, string $type): int|f { return $user->getWalletBalanceByType($type); } -} +} \ No newline at end of file From ea319cb1fcd0cca3727e9f9b35dab893634b16db Mon Sep 17 00:00:00 2001 From: 3m1n3nc3 Date: Sat, 29 Jun 2024 21:21:21 +0100 Subject: [PATCH 5/7] Fix missing types --- src/Interfaces/WalletOperations.php | 5 +++-- src/Services/PocketServices.php | 6 ++++-- src/Traits/HandlesDeposit.php | 6 +++--- src/Traits/HandlesPayment.php | 11 ++++++----- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Interfaces/WalletOperations.php b/src/Interfaces/WalletOperations.php index 543764b..55e52f5 100644 --- a/src/Interfaces/WalletOperations.php +++ b/src/Interfaces/WalletOperations.php @@ -25,10 +25,11 @@ public function hasSufficientBalance(int|float $value): bool; /** * Pay the order value from the user's wallets. * - * @param ?string $notes - * @return \Illuminate\Support\Collection + * @param int|float $orderValue + * @param ?string $notes * * @throws InsufficientBalanceException + * @return \Illuminate\Support\Collection */ public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\Support\Collection; diff --git a/src/Services/PocketServices.php b/src/Services/PocketServices.php index abe72ab..e3a3902 100644 --- a/src/Services/PocketServices.php +++ b/src/Services/PocketServices.php @@ -19,10 +19,12 @@ public function deposit(WalletOperations $user, string $type, int|float $amount, /** * Pay the order value from the user's wallets. * - * @param ?string $notes - * @return \Illuminate\Support\Collection + * @param WalletOperations $user + * @param int|float $orderValue + * @param ?string $notes * * @throws InsufficientBalanceException + * @return \Illuminate\Support\Collection */ public function pay(WalletOperations $user, int|float $orderValue, ?string $notes = null): \Illuminate\Support\Collection { diff --git a/src/Traits/HandlesDeposit.php b/src/Traits/HandlesDeposit.php index 87c817a..1c86d82 100644 --- a/src/Traits/HandlesDeposit.php +++ b/src/Traits/HandlesDeposit.php @@ -21,7 +21,7 @@ public function deposit(string $type, int|float $amount, ?string $notes = null): { $depositable = $this->getDepositableTypes(); - if (! $this->isRequestValid($type, $depositable)) { + if (!$this->isRequestValid($type, $depositable)) { throw new InvalidDepositException('Invalid deposit request.'); } @@ -58,10 +58,10 @@ private function getDepositableTypes(): array */ private function isRequestValid($type, array $depositable): bool { - if (! array_key_exists($type, $depositable)) { + if (!array_key_exists($type, $depositable)) { throw new InvalidWalletTypeException('Invalid deposit type.'); } return true; } -} +} \ No newline at end of file diff --git a/src/Traits/HandlesPayment.php b/src/Traits/HandlesPayment.php index 51ea3c4..5055c24 100644 --- a/src/Traits/HandlesPayment.php +++ b/src/Traits/HandlesPayment.php @@ -11,14 +11,15 @@ trait HandlesPayment /** * Pay the order value from the user's wallets. * - * @param ?string $notes - * @return \Illuminate\Support\Collection + * @param int|float $orderValue + * @param ?string $notes * * @throws InsufficientBalanceException + * @return \Illuminate\Support\Collection */ 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.'); } @@ -33,7 +34,7 @@ public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\D $logs = (new WalletsLog())->newCollection(); foreach ($walletsInOrder as $wallet) { - if (! $wallet || ! $wallet->hasBalance()) { + if (!$wallet || !$wallet->hasBalance()) { continue; } @@ -53,4 +54,4 @@ public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\D return $logs; }); } -} +} \ No newline at end of file From e8cf7e679a1a951d01f7fe3e391dca07999d2ef1 Mon Sep 17 00:00:00 2001 From: 3m1n3nc3 Date: Sat, 29 Jun 2024 21:22:23 +0100 Subject: [PATCH 6/7] Run pint --- src/Interfaces/WalletOperations.php | 7 +++---- src/Services/PocketServices.php | 8 +++----- src/Traits/HandlesDeposit.php | 6 +++--- src/Traits/HandlesPayment.php | 11 +++++------ 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/Interfaces/WalletOperations.php b/src/Interfaces/WalletOperations.php index 55e52f5..4d16b60 100644 --- a/src/Interfaces/WalletOperations.php +++ b/src/Interfaces/WalletOperations.php @@ -25,11 +25,10 @@ public function hasSufficientBalance(int|float $value): bool; /** * Pay the order value from the user's wallets. * - * @param int|float $orderValue - * @param ?string $notes + * @param ?string $notes + * @return \Illuminate\Support\Collection * * @throws InsufficientBalanceException - * @return \Illuminate\Support\Collection */ public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\Support\Collection; @@ -42,4 +41,4 @@ public function deposit(string $type, int|float $amount, ?string $notes = null): * Get user's wallet balance. */ public function getWalletBalance(): int|float; -} \ No newline at end of file +} diff --git a/src/Services/PocketServices.php b/src/Services/PocketServices.php index e3a3902..bd2199e 100644 --- a/src/Services/PocketServices.php +++ b/src/Services/PocketServices.php @@ -19,12 +19,10 @@ 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 + * @param ?string $notes + * @return \Illuminate\Support\Collection * * @throws InsufficientBalanceException - * @return \Illuminate\Support\Collection */ public function pay(WalletOperations $user, int|float $orderValue, ?string $notes = null): \Illuminate\Support\Collection { @@ -46,4 +44,4 @@ public function walletBalanceByType(WalletOperations $user, string $type): int|f { return $user->getWalletBalanceByType($type); } -} \ No newline at end of file +} diff --git a/src/Traits/HandlesDeposit.php b/src/Traits/HandlesDeposit.php index 1c86d82..87c817a 100644 --- a/src/Traits/HandlesDeposit.php +++ b/src/Traits/HandlesDeposit.php @@ -21,7 +21,7 @@ public function deposit(string $type, int|float $amount, ?string $notes = null): { $depositable = $this->getDepositableTypes(); - if (!$this->isRequestValid($type, $depositable)) { + if (! $this->isRequestValid($type, $depositable)) { throw new InvalidDepositException('Invalid deposit request.'); } @@ -58,10 +58,10 @@ private function getDepositableTypes(): array */ private function isRequestValid($type, array $depositable): bool { - if (!array_key_exists($type, $depositable)) { + if (! array_key_exists($type, $depositable)) { throw new InvalidWalletTypeException('Invalid deposit type.'); } return true; } -} \ No newline at end of file +} diff --git a/src/Traits/HandlesPayment.php b/src/Traits/HandlesPayment.php index 5055c24..51ea3c4 100644 --- a/src/Traits/HandlesPayment.php +++ b/src/Traits/HandlesPayment.php @@ -11,15 +11,14 @@ trait HandlesPayment /** * Pay the order value from the user's wallets. * - * @param int|float $orderValue - * @param ?string $notes + * @param ?string $notes + * @return \Illuminate\Support\Collection * * @throws InsufficientBalanceException - * @return \Illuminate\Support\Collection */ 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.'); } @@ -34,7 +33,7 @@ public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\D $logs = (new WalletsLog())->newCollection(); foreach ($walletsInOrder as $wallet) { - if (!$wallet || !$wallet->hasBalance()) { + if (! $wallet || ! $wallet->hasBalance()) { continue; } @@ -54,4 +53,4 @@ public function pay(int|float $orderValue, ?string $notes = null): \Illuminate\D return $logs; }); } -} \ No newline at end of file +} From 7bcbb2e0c93329b79219980c6460642162a198e1 Mon Sep 17 00:00:00 2001 From: 3m1n3nc3 Date: Sat, 29 Jun 2024 21:31:46 +0100 Subject: [PATCH 7/7] Run pint one more time --- src/Traits/HandlesDeposit.php | 1 + src/Traits/HandlesPayment.php | 2 +- tests/OperationsWithoutFacadeTest.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Traits/HandlesDeposit.php b/src/Traits/HandlesDeposit.php index 87c817a..e95960f 100644 --- a/src/Traits/HandlesDeposit.php +++ b/src/Traits/HandlesDeposit.php @@ -13,6 +13,7 @@ trait HandlesDeposit /** * Deposit an amount to the user's wallet of a specific type. * + * * @throws InvalidDepositException * @throws InvalidValueException * @throws InvalidWalletTypeException diff --git a/src/Traits/HandlesPayment.php b/src/Traits/HandlesPayment.php index 51ea3c4..b5a513c 100644 --- a/src/Traits/HandlesPayment.php +++ b/src/Traits/HandlesPayment.php @@ -11,7 +11,7 @@ trait HandlesPayment /** * Pay the order value from the user's wallets. * - * @param ?string $notes + * * @return \Illuminate\Support\Collection * * @throws InsufficientBalanceException diff --git a/tests/OperationsWithoutFacadeTest.php b/tests/OperationsWithoutFacadeTest.php index 1b3fee0..dd71986 100644 --- a/tests/OperationsWithoutFacadeTest.php +++ b/tests/OperationsWithoutFacadeTest.php @@ -141,4 +141,4 @@ $log = $user->pay(100.16); expect($log->sum('value'))->toBe(100.16); -}); +}); \ No newline at end of file