'decimal:2', 'purchased_at' => 'datetime', 'metadata' => 'array', 'refunded' => 'boolean', ]; public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } public function event(): BelongsTo { return $this->belongsTo(Event::class); } public function package(): BelongsTo { return $this->belongsTo(Package::class); } public function isEndcustomerEvent(): bool { return $this->type === 'endcustomer_event'; } public function isResellerSubscription(): bool { return $this->type === 'reseller_subscription'; } public function isRefunded(): bool { return $this->refunded; } public function getMetadataAttribute($value) { return $value ? json_decode($value, true) : []; } public function setMetadataAttribute($value) { $this->attributes['metadata'] = is_array($value) ? json_encode($value) : $value; } protected static function boot() { parent::boot(); static::creating(function ($purchase) { if (!$purchase->tenant_id) { throw new \Exception('Tenant ID is required for package purchases.'); } if (!$purchase->purchased_at) { $purchase->purchased_at = now(); } $purchase->refunded = false; }); } }