. */ declare(strict_types=1); namespace FireflyIII\Models; use FireflyIII\Casts\SeparateTimezoneCaster; use FireflyIII\Support\Models\ReturnsIntegerIdTrait; use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait; use FireflyIII\User; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; class CurrencyExchangeRate extends Model { use ReturnsIntegerIdTrait; use ReturnsIntegerUserIdTrait; use SoftDeletes; protected $casts = [ 'created_at' => 'datetime', 'updated_at' => 'datetime', 'user_id' => 'int', 'from_currency_id' => 'int', 'to_currency_id' => 'int', 'date' => SeparateTimezoneCaster::class, 'rate' => 'string', 'user_rate' => 'string', ]; protected $fillable = ['user_id', 'from_currency_id', 'to_currency_id', 'date', 'date_tz', 'rate']; public function fromCurrency(): BelongsTo { return $this->belongsTo(TransactionCurrency::class, 'from_currency_id'); } public function toCurrency(): BelongsTo { return $this->belongsTo(TransactionCurrency::class, 'to_currency_id'); } public function user(): BelongsTo { return $this->belongsTo(User::class); } protected function fromCurrencyId(): Attribute { return Attribute::make( get: static fn ($value) => (int) $value, ); } protected function rate(): Attribute { return Attribute::make( get: static fn ($value) => (string) $value, ); } protected function toCurrencyId(): Attribute { return Attribute::make( get: static fn ($value) => (int) $value, ); } protected function userRate(): Attribute { return Attribute::make( get: static fn ($value) => (string) $value, ); } }