$metadata */ public function __construct( private readonly string $provider_id, private readonly string $source, private readonly string $dispatched_at, private readonly ?string $tracking_number = null, private readonly ?string $carrier = null, private readonly ?string $tracking_url = null, private readonly bool $already_present_in_completed_email = false, private readonly array $metadata = array() ) { if ( '' === trim( $provider_id ) || '' === trim( $source ) || false === strtotime( $dispatched_at . ' UTC' ) ) { throw new \InvalidArgumentException( 'Dispatch record requires provider, source, and a valid UTC timestamp.' ); } } public function provider_id(): string { return $this->provider_id; } public function source(): string { return $this->source; } public function dispatched_at(): string { return $this->dispatched_at; } public function tracking_number(): ?string { return $this->tracking_number; } public function carrier(): ?string { return $this->carrier; } public function tracking_url(): ?string { return $this->tracking_url; } public function already_present_in_completed_email(): bool { return $this->already_present_in_completed_email; } public function metadata(): array { return $this->metadata; } /** @return array */ public function to_array(): array { return array( 'provider_id' => $this->provider_id, 'source' => $this->source, 'dispatched_at_utc' => $this->dispatched_at, 'tracking_number' => $this->tracking_number, 'carrier' => $this->carrier, 'tracking_url' => $this->tracking_url, 'already_present_in_completed_email' => $this->already_present_in_completed_email, 'metadata' => $this->metadata, ); } }