mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
send message from cli through ovh if configured
This commit is contained in:
parent
616be5cc8a
commit
4c0fef4f44
@ -1,5 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\CalendarBundle\Command;
|
namespace Chill\CalendarBundle\Command;
|
||||||
|
|
||||||
use Chill\CalendarBundle\Entity\Calendar;
|
use Chill\CalendarBundle\Entity\Calendar;
|
||||||
@ -7,48 +16,44 @@ use Chill\CalendarBundle\Service\ShortMessageNotification\ShortMessageForCalenda
|
|||||||
use Chill\MainBundle\Entity\User;
|
use Chill\MainBundle\Entity\User;
|
||||||
use Chill\MainBundle\Phonenumber\PhoneNumberHelperInterface;
|
use Chill\MainBundle\Phonenumber\PhoneNumberHelperInterface;
|
||||||
use Chill\MainBundle\Repository\UserRepositoryInterface;
|
use Chill\MainBundle\Repository\UserRepositoryInterface;
|
||||||
use Chill\MainBundle\Service\ShortMessage\ShortMessage;
|
use Chill\MainBundle\Service\ShortMessage\ShortMessageTransporterInterface;
|
||||||
use Chill\MainBundle\Service\ShortMessage\ShortMessageSenderInterface;
|
|
||||||
use Chill\PersonBundle\Entity\Person;
|
use Chill\PersonBundle\Entity\Person;
|
||||||
use Chill\PersonBundle\Repository\PersonRepository;
|
use Chill\PersonBundle\Repository\PersonRepository;
|
||||||
|
use DateInterval;
|
||||||
|
use DateTimeImmutable;
|
||||||
use libphonenumber\PhoneNumber;
|
use libphonenumber\PhoneNumber;
|
||||||
use libphonenumber\PhoneNumberFormat;
|
use libphonenumber\PhoneNumberFormat;
|
||||||
use libphonenumber\PhoneNumberType;
|
use libphonenumber\PhoneNumberType;
|
||||||
use libphonenumber\PhoneNumberUtil;
|
use libphonenumber\PhoneNumberUtil;
|
||||||
use libphonenumber\ValidationResult;
|
|
||||||
use Symfony\Component\Console\Command\Command;
|
use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Helper\QuestionHelper;
|
use Symfony\Component\Console\Helper\QuestionHelper;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Question\ConfirmationQuestion;
|
||||||
use Symfony\Component\Console\Question\Question;
|
use Symfony\Component\Console\Question\Question;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
use function count;
|
||||||
|
|
||||||
class SendTestShortMessageOnCalendarCommand extends Command
|
class SendTestShortMessageOnCalendarCommand extends Command
|
||||||
{
|
{
|
||||||
private PersonRepository $personRepository;
|
private ShortMessageForCalendarBuilderInterface $messageForCalendarBuilder;
|
||||||
|
|
||||||
private PhoneNumberUtil $phoneNumberUtil;
|
private PersonRepository $personRepository;
|
||||||
|
|
||||||
private PhoneNumberHelperInterface $phoneNumberHelper;
|
private PhoneNumberHelperInterface $phoneNumberHelper;
|
||||||
|
|
||||||
private ShortMessageForCalendarBuilderInterface $messageForCalendarBuilder;
|
private PhoneNumberUtil $phoneNumberUtil;
|
||||||
|
|
||||||
private ShortMessageSenderInterface $messageSender;
|
private ShortMessageTransporterInterface $transporter;
|
||||||
|
|
||||||
private UserRepositoryInterface $userRepository;
|
private UserRepositoryInterface $userRepository;
|
||||||
|
|
||||||
/**
|
|
||||||
* @param PersonRepository $personRepository
|
|
||||||
* @param PhoneNumberUtil $phoneNumberUtil
|
|
||||||
* @param PhoneNumberHelperInterface $phoneNumberHelper
|
|
||||||
* @param ShortMessageForCalendarBuilderInterface $messageForCalendarBuilder
|
|
||||||
* @param ShortMessageSenderInterface $messageSender
|
|
||||||
*/
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
PersonRepository $personRepository,
|
PersonRepository $personRepository,
|
||||||
PhoneNumberUtil $phoneNumberUtil,
|
PhoneNumberUtil $phoneNumberUtil,
|
||||||
PhoneNumberHelperInterface $phoneNumberHelper,
|
PhoneNumberHelperInterface $phoneNumberHelper,
|
||||||
ShortMessageForCalendarBuilderInterface $messageForCalendarBuilder,
|
ShortMessageForCalendarBuilderInterface $messageForCalendarBuilder,
|
||||||
ShortMessageSenderInterface $messageSender,
|
ShortMessageTransporterInterface $transporter,
|
||||||
UserRepositoryInterface $userRepository
|
UserRepositoryInterface $userRepository
|
||||||
) {
|
) {
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
@ -57,11 +62,10 @@ class SendTestShortMessageOnCalendarCommand extends Command
|
|||||||
$this->phoneNumberUtil = $phoneNumberUtil;
|
$this->phoneNumberUtil = $phoneNumberUtil;
|
||||||
$this->phoneNumberHelper = $phoneNumberHelper;
|
$this->phoneNumberHelper = $phoneNumberHelper;
|
||||||
$this->messageForCalendarBuilder = $messageForCalendarBuilder;
|
$this->messageForCalendarBuilder = $messageForCalendarBuilder;
|
||||||
$this->messageSender = $messageSender;
|
$this->transporter = $transporter;
|
||||||
$this->userRepository = $userRepository;
|
$this->userRepository = $userRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function getName()
|
public function getName()
|
||||||
{
|
{
|
||||||
return 'chill:calendar:test-send-short-message';
|
return 'chill:calendar:test-send-short-message';
|
||||||
@ -81,41 +85,41 @@ class SendTestShortMessageOnCalendarCommand extends Command
|
|||||||
$helper = $this->getHelper('question');
|
$helper = $this->getHelper('question');
|
||||||
|
|
||||||
// start date
|
// start date
|
||||||
$question = new Question("When will start the appointment ? (default: \"1 hour\") ", '1 hour');
|
$question = new Question('When will start the appointment ? (default: "1 hour") ', '1 hour');
|
||||||
$startDate = new \DateTimeImmutable($helper->ask($input, $output, $question));
|
$startDate = new DateTimeImmutable($helper->ask($input, $output, $question));
|
||||||
|
|
||||||
if (false === $startDate) {
|
if (false === $startDate) {
|
||||||
throw new \UnexpectedValueException("could not create a date with this date and time");
|
throw new UnexpectedValueException('could not create a date with this date and time');
|
||||||
}
|
}
|
||||||
|
|
||||||
$calendar->setStartDate($startDate);
|
$calendar->setStartDate($startDate);
|
||||||
|
|
||||||
// end date
|
// end date
|
||||||
$question = new Question("How long will last the appointment ? (default: \"PT30M\") ", 'PT30M');
|
$question = new Question('How long will last the appointment ? (default: "PT30M") ', 'PT30M');
|
||||||
$interval = new \DateInterval($helper->ask($input, $output, $question));
|
$interval = new DateInterval($helper->ask($input, $output, $question));
|
||||||
|
|
||||||
if (false === $interval) {
|
if (false === $interval) {
|
||||||
throw new \UnexpectedValueException("could not create the interval");
|
throw new UnexpectedValueException('could not create the interval');
|
||||||
}
|
}
|
||||||
|
|
||||||
$calendar->setEndDate($calendar->getStartDate()->add($interval));
|
$calendar->setEndDate($calendar->getStartDate()->add($interval));
|
||||||
|
|
||||||
// a person
|
// a person
|
||||||
$question = new Question("Who will participate ? Give an id for a person. ");
|
$question = new Question('Who will participate ? Give an id for a person. ');
|
||||||
$question
|
$question
|
||||||
->setValidator(function ($answer): Person {
|
->setValidator(function ($answer): Person {
|
||||||
if (!is_numeric($answer)) {
|
if (!is_numeric($answer)) {
|
||||||
throw new \UnexpectedValueException('the answer must be numeric');
|
throw new UnexpectedValueException('the answer must be numeric');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 >= (int) $answer) {
|
if (0 >= (int) $answer) {
|
||||||
throw new \UnexpectedValueException('the answer must be greater than zero');
|
throw new UnexpectedValueException('the answer must be greater than zero');
|
||||||
}
|
}
|
||||||
|
|
||||||
$person = $this->personRepository->find((int) $answer);
|
$person = $this->personRepository->find((int) $answer);
|
||||||
|
|
||||||
if (null === $person) {
|
if (null === $person) {
|
||||||
throw new \UnexpectedValueException("The person is not found");
|
throw new UnexpectedValueException('The person is not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $person;
|
return $person;
|
||||||
@ -124,23 +128,22 @@ class SendTestShortMessageOnCalendarCommand extends Command
|
|||||||
$person = $helper->ask($input, $output, $question);
|
$person = $helper->ask($input, $output, $question);
|
||||||
$calendar->addPerson($person);
|
$calendar->addPerson($person);
|
||||||
|
|
||||||
|
|
||||||
// a main user
|
// a main user
|
||||||
$question = new Question("Who will be the main user ? Give an id for a user. ");
|
$question = new Question('Who will be the main user ? Give an id for a user. ');
|
||||||
$question
|
$question
|
||||||
->setValidator(function ($answer): User {
|
->setValidator(function ($answer): User {
|
||||||
if (!is_numeric($answer)) {
|
if (!is_numeric($answer)) {
|
||||||
throw new \UnexpectedValueException('the answer must be numeric');
|
throw new UnexpectedValueException('the answer must be numeric');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 >= (int) $answer) {
|
if (0 >= (int) $answer) {
|
||||||
throw new \UnexpectedValueException('the answer must be greater than zero');
|
throw new UnexpectedValueException('the answer must be greater than zero');
|
||||||
}
|
}
|
||||||
|
|
||||||
$user = $this->userRepository->find((int) $answer);
|
$user = $this->userRepository->find((int) $answer);
|
||||||
|
|
||||||
if (null === $user) {
|
if (null === $user) {
|
||||||
throw new \UnexpectedValueException("The user is not found");
|
throw new UnexpectedValueException('The user is not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $user;
|
return $user;
|
||||||
@ -150,21 +153,22 @@ class SendTestShortMessageOnCalendarCommand extends Command
|
|||||||
$calendar->setMainUser($user);
|
$calendar->setMainUser($user);
|
||||||
|
|
||||||
// phonenumber
|
// phonenumber
|
||||||
$question = new Question("To which number are we going to send this fake message ?",
|
$phonenumberFormatted = null !== $person->getMobilenumber() ?
|
||||||
null !== $person->getMobilenumber() ?
|
$this->phoneNumberUtil->format($person->getMobilenumber(), PhoneNumberFormat::E164) : '';
|
||||||
$this->phoneNumberHelper->format($person->getMobilenumber()):
|
$question = new Question(
|
||||||
null
|
sprintf('To which number are we going to send this fake message ? (default to: %s)', $phonenumberFormatted),
|
||||||
|
$phonenumberFormatted
|
||||||
);
|
);
|
||||||
|
|
||||||
$question->setNormalizer(function ($answer): PhoneNumber {
|
$question->setNormalizer(function ($answer): PhoneNumber {
|
||||||
if (null === $answer) {
|
if (null === $answer) {
|
||||||
throw new \UnexpectedValueException("The person is not found");
|
throw new UnexpectedValueException('The person is not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
$phone = $this->phoneNumberUtil->parse($answer, 'BE');
|
$phone = $this->phoneNumberUtil->parse($answer, 'BE');
|
||||||
|
|
||||||
if (!$this->phoneNumberUtil->isPossibleNumberForType($phone, PhoneNumberType::MOBILE)) {
|
if (!$this->phoneNumberUtil->isPossibleNumberForType($phone, PhoneNumberType::MOBILE)) {
|
||||||
throw new \UnexpectedValueException("Phone number si not a mobile");
|
throw new UnexpectedValueException('Phone number si not a mobile');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $phone;
|
return $phone;
|
||||||
@ -172,6 +176,9 @@ class SendTestShortMessageOnCalendarCommand extends Command
|
|||||||
|
|
||||||
$phone = $helper->ask($input, $output, $question);
|
$phone = $helper->ask($input, $output, $question);
|
||||||
|
|
||||||
|
$question = new ConfirmationQuestion('really send the message to the phone ?');
|
||||||
|
$reallySend = (bool) $helper->ask($input, $output, $question);
|
||||||
|
|
||||||
$messages = $this->messageForCalendarBuilder->buildMessageForCalendar($calendar);
|
$messages = $this->messageForCalendarBuilder->buildMessageForCalendar($calendar);
|
||||||
|
|
||||||
if (0 === count($messages)) {
|
if (0 === count($messages)) {
|
||||||
@ -179,10 +186,13 @@ class SendTestShortMessageOnCalendarCommand extends Command
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($messages as $key => $message) {
|
foreach ($messages as $key => $message) {
|
||||||
$output->writeln("The short message for SMS ${key} will be: ");
|
$output->writeln("The short message for SMS {$key} will be: ");
|
||||||
$output->writeln($message->getContent());
|
$output->writeln($message->getContent());
|
||||||
$message->setPhoneNumber($phone);
|
$message->setPhoneNumber($phone);
|
||||||
$this->messageSender->send($message);
|
|
||||||
|
if ($reallySend) {
|
||||||
|
$this->transporter->send($message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -30,7 +30,7 @@ class Configuration implements ConfigurationInterface
|
|||||||
->children()
|
->children()
|
||||||
->arrayNode('short_messages')
|
->arrayNode('short_messages')
|
||||||
->canBeDisabled()
|
->canBeDisabled()
|
||||||
->children()->end()
|
->children()->end()
|
||||||
->end() // end for short_messages
|
->end() // end for short_messages
|
||||||
->arrayNode('remote_calendars_sync')->canBeEnabled()
|
->arrayNode('remote_calendars_sync')->canBeEnabled()
|
||||||
->children()
|
->children()
|
||||||
|
@ -1 +1 @@
|
|||||||
Votre travailleur social {{ calendar.mainUser.label }} vous rencontrera le {{ calendar.startDate|format_date('short') }} à {{ calendar.startDate|format_time('medium') }} - LIEU. {% if calendar.location is not null and calendar.location.phonenumber is not null %}En cas d’indisponibilité rappelez-nous au {{ calendar.location.phonenumber|chill_format_phonenumber }}.{% endif %}
|
Votre travailleur social {{ calendar.mainUser.label }} vous rencontrera le {{ calendar.startDate|format_date('short', locale='fr') }} à {{ calendar.startDate|format_time('short', locale='fr') }} - LIEU.{% if calendar.mainUser.mainLocation is not null and calendar.mainUser.mainLocation.phonenumber1 is not null %} En cas d'indisponibilité, appelez-nous au {{ calendar.mainUser.mainLocation.phonenumber1|chill_format_phonenumber }}.{% endif %}
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\CalendarBundle\Service\ShortMessageNotification;
|
||||||
|
|
||||||
|
use DateInterval;
|
||||||
|
use Monolog\DateTimeImmutable;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * Lundi => Envoi des rdv du mardi et mercredi.
|
||||||
|
* * Mardi => Envoi des rdv du jeudi.
|
||||||
|
* * Mercredi => Envoi des rdv du vendredi
|
||||||
|
* * Jeudi => envoi des rdv du samedi et dimanche
|
||||||
|
* * Vendredi => Envoi des rdv du lundi.
|
||||||
|
*/
|
||||||
|
class DefaultRangeGenerator implements RangeGeneratorInterface
|
||||||
|
{
|
||||||
|
public function generateRange(\DateTimeImmutable $date): array
|
||||||
|
{
|
||||||
|
$onMidnight = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $date->format('Y-m-d') . ' 00:00:00');
|
||||||
|
|
||||||
|
switch ($dow = (int) $onMidnight->format('w')) {
|
||||||
|
case 6: // Saturday
|
||||||
|
case 0: // Sunday
|
||||||
|
return ['startDate' => null, 'endDate' => null];
|
||||||
|
|
||||||
|
case 1: // Monday
|
||||||
|
// send for Tuesday and Wednesday
|
||||||
|
$startDate = $onMidnight->add(new DateInterval('P1D'));
|
||||||
|
$endDate = $startDate->add(new DateInterval('P2D'));
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // tuesday
|
||||||
|
case 3: // wednesday
|
||||||
|
$startDate = $onMidnight->add(new DateInterval('P2D'));
|
||||||
|
$endDate = $startDate->add(new DateInterval('P1D'));
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: // thursday
|
||||||
|
$startDate = $onMidnight->add(new DateInterval('P2D'));
|
||||||
|
$endDate = $startDate->add(new DateInterval('P2D'));
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: // friday
|
||||||
|
$startDate = $onMidnight->add(new DateInterval('P3D'));
|
||||||
|
$endDate = $startDate->add(new DateInterval('P1D'));
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new UnexpectedValueException('a day of a week should not have the value: ' . $dow);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['startDate' => $startDate, 'endDate' => $endDate];
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,17 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\CalendarBundle\Service\ShortMessageNotification;
|
namespace Chill\CalendarBundle\Service\ShortMessageNotification;
|
||||||
|
|
||||||
use Chill\BudgetBundle\Templating\Twig;
|
|
||||||
use Chill\CalendarBundle\Entity\Calendar;
|
use Chill\CalendarBundle\Entity\Calendar;
|
||||||
use Chill\MainBundle\Service\Mailer\ShortMessage;
|
|
||||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||||
use Symfony\Component\Templating\EngineInterface;
|
use Symfony\Component\Templating\EngineInterface;
|
||||||
|
|
||||||
@ -36,8 +43,8 @@ class DefaultShortMessageForCalendarBuilder implements ShortMessageForCalendarBu
|
|||||||
}
|
}
|
||||||
|
|
||||||
$toUsers[] = new \Chill\MainBundle\Service\ShortMessage\ShortMessage(
|
$toUsers[] = new \Chill\MainBundle\Service\ShortMessage\ShortMessage(
|
||||||
$this->engine->render('@ChillCalendar/CalendarShortMessage/short_message.txt.twig', ['calendar' => $calendar]),
|
$this->engine->render('@ChillCalendar/CalendarShortMessage/short_message.txt.twig', ['calendar' => $calendar]),
|
||||||
$person->getMobilenumber()
|
$person->getMobilenumber()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\CalendarBundle\Service\ShortMessageNotification;
|
||||||
|
|
||||||
|
use Chill\CalendarBundle\Repository\CalendarRepository;
|
||||||
|
use Symfony\Component\Messenger\MessageBusInterface;
|
||||||
|
|
||||||
|
class Generator
|
||||||
|
{
|
||||||
|
private CalendarRepository $calendarRepository;
|
||||||
|
|
||||||
|
private MessageBusInterface $messageBus;
|
||||||
|
|
||||||
|
private RangeGeneratorInterface $rangeGenerator;
|
||||||
|
|
||||||
|
public function generateShortMessages(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\CalendarBundle\Service\ShortMessageNotification;
|
||||||
|
|
||||||
|
use DateTimeImmutable;
|
||||||
|
|
||||||
|
interface RangeGeneratorInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return array<startDate: \DateTimeImmutable, endDate: \DateTimeImmutable>
|
||||||
|
*/
|
||||||
|
public function generateRange(DateTimeImmutable $date): array;
|
||||||
|
}
|
@ -1,14 +1,22 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\CalendarBundle\Service\ShortMessageNotification;
|
namespace Chill\CalendarBundle\Service\ShortMessageNotification;
|
||||||
|
|
||||||
use Chill\CalendarBundle\Entity\Calendar;
|
use Chill\CalendarBundle\Entity\Calendar;
|
||||||
use Chill\MainBundle\Service\Mailer\ShortMessage;
|
use Chill\MainBundle\Service\ShortMessage\ShortMessage;
|
||||||
|
|
||||||
interface ShortMessageForCalendarBuilderInterface
|
interface ShortMessageForCalendarBuilderInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param Calendar $calendar
|
|
||||||
* @return array|ShortMessage[]
|
* @return array|ShortMessage[]
|
||||||
*/
|
*/
|
||||||
public function buildMessageForCalendar(Calendar $calendar): array;
|
public function buildMessageForCalendar(Calendar $calendar): array;
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\CalendarBundle\Tests\Service\ShortMessageNotification;
|
||||||
|
|
||||||
|
use Chill\CalendarBundle\Service\ShortMessageNotification\DefaultRangeGenerator;
|
||||||
|
use DateTimeImmutable;
|
||||||
|
use Iterator;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @coversNothing
|
||||||
|
*/
|
||||||
|
final class DefaultRangeGeneratorTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* * Lundi => Envoi des rdv du mardi et mercredi.
|
||||||
|
* * Mardi => Envoi des rdv du jeudi.
|
||||||
|
* * Mercredi => Envoi des rdv du vendredi
|
||||||
|
* * Jeudi => envoi des rdv du samedi et dimanche
|
||||||
|
* * Vendredi => Envoi des rdv du lundi.
|
||||||
|
*/
|
||||||
|
public function generateData(): Iterator
|
||||||
|
{
|
||||||
|
yield [
|
||||||
|
new DateTimeImmutable('2022-06-13 10:45:00'),
|
||||||
|
new DateTimeImmutable('2022-06-14 00:00:00'),
|
||||||
|
new DateTimeImmutable('2022-06-16 00:00:00'),
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new DateTimeImmutable('2022-06-14 15:45:00'),
|
||||||
|
new DateTimeImmutable('2022-06-16 00:00:00'),
|
||||||
|
new DateTimeImmutable('2022-06-17 00:00:00'),
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new DateTimeImmutable('2022-06-15 13:45:18'),
|
||||||
|
new DateTimeImmutable('2022-06-17 00:00:00'),
|
||||||
|
new DateTimeImmutable('2022-06-18 00:00:00'),
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new DateTimeImmutable('2022-06-16 01:30:55'),
|
||||||
|
new DateTimeImmutable('2022-06-18 00:00:00'),
|
||||||
|
new DateTimeImmutable('2022-06-20 00:00:00'),
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new DateTimeImmutable('2022-06-17 21:30:55'),
|
||||||
|
new DateTimeImmutable('2022-06-20 00:00:00'),
|
||||||
|
new DateTimeImmutable('2022-06-21 00:00:00'),
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new DateTimeImmutable('2022-06-18 21:30:55'),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
new DateTimeImmutable('2022-06-19 21:30:55'),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider generateData
|
||||||
|
*/
|
||||||
|
public function testGenerateRange(DateTimeImmutable $date, ?DateTimeImmutable $startDate, ?DateTimeImmutable $endDate)
|
||||||
|
{
|
||||||
|
$generator = new DefaultRangeGenerator();
|
||||||
|
|
||||||
|
['startDate' => $actualStartDate, 'endDate' => $actualEndDate] = $generator->generateRange($date);
|
||||||
|
|
||||||
|
$this->assertEquals($startDate->format(DateTimeImmutable::ATOM), $actualStartDate->format(DateTimeImmutable::ATOM));
|
||||||
|
$this->assertEquals($endDate->format(DateTimeImmutable::ATOM), $actualEndDate->format(DateTimeImmutable::ATOM));
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,7 @@ use Chill\MainBundle\DependencyInjection\CompilerPass\GroupingCenterCompilerPass
|
|||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\MenuCompilerPass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\MenuCompilerPass;
|
||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\NotificationCounterCompilerPass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\NotificationCounterCompilerPass;
|
||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\SearchableServicesCompilerPass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\SearchableServicesCompilerPass;
|
||||||
|
use Chill\MainBundle\DependencyInjection\CompilerPass\ShortMessageCompilerPass;
|
||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\TimelineCompilerClass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\TimelineCompilerClass;
|
||||||
use Chill\MainBundle\DependencyInjection\CompilerPass\WidgetsCompilerPass;
|
use Chill\MainBundle\DependencyInjection\CompilerPass\WidgetsCompilerPass;
|
||||||
use Chill\MainBundle\DependencyInjection\ConfigConsistencyCompilerPass;
|
use Chill\MainBundle\DependencyInjection\ConfigConsistencyCompilerPass;
|
||||||
@ -70,5 +71,6 @@ class ChillMainBundle extends Bundle
|
|||||||
$container->addCompilerPass(new ACLFlagsCompilerPass());
|
$container->addCompilerPass(new ACLFlagsCompilerPass());
|
||||||
$container->addCompilerPass(new GroupingCenterCompilerPass());
|
$container->addCompilerPass(new GroupingCenterCompilerPass());
|
||||||
$container->addCompilerPass(new CRUDControllerCompilerPass());
|
$container->addCompilerPass(new CRUDControllerCompilerPass());
|
||||||
|
$container->addCompilerPass(new ShortMessageCompilerPass());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,6 +199,8 @@ class ChillMainExtension extends Extension implements
|
|||||||
$loader->load('services/short_message.yaml');
|
$loader->load('services/short_message.yaml');
|
||||||
|
|
||||||
$this->configureCruds($container, $config['cruds'], $config['apis'], $loader);
|
$this->configureCruds($container, $config['cruds'], $config['apis'], $loader);
|
||||||
|
$container->setParameter('chill_main.short_messages', $config['short_messages']);
|
||||||
|
//$this->configureSms($config['short_messages'], $container, $loader);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function prepend(ContainerBuilder $container)
|
public function prepend(ContainerBuilder $container)
|
||||||
@ -314,6 +316,13 @@ class ChillMainExtension extends Extension implements
|
|||||||
// Note: the controller are loaded inside compiler pass
|
// Note: the controller are loaded inside compiler pass
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function configureSms(array $config, ContainerBuilder $container, Loader\YamlFileLoader $loader): void
|
||||||
|
{
|
||||||
|
$dsn = parse_url($config['dsn']);
|
||||||
|
|
||||||
|
dump($dsn);
|
||||||
|
}
|
||||||
|
|
||||||
protected function prependCruds(ContainerBuilder $container)
|
protected function prependCruds(ContainerBuilder $container)
|
||||||
{
|
{
|
||||||
$container->prependExtensionConfig('chill_main', [
|
$container->prependExtensionConfig('chill_main', [
|
||||||
|
@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\DependencyInjection\CompilerPass;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Service\ShortMessage\NullShortMessageSender;
|
||||||
|
use Chill\MainBundle\Service\ShortMessage\ShortMessageTransporter;
|
||||||
|
use Chill\MainBundle\Service\ShortMessageOvh\OvhShortMessageSender;
|
||||||
|
use libphonenumber\PhoneNumberUtil;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\DependencyInjection\Definition;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
|
||||||
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
|
use function array_key_exists;
|
||||||
|
|
||||||
|
class ShortMessageCompilerPass implements CompilerPassInterface
|
||||||
|
{
|
||||||
|
public function process(ContainerBuilder $container)
|
||||||
|
{
|
||||||
|
$config = $container->resolveEnvPlaceholders($container->getParameter('chill_main.short_messages', null), true);
|
||||||
|
// weird fix for special characters
|
||||||
|
$config['dsn'] = str_replace(['%%'], ['%'], $config['dsn']);
|
||||||
|
$dsn = parse_url($config['dsn']);
|
||||||
|
parse_str($dsn['query'] ?? '', $dsn['queries']);
|
||||||
|
|
||||||
|
if ('null' === $dsn['scheme'] || false === $config['enabled']) {
|
||||||
|
$defaultTransporter = new Reference(NullShortMessageSender::class);
|
||||||
|
} elseif ('ovh' === $dsn['scheme']) {
|
||||||
|
if (!class_exists('\Ovh\Api')) {
|
||||||
|
throw new RuntimeException('Class \\Ovh\\Api not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (['user', 'host', 'pass'] as $component) {
|
||||||
|
if (!array_key_exists($component, $dsn)) {
|
||||||
|
throw new RuntimeException(sprintf('The component %s does not exist in dsn. Please provide a dsn ' .
|
||||||
|
'like ovh://applicationKey:applicationSecret@endpoint?consumerKey=xxxx&sender=yyyy&service_name=zzzz', $component));
|
||||||
|
}
|
||||||
|
|
||||||
|
$container->setParameter('chill_main.short_messages.ovh_config_' . $component, $dsn[$component]);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (['consumer_key', 'sender', 'service_name'] as $param) {
|
||||||
|
if (!array_key_exists($param, $dsn['queries'])) {
|
||||||
|
throw new RuntimeException(sprintf('The parameter %s does not exist in dsn. Please provide a dsn ' .
|
||||||
|
'like ovh://applicationKey:applicationSecret@endpoint?consumerKey=xxxx&sender=yyyy&service_name=zzzz', $param));
|
||||||
|
}
|
||||||
|
$container->setParameter('chill_main.short_messages.ovh_config_' . $param, $dsn['queries'][$param]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ovh = new Definition();
|
||||||
|
$ovh
|
||||||
|
->setClass('\Ovh\Api')
|
||||||
|
->setArgument(0, $dsn['user'])
|
||||||
|
->setArgument(1, $dsn['pass'])
|
||||||
|
->setArgument(2, $dsn['host'])
|
||||||
|
->setArgument(3, $dsn['queries']['consumer_key']);
|
||||||
|
$container->setDefinition('Ovh\Api', $ovh);
|
||||||
|
|
||||||
|
$ovhSender = new Definition();
|
||||||
|
$ovhSender
|
||||||
|
->setClass(OvhShortMessageSender::class)
|
||||||
|
->setArgument(0, new Reference('Ovh\Api'))
|
||||||
|
->setArgument(1, $dsn['queries']['service_name'])
|
||||||
|
->setArgument(2, $dsn['queries']['sender'])
|
||||||
|
->setArgument(3, new Reference(LoggerInterface::class))
|
||||||
|
->setArgument(4, new Reference(PhoneNumberUtil::class));
|
||||||
|
$container->setDefinition(OvhShortMessageSender::class, $ovhSender);
|
||||||
|
|
||||||
|
$defaultTransporter = new Reference(OvhShortMessageSender::class);
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(sprintf('Cannot find a sender for this dsn: %s', $config['dsn']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$container->getDefinition(ShortMessageTransporter::class)
|
||||||
|
->setArgument(0, $defaultTransporter);
|
||||||
|
}
|
||||||
|
}
|
@ -102,6 +102,14 @@ class Configuration implements ConfigurationInterface
|
|||||||
->end()
|
->end()
|
||||||
->end()
|
->end()
|
||||||
->end()
|
->end()
|
||||||
|
->arrayNode('short_messages')
|
||||||
|
->canBeEnabled()
|
||||||
|
->children()
|
||||||
|
->scalarNode('dsn')->cannotBeEmpty()->defaultValue('null://null')
|
||||||
|
->info('the dsn for sending short message. Example: ovh://applicationKey:secret@endpoint')
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
|
->end() // end for 'short_messages'
|
||||||
->arrayNode('acl')
|
->arrayNode('acl')
|
||||||
->addDefaultsIfNotSet()
|
->addDefaultsIfNotSet()
|
||||||
->children()
|
->children()
|
||||||
|
@ -1,5 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\MainBundle\Service\ShortMessage;
|
namespace Chill\MainBundle\Service\ShortMessage;
|
||||||
|
|
||||||
class NullShortMessageSender implements ShortMessageSenderInterface
|
class NullShortMessageSender implements ShortMessageSenderInterface
|
||||||
|
@ -19,10 +19,13 @@ class ShortMessage
|
|||||||
|
|
||||||
private PhoneNumber $phoneNumber;
|
private PhoneNumber $phoneNumber;
|
||||||
|
|
||||||
public function __construct(string $content, PhoneNumber $phoneNumber)
|
private string $priority = 'low';
|
||||||
|
|
||||||
|
public function __construct(string $content, PhoneNumber $phoneNumber, string $priority = 'low')
|
||||||
{
|
{
|
||||||
$this->content = $content;
|
$this->content = $content;
|
||||||
$this->phoneNumber = $phoneNumber;
|
$this->phoneNumber = $phoneNumber;
|
||||||
|
$this->priority = $priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getContent(): string
|
public function getContent(): string
|
||||||
@ -35,21 +38,29 @@ class ShortMessage
|
|||||||
return $this->phoneNumber;
|
return $this->phoneNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function getPriority(): string
|
||||||
* @param string $content
|
{
|
||||||
*/
|
return $this->priority;
|
||||||
public function setContent(string $content): void
|
}
|
||||||
|
|
||||||
|
public function setContent(string $content): self
|
||||||
{
|
{
|
||||||
$this->content = $content;
|
$this->content = $content;
|
||||||
|
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function setPhoneNumber(PhoneNumber $phoneNumber): self
|
||||||
* @param PhoneNumber $phoneNumber
|
|
||||||
*/
|
|
||||||
public function setPhoneNumber(PhoneNumber $phoneNumber): void
|
|
||||||
{
|
{
|
||||||
$this->phoneNumber = $phoneNumber;
|
$this->phoneNumber = $phoneNumber;
|
||||||
|
|
||||||
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setPriority(string $priority): self
|
||||||
|
{
|
||||||
|
$this->priority = $priority;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Chill\MainBundle\Service\ShortMessage;
|
namespace Chill\MainBundle\Service\ShortMessage;
|
||||||
|
|
||||||
interface ShortMessageSenderInterface
|
interface ShortMessageSenderInterface
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Service\ShortMessage;
|
||||||
|
|
||||||
|
class ShortMessageTransporter implements ShortMessageTransporterInterface
|
||||||
|
{
|
||||||
|
private ShortMessageSenderInterface $sender;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
ShortMessageSenderInterface $sender // hint: must remain at place 0 for DI
|
||||||
|
) {
|
||||||
|
$this->sender = $sender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function send(ShortMessage $shortMessage): void
|
||||||
|
{
|
||||||
|
$this->sender->send($shortMessage);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Service\ShortMessage;
|
||||||
|
|
||||||
|
interface ShortMessageTransporterInterface
|
||||||
|
{
|
||||||
|
public function send(ShortMessage $shortMessage);
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Service\ShortMessageOvh;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Service\ShortMessage\ShortMessage;
|
||||||
|
use Chill\MainBundle\Service\ShortMessage\ShortMessageSenderInterface;
|
||||||
|
use libphonenumber\PhoneNumberFormat;
|
||||||
|
use libphonenumber\PhoneNumberUtil;
|
||||||
|
use Ovh\Api;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
|
class OvhShortMessageSender implements ShortMessageSenderInterface
|
||||||
|
{
|
||||||
|
private Api $api;
|
||||||
|
|
||||||
|
private LoggerInterface $logger;
|
||||||
|
|
||||||
|
private PhoneNumberUtil $phoneNumberUtil;
|
||||||
|
|
||||||
|
private string $sender;
|
||||||
|
|
||||||
|
private string $serviceName;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
Api $api, // for DI, must remains as first argument
|
||||||
|
string $serviceName, // for di, must remains as second argument
|
||||||
|
string $sender, // for DI, must remains as third argument
|
||||||
|
LoggerInterface $logger,
|
||||||
|
PhoneNumberUtil $phoneNumberUtil
|
||||||
|
) {
|
||||||
|
$this->api = $api;
|
||||||
|
$this->serviceName = $serviceName;
|
||||||
|
$this->sender = $sender;
|
||||||
|
$this->logger = $logger;
|
||||||
|
$this->phoneNumberUtil = $phoneNumberUtil;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function send(ShortMessage $shortMessage): void
|
||||||
|
{
|
||||||
|
$receiver = $this->phoneNumberUtil->format($shortMessage->getPhoneNumber(), PhoneNumberFormat::E164);
|
||||||
|
|
||||||
|
$response = $this->api->post(
|
||||||
|
strtr('/sms/{serviceName}/jobs', ['{serviceName}' => $this->serviceName]),
|
||||||
|
[
|
||||||
|
'message' => $shortMessage->getContent(),
|
||||||
|
'receivers' => [$receiver],
|
||||||
|
'sender' => $this->sender,
|
||||||
|
'noStopClause' => true,
|
||||||
|
'coding' => '7bit',
|
||||||
|
'charset' => 'UTF-8',
|
||||||
|
'priority' => $shortMessage->getPriority(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$improved = array_merge([
|
||||||
|
'validReceiversI' => implode(',', $response['validReceivers']),
|
||||||
|
'idsI' => implode(',', $response['ids']),
|
||||||
|
], $response);
|
||||||
|
|
||||||
|
$this->logger->warning('[sms] a sms was sent', $improved);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user