This commit is contained in:
Julien Fastré 2022-03-02 14:11:47 +01:00
parent f4f488dad1
commit e9ffdb1f03
8 changed files with 192 additions and 175 deletions

View File

@ -43,10 +43,10 @@ final class PhonenumberHelper implements PhoneNumberHelperInterface
private LoggerInterface $logger; private LoggerInterface $logger;
private Client $twilioClient;
private PhonenumberUtil $phoneNumberUtil; private PhonenumberUtil $phoneNumberUtil;
private Client $twilioClient;
public function __construct( public function __construct(
CacheItemPoolInterface $cacheUserData, CacheItemPoolInterface $cacheUserData,
ParameterBagInterface $parameterBag, ParameterBagInterface $parameterBag,
@ -80,7 +80,7 @@ final class PhonenumberHelper implements PhoneNumberHelperInterface
/** /**
* @param string $phoneNumber A national phone number starting with + * @param string $phoneNumber A national phone number starting with +
* @return string *
* @throws NumberParseException * @throws NumberParseException
*/ */
public function format(PhoneNumber $phoneNumber): string public function format(PhoneNumber $phoneNumber): string

View File

@ -16,9 +16,6 @@ use Twig\TwigFilter;
class Templating extends AbstractExtension class Templating extends AbstractExtension
{ {
/**
* @var PhonenumberHelper
*/
protected PhonenumberHelper $phonenumberHelper; protected PhonenumberHelper $phonenumberHelper;
public function __construct(PhonenumberHelper $phonenumberHelper) public function __construct(PhonenumberHelper $phonenumberHelper)

View File

@ -1,47 +1,40 @@
<?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\Serializer\Normalizer; namespace Chill\MainBundle\Serializer\Normalizer;
use libphonenumber\NumberParseException; use libphonenumber\NumberParseException;
use libphonenumber\PhoneNumber; use libphonenumber\PhoneNumber;
use libphonenumber\PhoneNumberUtil; use libphonenumber\PhoneNumberUtil;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Serializer\Exception\CircularReferenceException;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
use Symfony\Component\Serializer\Exception\InvalidArgumentException;
use Symfony\Component\Serializer\Exception\LogicException;
use Symfony\Component\Serializer\Exception\UnexpectedValueException; use Symfony\Component\Serializer\Exception\UnexpectedValueException;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class PhonenumberNormalizer implements NormalizerInterface, DenormalizerInterface class PhonenumberNormalizer implements NormalizerInterface, DenormalizerInterface
{ {
private PhoneNumberUtil $phoneNumberUtil;
private string $defaultCarrierCode; private string $defaultCarrierCode;
private PhoneNumberUtil $phoneNumberUtil;
public function __construct(ParameterBagInterface $parameterBag) public function __construct(ParameterBagInterface $parameterBag)
{ {
$this->defaultCarrierCode = $parameterBag->get('chill_main')['phone_helper']['default_carrier_code']; $this->defaultCarrierCode = $parameterBag->get('chill_main')['phone_helper']['default_carrier_code'];
$this->phoneNumberUtil = PhoneNumberUtil::getInstance(); $this->phoneNumberUtil = PhoneNumberUtil::getInstance();
} }
public function normalize($object, string $format = null, array $context = []): string
{
return $this->phoneNumberUtil->formatOutOfCountryCallingNumber($object, $this->defaultCarrierCode);
}
public function supportsNormalization($data, string $format = null)
{
return $data instanceof PhoneNumber;
}
/** /**
* {@inheritdoc}
*
* @throws UnexpectedValueException * @throws UnexpectedValueException
*/ */
public function denormalize($data, $class, $format = null, array $context = array()) public function denormalize($data, $class, $format = null, array $context = [])
{ {
try { try {
return $this->phoneNumberUtil->parse($data, $this->defaultCarrierCode); return $this->phoneNumberUtil->parse($data, $this->defaultCarrierCode);
@ -50,11 +43,18 @@ class PhonenumberNormalizer implements NormalizerInterface, DenormalizerInterfac
} }
} }
/** public function normalize($object, ?string $format = null, array $context = []): string
* {@inheritdoc} {
*/ return $this->phoneNumberUtil->formatOutOfCountryCallingNumber($object, $this->defaultCarrierCode);
}
public function supportsDenormalization($data, $type, $format = null) public function supportsDenormalization($data, $type, $format = null)
{ {
return $type === 'libphonenumber\PhoneNumber'; return 'libphonenumber\PhoneNumber' === $type;
}
public function supportsNormalization($data, ?string $format = null)
{
return $data instanceof PhoneNumber;
} }
} }

View File

@ -12,30 +12,90 @@ declare(strict_types=1);
namespace Chill\MainBundle\Tests\Routing\Loader; namespace Chill\MainBundle\Tests\Routing\Loader;
use Chill\MainBundle\Phonenumber\PhonenumberHelper; use Chill\MainBundle\Phonenumber\PhonenumberHelper;
use Chill\MainBundle\Phonenumber\PhoneNumberHelperInterface;
use Psr\Log\NullLogger; use Psr\Log\NullLogger;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Cache\Adapter\ArrayAdapter; use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
/**
* @internal
* @coversNothing
*/
final class PhonenumberHelperTest extends KernelTestCase final class PhonenumberHelperTest extends KernelTestCase
{ {
/** public function denormalizePhonenumbers()
* @dataProvider normalizePhonenumbers
*/
public function testNormalizePhonenumbers(string $defaultCarrierCode, string $phoneNumber, string $expected)
{ {
$subject = new PhonenumberHelper( yield [
new ArrayAdapter(), 'BE',
new ParameterBag([ '+3281136917',
'chill_main.phone_helper' => [ '+3281136917',
'default_carrier_code' => $defaultCarrierCode, ];
],
]),
new NullLogger()
);
$this->assertEquals($expected, $subject->normalize($phoneNumber)); yield [
'BE',
'+33 6 23 12 45 54',
'+33623124554',
];
}
public function formatPhonenumbers()
{
yield [
'BE',
'+3281136917',
'081 13 69 17',
];
yield [
'FR',
'+33 6 23 12 45 54',
'06 23 12 45 54',
];
yield [
'FR',
'+32 81 13 69 17',
'081 13 69 17',
];
yield [
'BE',
'+33 6 23 12 45 54',
'06 23 12 45 54',
];
}
public function normalizePhonenumbers()
{
yield [
'BE',
'081136917',
'+3281136917',
];
yield [
'BE',
'003281136917',
'+3281136917',
];
yield [
'BE',
'0032478123456',
'+32478123456',
];
yield [
'BE',
'0478123456',
'+32478123456',
];
yield [
'FR',
'0623124554',
'+33623124554',
];
} }
/** /**
@ -74,75 +134,21 @@ final class PhonenumberHelperTest extends KernelTestCase
$this->assertEquals($expected, $subject->format($phoneNumber)); $this->assertEquals($expected, $subject->format($phoneNumber));
} }
public function formatPhonenumbers() { /**
yield [ * @dataProvider normalizePhonenumbers
'BE', */
'+3281136917', public function testNormalizePhonenumbers(string $defaultCarrierCode, string $phoneNumber, string $expected)
'081 13 69 17', {
]; $subject = new PhonenumberHelper(
new ArrayAdapter(),
new ParameterBag([
'chill_main.phone_helper' => [
'default_carrier_code' => $defaultCarrierCode,
],
]),
new NullLogger()
);
yield [ $this->assertEquals($expected, $subject->normalize($phoneNumber));
'FR',
'+33 6 23 12 45 54',
'06 23 12 45 54',
];
yield [
'FR',
'+32 81 13 69 17',
'081 13 69 17',
];
yield [
'BE',
'+33 6 23 12 45 54',
'06 23 12 45 54',
];
}
public function normalizePhonenumbers() {
yield [
'BE',
'081136917',
'+3281136917',
];
yield [
'BE',
'003281136917',
'+3281136917',
];
yield [
'BE',
'0032478123456',
'+32478123456',
];
yield [
'BE',
'0478123456',
'+32478123456',
];
yield [
'FR',
'0623124554',
'+33623124554',
];
}
public function denormalizePhonenumbers() {
yield [
'BE',
'+3281136917',
'+3281136917',
];
yield [
'BE',
'+33 6 23 12 45 54',
'+33623124554',
];
} }
} }

View File

@ -28,13 +28,10 @@ use Chill\PersonBundle\Form\Type\GenderType;
use Chill\PersonBundle\Form\Type\PersonAltNameType; use Chill\PersonBundle\Form\Type\PersonAltNameType;
use Chill\PersonBundle\Form\Type\PersonPhoneType; use Chill\PersonBundle\Form\Type\PersonPhoneType;
use Chill\PersonBundle\Form\Type\Select2MaritalStatusType; use Chill\PersonBundle\Form\Type\Select2MaritalStatusType;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use libphonenumber\PhoneNumberFormat; use libphonenumber\PhoneNumberFormat;
use libphonenumber\PhoneNumberType as LibphonenumberPhoneNumberType; use libphonenumber\PhoneNumberType as LibphonenumberPhoneNumberType;
use libphonenumber\PhoneNumberUtil; use libphonenumber\PhoneNumberUtil;
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType; use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\CallbackTransformer;
@ -153,7 +150,7 @@ class PersonType extends AbstractType
'format' => PhoneNumberFormat::NATIONAL, 'format' => PhoneNumberFormat::NATIONAL,
'required' => false, 'required' => false,
'attr' => [ 'attr' => [
'placeholder' => PhoneNumberUtil::getInstance()->format($examplePhoneNumber, PhoneNumberFormat::NATIONAL) 'placeholder' => PhoneNumberUtil::getInstance()->format($examplePhoneNumber, PhoneNumberFormat::NATIONAL),
], ],
] ]
); );
@ -175,7 +172,7 @@ class PersonType extends AbstractType
'format' => PhoneNumberFormat::NATIONAL, 'format' => PhoneNumberFormat::NATIONAL,
'required' => false, 'required' => false,
'attr' => [ 'attr' => [
'placeholder' => PhoneNumberUtil::getInstance()->format($examplePhoneNumber, PhoneNumberFormat::NATIONAL) 'placeholder' => PhoneNumberUtil::getInstance()->format($examplePhoneNumber, PhoneNumberFormat::NATIONAL),
], ],
] ]
) )

View File

@ -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\PersonBundle\Validator\Constraints\AccompanyingPeriod; namespace Chill\PersonBundle\Validator\Constraints\AccompanyingPeriod;
use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\AccompanyingPeriod;

View File

@ -1,22 +1,75 @@
<?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); declare(strict_types=1);
namespace Chill\Migrations\Person; namespace Chill\Migrations\Person;
use Chill\Migrations\Main\MigrationPhonenumberHelper;
use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration; use Doctrine\Migrations\AbstractMigration;
use Exception; use Exception;
use libphonenumber\PhoneNumberUtil; use libphonenumber\PhoneNumberUtil;
use RuntimeException;
use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait; use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use function Chill\MainBundle\migrations\buildMigrationPhonenumberClause;
final class Version20220215135509 extends AbstractMigration implements ContainerAwareInterface final class Version20220215135509 extends AbstractMigration implements ContainerAwareInterface
{ {
use ContainerAwareTrait; use ContainerAwareTrait;
public function down(Schema $schema): void
{
throw new Exception('You should not do that.');
}
public function getDescription(): string
{
return 'Update phone numbers for person';
}
public function up(Schema $schema): void
{
$carrier_code = $this->container
->getParameter('chill_main')['phone_helper']['default_carrier_code'];
if (null === $carrier_code) {
throw new RuntimeException('no carrier code');
}
$this->addSql('ALTER TABLE chill_person_person ALTER phonenumber TYPE TEXT');
$this->addSql('ALTER TABLE chill_person_person ALTER phonenumber DROP DEFAULT');
$this->addSql('ALTER TABLE chill_person_person ALTER phonenumber DROP NOT NULL');
$this->addSql('COMMENT ON COLUMN chill_person_person.phonenumber IS NULL');
$this->addSql('ALTER TABLE chill_person_person ALTER mobilenumber TYPE TEXT');
$this->addSql('ALTER TABLE chill_person_person ALTER mobilenumber DROP DEFAULT');
$this->addSql('ALTER TABLE chill_person_person ALTER mobilenumber DROP NOT NULL');
$this->addSql('COMMENT ON COLUMN chill_person_person.mobilenumber IS NULL');
$this->addSql(
'UPDATE chill_person_person SET ' .
$this->buildMigrationPhonenumberClause($carrier_code, 'phonenumber') .
', ' .
$this->buildMigrationPhoneNumberClause($carrier_code, 'mobilenumber')
);
$this->addSql('ALTER TABLE chill_person_phone ALTER phonenumber TYPE TEXT');
$this->addSql('ALTER TABLE chill_person_phone ALTER phonenumber DROP DEFAULT');
$this->addSql('ALTER TABLE chill_person_phone ALTER phonenumber DROP NOT NULL');
$this->addSql('COMMENT ON COLUMN chill_person_phone.phonenumber IS NULL');
$this->addSql(
'UPDATE chill_person_phone SET ' .
$this->buildMigrationPhoneNumberClause($carrier_code, 'phonenumber')
);
}
private function buildMigrationPhoneNumberClause(string $defaultCarriercode, string $field): string private function buildMigrationPhoneNumberClause(string $defaultCarriercode, string $field): string
{ {
$util = PhoneNumberUtil::getInstance(); $util = PhoneNumberUtil::getInstance();
@ -30,49 +83,4 @@ final class Version20220215135509 extends AbstractMigration implements Container
ELSE replace(replace(%s, \'(0)\', \'\'),\' \', \'\') ELSE replace(replace(%s, \'(0)\', \'\'),\' \', \'\')
END', $field, $field, $countryCode, $field, $field); END', $field, $field, $countryCode, $field, $field);
} }
public function getDescription(): string
{
return 'Update phone numbers for person';
}
public function up(Schema $schema): void
{
$carrier_code = $this->container
->getParameter('chill_main')['phone_helper']['default_carrier_code'];
if (null === $carrier_code) {
throw new \RuntimeException("no carrier code");
}
$this->addSql('ALTER TABLE chill_person_person ALTER phonenumber TYPE TEXT');
$this->addSql('ALTER TABLE chill_person_person ALTER phonenumber DROP DEFAULT');
$this->addSql('ALTER TABLE chill_person_person ALTER phonenumber DROP NOT NULL');
$this->addSql('COMMENT ON COLUMN chill_person_person.phonenumber IS NULL');
$this->addSql('ALTER TABLE chill_person_person ALTER mobilenumber TYPE TEXT');
$this->addSql('ALTER TABLE chill_person_person ALTER mobilenumber DROP DEFAULT');
$this->addSql('ALTER TABLE chill_person_person ALTER mobilenumber DROP NOT NULL');
$this->addSql('COMMENT ON COLUMN chill_person_person.mobilenumber IS NULL');
$this->addSql('UPDATE chill_person_person SET '.
$this->buildMigrationPhonenumberClause($carrier_code, 'phonenumber').
', '.
$this->buildMigrationPhoneNumberClause($carrier_code, 'mobilenumber')
);
$this->addSql('ALTER TABLE chill_person_phone ALTER phonenumber TYPE TEXT');
$this->addSql('ALTER TABLE chill_person_phone ALTER phonenumber DROP DEFAULT');
$this->addSql('ALTER TABLE chill_person_phone ALTER phonenumber DROP NOT NULL');
$this->addSql('COMMENT ON COLUMN chill_person_phone.phonenumber IS NULL');
$this->addSql('UPDATE chill_person_phone SET '.
$this->buildMigrationPhoneNumberClause($carrier_code, 'phonenumber')
);
}
public function down(Schema $schema): void
{
throw new Exception('You should not do that.');
}
} }