'integer', 'start_date' => 'date', 'end_date' => 'date', 'is_active' => 'boolean', ]; public function scenario(): BelongsTo { return $this->belongsTo(Scenario::class); } public function bucket(): BelongsTo { return $this->belongsTo(Bucket::class); } public static function getTypes(): array { return [ self::TYPE_INCOME => 'Income', self::TYPE_EXPENSE => 'Expense', ]; } public static function getFrequencies(): array { return [ self::FREQUENCY_ONCE => 'One-time', self::FREQUENCY_WEEKLY => 'Weekly', self::FREQUENCY_BIWEEKLY => 'Bi-weekly', self::FREQUENCY_MONTHLY => 'Monthly', self::FREQUENCY_QUARTERLY => 'Quarterly', self::FREQUENCY_YEARLY => 'Yearly', ]; } public function getTypeLabel(): string { return self::getTypes()[$this->type] ?? $this->type; } public function getFrequencyLabel(): string { return self::getFrequencies()[$this->frequency] ?? $this->frequency; } public function getMonthlyEquivalent(): float { switch ($this->frequency) { case self::FREQUENCY_WEEKLY: return $this->amount * 4.33; // Average weeks per month case self::FREQUENCY_BIWEEKLY: return $this->amount * 2.17; case self::FREQUENCY_MONTHLY: return $this->amount; case self::FREQUENCY_QUARTERLY: return $this->amount / 3; case self::FREQUENCY_YEARLY: return $this->amount / 12; case self::FREQUENCY_ONCE: default: return 0; } } /* SCOPES */ public function scopeByType($query, string $type) { return $query->where('type', $type); } }