Refactor models.

This commit is contained in:
James Cole
2025-09-14 09:00:01 +02:00
parent 935453796e
commit 9d9483e20f
46 changed files with 688 additions and 676 deletions

View File

@@ -23,13 +23,13 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use FireflyIII\Handlers\Observer\AccountObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Attributes\Scope;
use FireflyIII\Enums\AccountTypeEnum;
use FireflyIII\Handlers\Observer\AccountObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;
use FireflyIII\User;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@@ -98,39 +98,6 @@ class Account extends Model
return $this->morphMany(Attachment::class, 'attachable');
}
/**
* Get the account number.
*/
protected function accountNumber(): Attribute
{
return Attribute::make(get: function () {
/** @var null|AccountMeta $metaValue */
$metaValue = $this->accountMeta()
->where('name', 'account_number')
->first()
;
return null !== $metaValue ? $metaValue->data : '';
});
}
public function accountMeta(): HasMany
{
return $this->hasMany(AccountMeta::class);
}
protected function editName(): Attribute
{
return Attribute::make(get: function () {
$name = $this->name;
if (AccountTypeEnum::CASH->value === $this->accountType->type) {
return '';
}
return $name;
});
}
public function locations(): MorphMany
{
return $this->morphMany(Location::class, 'locatable');
@@ -157,16 +124,6 @@ class Account extends Model
return $this->belongsToMany(PiggyBank::class);
}
#[Scope]
protected function accountTypeIn(EloquentBuilder $query, array $types): void
{
if (false === $this->joinedAccountTypes) {
$query->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id');
$this->joinedAccountTypes = true;
}
$query->whereIn('account_types.type', $types);
}
public function setVirtualBalanceAttribute(mixed $value): void
{
$value = (string)$value;
@@ -193,6 +150,26 @@ class Account extends Model
);
}
/**
* Get the account number.
*/
protected function accountNumber(): Attribute
{
return Attribute::make(get: function () {
/** @var null|AccountMeta $metaValue */
$metaValue = $this->accountMeta()
->where('name', 'account_number')
->first();
return null !== $metaValue ? $metaValue->data : '';
});
}
public function accountMeta(): HasMany
{
return $this->hasMany(AccountMeta::class);
}
/**
* Get the user ID
*/
@@ -203,6 +180,43 @@ class Account extends Model
);
}
#[Scope]
protected function accountTypeIn(EloquentBuilder $query, array $types): void
{
if (false === $this->joinedAccountTypes) {
$query->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id');
$this->joinedAccountTypes = true;
}
$query->whereIn('account_types.type', $types);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'user_id' => 'integer',
'user_group_id' => 'integer',
'deleted_at' => 'datetime',
'active' => 'boolean',
'encrypted' => 'boolean',
'virtual_balance' => 'string',
'native_virtual_balance' => 'string',
];
}
protected function editName(): Attribute
{
return Attribute::make(get: function () {
$name = $this->name;
if (AccountTypeEnum::CASH->value === $this->accountType->type) {
return '';
}
return $name;
});
}
protected function iban(): Attribute
{
return Attribute::make(
@@ -226,19 +240,4 @@ class Account extends Model
get: static fn($value) => (string)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'user_id' => 'integer',
'user_group_id' => 'integer',
'deleted_at' => 'datetime',
'active' => 'boolean',
'encrypted' => 'boolean',
'virtual_balance' => 'string',
'native_virtual_balance' => 'string',
];
}
}

View File

@@ -23,11 +23,10 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use function Safe\json_decode;
use function Safe\json_encode;
@@ -43,11 +42,6 @@ class AccountMeta extends Model
return $this->belongsTo(Account::class);
}
protected function data(): Attribute
{
return Attribute::make(get: fn (mixed $value) => (string) json_decode((string) $value, true), set: fn (mixed $value) => ['data' => json_encode($value)]);
}
protected function casts(): array
{
return [
@@ -55,4 +49,9 @@ class AccountMeta extends Model
'updated_at' => 'datetime',
];
}
protected function data(): Attribute
{
return Attribute::make(get: fn(mixed $value) => (string)json_decode((string)$value, true), set: fn(mixed $value) => ['data' => json_encode($value)]);
}
}

View File

@@ -32,46 +32,60 @@ class AccountType extends Model
{
use ReturnsIntegerIdTrait;
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string ASSET = 'Asset account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string BENEFICIARY = 'Beneficiary account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string CASH = 'Cash account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string CREDITCARD = 'Credit card';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string DEBT = 'Debt';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string DEFAULT = 'Default account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string EXPENSE = 'Expense account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string IMPORT = 'Import account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string INITIAL_BALANCE = 'Initial balance account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string LIABILITY_CREDIT = 'Liability credit account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string LOAN = 'Loan';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string MORTGAGE = 'Mortgage';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string RECONCILIATION = 'Reconciliation account';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string REVENUE = 'Revenue account';
protected $casts

View File

@@ -52,13 +52,6 @@ class AuditLogEntry extends Model
);
}
protected function changerId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -69,4 +62,11 @@ class AuditLogEntry extends Model
'deleted_at' => 'datetime',
];
}
protected function changerId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -84,6 +84,22 @@ class AvailableBudget extends Model
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'start_date' => 'date',
'end_date' => 'date',
'transaction_currency_id' => 'int',
'amount' => 'string',
'native_amount' => 'string',
'user_id' => 'integer',
'user_group_id' => 'integer',
];
}
protected function endDate(): Attribute
{
return Attribute::make(
@@ -106,20 +122,4 @@ class AvailableBudget extends Model
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'start_date' => 'date',
'end_date' => 'date',
'transaction_currency_id' => 'int',
'amount' => 'string',
'native_amount' => 'string',
'user_id' => 'integer',
'user_group_id' => 'integer',
];
}
}

View File

@@ -165,6 +165,27 @@ class Bill extends Model
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'date' => SeparateTimezoneCaster::class,
'end_date' => SeparateTimezoneCaster::class,
'extension_date' => SeparateTimezoneCaster::class,
'skip' => 'int',
'automatch' => 'boolean',
'active' => 'boolean',
'name_encrypted' => 'boolean',
'match_encrypted' => 'boolean',
'amount_min' => 'string',
'amount_max' => 'string',
'native_amount_min' => 'string',
'native_amount_max' => 'string',
];
}
protected function order(): Attribute
{
return Attribute::make(
@@ -188,25 +209,4 @@ class Bill extends Model
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'date' => SeparateTimezoneCaster::class,
'end_date' => SeparateTimezoneCaster::class,
'extension_date' => SeparateTimezoneCaster::class,
'skip' => 'int',
'automatch' => 'boolean',
'active' => 'boolean',
'name_encrypted' => 'boolean',
'match_encrypted' => 'boolean',
'amount_min' => 'string',
'amount_max' => 'string',
'native_amount_min' => 'string',
'native_amount_max' => 'string',
];
}
}

View File

@@ -109,13 +109,6 @@ class Budget extends Model
return $this->belongsToMany(Transaction::class, 'budget_transaction', 'budget_id');
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -128,4 +121,11 @@ class Budget extends Model
'user_group_id' => 'integer',
];
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -96,13 +96,6 @@ class BudgetLimit extends Model
);
}
protected function transactionCurrencyId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
@@ -115,4 +108,11 @@ class BudgetLimit extends Model
'native_amount' => 'string',
];
}
protected function transactionCurrencyId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use FireflyIII\Handlers\Observer\AccountObserver;
use FireflyIII\Handlers\Observer\CategoryObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;

View File

@@ -23,11 +23,10 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use function Safe\json_decode;
use function Safe\json_encode;
@@ -38,14 +37,6 @@ class Configuration extends Model
protected $table = 'configuration';
/**
* TODO can be replaced with native laravel code.
*/
protected function data(): Attribute
{
return Attribute::make(get: fn ($value) => json_decode((string) $value), set: fn ($value) => ['data' => json_encode($value)]);
}
protected function casts(): array
{
return [
@@ -54,4 +45,12 @@ class Configuration extends Model
'deleted_at' => 'datetime',
];
}
/**
* TODO can be replaced with native laravel code.
*/
protected function data(): Attribute
{
return Attribute::make(get: fn($value) => json_decode((string)$value), set: fn($value) => ['data' => json_encode($value)]);
}
}

View File

@@ -37,6 +37,7 @@ class CurrencyExchangeRate extends Model
use ReturnsIntegerIdTrait;
use ReturnsIntegerUserIdTrait;
use SoftDeletes;
protected $fillable = ['user_id', 'from_currency_id', 'to_currency_id', 'date', 'date_tz', 'rate'];
public function fromCurrency(): BelongsTo
@@ -54,6 +55,21 @@ class CurrencyExchangeRate extends Model
return $this->belongsTo(User::class);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'user_id' => 'integer',
'user_group_id' => 'integer',
'from_currency_id' => 'integer',
'to_currency_id' => 'integer',
'date' => SeparateTimezoneCaster::class,
'rate' => 'string',
'user_rate' => 'string',
];
}
protected function fromCurrencyId(): Attribute
{
return Attribute::make(
@@ -81,19 +97,4 @@ class CurrencyExchangeRate extends Model
get: static fn($value) => (string)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'user_id' => 'integer',
'user_group_id' => 'integer',
'from_currency_id' => 'integer',
'to_currency_id' => 'integer',
'date' => SeparateTimezoneCaster::class,
'rate' => 'string',
'user_rate' => 'string',
];
}
}

View File

@@ -53,13 +53,6 @@ class GroupMembership extends Model
return $this->belongsTo(UserRole::class);
}
protected function userRoleId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -69,4 +62,11 @@ class GroupMembership extends Model
'user_group_id' => 'integer',
];
}
protected function userRoleId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -36,6 +36,7 @@ class InvitedUser extends Model
{
use ReturnsIntegerIdTrait;
use ReturnsIntegerUserIdTrait;
protected $fillable = ['user_group_id', 'user_id', 'email', 'invite_code', 'expires', 'expires_tz', 'redeemed'];
/**

View File

@@ -66,13 +66,6 @@ class Location extends Model
return $this->morphMany(TransactionJournal::class, 'locatable');
}
protected function locatableId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -84,4 +77,11 @@ class Location extends Model
'longitude' => 'float',
];
}
protected function locatableId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -44,13 +44,6 @@ class Note extends Model
return $this->morphTo();
}
protected function noteableId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -59,4 +52,11 @@ class Note extends Model
'deleted_at' => 'datetime',
];
}
protected function noteableId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -37,6 +37,7 @@ class ObjectGroup extends Model
{
use ReturnsIntegerIdTrait;
use ReturnsIntegerUserIdTrait;
protected $fillable = ['title', 'order', 'user_id', 'user_group_id'];
/**
@@ -51,8 +52,7 @@ class ObjectGroup extends Model
/** @var null|ObjectGroup $objectGroup */
$objectGroup = self::where('object_groups.id', $objectGroupId)
->where('object_groups.user_id', auth()->user()->id)->first()
;
->where('object_groups.user_id', auth()->user()->id)->first();
if (null !== $objectGroup) {
return $objectGroup;
}
@@ -90,13 +90,6 @@ class ObjectGroup extends Model
return $this->morphedByMany(PiggyBank::class, 'object_groupable');
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -107,4 +100,11 @@ class ObjectGroup extends Model
'deleted_at' => 'datetime',
];
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -126,6 +126,22 @@ class PiggyBank extends Model
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'start_date' => 'date',
'target_date' => 'date',
'order' => 'int',
'active' => 'boolean',
'encrypted' => 'boolean',
'target_amount' => 'string',
'native_target_amount' => 'string',
];
}
protected function order(): Attribute
{
return Attribute::make(
@@ -142,20 +158,4 @@ class PiggyBank extends Model
get: static fn($value) => (string)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'start_date' => 'date',
'target_date' => 'date',
'order' => 'int',
'active' => 'boolean',
'encrypted' => 'boolean',
'target_amount' => 'string',
'native_target_amount' => 'string',
];
}
}

View File

@@ -68,13 +68,6 @@ class PiggyBankEvent extends Model
);
}
protected function piggyBankId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
@@ -85,4 +78,11 @@ class PiggyBankEvent extends Model
'native_amount' => 'string',
];
}
protected function piggyBankId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -23,10 +23,10 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Carbon\Carbon;
use FireflyIII\Casts\SeparateTimezoneCaster;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
@@ -43,12 +43,48 @@ class PiggyBankRepetition extends Model
return $this->belongsTo(PiggyBank::class);
}
/**
* @param mixed $value
*/
public function setCurrentAmountAttribute($value): void
{
$this->attributes['current_amount'] = (string)$value;
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'start_date' => SeparateTimezoneCaster::class,
'target_date' => SeparateTimezoneCaster::class,
'virtual_balance' => 'string',
];
}
/**
* Get the amount
*/
protected function currentAmount(): Attribute
{
return Attribute::make(
get: static fn($value) => (string)$value,
);
}
#[Scope]
protected function onDates(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'));
}
protected function piggyBankId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
/**
* @return EloquentBuilder
*/
@@ -66,43 +102,6 @@ class PiggyBankRepetition extends Model
$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,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'start_date' => SeparateTimezoneCaster::class,
'target_date' => SeparateTimezoneCaster::class,
'virtual_balance' => 'string',
];
}
}

View File

@@ -116,13 +116,6 @@ class Recurrence extends Model
return $this->belongsTo(TransactionType::class);
}
protected function transactionTypeId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
@@ -142,4 +135,11 @@ class Recurrence extends Model
'user_group_id' => 'integer',
];
}
protected function transactionTypeId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -44,13 +44,6 @@ class RecurrenceMeta extends Model
return $this->belongsTo(Recurrence::class);
}
protected function recurrenceId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -61,4 +54,11 @@ class RecurrenceMeta extends Model
'value' => 'string',
];
}
protected function recurrenceId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -36,16 +36,20 @@ class RecurrenceRepetition extends Model
use ReturnsIntegerIdTrait;
use SoftDeletes;
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const int WEEKEND_DO_NOTHING = 1;
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const int WEEKEND_SKIP_CREATION = 2;
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const int WEEKEND_TO_FRIDAY = 3;
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const int WEEKEND_TO_MONDAY = 4;
protected $casts

View File

@@ -95,6 +95,18 @@ class RecurrenceTransaction extends Model
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'amount' => 'string',
'foreign_amount' => 'string',
'description' => 'string',
];
}
protected function destinationId(): Attribute
{
return Attribute::make(
@@ -136,16 +148,4 @@ class RecurrenceTransaction extends Model
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
'amount' => 'string',
'foreign_amount' => 'string',
'description' => 'string',
];
}
}

View File

@@ -44,13 +44,6 @@ class RecurrenceTransactionMeta extends Model
return $this->belongsTo(RecurrenceTransaction::class, 'rt_id');
}
protected function rtId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -61,4 +54,11 @@ class RecurrenceTransactionMeta extends Model
'value' => 'string',
];
}
protected function rtId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -87,30 +87,11 @@ class Rule extends Model
return $this->hasMany(RuleTrigger::class);
}
protected function description(): Attribute
{
return Attribute::make(set: fn($value) => ['description' => e($value)]);
}
public function userGroup(): BelongsTo
{
return $this->belongsTo(UserGroup::class);
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
protected function ruleGroupId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
@@ -126,4 +107,23 @@ class Rule extends Model
'user_group_id' => 'integer',
];
}
protected function description(): Attribute
{
return Attribute::make(set: fn($value) => ['description' => e($value)]);
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
protected function ruleGroupId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -66,6 +66,17 @@ class RuleAction extends Model
return $this->belongsTo(Rule::class);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'active' => 'boolean',
'order' => 'int',
'stop_processing' => 'boolean',
];
}
protected function order(): Attribute
{
return Attribute::make(
@@ -79,15 +90,4 @@ class RuleAction extends Model
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'active' => 'boolean',
'order' => 'int',
'stop_processing' => 'boolean',
];
}
}

View File

@@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use FireflyIII\Handlers\Observer\AccountObserver;
use FireflyIII\Handlers\Observer\RuleGroupObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;
@@ -78,13 +77,6 @@ class RuleGroup extends Model
return $this->hasMany(Rule::class);
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -98,4 +90,11 @@ class RuleGroup extends Model
'user_group_id' => 'integer',
];
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -39,6 +39,17 @@ class RuleTrigger extends Model
return $this->belongsTo(Rule::class);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'active' => 'boolean',
'order' => 'int',
'stop_processing' => 'boolean',
];
}
protected function order(): Attribute
{
return Attribute::make(
@@ -52,15 +63,4 @@ class RuleTrigger extends Model
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
'active' => 'boolean',
'order' => 'int',
'stop_processing' => 'boolean',
];
}
}

View File

@@ -24,7 +24,6 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use FireflyIII\Casts\SeparateTimezoneCaster;
use FireflyIII\Handlers\Observer\AccountObserver;
use FireflyIII\Handlers\Observer\TagObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;

View File

@@ -23,12 +23,11 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use FireflyIII\Handlers\Observer\AccountObserver;
use Carbon\Carbon;
use FireflyIII\Handlers\Observer\TransactionObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Carbon\Carbon;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@@ -93,6 +92,31 @@ class Transaction extends Model
return $this->belongsTo(TransactionCurrency::class, 'foreign_currency_id');
}
/**
* @param mixed $value
*/
public function setAmountAttribute($value): void
{
$this->attributes['amount'] = (string)$value;
}
public function transactionCurrency(): BelongsTo
{
return $this->belongsTo(TransactionCurrency::class);
}
public function transactionJournal(): BelongsTo
{
return $this->belongsTo(TransactionJournal::class);
}
protected function accountId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
/**
* Check for transactions AFTER a specified date.
*/
@@ -121,56 +145,6 @@ class Transaction extends Model
return false;
}
/**
* Check for transactions BEFORE the specified date.
*/
#[Scope]
protected function before(Builder $query, Carbon $date): void
{
if (!self::isJoined($query, 'transaction_journals')) {
$query->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id');
}
$query->where('transaction_journals.date', '<=', $date->format('Y-m-d 23:59:59'));
}
#[Scope]
protected function transactionTypes(Builder $query, array $types): void
{
if (!self::isJoined($query, 'transaction_journals')) {
$query->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id');
}
if (!self::isJoined($query, 'transaction_types')) {
$query->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id');
}
$query->whereIn('transaction_types.type', $types);
}
/**
* @param mixed $value
*/
public function setAmountAttribute($value): void
{
$this->attributes['amount'] = (string) $value;
}
public function transactionCurrency(): BelongsTo
{
return $this->belongsTo(TransactionCurrency::class);
}
public function transactionJournal(): BelongsTo
{
return $this->belongsTo(TransactionJournal::class);
}
protected function accountId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
/**
* Get the amount
*/
@@ -189,20 +163,15 @@ class Transaction extends Model
}
/**
* Get the foreign amount
* Check for transactions BEFORE the specified date.
*/
protected function foreignAmount(): Attribute
#[Scope]
protected function before(Builder $query, Carbon $date): void
{
return Attribute::make(
get: static fn ($value) => (string) $value,
);
if (!self::isJoined($query, 'transaction_journals')) {
$query->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id');
}
protected function transactionJournalId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
$query->where('transaction_journals.date', '<=', $date->format('Y-m-d 23:59:59'));
}
protected function casts(): array
@@ -225,4 +194,34 @@ class Transaction extends Model
'native_foreign_amount' => 'string',
];
}
/**
* Get the foreign amount
*/
protected function foreignAmount(): Attribute
{
return Attribute::make(
get: static fn($value) => (string)$value,
);
}
protected function transactionJournalId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
#[Scope]
protected function transactionTypes(Builder $query, array $types): void
{
if (!self::isJoined($query, 'transaction_journals')) {
$query->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id');
}
if (!self::isJoined($query, 'transaction_types')) {
$query->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id');
}
$query->whereIn('transaction_types.type', $types);
}
}

View File

@@ -101,13 +101,6 @@ class TransactionCurrency extends Model
return $this->belongsToMany(User::class)->withTimestamps()->withPivot('user_default');
}
protected function decimalPlaces(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -118,4 +111,11 @@ class TransactionCurrency extends Model
'enabled' => 'bool',
];
}
protected function decimalPlaces(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -23,7 +23,6 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use FireflyIII\Handlers\Observer\AccountObserver;
use FireflyIII\Handlers\Observer\TransactionGroupObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;
@@ -62,8 +61,7 @@ class TransactionGroup extends Model
/** @var null|TransactionGroup $group */
$group = $user->transactionGroups()
->with(['transactionJournals', 'transactionJournals.transactions'])
->where('transaction_groups.id', $groupId)->first(['transaction_groups.*'])
;
->where('transaction_groups.id', $groupId)->first(['transaction_groups.*']);
if (null !== $group) {
app('log')->debug(sprintf('Found group #%d.', $group->id));

View File

@@ -23,16 +23,15 @@ declare(strict_types=1);
namespace FireflyIII\Models;
use FireflyIII\Handlers\Observer\AccountObserver;
use FireflyIII\Handlers\Observer\TransactionJournalObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Carbon\Carbon;
use FireflyIII\Casts\SeparateTimezoneCaster;
use FireflyIII\Enums\TransactionTypeEnum;
use FireflyIII\Handlers\Observer\TransactionJournalObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;
use FireflyIII\User;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
@@ -49,7 +48,6 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
* @method EloquentBuilder|static after()
* @method static EloquentBuilder|static query()
*/
#[ObservedBy([TransactionJournalObserver::class])]
class TransactionJournal extends Model
{
@@ -170,32 +168,6 @@ class TransactionJournal extends Model
return $query->where('transaction_journals.date', '<=', $date->format('Y-m-d H:i:s'));
}
#[Scope]
protected function transactionTypes(EloquentBuilder $query, array $types): void
{
if (!self::isJoined($query, 'transaction_types')) {
$query->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id');
}
if (0 !== count($types)) {
$query->whereIn('transaction_types.type', $types);
}
}
/**
* Checks if tables are joined.
*/
public static function isJoined(EloquentBuilder $query, string $table): bool
{
$joins = $query->getQuery()->joins;
foreach ($joins as $join) {
if ($join->table === $table) {
return true;
}
}
return false;
}
public function sourceJournalLinks(): HasMany
{
return $this->hasMany(TransactionJournalLink::class, 'source_id');
@@ -236,20 +208,6 @@ class TransactionJournal extends Model
return $this->belongsTo(UserGroup::class);
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function transactionTypeId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -268,4 +226,44 @@ class TransactionJournal extends Model
'user_group_id' => 'integer',
];
}
protected function order(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
protected function transactionTypeId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
#[Scope]
protected function transactionTypes(EloquentBuilder $query, array $types): void
{
if (!self::isJoined($query, 'transaction_types')) {
$query->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id');
}
if (0 !== count($types)) {
$query->whereIn('transaction_types.type', $types);
}
}
/**
* Checks if tables are joined.
*/
public static function isJoined(EloquentBuilder $query, string $table): bool
{
$joins = $query->getQuery()->joins;
foreach ($joins as $join) {
if ($join->table === $table) {
return true;
}
}
return false;
}
}

View File

@@ -50,8 +50,7 @@ class TransactionJournalLink extends Model
->leftJoin('transaction_journals as t_b', 't_b.id', '=', 'destination_id')
->where('t_a.user_id', auth()->user()->id)
->where('t_b.user_id', auth()->user()->id)
->first(['journal_links.*'])
;
->first(['journal_links.*']);
if (null !== $link) {
return $link;
}
@@ -83,6 +82,14 @@ class TransactionJournalLink extends Model
return $this->belongsTo(TransactionJournal::class, 'source_id');
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
}
protected function destinationId(): Attribute
{
return Attribute::make(
@@ -103,12 +110,4 @@ class TransactionJournalLink extends Model
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
}
}

View File

@@ -28,7 +28,6 @@ use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use function Safe\json_decode;
use function Safe\json_encode;
@@ -41,27 +40,11 @@ class TransactionJournalMeta extends Model
protected $table = 'journal_meta';
protected function data(): Attribute
{
return Attribute::make(get: fn ($value) => json_decode((string) $value, false), set: function ($value) {
$data = json_encode($value);
return ['data' => $data, 'hash' => hash('sha256', $data)];
});
}
public function transactionJournal(): BelongsTo
{
return $this->belongsTo(TransactionJournal::class);
}
protected function transactionJournalId(): Attribute
{
return Attribute::make(
get: static fn ($value) => (int) $value,
);
}
protected function casts(): array
{
return [
@@ -70,4 +53,20 @@ class TransactionJournalMeta extends Model
'deleted_at' => 'datetime',
];
}
protected function data(): Attribute
{
return Attribute::make(get: fn($value) => json_decode((string)$value, false), set: function ($value) {
$data = json_encode($value);
return ['data' => $data, 'hash' => hash('sha256', $data)];
});
}
protected function transactionJournalId(): Attribute
{
return Attribute::make(
get: static fn($value) => (int)$value,
);
}
}

View File

@@ -36,25 +36,32 @@ class TransactionType extends Model
use ReturnsIntegerIdTrait;
use SoftDeletes;
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string DEPOSIT = 'Deposit';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string INVALID = 'Invalid';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string LIABILITY_CREDIT = 'Liability credit';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string OPENING_BALANCE = 'Opening balance';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string RECONCILIATION = 'Reconciliation';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string TRANSFER = 'Transfer';
#[Deprecated] /** @deprecated */
#[Deprecated]
/** @deprecated */
public const string WITHDRAWAL = 'Withdrawal';
protected $casts

View File

@@ -27,7 +27,6 @@ namespace FireflyIII\Models;
use FireflyIII\Enums\WebhookDelivery as WebhookDeliveryEnum;
use FireflyIII\Enums\WebhookResponse as WebhookResponseEnum;
use FireflyIII\Enums\WebhookTrigger as WebhookTriggerEnum;
use FireflyIII\Handlers\Observer\AccountObserver;
use FireflyIII\Handlers\Observer\WebhookObserver;
use FireflyIII\Support\Models\ReturnsIntegerIdTrait;
use FireflyIII\Support\Models\ReturnsIntegerUserIdTrait;
@@ -155,16 +154,16 @@ class Webhook extends Model
return $this->belongsTo(User::class);
}
public function webhookMessages(): HasMany
{
return $this->hasMany(WebhookMessage::class);
}
public function webhookDeliveries(): BelongsToMany
{
return $this->belongsToMany(WebhookDelivery::class);
}
public function webhookMessages(): HasMany
{
return $this->hasMany(WebhookMessage::class);
}
public function webhookResponses(): BelongsToMany
{
return $this->belongsToMany(WebhookResponse::class);

View File

@@ -72,6 +72,17 @@ class WebhookMessage extends Model
return $this->hasMany(WebhookAttempt::class);
}
protected function casts(): array
{
return [
'sent' => 'boolean',
'errored' => 'boolean',
'uuid' => 'string',
'message' => 'json',
'logs' => 'json',
];
}
/**
* Get the amount
*/
@@ -88,15 +99,4 @@ class WebhookMessage extends Model
get: static fn($value) => (int)$value,
);
}
protected function casts(): array
{
return [
'sent' => 'boolean',
'errored' => 'boolean',
'uuid' => 'string',
'message' => 'json',
'logs' => 'json',
];
}
}