CashTransactionType::class, 'amount' => 'integer', 'balance_after' => 'integer', ]; } protected function formattedAmount(): Attribute { return Attribute::make( get: fn () => 'Rp '.number_format($this->amount, 0, ',', '.'), ); } protected function formattedBalanceAfter(): Attribute { return Attribute::make( get: fn () => 'Rp '.number_format($this->balance_after, 0, ',', '.'), ); } protected function formattedCreatedAt(): Attribute { return Attribute::make( get: fn () => $this->created_at?->translatedFormat('l, d F Y'), ); } protected function typeLabel(): Attribute { return Attribute::make( get: fn () => $this->type->label(), ); } #[Scope] protected function deposit(Builder $query): void { $query->where('type', CashTransactionType::DEPOSIT); } #[Scope] protected function expenseType(Builder $query): void { $query->where('type', CashTransactionType::EXPENSE); } #[Scope] protected function transfer(Builder $query): void { $query->where('type', CashTransactionType::TRANSFER); } #[Scope] protected function withdrawal(Builder $query): void { $query->where('type', CashTransactionType::WITHDRAWAL); } public function cashAccount(): BelongsTo { return $this->belongsTo(CashAccount::class); } public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by_id'); } public function employeeAdvances(): HasMany { return $this->hasMany(EmployeeAdvance::class); } public function expense(): HasOne { return $this->hasOne(Expense::class); } public function order(): HasOne { return $this->hasOne(Order::class); } public function payrolls(): HasMany { return $this->hasMany(Payroll::class); } public function reference(): MorphTo { return $this->morphTo(); } public function registerMediaCollections(): void { $this->addMediaCollection('photos'); } public function registerMediaConversions(?Media $media = null): void { $this->addMediaConversion('thumb') ->fit(Fit::Contain, 150, 150); } }