'date', 'amount' => 'decimal:2', ]; } protected static function booted(): void { static::saving(function (Advance $advance) { $typeName = AdvanceType::whereKey($advance->advance_type_id)->value('name'); $amount = abs((float) $advance->amount); $advance->amount = $typeName === 'Wpłata' ? $amount : -$amount; }); static::saved(function (Advance $advance) { static::refreshUserAdvanceBalance($advance->user_id); if ($advance->wasChanged('user_id')) { static::refreshUserAdvanceBalance($advance->getOriginal('user_id')); } }); static::deleted(function (Advance $advance) { static::refreshUserAdvanceBalance($advance->user_id); }); } private static function refreshUserAdvanceBalance(int $userId): void { $balance = static::where('user_id', $userId)->sum('amount'); UserAdvanceBalance::updateOrCreate( ['user_id' => $userId], ['balance' => (float) $balance] ); } public function user(): BelongsTo { return $this->belongsTo(User::class); } public function type(): BelongsTo { return $this->belongsTo(AdvanceType::class, 'advance_type_id'); } }