misaf / vendra-currency
Currency management with a fiat and crypto catalog, per-tenant activation, and a single default currency
Requires
- php: ^8.4
- cknow/laravel-money: ^8.5
- misaf/filament-jalali: ^5.1.4
- misaf/vendra-support: v1.12.3
- moneyphp/crypto-currencies: ^1.1.0
- spatie/eloquent-sortable: ^5.0.1
- spatie/laravel-package-tools: ^1.93.1
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Tenant-aware currency management for Vendra applications.
Own the concrete Misaf\VendraCurrency\Support\EloquentCurrencyResolver adapter here and bind it to Support's CurrencyResolver contract. Preserve configurable models and columns, active filtering, default selection, tenant isolation, and fallback behavior. Consumers depend on the shared contract rather than this adapter.
Unexpected resolver and query failures are reported through Laravel before returning currency defaults. Missing providers, empty catalogs, and tables awaiting migration remain quiet fallbacks.
Features
- Catalog of installable currencies: ISO 4217 fiat (via
moneyphp/money) and crypto currencies (viamoneyphp/crypto-currencies) - Enable/disable installed currencies per tenant with a single enforced default currency
- Money formatting through
cknow/laravel-money - Filament resource on the
adminpanel
Requirements
- PHP 8.4+
- Laravel 13
- Filament 5
- Livewire 4
- Pest 4
misaf/vendra-support
Installation
composer require misaf/vendra-currency php artisan vendor:publish --tag=vendra-currency-migrations php artisan migrate
Optional configuration and translations:
php artisan vendor:publish --tag=vendra-currency-config php artisan vendor:publish --tag=vendra-currency-translations
The service provider and Filament plugin are auto-registered.
Usage
Install a currency from the catalog:
use Misaf\VendraCurrency\Models\Currency; use Misaf\VendraCurrency\Support\CurrencyRegistry; Currency::query()->create([ 'code' => 'USD', 'name' => CurrencyRegistry::nameFor('USD'), 'symbol' => '$', 'decimal_places' => CurrencyRegistry::minorUnitFor('USD'), 'type' => CurrencyRegistry::typeFor('USD'), 'is_default' => true, ]);
Browse the catalog:
CurrencyRegistry::options(); // ['USD' => 'US Dollar (USD)', ..., 'BTC' => 'BTC', ...] CurrencyRegistry::isSupported('BTC'); // true
Format an amount stored in minor units:
$currency = Currency::query()->where('code', 'USD')->firstOrFail(); $currency->formatAmount(1050); // "$10.50" $currency->money(1050); // Cknow\Money\Money instance
Exactly one enabled currency is the default at any time; use the domain action to switch it:
use Misaf\VendraCurrency\Actions\SetDefaultCurrencyAction; (new SetDefaultCurrencyAction())->execute($currency);
Platform currencies
Rows with a null tenant id are the platform's own currencies, which the console
prices plans and credits reseller wallets in. Each store keeps its own
currencies and its own default, and neither ever changes the other. Outside a
tenant, InstallCurrenciesAction, SetDefaultCurrencyAction and the bound
CurrencyResolver work on the platform rows; Currency::query()->platform()
reaches them from anywhere. The schema keeps platform codes unique and allows
one platform default. Database\Seeders\PlatformCurrencySeeder installs USD
for the seeded plans.
Filament
The Currencies resource lives in the Sales cluster on the admin panel.
CurrencyTable::configure(), InstallCurrenciesTableAction::make() and
SetDefaultCurrencyTableAction::make() take the resource that authorizes them,
so the console reuses them for platform currencies. Install currencies from the searchable catalog, toggle their active state, reorder them, and pick the default via the table toggle or row action.
Testing
Run the package checks from the project root:
php artisan test --compact --testsuite=vendra-currency
composer stan
License
MIT. See LICENSE.