'array', 'metadata' => 'array', 'amount_minor' => 'integer', 'paid_at' => 'datetime', 'checked_in_at' => 'datetime', ]; public function qrCode(): BelongsTo { return $this->belongsTo(QrCode::class); } public function organizer(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } public function amountCedis(): float { return round($this->amount_minor / 100, 2); } public function platformFeeMinor(): int { $metadata = (array) ($this->metadata ?? []); if (isset($metadata['ladill_pay']['platform_fee_minor'])) { return (int) $metadata['ladill_pay']['platform_fee_minor']; } if (isset($metadata['platform_fee_ghs'])) { return (int) round((float) $metadata['platform_fee_ghs'] * 100); } $mode = $this->qrCode?->content()['mode'] ?? 'ticketing'; $rate = $mode === 'contributions' ? 0.035 : 0.055; return (int) round($this->amount_minor * $rate); } public function netAmountMinor(): int { return max(0, $this->amount_minor - $this->platformFeeMinor()); } public function isPaid(): bool { return $this->amount_minor > 0; } }