möglich * * Purchase (buchungsart Buchung, as documented by the vendor): * * * erfolgt * * */ final class VoucherSaleResponseParser extends AbstractParser { public function parse(Crawler $node): VoucherSaleResponse { $status = trim($this->getStringOrNullValue($node->filterXPath('//buchung')) ?? ''); if ('' === $status) { throw new \InvalidArgumentException('Missing required status in voucher sale response.'); } return new VoucherSaleResponse( status: $status, voucherId: $this->getIntOrNullValue($node->filterXPath('//idgutschein')), voucherNumber: $this->trimmedOrNull($node->filterXPath('//gutscheinnummer')), redemptionCode: $this->trimmedOrNull($node->filterXPath('//einloesecode')), price: $this->getFloatOrNullValue($node->filterXPath('//preis')), invoiceNumber: $this->trimmedOrNull($node->filterXPath('//rechnungsnummer')), email: $this->trimmedOrNull($node->filterXPath('//email')), ); } private function trimmedOrNull(Crawler $node): ?string { $value = trim($this->getStringOrNullValue($node) ?? ''); return '' !== $value ? $value : null; } }