<?php
namespace App\EventSubscriber\App;
use App\Entity\AutomatedEmailNotificationDefinition\AutomatedEmailNotificationDefinitionTextContent;
use App\Entity\UsageEvent;
use App\Event\SubscriptionChooseAndPayFormPageSeenEvent;
use App\Event\SubscriptionSuccessfullyCompletedEvent;
use App\Repository\AutomatedEmailNotificationDefinitionTextContentRepository;
use App\Service\AgenturFuerArbeitService;
use App\Service\AutomatedEmailNotificationDefinitionService;
use App\Service\ConversionEventService;
use App\Service\MailService;
use App\Service\Membership\BillwerkPlanVariantService;
use App\Service\Membership\BillwerkSynchronizationService;
use App\Service\Membership\MembershipService;
use App\Service\NotificationService;
use App\Service\ProfileService;
use App\Service\RouterHelperService;
use App\Service\UsageEventService;
use App\Service\UserService;
use App\SymfonyMessage\DispatchCreateJobradarMatchSymfonyMessagesForUserSymfonyMessage;
use Exception;
use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
use Swift_Message;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
readonly class SubscriptionEventSubscriber implements EventSubscriberInterface
{
public function __construct(
private BusinessEventDomainService $businessEventDomainService,
private UsageEventService $usageEventService,
private ConversionEventService $conversionEventService,
private UserService $userService,
private BillwerkPlanVariantService $billwerkPlanVariantService,
private MembershipService $membershipService,
private MessageBusInterface $messageBus,
private AgenturFuerArbeitService $agenturFuerArbeitService,
private AutomatedEmailNotificationDefinitionTextContentRepository $automatedEmailNotificationDefinitionTextContentRepository,
private MailService $mailService,
private RouterHelperService $routerHelperService,
private Environment $twigEnvironment,
private TranslatorInterface $translator
) {
}
public static function getSubscribedEvents(): array
{
return [
SubscriptionChooseAndPayFormPageSeenEvent::class => 'onSubscriptionChooseAndPayFormPageSeen',
SubscriptionSuccessfullyCompletedEvent::class => 'onSubscriptionSuccessfullyCompletedEvent'
];
}
/** @throws Exception */
public function onSubscriptionChooseAndPayFormPageSeen(SubscriptionChooseAndPayFormPageSeenEvent $event): void
{
$user = $event->getUser();
$this->usageEventService->eventHasOccurredForUser(
$user,
UsageEvent::EVENT_TYPE_USER_HAS_SEEN_SUBSCRIPTION_PAGE
);
// Since the flex membership is only selectable membership, we do not need to initialize the tracking for the other two memberships
foreach ([14, 15, 16, 17, 18, 19, 20, 21] as $subcampaignId) {
$this->conversionEventService->initiateGoalReachedConversionTracking(
$user,
ConversionEventService::CAMPAIGN_ID_SUBSCRIPTION,
$subcampaignId,
null,
null,
null,
json_encode(['trialMitlgliedschaft' => $event->isTrialPage()])
);
}
}
/** @throws Exception
* @throws \Doctrine\DBAL\Driver\Exception
*/
public function onSubscriptionSuccessfullyCompletedEvent(SubscriptionSuccessfullyCompletedEvent $event): void
{
$user = $event->getUser();
if ($user->isJobofferer()) {
$this->businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_SUBSCRIPTION_COMPLETED,
$user,
null,
null,
json_encode(['billwerkPlanVariantId' => $event->getPlanVariantId()])
);
}
if ($user->isJobseeker()) {
$this->businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_JOBSEEKER_MEMBERSHIP_SUCCESSFULLY_CREATED,
$user,
null,
null,
json_encode(['billwerkPlanVariantId' => $event->getPlanVariantId()])
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_JOBSEEKER_PREMIUM_MEMBERSHIP_MAILING,
0,
null,
$event->getUser()
);
}
$this->usageEventService->eventHasOccurredForUser($user, UsageEvent::EVENT_TYPE_USER_HAS_COMPLETED_SUBSCRIPTION);
$this->userService->unpauseIfPaused($user);
$this->messageBus->dispatch(
new DispatchCreateJobradarMatchSymfonyMessagesForUserSymfonyMessage(
$user
)
);
$membershipStatus = MembershipService::MEMBERSHIP_STATUS_FLEX;
$planVariant = null;
$contract = $this->membershipService->getLatestBillwerkContractForUser($user);
if (!is_null($contract) && !is_null($planVariantId = $contract->getPlanVariantId())) {
$planVariant = $this->billwerkPlanVariantService->getPlanVariantById($planVariantId);
$membershipStatus = $this->billwerkPlanVariantService->getPlanVariantById($planVariantId)->getMembershipStatus();
}
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
NotificationService::NOTIFICATION_TYPE_MISSING_SUBSCRIPTION_WITHOUT_TRIAL_AFTER_SEEING_SUBSCRIPTION_PAGE,
null,
null,
null,
$planVariant
);
$subcampaignIdFlexMembership = 14;
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_SUBSCRIPTION,
$membershipStatus === MembershipService::MEMBERSHIP_STATUS_MULTI_LOCATIONS ? 7 : $subcampaignIdFlexMembership,
null,
$user,
null,
$planVariant,
json_encode(['trialMitgliedschaft' => $planVariant->getTrial()])
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_OUTGOING_DIRECT_EMAILS,
1,
null,
$user,
null,
$planVariant
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_OUTGOING_DIRECT_EMAILS,
3,
null,
$user,
null,
$planVariant
);
$subcampaignIds = [];
if ($membershipStatus === MembershipService::MEMBERSHIP_STATUS_BASIC) {
if (!is_null($event->getRuntime())) {
switch ($event->getRuntime()) {
case BillwerkSynchronizationService::RUNTIME_1_MONTH:
$subcampaignIds[] = 1;
break;
case BillwerkSynchronizationService::RUNTIME_3_MONTHS:
$subcampaignIds[] = 2;
break;
case BillwerkSynchronizationService::RUNTIME_6_MONTHS:
$subcampaignIds[] = 3;
break;
default:
break;
}
}
if (!is_null($event->getPaymentMethod())) {
switch ($event->getPaymentMethod()) {
case BillwerkSynchronizationService::PAYMENT_METHOD_BANKACCOUNT:
$subcampaignIds[] = 4;
break;
case BillwerkSynchronizationService::PAYMENT_METHOD_PAYPAL:
$subcampaignIds[] = 5;
break;
case BillwerkSynchronizationService::PAYMENT_METHOD_CREDITCARD:
$subcampaignIds[] = 6;
break;
default:
break;
}
}
} elseif ($membershipStatus === MembershipService::MEMBERSHIP_STATUS_MULTI_LOCATIONS) {
if (!is_null($event->getRuntime())) {
switch ($event->getRuntime()) {
case BillwerkSynchronizationService::RUNTIME_1_MONTH:
$subcampaignIds[] = 8;
break;
case BillwerkSynchronizationService::RUNTIME_3_MONTHS:
$subcampaignIds[] = 9;
break;
case BillwerkSynchronizationService::RUNTIME_6_MONTHS:
$subcampaignIds[] = 10;
break;
default:
break;
}
}
if (!is_null($event->getPaymentMethod())) {
switch ($event->getPaymentMethod()) {
case BillwerkSynchronizationService::PAYMENT_METHOD_BANKACCOUNT:
$subcampaignIds[] = 11;
break;
case BillwerkSynchronizationService::PAYMENT_METHOD_PAYPAL:
$subcampaignIds[] = 12;
break;
case BillwerkSynchronizationService::PAYMENT_METHOD_CREDITCARD:
$subcampaignIds[] = 13;
break;
default:
break;
}
}
} elseif ($membershipStatus === MembershipService::MEMBERSHIP_STATUS_FLEX) {
if (!is_null($event->getRuntime())) {
switch ($event->getRuntime()) {
case BillwerkSynchronizationService::RUNTIME_1_MONTH:
$subcampaignIds[] = 15;
break;
case BillwerkSynchronizationService::RUNTIME_3_MONTHS:
$subcampaignIds[] = 16;
break;
case BillwerkSynchronizationService::RUNTIME_6_MONTHS:
$subcampaignIds[] = 17;
break;
default:
break;
}
}
if (!is_null($event->getPaymentMethod())) {
switch ($event->getPaymentMethod()) {
case BillwerkSynchronizationService::PAYMENT_METHOD_BANKACCOUNT:
$subcampaignIds[] = 18;
break;
case BillwerkSynchronizationService::PAYMENT_METHOD_PAYPAL:
$subcampaignIds[] = 19;
break;
case BillwerkSynchronizationService::PAYMENT_METHOD_CREDITCARD:
$subcampaignIds[] = 20;
break;
case BillwerkSynchronizationService::PAYMENT_METHOD_INVOICE:
$subcampaignIds[] = 21;
break;
default:
break;
}
}
}
foreach ($subcampaignIds as $subcampaignId) {
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_SUBSCRIPTION,
$subcampaignId,
null,
$user,
null,
$planVariant,
json_encode(['trialMitgliedschaft' => $planVariant->getTrial()])
);
}
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
2,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
12,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
22,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
NotificationService::NOTIFICATION_TYPE_MISSING_JOBOFFERER_ACTIVITY,
null,
$user,
null,
$planVariant
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
NotificationService::NOTIFICATION_TYPE_MISSING_SUBSCRIPTION_WITH_TRIAL,
null,
$user,
null,
$planVariant
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
NotificationService::NOTIFICATION_TYPE_MISSING_SUBSCRIPTION_WITHOUT_TRIAL,
null,
$user,
null,
$planVariant
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_JOBOFFERER_MAILING_170521,
0,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_JOBOFFERER_MAILING_140621,
0,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_JOBOFFERER_MAILING_140621,
0,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_AKTION,
1,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERAKTION,
1,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_ANGEBOT,
1,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_SONDERANGEBOT,
1,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_EMAIL_MARKETING_JETZT,
1,
null,
$user
);
if ($user->isJobofferer()) {
/** @var AutomatedEmailNotificationDefinitionTextContent $textContent */
$textContent = $this->automatedEmailNotificationDefinitionTextContentRepository->findOneBy(
[
'automatedEmailNotificationDefinition' => MailService::MAIL_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION,
'subjectId' => AutomatedEmailNotificationDefinitionService::SUBJECT_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION,
'bodyId' => AutomatedEmailNotificationDefinitionService::BODY_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION
]
);
$message = (new Swift_Message($textContent->getSubject()))
->setFrom('team@joboo.de', $this->translator->trans('mailfromname.team'))
->setTo($user->getEmail())
->setBody(
$this->twigEnvironment->render(
$textContent->getTwigTemplateName(),
[
'firstname' => ProfileService::getFirstnameOrAlternativeForSalutation(
$user->getDefaultJoboffererProfile()
),
'confirmationUrl' => $this->routerHelperService->generate(
'mydays_voucher_request',
['usersId' => $user->getId()],
UrlGeneratorInterface::ABSOLUTE_URL
)
]
),
'text/html'
);
$this->mailService->queueForSending(
MailService::MAIL_ID_INFO_AFTER_SUCCESSFUL_SUBSCRIPTION,
$message,
$user
);
}
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_MEMBERSHIP_TRACKING_NEW_CTAS,
0,
null,
$event->getUser()
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_MEMBERSHIP_TRACKING_NEW_CTAS,
1,
null,
$event->getUser()
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_NOTIFICATION,
NotificationService::NOTIFICATION_TYPE_MISSING_TRIAL_AFTER_REGISTRATION,
null,
$event->getUser()
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_JOBOFFERERS_THAT_NEVER_USED_FREE_TRIAL_FREE_TWO_MONTH_TRIAL,
0,
null,
$event->getUser()
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_JOBOFFERERS_THAT_NEVER_USED_FREE_TRIAL_FREE_TWO_MONTH_TRIAL,
1,
null,
$event->getUser()
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_FACEBOOK,
502,
null,
$event->getUser()
);
// Marketing-Landingpages AG-Subscription (pages.joboo.de)
// Loop über alle möglichen Subcampaign-IDs (0-1000)
if ($user->isJobofferer()) {
for ($subcampaignId = 0; $subcampaignId <= 1000; ++$subcampaignId) {
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_DIGITAL_ESTATE_MARKETING_LANDINGPAGES_AG_SUBSCRIPTION,
$subcampaignId,
null,
$user,
null,
$planVariant
);
}
}
$this->agenturFuerArbeitService->queueReminderMailingForAfaCategorizationIfNecessary(null, $user);
}
}