diff --git a/.changes/v4.12.1.md b/.changes/v4.12.1.md new file mode 100644 index 000000000..a1e69887f --- /dev/null +++ b/.changes/v4.12.1.md @@ -0,0 +1,4 @@ +## v4.12.1 - 2026-02-01 +### Fixed +* ([#496](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/496)) Add the option to deal with duplicate address in BAN adress importer + diff --git a/.changes/v4.13.0.md b/.changes/v4.13.0.md new file mode 100644 index 000000000..cb92860e2 --- /dev/null +++ b/.changes/v4.13.0.md @@ -0,0 +1,15 @@ +## v4.13.0 - 2026-02-23 +### Feature +* ([#500](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/500)) ([!964](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/964)) Limit the number of public download of stored object to 30 downloads +* ([#495](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/495)) ([!967](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/967)) Send email related to notification in both html and txt format, and render quote correctly + +### Fixed +* ([#438](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/438)) Change wrong color of submit button "Désigner comme adresse du parcours" +* ([#498](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/498)) For giving edit permissions on documents, take into account the workflow creator +* Fixed mispelling of address in translations: addresse -> adresse +* ([#499](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/499)) ([!963](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/963)) Fix: some postal code appears in the UI, although they are marked as deleted +* ([#501](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/501)) ([!966](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/966)) Fix deprecation in the markdown rendering +* ([#494](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/494)) ([!965](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/965)) Remove unused all-day slot display + +### DX +* ([!960](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/960)) Configure changie to ask for merge request number for a better tracking of changes diff --git a/.changie.yaml b/.changie.yaml index 49a885a2e..0bcab1f5b 100644 --- a/.changie.yaml +++ b/.changie.yaml @@ -7,7 +7,7 @@ versionFormat: '## {{.Version}} - {{.Time.Format "2006-01-02"}}' kindFormat: '### {{.Kind}}' # Note: it is possible to add a `.custom.Long` text manually into the yaml file produced by `changie new`. This will add a long description. changeFormat: >- - * {{ if not (eq .Custom.Issue "") }}([#{{ .Custom.Issue }}](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/{{ .Custom.Issue }})) {{ end }}{{ .Body }} {{ if and .Custom.SchemaChange (ne .Custom.SchemaChange "No schema change") }} + * {{ if not (eq .Custom.Issue "") }}([#{{ .Custom.Issue }}](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/{{ .Custom.Issue }})) {{ end }}{{ if not (eq .Custom.MR "") }}([!{{ .Custom.MR }}](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/{{ .Custom.MR }})) {{ end }}{{ .Body }} {{ if and .Custom.SchemaChange (ne .Custom.SchemaChange "No schema change") }} **Schema Change**: {{ .Custom.SchemaChange }} {{- end -}} @@ -30,6 +30,12 @@ custom: type: int minInt: 1 + - key: MR + label: Merge request number (on chill-bundles repository) (optional) + optional: true + type: int + minInt: 1 + body: # allow multiline messages block: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 37372c9fb..6fd8931fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,27 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), and is generated by [Changie](https://github.com/miniscruff/changie). +## v4.13.0 - 2026-02-23 +### Feature +* ([#500](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/500)) ([!964](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/964)) Limit the number of public download of stored object to 30 downloads +* ([#495](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/495)) ([!967](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/967)) Send email related to notification in both html and txt format, and render quote correctly + +### Fixed +* ([#438](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/438)) Change wrong color of submit button "Désigner comme adresse du parcours" +* ([#498](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/498)) For giving edit permissions on documents, take into account the workflow creator +* Fixed mispelling of address in translations: addresse -> adresse +* ([#499](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/499)) ([!963](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/963)) Fix: some postal code appears in the UI, although they are marked as deleted +* ([#501](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/501)) ([!966](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/966)) Fix deprecation in the markdown rendering +* ([#494](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/494)) ([!965](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/965)) Remove unused all-day slot display + +### DX +* ([!960](https://gitlab.com/Chill-Projet/chill-bundles/-/merge_requests/960)) Configure changie to ask for merge request number for a better tracking of changes + +## v4.12.1 - 2026-02-01 +### Fixed +* ([#496](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/496)) Add the option to deal with duplicate address in BAN adress importer + + ## v4.12.0 - 2026-01-15 ### Feature * ([#473](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/473)) Display version of chill bundles in application footer @@ -21,6 +42,8 @@ and is generated by [Changie](https://github.com/miniscruff/changie). * ([#492](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/492)) fix CommentInput: replace deprecated value binding with model-value * ([#493](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/493)) fix issue with stored object permissions associated with workflows (as attachment, or through a related entity) + BC: the constructor's signature of `\Chill\DocStoreBundle\Security\Authorization\StoredObjectVoter\AbstractStoredObjectVoter` has changed. + ## v4.11.0 - 2025-12-17 ### Feature * ([#478](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/478)) Add filtering to admin lists: social actions, social issues, goals, results, and evaluations diff --git a/composer.json b/composer.json index b3424ddba..65cbd19dd 100644 --- a/composer.json +++ b/composer.json @@ -98,7 +98,7 @@ "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.3", "fakerphp/faker": "^1.13", - "friendsofphp/php-cs-fixer": "3.92.5", + "friendsofphp/php-cs-fixer": "3.93.0", "jangregor/phpstan-prophecy": "^1.0", "nelmio/alice": "^3.8", "nikic/php-parser": "^4.15", diff --git a/src/Bundle/ChillActivityBundle/DependencyInjection/ChillActivityExtension.php b/src/Bundle/ChillActivityBundle/DependencyInjection/ChillActivityExtension.php index 15e7e7e4b..38aefdaea 100644 --- a/src/Bundle/ChillActivityBundle/DependencyInjection/ChillActivityExtension.php +++ b/src/Bundle/ChillActivityBundle/DependencyInjection/ChillActivityExtension.php @@ -69,7 +69,7 @@ class ChillActivityExtension extends Extension implements PrependExtensionInterf } /** (non-PHPdoc). - * @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend() + * @see PrependExtensionInterface::prepend() */ public function prependRoutes(ContainerBuilder $container) { diff --git a/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php b/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php index 6a8842b64..6bae7c785 100644 --- a/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php +++ b/src/Bundle/ChillBudgetBundle/DependencyInjection/ChillBudgetExtension.php @@ -56,7 +56,7 @@ class ChillBudgetExtension extends Extension implements PrependExtensionInterfac } /** (non-PHPdoc). - * @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend() + * @see PrependExtensionInterface::prepend() */ public function prependRoutes(ContainerBuilder $container) { diff --git a/src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue b/src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue index 40c3200b9..952ab748f 100644 --- a/src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue +++ b/src/Bundle/ChillCalendarBundle/Resources/public/vuejs/MyCalendarRange/App2.vue @@ -346,6 +346,7 @@ const baseOptions = ref({ center: "title", right: "timeGridWeek,timeGridDay", }, + allDaySlot: false, }); const ranges = computed(() => { diff --git a/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/ChillCustomFieldsExtension.php b/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/ChillCustomFieldsExtension.php index 724fd01ca..a68284989 100644 --- a/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/ChillCustomFieldsExtension.php +++ b/src/Bundle/ChillCustomFieldsBundle/DependencyInjection/ChillCustomFieldsExtension.php @@ -52,7 +52,7 @@ class ChillCustomFieldsExtension extends Extension implements PrependExtensionIn } /** (non-PHPdoc). - * @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend() + * @see PrependExtensionInterface::prepend() */ public function prepend(ContainerBuilder $container) { diff --git a/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoiceWithOtherType.php b/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoiceWithOtherType.php index 8d0c049f0..6c705ec7f 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoiceWithOtherType.php +++ b/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoiceWithOtherType.php @@ -25,7 +25,7 @@ class ChoiceWithOtherType extends AbstractType private string $otherValueLabel = 'Other value'; /** (non-PHPdoc). - * @see \Symfony\Component\Form\AbstractType::buildForm() + * @see AbstractType::buildForm() */ public function buildForm(FormBuilderInterface $builder, array $options) { @@ -42,7 +42,7 @@ class ChoiceWithOtherType extends AbstractType } /** (non-PHPdoc). - * @see \Symfony\Component\Form\AbstractType::configureOptions() + * @see AbstractType::configureOptions() */ public function configureOptions(OptionsResolver $resolver) { diff --git a/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php b/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php index c50bd856e..7a06217d9 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php +++ b/src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php @@ -22,7 +22,7 @@ use Symfony\Component\Form\FormEvents; class ChoicesListType extends AbstractType { /** (non-PHPdoc). - * @see \Symfony\Component\Form\AbstractType::buildForm() + * @see AbstractType::buildForm() */ public function buildForm(FormBuilderInterface $builder, array $options) { diff --git a/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldProvider.php b/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldProvider.php index fcccf01ed..97b2dbe71 100644 --- a/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldProvider.php +++ b/src/Bundle/ChillCustomFieldsBundle/Service/CustomFieldProvider.php @@ -82,7 +82,7 @@ class CustomFieldProvider implements ContainerAwareInterface /** * (non-PHPdoc). * - * @see \Symfony\Component\DependencyInjection\ContainerAwareInterface::setContainer() + * @see ContainerAwareInterface::setContainer() */ public function setContainer(?ContainerInterface $container = null) { diff --git a/src/Bundle/ChillEventBundle/DependencyInjection/ChillEventExtension.php b/src/Bundle/ChillEventBundle/DependencyInjection/ChillEventExtension.php index cb59bb390..e5cbb2638 100644 --- a/src/Bundle/ChillEventBundle/DependencyInjection/ChillEventExtension.php +++ b/src/Bundle/ChillEventBundle/DependencyInjection/ChillEventExtension.php @@ -52,7 +52,7 @@ class ChillEventExtension extends Extension implements PrependExtensionInterface } /** (non-PHPdoc). - * @see \Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface::prepend() + * @see PrependExtensionInterface::prepend() */ public function prepend(ContainerBuilder $container): void { diff --git a/src/Bundle/ChillMainBundle/Command/LoadAddressesFRFromBANCommand.php b/src/Bundle/ChillMainBundle/Command/LoadAddressesFRFromBANCommand.php index 8483c0be1..a747b4c2c 100644 --- a/src/Bundle/ChillMainBundle/Command/LoadAddressesFRFromBANCommand.php +++ b/src/Bundle/ChillMainBundle/Command/LoadAddressesFRFromBANCommand.php @@ -31,7 +31,8 @@ class LoadAddressesFRFromBANCommand extends Command { $this->setName('chill:main:address-ref-from-ban') ->addArgument('departementNo', InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'a list of departement numbers') - ->addOption('send-report-email', 's', InputOption::VALUE_REQUIRED, 'Email address where a list of unimported addresses can be send'); + ->addOption('send-report-email', 's', InputOption::VALUE_REQUIRED, 'Email address where a list of unimported addresses can be send') + ->addOption('allow-remove-double-refid', 'd', InputOption::VALUE_NONE, 'Should the address importer be allowed to remove same refid in the source data, if any'); } protected function execute(InputInterface $input, OutputInterface $output): int @@ -40,7 +41,7 @@ class LoadAddressesFRFromBANCommand extends Command foreach ($input->getArgument('departementNo') as $departementNo) { $output->writeln('Import addresses for '.$departementNo); - $this->addressReferenceFromBAN->import($departementNo, $input->hasOption('send-report-email') ? $input->getOption('send-report-email') : null); + $this->addressReferenceFromBAN->import($departementNo, $input->hasOption('send-report-email') ? $input->getOption('send-report-email') : null, allowRemoveDoubleRefId: $input->hasOption('allow-remove-double-refid') ? $input->getOption('allow-remove-double-refid') : false); } return Command::SUCCESS; diff --git a/src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php b/src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php index 376df4e52..43d63a0fa 100644 --- a/src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php +++ b/src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php @@ -48,7 +48,7 @@ class LoadAndUpdateLanguagesCommand extends Command /** * (non-PHPdoc). * - * @see \Symfony\Component\Console\Command\Command::configure() + * @see Command::configure() */ protected function configure() { @@ -73,7 +73,7 @@ class LoadAndUpdateLanguagesCommand extends Command /** * (non-PHPdoc). * - * @see \Symfony\Component\Console\Command\Command::execute() + * @see Command::execute() */ protected function execute(InputInterface $input, OutputInterface $output): int { diff --git a/src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php b/src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php index 3f7f82523..fd921b51a 100644 --- a/src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php +++ b/src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php @@ -51,7 +51,7 @@ class LoadCountriesCommand extends Command /** * (non-PHPdoc). * - * @see \Symfony\Component\Console\Command\Command::configure() + * @see Command::configure() */ protected function configure() { @@ -61,7 +61,7 @@ class LoadCountriesCommand extends Command /** * (non-PHPdoc). * - * @see \Symfony\Component\Console\Command\Command::execute() + * @see Command::execute() */ protected function execute(InputInterface $input, OutputInterface $output): int { diff --git a/src/Bundle/ChillMainBundle/Controller/PostalCodeAPIController.php b/src/Bundle/ChillMainBundle/Controller/PostalCodeAPIController.php index cd13ad455..4ca82053d 100644 --- a/src/Bundle/ChillMainBundle/Controller/PostalCodeAPIController.php +++ b/src/Bundle/ChillMainBundle/Controller/PostalCodeAPIController.php @@ -79,5 +79,7 @@ final class PostalCodeAPIController extends ApiController $qb->andWhere('e.origin = :zero') ->setParameter('zero', 0); + + $qb->andWhere('e.deletedAt IS NULL'); } } diff --git a/src/Bundle/ChillMainBundle/Controller/WorkflowViewSendPublicController.php b/src/Bundle/ChillMainBundle/Controller/WorkflowViewSendPublicController.php index 9cd4fd6f7..1a005c4c7 100644 --- a/src/Bundle/ChillMainBundle/Controller/WorkflowViewSendPublicController.php +++ b/src/Bundle/ChillMainBundle/Controller/WorkflowViewSendPublicController.php @@ -62,15 +62,15 @@ final readonly class WorkflowViewSendPublicController ); } - if (100 < $workflowSend->getViews()->count()) { - $this->chillLogger->info(self::LOG_PREFIX.'100 view reached, not allowed to see it again'); - throw new AccessDeniedHttpException('100 views reached, not allowed to see it again'); + if (30 < $workflowSend->getViews()->count()) { + $this->chillLogger->info(self::LOG_PREFIX.'30 view reached, not allowed to see it again'); + throw new AccessDeniedHttpException('30 views reached, not allowed to see it again'); } try { $metadata = new EntityWorkflowViewMetadataDTO( $workflowSend->getViews()->count(), - 100 - $workflowSend->getViews()->count(), + 30 - $workflowSend->getViews()->count(), ); $response = new Response( $this->entityWorkflowManager->renderPublicView($workflowSend, $metadata), diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/SearchableServicesCompilerPass.php b/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/SearchableServicesCompilerPass.php index ee305f964..6d34d2e93 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/SearchableServicesCompilerPass.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/CompilerPass/SearchableServicesCompilerPass.php @@ -20,7 +20,7 @@ class SearchableServicesCompilerPass implements CompilerPassInterface /** * (non-PHPdoc). * - * @see \Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface::process() + * @see CompilerPassInterface::process() */ public function process(ContainerBuilder $container) { diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/Widget/Factory/AbstractWidgetFactory.php b/src/Bundle/ChillMainBundle/DependencyInjection/Widget/Factory/AbstractWidgetFactory.php index b0c14f27e..05aafba77 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/Widget/Factory/AbstractWidgetFactory.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/Widget/Factory/AbstractWidgetFactory.php @@ -32,7 +32,7 @@ abstract class AbstractWidgetFactory implements WidgetFactoryInterface * Will create the definition by returning the definition from the `services.yml` * file (or `services.xml` or `what-you-want.yml`). * - * @see \Chill\MainBundle\DependencyInjection\Widget\Factory\WidgetFactoryInterface::createDefinition() + * @see WidgetFactoryInterface::createDefinition() */ public function createDefinition(ContainerBuilder $containerBuilder, $place, $order, array $config) { diff --git a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php index ad5fa9e95..914a71615 100644 --- a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php +++ b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php @@ -394,6 +394,10 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface public function isUserInvolved(User $user): bool { + if ($this->getCreatedBy() === $user) { + return true; + } + foreach ($this->getSteps() as $step) { if ($step->getAllDestUser()->contains($user)) { return true; diff --git a/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php b/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php index 1cb64ff4a..237cb178b 100644 --- a/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php +++ b/src/Bundle/ChillMainBundle/Notification/Email/NotificationMailer.php @@ -59,7 +59,8 @@ readonly class NotificationMailer $email ->to($dest->getEmail()) ->subject('Re: '.$comment->getNotification()->getTitle()) - ->textTemplate('@ChillMain/Notification/email_notification_comment_persist.md.twig') + ->textTemplate('@ChillMain/Notification/email_notification_comment_persist.txt.twig') + ->htmlTemplate('@ChillMain/Notification/email_notification_comment_persist.md.twig') ->context([ 'comment' => $comment, 'dest' => $dest, @@ -83,7 +84,6 @@ readonly class NotificationMailer public function postPersistNotification(Notification $notification, PostPersistEventArgs $eventArgs): void { $this->sendNotificationEmailsToAddressees($notification); - $this->sendNotificationEmailsToAddressesEmails($notification); } private function sendNotificationEmailsToAddressees(Notification $notification): void @@ -149,7 +149,8 @@ readonly class NotificationMailer } else { $email = new TemplatedEmail(); $email - ->textTemplate('@ChillMain/Notification/email_non_system_notification_content.md.twig') + ->textTemplate('@ChillMain/Notification/email_non_system_notification_content.txt.twig') + ->htmlTemplate('@ChillMain/Notification/email_non_system_notification_content.md.twig') ->context([ 'notification' => $notification, 'dest' => $addressee, @@ -186,7 +187,8 @@ readonly class NotificationMailer } else { $email = new TemplatedEmail(); $email - ->textTemplate('@ChillMain/Notification/email_non_system_notification_content.md.twig') + ->textTemplate('@ChillMain/Notification/email_non_system_notification_content.txt.twig') + ->htmlTemplate('@ChillMain/Notification/email_non_system_notification_content.md.twig') ->context([ 'notification' => $notification, 'dest' => $addressee, @@ -286,38 +288,4 @@ readonly class NotificationMailer throw $e; } } - - private function sendNotificationEmailsToAddressesEmails(Notification $notification): void - { - foreach ($notification->getAddresseeUserGroups() as $userGroup) { - - if (!$userGroup->hasEmail()) { - continue; - } - - $emailAddress = $userGroup->getEmail(); - - $email = new TemplatedEmail(); - $email - ->textTemplate('@ChillMain/Notification/email_non_system_notification_content_to_email.md.twig') - ->context([ - 'notification' => $notification, - 'dest' => $emailAddress, - ]); - - $email - ->subject($notification->getTitle()) - ->to($emailAddress); - - try { - $this->mailer->send($email); - } catch (TransportExceptionInterface $e) { - $this->logger->warning('[NotificationMailer] could not send an email notification', [ - 'to' => $emailAddress, - 'error_message' => $e->getMessage(), - 'error_trace' => $e->getTraceAsString(), - ]); - } - } - } } diff --git a/src/Bundle/ChillMainBundle/Repository/PostalCodeRepository.php b/src/Bundle/ChillMainBundle/Repository/PostalCodeRepository.php index 0779ea90a..b26b5bed2 100644 --- a/src/Bundle/ChillMainBundle/Repository/PostalCodeRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/PostalCodeRepository.php @@ -100,7 +100,9 @@ final readonly class PostalCodeRepository implements PostalCodeRepositoryInterfa $query ->setFromClause('chill_main_postal_code cmpc') - ->andWhereClause('cmpc.origin = 0'); + ->andWhereClause('cmpc.origin = 0') + ->andWhereClause('cmpc.deletedAt IS NULL') + ; if (null !== $country) { $query->andWhereClause('cmpc.country_id = ?', [$country->getId()]); diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.md.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.md.twig index 023f2901a..5c07e2ef7 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.md.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.md.twig @@ -1,20 +1,17 @@ +{% apply markdown_to_html %} {{ dest.label }}, {{ notification.sender.label }} a créé une notification pour vous: -> {{ notification.title }} -> -> -{%- for line in notification.message|split("\n") %} +**Titre de la notification**: {{ notification.title }} + +{% for line in notification.message|split("\n") %} > {{ line }} -{%- if not loop.last %} -> -{%- endif %} -{%- endfor %} +{% endfor %} -Vous pouvez visualiser la notification et y répondre ici: +[Vous pouvez visualiser la notification et y répondre ici.]({{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': notification.id }, false)) }}) -{{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': notification.id }, false)) }} +----- --- Le logiciel Chill +{% endapply %} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.txt.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.txt.twig new file mode 100644 index 000000000..58f138322 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content.txt.twig @@ -0,0 +1,14 @@ +{{ dest.label }}, + +{{ notification.sender.label }} a créé une notification pour vous: + +Titre de la notification: {{ notification.title }} + +{% for line in notification.message|split("\n") %} +> {{ line|raw }} +{% endfor %} + +Vous pouvez visualiser la notification et y répondre ici: {{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': notification.id }, false)) }}. + +-- +Le logiciel Chill diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content_to_email.md.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content_to_email.md.twig deleted file mode 100644 index 9a32f0c15..000000000 --- a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_non_system_notification_content_to_email.md.twig +++ /dev/null @@ -1,20 +0,0 @@ -{{ dest }}, - -{{ notification.sender.label }} a créé une notification pour vous: - -> {{ notification.title }} -> -> -{%- for line in notification.message|split("\n") %} -> {{ line }} -{%- if not loop.last %} -> -{%- endif %} -{%- endfor %} - -Vous pouvez cliquer sur ce lien pour obtenir un accès permanent à la notification: - -{{ absolute_url(path('chill_main_notification_grant_access_by_access_key', {'_locale': 'fr', 'id': notification.id, 'accessKey': notification.accessKey, 'email': dest})) }} - --- -Le logiciel Chill diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.md.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.md.twig index e7e212492..176484d9f 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.md.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.md.twig @@ -1,3 +1,4 @@ +{% apply markdown_to_html %} {{ dest.label }}, {{ comment.createdBy.label }} a créé un commentaire sur la notification "{{ comment.notification.title }}". @@ -6,14 +7,11 @@ Commentaire: {% for line in comment.content|split("\n") %} > {{ line }} -{%- if not loop.last %} -> -{%- endif %} -{%- endfor %} +{% endfor %} -Vous pouvez visualiser la notification et y répondre ici: +[Vous pouvez visualiser la notification et y répondre ici.]({{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': comment.notification.id }, false)) }}) -{{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': comment.notification.id }, false)) }} +---- --- Le logiciel Chill +{% endapply %} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.txt.twig b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.txt.twig new file mode 100644 index 000000000..952c38662 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/Notification/email_notification_comment_persist.txt.twig @@ -0,0 +1,14 @@ +{{ dest.label }}, + +{{ comment.createdBy.label }} a créé un commentaire sur la notification "{{ comment.notification.title }}". + +Commentaire: + +{% for line in comment.content|split("\n") %} +> {{ line }} +{%- endfor %} + +Vous pouvez visualiser la notification et y répondre ici: {{ absolute_url(path('chill_main_notification_show', {'_locale': dest.locale, 'id': comment.notification.id }, false)) }} + +-- +Le logiciel Chill diff --git a/src/Bundle/ChillMainBundle/Security/Resolver/ScopeResolverDispatcher.php b/src/Bundle/ChillMainBundle/Security/Resolver/ScopeResolverDispatcher.php index 50cca33d5..d7cb0ee21 100644 --- a/src/Bundle/ChillMainBundle/Security/Resolver/ScopeResolverDispatcher.php +++ b/src/Bundle/ChillMainBundle/Security/Resolver/ScopeResolverDispatcher.php @@ -33,7 +33,7 @@ final readonly class ScopeResolverDispatcher } /** - * @return Scope|iterable|Scope|null + * @return Scope|iterable|null */ public function resolveScope(mixed $entity, ?array $options = []): iterable|Scope|null { diff --git a/src/Bundle/ChillMainBundle/Service/Import/AddressReferenceFromBAN.php b/src/Bundle/ChillMainBundle/Service/Import/AddressReferenceFromBAN.php index 0aa4cd6ce..83def3d5c 100644 --- a/src/Bundle/ChillMainBundle/Service/Import/AddressReferenceFromBAN.php +++ b/src/Bundle/ChillMainBundle/Service/Import/AddressReferenceFromBAN.php @@ -23,7 +23,7 @@ class AddressReferenceFromBAN private readonly AddressToReferenceMatcher $addressToReferenceMatcher, ) {} - public function import(string $departementNo, ?string $sendAddressReportToEmail = null): void + public function import(string $departementNo, ?string $sendAddressReportToEmail = null, ?bool $allowRemoveDoubleRefId = false): void { if (!is_numeric($departementNo)) { throw new \UnexpectedValueException('Could not parse this department number'); @@ -96,7 +96,7 @@ class AddressReferenceFromBAN ); } - $this->baseImporter->finalize(sendAddressReportToEmail: $sendAddressReportToEmail); + $this->baseImporter->finalize(allowRemoveDoubleRefId: $allowRemoveDoubleRefId, sendAddressReportToEmail: $sendAddressReportToEmail); $this->addressToReferenceMatcher->checkAddressesMatchingReferences(); diff --git a/src/Bundle/ChillMainBundle/Templating/ChillMarkdownRenderExtension.php b/src/Bundle/ChillMainBundle/Templating/ChillMarkdownRenderExtension.php index 54c9c4f63..3f227b6d6 100644 --- a/src/Bundle/ChillMainBundle/Templating/ChillMarkdownRenderExtension.php +++ b/src/Bundle/ChillMainBundle/Templating/ChillMarkdownRenderExtension.php @@ -41,6 +41,6 @@ final class ChillMarkdownRenderExtension extends AbstractExtension public function renderMarkdownToHtml(?string $var): string { - return $this->parsedown->parse((string) $var); + return $this->parsedown->text((string) $var); } } diff --git a/src/Bundle/ChillMainBundle/Tests/Templating/ChillMarkdownRenderExtensionTest.php b/src/Bundle/ChillMainBundle/Tests/Templating/ChillMarkdownRenderExtensionTest.php index d4eb8afa8..3dbd7fd3b 100644 --- a/src/Bundle/ChillMainBundle/Tests/Templating/ChillMarkdownRenderExtensionTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Templating/ChillMarkdownRenderExtensionTest.php @@ -37,7 +37,7 @@ final class ChillMarkdownRenderExtensionTest extends TestCase MD; private const UNAUTHORIZED_HTML = <<<'HTML' -

<script>alert("ok");</script>

+

<script>alert("ok");</script>

HTML; private const UNAUTHORIZED_MARKDOWN = <<<'MD' diff --git a/src/Bundle/ChillMainBundle/migrations/Version20260223134919.php b/src/Bundle/ChillMainBundle/migrations/Version20260223134919.php new file mode 100644 index 000000000..170519940 --- /dev/null +++ b/src/Bundle/ChillMainBundle/migrations/Version20260223134919.php @@ -0,0 +1,41 @@ +addSql('DROP INDEX public.search_name_code'); + $this->addSql('CREATE INDEX search_name_code ON public.chill_main_postal_code USING GIN (LOWER(code) gin_trgm_ops, LOWER(label) gin_trgm_ops) WHERE deletedAt IS NULL'); + $this->addSql('DROP INDEX public.chill_internal_postal_code_canonicalized'); + $this->addSql('CREATE INDEX chill_internal_postal_code_canonicalized ON chill_main_postal_code USING GIST (canonical gist_trgm_ops) WHERE origin = 0 AND deletedAt IS NULL'); + + } + + public function down(Schema $schema): void + { + $this->addSql('DROP INDEX public.search_name_code'); + $this->addSql('CREATE INDEX search_name_code ON chill_main_postal_code USING GIN (LOWER(code) gin_trgm_ops, LOWER(label) gin_trgm_ops)'); + + $this->addSql('DROP INDEX public.chill_internal_postal_code_canonicalized'); + $this->addSql('CREATE INDEX chill_internal_postal_code_canonicalized ON chill_main_postal_code USING GIST (canonical gist_trgm_ops) WHERE origin = 0'); + } +} diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue index e84d5a9f2..39c90ddeb 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/ButtonLocation.vue @@ -27,7 +27,7 @@

{{ $t("courselocation.sure_description") }}

diff --git a/src/Bundle/ChillPersonBundle/Search/PersonSearch.php b/src/Bundle/ChillPersonBundle/Search/PersonSearch.php index c5c15e125..e891e6e6b 100644 --- a/src/Bundle/ChillPersonBundle/Search/PersonSearch.php +++ b/src/Bundle/ChillPersonBundle/Search/PersonSearch.php @@ -167,7 +167,7 @@ class PersonSearch extends AbstractSearch implements HasAdvancedSearchFormInterf /** * (non-PHPdoc). * - * @see \Chill\MainBundle\Search\SearchInterface::getOrder() + * @see SearchInterface::getOrder() */ public function getOrder(): int { @@ -177,7 +177,7 @@ class PersonSearch extends AbstractSearch implements HasAdvancedSearchFormInterf /** * (non-PHPdoc). * - * @see \Chill\MainBundle\Search\SearchInterface::isActiveByDefault() + * @see SearchInterface::isActiveByDefault() */ public function isActiveByDefault() { diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 6e43a7d77..95a63e95b 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -453,8 +453,8 @@ Filtered by entrusted child status: Uniquement les usagers qui sont "enfant conf Filter by nomadic status: Filtrer les usagers "gens du voyage" Filtered by nomadic status: Uniquement les usagers qui sont "gens du voyage" -"Filter by person's who have a residential address located at another user": Filtrer les usagers qui ont une addresse de résidence chez une autre usager -"Filtered by person's who have a residential address located at another user": Uniquement les usagers qui ont une addresse de résidence chez une autre usager +"Filter by person's who have a residential address located at another user": Filtrer les usagers qui ont une adresse de résidence chez une autre usager +"Filtered by person's who have a residential address located at another user": Uniquement les usagers qui ont une adresse de résidence chez une autre usager Filter by person's that are alive or have deceased at a certain date: Filtrer les usagers qui sont décédés ou vivantes à une certaine date Filtered by person's that are alive or have deceased at a certain date: Uniquement les usagers qui sont décédés ou vivantes à une certaine date diff --git a/src/Bundle/ChillThirdPartyBundle/translations/messages.fr.yml b/src/Bundle/ChillThirdPartyBundle/translations/messages.fr.yml index bdd9420f7..62df67616 100644 --- a/src/Bundle/ChillThirdPartyBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillThirdPartyBundle/translations/messages.fr.yml @@ -129,11 +129,11 @@ export: thirdParties: Tiers intervenant # exports filters/aggregators -Filtered by person\'s who have a residential address located at a thirdparty of type %thirparty_type%: Uniquement les usagers qui ont une addresse de résidence chez un tiers de catégorie %thirdparty_type% +Filtered by person\'s who have a residential address located at a thirdparty of type %thirparty_type%: Uniquement les usagers qui ont une adresse de résidence chez un tiers de catégorie %thirdparty_type% is thirdparty: Le demandeur est un tiers -Filter by person's who have a residential address located at a thirdparty of type: Filtrer les usagers qui ont une addresse de résidence chez un tiers -"Filtered by person's who have a residential address located at a thirdparty of type %thirdparty_type% and valid on %date_calc%": "Uniquement les usagers qui ont une addresse de résidence chez un tiers de catégorie %thirdparty_type% et valide sur la date %date_calc%" +Filter by person's who have a residential address located at a thirdparty of type: Filtrer les usagers qui ont une adresse de résidence chez un tiers +"Filtered by person's who have a residential address located at a thirdparty of type %thirdparty_type% and valid on %date_calc%": "Uniquement les usagers qui ont une adresse de résidence chez un tiers de catégorie %thirdparty_type% et valide sur la date %date_calc%" # admin admin: