*/ public const VALID_METHODS = [ self::METHOD_CARD, self::METHOD_ETRANSFER, self::METHOD_COMP ]; public const STATUS_PENDING = 'pending'; public const STATUS_PAID = 'paid'; public const STATUS_FAILED = 'failed'; public const STATUS_REFUNDED = 'refunded'; /** * All valid payment statuses. * * @var list */ public const VALID_STATUSES = [ self::STATUS_PENDING, self::STATUS_PAID, self::STATUS_FAILED, self::STATUS_REFUNDED ]; public const REG_LESSON = 'lesson'; public const REG_ENROLLMENT = 'enrollment'; public function __construct( public readonly int $studentId, public readonly int $instructorId, public readonly string $registrationType, public readonly int $registrationId, public readonly float $amount, public readonly string $currency = 'CAD', public readonly string $method = self::METHOD_ETRANSFER, public readonly string $status = self::STATUS_PENDING, public readonly float $taxRate = 0.0, public readonly float $taxAmount = 0.0, public readonly ?string $etransferEmail = null, public readonly ?string $stripePaymentIntentId = null, public readonly ?string $receiptNumber = null, public readonly ?string $receiptSentAt = null, public readonly ?string $paidAt = null, public readonly ?int $id = null, ) {} public static function fromRow( object $row ): self { return new self( studentId: (int) $row->student_id, instructorId: (int) $row->instructor_id, registrationType: $row->registration_type, registrationId: (int) $row->registration_id, amount: (float) $row->amount, currency: $row->currency, method: $row->method, status: $row->status, taxRate: (float) $row->tax_rate, taxAmount: (float) $row->tax_amount, etransferEmail: $row->etransfer_email, stripePaymentIntentId: $row->stripe_payment_intent_id, receiptNumber: $row->receipt_number, receiptSentAt: $row->receipt_sent_at, paidAt: $row->paid_at, id: (int) $row->id, ); } public function isPaid(): bool { return self::STATUS_PAID === $this->status; } /** * Amount billed including tax. */ public function total(): float { return round( $this->amount + $this->taxAmount, 2 ); } /** * Returns a plain array representation of the payment. * * @return array */ public function toArray(): array { return [ 'id' => $this->id, 'student_id' => $this->studentId, 'instructor_id' => $this->instructorId, 'registration_type' => $this->registrationType, 'etransfer_email' => $this->etransferEmail, 'registration_id' => $this->registrationId, 'amount' => $this->amount, 'tax_rate' => $this->taxRate, 'tax_amount' => $this->taxAmount, 'total' => $this->total(), 'currency' => $this->currency, 'method' => $this->method, 'status' => $this->status, 'receipt_number' => $this->receiptNumber, 'paid_at' => $this->paidAt, ]; } }