Search by

misaf / vendra-currency

misaf

Currency management with a fiat and crypto catalog, per-tenant activation, and a single default currency

Package info

github.com/misaf/vendra-currency

Type:vendra-module

pkg:composer/misaf/vendra-currency

Statistics

Installs: 14

Dependents: 2

Suggesters: 2

Stars: 1

Open Issues: 0

v1.12.3 2026-08-22 21:15 UTC

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 (via moneyphp/crypto-currencies)
  • Enable/disable installed currencies per tenant with a single enforced default currency
  • Money formatting through cknow/laravel-money
  • Filament resource on the admin panel

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.