*/ protected $fillable = [ 'type', 'amount', 'credit_account_id', 'created_at', ]; /** * The attributes that should be cast. * * @var array */ protected $casts = [ 'type' => BalanceOperationEnum::class ]; /** * Perform any actions required after the model boots. * * @return void */ protected static function booted(): void { static::creating(function (self $model) { $model->created_at = now(); if ($model->type->equals(BalanceOperationEnum::debit)) { $model->account->balance = $model->account->balance - $model->amount; } if ($model->type->equals(BalanceOperationEnum::credit)) { $model->account->balance = $model->account->balance + $model->amount; } $model->account->saveOrFail(); }); static::deleting(function () { throw new \Error('Action impossible'); }); } // * RELATIONSHIPS /** * BelongsToMany estimation relation (1 nullable). * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ public function estimation(): \Illuminate\Database\Eloquent\Relations\BelongsToMany { return $this->belongsToMany(Estimation::class, EstimationLog::class, 'credit_log_id', 'credit_estimation_id') ->withTimestamps(); } /** * BelongsTo account relation. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function account(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Account::class, 'credit_account_id'); } }