<?php
namespace App\Service\App\Merchant\Integrations\TeamBlue\Listener;
use App\Background\Data\TeamBlueSyncSubscriptionData;
use App\Core\BackgroundWork\Contract\IClient;
use App\Core\MerchantSelector\Contract\IMerchantSelector;
use App\Entity\Merchant\PlanSubscriptionItemEntity;
use App\Repository\Merchant\Contract\IPlanSubscriptionRepository;
use App\Service\App\Merchant\CustomFeature\Implementation\TeamBlueCustomFeature;
use App\Service\App\Merchant\Subscription\Event\ActivateSubscriptionEvent;
class ActivateSubscriptionListener
{
/**
* Plan subscription repository
*
* @var IPlanSubscriptionRepository
*/
private IPlanSubscriptionRepository $planSubscriptionRepository;
/**
* Team blue custom feature instance
*
* @var TeamBlueCustomFeature
*/
private TeamBlueCustomFeature $teamBlueCustomFeature;
/**
* Background job client
*
* @var IClient
*/
private IClient $backgroundClient;
/**
* Merchant selector
*
* @var IMerchantSelector
*/
private IMerchantSelector $merchantSelector;
/**
* Constructor
*
* @param IPlanSubscriptionRepository $planSubscriptionRepository
* @param TeamBlueCustomFeature $teamBlueCustomFeature
* @param IClient $backgroundClient
* @param IMerchantSelector $merchantSelector
*/
public function __construct(
IPlanSubscriptionRepository $planSubscriptionRepository,
TeamBlueCustomFeature $teamBlueCustomFeature,
IClient $backgroundClient,
IMerchantSelector $merchantSelector
)
{
$this->planSubscriptionRepository = $planSubscriptionRepository;
$this->teamBlueCustomFeature = $teamBlueCustomFeature;
$this->backgroundClient = $backgroundClient;
$this->merchantSelector = $merchantSelector;
}
/**
* On activate subscription action
*
* @param ActivateSubscriptionEvent $event
*/
public function onAction(ActivateSubscriptionEvent $event): void
{
// if team blue custom feature is not enabled, return
if (!$this->teamBlueCustomFeature->isEnabled()) {
return;
}
// get subscription
$subscription = $this->planSubscriptionRepository->getSubscription($event->getSubscriptionId());
// skip if subscription is not found or has payment
if (!$subscription || $subscription->getRelatedPayment()) {
return;
}
// skip if subscription contains non-free items
/** @var PlanSubscriptionItemEntity $item */
foreach ($subscription->getItems() as $item) {
if ($item->getPrice()->getPrice() > 0) {
return;
}
}
$this->backgroundClient->runJob(
new TeamBlueSyncSubscriptionData($event->getSubscriptionId(), $this->merchantSelector->getMerchant())
);
}
}