|  | @@ -7,10 +7,10 @@ use App\Models\Banking\Account;
 | 
		
	
		
			
			| 7 | 7 |  use App\Models\Setting\Currency;
 | 
		
	
		
			
			| 8 | 8 |  use App\Services\CurrencyService;
 | 
		
	
		
			
			| 9 | 9 |  use App\Traits\ChecksForeignKeyConstraints;
 | 
		
	
		
			
			|  | 10 | +use Closure;
 | 
		
	
		
			
			| 10 | 11 |  use Filament\Forms\Form;
 | 
		
	
		
			
			| 11 | 12 |  use Filament\Notifications\Notification;
 | 
		
	
		
			
			| 12 | 13 |  use Filament\Resources\Resource;
 | 
		
	
		
			
			| 13 |  | -use Filament\Support\Colors\Color;
 | 
		
	
		
			
			| 14 | 14 |  use Filament\Tables\Table;
 | 
		
	
		
			
			| 15 | 15 |  use Filament\{Forms, Tables};
 | 
		
	
		
			
			| 16 | 16 |  use Illuminate\Database\Eloquent\Collection;
 | 
		
	
	
		
			
			|  | @@ -41,28 +41,23 @@ class CurrencyResource extends Resource
 | 
		
	
		
			
			| 41 | 41 |                              ->placeholder('Select a currency code...')
 | 
		
	
		
			
			| 42 | 42 |                              ->live()
 | 
		
	
		
			
			| 43 | 43 |                              ->required()
 | 
		
	
		
			
			| 44 |  | -                            ->hidden(static fn (Forms\Get $get): bool => $get('enabled'))
 | 
		
	
		
			
			|  | 44 | +                            ->hidden(static fn (Forms\Get $get, $state): bool => $get('enabled') && $state !== null)
 | 
		
	
		
			
			| 45 | 45 |                              ->afterStateUpdated(static function (Forms\Set $set, $state) {
 | 
		
	
		
			
			| 46 | 46 |                                  if ($state === null) {
 | 
		
	
		
			
			| 47 | 47 |                                      return;
 | 
		
	
		
			
			| 48 | 48 |                                  }
 | 
		
	
		
			
			| 49 | 49 |  
 | 
		
	
		
			
			| 50 |  | -                                $code = $state;
 | 
		
	
		
			
			|  | 50 | +                                $defaultCurrencyCode = Currency::getDefaultCurrencyCode();
 | 
		
	
		
			
			|  | 51 | +                                $currencyService = app(CurrencyService::class);
 | 
		
	
		
			
			| 51 | 52 |  
 | 
		
	
		
			
			|  | 53 | +                                $code = $state;
 | 
		
	
		
			
			| 52 | 54 |                                  $allCurrencies = Currency::getAllCurrencies();
 | 
		
	
		
			
			| 53 |  | -
 | 
		
	
		
			
			| 54 | 55 |                                  $selectedCurrencyCode = $allCurrencies[$code] ?? [];
 | 
		
	
		
			
			| 55 | 56 |  
 | 
		
	
		
			
			| 56 |  | -                                $currencyService = app(CurrencyService::class);
 | 
		
	
		
			
			| 57 |  | -                                $defaultCurrencyCode = Currency::getDefaultCurrencyCode();
 | 
		
	
		
			
			| 58 |  | -                                $rate = 1;
 | 
		
	
		
			
			| 59 |  | -
 | 
		
	
		
			
			| 60 |  | -                                if ($defaultCurrencyCode !== null) {
 | 
		
	
		
			
			| 61 |  | -                                    $rate = $currencyService->getCachedExchangeRate($defaultCurrencyCode, $code);
 | 
		
	
		
			
			| 62 |  | -                                }
 | 
		
	
		
			
			|  | 57 | +                                $rate = $defaultCurrencyCode ? $currencyService->getCachedExchangeRate($defaultCurrencyCode, $code) : 1;
 | 
		
	
		
			
			| 63 | 58 |  
 | 
		
	
		
			
			| 64 | 59 |                                  $set('name', $selectedCurrencyCode['name'] ?? '');
 | 
		
	
		
			
			| 65 |  | -                                $set('rate', $rate);
 | 
		
	
		
			
			|  | 60 | +                                $set('rate', $rate ?? '');
 | 
		
	
		
			
			| 66 | 61 |                                  $set('precision', $selectedCurrencyCode['precision'] ?? '');
 | 
		
	
		
			
			| 67 | 62 |                                  $set('symbol', $selectedCurrencyCode['symbol'] ?? '');
 | 
		
	
		
			
			| 68 | 63 |                                  $set('symbol_first', $selectedCurrencyCode['symbol_first'] ?? '');
 | 
		
	
	
		
			
			|  | @@ -71,7 +66,7 @@ class CurrencyResource extends Resource
 | 
		
	
		
			
			| 71 | 66 |                              }),
 | 
		
	
		
			
			| 72 | 67 |                          Forms\Components\TextInput::make('code')
 | 
		
	
		
			
			| 73 | 68 |                              ->label('Code')
 | 
		
	
		
			
			| 74 |  | -                            ->hidden(static fn (Forms\Get $get): bool => ! $get('enabled'))
 | 
		
	
		
			
			|  | 69 | +                            ->hidden(static fn (Forms\Get $get): bool => !($get('enabled') && $get('code') !== null))
 | 
		
	
		
			
			| 75 | 70 |                              ->disabled(static fn (Forms\Get $get): bool => $get('enabled'))
 | 
		
	
		
			
			| 76 | 71 |                              ->required(),
 | 
		
	
		
			
			| 77 | 72 |                          Forms\Components\TextInput::make('name')
 | 
		
	
	
		
			
			|  | @@ -80,14 +75,14 @@ class CurrencyResource extends Resource
 | 
		
	
		
			
			| 80 | 75 |                              ->required(),
 | 
		
	
		
			
			| 81 | 76 |                          Forms\Components\TextInput::make('rate')
 | 
		
	
		
			
			| 82 | 77 |                              ->label('Rate')
 | 
		
	
		
			
			| 83 |  | -                            ->dehydrateStateUsing(static fn (Forms\Get $get, $state): float => $get('enabled') ? '1.0' : (float) $state)
 | 
		
	
		
			
			| 84 | 78 |                              ->numeric()
 | 
		
	
		
			
			|  | 79 | +                            ->rule('gt:0')
 | 
		
	
		
			
			| 85 | 80 |                              ->live()
 | 
		
	
		
			
			| 86 |  | -                            ->disabled(static fn (Forms\Get $get): bool => $get('enabled'))
 | 
		
	
		
			
			| 87 | 81 |                              ->required(),
 | 
		
	
		
			
			| 88 | 82 |                          Forms\Components\Select::make('precision')
 | 
		
	
		
			
			| 89 | 83 |                              ->label('Precision')
 | 
		
	
		
			
			| 90 |  | -                            ->searchable()
 | 
		
	
		
			
			|  | 84 | +                            ->native(false)
 | 
		
	
		
			
			|  | 85 | +                            ->selectablePlaceholder(false)
 | 
		
	
		
			
			| 91 | 86 |                              ->placeholder('Select a precision...')
 | 
		
	
		
			
			| 92 | 87 |                              ->options(['0', '1', '2', '3', '4'])
 | 
		
	
		
			
			| 93 | 88 |                              ->required(),
 | 
		
	
	
		
			
			|  | @@ -97,8 +92,10 @@ class CurrencyResource extends Resource
 | 
		
	
		
			
			| 97 | 92 |                              ->required(),
 | 
		
	
		
			
			| 98 | 93 |                          Forms\Components\Select::make('symbol_first')
 | 
		
	
		
			
			| 99 | 94 |                              ->label('Symbol Position')
 | 
		
	
		
			
			| 100 |  | -                            ->searchable()
 | 
		
	
		
			
			| 101 |  | -                            ->boolean('Before Amount', 'After Amount', 'Select the currency symbol position...')
 | 
		
	
		
			
			|  | 95 | +                            ->native(false)
 | 
		
	
		
			
			|  | 96 | +                            ->selectablePlaceholder(false)
 | 
		
	
		
			
			|  | 97 | +                            ->formatStateUsing(static fn($state) => isset($state) ? (int) $state : null)
 | 
		
	
		
			
			|  | 98 | +                            ->boolean('Before Amount', 'After Amount', 'Select a symbol position...')
 | 
		
	
		
			
			| 102 | 99 |                              ->required(),
 | 
		
	
		
			
			| 103 | 100 |                          Forms\Components\TextInput::make('decimal_mark')
 | 
		
	
		
			
			| 104 | 101 |                              ->label('Decimal Separator')
 | 
		
	
	
		
			
			|  | @@ -107,29 +104,39 @@ class CurrencyResource extends Resource
 | 
		
	
		
			
			| 107 | 104 |                          Forms\Components\TextInput::make('thousands_separator')
 | 
		
	
		
			
			| 108 | 105 |                              ->label('Thousands Separator')
 | 
		
	
		
			
			| 109 | 106 |                              ->maxLength(1)
 | 
		
	
		
			
			| 110 |  | -                            ->required(),
 | 
		
	
		
			
			|  | 107 | +                            ->rule(static function (Forms\Get $get): Closure {
 | 
		
	
		
			
			|  | 108 | +                                return static function ($attribute, $value, Closure $fail) use ($get) {
 | 
		
	
		
			
			|  | 109 | +                                    $decimalMark = $get('decimal_mark');
 | 
		
	
		
			
			|  | 110 | +
 | 
		
	
		
			
			|  | 111 | +                                    if ($value === $decimalMark) {
 | 
		
	
		
			
			|  | 112 | +                                        $fail('The thousands separator and decimal separator must be different.');
 | 
		
	
		
			
			|  | 113 | +                                    }
 | 
		
	
		
			
			|  | 114 | +                                };
 | 
		
	
		
			
			|  | 115 | +                            })
 | 
		
	
		
			
			|  | 116 | +                            ->nullable(),
 | 
		
	
		
			
			| 111 | 117 |                          ToggleButton::make('enabled')
 | 
		
	
		
			
			| 112 | 118 |                              ->label('Default Currency')
 | 
		
	
		
			
			| 113 | 119 |                              ->live()
 | 
		
	
		
			
			| 114 |  | -                            ->offColor(Color::Red)
 | 
		
	
		
			
			| 115 |  | -                            ->onColor(Color::Indigo)
 | 
		
	
		
			
			|  | 120 | +                            ->offColor('danger')
 | 
		
	
		
			
			|  | 121 | +                            ->onColor('primary')
 | 
		
	
		
			
			| 116 | 122 |                              ->afterStateUpdated(static function (Forms\Set $set, Forms\Get $get, $state) {
 | 
		
	
		
			
			| 117 |  | -                                $enabled = $state;
 | 
		
	
		
			
			|  | 123 | +                                $enabledState = (bool)$state;
 | 
		
	
		
			
			| 118 | 124 |                                  $code = $get('code');
 | 
		
	
		
			
			|  | 125 | +
 | 
		
	
		
			
			|  | 126 | +                                $defaultCurrencyCode = Currency::getDefaultCurrencyCode();
 | 
		
	
		
			
			| 119 | 127 |                                  $currencyService = app(CurrencyService::class);
 | 
		
	
		
			
			| 120 | 128 |  
 | 
		
	
		
			
			| 121 |  | -                                if ($enabled) {
 | 
		
	
		
			
			| 122 |  | -                                    $rate = 1;
 | 
		
	
		
			
			|  | 129 | +                                if ($enabledState) {
 | 
		
	
		
			
			|  | 130 | +                                    $set('rate', 1);
 | 
		
	
		
			
			| 123 | 131 |                                  } else {
 | 
		
	
		
			
			| 124 | 132 |                                      if ($code === null) {
 | 
		
	
		
			
			| 125 | 133 |                                          return;
 | 
		
	
		
			
			| 126 | 134 |                                      }
 | 
		
	
		
			
			| 127 | 135 |  
 | 
		
	
		
			
			| 128 |  | -                                    $defaultCurrencyCode = Currency::getDefaultCurrencyCode();
 | 
		
	
		
			
			| 129 |  | -                                    $rate = $defaultCurrencyCode ? $currencyService->getCachedExchangeRate($defaultCurrencyCode, $code) : 1;
 | 
		
	
		
			
			| 130 |  | -                                }
 | 
		
	
		
			
			|  | 136 | +                                    $rate = $currencyService->getCachedExchangeRate($defaultCurrencyCode, $code);
 | 
		
	
		
			
			| 131 | 137 |  
 | 
		
	
		
			
			| 132 |  | -                                $set('rate', $rate);
 | 
		
	
		
			
			|  | 138 | +                                    $set('rate', $rate ?? '');
 | 
		
	
		
			
			|  | 139 | +                                }
 | 
		
	
		
			
			| 133 | 140 |                              }),
 | 
		
	
		
			
			| 134 | 141 |                      ])->columns(),
 | 
		
	
		
			
			| 135 | 142 |              ]);
 |