. */ declare(strict_types=1); namespace FireflyIII\Models; use Carbon\Carbon; use FireflyIII\Casts\SeparateTimezoneCaster; use FireflyIII\Support\Models\ReturnsIntegerIdTrait; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * @mixin IdeHelperPiggyBankRepetition */ class PiggyBankRepetition extends Model { use ReturnsIntegerIdTrait; protected $casts = [ 'created_at' => 'datetime', 'updated_at' => 'datetime', 'start_date' => SeparateTimezoneCaster::class, 'target_date' => SeparateTimezoneCaster::class, 'virtual_balance' => 'string', ]; protected $fillable = ['piggy_bank_id', 'start_date', 'start_date_tz', 'target_date', 'target_date_tz', 'current_amount']; public function piggyBank(): BelongsTo { return $this->belongsTo(PiggyBank::class); } public function scopeOnDates(EloquentBuilder $query, Carbon $start, Carbon $target): EloquentBuilder { return $query->where('start_date', $start->format('Y-m-d'))->where('target_date', $target->format('Y-m-d')); } /** * @return EloquentBuilder */ public function scopeRelevantOnDate(EloquentBuilder $query, Carbon $date) { return $query->where( static function (EloquentBuilder $q) use ($date): void { $q->where('start_date', '<=', $date->format('Y-m-d 00:00:00')); $q->orWhereNull('start_date'); } ) ->where( static function (EloquentBuilder $q) use ($date): void { $q->where('target_date', '>=', $date->format('Y-m-d 00:00:00')); $q->orWhereNull('target_date'); } ) ; } /** * @param mixed $value */ public function setCurrentAmountAttribute($value): void { $this->attributes['current_amount'] = (string)$value; } /** * Get the amount */ protected function currentAmount(): Attribute { return Attribute::make( get: static fn ($value) => (string)$value, ); } protected function piggyBankId(): Attribute { return Attribute::make( get: static fn ($value) => (int)$value, ); } }