couponBlock['maximumAmount'] ?? ''); $coupon->set_individual_use($couponBlock['individualUse'] ?? false); $coupon->set_exclude_sale_items($couponBlock['excludeSaleItems'] ?? false); $coupon->set_product_ids($this->getItemIds($couponBlock['productIds'] ?? [])); $coupon->set_excluded_product_ids($this->getItemIds($couponBlock['excludedProductIds'] ?? [])); $coupon->set_product_categories($this->getItemIds($couponBlock['productCategoryIds'] ?? [])); $coupon->set_excluded_product_categories($this->getItemIds($couponBlock['excludedProductCategoryIds'] ?? [])); $emailRestrictions = []; if (!empty($couponBlock['emailRestrictions'])) { $emailRestrictions = explode(',', $couponBlock['emailRestrictions']); } if (!empty($couponBlock['restrictToSubscriber']) && $sendingQueue && $sendingQueue->getTask()) { $subscribers = $sendingQueue->getTask()->getSubscribers(); if (is_iterable($subscribers) && count($subscribers) === 1) { // Only apply to single-subscriber sending queues foreach ($subscribers as $taskSubscriber) { $subscriber = $taskSubscriber->getSubscriber(); if ($subscriber && $subscriber->getEmail()) { $emailRestrictions[] = $subscriber->getEmail(); } } } } $coupon->set_email_restrictions(array_unique(array_filter($emailRestrictions))); // usage limit $coupon->set_usage_limit($couponBlock['usageLimit'] ?? 0); $coupon->set_usage_limit_per_user($couponBlock['usageLimitPerUser'] ?? 0); return $coupon->save(); } private function getItemIds(array $items): array { if (empty($items)) { return []; } return array_map(function ($item) { return $item['id']; }, $items); } private function generateRandomSegment($length) { $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $segment = ''; for ($i = 0; $i < $length; $i++) { $randomIndex = rand(0, strlen($characters) - 1); $segment .= $characters[$randomIndex]; } return $segment; } /** * Generates Coupon code for XXXX-XXXXXX-XXXX pattern */ private function generateRandomCode(): string { $part1 = $this->generateRandomSegment(4); $part2 = $this->generateRandomSegment(6); $part3 = $this->generateRandomSegment(4); return $part1 . '-' . $part2 . '-' . $part3; } private function shouldGenerateCoupon(array $block): bool { return empty($block['couponId']); } /** * Only emails that can have their body-HTML re-generated should persist the generated couponId */ private function shouldPersist(NewsletterEntity $newsletter): bool { return in_array($newsletter->getType(), NewsletterEntity::TYPES_WITH_RESETTABLE_BODY); } }