setName('subscription:reminder')
->addOption('dry-run', null, InputOption::VALUE_NONE, 'Do not send any mail, just show expiring subscriptions')
->setDescription('Remind any soon expiring (or just expired) subscriptions by sending mails.')
;
}
/**
* @inheritDoc
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$mailer = $this->getContainer()->get(\AppBundle\Email\Mailer\Mailer::class);
$factory = new Association\UserMembership\UserReminderFactory($mailer, $this->getContainer()->get('ting')->get(Association\Model\Repository\SubscriptionReminderLogRepository::class));
$companyFactory = new Association\CompanyMembership\CompanyReminderFactory(
$mailer,
$this->getContainer()->get('ting')->get(Association\Model\Repository\SubscriptionReminderLogRepository::class)
);
/**
* @var $repository Association\Model\Repository\UserRepository
*/
$repository = $this->getContainer()->get('ting')->get(Association\Model\Repository\UserRepository::class);
$dryRun = $input->getOption('dry-run');
$today = new \DateTimeImmutable();
$reminders = [
'in 15 days' => [
'date' => $today->add(new \DateInterval('P15D')),
'physical' => Association\UserMembership\Reminder15DaysBeforeEnd::class,
'company' => Association\CompanyMembership\Reminder15DaysBeforeEnd::class
],
'in 7 days' => [
'date' => $today->add(new \DateInterval('P7D')),
'physical' => Association\UserMembership\Reminder7DaysBeforeEnd::class,
'company' => Association\CompanyMembership\Reminder7DaysBeforeEnd::class
],
'Today' => [
'date' => $today,
'physical' => Association\UserMembership\ReminderDDay::class,
'company' => Association\CompanyMembership\ReminderDDay::class
],
'15 days ago' => [
'date' => $today->sub(new \DateInterval('P15D')),
'physical' => Association\UserMembership\Reminder15DaysAfterEnd::class,
'company' => Association\CompanyMembership\Reminder15DaysAfterEnd::class
],
];
$output->writeln('Reminders des souscriptions');
foreach ($reminders as $name => $details) {
$reminder = $factory->getReminder($details['physical']);
$users = $repository->getUsersByEndOfMembership($details['date'], Association\Model\Repository\UserRepository::USER_TYPE_PHYSICAL);
$output->writeln(sprintf('%s (%s)', $name, $details['date']->format('d/m/Y')));
$output->writeln(sprintf('%s membres', $users->count()));
$this->handleReminders($output, $reminder, $users, $dryRun);
$reminder = $companyFactory->getReminder($details['company']);
$users = $repository->getUsersByEndOfMembership($details['date'], Association\Model\Repository\UserRepository::USER_TYPE_COMPANY);
$output->writeln(sprintf('%s entreprises', $users->count()));
$this->handleReminders($output, $reminder, $users, $dryRun);
}
}
private function handleReminders(
OutputInterface $output,
Association\MembershipReminderInterface $reminder,
CollectionInterface $users,
$dryRun = true
) {
foreach ($users as $user) {
/**
* @var $user Association\Model\User
*/
$output->writeln($user->getEmail());
if ($dryRun === false) {
$reminder->sendReminder($user);
}
}
}
}