bavix / laravel-wallet
It's easy to work with a virtual wallet.
Fund package maintenance!
Open Collective
www.tinkoff.ru/cf/1OkIPwTvTLf
Installs: 559 695
Dependents: 9
Suggesters: 0
Security: 0
Stars: 1 143
Watchers: 43
Forks: 230
Open Issues: 4
Requires
- php: ^8.2
- ext-json: *
- ext-pdo: *
- brick/math: ~0.10
- illuminate/contracts: ^11.0
- illuminate/database: ^11.0
- ramsey/uuid: ^4.0
Requires (Dev)
- driftingly/rector-laravel: ^1.0
- ergebnis/phpstan-rules: ^2.1
- infection/infection: ~0.27
- larastan/larastan: ^2.8
- laravel/cashier: ^15.0
- nunomaduro/collision: ^8.0
- orchestra/testbench: ^9.0
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^11.0
- rector/rector: ^1.0
- symplify/easy-coding-standard: ^12.1
Suggests
- bavix/laravel-wallet-swap: Addition to the laravel-wallet library for quick setting of exchange rates
- bavix/laravel-wallet-uuid: Addition to the laravel-wallet library uuid support in laravel-wallet
- bavix/laravel-wallet-warmup: Addition to the laravel-wallet library for refresh balance wallets
- dev-master
- 11.3.0
- 11.2.2
- 11.2.1
- 11.2.0
- 11.1.1
- 11.1.0
- 11.0.6
- 11.0.5
- 11.0.4
- 11.0.3
- 11.0.2
- 11.0.1
- 11.0.0
- 10.x-dev
- 10.1.7
- 10.1.6
- 10.1.5
- 10.1.4
- 10.1.3
- 10.1.2
- 10.1.1
- 10.1.0
- 10.0.2
- 10.0.1
- 10.0.0
- 9.6.4
- 9.6.3
- 9.6.2
- 9.6.1
- 9.6.0
- 9.5.0
- 9.4.0
- 9.3.0
- 9.2.0
- 9.1.0
- 9.0.4
- 9.0.3
- 9.0.2
- 9.0.1
- 9.0.0
- 9.0.0-RC2
- 9.0.0-RC1
- 9.0.0-beta5
- 9.0.0-beta4
- 9.0.0-beta3
- 9.0.0-beta2
- 9.0.0-beta1
- 9.0.0-alpha
- 8.4.3
- 8.4.2
- 8.4.1
- 8.4.0
- 8.3.0
- 8.2.1
- 8.2.0
- 8.1.1
- 8.1.0
- 8.0.6
- 8.0.5
- 8.0.4
- 8.0.3
- 8.0.2
- 8.0.1
- 8.0.0
- 7.3.6
- 7.3.5
- 7.3.4
- 7.3.3
- 7.3.2
- 7.3.1
- 7.3.0
- 7.3.0-beta1
- 7.3.0-alpha
- 7.2.0
- 7.2.0-beta1
- 7.1.0
- 7.1.0-RC3
- 7.1.0-RC2
- 7.1.0-RC1
- 7.1.0-beta1
- 7.0.0
- 7.0.0-beta3
- 7.0.0-beta2
- 7.0.0-beta1
- 7.0.0-alpha
- 6.2.4
- 6.2.3
- 6.2.2
- 6.2.1
- 6.2.0
- 6.1.0
- 6.0.4
- 6.0.3
- 6.0.2
- 6.0.1
- 6.0.0
- 5.5.1
- 5.5.0
- 5.4.0
- 5.3.2
- 5.3.1
- 5.3.0
- 5.2.1
- 5.2.0
- 5.1.0
- 5.0.2
- 5.0.1
- 5.0.0
- 4.2.2
- 4.2.1
- 4.2.0
- 4.1.4
- 4.1.3
- 4.1.2
- 4.1.1
- 4.1.0
- 4.0.1
- 4.0.0
- 3.3.0
- 3.2.1
- 3.2.0
- 3.1.6
- 3.1.5
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.1
- 3.1.0
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.4.1
- 2.4.0
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.0
- 2.0.1
- 2.0.0
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.0
- 0.0.1
- dev-dependabot/github_actions/codecov/codecov-action-5
- dev-999-implement-merchant-fee-deduction-feature-better-name-needed
This package is auto-updated.
Last update: 2024-11-20 21:17:10 UTC
README
laravel-wallet - It's easy to work with a virtual wallet.
[Benchmark] [Documentation] [Get Started]
- Vendor: bavix
- Package: laravel-wallet
- Composer:
composer require bavix/laravel-wallet
Support Policy
Important
If you are using laravel-wallet ^10.0 with laravel ^11, then the minimum php version is 8.2.
Upgrade Guide
To perform the migration, you will be helped by the instruction.
Community
I want to create a cozy place for developers using the wallet package. This will help you find bugs faster, get feedback and discuss ideas.
Telegram: @laravel_wallet
Extensions
Usage
Add the HasWallet
trait and Wallet
interface to model.
use Bavix\Wallet\Traits\HasWallet; use Bavix\Wallet\Interfaces\Wallet; class User extends Model implements Wallet { use HasWallet; }
Now we make transactions.
$user = User::first(); $user->balanceInt; // 0 $user->deposit(10); $user->balance; // 10 $user->balanceInt; // int(10) $user->withdraw(1); $user->balance; // 9 $user->forceWithdraw(200, ['description' => 'payment of taxes']); $user->balance; // -191
Purchases
Add the CanPay
trait and Customer
interface to your User
model.
use Bavix\Wallet\Traits\CanPay; use Bavix\Wallet\Interfaces\Customer; class User extends Model implements Customer { use CanPay; }
Add the HasWallet
trait and interface to Item
model.
Starting from version 9.x there are two product interfaces:
- For an unlimited number of products (
ProductInterface
); - For a limited number of products (
ProductLimitedInterface
);
An example with an unlimited number of products:
use Bavix\Wallet\Traits\HasWallet; use Bavix\Wallet\Interfaces\Customer; use Bavix\Wallet\Interfaces\ProductInterface; class Item extends Model implements ProductInterface { use HasWallet; public function getAmountProduct(Customer $customer): int|string { return 100; } public function getMetaProduct(): ?array { return [ 'title' => $this->title, 'description' => 'Purchase of Product #' . $this->id, ]; } }
Example with a limited number of products:
use Bavix\Wallet\Traits\HasWallet; use Bavix\Wallet\Interfaces\Customer; use Bavix\Wallet\Interfaces\ProductLimitedInterface; class Item extends Model implements ProductLimitedInterface { use HasWallet; public function canBuy(Customer $customer, int $quantity = 1, bool $force = false): bool { /** * This is where you implement the constraint logic. * * If the service can be purchased once, then * return !$customer->paid($this); */ return true; } public function getAmountProduct(Customer $customer): int|string { return 100; } public function getMetaProduct(): ?array { return [ 'title' => $this->title, 'description' => 'Purchase of Product #' . $this->id, ]; } }
I do not recommend using the limited interface when working with a shopping cart.
If you are working with a shopping cart, then you should override the PurchaseServiceInterface
interface.
With it, you can check the availability of all products with one request, there will be no N-queries in the database.
Proceed to purchase.
$user = User::first(); $user->balance; // 100 $item = Item::first(); $user->pay($item); // If you do not have enough money, throw an exception var_dump($user->balance); // 0 if ($user->safePay($item)) { // try to buy again } var_dump((bool)$user->paid($item)); // bool(true) var_dump($user->refund($item)); // bool(true) var_dump((bool)$user->paid($item)); // bool(false)
Eager Loading
// When working with one wallet User::with('wallet'); // When using the multi-wallet functionality User::with('wallets');
How to work with fractional numbers?
Add the HasWalletFloat
trait and WalletFloat
interface to model.
use Bavix\Wallet\Traits\HasWalletFloat; use Bavix\Wallet\Interfaces\WalletFloat; use Bavix\Wallet\Interfaces\Wallet; class User extends Model implements Wallet, WalletFloat { use HasWalletFloat; }
Now we make transactions.
$user = User::first(); $user->balance; // 100 $user->balanceFloat; // 1.00 $user->depositFloat(1.37); $user->balance; // 237 $user->balanceFloat; // 2.37
Performance Comparison
All versions:
Table generated using benchmark. Pull Request.
Supported by
Contributors
Code Contributors
This project exists thanks to all the people who contribute. [Contribute].
Financial Contributors
Become a financial contributor and help us sustain our community. [Contribute]
Individuals
Organizations
Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]