participant->promoVoucherCode; // Skip validation if promo code is empty if (null === $promoCode || '' === trim($promoCode)) { return; } // Get travel ID from booking context $travelId = $value->bookingContext->travel->id; if (null === $travelId) { $this->context->buildViolation('Aktionscode konnte nicht validiert werden: Reise-ID fehlt.') ->atPath('participant.promoVoucherCode') ->addViolation(); return; } // Calculate participant's current price including all services $participantPrice = $this->priceCalculatorService->calculateIndividualParticipantPrice( $value->bookingContext, $value->participant->index ?? 0 ); // Validate promo voucher via API $result = $this->voucherValidationService->validatePromoVoucher( $promoCode, $travelId, $participantPrice ); // Add violation if voucher is invalid if (false === $result->isValid) { $this->context->buildViolation($constraint->message) ->setParameter('{{ error }}', $result->errorMessage ?? 'Unbekannter Fehler') ->atPath('participant.promoVoucherCode') ->addViolation(); } } }