- rate approval: API creates pending proposals, manager approves - customer_credits + credit_settlements tables - CustomerCreditService (grant/settle via wallet) - rebuilt CustomerCreditResource - CustomerFinancialController: real foreign-currency debt - WP login redirect + custom login page wiring
71 lines
3.2 KiB
PHP
71 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Widgets;
|
|
|
|
use App\Services\ExchangeRateService;
|
|
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
|
|
use Filament\Widgets\StatsOverviewWidget\Stat;
|
|
use App\Models\ExchangeRateHistory;
|
|
|
|
class ExchangeRateWidget extends BaseWidget
|
|
{
|
|
protected static ?int $sort = 2;
|
|
protected static bool $isLazy = false;
|
|
|
|
protected int | string | array $columnSpan = 'full';
|
|
|
|
protected function getStats(): array
|
|
{
|
|
$service = app(ExchangeRateService::class);
|
|
$aedInfo = $service->getLatestRateInfo('AED', 'IRR');
|
|
$usdInfo = $service->getLatestRateInfo('USD', 'IRR');
|
|
|
|
$aedChangePercent = $aedInfo['change_percent'];
|
|
$usdChangePercent = $usdInfo['change_percent'];
|
|
|
|
$aedChart = $service->getRateChart('AED', 'IRR', 7);
|
|
$usdChart = $service->getRateChart('USD', 'IRR', 7);
|
|
|
|
return [
|
|
Stat::make('نرخ درهم (AED)', number_format($aedInfo['current_rate']) . ' ریال')
|
|
->description($aedChangePercent !== null
|
|
? 'تغییر: ' . number_format($aedChangePercent, 2) . '% — توسط ' . ($aedInfo['changed_by'] ?? 'سیستم')
|
|
: 'آخرین تغییر: ' . ($aedInfo['last_updated']?->format('Y/m/d H:i') ?? '—'))
|
|
->descriptionIcon(
|
|
$aedChangePercent > 0 ? 'heroicon-m-arrow-trending-up' :
|
|
($aedChangePercent < 0 ? 'heroicon-m-arrow-trending-down' : 'heroicon-m-minus')
|
|
)
|
|
->color(
|
|
$aedChangePercent > 0 ? 'danger' :
|
|
($aedChangePercent < 0 ? 'success' : 'gray')
|
|
)
|
|
->chart(!empty($aedChart) ? $aedChart : [0]),
|
|
|
|
Stat::make('نرخ دلار (USD)', number_format($usdInfo['current_rate']) . ' ریال')
|
|
->description($usdChangePercent !== null
|
|
? 'تغییر: ' . number_format($usdChangePercent, 2) . '% — توسط ' . ($usdInfo['changed_by'] ?? 'سیستم')
|
|
: 'آخرین تغییر: ' . ($usdInfo['last_updated']?->format('Y/m/d H:i') ?? '—'))
|
|
->descriptionIcon(
|
|
$usdChangePercent > 0 ? 'heroicon-m-arrow-trending-up' :
|
|
($usdChangePercent < 0 ? 'heroicon-m-arrow-trending-down' : 'heroicon-m-minus')
|
|
)
|
|
->color(
|
|
$usdChangePercent > 0 ? 'danger' :
|
|
($usdChangePercent < 0 ? 'success' : 'gray')
|
|
)
|
|
->chart(!empty($usdChart) ? $usdChart : [0]),
|
|
|
|
Stat::make('تغییرات امروز',
|
|
ExchangeRateHistory::whereDate('created_at', today())->count()
|
|
)
|
|
->description('تغییرات نرخ ثبتشده در امروز')
|
|
->descriptionIcon('heroicon-m-arrow-path')
|
|
->color('info'),
|
|
|
|
Stat::make('در انتظار تأیید', $service->getPendingCount())
|
|
->description('نرخهای پیشنهادی API — منتظر تأیید مدیر')
|
|
->descriptionIcon('heroicon-m-clock')
|
|
->color('warning'),
|
|
];
|
|
}
|
|
} |